claude-memory-layer 1.0.30 → 1.0.32

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 (338) hide show
  1. package/README.md +12 -5
  2. package/dist/cli/index.js +4 -3
  3. package/dist/cli/index.js.map +2 -2
  4. package/dist/core/index.js +3 -2
  5. package/dist/core/index.js.map +2 -2
  6. package/dist/hooks/post-tool-use.js +3 -2
  7. package/dist/hooks/post-tool-use.js.map +2 -2
  8. package/dist/hooks/semantic-daemon.js +3 -2
  9. package/dist/hooks/semantic-daemon.js.map +2 -2
  10. package/dist/hooks/session-end.js +3 -2
  11. package/dist/hooks/session-end.js.map +2 -2
  12. package/dist/hooks/session-start.js +3 -2
  13. package/dist/hooks/session-start.js.map +2 -2
  14. package/dist/hooks/stop.js +3 -2
  15. package/dist/hooks/stop.js.map +2 -2
  16. package/dist/hooks/user-prompt-submit.js +3 -2
  17. package/dist/hooks/user-prompt-submit.js.map +2 -2
  18. package/dist/index.js +3 -2
  19. package/dist/index.js.map +2 -2
  20. package/dist/mcp/index.js +3 -2
  21. package/dist/mcp/index.js.map +2 -2
  22. package/dist/server/api/index.js +3 -2
  23. package/dist/server/api/index.js.map +2 -2
  24. package/dist/server/index.js +3 -2
  25. package/dist/server/index.js.map +2 -2
  26. package/dist/services/memory-service.js +3 -2
  27. package/dist/services/memory-service.js.map +2 -2
  28. package/package.json +10 -3
  29. package/scripts/postinstall-embedding-backend.cjs +18 -16
  30. package/AGENTS.md +0 -71
  31. package/CLAUDE.md +0 -30
  32. package/HANDOFF.md +0 -92
  33. package/Memo.txt +0 -558
  34. package/benchmarks/replay/anonymized-real-sessions.json +0 -48
  35. package/config/kpi-thresholds.json +0 -7
  36. package/context.md +0 -636
  37. package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +0 -627
  38. package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +0 -440
  39. package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +0 -271
  40. package/docs/MEMORY_USEFULNESS_AUDIT.md +0 -371
  41. package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +0 -80
  42. package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +0 -333
  43. package/docs/MEMU_ADOPTION.md +0 -40
  44. package/docs/OPERATIONS.md +0 -18
  45. package/docs/PRODUCT_VALIDATION_MATRIX.md +0 -82
  46. package/docs/PROJECT_STRUCTURE_ANALYSIS.md +0 -421
  47. package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +0 -501
  48. package/docs/REFACTORING_PLAN_THIN_CORE.md +0 -414
  49. package/docs/REFERENCE_PROJECT_ANALYSES.md +0 -25
  50. package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +0 -452
  51. package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +0 -446
  52. package/docs/architecture/comparison-index.md +0 -47
  53. package/docs/reports/codex-real-data-validation-20260505T040447Z.md +0 -46
  54. package/plan.md +0 -1642
  55. package/scripts/build.ts +0 -159
  56. package/scripts/bump-patch-version.sh +0 -18
  57. package/scripts/delete-unknown-projects.js +0 -154
  58. package/scripts/fix-sync-gap.js +0 -32
  59. package/scripts/generate-session-qrels.ts +0 -126
  60. package/scripts/heartbeat-memory-orchestrator.sh +0 -28
  61. package/scripts/replay-retrieval-benchmark.ts +0 -69
  62. package/scripts/report-sync-gap.js +0 -26
  63. package/scripts/review-queue-auto-resolve.js +0 -21
  64. package/scripts/sync-gap-auto-heal.sh +0 -17
  65. package/spec.md +0 -624
  66. package/specs/20260207-dashboard-upgrade/context.md +0 -38
  67. package/specs/20260207-dashboard-upgrade/spec.md +0 -96
  68. package/specs/citations-system/context.md +0 -243
  69. package/specs/citations-system/plan.md +0 -495
  70. package/specs/citations-system/spec.md +0 -371
  71. package/specs/endless-mode/context.md +0 -305
  72. package/specs/endless-mode/plan.md +0 -620
  73. package/specs/endless-mode/spec.md +0 -455
  74. package/specs/entity-edge-model/context.md +0 -401
  75. package/specs/entity-edge-model/plan.md +0 -459
  76. package/specs/entity-edge-model/spec.md +0 -391
  77. package/specs/evidence-aligner-v2/context.md +0 -401
  78. package/specs/evidence-aligner-v2/plan.md +0 -303
  79. package/specs/evidence-aligner-v2/spec.md +0 -312
  80. package/specs/mcp-desktop-integration/context.md +0 -278
  81. package/specs/mcp-desktop-integration/plan.md +0 -550
  82. package/specs/mcp-desktop-integration/spec.md +0 -494
  83. package/specs/memory-utilization-improvements/context.md +0 -145
  84. package/specs/memory-utilization-improvements/plan.md +0 -361
  85. package/specs/memory-utilization-improvements/spec.md +0 -361
  86. package/specs/post-tool-use-hook/context.md +0 -319
  87. package/specs/post-tool-use-hook/plan.md +0 -469
  88. package/specs/post-tool-use-hook/spec.md +0 -364
  89. package/specs/private-tags/context.md +0 -288
  90. package/specs/private-tags/plan.md +0 -412
  91. package/specs/private-tags/spec.md +0 -345
  92. package/specs/progressive-disclosure/context.md +0 -346
  93. package/specs/progressive-disclosure/plan.md +0 -663
  94. package/specs/progressive-disclosure/spec.md +0 -415
  95. package/specs/selective-tool-observation/context.md +0 -100
  96. package/specs/selective-tool-observation/plan.md +0 -158
  97. package/specs/selective-tool-observation/spec.md +0 -127
  98. package/specs/task-entity-system/context.md +0 -297
  99. package/specs/task-entity-system/plan.md +0 -301
  100. package/specs/task-entity-system/spec.md +0 -314
  101. package/specs/thin-core-refactor/context.md +0 -275
  102. package/specs/thin-core-refactor/plan.md +0 -536
  103. package/specs/thin-core-refactor/spec.md +0 -465
  104. package/specs/vector-outbox-v2/context.md +0 -470
  105. package/specs/vector-outbox-v2/plan.md +0 -562
  106. package/specs/vector-outbox-v2/spec.md +0 -466
  107. package/specs/web-viewer-ui/context.md +0 -384
  108. package/specs/web-viewer-ui/plan.md +0 -797
  109. package/specs/web-viewer-ui/spec.md +0 -516
  110. package/src/adapters/claude/capture/index.ts +0 -3
  111. package/src/adapters/claude/context/index.ts +0 -3
  112. package/src/adapters/claude/hooks/index.ts +0 -21
  113. package/src/adapters/claude/hooks/post-tool-use.ts +0 -239
  114. package/src/adapters/claude/hooks/prompt-injection-policy.ts +0 -104
  115. package/src/adapters/claude/hooks/semantic-daemon-client.ts +0 -209
  116. package/src/adapters/claude/hooks/semantic-daemon.ts +0 -283
  117. package/src/adapters/claude/hooks/session-end.ts +0 -59
  118. package/src/adapters/claude/hooks/session-start.ts +0 -73
  119. package/src/adapters/claude/hooks/stop.ts +0 -128
  120. package/src/adapters/claude/hooks/user-prompt-submit.ts +0 -361
  121. package/src/adapters/claude/index.ts +0 -4
  122. package/src/adapters/claude/transcript/index.ts +0 -4
  123. package/src/adapters/claude/transcript/transcript-reader.ts +0 -57
  124. package/src/adapters/claude/transcript/turn-reconstructor.ts +0 -65
  125. package/src/apps/cli/claude-settings-hooks.ts +0 -138
  126. package/src/apps/cli/codex-import-runner.ts +0 -125
  127. package/src/apps/cli/codex-validation-output.ts +0 -95
  128. package/src/apps/cli/hermes-import-runner.ts +0 -130
  129. package/src/apps/cli/hermes-validation-output.ts +0 -91
  130. package/src/apps/cli/index.ts +0 -1735
  131. package/src/apps/cli/mcp-install.ts +0 -106
  132. package/src/apps/cli/retrieval-disclosure-output.ts +0 -196
  133. package/src/apps/dashboard/assets/js/bootstrap.js +0 -244
  134. package/src/apps/dashboard/assets/js/chat.js +0 -373
  135. package/src/apps/dashboard/assets/js/disclosure.js +0 -232
  136. package/src/apps/dashboard/assets/js/modals.js +0 -298
  137. package/src/apps/dashboard/assets/js/overview.js +0 -655
  138. package/src/apps/dashboard/assets/js/state.js +0 -72
  139. package/src/apps/dashboard/assets/js/views.js +0 -468
  140. package/src/apps/dashboard/index.html +0 -543
  141. package/src/apps/dashboard/index.ts +0 -3
  142. package/src/apps/dashboard/style.css +0 -1750
  143. package/src/apps/index.ts +0 -5
  144. package/src/apps/server/api/chat.ts +0 -244
  145. package/src/apps/server/api/citations.ts +0 -105
  146. package/src/apps/server/api/events.ts +0 -137
  147. package/src/apps/server/api/health.ts +0 -53
  148. package/src/apps/server/api/index.ts +0 -26
  149. package/src/apps/server/api/projects.ts +0 -74
  150. package/src/apps/server/api/search.ts +0 -184
  151. package/src/apps/server/api/sessions.ts +0 -115
  152. package/src/apps/server/api/stats.ts +0 -723
  153. package/src/apps/server/api/turns.ts +0 -143
  154. package/src/apps/server/api/utils.ts +0 -65
  155. package/src/apps/server/index.ts +0 -111
  156. package/src/cli/index.ts +0 -3
  157. package/src/cli/retrieval-disclosure-output.ts +0 -2
  158. package/src/compat/index.ts +0 -5
  159. package/src/core/canonical-key.ts +0 -186
  160. package/src/core/citation-generator.ts +0 -63
  161. package/src/core/consolidated-store.ts +0 -356
  162. package/src/core/consolidation-worker.ts +0 -493
  163. package/src/core/context-formatter.ts +0 -276
  164. package/src/core/continuity-manager.ts +0 -341
  165. package/src/core/db-wrapper.ts +0 -64
  166. package/src/core/derive/fact-deriver.ts +0 -170
  167. package/src/core/derive/index.ts +0 -2
  168. package/src/core/derive/summary-deriver.ts +0 -76
  169. package/src/core/edge-repo.ts +0 -333
  170. package/src/core/embedder.ts +0 -4
  171. package/src/core/engine/embedding-maintenance-service.ts +0 -187
  172. package/src/core/engine/endless-memory-services.ts +0 -4
  173. package/src/core/engine/index.ts +0 -19
  174. package/src/core/engine/memory-engine-services.ts +0 -170
  175. package/src/core/engine/memory-ingest-service.ts +0 -317
  176. package/src/core/engine/memory-query-service.ts +0 -173
  177. package/src/core/engine/memory-runtime-service.ts +0 -162
  178. package/src/core/engine/memory-service-composition.ts +0 -231
  179. package/src/core/engine/retrieval-analytics-service.ts +0 -181
  180. package/src/core/engine/retrieval-disclosure-service.ts +0 -420
  181. package/src/core/engine/retrieval-orchestrator.ts +0 -377
  182. package/src/core/engine/retrieval-services.ts +0 -176
  183. package/src/core/engine/shared-memory-services.ts +0 -4
  184. package/src/core/entity-repo.ts +0 -349
  185. package/src/core/event-store.ts +0 -779
  186. package/src/core/evidence-aligner.ts +0 -635
  187. package/src/core/external-market-context.ts +0 -582
  188. package/src/core/graduation-worker.ts +0 -171
  189. package/src/core/graduation.ts +0 -377
  190. package/src/core/index.ts +0 -64
  191. package/src/core/ingest-interceptor.ts +0 -80
  192. package/src/core/markdown-mirror.ts +0 -70
  193. package/src/core/matcher.ts +0 -208
  194. package/src/core/md-mirror.ts +0 -92
  195. package/src/core/metadata-extractor.ts +0 -203
  196. package/src/core/model/memory-fact.ts +0 -30
  197. package/src/core/model/memory-rule.ts +0 -14
  198. package/src/core/model/memory-summary.ts +0 -21
  199. package/src/core/model/raw-event.ts +0 -28
  200. package/src/core/model/retrieval-result.ts +0 -35
  201. package/src/core/mongo-sync-config.ts +0 -165
  202. package/src/core/mongo-sync-worker.ts +0 -381
  203. package/src/core/privacy/filter.ts +0 -190
  204. package/src/core/privacy/index.ts +0 -20
  205. package/src/core/privacy/tag-parser.ts +0 -145
  206. package/src/core/product-validation-matrix.ts +0 -314
  207. package/src/core/progressive-retriever.ts +0 -414
  208. package/src/core/registry/project-path.ts +0 -54
  209. package/src/core/registry/session-registry.ts +0 -69
  210. package/src/core/replay-evaluator.ts +0 -625
  211. package/src/core/retrieval-benchmark.ts +0 -117
  212. package/src/core/retrieval-quality.ts +0 -109
  213. package/src/core/retriever.ts +0 -800
  214. package/src/core/session-qrels.ts +0 -360
  215. package/src/core/shared-event-store.ts +0 -114
  216. package/src/core/shared-promoter.ts +0 -249
  217. package/src/core/shared-store.ts +0 -289
  218. package/src/core/shared-vector-store.ts +0 -203
  219. package/src/core/sqlite-event-store.ts +0 -1846
  220. package/src/core/sqlite-wrapper.ts +0 -116
  221. package/src/core/sync-worker.ts +0 -228
  222. package/src/core/tag-taxonomy.ts +0 -51
  223. package/src/core/task/blocker-resolver.ts +0 -333
  224. package/src/core/task/index.ts +0 -9
  225. package/src/core/task/task-matcher.ts +0 -240
  226. package/src/core/task/task-projector.ts +0 -358
  227. package/src/core/task/task-resolver.ts +0 -421
  228. package/src/core/turn-state.ts +0 -207
  229. package/src/core/types.ts +0 -952
  230. package/src/core/vector-outbox.ts +0 -299
  231. package/src/core/vector-store.ts +0 -231
  232. package/src/core/vector-worker.ts +0 -521
  233. package/src/core/working-set-store.ts +0 -257
  234. package/src/extensions/endless-memory/endless-memory-services.ts +0 -350
  235. package/src/extensions/endless-memory/index.ts +0 -1
  236. package/src/extensions/index.ts +0 -5
  237. package/src/extensions/mcp/handlers.ts +0 -960
  238. package/src/extensions/mcp/index.ts +0 -48
  239. package/src/extensions/mcp/tools.ts +0 -252
  240. package/src/extensions/shared-memory/index.ts +0 -1
  241. package/src/extensions/shared-memory/shared-memory-services.ts +0 -211
  242. package/src/extensions/vector/embedder.ts +0 -233
  243. package/src/extensions/vector/index.ts +0 -1
  244. package/src/hooks/post-tool-use.ts +0 -9
  245. package/src/hooks/semantic-daemon-client.ts +0 -1
  246. package/src/hooks/semantic-daemon.ts +0 -11
  247. package/src/hooks/session-end.ts +0 -9
  248. package/src/hooks/session-start.ts +0 -9
  249. package/src/hooks/stop.ts +0 -9
  250. package/src/hooks/user-prompt-submit.ts +0 -9
  251. package/src/index.ts +0 -13
  252. package/src/mcp/handlers.ts +0 -2
  253. package/src/mcp/index.ts +0 -4
  254. package/src/mcp/tools.ts +0 -2
  255. package/src/server/api/chat.ts +0 -2
  256. package/src/server/api/citations.ts +0 -2
  257. package/src/server/api/events.ts +0 -2
  258. package/src/server/api/health.ts +0 -2
  259. package/src/server/api/index.ts +0 -2
  260. package/src/server/api/projects.ts +0 -2
  261. package/src/server/api/search.ts +0 -2
  262. package/src/server/api/sessions.ts +0 -2
  263. package/src/server/api/stats.ts +0 -2
  264. package/src/server/api/turns.ts +0 -2
  265. package/src/server/api/utils.ts +0 -2
  266. package/src/server/index.ts +0 -2
  267. package/src/services/bootstrap-organizer.ts +0 -463
  268. package/src/services/codex-session-history-importer.ts +0 -966
  269. package/src/services/hermes-session-history-importer.ts +0 -733
  270. package/src/services/memory-service-config.ts +0 -36
  271. package/src/services/memory-service-registry.ts +0 -150
  272. package/src/services/memory-service.ts +0 -688
  273. package/src/services/session-history-importer.ts +0 -629
  274. package/tests/README.md +0 -23
  275. package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +0 -54
  276. package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +0 -98
  277. package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +0 -99
  278. package/tests/apps/app-layer-boundary.test.ts +0 -48
  279. package/tests/apps/claude-settings-hooks.test.ts +0 -107
  280. package/tests/apps/cli-disclosure-output.test.ts +0 -212
  281. package/tests/apps/codex-import-runner.test.ts +0 -99
  282. package/tests/apps/codex-validation-output.test.ts +0 -100
  283. package/tests/apps/hermes-import-runner.test.ts +0 -99
  284. package/tests/apps/mcp-install-command.test.ts +0 -59
  285. package/tests/apps/package-build-entrypoints.test.ts +0 -30
  286. package/tests/apps/postinstall-embedding-backend.test.ts +0 -175
  287. package/tests/apps/search-api-disclosure.test.ts +0 -162
  288. package/tests/apps/stats-api-lightweight.test.ts +0 -67
  289. package/tests/apps/ui-disclosure-output.test.ts +0 -140
  290. package/tests/core/bootstrap-organizer.test.ts +0 -111
  291. package/tests/core/canonical-key.test.ts +0 -101
  292. package/tests/core/codex-session-history-importer-validation.test.ts +0 -185
  293. package/tests/core/consolidation-worker.test.ts +0 -75
  294. package/tests/core/embedding-maintenance-service.test.ts +0 -282
  295. package/tests/core/evidence-aligner.test.ts +0 -152
  296. package/tests/core/external-market-context.test.ts +0 -209
  297. package/tests/core/fact-deriver.test.ts +0 -79
  298. package/tests/core/hermes-session-history-importer-validation.test.ts +0 -609
  299. package/tests/core/ingest-interceptor.test.ts +0 -38
  300. package/tests/core/markdown-mirror.test.ts +0 -85
  301. package/tests/core/matcher.test.ts +0 -112
  302. package/tests/core/md-mirror.test.ts +0 -50
  303. package/tests/core/memory-engine-services.test.ts +0 -240
  304. package/tests/core/memory-ingest-service.test.ts +0 -296
  305. package/tests/core/memory-query-service.test.ts +0 -129
  306. package/tests/core/memory-runtime-service.test.ts +0 -201
  307. package/tests/core/memory-service-composition.test.ts +0 -192
  308. package/tests/core/memory-service-config.test.ts +0 -41
  309. package/tests/core/memory-service-facade.test.ts +0 -30
  310. package/tests/core/memory-service-registry.test.ts +0 -206
  311. package/tests/core/product-validation-matrix.test.ts +0 -61
  312. package/tests/core/project-registry.test.ts +0 -78
  313. package/tests/core/replay-evaluator.test.ts +0 -181
  314. package/tests/core/retrieval-analytics-service.test.ts +0 -210
  315. package/tests/core/retrieval-benchmark.test.ts +0 -93
  316. package/tests/core/retrieval-disclosure-service.test.ts +0 -264
  317. package/tests/core/retrieval-orchestrator.test.ts +0 -403
  318. package/tests/core/retrieval-quality.test.ts +0 -31
  319. package/tests/core/retrieval-services.test.ts +0 -185
  320. package/tests/core/retriever-fallback-chain.test.ts +0 -223
  321. package/tests/core/retriever-strategy-scope.test.ts +0 -164
  322. package/tests/core/retriever.memu-adoption.test.ts +0 -122
  323. package/tests/core/session-history-importer-filter.test.ts +0 -78
  324. package/tests/core/session-qrels.test.ts +0 -250
  325. package/tests/core/sqlite-event-store-replication.test.ts +0 -127
  326. package/tests/core/summary-deriver.test.ts +0 -66
  327. package/tests/extensions/embedder-warning-suppression.test.ts +0 -83
  328. package/tests/extensions/endless-memory-extension-boundary.test.ts +0 -17
  329. package/tests/extensions/endless-memory-services.test.ts +0 -325
  330. package/tests/extensions/mcp-context-tools.test.ts +0 -905
  331. package/tests/extensions/mcp-extension-boundary.test.ts +0 -21
  332. package/tests/extensions/mcp-package-build.test.ts +0 -22
  333. package/tests/extensions/mcp-project-aware-tools.test.ts +0 -102
  334. package/tests/extensions/shared-memory-extension-boundary.test.ts +0 -24
  335. package/tests/extensions/shared-memory-services.test.ts +0 -309
  336. package/tests/extensions/vector-extension-boundary.test.ts +0 -21
  337. package/tsconfig.json +0 -24
  338. package/vitest.config.ts +0 -15
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/apps/cli/index.ts", "../../src/services/memory-service.ts", "../../src/core/engine/memory-service-composition.ts", "../../src/core/metadata-extractor.ts", "../../src/core/engine/embedding-maintenance-service.ts", "../../src/extensions/endless-memory/endless-memory-services.ts", "../../src/core/working-set-store.ts", "../../src/core/db-wrapper.ts", "../../src/core/consolidated-store.ts", "../../src/core/consolidation-worker.ts", "../../src/core/continuity-manager.ts", "../../src/core/engine/memory-engine-services.ts", "../../src/extensions/vector/embedder.ts", "../../src/core/graduation.ts", "../../src/core/matcher.ts", "../../src/core/md-mirror.ts", "../../src/core/sqlite-event-store.ts", "../../src/core/canonical-key.ts", "../../src/core/sqlite-wrapper.ts", "../../src/core/markdown-mirror.ts", "../../src/core/vector-store.ts", "../../src/core/ingest-interceptor.ts", "../../src/core/tag-taxonomy.ts", "../../src/core/derive/summary-deriver.ts", "../../src/core/engine/memory-ingest-service.ts", "../../src/core/engine/memory-query-service.ts", "../../src/core/retrieval-quality.ts", "../../src/core/retriever.ts", "../../src/core/engine/retrieval-analytics-service.ts", "../../src/core/engine/retrieval-disclosure-service.ts", "../../src/core/engine/retrieval-orchestrator.ts", "../../src/core/engine/retrieval-services.ts", "../../src/core/graduation-worker.ts", "../../src/core/vector-outbox.ts", "../../src/core/vector-worker.ts", "../../src/core/engine/memory-runtime-service.ts", "../../src/extensions/shared-memory/shared-memory-services.ts", "../../src/core/shared-event-store.ts", "../../src/core/shared-promoter.ts", "../../src/core/shared-store.ts", "../../src/core/shared-vector-store.ts", "../../src/core/registry/project-path.ts", "../../src/core/registry/session-registry.ts", "../../src/services/memory-service-config.ts", "../../src/services/memory-service-registry.ts", "../../src/services/session-history-importer.ts", "../../src/services/codex-session-history-importer.ts", "../../src/services/hermes-session-history-importer.ts", "../../src/core/privacy/tag-parser.ts", "../../src/core/privacy/filter.ts", "../../src/services/bootstrap-organizer.ts", "../../src/apps/server/index.ts", "../../src/apps/server/api/index.ts", "../../src/apps/server/api/sessions.ts", "../../src/apps/server/api/utils.ts", "../../src/apps/server/api/events.ts", "../../src/apps/server/api/search.ts", "../../src/apps/server/api/stats.ts", "../../src/apps/server/api/citations.ts", "../../src/core/citation-generator.ts", "../../src/apps/server/api/turns.ts", "../../src/apps/server/api/projects.ts", "../../src/apps/server/api/chat.ts", "../../src/apps/server/api/health.ts", "../../src/core/mongo-sync-worker.ts", "../../src/apps/cli/retrieval-disclosure-output.ts", "../../src/apps/cli/mcp-install.ts", "../../src/apps/cli/claude-settings-hooks.ts", "../../src/apps/cli/codex-validation-output.ts", "../../src/apps/cli/hermes-validation-output.ts", "../../src/apps/cli/codex-import-runner.ts", "../../src/apps/cli/hermes-import-runner.ts", "../../src/core/external-market-context.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * Code Memory CLI\n * Command-line interface for memory operations\n */\n\nimport { Command } from 'commander';\nimport { exec } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n getLightweightMemoryServiceForProject\n} from '../../services/memory-service.js';\nimport { getProjectStoragePath } from '../../core/registry/project-path.js';\nimport { createSessionHistoryImporter, type ProgressEvent } from '../../services/session-history-importer.js';\nimport {\n createCodexSessionHistoryImporter,\n validateCodexSessions\n} from '../../services/codex-session-history-importer.js';\nimport {\n createHermesSessionHistoryImporter,\n validateHermesSessions\n} from '../../services/hermes-session-history-importer.js';\nimport { bootstrapKnowledgeBase } from '../../services/bootstrap-organizer.js';\nimport { startServer, stopServer, isServerRunning } from '../server/index.js';\nimport { SQLiteEventStore } from '../../core/sqlite-event-store.js';\nimport { MongoSyncWorker, type MongoSyncDirection } from '../../core/mongo-sync-worker.js';\nimport {\n formatDisclosureExpansion,\n formatDisclosureSearch,\n formatDisclosureSource,\n formatPlainSearchResults\n} from './retrieval-disclosure-output.js';\nimport { installMcpServer } from './mcp-install.js';\nimport {\n hasHook,\n mergePluginHooksIntoSettings,\n removePluginHooksFromSettings,\n REQUIRED_HOOK_FILES,\n type ClaudeSettingsWithHooks\n} from './claude-settings-hooks.js';\nimport {\n formatCodexValidationReport,\n writeCodexValidationReport,\n type CodexValidationReportFormat\n} from './codex-validation-output.js';\nimport {\n formatHermesValidationReport,\n writeHermesValidationReport,\n type HermesValidationReportFormat\n} from './hermes-validation-output.js';\nimport { runCodexImportOnce } from './codex-import-runner.js';\nimport { runHermesImportOnce } from './hermes-import-runner.js';\nimport {\n fetchExternalMarketContext,\n renderExternalMarketContextReport,\n type ExternalMarketProvider\n} from '../../core/external-market-context.js';\nimport {\n DEFAULT_EMBEDDING_FALLBACK_MODEL,\n DEFAULT_EMBEDDING_MODEL\n} from '../../extensions/vector/embedder.js';\n\n// ============================================================\n// Hook Installation Utilities\n// ============================================================\n\nconst CLAUDE_SETTINGS_PATH = path.join(os.homedir(), '.claude', 'settings.json');\n\ntype ClaudeSettings = ClaudeSettingsWithHooks;\n\nfunction getPluginPath(): string {\n // Try to find the dist directory\n const possiblePaths = [\n path.join(__dirname, '..'), // When running from dist/cli\n path.join(__dirname, '../..', 'dist'), // When running from src\n path.join(process.cwd(), 'dist'), // Current working directory\n ];\n\n for (const p of possiblePaths) {\n const hooksPath = path.join(p, 'hooks', 'user-prompt-submit.js');\n if (fs.existsSync(hooksPath)) {\n return p;\n }\n }\n\n // Fallback to npm global installation path\n return path.join(os.homedir(), '.npm-global', 'lib', 'node_modules', 'claude-memory-layer', 'dist');\n}\n\nfunction loadClaudeSettings(): ClaudeSettings {\n try {\n if (fs.existsSync(CLAUDE_SETTINGS_PATH)) {\n const content = fs.readFileSync(CLAUDE_SETTINGS_PATH, 'utf-8');\n return JSON.parse(content);\n }\n } catch (error) {\n console.error('Warning: Could not read existing settings:', error);\n }\n return {};\n}\n\nfunction saveClaudeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(CLAUDE_SETTINGS_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Atomic write\n const tempPath = CLAUDE_SETTINGS_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2));\n fs.renameSync(tempPath, CLAUDE_SETTINGS_PATH);\n}\n\ntype CodexValidateCommandOptions = {\n project?: string;\n sessionsDir?: string;\n limit?: string;\n format?: string;\n output?: string;\n dryRun?: boolean;\n anonymizeProjects?: boolean;\n};\n\ntype HermesValidateCommandOptions = {\n project?: string;\n stateDb?: string;\n limit?: string;\n format?: string;\n output?: string;\n dryRun?: boolean;\n};\n\ntype MarketContextCommandOptions = {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers?: string;\n fredSeries?: string;\n json?: boolean;\n snapshot?: boolean;\n};\n\nfunction parseCommaList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const selected = value.split(',').map((item) => item.trim()).filter(Boolean);\n return selected.length > 0 ? Array.from(new Set(selected)) : undefined;\n}\n\nfunction parseMarketProviders(value: string | undefined): ExternalMarketProvider[] | undefined {\n const entries = parseCommaList(value);\n if (!entries) return undefined;\n const allowed = new Set<ExternalMarketProvider>(['dart', 'fred', 'finnhub']);\n const selected: ExternalMarketProvider[] = [];\n for (const entry of entries) {\n const normalized = entry.toLowerCase() as ExternalMarketProvider;\n if (!allowed.has(normalized)) throw new Error('Invalid --providers: expected comma-separated dart,fred,finnhub');\n if (!selected.includes(normalized)) selected.push(normalized);\n }\n return selected;\n}\n\nfunction parsePositiveIntegerOption(value: string | undefined, optionName: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${optionName}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${optionName}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction parseCodexValidationReportFormat(value: string | undefined): CodexValidationReportFormat {\n const normalized = (value ?? 'markdown').toLowerCase();\n if (normalized !== 'json' && normalized !== 'markdown') {\n throw new Error('Invalid --format: expected json or markdown');\n }\n return normalized;\n}\n\nfunction parseHermesValidationReportFormat(value: string | undefined): HermesValidationReportFormat {\n const normalized = (value ?? 'markdown').toLowerCase();\n if (normalized !== 'json' && normalized !== 'markdown') {\n throw new Error('Invalid --format: expected json or markdown');\n }\n return normalized;\n}\n\nasync function runCodexValidationCommand(options: CodexValidateCommandOptions): Promise<void> {\n if (options.dryRun === false) {\n throw new Error('Codex validation is read-only; use explicit import commands for mutation');\n }\n\n const format = parseCodexValidationReportFormat(options.format);\n const report = await validateCodexSessions({\n sessionsDir: options.sessionsDir,\n projectPath: options.project,\n limit: parsePositiveIntegerOption(options.limit, 'limit'),\n anonymizeProjects: options.anonymizeProjects === true\n });\n\n const rendered = formatCodexValidationReport(report, format);\n process.stdout.write(rendered.endsWith('\\n') ? rendered : `${rendered}\\n`);\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n writeCodexValidationReport(outputPath, report, format);\n console.log(`\\nReport written to ${outputPath}`);\n }\n}\n\nasync function runHermesValidationCommand(options: HermesValidateCommandOptions): Promise<void> {\n if (options.dryRun === false) {\n throw new Error('Hermes validation is read-only; use explicit import commands for mutation');\n }\n\n const format = parseHermesValidationReportFormat(options.format);\n const report = await validateHermesSessions({\n stateDbPath: options.stateDb,\n projectPath: options.project,\n limit: parsePositiveIntegerOption(options.limit, 'limit')\n });\n\n const rendered = formatHermesValidationReport(report, format);\n process.stdout.write(rendered.endsWith('\\n') ? rendered : `${rendered}\\n`);\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n writeHermesValidationReport(outputPath, report, format);\n console.log(`\\nReport written to ${outputPath}`);\n }\n}\n\nasync function runMarketContextCommand(options: MarketContextCommandOptions): Promise<void> {\n const report = await fetchExternalMarketContext({\n company: options.company,\n dartCorpCode: options.dartCorpCode,\n symbol: options.symbol,\n providers: parseMarketProviders(options.providers),\n fredSeries: parseCommaList(options.fredSeries),\n includeSnapshot: options.snapshot !== false\n });\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderExternalMarketContextReport(report)}\\n`);\n }\n}\n\nconst program = new Command();\n\nprogram\n .name('claude-memory-layer')\n .description('Claude Code Memory Plugin CLI')\n .version(process.env.CLAUDE_MEMORY_LAYER_VERSION || '0.0.0');\n\nprogram\n .command('market-context')\n .description('Fetch read-only DART/FRED/Finnhub context with structured MarketContextSnapshot bull/bear/risk/catalyst analysis')\n .option('--company <name>', 'Company name for DART fallback search and report subject')\n .option('--dart-corp-code <code>', 'Exact DART corp_code for issuer-specific filings')\n .option('--symbol <ticker>', 'Listed ticker for Finnhub company profile')\n .option('--providers <list>', 'Comma-separated providers: dart,fred,finnhub')\n .option('--fred-series <list>', 'Comma-separated FRED series IDs')\n .option('--json', 'Print structured JSON including analysis.marketSnapshot')\n .option('--no-snapshot', 'Disable MarketContextSnapshot and DART company snapshot analysis')\n .action(async (options: MarketContextCommandOptions) => {\n try {\n await runMarketContextCommand(options);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// ============================================================\n// Install / Uninstall Commands\n// ============================================================\n\n/**\n * Install command - register hooks with Claude Code\n */\nprogram\n .command('install')\n .description('Install hooks into Claude Code settings')\n .option('--path <path>', 'Custom plugin path (defaults to auto-detect)')\n .action(async (options) => {\n try {\n const pluginPath = options.path || getPluginPath();\n\n // Verify hooks exist\n const missingHooks = REQUIRED_HOOK_FILES.filter((file) =>\n !fs.existsSync(path.join(pluginPath, 'hooks', file))\n );\n if (missingHooks.length > 0) {\n console.error(`\\n\u274C Hook files not found at: ${pluginPath}`);\n console.error(` Missing: ${missingHooks.join(', ')}`);\n console.error(' Make sure you have built the plugin with \"npm run build\"');\n process.exit(1);\n }\n\n // Load existing settings\n const settings = loadClaudeSettings();\n\n // Add hooks while preserving unrelated Claude Code hooks in the same categories.\n const nextSettings = mergePluginHooksIntoSettings(settings, pluginPath);\n\n // Save settings\n saveClaudeSettings(nextSettings);\n\n console.log('\\n\u2705 Claude Memory Layer installed!\\n');\n console.log('Hooks registered:');\n console.log(' - SessionStart: Register session -> project mapping');\n console.log(' - UserPromptSubmit: Memory retrieval on user input');\n console.log(' - PostToolUse: Store tool observations');\n console.log(' - Stop: Store assistant responses');\n console.log(' - SessionEnd: Persist session summary\\n');\n console.log('Plugin path:', pluginPath);\n console.log('\\n\u26A0\uFE0F Restart Claude Code for changes to take effect.\\n');\n console.log('Commands:');\n console.log(' claude-memory-layer dashboard - Open web dashboard');\n console.log(' claude-memory-layer search - Search memories');\n console.log(' claude-memory-layer stats - View statistics');\n console.log(' claude-memory-layer uninstall - Remove hooks\\n');\n } catch (error) {\n console.error('Install failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Uninstall command - remove hooks from Claude Code\n */\nprogram\n .command('uninstall')\n .description('Remove hooks from Claude Code settings')\n .action(async () => {\n try {\n // Load existing settings\n const settings = loadClaudeSettings();\n\n if (!settings.hooks) {\n console.log('\\n\uD83D\uDCCB No hooks installed.\\n');\n return;\n }\n\n const nextSettings = removePluginHooksFromSettings(settings, getPluginPath());\n\n // Save settings\n saveClaudeSettings(nextSettings);\n\n console.log('\\n\u2705 Claude Memory Layer uninstalled!\\n');\n console.log('Hooks removed from Claude Code settings.');\n console.log('Your memory data is preserved and can be accessed with:');\n console.log(' claude-memory-layer dashboard\\n');\n console.log('\u26A0\uFE0F Restart Claude Code for changes to take effect.\\n');\n } catch (error) {\n console.error('Uninstall failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Status command - check installation status\n */\nprogram\n .command('status')\n .description('Check plugin installation status')\n .action(async () => {\n try {\n const settings = loadClaudeSettings();\n const pluginPath = getPluginPath();\n\n console.log('\\n\uD83E\uDDE0 Claude Memory Layer Status\\n');\n\n // Check hooks\n const hasSessionStartHook = hasHook(settings, 'SessionStart', 'session-start');\n const hasUserPromptHook = hasHook(settings, 'UserPromptSubmit', 'user-prompt-submit');\n const hasPostToolHook = hasHook(settings, 'PostToolUse', 'post-tool-use');\n const hasStopHook = hasHook(settings, 'Stop', 'stop');\n const hasSessionEndHook = hasHook(settings, 'SessionEnd', 'session-end');\n\n console.log('Hooks:');\n console.log(` SessionStart: ${hasSessionStartHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` UserPromptSubmit: ${hasUserPromptHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` PostToolUse: ${hasPostToolHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` Stop: ${hasStopHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` SessionEnd: ${hasSessionEndHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n\n // Check plugin files\n const hooksExist = REQUIRED_HOOK_FILES\n .every((file) => fs.existsSync(path.join(pluginPath, 'hooks', file)));\n console.log(`\\nPlugin files: ${hooksExist ? '\u2705 Found' : '\u274C Not found'}`);\n console.log(` Path: ${pluginPath}`);\n\n // Check dashboard\n const dashboardRunning = await isServerRunning(37777);\n console.log(`\\nDashboard: ${dashboardRunning ? '\u2705 Running at http://localhost:37777' : '\u23F9\uFE0F Not running'}`);\n\n if (!hasSessionStartHook || !hasUserPromptHook || !hasPostToolHook || !hasStopHook || !hasSessionEndHook) {\n console.log('\\n\uD83D\uDCA1 Run \"claude-memory-layer install\" to set up hooks.\\n');\n } else {\n console.log('\\n\u2705 Plugin is fully installed and configured.\\n');\n }\n } catch (error) {\n console.error('Status check failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Search command\n */\nprogram\n .command('search <query>')\n .description('Search memories using semantic search')\n .option('-k, --top-k <number>', 'Number of results', '5')\n .option('-s, --min-score <number>', 'Minimum similarity score', '0.7')\n .option('--session <id>', 'Filter by session ID')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--disclosure', 'Use progressive search -> expand -> source output')\n .option('--include-shared', 'Include shared cross-project memory results')\n .option('--strategy <mode>', 'Retrieval strategy: auto, fast, or deep', 'auto')\n .action(async (query: string, options) => {\n const projectPath = options.project || process.cwd();\n const useLightweightRead = options.strategy === 'fast' && options.includeShared !== true;\n const service = useLightweightRead\n ? getLightweightMemoryServiceForProject(projectPath)\n : getMemoryServiceForProject(projectPath);\n\n try {\n if (options.disclosure) {\n const result = await service.searchDisclosure(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session,\n includeShared: options.includeShared === true,\n strategy: options.strategy\n });\n\n console.log(formatDisclosureSearch(result));\n return;\n }\n\n const result = await service.retrieveMemories(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session,\n includeShared: options.includeShared === true,\n strategy: options.strategy\n });\n\n console.log(formatPlainSearchResults(result));\n } catch (error) {\n console.error('Search failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * Expand command - progressive retrieval layer 2\n */\nprogram\n .command('expand <resultId>')\n .description('Expand a progressive retrieval result with surrounding context')\n .option('-w, --window-size <number>', 'Number of surrounding events on each side', '3')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (resultId: string, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const expansion = await service.expandDisclosure(resultId, {\n windowSize: parseInt(options.windowSize)\n });\n\n if (!expansion) {\n console.error(`Expansion target not found: ${resultId}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(formatDisclosureExpansion(expansion));\n } catch (error) {\n console.error('Expand failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * Source command - progressive retrieval layer 3\n */\nprogram\n .command('source <resultId>')\n .description('Show raw source details for a progressive retrieval result')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (resultId: string, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const source = await service.sourceDisclosure(resultId);\n\n if (!source) {\n console.error(`Source not found: ${resultId}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(formatDisclosureSource(source));\n } catch (error) {\n console.error('Source failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * History command\n */\nprogram\n .command('history')\n .description('View conversation history')\n .option('-l, --limit <number>', 'Number of events', '20')\n .option('--session <id>', 'Filter by session ID')\n .option('--type <type>', 'Filter by event type')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n let events;\n\n if (options.session) {\n events = await service.getSessionHistory(options.session);\n } else {\n events = await service.getRecentEvents(parseInt(options.limit));\n }\n\n if (options.type) {\n events = events.filter(e => e.eventType === options.type);\n }\n\n console.log('\\n\uD83D\uDCDC Memory History\\n');\n console.log(`Total events: ${events.length}\\n`);\n\n for (const event of events.slice(0, parseInt(options.limit))) {\n const date = event.timestamp.toISOString();\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' : '\uD83D\uDCDD';\n\n console.log(`${icon} [${date}] ${event.eventType}`);\n console.log(` Session: ${event.sessionId.slice(0, 8)}...`);\n console.log(` ${event.content.slice(0, 150)}${event.content.length > 150 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('History failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Stats command\n */\nprogram\n .command('stats')\n .description('View memory statistics')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getLightweightMemoryServiceForProject(projectPath);\n\n try {\n const stats = await service.getStats();\n\n console.log('\\n\uD83D\uDCCA Memory Statistics\\n');\n console.log(`Total Events: ${stats.totalEvents}`);\n console.log(`Vector Count: ${stats.vectorCount}`);\n console.log('\\nMemory Levels:');\n\n for (const level of stats.levelStats) {\n const bar = '\u2588'.repeat(Math.min(20, Math.ceil(level.count / 10)));\n console.log(` ${level.level}: ${bar} ${level.count}`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Stats failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Forget command\n */\nprogram\n .command('forget [eventId]')\n .description('Remove memories from storage')\n .option('--session <id>', 'Forget all events from a session')\n .option('--before <date>', 'Forget events before date (YYYY-MM-DD)')\n .option('--confirm', 'Skip confirmation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (eventId: string | undefined, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n if (!eventId && !options.session && !options.before) {\n console.error('Please specify an event ID, --session, or --before option');\n process.exit(1);\n }\n\n if (!options.confirm) {\n console.log('\u26A0\uFE0F This will remove memories from storage.');\n console.log('Add --confirm to proceed.');\n process.exit(0);\n }\n\n // Note: Full forget implementation would require additional EventStore methods\n console.log('\uD83D\uDDD1\uFE0F Forget functionality requires additional implementation.');\n console.log('Events are append-only; soft-delete markers would be added.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Forget failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Process command - manually process pending embeddings\n */\nprogram\n .command('process')\n .description('Process pending embeddings')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n console.log('\u23F3 Processing pending embeddings...');\n const count = await service.processPendingEmbeddings();\n console.log(`\u2705 Processed ${count} embeddings`);\n\n await service.shutdown();\n } catch (error) {\n console.error('Process failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Mongo Sync command - sync local SQLite events with a shared MongoDB database (optional)\n */\nprogram\n .command('mongo-sync')\n .description('Sync events with MongoDB for multi-server collaboration (optional)')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--mongo-uri <uri>', 'MongoDB connection URI (env: CLAUDE_MEMORY_MONGO_URI)')\n .option('--mongo-db <name>', 'MongoDB database name (env: CLAUDE_MEMORY_MONGO_DB)')\n .option('--mongo-project <key>', 'Remote project key (env: CLAUDE_MEMORY_MONGO_PROJECT, default: basename(projectPath))')\n .option('--direction <dir>', 'push|pull|both', 'both')\n .option('--batch-size <n>', 'Batch size', '500')\n .option('--interval <ms>', 'Watch interval ms', '30000')\n .option('--watch', 'Run continuously')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const mongoUri = options.mongoUri || process.env.CLAUDE_MEMORY_MONGO_URI;\n const mongoDb = options.mongoDb || process.env.CLAUDE_MEMORY_MONGO_DB;\n const projectKey = options.mongoProject || process.env.CLAUDE_MEMORY_MONGO_PROJECT || path.basename(projectPath);\n const direction = String(options.direction || 'both').toLowerCase() as MongoSyncDirection;\n\n if (!mongoUri || !mongoDb) {\n console.error('\\n\u274C MongoDB sync is not configured.');\n console.error(' Set --mongo-uri/--mongo-db or env CLAUDE_MEMORY_MONGO_URI/CLAUDE_MEMORY_MONGO_DB.\\n');\n process.exit(1);\n }\n\n if (!['push', 'pull', 'both'].includes(direction)) {\n console.error('\\n\u274C Invalid --direction. Use: push | pull | both\\n');\n process.exit(1);\n }\n\n const storagePath = getProjectStoragePath(projectPath);\n if (!fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const batchSizeParsed = parseInt(options.batchSize, 10);\n const intervalParsed = parseInt(options.interval, 10);\n const batchSize = (Number.isFinite(batchSizeParsed) && batchSizeParsed > 0) ? batchSizeParsed : 500;\n const intervalMs = (Number.isFinite(intervalParsed) && intervalParsed > 0) ? intervalParsed : 30000;\n\n const sqliteStore = new SQLiteEventStore(path.join(storagePath, 'events.sqlite'));\n const worker = new MongoSyncWorker(sqliteStore, {\n uri: mongoUri,\n dbName: mongoDb,\n projectKey,\n direction,\n batchSize,\n intervalMs\n });\n\n const runOnce = async () => {\n const { pushed, pulled } = await worker.syncNow();\n const ts = new Date().toISOString();\n process.stdout.write(`[mongo-sync] ${ts} project=${projectKey} pushed=${pushed} pulled=${pulled}\\n`);\n };\n\n try {\n if (!options.watch) {\n await runOnce();\n await worker.shutdown();\n sqliteStore.close();\n return;\n }\n\n console.log(`[mongo-sync] Watch mode started (interval=${intervalMs}ms, project=${projectKey})`);\n\n const handle = setInterval(() => {\n runOnce().catch((err) => {\n console.error('[mongo-sync] Sync failed:', err);\n });\n }, intervalMs);\n\n const shutdown = async () => {\n clearInterval(handle);\n console.log('\\n[mongo-sync] Shutting down...');\n try {\n await worker.shutdown();\n } finally {\n sqliteStore.close();\n }\n process.exit(0);\n };\n\n process.on('SIGINT', () => { void shutdown(); });\n process.on('SIGTERM', () => { void shutdown(); });\n\n // Run immediately, then keep alive\n await runOnce();\n await new Promise(() => {});\n } catch (error) {\n console.error('[mongo-sync] Failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Render import progress to terminal\n */\nfunction renderProgress(event: ProgressEvent): void {\n switch (event.phase) {\n case 'scan':\n console.log(` \uD83D\uDD0D ${event.message}`);\n break;\n case 'session-start': {\n const pct = Math.round(((event.sessionIndex) / event.totalSessions) * 100);\n const sessionName = path.basename(event.filePath, '.jsonl').slice(0, 8);\n process.stdout.write(\n `\\r \uD83D\uDCC4 [${event.sessionIndex + 1}/${event.totalSessions}] ${pct}% | Session ${sessionName}... `\n );\n break;\n }\n case 'session-progress': {\n process.stdout.write(\n `\\r \uD83D\uDCC4 [${event.sessionIndex + 1}/...] ${event.messagesProcessed} msgs | +${event.imported} imported, ~${event.skipped} skipped `\n );\n break;\n }\n case 'session-done': {\n const imported = event.importedPrompts + event.importedResponses;\n if (imported > 0) {\n process.stdout.write(\n `\\r \u2705 [${event.sessionIndex + 1}] +${event.importedPrompts} prompts, +${event.importedResponses} responses${event.skipped > 0 ? `, ~${event.skipped} skipped` : ''} \\n`\n );\n } else if (event.skipped > 0) {\n process.stdout.write(\n `\\r \u23ED\uFE0F [${event.sessionIndex + 1}] All ${event.skipped} already imported \\n`\n );\n } else {\n process.stdout.write(\n `\\r \u23ED\uFE0F [${event.sessionIndex + 1}] Empty session \\n`\n );\n }\n break;\n }\n case 'embedding':\n process.stdout.write(\n `\\r \uD83E\uDDE0 Embeddings: ${event.processed}/${event.total} processed `\n );\n if (event.processed >= event.total) {\n process.stdout.write('\\n');\n }\n break;\n case 'done':\n break;\n }\n}\n\nfunction printImportSummary(result: import('../../services/session-history-importer.js').ImportResult, embedCount: number): void {\n console.log('\\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510');\n console.log('\u2502 \u2705 Import Complete \u2502');\n console.log('\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524');\n console.log(`\u2502 Sessions processed: ${String(result.totalSessions).padStart(8)} \u2502`);\n console.log(`\u2502 Total messages: ${String(result.totalMessages).padStart(8)} \u2502`);\n console.log(`\u2502 Imported prompts: ${String(result.importedPrompts).padStart(8)} \u2502`);\n console.log(`\u2502 Imported responses: ${String(result.importedResponses).padStart(8)} \u2502`);\n console.log(`\u2502 Skipped duplicates: ${String(result.skippedDuplicates).padStart(8)} \u2502`);\n console.log(`\u2502 Embeddings queued: ${String(embedCount).padStart(8)} \u2502`);\n console.log('\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518');\n\n if (result.errors.length > 0) {\n console.log(`\\n\u26A0\uFE0F Errors (${result.errors.length}):`);\n for (const error of result.errors.slice(0, 5)) {\n console.log(` - ${error}`);\n }\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more`);\n }\n }\n}\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) stack.push(full);\n else if (e.isFile() && e.name.endsWith('.md') && e.name !== '_index.md') out.push(full);\n }\n }\n\n return out.sort();\n}\n\nfunction deriveNamespaceCategory(sourceRoot: string, filePath: string): { namespace: string; categoryPath: string[] } {\n const rel = path.relative(sourceRoot, filePath);\n const dirSeg = path.dirname(rel).split(path.sep).filter(Boolean);\n\n if (dirSeg.length >= 2) {\n const namespace = sanitizeSegment(dirSeg[0], 'default');\n const categoryPath = dirSeg.slice(1).map((s) => sanitizeSegment(s, 'uncategorized'));\n return { namespace, categoryPath: categoryPath.length > 0 ? categoryPath : ['uncategorized'] };\n }\n\n return { namespace: 'default', categoryPath: ['uncategorized'] };\n}\n\nfunction extractImportEvidence(markdown: string): { confidence?: string; sources: string[] } {\n const confidenceMatch = markdown.match(/^-\\s*confidence:\\s*([^\\n]+)/m);\n const sources = markdown\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.startsWith('- source:'))\n .map((line) => line.replace(/^-\\s*source:\\s*/i, '').trim())\n .filter(Boolean)\n .slice(0, 30);\n\n return {\n confidence: confidenceMatch ? confidenceMatch[1].trim() : undefined,\n sources\n };\n}\n\n/**\n * Organize-import command - import legacy markdown memories into structured mirror\n */\nprogram\n .command('organize-import [sourceDir]')\n .description('Import existing markdown memory files, or bootstrap knowledge docs from codebase/git when markdown is missing')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--session <id>', 'Session id for imported events (default: import:organized)')\n .option('--limit <n>', 'Limit number of files to import')\n .option('--dry-run', 'Preview mapping without writing')\n .option('--bootstrap', 'Force-generate structured markdown from codebase + git history before import')\n .option('--bootstrap-if-empty', 'Auto-bootstrap when source has no markdown files (default: true)', true)\n .option('--no-bootstrap-if-empty', 'Disable auto-bootstrap when source has no markdown files')\n .option('--force-bootstrap', 'Run bootstrap even when markdown files exist')\n .option('--repo <path>', 'Repository root for bootstrap analysis (default: project path)')\n .option('--out <path>', 'Output directory for generated bootstrap markdown (default: <sourceDir>/bootstrap-kb)')\n .option('--since <range>', 'Git history range for bootstrap (default: \"180 days ago\")')\n .option('--max-commits <n>', 'Max commits to analyze for bootstrap (default: 1000)')\n .option('--incremental', 'Use previous bootstrap manifest as baseline for incremental updates (default: true)', true)\n .option('--no-incremental', 'Disable incremental bootstrap; regenerate full snapshot')\n .action(async (sourceDir: string | undefined, options) => {\n const projectPath = options.project || process.cwd();\n const sessionId = options.session || 'import:organized';\n const sourceRoot = path.resolve(sourceDir || options.out || projectPath);\n const repoPath = path.resolve(options.repo || projectPath);\n\n if (!fs.existsSync(sourceRoot)) {\n fs.mkdirSync(sourceRoot, { recursive: true });\n }\n\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n let activeSourceRoot = sourceRoot;\n let importRoot = sourceRoot;\n let files = await listMarkdownFiles(importRoot);\n const hasMarkdown = files.length > 0;\n const shouldBootstrap = Boolean(options.forceBootstrap || options.bootstrap || (!hasMarkdown && options.bootstrapIfEmpty));\n\n if (shouldBootstrap) {\n const outDir = path.resolve(options.out || path.join(sourceRoot, 'bootstrap-kb'));\n const since = options.since || '180 days ago';\n const maxCommits = options.maxCommits ? Math.max(1, parseInt(options.maxCommits, 10)) : 1000;\n\n console.log('\\n\uD83E\uDDE0 Bootstrapping markdown knowledge base...');\n const bootstrap = await bootstrapKnowledgeBase({\n repoPath,\n outDir,\n since,\n maxCommits,\n incremental: options.incremental\n });\n console.log(` Repo: ${repoPath}`);\n console.log(` Output: ${bootstrap.outDir}`);\n console.log(` Files analyzed: ${bootstrap.fileCount}`);\n console.log(` Commits analyzed: ${bootstrap.commitCount}`);\n console.log(` Modules: ${bootstrap.moduleCount}`);\n\n activeSourceRoot = outDir;\n importRoot = outDir;\n files = await listMarkdownFiles(importRoot);\n }\n\n if (files.length === 0) {\n console.error('\\n\u274C organize-import found no markdown files to import.\\n');\n process.exit(1);\n }\n\n const limit = options.limit ? Math.max(1, parseInt(options.limit, 10)) : files.length;\n const targets = files.slice(0, limit);\n\n console.log(`\\n\uD83D\uDCE6 organize-import`);\n console.log(` Source: ${activeSourceRoot}`);\n console.log(` Project: ${projectPath}`);\n console.log(` Files: ${targets.length}${targets.length < files.length ? `/${files.length}` : ''}`);\n console.log(` Dry-run: ${options.dryRun ? 'yes' : 'no'}\\n`);\n\n if (!options.dryRun) {\n await service.initialize();\n }\n\n let imported = 0;\n let skipped = 0;\n\n for (const file of targets) {\n const text = await fs.promises.readFile(file, 'utf8');\n if (!text.trim()) {\n skipped += 1;\n continue;\n }\n\n const { namespace, categoryPath } = deriveNamespaceCategory(activeSourceRoot, file);\n const rel = path.relative(activeSourceRoot, file);\n const evidence = extractImportEvidence(text);\n\n if (options.dryRun) {\n console.log(`- ${rel} -> namespace=${namespace} category=${categoryPath.join('/')} confidence=${evidence.confidence || 'n/a'} sources=${evidence.sources.length}`);\n continue;\n }\n\n await service.storeSessionSummary(sessionId, text, {\n namespace,\n categoryPath,\n confidence: evidence.confidence,\n sources: evidence.sources,\n import: {\n sourceFile: rel,\n importedAt: new Date().toISOString(),\n bootstrap: shouldBootstrap === true\n }\n });\n imported += 1;\n }\n\n if (!options.dryRun) {\n const embed = await service.processPendingEmbeddings();\n await service.shutdown();\n console.log(`\\n\u2705 Imported: ${imported}, skipped-empty: ${skipped}, embeddings: ${embed}\\n`);\n } else {\n console.log(`\\n\u2705 Dry-run complete (planned imports: ${targets.length - skipped}, skipped-empty: ${skipped})\\n`);\n }\n } catch (error) {\n console.error('\\n\u274C organize-import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Import command - import existing Claude Code sessions\n */\nprogram\n .command('import')\n .description('Import existing Claude Code conversation history')\n .option('-p, --project <path>', 'Import from specific project path')\n .option('-s, --session <file>', 'Import specific session file (JSONL)')\n .option('-a, --all', 'Import all sessions from all projects')\n .option('-l, --limit <number>', 'Limit messages per session')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Force reimport: delete existing events and reimport with turn_id grouping')\n .option('--embedding-model <name>', `Embedding model override (default: ${DEFAULT_EMBEDDING_MODEL}, or env CLAUDE_MEMORY_EMBEDDING_MODEL; fallback: ${DEFAULT_EMBEDDING_FALLBACK_MODEL} or env CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL)`)\n .option('-v, --verbose', 'Show detailed progress')\n .action(async (options) => {\n const startTime = Date.now();\n\n // Determine target project path for storage\n const targetProjectPath = options.project || process.cwd();\n\n if (options.embeddingModel) {\n process.env.CLAUDE_MEMORY_EMBEDDING_MODEL = options.embeddingModel;\n }\n\n // Use project-specific memory service\n const service = getMemoryServiceForProject(targetProjectPath);\n const importer = createSessionHistoryImporter(service);\n\n const importOpts = {\n limit: parsePositiveIntegerOption(options.limit, 'limit'),\n sessionLimit: parsePositiveIntegerOption(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: renderProgress\n };\n\n try {\n console.log('\\n\u23F3 Initializing memory service...');\n await service.initialize();\n console.log(` \u2705 Ready (embedder: ${service.getEmbeddingModelName()})\\n`);\n\n const migration = await service.ensureEmbeddingModelForImport({ autoMigrate: true });\n if (migration.changed) {\n console.log('\uD83D\uDD01 Embedding model migration detected/required');\n console.log(` Previous: ${migration.previousModel || 'legacy-unknown'}`);\n console.log(` Current: ${migration.currentModel}`);\n console.log(` Re-queued embeddings: ${migration.enqueued}`);\n console.log(' (Import will continue and process embeddings with the new model)\\n');\n }\n\n if (options.force) {\n console.log('\uD83D\uDD04 Force mode: existing events will be deleted and reimported with turn_id grouping\\n');\n }\n\n let result;\n\n if (options.session) {\n // Import specific session file\n console.log(`\uD83D\uDCE5 Importing session: ${options.session}`);\n console.log(` Target: ${targetProjectPath}\\n`);\n result = await importer.importSessionFile(options.session, {\n ...importOpts,\n projectPath: targetProjectPath,\n });\n } else if (options.project) {\n // Import all sessions from a project\n console.log(`\uD83D\uDCE5 Importing project: ${options.project}\\n`);\n result = await importer.importProject(options.project, importOpts);\n } else if (options.all) {\n // Import all sessions from all projects\n console.log('\uD83D\uDCE5 Importing all sessions from all projects');\n console.log(' \u26A0\uFE0F Using global storage (use -p for project-specific)\\n');\n const globalService = getDefaultMemoryService();\n const globalImporter = createSessionHistoryImporter(globalService);\n await globalService.initialize();\n console.log(` \u2705 Global service ready (embedder: ${globalService.getEmbeddingModelName()})`);\n const globalMigration = await globalService.ensureEmbeddingModelForImport({ autoMigrate: true });\n if (globalMigration.changed) {\n console.log('\uD83D\uDD01 Global embedding migration detected');\n console.log(` Previous: ${globalMigration.previousModel || 'legacy-unknown'}`);\n console.log(` Current: ${globalMigration.currentModel}`);\n console.log(` Re-queued embeddings: ${globalMigration.enqueued}`);\n }\n result = await globalImporter.importAll(importOpts);\n\n // Process embeddings\n console.log('\\n\uD83E\uDDE0 Processing embeddings...');\n const embedCount = await globalService.processPendingEmbeddings();\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n printImportSummary(result, embedCount);\n console.log(`\\n\u23F1\uFE0F Completed in ${elapsed}s`);\n\n await globalService.shutdown();\n return;\n } else {\n // Default: import current project\n const cwd = process.cwd();\n console.log(`\uD83D\uDCE5 Importing sessions for: ${cwd}\\n`);\n result = await importer.importProject(cwd, {\n ...importOpts,\n projectPath: cwd,\n });\n }\n\n // Process embeddings\n console.log('\\n\uD83E\uDDE0 Processing embeddings...');\n const embedCount = await service.processPendingEmbeddings();\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n printImportSummary(result, embedCount);\n console.log(`\\n\u23F1\uFE0F Completed in ${elapsed}s`);\n\n await service.shutdown();\n } catch (error) {\n console.error('\\n\u274C Import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * List command - list available sessions for import\n */\nprogram\n .command('list')\n .description('List available Claude Code sessions')\n .option('-p, --project <path>', 'Filter by project path')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n const importer = createSessionHistoryImporter(service);\n\n try {\n const sessions = await importer.listAvailableSessions(options.project);\n\n console.log('\\n\uD83D\uDCCB Available Sessions\\n');\n console.log(`Found ${sessions.length} session(s)\\n`);\n\n for (const session of sessions.slice(0, 20)) {\n const date = session.modifiedAt.toISOString().split('T')[0];\n const sizeKB = (session.size / 1024).toFixed(1);\n console.log(`\uD83D\uDCDD ${session.sessionId.slice(0, 16)}...`);\n console.log(` Modified: ${date}`);\n console.log(` Size: ${sizeKB} KB`);\n console.log(` Path: ${session.filePath}`);\n console.log('');\n }\n\n if (sessions.length > 20) {\n console.log(`... and ${sessions.length - 20} more sessions`);\n }\n\n console.log('\\nUse \"claude-memory-layer import --session <path>\" to import a specific session');\n } catch (error) {\n console.error('List failed:', error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Codex Validation Commands\n// ============================================================\n\nconst codexCmd = program\n .command('codex')\n .description('Read-only Codex session scan/replay validation');\n\ncodexCmd\n .command('validate')\n .description('Dry-run validate Codex JSONL sessions without importing or mutating memory')\n .option('-p, --project <path>', 'Filter sessions by session_meta.payload.cwd')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit number of session files to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .option('--anonymize-projects', 'Show hashed project labels instead of raw cwd paths')\n .action(async (options: CodexValidateCommandOptions) => {\n try {\n await runCodexValidationCommand(options);\n } catch (error) {\n console.error('Codex validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\ncodexCmd\n .command('replay')\n .description('Alias for read-only Codex validation/replay report')\n .option('-p, --project <path>', 'Filter sessions by session_meta.payload.cwd')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit number of session files to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .option('--anonymize-projects', 'Show hashed project labels instead of raw cwd paths')\n .action(async (options: CodexValidateCommandOptions) => {\n try {\n await runCodexValidationCommand(options);\n } catch (error) {\n console.error('Codex replay failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\ncodexCmd\n .command('import')\n .description('Explicitly import Codex JSONL sessions into claude-memory-layer memory (mutates memory)')\n .option('-p, --project <path>', 'Import sessions whose session_meta.payload.cwd matches this project (default: cwd)')\n .option('-s, --session <file>', 'Import one Codex session JSONL file')\n .option('-a, --all', 'Import all Codex sessions into global memory unless --project is supplied')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit memories imported across selected matching sessions')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Delete existing events for each imported session before reimporting')\n .option('-v, --verbose', 'Show detailed progress')\n .option('--no-process-embeddings', 'Skip processing pending embeddings after import')\n .action(async (options) => {\n const startTime = Date.now();\n try {\n if (options.all && !options.project && !options.session) {\n console.log('\\n\uD83D\uDCE5 Importing all Codex sessions into global memory');\n console.log(' \u26A0\uFE0F Use --project to keep memory scoped to one project.\\n');\n } else {\n console.log(`\\n\uD83D\uDCE5 Importing Codex sessions for: ${options.project || process.cwd()}\\n`);\n }\n\n const outcome = await runCodexImportOnce(options, {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createCodexSessionHistoryImporter,\n onProgress: renderProgress\n });\n\n printImportSummary(outcome.result, outcome.embedCount);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(`\\n\u23F1\uFE0F Codex import completed in ${elapsed}s (${outcome.mode}, ${outcome.storageScope} storage)`);\n } catch (error) {\n console.error('Codex import failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Hermes Validation Commands\n// ============================================================\n\nconst hermesCmd = program\n .command('hermes')\n .description('Read-only Hermes SessionDB scan/replay validation and explicit import');\n\nhermesCmd\n .command('validate')\n .description('Dry-run validate Hermes ~/.hermes/state.db sessions without importing or mutating memory')\n .option('-p, --project <path>', 'Filter sessions by project path in Hermes session context')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit number of matching sessions to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .action(async (options: HermesValidateCommandOptions) => {\n try {\n await runHermesValidationCommand(options);\n } catch (error) {\n console.error('Hermes validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nhermesCmd\n .command('replay')\n .description('Alias for read-only Hermes SessionDB validation/replay report')\n .option('-p, --project <path>', 'Filter sessions by project path in Hermes session context')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit number of matching sessions to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .action(async (options: HermesValidateCommandOptions) => {\n try {\n await runHermesValidationCommand(options);\n } catch (error) {\n console.error('Hermes replay failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nhermesCmd\n .command('import')\n .description('Explicitly import Hermes SessionDB sessions into claude-memory-layer memory (mutates memory)')\n .option('-p, --project <path>', 'Import sessions whose Hermes context matches this project (default: cwd)')\n .option('-s, --session <id>', 'Import one Hermes session id')\n .option('-a, --all', 'Import all Hermes sessions into global memory unless --project is supplied')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit messages imported per selected Hermes session')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Delete existing events for each imported session before reimporting')\n .option('-v, --verbose', 'Show detailed progress')\n .option('--no-process-embeddings', 'Skip processing pending embeddings after import')\n .action(async (options) => {\n const startTime = Date.now();\n try {\n if (options.all && !options.project && !options.session) {\n console.log('\\n\uD83D\uDCE5 Importing all Hermes sessions into global memory');\n console.log(' \u26A0\uFE0F Use --project to keep memory scoped to one project.\\n');\n } else {\n console.log(`\\n\uD83D\uDCE5 Importing Hermes sessions for: ${options.project || process.cwd()}\\n`);\n }\n\n const outcome = await runHermesImportOnce(options, {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createHermesSessionHistoryImporter,\n onProgress: renderProgress\n });\n\n printImportSummary(outcome.result, outcome.embedCount);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(`\\n\u23F1\uFE0F Hermes import completed in ${elapsed}s (${outcome.mode}, ${outcome.storageScope} storage)`);\n } catch (error) {\n console.error('Hermes import failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Endless Mode Commands\n// ============================================================\n\n/**\n * Endless Mode parent command\n */\nconst endlessCmd = program\n .command('endless')\n .description('Manage Endless Mode (biomimetic continuous memory)');\n\n/**\n * Enable Endless Mode\n */\nendlessCmd\n .command('enable')\n .description('Enable Endless Mode')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('endless');\n\n console.log('\\n\u267E\uFE0F Endless Mode Enabled\\n');\n console.log('Your conversations will now be continuously integrated');\n console.log('across session boundaries.\\n');\n console.log('Features:');\n console.log(' - Working Set: Recent context kept active');\n console.log(' - Consolidation: Automatic memory integration');\n console.log(' - Continuity: Seamless context transitions\\n');\n console.log('Use \"claude-memory-layer endless status\" to view current state');\n\n await service.shutdown();\n } catch (error) {\n console.error('Enable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Disable Endless Mode\n */\nendlessCmd\n .command('disable')\n .description('Disable Endless Mode (return to Session Mode)')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('session');\n\n console.log('\\n\uD83D\uDCCB Session Mode Enabled\\n');\n console.log('Returned to traditional session-based memory.');\n console.log('Existing Endless Mode data is preserved for future use.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Disable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Endless Mode Status\n */\nendlessCmd\n .command('status')\n .description('Show Endless Mode status')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n const status = await service.getEndlessModeStatus();\n\n const modeIcon = status.mode === 'endless' ? '\u267E\uFE0F' : '\uD83D\uDCCB';\n const modeName = status.mode === 'endless' ? 'Endless Mode' : 'Session Mode';\n\n console.log(`\\n${modeIcon} ${modeName}\\n`);\n\n if (status.mode === 'endless') {\n // Continuity score bar\n const continuityBars = '\u2588'.repeat(Math.round(status.continuityScore * 10));\n const continuityEmpty = '\u2591'.repeat(10 - Math.round(status.continuityScore * 10));\n\n console.log('\uD83D\uDCCA Status:');\n console.log(` Working Set: ${status.workingSetSize} events`);\n console.log(` Continuity: [${continuityBars}${continuityEmpty}] ${(status.continuityScore * 100).toFixed(0)}%`);\n console.log(` Consolidated: ${status.consolidatedCount} memories`);\n\n if (status.lastConsolidation) {\n const ago = Math.round((Date.now() - status.lastConsolidation.getTime()) / 60000);\n console.log(` Last Consolidation: ${ago} minutes ago`);\n } else {\n console.log(' Last Consolidation: Never');\n }\n } else {\n console.log('Endless Mode is disabled.');\n console.log('Use \"claude-memory-layer endless enable\" to activate.');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Status failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidate command - manually trigger consolidation\n */\nendlessCmd\n .command('consolidate')\n .description('Manually trigger memory consolidation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"claude-memory-layer endless enable\" first');\n process.exit(1);\n }\n\n console.log('\\n\u23F3 Running memory consolidation...');\n const count = await service.forceConsolidation();\n\n if (count > 0) {\n console.log(`\\n\u2705 Consolidated ${count} memory group(s)`);\n } else {\n console.log('\\n\uD83D\uDCCB No memories to consolidate');\n console.log('(Working set may not have enough events yet)');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Consolidation failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Working Set command - view current working set\n */\nendlessCmd\n .command('working-set')\n .alias('ws')\n .description('View current working set')\n .option('-l, --limit <number>', 'Number of events to show', '10')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"claude-memory-layer endless enable\" first');\n process.exit(1);\n }\n\n const workingSet = await service.getWorkingSet();\n\n if (!workingSet || workingSet.recentEvents.length === 0) {\n console.log('\\n\uD83D\uDCCB Working Set is empty');\n console.log('Events will be added as you interact with Claude');\n process.exit(0);\n }\n\n console.log('\\n\uD83E\uDDE0 Working Set\\n');\n console.log(`Total events: ${workingSet.recentEvents.length}`);\n console.log(`Continuity score: ${(workingSet.continuityScore * 100).toFixed(0)}%`);\n console.log(`Last activity: ${workingSet.lastActivity.toISOString()}\\n`);\n\n const limit = parseInt(options.limit);\n const events = workingSet.recentEvents.slice(0, limit);\n\n for (const event of events) {\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' :\n event.eventType === 'tool_observation' ? '\uD83D\uDD27' : '\uD83D\uDCDD';\n const time = event.timestamp.toLocaleTimeString();\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n\n console.log(`${icon} [${time}] ${event.eventType}`);\n console.log(` ${preview}`);\n console.log('');\n }\n\n if (workingSet.recentEvents.length > limit) {\n console.log(`... and ${workingSet.recentEvents.length - limit} more events`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Working set failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidated memories command\n */\nendlessCmd\n .command('memories')\n .description('View consolidated memories')\n .option('-l, --limit <number>', 'Number of memories to show', '10')\n .option('-q, --query <text>', 'Search consolidated memories')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n let memories;\n\n if (options.query) {\n memories = await service.searchConsolidated(options.query, {\n topK: parseInt(options.limit)\n });\n console.log(`\\n\uD83D\uDD0D Searching for: \"${options.query}\"\\n`);\n } else {\n memories = await service.getConsolidatedMemories(parseInt(options.limit));\n console.log('\\n\uD83D\uDCBE Consolidated Memories\\n');\n }\n\n if (memories.length === 0) {\n console.log('No consolidated memories found.');\n if (!service.isEndlessModeActive()) {\n console.log('Enable Endless Mode to start consolidating memories.');\n }\n process.exit(0);\n }\n\n console.log(`Showing ${memories.length} memory(ies)\\n`);\n\n for (const memory of memories) {\n const date = memory.createdAt.toISOString().split('T')[0];\n const confidenceBars = '\u2588'.repeat(Math.round(memory.confidence * 5));\n\n console.log(`\uD83D\uDCDA ${memory.topics.slice(0, 3).join(', ')}`);\n console.log(` Created: ${date}`);\n console.log(` Confidence: [${confidenceBars}] ${(memory.confidence * 100).toFixed(0)}%`);\n console.log(` Sources: ${memory.sourceEvents.length} events`);\n console.log(` Access count: ${memory.accessCount}`);\n console.log(` Summary: ${memory.summary.slice(0, 200)}${memory.summary.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Memories failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * MCP command - configure Claude Desktop MCP integration\n */\nconst mcpCmd = program\n .command('mcp')\n .description('Manage MCP Desktop integration');\n\nmcpCmd\n .command('install')\n .description('Install claude-memory-layer MCP server into Claude Desktop config')\n .option('-c, --config-path <path>', 'Claude Desktop config path')\n .option('-n, --server-name <name>', 'MCP server name', 'claude-memory-layer')\n .option('--command <command>', 'MCP server command', 'claude-memory-layer-mcp')\n .option('--arg <arg...>', 'Arguments for the MCP server command')\n .option('--dry-run', 'Print the updated config without writing it')\n .action((options: { configPath?: string; serverName: string; command: string; arg?: string[]; dryRun?: boolean }) => {\n try {\n const { configPath, config } = installMcpServer({\n configPath: options.configPath,\n serverName: options.serverName,\n command: options.command,\n args: options.arg ?? [],\n dryRun: options.dryRun ?? false\n });\n\n if (options.dryRun) {\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\nDry run only. No changes written to ${configPath}`);\n return;\n }\n\n console.log(`\\n\u2705 Installed MCP server '${options.serverName}' into Claude Desktop config.`);\n console.log(` Config: ${configPath}`);\n console.log(' Restart Claude Desktop to load the new MCP server.\\n');\n } catch (error) {\n console.error('MCP install failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Dashboard command - start web dashboard\n */\nprogram\n .command('dashboard')\n .description('Open memory dashboard in browser')\n .option('-p, --port <port>', 'Server port', '37777')\n .option('--no-open', 'Do not auto-open browser')\n .action(async (options) => {\n const port = parseInt(options.port, 10);\n\n try {\n // Check if server is already running\n const running = await isServerRunning(port);\n if (running) {\n console.log(`\\n\uD83E\uDDE0 Dashboard already running at http://localhost:${port}\\n`);\n if (options.open) {\n openBrowser(`http://localhost:${port}`);\n }\n return;\n }\n\n // Start the server\n console.log('\\n\uD83E\uDDE0 Starting Code Memory Dashboard...\\n');\n startServer(port);\n\n // Open browser\n if (options.open) {\n setTimeout(() => {\n openBrowser(`http://localhost:${port}`);\n }, 500);\n }\n\n console.log(`\\n\uD83D\uDCCA Dashboard: http://localhost:${port}`);\n console.log('Press Ctrl+C to stop the server\\n');\n\n // Handle graceful shutdown\n const shutdown = () => {\n console.log('\\n\\n\uD83D\uDC4B Shutting down dashboard...');\n stopServer();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n console.error('Dashboard failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Open URL in default browser\n */\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = `open \"${url}\"`;\n } else if (platform === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`\\n\u26A0\uFE0F Could not open browser automatically.`);\n console.log(` Please open ${url} manually.\\n`);\n }\n });\n}\n\nprogram.parse();\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as os from 'os';\n\nimport type { RetrievalResult, UnifiedRetrievalResult } from '../core/retriever.js';\nimport type { PromotionResult } from '../core/shared-promoter.js';\nimport type { SharedMemoryServices } from '../extensions/shared-memory/index.js';\nimport type {\n AppendResult,\n MemoryEvent,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContinuityScore,\n SharedStoreConfig,\n Entry\n} from '../core/types.js';\nimport type { EndlessMemoryServices } from '../extensions/endless-memory/index.js';\nimport {\n type EmbeddingMaintenanceService,\n type EmbeddingModelMaintenanceOptions,\n type EmbeddingModelMaintenanceResult\n} from '../core/engine/embedding-maintenance-service.js';\nimport type { MemoryRuntimeService } from '../core/engine/memory-runtime-service.js';\nimport type { GraduationRunResult } from '../core/graduation-worker.js';\nimport type { IngestInterceptor } from '../core/ingest-interceptor.js';\nimport type { MemoryIngestService } from '../core/engine/memory-ingest-service.js';\nimport type { MemoryQueryService } from '../core/engine/memory-query-service.js';\nimport { createMemoryServiceComposition } from '../core/engine/memory-service-composition.js';\nimport {\n getProjectStoragePath as defaultGetProjectStoragePath,\n hashProjectPath as defaultHashProjectPath\n} from '../core/registry/project-path.js';\nimport { getSessionProject as defaultGetSessionProject } from '../core/registry/session-registry.js';\nimport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\nimport { createMemoryServiceRegistry } from './memory-service-registry.js';\nimport {\n type AccessedMemory,\n type HelpfulMemory,\n type HelpfulnessStats,\n type RecordQueryTraceInput,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureExpansion,\n type RetrievalDisclosureExpandOptions,\n type RetrievalDisclosureSearchOptions,\n type RetrievalDisclosureSearchResponse,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSource,\n type RetrievalOrchestrator,\n type RetrievalTrace,\n type RetrievalTraceStats,\n type RetrieveMemoriesOptions\n} from '../core/engine/retrieval-services.js';\nexport { getProjectStoragePath, hashProjectPath } from '../core/registry/project-path.js';\nexport {\n getSessionProject,\n registerSession,\n type SessionRegistry,\n type SessionRegistryEntry,\n loadSessionRegistry\n} from '../core/registry/session-registry.js';\n\nexport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\n\nexport class MemoryService {\n private readonly retrievalOrchestrator: RetrievalOrchestrator;\n private readonly retrievalDisclosureService: RetrievalDisclosureService;\n private readonly retrievalAnalyticsService: RetrievalAnalyticsService;\n private readonly embeddingMaintenanceService: EmbeddingMaintenanceService;\n private readonly runtimeService: MemoryRuntimeService;\n\n // Endless Mode components\n private readonly endlessMemoryServices: EndlessMemoryServices;\n\n // Shared Store components (cross-project knowledge)\n private sharedMemoryServices!: SharedMemoryServices;\n private projectHash: string | null = null;\n private projectPath: string | null = null;\n\n private readonly readOnly: boolean;\n private readonly lightweightMode: boolean;\n private readonly embeddingOnly: boolean;\n private readonly ingestService: MemoryIngestService;\n private readonly queryService: MemoryQueryService;\n\n constructor(config: MemoryServiceConfig & { projectHash?: string; projectPath?: string; sharedStoreConfig?: SharedStoreConfig }) {\n this.readOnly = config.readOnly ?? false;\n this.lightweightMode = config.lightweightMode ?? false;\n this.embeddingOnly = config.embeddingOnly ?? false;\n\n // Store project hash for shared store operations\n this.projectHash = config.projectHash || null;\n this.projectPath = config.projectPath || null;\n const sharedStoreConfig = config.sharedStoreConfig ?? DEFAULT_ENABLED_SHARED_STORE_CONFIG;\n\n const composition = createMemoryServiceComposition({\n config: {\n ...config,\n storagePath: config.storagePath,\n readOnly: this.readOnly,\n lightweightMode: this.lightweightMode,\n embeddingOnly: this.embeddingOnly,\n sharedStoreConfig\n },\n defaultSharedStoragePath: DEFAULT_SHARED_STORAGE_PATH,\n defaultSharedStoreConfig: DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n initialize: () => this.initialize(),\n getProjectHash: () => this.projectHash,\n getProjectPath: () => this.projectPath\n });\n\n this.retrievalOrchestrator = composition.retrievalOrchestrator;\n this.retrievalDisclosureService = composition.retrievalDisclosureService;\n this.retrievalAnalyticsService = composition.retrievalAnalyticsService;\n this.ingestService = composition.ingestService;\n this.queryService = composition.queryService;\n this.endlessMemoryServices = composition.endlessMemoryServices;\n this.sharedMemoryServices = composition.sharedMemoryServices;\n this.runtimeService = composition.runtimeService;\n this.embeddingMaintenanceService = composition.embeddingMaintenanceService;\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n await this.runtimeService.initialize();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestOnError(interceptor);\n }\n\n /**\n * Start a new session\n */\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n return this.ingestService.startSession(sessionId, projectPath);\n }\n\n /**\n * End a session\n */\n async endSession(sessionId: string, summary?: string): Promise<void> {\n return this.ingestService.endSession(sessionId, summary);\n }\n\n /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeUserPrompt(sessionId, content, metadata);\n }\n\n /**\n * Store an agent response\n */\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeAgentResponse(sessionId, content, metadata);\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeSessionSummary(sessionId, summary, metadata);\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n return this.ingestService.backfillMissingSummaries(currentSessionId, limit);\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Called at session end (Stop hook) when no LLM-generated summary exists.\n * Skips if a summary already exists for this session.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n return this.ingestService.generateSessionSummary(sessionId);\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n return this.ingestService.storeToolObservation(sessionId, payload);\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n return this.retrievalOrchestrator.retrieveMemories(query, options);\n }\n\n /**\n * Layer 1 retrieval disclosure: lightweight search envelopes for UI/API/agent use.\n */\n async searchDisclosure(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n return this.retrievalDisclosureService.search(query, options);\n }\n\n /**\n * Layer 2 retrieval disclosure: expand a search result into surrounding timeline context.\n */\n async expandDisclosure(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n return this.retrievalDisclosureService.expand(resultId, options);\n }\n\n /**\n * Layer 3 retrieval disclosure: resolve a search result to its raw source event.\n */\n async sourceDisclosure(resultId: string): Promise<RetrievalDisclosureSource | null> {\n return this.retrievalDisclosureService.source(resultId);\n }\n\n /**\n * Fast keyword search using SQLite FTS5\n * Much faster than vector search - no embedding model needed\n */\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{event: MemoryEvent; score: number}>> {\n return this.queryService.keywordSearch(query, options);\n }\n\n /**\n * Rebuild FTS index (call after database upgrade)\n */\n async rebuildFtsIndex(): Promise<number> {\n return this.queryService.rebuildFtsIndex();\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n return this.queryService.getSessionHistory(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n return this.queryService.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n\n async getOutboxStats(): Promise<{\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n }> {\n return this.queryService.getOutboxStats();\n }\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n return this.retrievalAnalyticsService.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n return this.retrievalAnalyticsService.getRecentRetrievalTraces(limit);\n }\n\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n return this.queryService.getStats();\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n return this.runtimeService.processPendingEmbeddings();\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByLevel(level, options);\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n return this.queryService.getEventLevel(eventId);\n }\n\n /**\n * Format retrieval results as context for Claude\n */\n formatAsContext(result: RetrievalResult): string {\n return this.retrievalOrchestrator.formatAsContext(result);\n }\n\n // ============================================================\n // Shared Store Methods (Cross-Project Knowledge)\n // ============================================================\n\n /**\n * Check if shared store is enabled and initialized\n */\n isSharedStoreEnabled(): boolean {\n return this.sharedMemoryServices.isEnabled();\n }\n\n /**\n * Promote an entry to shared storage\n */\n async promoteToShared(entry: Entry): Promise<PromotionResult> {\n return this.sharedMemoryServices.promoteToShared(entry, this.projectHash);\n }\n\n /**\n * Get shared store statistics\n */\n async getSharedStoreStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n } | null> {\n return this.sharedMemoryServices.getStats();\n }\n\n /**\n * Search shared troubleshooting entries\n */\n async searchShared(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ) {\n return this.sharedMemoryServices.search(query, options);\n }\n\n /**\n * Get project hash for this service\n */\n getProjectHash(): string | null {\n return this.projectHash;\n }\n\n // ============================================================\n // Endless Mode Methods\n // ============================================================\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n return this.endlessMemoryServices.initializeEndlessMode();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n return this.endlessMemoryServices.getEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n return this.endlessMemoryServices.setEndlessConfig(config);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n return this.endlessMemoryServices.setMode(mode);\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMemoryServices.getMode();\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMemoryServices.isEndlessModeActive();\n }\n\n /**\n * Add event to Working Set (Endless Mode)\n */\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n return this.endlessMemoryServices.addToWorkingSet(eventId, relevanceScore);\n }\n\n /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n return this.endlessMemoryServices.getWorkingSet();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.searchConsolidated(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.getConsolidatedMemories(limit);\n }\n\n /**\n * Increment access count for memories that were used in prompts\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n return this.retrievalOrchestrator.incrementMemoryAccess(eventIds);\n }\n\n /**\n * Get most accessed memories from events\n */\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n return this.retrievalAnalyticsService.getMostAccessedMemories(limit);\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n return this.retrievalOrchestrator.recordRetrieval(eventId, sessionId, score, query);\n }\n\n /**\n * Record a query-level retrieval trace (used by user-prompt-submit hook).\n * Feeds the retrieval_traces table that powers dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n return this.retrievalOrchestrator.recordQueryTrace(input);\n }\n\n /**\n * Evaluate helpfulness of retrievals in a session (called at session end)\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluateSessionHelpfulness(sessionId);\n }\n\n /**\n * Backfill helpfulness evaluation for sessions that ended without Stop hook.\n * Call on first turn of a new session to catch missed evaluations.\n */\n async evaluatePendingSessions(currentSessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluatePendingSessions(currentSessionId);\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n return this.retrievalAnalyticsService.getHelpfulMemories(limit);\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(): Promise<HelpfulnessStats> {\n return this.retrievalAnalyticsService.getHelpfulnessStats();\n }\n\n /**\n * Mark a consolidated memory as accessed\n */\n async markMemoryAccessed(memoryId: string): Promise<void> {\n return this.endlessMemoryServices.markMemoryAccessed(memoryId);\n }\n\n /**\n * Calculate continuity score for current context\n */\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n return this.endlessMemoryServices.calculateContinuity(content, metadata);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n this.endlessMemoryServices.recordActivity();\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n return this.endlessMemoryServices.forceConsolidation();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n return this.endlessMemoryServices.getEndlessModeStatus();\n }\n\n // ============================================================\n // Turn Grouping Methods\n // ============================================================\n\n /**\n * Get events grouped by turn for a session\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n return this.queryService.getSessionTurns(sessionId, options);\n }\n\n /**\n * Get all events for a specific turn\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByTurn(turnId);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n return this.queryService.countSessionTurns(sessionId);\n }\n\n /**\n * Backfill turn_ids from metadata for events stored before the migration\n */\n async backfillTurnIds(): Promise<number> {\n return this.queryService.backfillTurnIds();\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n return this.queryService.deleteSessionEvents(sessionId);\n }\n\n /**\n * Format Endless Mode context for Claude\n */\n async formatEndlessContext(query: string): Promise<string> {\n return this.endlessMemoryServices.formatEndlessContext(query);\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceGraduation(): Promise<GraduationRunResult> {\n return this.runtimeService.forceGraduation();\n }\n\n /**\n * Record access to a memory event (for graduation scoring)\n */\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n this.runtimeService.recordMemoryAccess(eventId, sessionId, confidence);\n }\n\n getEmbeddingModelName(): string {\n return this.embeddingMaintenanceService.getEmbeddingModelName();\n }\n\n /**\n * Ensure embedding model metadata is in sync and optionally migrate vectors.\n * Migration strategy: clear vector index + clear embedding outbox + re-enqueue all events.\n */\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n return this.embeddingMaintenanceService.ensureEmbeddingModelForImport(options);\n }\n\n /**\n * Backward-compatible alias used by some hooks\n */\n async close(): Promise<void> {\n await this.shutdown();\n }\n\n /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n await this.runtimeService.shutdown();\n }\n}\n\nconst defaultRegistry = createMemoryServiceRegistry<MemoryService>({\n createService: (config) => new MemoryService(config),\n hashProjectPath: defaultHashProjectPath,\n getProjectStoragePath: defaultGetProjectStoragePath,\n getSessionProject: defaultGetSessionProject,\n homedir: os.homedir,\n disabledSharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n});\n\nexport const getDefaultMemoryService = defaultRegistry.getDefaultMemoryService;\nexport const getReadOnlyMemoryService = defaultRegistry.getReadOnlyMemoryService;\nexport const getMemoryServiceForProject = defaultRegistry.getMemoryServiceForProject;\nexport const getMemoryServiceForSession = defaultRegistry.getMemoryServiceForSession;\nexport const getLightweightMemoryService = defaultRegistry.getLightweightMemoryService;\nexport const getLightweightMemoryServiceForProject = defaultRegistry.getLightweightMemoryServiceForProject;\nexport const createMemoryService = defaultRegistry.createMemoryService;\n", "/**\n * Memory Service Composition\n *\n * Owns constructor-time service graph wiring for MemoryService so the public\n * facade can stay focused on state assignment and method delegation.\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport { createToolObservationEmbedding as defaultCreateToolObservationEmbedding } from '../metadata-extractor.js';\nimport type { Retriever } from '../retriever.js';\nimport type { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload, SharedStoreConfig } from '../types.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createEmbeddingMaintenanceService as defaultCreateEmbeddingMaintenanceService,\n type EmbeddingMaintenanceService,\n type EmbeddingMaintenanceServiceOptions\n} from './embedding-maintenance-service.js';\nimport {\n createEndlessMemoryServices as defaultCreateEndlessMemoryServices,\n type EndlessMemoryServices,\n type EndlessMemoryServicesOptions\n} from './endless-memory-services.js';\nimport {\n createMemoryEngineServices as defaultCreateMemoryEngineServices,\n type MemoryEngineServices,\n type MemoryEngineServicesOptions\n} from './memory-engine-services.js';\nimport {\n createMemoryRuntimeService as defaultCreateMemoryRuntimeService,\n type MemoryRuntimeService,\n type MemoryRuntimeServicesDeps\n} from './memory-runtime-service.js';\nimport type {\n MemoryIngestService\n} from './memory-ingest-service.js';\nimport type {\n MemoryQueryService\n} from './memory-query-service.js';\nimport {\n createSharedMemoryServices as defaultCreateSharedMemoryServices,\n type SharedMemoryServices,\n type SharedMemoryServicesOptions\n} from './shared-memory-services.js';\nimport type {\n RetrievalAnalyticsService,\n RetrievalDisclosureService,\n RetrievalOrchestrator\n} from './retrieval-services.js';\n\nexport interface MemoryServiceCompositionConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n lightweightMode?: boolean;\n embeddingOnly?: boolean;\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n}\n\nexport interface MemoryServiceCompositionFactories {\n expandPath?: (targetPath: string) => string;\n createToolObservationEmbedding?: (\n toolName: string,\n metadata: Record<string, unknown>,\n success: boolean\n ) => string;\n createMemoryEngineServices?: (options: MemoryEngineServicesOptions) => MemoryEngineServices;\n createEndlessMemoryServices?: (options: EndlessMemoryServicesOptions) => EndlessMemoryServices;\n createSharedMemoryServices?: (options: SharedMemoryServicesOptions) => SharedMemoryServices;\n createMemoryRuntimeService?: (deps: MemoryRuntimeServicesDeps) => MemoryRuntimeService;\n createEmbeddingMaintenanceService?: (\n options: EmbeddingMaintenanceServiceOptions\n ) => EmbeddingMaintenanceService;\n}\n\nexport interface MemoryServiceCompositionOptions {\n config: MemoryServiceCompositionConfig;\n defaultSharedStoragePath: string;\n defaultSharedStoreConfig?: SharedStoreConfig;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n factories?: MemoryServiceCompositionFactories;\n}\n\nexport interface MemoryServiceComposition {\n storagePath: string;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n embeddingMaintenanceService: EmbeddingMaintenanceService;\n runtimeService: MemoryRuntimeService;\n graduation: GraduationPipeline;\n endlessMemoryServices: EndlessMemoryServices;\n sharedMemoryServices: SharedMemoryServices;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryServiceComposition(\n options: MemoryServiceCompositionOptions\n): MemoryServiceComposition {\n const factories = options.factories ?? {};\n const expandPath = factories.expandPath ?? defaultExpandPath;\n const createToolEmbedding = factories.createToolObservationEmbedding ?? defaultCreateToolObservationEmbedding;\n\n const storagePath = expandPath(options.config.storagePath);\n const projectPathForMirror = options.getProjectPath?.() ?? options.config.projectPath ?? process.cwd();\n const readOnly = options.config.readOnly ?? false;\n const lightweightMode = options.config.lightweightMode ?? false;\n const embeddingOnly = options.config.embeddingOnly ?? false;\n const sharedStoreConfig = options.config.sharedStoreConfig ?? options.defaultSharedStoreConfig ?? {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: options.defaultSharedStoragePath\n };\n\n let sharedMemoryServices: SharedMemoryServices | null = null;\n\n const engineServices = (factories.createMemoryEngineServices ?? defaultCreateMemoryEngineServices)({\n storagePath,\n readOnly,\n embeddingModel: options.config.embeddingModel,\n cwd: projectPathForMirror,\n initialize: options.initialize,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n hasSharedStore: () => sharedMemoryServices?.isEnabled() ?? false,\n sharedStore: {\n get: (entryId: string) => sharedMemoryServices?.getEntryForDisclosure(entryId) ?? Promise.resolve(null)\n },\n createToolObservationEmbedding: (payload: ToolObservationPayload) => createToolEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n )\n });\n\n const endlessMemoryServices = (factories.createEndlessMemoryServices ?? defaultCreateEndlessMemoryServices)({\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n configStore: engineServices.sqliteStore,\n initialize: options.initialize\n });\n\n sharedMemoryServices = (factories.createSharedMemoryServices ?? defaultCreateSharedMemoryServices)({\n config: sharedStoreConfig,\n defaultSharedStoragePath: options.defaultSharedStoragePath,\n readOnly,\n expandPath,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever\n });\n\n const runtimeService = (factories.createMemoryRuntimeService ?? defaultCreateMemoryRuntimeService)({\n sqliteStore: engineServices.sqliteStore,\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n readOnly,\n lightweightMode,\n embeddingOnly\n });\n\n const embeddingMaintenanceService = (\n factories.createEmbeddingMaintenanceService ?? defaultCreateEmbeddingMaintenanceService\n )({\n storagePath,\n initialize: options.initialize,\n getEmbeddingModelName: () => engineServices.embedder.getModelName(),\n vectorStore: engineServices.vectorStore,\n eventStore: {\n clearEmbeddingOutbox: () => engineServices.sqliteStore.clearEmbeddingOutbox(),\n getEventsPage: async (limit, offset) => {\n const events = await engineServices.sqliteStore.getEventsPage(limit, offset);\n return events.map((event) => ({ id: event.id, content: event.content }));\n },\n enqueueForEmbedding: async (eventId, content) => {\n await engineServices.sqliteStore.enqueueForEmbedding(eventId, content);\n }\n },\n getVectorWorker: () => runtimeService.getVectorWorker()\n });\n\n return {\n storagePath,\n readOnly,\n lightweightMode,\n embeddingOnly,\n sqliteStore: engineServices.sqliteStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n retrievalOrchestrator: engineServices.retrievalOrchestrator,\n retrievalDisclosureService: engineServices.retrievalDisclosureService,\n retrievalAnalyticsService: engineServices.retrievalAnalyticsService,\n embeddingMaintenanceService,\n runtimeService,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n ingestService: engineServices.ingestService,\n queryService: engineServices.queryService\n };\n}\n\nfunction defaultExpandPath(targetPath: string): string {\n if (targetPath.startsWith('~')) {\n return path.join(os.homedir(), targetPath.slice(1));\n }\n return targetPath;\n}\n", "/**\n * Metadata Extractor\n * Extracts tool-specific metadata from tool inputs and outputs\n */\n\nimport type { ToolMetadata } from './types.js';\n\n/**\n * Get file type from path\n */\nfunction getFileType(filePath: string): string | undefined {\n const ext = filePath.split('.').pop()?.toLowerCase();\n if (!ext) return undefined;\n\n const typeMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n py: 'python',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'header',\n hpp: 'header',\n cs: 'csharp',\n php: 'php',\n html: 'html',\n css: 'css',\n scss: 'scss',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n md: 'markdown',\n sql: 'sql',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell'\n };\n\n return typeMap[ext];\n}\n\n/**\n * Count lines in content\n */\nfunction countLines(content: string): number {\n return content.split('\\n').length;\n}\n\n/**\n * Extract bash command (without arguments that might contain secrets)\n */\nfunction extractCommand(fullCommand: string): string {\n // Get first word (command name)\n const parts = fullCommand.trim().split(/\\s+/);\n const command = parts[0];\n\n // For common commands, include safe arguments\n const safeCommands = ['git', 'npm', 'yarn', 'pnpm', 'node', 'python', 'go', 'cargo', 'make'];\n if (safeCommands.includes(command) && parts.length > 1) {\n // Include subcommand for these\n return `${command} ${parts[1]}`;\n }\n\n return command;\n}\n\n/**\n * Extract metadata from tool usage\n */\nexport function extractMetadata(\n toolName: string,\n input: Record<string, unknown>,\n output: string,\n success: boolean\n): ToolMetadata {\n switch (toolName) {\n case 'Read': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: success ? countLines(output) : undefined\n };\n }\n\n case 'Write': {\n const filePath = input.file_path as string | undefined;\n const content = input.content as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: content ? countLines(content) : undefined\n };\n }\n\n case 'Edit': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined\n };\n }\n\n case 'Bash': {\n const fullCommand = input.command as string | undefined;\n return {\n command: fullCommand ? extractCommand(fullCommand) : undefined\n };\n }\n\n case 'Grep': {\n const pattern = input.pattern as string | undefined;\n // Count matches from output\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'Glob': {\n const pattern = input.pattern as string | undefined;\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'WebFetch': {\n const url = input.url as string | undefined;\n // Try to extract status code from output\n const statusMatch = output.match(/status:\\s*(\\d{3})/i);\n return {\n url,\n statusCode: statusMatch ? parseInt(statusMatch[1], 10) : undefined\n };\n }\n\n case 'WebSearch': {\n return {};\n }\n\n case 'NotebookEdit': {\n const notebookPath = input.notebook_path as string | undefined;\n return {\n filePath: notebookPath,\n fileType: 'jupyter'\n };\n }\n\n default:\n return {};\n }\n}\n\n/**\n * Create embedding content for tool observation\n */\nexport function createToolObservationEmbedding(\n toolName: string,\n metadata: ToolMetadata,\n success: boolean\n): string {\n const parts: string[] = [];\n\n parts.push(`Tool: ${toolName}`);\n\n if (metadata.filePath) {\n parts.push(`File: ${metadata.filePath}`);\n }\n if (metadata.command) {\n parts.push(`Command: ${metadata.command}`);\n }\n if (metadata.pattern) {\n parts.push(`Pattern: ${metadata.pattern}`);\n }\n if (metadata.url) {\n // Only include domain for privacy\n try {\n const url = new URL(metadata.url);\n parts.push(`URL: ${url.hostname}`);\n } catch {\n // Invalid URL, skip\n }\n }\n\n parts.push(`Result: ${success ? 'Success' : 'Failed'}`);\n\n return parts.join('\\n');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface EmbeddingMaintenanceEvent {\n id: string;\n content: string;\n}\n\nexport interface EmbeddingMaintenanceEventStore {\n clearEmbeddingOutbox(): Promise<void>;\n getEventsPage(limit: number, offset: number): Promise<EmbeddingMaintenanceEvent[]>;\n enqueueForEmbedding(eventId: string, content: string): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorStore {\n count(): Promise<number>;\n clearAll(): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorWorker {\n isRunning(): boolean;\n stop(): void;\n start(): void;\n}\n\nexport interface EmbeddingMaintenanceFileSystem {\n existsSync(targetPath: string): boolean;\n readFileSync(targetPath: string, encoding: BufferEncoding): string;\n writeFileSync(targetPath: string, content: string): void;\n}\n\nexport interface EmbeddingModelMaintenanceOptions {\n autoMigrate?: boolean;\n}\n\nexport interface EmbeddingModelMaintenanceResult {\n changed: boolean;\n previousModel: string | null;\n currentModel: string;\n enqueued: number;\n reason?: string;\n}\n\nexport interface EmbeddingMaintenanceServiceOptions {\n storagePath: string;\n initialize: () => Promise<void>;\n getEmbeddingModelName: () => string;\n vectorStore: EmbeddingMaintenanceVectorStore;\n eventStore: EmbeddingMaintenanceEventStore;\n getVectorWorker: () => EmbeddingMaintenanceVectorWorker | null;\n fileSystem?: EmbeddingMaintenanceFileSystem;\n}\n\nexport interface EmbeddingMaintenanceService {\n getEmbeddingModelName(): string;\n ensureEmbeddingModelForImport(options?: EmbeddingModelMaintenanceOptions): Promise<EmbeddingModelMaintenanceResult>;\n}\n\nconst DEFAULT_PAGE_SIZE = 1000;\n\nconst defaultFileSystem: EmbeddingMaintenanceFileSystem = {\n existsSync: fs.existsSync,\n readFileSync: (targetPath, encoding) => fs.readFileSync(targetPath, encoding),\n writeFileSync: (targetPath, content) => fs.writeFileSync(targetPath, content)\n};\n\nclass DefaultEmbeddingMaintenanceService implements EmbeddingMaintenanceService {\n private readonly fileSystem: EmbeddingMaintenanceFileSystem;\n\n constructor(private readonly options: EmbeddingMaintenanceServiceOptions) {\n this.fileSystem = options.fileSystem ?? defaultFileSystem;\n }\n\n getEmbeddingModelName(): string {\n return this.options.getEmbeddingModelName();\n }\n\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n await this.options.initialize();\n\n const currentModel = this.getEmbeddingModelName();\n const metaPath = path.join(this.options.storagePath, 'embedding-meta.json');\n const previousModel = this.readPreviousModel(metaPath);\n const vectorCount = await this.options.vectorStore.count();\n const hasExistingVectors = vectorCount > 0;\n\n // First-time metadata write (no migration needed unless legacy vectors exist)\n if (!previousModel && !hasExistingVectors) {\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify({ model: currentModel, updatedAt: new Date().toISOString() }, null, 2)\n );\n return { changed: false, previousModel: null, currentModel, enqueued: 0, reason: 'initialized-meta' };\n }\n\n const modelChanged = previousModel !== currentModel;\n const legacyUnknownButVectorsExist = !previousModel && hasExistingVectors;\n\n if (!modelChanged && !legacyUnknownButVectorsExist) {\n return { changed: false, previousModel, currentModel, enqueued: 0 };\n }\n\n if (options?.autoMigrate === false) {\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued: 0,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n const worker = this.options.getVectorWorker();\n const wasRunning = worker?.isRunning() || false;\n if (wasRunning) worker?.stop();\n\n await this.options.vectorStore.clearAll();\n await this.options.eventStore.clearEmbeddingOutbox();\n\n const enqueued = await this.reenqueueAllEvents();\n\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify(\n {\n model: currentModel,\n previousModel,\n migratedAt: new Date().toISOString(),\n enqueued\n },\n null,\n 2\n )\n );\n\n if (wasRunning) worker?.start();\n\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n private readPreviousModel(metaPath: string): string | null {\n try {\n if (this.fileSystem.existsSync(metaPath)) {\n const parsed = JSON.parse(this.fileSystem.readFileSync(metaPath, 'utf-8')) as { model?: string };\n return parsed?.model || null;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n private async reenqueueAllEvents(): Promise<number> {\n let offset = 0;\n let enqueued = 0;\n\n while (true) {\n const page = await this.options.eventStore.getEventsPage(DEFAULT_PAGE_SIZE, offset);\n if (page.length === 0) break;\n\n for (const event of page) {\n await this.options.eventStore.enqueueForEmbedding(event.id, event.content);\n enqueued += 1;\n }\n\n offset += page.length;\n if (page.length < DEFAULT_PAGE_SIZE) break;\n }\n\n return enqueued;\n }\n}\n\nexport function createEmbeddingMaintenanceService(\n options: EmbeddingMaintenanceServiceOptions\n): EmbeddingMaintenanceService {\n return new DefaultEmbeddingMaintenanceService(options);\n}\n", "import { randomUUID } from 'crypto';\n\nimport type { EventStore } from '../../core/event-store.js';\nimport {\n createWorkingSetStore,\n type WorkingSetStore\n} from '../../core/working-set-store.js';\nimport {\n createConsolidatedStore,\n type ConsolidatedStore\n} from '../../core/consolidated-store.js';\nimport {\n createConsolidationWorker,\n type ConsolidationWorker\n} from '../../core/consolidation-worker.js';\nimport {\n createContinuityManager,\n type ContinuityManager\n} from '../../core/continuity-manager.js';\nimport type {\n ConsolidatedMemory,\n ContinuityScore,\n EndlessModeConfig,\n EndlessModeStatus,\n MemoryMode,\n WorkingSet\n} from '../../core/types.js';\n\nexport interface EndlessConfigStore {\n getEndlessConfig(key: string): Promise<unknown>;\n setEndlessConfig(key: string, value: unknown): Promise<void>;\n}\n\nexport interface WorkingSetStorePort {\n add(eventId: string, relevanceScore?: number): Promise<void>;\n get(): Promise<WorkingSet>;\n count(): Promise<number>;\n}\n\nexport interface ConsolidatedStorePort {\n search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]>;\n markAccessed(memoryId: string): Promise<void>;\n count(): Promise<number>;\n getLastConsolidationTime(): Promise<Date | null>;\n}\n\nexport interface ConsolidationWorkerPort {\n start(): void;\n stop(): void;\n recordActivity(): void;\n forceRun(): Promise<number>;\n}\n\nexport interface ContinuityManagerPort {\n createSnapshot(\n id: string,\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): unknown;\n calculateScore(snapshot: unknown): Promise<ContinuityScore>;\n}\n\nexport interface EndlessMemoryServicesFactories {\n createWorkingSetStore: (eventStore: EventStore, config: EndlessModeConfig) => WorkingSetStorePort;\n createConsolidatedStore: (eventStore: EventStore) => ConsolidatedStorePort;\n createConsolidationWorker: (\n workingSetStore: WorkingSetStorePort,\n consolidatedStore: ConsolidatedStorePort,\n config: EndlessModeConfig\n ) => ConsolidationWorkerPort;\n createContinuityManager: (eventStore: EventStore, config: EndlessModeConfig) => ContinuityManagerPort;\n randomUUID?: () => string;\n}\n\nexport interface EndlessMemoryServicesOptions {\n eventStore: EventStore;\n configStore: EndlessConfigStore;\n initialize: () => Promise<void>;\n factories?: EndlessMemoryServicesFactories;\n}\n\nexport interface EndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n initializeEndlessMode(): Promise<void>;\n getEndlessConfig(): Promise<EndlessModeConfig>;\n setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void>;\n setMode(mode: MemoryMode): Promise<void>;\n getMode(): MemoryMode;\n isEndlessModeActive(): boolean;\n addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void>;\n getWorkingSet(): Promise<WorkingSet | null>;\n searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]>;\n markMemoryAccessed(memoryId: string): Promise<void>;\n calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null>;\n recordActivity(): void;\n forceConsolidation(): Promise<number>;\n getEndlessModeStatus(): Promise<EndlessModeStatus>;\n formatEndlessContext(query: string): Promise<string>;\n shutdown(): void;\n}\n\nfunction getDefaultEndlessConfig(): EndlessModeConfig {\n return {\n enabled: true,\n workingSet: {\n maxEvents: 100,\n timeWindowHours: 24,\n minRelevanceScore: 0.5\n },\n consolidation: {\n triggerIntervalMs: 3600000,\n triggerEventCount: 100,\n triggerIdleMs: 1800000,\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n}\n\nconst defaultFactories: Required<EndlessMemoryServicesFactories> = {\n createWorkingSetStore: (eventStore, config) => createWorkingSetStore(eventStore, config) as WorkingSetStore,\n createConsolidatedStore: (eventStore) => createConsolidatedStore(eventStore) as ConsolidatedStore,\n createConsolidationWorker: (workingSetStore, consolidatedStore, config) => createConsolidationWorker(\n workingSetStore as WorkingSetStore,\n consolidatedStore as ConsolidatedStore,\n config\n ) as ConsolidationWorker,\n createContinuityManager: (eventStore, config) => createContinuityManager(eventStore, config) as ContinuityManager,\n randomUUID\n};\n\nclass DefaultEndlessMemoryServices implements EndlessMemoryServices {\n private readonly factories: Required<EndlessMemoryServicesFactories>;\n private workingSetStore: WorkingSetStorePort | null = null;\n private consolidatedStore: ConsolidatedStorePort | null = null;\n private consolidationWorker: ConsolidationWorkerPort | null = null;\n private continuityManager: ContinuityManagerPort | null = null;\n private mode: MemoryMode = 'session';\n\n constructor(private readonly options: EndlessMemoryServicesOptions) {\n this.factories = options.factories\n ? { ...options.factories, randomUUID: options.factories.randomUUID ?? randomUUID }\n : defaultFactories;\n }\n\n async initializeFromSavedMode(): Promise<void> {\n const savedMode = await this.options.configStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.mode = 'endless';\n await this.initializeEndlessMode();\n }\n }\n\n async initializeEndlessMode(): Promise<void> {\n if (this.consolidationWorker) return;\n\n const config = await this.getEndlessConfig();\n const workingSetStore = this.factories.createWorkingSetStore(this.options.eventStore, config);\n const consolidatedStore = this.factories.createConsolidatedStore(this.options.eventStore);\n const consolidationWorker = this.factories.createConsolidationWorker(\n workingSetStore,\n consolidatedStore,\n config\n );\n const continuityManager = this.factories.createContinuityManager(this.options.eventStore, config);\n\n try {\n consolidationWorker.start();\n } catch (error) {\n consolidationWorker.stop();\n throw error;\n }\n\n this.workingSetStore = workingSetStore;\n this.consolidatedStore = consolidatedStore;\n this.consolidationWorker = consolidationWorker;\n this.continuityManager = continuityManager;\n }\n\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.options.configStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || getDefaultEndlessConfig();\n }\n\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.options.configStore.setEndlessConfig('config', merged);\n }\n\n async setMode(mode: MemoryMode): Promise<void> {\n await this.options.initialize();\n if (mode === this.mode) return;\n\n this.mode = mode;\n await this.options.configStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n this.stopEndlessMode();\n }\n }\n\n getMode(): MemoryMode {\n return this.mode;\n }\n\n isEndlessModeActive(): boolean {\n return this.mode === 'endless';\n }\n\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n if (!this.workingSetStore) return;\n await this.workingSetStore.add(eventId, relevanceScore);\n }\n\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n async searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\n }\n\n async markMemoryAccessed(memoryId: string): Promise<void> {\n if (!this.consolidatedStore) return;\n await this.consolidatedStore.markAccessed(memoryId);\n }\n\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n if (!this.continuityManager) return null;\n const snapshot = this.continuityManager.createSnapshot(\n this.factories.randomUUID(),\n content,\n metadata\n );\n return this.continuityManager.calculateScore(snapshot);\n }\n\n recordActivity(): void {\n this.consolidationWorker?.recordActivity();\n }\n\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.options.initialize();\n\n let workingSetSize = 0;\n let continuityScore = 0.5;\n let consolidatedCount = 0;\n let lastConsolidation: Date | null = null;\n\n if (this.workingSetStore) {\n workingSetSize = await this.workingSetStore.count();\n const workingSet = await this.workingSetStore.get();\n continuityScore = workingSet.continuityScore;\n }\n\n if (this.consolidatedStore) {\n consolidatedCount = await this.consolidatedStore.count();\n lastConsolidation = await this.consolidatedStore.getLastConsolidationTime();\n }\n\n return {\n mode: this.mode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n async formatEndlessContext(query: string): Promise<string> {\n if (!this.isEndlessModeActive()) {\n return '';\n }\n\n const workingSet = await this.getWorkingSet();\n const consolidated = await this.searchConsolidated(query, { topK: 3 });\n const continuity = await this.calculateContinuity(query);\n\n const parts: string[] = [];\n\n if (continuity) {\n const statusEmoji = continuity.transitionType === 'seamless' ? '\uD83D\uDD17' :\n continuity.transitionType === 'topic_shift' ? '\u21AA\uFE0F' : '\uD83C\uDD95';\n parts.push(`${statusEmoji} Context: ${continuity.transitionType} (score: ${continuity.score.toFixed(2)})`);\n }\n\n if (workingSet && workingSet.recentEvents.length > 0) {\n parts.push('\\n## Recent Context (Working Set)');\n const recent = workingSet.recentEvents.slice(0, 5);\n for (const event of recent) {\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n const time = event.timestamp.toLocaleTimeString();\n parts.push(`- ${time} [${event.eventType}] ${preview}`);\n }\n }\n\n if (consolidated.length > 0) {\n parts.push('\\n## Related Knowledge (Consolidated)');\n for (const memory of consolidated) {\n parts.push(`- ${memory.topics.slice(0, 3).join(', ')}: ${memory.summary.slice(0, 100)}...`);\n }\n }\n\n return parts.join('\\n');\n }\n\n shutdown(): void {\n this.stopEndlessMode();\n }\n\n private stopEndlessMode(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.consolidationWorker = null;\n this.continuityManager = null;\n }\n}\n\nexport function createEndlessMemoryServices(options: EndlessMemoryServicesOptions): EndlessMemoryServices {\n return new DefaultEndlessMemoryServices(options);\n}\n", "/**\n * Working Set Store\n * Manages the active memory window for Endless Mode\n * Biomimetic: Simulates human working memory (7\u00B12 items, 15-30s duration)\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n MemoryEvent,\n EndlessModeConfig,\n WorkingSet,\n WorkingSetItem\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class WorkingSetStore {\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Add an event to the working set\n */\n async add(eventId: string, relevanceScore: number = 1.0, topics?: string[]): Promise<void> {\n const expiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO working_set (id, event_id, added_at, relevance_score, topics, expires_at)\n VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?, ?)`,\n [\n randomUUID(),\n eventId,\n relevanceScore,\n JSON.stringify(topics || []),\n expiresAt.toISOString()\n ]\n );\n\n // Enforce size limit\n await this.enforceLimit();\n }\n\n /**\n * Get the current working set\n */\n async get(): Promise<WorkingSet> {\n // Clean up expired items first\n await this.cleanup();\n\n // Get working set items with their events\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT ws.*, e.*\n FROM working_set ws\n JOIN events e ON ws.event_id = e.id\n ORDER BY ws.relevance_score DESC, ws.added_at DESC\n LIMIT ?`,\n [this.config.workingSet.maxEvents]\n );\n\n const events: MemoryEvent[] = rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n }));\n\n return {\n recentEvents: events,\n lastActivity: events.length > 0 ? events[0].timestamp : new Date(),\n continuityScore: await this.calculateContinuityScore()\n };\n }\n\n /**\n * Get working set items (metadata only)\n */\n async getItems(): Promise<WorkingSetItem[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM working_set ORDER BY relevance_score DESC, added_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n addedAt: toDate(row.added_at),\n relevanceScore: row.relevance_score as number,\n topics: row.topics ? JSON.parse(row.topics as string) : undefined,\n expiresAt: toDate(row.expires_at)\n }));\n }\n\n /**\n * Update relevance score for an event\n */\n async updateRelevance(eventId: string, score: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE working_set SET relevance_score = ? WHERE event_id = ?`,\n [score, eventId]\n );\n }\n\n /**\n * Prune specific events from working set (after consolidation)\n */\n async prune(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n const placeholders = eventIds.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE event_id IN (${placeholders})`,\n eventIds\n );\n }\n\n /**\n * Get the count of items in working set\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Clear the entire working set\n */\n async clear(): Promise<void> {\n await dbRun(this.db, `DELETE FROM working_set`);\n }\n\n /**\n * Check if an event is in the working set\n */\n async contains(eventId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set WHERE event_id = ?`,\n [eventId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Refresh expiration for an event (rehears al - keep relevant items longer)\n */\n async refresh(eventId: string): Promise<void> {\n const newExpiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `UPDATE working_set SET expires_at = ? WHERE event_id = ?`,\n [newExpiresAt.toISOString(), eventId]\n );\n }\n\n /**\n * Clean up expired items\n */\n private async cleanup(): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE expires_at < datetime('now')`\n );\n }\n\n /**\n * Enforce the maximum size limit\n * Removes lowest relevance items when over limit\n */\n private async enforceLimit(): Promise<void> {\n const maxEvents = this.config.workingSet.maxEvents;\n\n // Get IDs to keep (highest relevance, most recent)\n const keepIds = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM working_set\n ORDER BY relevance_score DESC, added_at DESC\n LIMIT ?`,\n [maxEvents]\n );\n\n if (keepIds.length === 0) return;\n\n const keepIdList = keepIds.map(r => r.id);\n const placeholders = keepIdList.map(() => '?').join(',');\n\n // Delete everything not in the keep list\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE id NOT IN (${placeholders})`,\n keepIdList\n );\n }\n\n /**\n * Calculate continuity score based on recent context transitions\n */\n private async calculateContinuityScore(): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-1 hour')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get topics from current working set for context matching\n */\n async getActiveTopics(): Promise<string[]> {\n const rows = await dbAll<{ topics: string }>(\n this.db,\n `SELECT topics FROM working_set WHERE topics IS NOT NULL`\n );\n\n const allTopics = new Set<string>();\n for (const row of rows) {\n const topics = JSON.parse(row.topics) as string[];\n topics.forEach(t => allTopics.add(t));\n }\n\n return Array.from(allTopics);\n }\n}\n\n/**\n * Create a Working Set Store instance\n */\nexport function createWorkingSetStore(\n eventStore: EventStore,\n config: EndlessModeConfig\n): WorkingSetStore {\n return new WorkingSetStore(eventStore, config);\n}\n", "/**\n * SQLite Database Wrapper\n * Provides Promise-based interface over better-sqlite3 synchronous API\n */\n\nimport BetterSqlite3 from 'better-sqlite3';\n\nexport type Database = BetterSqlite3.Database;\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\nexport interface DatabaseOptions {\n readOnly?: boolean;\n}\n\n/**\n * Creates a new SQLite database connection\n */\nexport function createDatabase(dbPath: string, options?: DatabaseOptions): Database {\n return new BetterSqlite3(dbPath, { readonly: options?.readOnly });\n}\n\n/**\n * Executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n db.prepare(sql).run(...(params as never[]));\n return Promise.resolve();\n}\n\n/**\n * Executes a query and returns all rows\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return Promise.resolve(db.prepare(sql).all(...(params as never[])) as T[]);\n}\n\n/**\n * Closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n db.close();\n return Promise.resolve();\n}\n\n/**\n * Executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n db.exec(sql);\n return Promise.resolve();\n}\n", "/**\n * Consolidated Store\n * Manages long-term integrated memories for Endless Mode\n * Biomimetic: Simulates memory consolidation that occurs during sleep\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n ConsolidatedMemory,\n ConsolidatedMemoryInput,\n ConsolidationRule,\n ConsolidationRuleInput\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ConsolidatedStore {\n constructor(private eventStore: EventStore) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Create a new consolidated memory\n */\n async create(input: ConsolidatedMemoryInput): Promise<string> {\n const memoryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_memories\n (memory_id, summary, topics, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n memoryId,\n input.summary,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return memoryId;\n }\n\n /**\n * Get a consolidated memory by ID\n */\n async get(memoryId: string): Promise<ConsolidatedMemory | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToMemory(rows[0]);\n }\n\n /**\n * Search consolidated memories by query (simple text search)\n */\n async search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE summary LIKE ?\n ORDER BY confidence DESC\n LIMIT ?`,\n [`%${query}%`, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(topics: string[], options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n // Build topic filter\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE ${topicConditions}\n ORDER BY confidence DESC\n LIMIT ?`,\n [...topicParams, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get all consolidated memories ordered by confidence\n */\n async getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 100;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n ORDER BY confidence DESC, created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get recently created memories\n */\n async getRecent(options?: { limit?: number; hours?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 10;\n const hours = options?.hours || 24;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE created_at > datetime('now', '-${hours} hours')\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Mark a memory as accessed (tracks usage for importance scoring)\n */\n async markAccessed(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET accessed_at = CURRENT_TIMESTAMP,\n access_count = access_count + 1\n WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Update confidence score for a memory\n */\n async updateConfidence(memoryId: string, confidence: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET confidence = ?\n WHERE memory_id = ?`,\n [confidence, memoryId]\n );\n }\n\n /**\n * Delete a consolidated memory\n */\n async delete(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Create a long-term rule promoted from stable summaries\n */\n async createRule(input: ConsolidationRuleInput): Promise<string> {\n const ruleId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_rules\n (rule_id, rule, topics, source_memory_ids, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n ruleId,\n input.rule,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceMemoryIds),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return ruleId;\n }\n\n async getRules(options?: { limit?: number }): Promise<ConsolidationRule[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_rules ORDER BY confidence DESC, created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n ruleId: row.rule_id as string,\n rule: row.rule as string,\n topics: JSON.parse((row.topics as string) || '[]'),\n sourceMemoryIds: JSON.parse((row.source_memory_ids as string) || '[]'),\n sourceEvents: JSON.parse((row.source_events as string) || '[]'),\n confidence: Number(row.confidence ?? 0.5),\n createdAt: toDate(row.created_at) || new Date()\n }));\n }\n\n async countRules(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules`\n );\n return result[0]?.count || 0;\n }\n\n async hasRuleForSourceMemory(memoryId: string): Promise<boolean> {\n const rows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules WHERE source_memory_ids LIKE ?`,\n [`%\"${memoryId}\"%`]\n );\n return (rows[0]?.count || 0) > 0;\n }\n\n /**\n * Get count of consolidated memories\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get most accessed memories (for importance scoring)\n */\n async getMostAccessed(limit: number = 10): Promise<ConsolidatedMemory[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE access_count > 0\n ORDER BY access_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get statistics about consolidated memories\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topicCounts: Record<string, number>;\n recentCount: number;\n }> {\n const total = await this.count();\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM consolidated_memories`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const recentResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE created_at > datetime('now', '-24 hours')`\n );\n const recentCount = recentResult[0]?.count || 0;\n\n // Get topic counts\n const allMemories = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const memory of allMemories) {\n for (const topic of memory.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n return {\n total,\n averageConfidence,\n topicCounts,\n recentCount\n };\n }\n\n /**\n * Check if source events are already consolidated\n */\n async isAlreadyConsolidated(eventIds: string[]): Promise<boolean> {\n for (const eventId of eventIds) {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE source_events LIKE ?`,\n [`%\"${eventId}\"%`]\n );\n if ((result[0]?.count || 0) > 0) return true;\n }\n return false;\n }\n\n /**\n * Get the last consolidation time\n */\n async getLastConsolidationTime(): Promise<Date | null> {\n const result = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM consolidated_memories\n ORDER BY created_at DESC\n LIMIT 1`\n );\n\n if (result.length === 0) return null;\n return new Date(result[0].created_at);\n }\n\n /**\n * Convert database row to ConsolidatedMemory\n */\n private rowToMemory(row: Record<string, unknown>): ConsolidatedMemory {\n return {\n memoryId: row.memory_id as string,\n summary: row.summary as string,\n topics: JSON.parse(row.topics as string || '[]'),\n sourceEvents: JSON.parse(row.source_events as string || '[]'),\n confidence: row.confidence as number,\n createdAt: toDate(row.created_at),\n accessedAt: row.accessed_at ? toDate(row.accessed_at) : undefined,\n accessCount: row.access_count as number || 0\n };\n }\n}\n\n/**\n * Create a Consolidated Store instance\n */\nexport function createConsolidatedStore(eventStore: EventStore): ConsolidatedStore {\n return new ConsolidatedStore(eventStore);\n}\n", "/**\n * Consolidation Worker\n * Periodically consolidates working set into long-term memory\n * Biomimetic: Simulates memory consolidation during sleep/idle periods\n */\n\nimport type {\n EndlessModeConfig,\n MemoryEvent,\n EventGroup,\n WorkingSet,\n ConsolidationCostQualityReport\n} from './types.js';\nimport { WorkingSetStore } from './working-set-store.js';\nimport { ConsolidatedStore } from './consolidated-store.js';\n\nexport class ConsolidationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastActivity: Date = new Date();\n\n constructor(\n private workingSetStore: WorkingSetStore,\n private consolidatedStore: ConsolidatedStore,\n private config: EndlessModeConfig\n ) {}\n\n /**\n * Start the consolidation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the consolidation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Record activity (resets idle timer)\n */\n recordActivity(): void {\n this.lastActivity = new Date();\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a consolidation run (manual trigger)\n */\n async forceRun(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n /**\n * Force a consolidation run and return metrics report\n */\n async forceRunWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n return this.consolidateWithReport();\n }\n\n /**\n * Schedule the next consolidation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.consolidation.triggerIntervalMs\n );\n }\n\n /**\n * Run consolidation check\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.checkAndConsolidate();\n } catch (error) {\n console.error('Consolidation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Check conditions and consolidate if needed\n */\n private async checkAndConsolidate(): Promise<void> {\n const workingSet = await this.workingSetStore.get();\n\n if (!this.shouldConsolidate(workingSet)) {\n return;\n }\n\n await this.consolidate();\n }\n\n /**\n * Perform consolidation\n */\n private async consolidate(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n private async consolidateWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n const workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return {\n consolidatedCount: 0,\n promotedRuleCount: 0,\n report: this.buildCostQualityReport(workingSet.recentEvents, [], 0)\n };\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\n const createdMemoryIds: string[] = [];\n\n for (const group of groups) {\n // Require minimum 3 events per group\n if (group.events.length < 3) continue;\n\n // Check if already consolidated\n const eventIds = group.events.map(e => e.id);\n const alreadyConsolidated = await this.consolidatedStore.isAlreadyConsolidated(eventIds);\n if (alreadyConsolidated) continue;\n\n // Generate summary\n const summary = await this.summarize(group);\n\n // Create consolidated memory\n const memoryId = await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n createdMemoryIds.push(memoryId);\n consolidatedCount++;\n }\n\n const promotedRuleCount = await this.promoteStableSummariesToRules(createdMemoryIds);\n\n // Prune consolidated events from working set\n if (consolidatedCount > 0) {\n const consolidatedEventIds = groups\n .filter(g => g.events.length >= 3)\n .flatMap(g => g.events.map(e => e.id));\n\n // Only prune old events (keep recent for context)\n const oldEventIds = consolidatedEventIds.filter(id => {\n const event = workingSet.recentEvents.find(e => e.id === id);\n if (!event) return false;\n const ageHours = (Date.now() - event.timestamp.getTime()) / (1000 * 60 * 60);\n return ageHours > this.config.workingSet.timeWindowHours / 2;\n });\n\n if (oldEventIds.length > 0) {\n await this.workingSetStore.prune(oldEventIds);\n }\n }\n\n const report = this.buildCostQualityReport(workingSet.recentEvents, groups, consolidatedCount);\n return { consolidatedCount, promotedRuleCount, report };\n }\n\n private async promoteStableSummariesToRules(memoryIds: string[]): Promise<number> {\n let promoted = 0;\n\n for (const memoryId of memoryIds) {\n const memory = await this.consolidatedStore.get(memoryId);\n if (!memory) continue;\n if (memory.confidence < 0.55) continue;\n if (memory.sourceEvents.length < 4) continue;\n\n const exists = await this.consolidatedStore.hasRuleForSourceMemory(memoryId);\n if (exists) continue;\n\n const rule = this.buildRuleFromSummary(memory.summary, memory.topics);\n if (!rule) continue;\n\n await this.consolidatedStore.createRule({\n rule,\n topics: memory.topics,\n sourceMemoryIds: [memory.memoryId],\n sourceEvents: memory.sourceEvents,\n confidence: Math.min(1, memory.confidence + 0.08)\n });\n promoted++;\n }\n\n return promoted;\n }\n\n private buildRuleFromSummary(summary: string, topics: string[]): string | null {\n const lines = summary\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .filter((l) => !l.toLowerCase().startsWith('topics:'));\n\n const bullet = lines.find((l) => l.startsWith('- '))?.replace(/^-\\s*/, '');\n const seed = bullet || lines[0];\n if (!seed || seed.length < 8) return null;\n\n const topicPrefix = topics.length > 0 ? `[${topics.slice(0, 2).join(', ')}] ` : '';\n return `${topicPrefix}${seed}`;\n }\n\n private buildCostQualityReport(\n events: MemoryEvent[],\n groups: EventGroup[],\n consolidatedCount: number\n ): ConsolidationCostQualityReport {\n const beforeTokenEstimate = events.reduce((acc, e) => acc + this.estimateTokens(e.content), 0);\n\n const afterSummaries = groups\n .filter((g) => g.events.length >= 3)\n .slice(0, Math.max(consolidatedCount, 1));\n\n const afterTokenEstimate = afterSummaries.length > 0\n ? afterSummaries.reduce((acc, g) => acc + this.estimateTokens(this.ruleBasedSummary(g)), 0)\n : beforeTokenEstimate;\n\n const reductionRatio = beforeTokenEstimate > 0\n ? Math.max(0, (beforeTokenEstimate - afterTokenEstimate) / beforeTokenEstimate)\n : 0;\n\n const qualityGuardPassed = consolidatedCount === 0\n ? true\n : groups.filter((g) => g.events.length >= 3).every((g) => this.calculateConfidence(g) >= 0.55);\n\n return {\n beforeTokenEstimate,\n afterTokenEstimate,\n reductionRatio,\n qualityGuardPassed,\n details: `groups=${groups.length}, consolidated=${consolidatedCount}`\n };\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil((text || '').length / 4);\n }\n\n /**\n * Check if consolidation should run\n */\n private shouldConsolidate(workingSet: WorkingSet): boolean {\n // Check event count trigger\n if (workingSet.recentEvents.length >= this.config.consolidation.triggerEventCount) {\n return true;\n }\n\n // Check idle time trigger\n const idleTime = Date.now() - this.lastActivity.getTime();\n if (idleTime >= this.config.consolidation.triggerIdleMs) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Group events by topic using simple keyword extraction\n */\n private groupByTopic(events: MemoryEvent[]): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n\n for (const event of events) {\n const topics = this.extractTopics(event.content);\n\n for (const topic of topics) {\n if (!groups.has(topic)) {\n groups.set(topic, { topics: [topic], events: [] });\n }\n const group = groups.get(topic)!;\n if (!group.events.find(e => e.id === event.id)) {\n group.events.push(event);\n }\n }\n }\n\n // Merge groups with overlapping events\n const mergedGroups = this.mergeOverlappingGroups(Array.from(groups.values()));\n\n return mergedGroups;\n }\n\n /**\n * Extract topics from content using simple keyword extraction\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n\n // Extract code-related keywords\n const codePatterns = [\n /\\b(function|class|interface|type|const|let|var)\\s+(\\w+)/gi,\n /\\b(import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]/gi,\n /\\bfile[:\\s]+([^\\s,]+)/gi\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const keyword = match[2] || match[1];\n if (keyword && keyword.length > 2) {\n topics.push(keyword.toLowerCase());\n }\n }\n }\n\n // Extract common programming terms\n const commonTerms = [\n 'bug', 'fix', 'error', 'issue', 'feature',\n 'test', 'refactor', 'implement', 'add', 'remove',\n 'update', 'change', 'modify', 'create', 'delete'\n ];\n\n const contentLower = content.toLowerCase();\n for (const term of commonTerms) {\n if (contentLower.includes(term)) {\n topics.push(term);\n }\n }\n\n return [...new Set(topics)].slice(0, 5); // Limit to 5 topics\n }\n\n /**\n * Merge groups that have significant event overlap\n */\n private mergeOverlappingGroups(groups: EventGroup[]): EventGroup[] {\n const merged: EventGroup[] = [];\n\n for (const group of groups) {\n let foundMerge = false;\n\n for (const existing of merged) {\n const overlap = group.events.filter(e =>\n existing.events.some(ex => ex.id === e.id)\n );\n\n // If > 50% overlap, merge\n if (overlap.length > group.events.length / 2) {\n existing.topics = [...new Set([...existing.topics, ...group.topics])];\n for (const event of group.events) {\n if (!existing.events.find(e => e.id === event.id)) {\n existing.events.push(event);\n }\n }\n foundMerge = true;\n break;\n }\n }\n\n if (!foundMerge) {\n merged.push(group);\n }\n }\n\n return merged;\n }\n\n /**\n * Generate summary for a group of events\n * Rule-based extraction (no LLM by default)\n */\n private async summarize(group: EventGroup): Promise<string> {\n if (this.config.consolidation.useLLMSummarization) {\n // Future: LLM-based summarization\n return this.ruleBasedSummary(group);\n }\n\n return this.ruleBasedSummary(group);\n }\n\n /**\n * Rule-based summary generation\n */\n private ruleBasedSummary(group: EventGroup): string {\n const keyPoints: string[] = [];\n\n for (const event of group.events.slice(0, 10)) {\n const keyPoint = this.extractKeyPoint(event.content);\n if (keyPoint) {\n keyPoints.push(keyPoint);\n }\n }\n\n const topicsStr = group.topics.slice(0, 3).join(', ');\n const summary = [\n `Topics: ${topicsStr}`,\n '',\n 'Key points:',\n ...keyPoints.map(kp => `- ${kp}`)\n ].join('\\n');\n\n return summary;\n }\n\n /**\n * Extract key point from content\n */\n private extractKeyPoint(content: string): string | null {\n // Get first meaningful sentence\n const sentences = content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10);\n if (sentences.length === 0) return null;\n\n const firstSentence = sentences[0].trim();\n\n // Truncate if too long\n if (firstSentence.length > 100) {\n return firstSentence.slice(0, 100) + '...';\n }\n\n return firstSentence;\n }\n\n /**\n * Calculate confidence score for a group\n */\n private calculateConfidence(group: EventGroup): number {\n // Factor 1: Event count (more events = higher confidence)\n const eventScore = Math.min(group.events.length / 10, 1);\n\n // Factor 2: Time proximity (events closer together = higher confidence)\n const timeScore = this.calculateTimeProximity(group.events);\n\n // Factor 3: Topic consistency (fewer topics per event = higher confidence)\n const topicScore = Math.min(3 / group.topics.length, 1);\n\n return (eventScore * 0.4 + timeScore * 0.4 + topicScore * 0.2);\n }\n\n /**\n * Calculate time proximity score\n */\n private calculateTimeProximity(events: MemoryEvent[]): number {\n if (events.length < 2) return 1;\n\n const timestamps = events.map(e => e.timestamp.getTime()).sort((a, b) => a - b);\n const timeSpan = timestamps[timestamps.length - 1] - timestamps[0];\n\n // Score based on average time between events\n const avgGap = timeSpan / (events.length - 1);\n const hourInMs = 60 * 60 * 1000;\n\n // Within 1 hour average = score 1, 24 hours = score 0.5, etc.\n return Math.max(0, 1 - (avgGap / (24 * hourInMs)));\n }\n}\n\n/**\n * Create a Consolidation Worker instance\n */\nexport function createConsolidationWorker(\n workingSetStore: WorkingSetStore,\n consolidatedStore: ConsolidatedStore,\n config: EndlessModeConfig\n): ConsolidationWorker {\n return new ConsolidationWorker(workingSetStore, consolidatedStore, config);\n}\n", "/**\n * Continuity Manager\n * Tracks and calculates context continuity between interactions\n * Biomimetic: Simulates context-dependent memory retrieval\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n EndlessModeConfig,\n ContextSnapshot,\n ContinuityScore,\n TransitionType,\n ContinuityLog\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ContinuityManager {\n private lastContext: ContextSnapshot | null = null;\n\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Calculate continuity score between current and previous context\n */\n async calculateScore(\n currentContext: ContextSnapshot,\n previousContext?: ContextSnapshot\n ): Promise<ContinuityScore> {\n const prev = previousContext || this.lastContext;\n\n if (!prev) {\n // No previous context - this is a fresh start\n this.lastContext = currentContext;\n return { score: 0.5, transitionType: 'break' };\n }\n\n let score = 0;\n\n // Topic continuity (30%)\n const topicOverlap = this.calculateOverlap(\n currentContext.topics,\n prev.topics\n );\n score += topicOverlap * 0.3;\n\n // File continuity (20%)\n const fileOverlap = this.calculateOverlap(\n currentContext.files,\n prev.files\n );\n score += fileOverlap * 0.2;\n\n // Time proximity (30%)\n const timeDiff = currentContext.timestamp - prev.timestamp;\n const decayHours = this.config.continuity.topicDecayHours;\n const timeScore = Math.exp(-timeDiff / (decayHours * 3600000));\n score += timeScore * 0.3;\n\n // Entity continuity (20%)\n const entityOverlap = this.calculateOverlap(\n currentContext.entities,\n prev.entities\n );\n score += entityOverlap * 0.2;\n\n // Determine transition type\n const transitionType = this.determineTransitionType(score);\n\n // Log the transition\n await this.logTransition(currentContext, prev, score, transitionType);\n\n // Update last context\n this.lastContext = currentContext;\n\n return { score, transitionType };\n }\n\n /**\n * Create a context snapshot from current state\n */\n createSnapshot(\n id: string,\n content: string,\n metadata?: {\n files?: string[];\n entities?: string[];\n }\n ): ContextSnapshot {\n return {\n id,\n timestamp: Date.now(),\n topics: this.extractTopics(content),\n files: metadata?.files || this.extractFiles(content),\n entities: metadata?.entities || this.extractEntities(content)\n };\n }\n\n /**\n * Get recent continuity logs\n */\n async getRecentLogs(limit: number = 10): Promise<ContinuityLog[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM continuity_log\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(row => ({\n logId: row.log_id as string,\n fromContextId: row.from_context_id as string | undefined,\n toContextId: row.to_context_id as string | undefined,\n continuityScore: row.continuity_score as number,\n transitionType: row.transition_type as TransitionType,\n createdAt: toDate(row.created_at)\n }));\n }\n\n /**\n * Get average continuity score over time period\n */\n async getAverageScore(hours: number = 1): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get transition type distribution\n */\n async getTransitionStats(hours: number = 24): Promise<Record<TransitionType, number>> {\n const rows = await dbAll<{ transition_type: string; count: number }>(\n this.db,\n `SELECT transition_type, COUNT(*) as count\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')\n GROUP BY transition_type`\n );\n\n const stats: Record<TransitionType, number> = {\n seamless: 0,\n topic_shift: 0,\n break: 0\n };\n\n for (const row of rows) {\n stats[row.transition_type as TransitionType] = row.count;\n }\n\n return stats;\n }\n\n /**\n * Clear old continuity logs\n */\n async cleanup(olderThanDays: number = 7): Promise<number> {\n const result = await dbAll<{ changes: number }>(\n this.db,\n `DELETE FROM continuity_log\n WHERE created_at < datetime('now', '-${olderThanDays} days')\n RETURNING COUNT(*) as changes`\n );\n\n return result[0]?.changes || 0;\n }\n\n /**\n * Calculate overlap between two arrays\n */\n private calculateOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n\n const setA = new Set(a.map(s => s.toLowerCase()));\n const setB = new Set(b.map(s => s.toLowerCase()));\n\n const intersection = [...setA].filter(x => setB.has(x));\n const union = new Set([...setA, ...setB]);\n\n return intersection.length / union.size; // Jaccard similarity\n }\n\n /**\n * Determine transition type based on score\n */\n private determineTransitionType(score: number): TransitionType {\n if (score >= this.config.continuity.minScoreForSeamless) {\n return 'seamless';\n } else if (score >= 0.4) {\n return 'topic_shift';\n } else {\n return 'break';\n }\n }\n\n /**\n * Log a context transition\n */\n private async logTransition(\n current: ContextSnapshot,\n previous: ContextSnapshot,\n score: number,\n type: TransitionType\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO continuity_log\n (log_id, from_context_id, to_context_id, continuity_score, transition_type, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [randomUUID(), previous.id, current.id, score, type]\n );\n }\n\n /**\n * Extract topics from content\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n const contentLower = content.toLowerCase();\n\n // Programming language keywords\n const langPatterns = [\n { pattern: /typescript|\\.ts\\b/i, topic: 'typescript' },\n { pattern: /javascript|\\.js\\b/i, topic: 'javascript' },\n { pattern: /python|\\.py\\b/i, topic: 'python' },\n { pattern: /rust|\\.rs\\b/i, topic: 'rust' },\n { pattern: /go\\b|golang/i, topic: 'go' }\n ];\n\n for (const { pattern, topic } of langPatterns) {\n if (pattern.test(content)) {\n topics.push(topic);\n }\n }\n\n // Common development topics\n const devTopics = [\n 'api', 'database', 'test', 'bug', 'feature', 'refactor',\n 'component', 'function', 'class', 'module', 'hook',\n 'deploy', 'build', 'config', 'docker', 'git'\n ];\n\n for (const topic of devTopics) {\n if (contentLower.includes(topic)) {\n topics.push(topic);\n }\n }\n\n return [...new Set(topics)].slice(0, 10);\n }\n\n /**\n * Extract file paths from content\n */\n private extractFiles(content: string): string[] {\n const filePatterns = [\n /(?:^|\\s)([a-zA-Z0-9_\\-./]+\\.[a-zA-Z0-9]+)(?:\\s|$|:)/gm,\n /['\"](\\.?\\/[^'\"]+\\.[a-zA-Z0-9]+)['\"]/g,\n /file[:\\s]+([^\\s,]+)/gi\n ];\n\n const files = new Set<string>();\n\n for (const pattern of filePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const file = match[1];\n if (file && file.length > 3 && file.length < 100) {\n // Filter out common non-file patterns\n if (!file.match(/^(https?:|mailto:|ftp:)/i)) {\n files.add(file);\n }\n }\n }\n }\n\n return Array.from(files).slice(0, 10);\n }\n\n /**\n * Extract entity names from content (functions, classes, variables)\n */\n private extractEntities(content: string): string[] {\n const entities = new Set<string>();\n\n const entityPatterns = [\n /\\b(function|const|let|var|class|interface|type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/g,\n /\\b([A-Z][a-zA-Z0-9_]*(?:Component|Service|Store|Manager|Handler|Factory|Provider))\\b/g,\n /\\b(use[A-Z][a-zA-Z0-9_]*)\\b/g // React hooks\n ];\n\n for (const pattern of entityPatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const entity = match[2] || match[1];\n if (entity && entity.length > 2) {\n entities.add(entity);\n }\n }\n }\n\n return Array.from(entities).slice(0, 20);\n }\n\n /**\n * Reset the last context (for testing or manual reset)\n */\n resetLastContext(): void {\n this.lastContext = null;\n }\n\n /**\n * Get the last context snapshot\n */\n getLastContext(): ContextSnapshot | null {\n return this.lastContext;\n }\n}\n\n/**\n * Create a Continuity Manager instance\n */\nexport function createContinuityManager(\n eventStore: EventStore,\n config: EndlessModeConfig\n): ContinuityManager {\n return new ContinuityManager(eventStore, config);\n}\n", "/**\n * Memory Engine Services Bundle\n *\n * Owns construction and wiring for storage-backed engine services so\n * MemoryService can stay focused on public facade/lifecycle behavior.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { Embedder, getDefaultEmbedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport { createGraduationPipeline, type GraduationPipeline } from '../graduation.js';\nimport { getDefaultMatcher, type Matcher } from '../matcher.js';\nimport { MarkdownMirror } from '../md-mirror.js';\nimport type { Retriever } from '../retriever.js';\nimport { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload } from '../types.js';\nimport { VectorStore } from '../vector-store.js';\nimport { MemoryIngestService } from './memory-ingest-service.js';\nimport { MemoryQueryService } from './memory-query-service.js';\nimport {\n createRetrievalServices,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore,\n type RetrievalEventStore,\n type RetrievalOrchestrator,\n type RetrievalServices,\n type RetrievalServicesDeps\n} from './retrieval-services.js';\n\nexport interface MemoryEngineServicesOptions {\n storagePath: string;\n readOnly: boolean;\n embeddingModel?: string;\n cwd?: string;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n hasSharedStore: () => boolean;\n sharedStore?: RetrievalDisclosureSharedStore;\n createToolObservationEmbedding: (payload: ToolObservationPayload) => string;\n factories?: MemoryEngineServicesFactories;\n}\n\nexport interface MemoryEngineServicesFactories {\n createSQLiteEventStore?: (\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n ) => SQLiteEventStore;\n createVectorStore?: (vectorsPath: string) => VectorStore;\n createEmbedder?: (model: string) => Embedder;\n getDefaultEmbedder?: () => Embedder;\n getDefaultMatcher?: () => Matcher;\n createMarkdownMirror?: (cwd: string) => MarkdownMirror;\n createGraduationPipeline?: (eventStore: EventStore) => GraduationPipeline;\n createRetrievalServices?: (deps: RetrievalServicesDeps) => RetrievalServices;\n}\n\nexport interface MemoryEngineServices {\n storagePath: string;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n graduation: GraduationPipeline;\n mdMirror: MarkdownMirror;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryEngineServices(options: MemoryEngineServicesOptions): MemoryEngineServices {\n const factories = options.factories ?? {};\n const storagePath = options.storagePath;\n\n if (!options.readOnly && !fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const sqliteStore = (factories.createSQLiteEventStore ?? defaultCreateSQLiteEventStore)(\n path.join(storagePath, 'events.sqlite'),\n {\n readonly: options.readOnly,\n markdownMirrorRoot: storagePath\n }\n );\n const vectorStore = (factories.createVectorStore ?? defaultCreateVectorStore)(\n path.join(storagePath, 'vectors')\n );\n const embeddingModel = options.embeddingModel || process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n const embedder = embeddingModel\n ? (factories.createEmbedder ?? defaultCreateEmbedder)(embeddingModel)\n : (factories.getDefaultEmbedder ?? getDefaultEmbedder)();\n const matcher = (factories.getDefaultMatcher ?? getDefaultMatcher)();\n const mdMirror = (factories.createMarkdownMirror ?? defaultCreateMarkdownMirror)(\n options.cwd ?? process.cwd()\n );\n const graduation = (factories.createGraduationPipeline ?? defaultCreateGraduationPipeline)(\n sqliteStore as unknown as EventStore\n );\n\n const retrievalServices = (factories.createRetrievalServices ?? createRetrievalServices)({\n initialize: options.initialize,\n eventStore: sqliteStore as unknown as RetrievalEventStore,\n vectorStore,\n embedder,\n matcher,\n getProjectHash: options.getProjectHash,\n hasSharedStore: options.hasSharedStore,\n sharedStore: options.sharedStore\n });\n\n const ingestService = new MemoryIngestService({\n initialize: options.initialize,\n eventStore: sqliteStore,\n markdownMirror: mdMirror,\n createToolEmbedding: options.createToolObservationEmbedding,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath\n });\n const queryService = new MemoryQueryService(\n () => sqliteStore.initialize(),\n sqliteStore,\n { vectorStore, graduation }\n );\n\n return {\n storagePath,\n sqliteStore,\n vectorStore,\n embedder,\n matcher,\n retriever: retrievalServices.retriever,\n retrievalOrchestrator: retrievalServices.retrievalOrchestrator,\n retrievalDisclosureService: retrievalServices.retrievalDisclosureService,\n retrievalAnalyticsService: retrievalServices.retrievalAnalyticsService,\n graduation,\n mdMirror,\n ingestService,\n queryService\n };\n}\n\nfunction defaultCreateSQLiteEventStore(\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n): SQLiteEventStore {\n return new SQLiteEventStore(dbPath, options);\n}\n\nfunction defaultCreateVectorStore(vectorsPath: string): VectorStore {\n return new VectorStore(vectorsPath);\n}\n\nfunction defaultCreateEmbedder(model: string): Embedder {\n return new Embedder(model);\n}\n\nfunction defaultCreateMarkdownMirror(cwd: string): MarkdownMirror {\n return new MarkdownMirror(cwd);\n}\n\nfunction defaultCreateGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return createGraduationPipeline(eventStore);\n}\n", "/**\n * Local Embedding Generator using @huggingface/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\ntype FeatureExtractionPipelineFactory = (\n task: 'feature-extraction',\n model: string\n) => Promise<NonNullable<Embedder['pipeline']>>;\n\nexport const DEFAULT_EMBEDDING_MODEL = 'Xenova/multilingual-e5-small';\nexport const DEFAULT_EMBEDDING_FALLBACK_MODEL = 'intfloat/multilingual-e5-small';\n\nexport class Embedder {\n private pipeline: ((input: string, options?: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n private readonly modelName: string;\n private activeModelName: string;\n private initialized = false;\n\n constructor(modelName: string = DEFAULT_EMBEDDING_MODEL) {\n this.modelName = modelName;\n this.activeModelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const pipeline = await withSuppressedKnownTransformersWarnings(async () => {\n try {\n return await loadTransformersPipeline();\n } catch (error) {\n if (isMissingTransformersDependencyError(error)) {\n throw createEmbeddingBackendUnavailableError(error);\n }\n throw error;\n }\n });\n\n try {\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', this.modelName));\n this.activeModelName = this.modelName;\n this.initialized = true;\n return;\n } catch (primaryError) {\n const fallbackModel = process.env.CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL || DEFAULT_EMBEDDING_FALLBACK_MODEL;\n if (fallbackModel === this.modelName) {\n throw primaryError;\n }\n\n console.warn(`[Embedder] Primary model failed (${this.modelName}). Falling back to ${fallbackModel}`);\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', fallbackModel));\n this.activeModelName = fallbackModel;\n this.initialized = true;\n }\n }\n\n // ~4 chars per token; 512 tokens * 4 = 2048, use 2000 to be safe\n private static readonly MAX_CHARS = 2000;\n\n private truncate(text: string): string {\n return text.length > Embedder.MAX_CHARS ? text.slice(0, Embedder.MAX_CHARS) : text;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n return {\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n results.push({\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.activeModelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n const envModel = process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder(envModel || undefined);\n }\n return defaultEmbedder;\n}\n\nlet transformersWarningSuppressionDepth = 0;\nlet originalConsoleWarn: typeof console.warn | null = null;\n\nexport async function withSuppressedKnownTransformersWarnings<T>(fn: () => Promise<T>): Promise<T> {\n if (transformersWarningSuppressionDepth === 0) {\n originalConsoleWarn = console.warn;\n console.warn = (...args: unknown[]) => {\n const message = args.map(String).join(' ');\n if (isKnownBenignTransformersWarning(message)) return;\n (originalConsoleWarn ?? console.warn)(...args);\n };\n }\n transformersWarningSuppressionDepth += 1;\n\n try {\n return await fn();\n } finally {\n transformersWarningSuppressionDepth -= 1;\n if (transformersWarningSuppressionDepth === 0 && originalConsoleWarn) {\n console.warn = originalConsoleWarn;\n originalConsoleWarn = null;\n }\n }\n}\n\nexport function isKnownBenignTransformersWarning(message: string): boolean {\n return message.includes('Unknown model class \"eurobert\"') ||\n message.includes('dtype not specified for \"model\"');\n}\n\nexport function isMissingTransformersDependencyError(error: unknown): boolean {\n const maybeError = error as { code?: unknown; message?: unknown } | null;\n const message = typeof maybeError?.message === 'string' ? maybeError.message : '';\n return maybeError?.code === 'ERR_MODULE_NOT_FOUND' &&\n message.includes(\"@huggingface/transformers\");\n}\n\nexport function createEmbeddingBackendUnavailableError(cause: unknown): Error & { cause?: unknown } {\n const error = new Error(\n [\n 'Optional embedding backend is not installed.',\n '',\n 'Claude Memory Layer can run embeddings on CPU-only ONNX Runtime; CUDA is not required.',\n 'Reinstall globally with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install -g claude-memory-layer@latest',\n '',\n 'If you are inside a local checkout or package directory, repair only the backend with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --no-save --no-package-lock --omit=dev @huggingface/transformers@3.8.1'\n ].join('\\n')\n ) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n}\n\nasync function loadTransformersPipeline(): Promise<FeatureExtractionPipelineFactory> {\n // Keep @huggingface/transformers lazy so importing MemoryService or pure\n // adapter helpers does not eagerly dlopen onnxruntime native bindings.\n const dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n ) => Promise<{ pipeline: unknown }>;\n const transformers = await dynamicImport('@huggingface/transformers');\n return transformers.pipeline as FeatureExtractionPipelineFactory;\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n // Track which sessions have accessed each event\n private readonly sessionAccesses: Map<string, Set<string>> = new Map();\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n // Track sessions that have accessed this event\n if (!this.sessionAccesses.has(eventId)) {\n this.sessionAccesses.set(eventId, new Set());\n }\n const sessions = this.sessionAccesses.get(eventId)!;\n const isNewSession = !sessions.has(fromSessionId);\n sessions.add(fromSessionId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Update cross-session references count\n if (isNewSession && sessions.size > 1) {\n existing.crossSessionRefs = sessions.size - 1;\n }\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const eventId of this.metrics.keys()) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryMatch,\n MatchResult,\n MatchConfidence\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n result.score, // Reuse the retrieval score as lexical/proxy score when no separate FTS score is provided.\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { MemoryEventInput } from './types.js';\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nfunction getAtPath(obj: Record<string, unknown> | undefined, dotted: string): unknown {\n if (!obj) return undefined;\n return dotted.split('.').reduce<unknown>((acc, key) => {\n if (!acc || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEventInput): string {\n const meta = event.metadata as Record<string, unknown> | undefined;\n\n const namespaceRaw = getAtPath(meta, 'namespace') ?? getAtPath(meta, 'scope.namespace') ?? event.eventType;\n const namespace = sanitizeSegment(typeof namespaceRaw === 'string' ? namespaceRaw : undefined, 'general');\n\n const categoryRaw = getAtPath(meta, 'categoryPath') ?? getAtPath(meta, 'scope.categoryPath');\n const categoryPath = Array.isArray(categoryRaw) && categoryRaw.length > 0\n ? categoryRaw.map((x) => sanitizeSegment(typeof x === 'string' ? x : undefined, 'uncategorized'))\n : ['uncategorized'];\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categoryPath, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEventInput, eventId?: string): Promise<void> {\n const out = buildMirrorPath(this.rootDir, event);\n fs.mkdirSync(path.dirname(out), { recursive: true });\n\n const lines = [\n '',\n `## ${event.timestamp.toISOString()} | ${eventId ?? 'pending-id'}`,\n `- type: ${event.eventType}`,\n `- session: ${event.sessionId}`,\n event.content,\n ];\n\n await fs.promises.appendFile(out, lines.join('\\n'), 'utf8');\n await this.refreshIndex();\n }\n\n private async refreshIndex(): Promise<void> {\n const memoryRoot = path.join(this.rootDir, 'memory');\n await fs.promises.mkdir(memoryRoot, { recursive: true });\n\n const files: string[] = [];\n await this.walk(memoryRoot, files);\n\n const mdFiles = files\n .filter((f) => f.endsWith('.md'))\n .map((f) => path.relative(this.rootDir, f))\n .filter((rel) => rel !== path.join('memory', '_index.md'))\n .sort();\n\n const index = [\n '# Memory Index',\n '',\n 'Generated automatically by MarkdownMirror.',\n '',\n ...mdFiles.map((rel) => `- ${rel}`),\n '',\n ].join('\\n');\n\n await fs.promises.writeFile(path.join(memoryRoot, '_index.md'), index, 'utf8');\n }\n\n private async walk(dir: string, out: string[]): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await this.walk(full, out);\n } else {\n out.push(full);\n }\n }\n }\n}\n", "/**\n * SQLite-based EventStore implementation\n * Primary store for hooks - WAL mode enables concurrent access\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport {\n createSQLiteDatabase,\n sqliteRun,\n sqliteAll,\n sqliteGet,\n sqliteClose,\n sqliteExec,\n toDateFromSQLite,\n toSQLiteTimestamp,\n type SQLiteDatabase,\n type SQLiteOptions\n} from './sqlite-wrapper.js';\nimport { MarkdownMirror } from './markdown-mirror.js';\n\nexport interface SQLiteEventStoreOptions extends SQLiteOptions {\n markdownMirrorRoot?: string;\n}\n\nexport class SQLiteEventStore {\n private db: SQLiteDatabase;\n private initialized = false;\n private readonly readOnly: boolean;\n private readonly markdownMirror: MarkdownMirror | null;\n\n constructor(dbPath: string, options?: SQLiteEventStoreOptions) {\n this.readOnly = options?.readonly ?? false;\n this.db = createSQLiteDatabase(dbPath, {\n readonly: this.readOnly,\n walMode: !this.readOnly\n });\n this.markdownMirror = this.readOnly || !options?.markdownMirrorRoot\n ? null\n : new MarkdownMirror(options.markdownMirrorRoot);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In read-only mode, skip schema creation\n if (this.readOnly) {\n this.initialized = true;\n return;\n }\n\n // Create all tables in a single exec for efficiency\n sqliteExec(this.db, `\n -- L0 EventStore: Single Source of Truth (immutable, append-only)\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n dedupe_key TEXT UNIQUE,\n metadata TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed_at TEXT\n );\n\n -- Dedup table for idempotency\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Session metadata\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n project_path TEXT,\n summary TEXT,\n tags TEXT\n );\n\n -- Insights (derived data, rebuildable)\n CREATE TABLE IF NOT EXISTS insights (\n id TEXT PRIMARY KEY,\n insight_type TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n confidence REAL,\n source_events TEXT,\n created_at TEXT,\n last_updated TEXT\n );\n\n -- Embedding Outbox (Single-Writer Pattern)\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n content TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n processed_at TEXT,\n error_message TEXT\n );\n\n -- Projection offset tracking\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory level tracking\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id TEXT PRIMARY KEY,\n level TEXT NOT NULL DEFAULT 'L0',\n promoted_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entries (immutable memory units)\n CREATE TABLE IF NOT EXISTS entries (\n entry_id TEXT PRIMARY KEY,\n created_ts TEXT NOT NULL,\n entry_type TEXT NOT NULL,\n title TEXT NOT NULL,\n content_json TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT DEFAULT 'active',\n superseded_by TEXT,\n build_id TEXT,\n evidence_json TEXT,\n canonical_key TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entities (task/condition/artifact)\n CREATE TABLE IF NOT EXISTS entities (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n title TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT NOT NULL DEFAULT 'active',\n current_json TEXT NOT NULL,\n title_norm TEXT,\n search_text TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entity aliases for canonical key lookup\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n is_primary INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n PRIMARY KEY(entity_type, canonical_key)\n );\n\n -- Edges (relationships between entries/entities)\n CREATE TABLE IF NOT EXISTS edges (\n edge_id TEXT PRIMARY KEY,\n src_type TEXT NOT NULL,\n src_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n meta_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Vector Outbox V2 Table\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id TEXT PRIMARY KEY,\n item_kind TEXT NOT NULL,\n item_id TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n error TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(item_kind, item_id, embedding_version)\n );\n\n -- Build Runs\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n extractor_model TEXT NOT NULL,\n extractor_prompt_hash TEXT NOT NULL,\n embedder_model TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n idris_version TEXT NOT NULL,\n schema_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n error TEXT\n );\n\n -- Pipeline Metrics\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id TEXT PRIMARY KEY,\n ts TEXT NOT NULL,\n stage TEXT NOT NULL,\n latency_ms REAL NOT NULL,\n success INTEGER NOT NULL,\n error TEXT,\n session_id TEXT\n );\n\n -- Working Set table (active memory window)\n CREATE TABLE IF NOT EXISTS working_set (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n added_at TEXT DEFAULT (datetime('now')),\n relevance_score REAL DEFAULT 1.0,\n topics TEXT,\n expires_at TEXT\n );\n\n -- Consolidated Memories table (long-term integrated memories)\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id TEXT PRIMARY KEY,\n summary TEXT NOT NULL,\n topics TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n accessed_at TEXT,\n access_count INTEGER DEFAULT 0\n );\n\n -- Continuity Log table (tracks context transitions)\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id TEXT PRIMARY KEY,\n from_context_id TEXT,\n to_context_id TEXT,\n continuity_score REAL,\n transition_type TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Consolidated Rules table (long-term stable memory)\n CREATE TABLE IF NOT EXISTS consolidated_rules (\n rule_id TEXT PRIMARY KEY,\n rule TEXT NOT NULL,\n topics TEXT,\n source_memory_ids TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Endless Mode Config table\n CREATE TABLE IF NOT EXISTS endless_config (\n key TEXT PRIMARY KEY,\n value TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Helpfulness tracking\n CREATE TABLE IF NOT EXISTS memory_helpfulness (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n retrieval_score REAL DEFAULT 0,\n query_preview TEXT,\n session_continued INTEGER DEFAULT 0,\n prompt_count_after INTEGER DEFAULT 0,\n tool_success_count INTEGER DEFAULT 0,\n tool_total_count INTEGER DEFAULT 0,\n was_reasked INTEGER DEFAULT 0,\n helpfulness_score REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n measured_at TEXT\n );\n\n -- Retrieval trace log (query -> candidates -> selected for context)\n CREATE TABLE IF NOT EXISTS retrieval_traces (\n trace_id TEXT PRIMARY KEY,\n session_id TEXT,\n project_hash TEXT,\n query_text TEXT NOT NULL,\n strategy TEXT,\n candidate_event_ids TEXT,\n selected_event_ids TEXT,\n candidate_details_json TEXT,\n selected_details_json TEXT,\n candidate_count INTEGER DEFAULT 0,\n selected_count INTEGER DEFAULT 0,\n confidence TEXT,\n fallback_trace TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Sync position tracking (for SQLite -> DuckDB sync)\n CREATE TABLE IF NOT EXISTS sync_positions (\n target_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Create indexes\n CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type);\n CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage);\n CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);\n CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type);\n CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score);\n CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence);\n CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at);\n CREATE INDEX IF NOT EXISTS idx_consolidated_rules_confidence ON consolidated_rules(confidence);\n CREATE INDEX IF NOT EXISTS idx_embedding_outbox_status ON embedding_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_event ON memory_helpfulness(event_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_session ON memory_helpfulness(session_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_score ON memory_helpfulness(helpfulness_score DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_created_at ON retrieval_traces(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_project_hash ON retrieval_traces(project_hash);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_session_id ON retrieval_traces(session_id);\n\n -- FTS5 Full-Text Search for fast keyword search\n CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n -- Triggers to keep FTS in sync with events table\n CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n\n // Best-effort forward migration for retrieval trace detail column\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN selected_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN candidate_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n\n // Migrate existing events table to add new columns if they don't exist\n // Check if columns exist before trying to add them\n const tableInfo = sqliteAll(this.db, \"PRAGMA table_info(events)\", []);\n const columnNames = tableInfo.map((col: any) => col.name);\n\n if (!columnNames.includes('access_count')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN access_count INTEGER DEFAULT 0;\n `);\n } catch (err: any) {\n console.error('Error adding access_count column:', err);\n }\n }\n\n if (!columnNames.includes('last_accessed_at')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN last_accessed_at TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding last_accessed_at column:', err);\n }\n }\n\n // Add turn_id column for grouping events within a conversation turn\n if (!columnNames.includes('turn_id')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN turn_id TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding turn_id column:', err);\n }\n }\n\n // Create indexes for new columns if they don't exist\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_access_count ON events(access_count DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_last_accessed ON events(last_accessed_at DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_turn_id ON events(turn_id);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (Append-only, Idempotent)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = sqliteGet<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing) {\n return {\n success: true,\n eventId: existing.event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = toSQLiteTimestamp(input.timestamp);\n\n try {\n // Extract turnId from metadata if present\n const metadata = input.metadata || {};\n const turnId = (metadata.turnId as string) || null;\n\n // Use transaction for atomicity\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n const transaction = this.db.transaction(() => {\n insertEvent.run(\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId\n );\n insertDedup.run(dedupeKey, id);\n insertLevel.run(id);\n });\n\n transaction();\n\n if (this.markdownMirror) {\n const event: MemoryEvent = {\n id,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey,\n dedupeKey,\n metadata\n };\n this.markdownMirror.append(event).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get session IDs that have events but no session_summary event.\n * Used to backfill summaries for sessions that ended without Stop hook.\n */\n async getSessionsWithoutSummary(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT e.session_id\n FROM events e\n WHERE e.session_id != ?\n AND e.event_type != 'session_summary'\n AND e.session_id NOT IN (\n SELECT DISTINCT session_id FROM events WHERE event_type = 'session_summary'\n )\n GROUP BY e.session_id\n HAVING COUNT(*) >= 3\n ORDER BY MAX(e.timestamp) DESC\n LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n return this.rowToEvent(row);\n }\n\n /**\n * Get events since a timestamp (for sync)\n */\n async getEventsSince(timestamp: string, limit: number = 1000): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE timestamp > ? ORDER BY timestamp ASC LIMIT ?`,\n [timestamp, limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get events since a SQLite rowid (for robust incremental replication).\n * Rowid is monotonic for append-only tables, independent of client timestamps.\n */\n async getEventsSinceRowid(\n lastRowid: number,\n limit: number = 1000\n ): Promise<Array<{ rowid: number; event: MemoryEvent }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT rowid as _rowid, * FROM events WHERE rowid > ? ORDER BY rowid ASC LIMIT ?`,\n [lastRowid, limit]\n );\n\n return rows.map(row => ({\n rowid: row._rowid as number,\n event: this.rowToEvent(row)\n }));\n }\n\n /**\n * Import events with fixed IDs (used for cross-machine replication).\n * Idempotent: skips if event id or dedupeKey already exists.\n *\n * NOTE: This bypasses the append() id generation to preserve stable IDs.\n */\n async importEvents(events: MemoryEvent[]): Promise<{ inserted: number; skipped: number }> {\n if (events.length === 0) return { inserted: 0, skipped: 0 };\n if (this.readOnly) return { inserted: 0, skipped: events.length };\n\n await this.initialize();\n\n const getById = this.db.prepare(`SELECT id FROM events WHERE id = ?`);\n const getByDedupe = this.db.prepare(`SELECT event_id FROM event_dedup WHERE dedupe_key = ?`);\n\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n let inserted = 0;\n let skipped = 0;\n const insertedEvents: MemoryEvent[] = [];\n\n const tx = this.db.transaction((batch: MemoryEvent[]) => {\n for (const ev of batch) {\n // Skip if already present by id\n const existingById = getById.get(ev.id) as { id: string } | undefined;\n if (existingById) {\n skipped++;\n continue;\n }\n\n const canonicalKey = ev.canonicalKey || makeCanonicalKey(ev.content);\n const dedupeKey = ev.dedupeKey || makeDedupeKey(ev.content, ev.sessionId);\n\n // Skip if already present by dedupe key\n const existingByDedupe = getByDedupe.get(dedupeKey) as { event_id: string } | undefined;\n if (existingByDedupe) {\n skipped++;\n continue;\n }\n\n const metadata = ev.metadata || {};\n const turnId = (metadata as any).turnId as string | undefined;\n\n insertEvent.run(\n ev.id,\n ev.eventType,\n ev.sessionId,\n toSQLiteTimestamp(ev.timestamp),\n ev.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId ?? null\n );\n\n insertDedup.run(dedupeKey, ev.id);\n insertLevel.run(ev.id);\n inserted++;\n insertedEvents.push(ev);\n }\n });\n\n tx(events);\n\n if (this.markdownMirror && insertedEvents.length > 0) {\n for (const ev of insertedEvents) {\n this.markdownMirror.append(ev).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n }\n\n return { inserted, skipped };\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = sqliteGet<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (!existing) {\n sqliteRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n toSQLiteTimestamp(session.startedAt || new Date()),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(toSQLiteTimestamp(session.endedAt));\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n sqliteRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n\n return {\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Add to embedding outbox\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n const pending = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox SET status = 'processing' WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDateFromSQLite(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Clear embedding outbox (used for embedding model migration)\n */\n async clearEmbeddingOutbox(): Promise<void> {\n await this.initialize();\n sqliteRun(this.db, `DELETE FROM embedding_outbox`);\n }\n\n /**\n * Count total events\n */\n async countEvents(): Promise<number> {\n await this.initialize();\n const row = sqliteGet<{ count: number }>(this.db, `SELECT COUNT(*) as count FROM events`);\n return row?.count || 0;\n }\n\n /**\n * Get events page in timestamp ascending order (stable migration/reindex scans)\n */\n async getEventsPage(limit: number = 1000, offset: number = 0): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp ASC LIMIT ? OFFSET ?`,\n [limit, offset]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n\n /**\n * Get embedding/vector outbox health statistics\n */\n async getOutboxStats(): Promise<{\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n }> {\n await this.initialize();\n\n const embeddingRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM embedding_outbox GROUP BY status`\n );\n const vectorRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM vector_outbox GROUP BY status`\n );\n\n const fromRows = (rows: Array<{ status: string; count: number }>) => {\n const out = { pending: 0, processing: 0, failed: 0, total: 0 };\n for (const row of rows) {\n const key = row.status as 'pending' | 'processing' | 'failed' | 'done';\n if (key === 'pending' || key === 'processing' || key === 'failed') {\n out[key] += row.count;\n }\n out.total += row.count;\n }\n return out;\n };\n\n return {\n embedding: fromRows(embeddingRows),\n vector: fromRows(vectorRows)\n };\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = datetime('now') WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = sqliteAll<{ level: string; count: number }>(\n this.db,\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM events e\n INNER JOIN memory_levels ml ON e.id = ml.event_id\n WHERE ml.level = ?\n ORDER BY e.timestamp DESC\n LIMIT ? OFFSET ?`,\n [level, limit, offset]\n );\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n\n const row = sqliteGet<{ level: string }>(\n this.db,\n `SELECT level FROM memory_levels WHERE event_id = ?`,\n [eventId]\n );\n\n return row ? row.level : null;\n }\n\n /**\n * Get sync position for a target\n */\n async getSyncPosition(targetName: string): Promise<{ lastEventId: string | null; lastTimestamp: string | null }> {\n await this.initialize();\n\n const row = sqliteGet<{ last_event_id: string | null; last_timestamp: string | null }>(\n this.db,\n `SELECT last_event_id, last_timestamp FROM sync_positions WHERE target_name = ?`,\n [targetName]\n );\n\n return {\n lastEventId: row?.last_event_id ?? null,\n lastTimestamp: row?.last_timestamp ?? null\n };\n }\n\n /**\n * Update sync position for a target\n */\n async updateSyncPosition(targetName: string, lastEventId: string, lastTimestamp: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO sync_positions (target_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, datetime('now'))`,\n [targetName, lastEventId, lastTimestamp]\n );\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const row = sqliteGet<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (!row) return null;\n return JSON.parse(row.value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, datetime('now'))`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Increment access count for events\n */\n async incrementAccessCount(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0 || this.readOnly) return;\n\n await this.initialize();\n\n const placeholders = eventIds.map(() => '?').join(',');\n const currentTime = toSQLiteTimestamp(new Date());\n\n sqliteRun(\n this.db,\n `UPDATE events\n SET access_count = access_count + 1,\n last_accessed_at = ?\n WHERE id IN (${placeholders})`,\n [currentTime, ...eventIds]\n );\n }\n\n /**\n * Get most accessed memories (falls back to recent events if none accessed)\n */\n async getMostAccessed(limit: number = 10): Promise<MemoryEvent[]> {\n await this.initialize();\n\n // First try events with access_count > 0\n let rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE access_count > 0\n ORDER BY access_count DESC, last_accessed_at DESC\n LIMIT ?`,\n [limit]\n );\n\n // Fallback: if no accessed events, show recent events\n if (rows.length === 0) {\n rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n ORDER BY timestamp DESC\n LIMIT ?`,\n [limit]\n );\n }\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_helpfulness (id, event_id, session_id, retrieval_score, query_preview, created_at)\n VALUES (?, ?, ?, ?, ?, datetime('now'))`,\n [id, eventId, sessionId, score, query.slice(0, 100)]\n );\n }\n\n /**\n * Get session IDs that have unevaluated retrievals (measured_at IS NULL).\n * Excludes the current session. Used to backfill sessions that ended without Stop hook.\n */\n async getUnevaluatedSessions(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT session_id FROM memory_helpfulness\n WHERE measured_at IS NULL AND session_id != ?\n ORDER BY created_at DESC LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Evaluate helpfulness for all retrievals in a session\n * Called at session end - uses behavioral signals to compute score\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n // Get all retrieval records for this session\n const retrievals = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM memory_helpfulness WHERE session_id = ? AND measured_at IS NULL`,\n [sessionId]\n );\n\n if (retrievals.length === 0) return;\n\n // Get session events to analyze behavior after retrieval\n const sessionEvents = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n const promptEvents = sessionEvents.filter((e: any) => e.event_type === 'user_prompt');\n const toolEvents = sessionEvents.filter((e: any) => e.event_type === 'tool_observation');\n\n // Count successful vs failed tools\n let toolSuccessCount = 0;\n let toolTotalCount = toolEvents.length;\n for (const t of toolEvents) {\n try {\n const content = JSON.parse(t.content as string);\n if (content.success !== false) toolSuccessCount++;\n } catch {\n toolSuccessCount++; // Assume success if can't parse\n }\n }\n const toolSuccessRatio = toolTotalCount > 0 ? toolSuccessCount / toolTotalCount : 0.5;\n\n for (const retrieval of retrievals) {\n const retrievalTime = retrieval.created_at as string;\n\n // 1. Session continued after retrieval?\n const eventsAfter = sessionEvents.filter((e: any) => e.timestamp > retrievalTime);\n const sessionContinued = eventsAfter.length > 0 ? 1 : 0;\n\n // 2. How many prompts came after?\n const promptsAfter = promptEvents.filter((e: any) => e.timestamp > retrievalTime);\n const promptCountAfter = promptsAfter.length;\n\n // 3. Was a similar query asked again? (simple word overlap check)\n const queryWords = new Set((retrieval.query_preview as string || '').toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n let wasReasked = 0;\n for (const p of promptsAfter) {\n const pWords = new Set((p.content as string).toLowerCase().split(/\\s+/).filter((w: string) => w.length > 2));\n let overlap = 0;\n for (const w of queryWords) {\n if (pWords.has(w)) overlap++;\n }\n if (queryWords.size > 0 && overlap / queryWords.size > 0.5) {\n wasReasked = 1;\n break;\n }\n }\n\n // Calculate helpfulness score\n // Weights tuned for shopping-assistant-like corpora where sessions\n // continue on the same topic (was_reasked was over-penalising normal conversation flow)\n const retrievalScore = retrieval.retrieval_score as number || 0;\n // More prompts after retrieval = memory was actually useful to the conversation\n const promptNorm = Math.min(promptCountAfter / 2, 1.0);\n const helpfulnessScore = (\n 0.40 * Math.min(retrievalScore, 1.0) +\n 0.30 * promptNorm +\n 0.20 * toolSuccessRatio +\n 0.10 * (sessionContinued ? 1.0 : 0.0)\n );\n\n sqliteRun(\n this.db,\n `UPDATE memory_helpfulness\n SET session_continued = ?, prompt_count_after = ?,\n tool_success_count = ?, tool_total_count = ?,\n was_reasked = ?, helpfulness_score = ?,\n measured_at = datetime('now')\n WHERE id = ?`,\n [sessionContinued, promptCountAfter, toolSuccessCount, toolTotalCount,\n wasReasked, helpfulnessScore, retrieval.id]\n );\n }\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<Array<{\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT\n mh.event_id,\n AVG(mh.helpfulness_score) as avg_score,\n COUNT(*) as eval_count,\n e.content,\n e.access_count\n FROM memory_helpfulness mh\n JOIN events e ON e.id = mh.event_id\n WHERE mh.measured_at IS NOT NULL\n GROUP BY mh.event_id\n ORDER BY avg_score DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(r => ({\n eventId: r.event_id as string,\n summary: (r.content as string).substring(0, 200) + ((r.content as string).length > 200 ? '...' : ''),\n helpfulnessScore: Math.round((r.avg_score as number) * 100) / 100,\n accessCount: (r.access_count as number) || 0,\n evaluationCount: r.eval_count as number\n }));\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(): Promise<{\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n }> {\n await this.initialize();\n\n const stats = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n AVG(helpfulness_score) as avg_score,\n COUNT(*) as total_evaluated,\n SUM(CASE WHEN helpfulness_score >= 0.7 THEN 1 ELSE 0 END) as helpful,\n SUM(CASE WHEN helpfulness_score >= 0.4 AND helpfulness_score < 0.7 THEN 1 ELSE 0 END) as neutral,\n SUM(CASE WHEN helpfulness_score < 0.4 THEN 1 ELSE 0 END) as unhelpful\n FROM memory_helpfulness\n WHERE measured_at IS NOT NULL`\n );\n\n const totalRow = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT COUNT(*) as total FROM memory_helpfulness`\n );\n\n return {\n avgScore: Math.round(((stats?.avg_score as number) || 0) * 100) / 100,\n totalEvaluated: (stats?.total_evaluated as number) || 0,\n totalRetrievals: (totalRow?.total as number) || 0,\n helpful: (stats?.helpful as number) || 0,\n neutral: (stats?.neutral as number) || 0,\n unhelpful: (stats?.unhelpful as number) || 0\n };\n }\n\n /**\n * Fast keyword search using FTS5\n * Returns events matching the search query, ranked by relevance\n */\n async keywordSearch(query: string, limit: number = 10): Promise<Array<{event: MemoryEvent; rank: number}>> {\n await this.initialize();\n\n // Escape special FTS5 characters and prepare search terms\n const searchTerms = query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ') // Remove special chars\n .split(/\\s+/)\n .filter(term => term.length > 1) // Filter short terms\n .map(term => `\"${term}\"*`) // Prefix matching\n .join(' OR ');\n\n if (!searchTerms) {\n return [];\n }\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.*, fts.rank\n FROM events_fts fts\n JOIN events e ON e.id = fts.event_id\n WHERE events_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`,\n [searchTerms, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: row.rank as number\n }));\n } catch (error: any) {\n // FTS table might not exist yet (old database)\n // Fallback to LIKE search\n const likePattern = `%${query}%`;\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT *, 0 as rank FROM events\n WHERE content LIKE ?\n ORDER BY timestamp DESC\n LIMIT ?`,\n [likePattern, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: 0\n }));\n }\n }\n\n /**\n * Rebuild FTS index from existing events\n * Call this once after upgrading to FTS5\n */\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n\n // Get count of events to index\n const countRow = sqliteGet<{count: number}>(this.db, 'SELECT COUNT(*) as count FROM events', []);\n const totalEvents = countRow?.count ?? 0;\n\n // Clear and rebuild FTS index. Recreate the virtual table instead of\n // issuing DELETE against it: older migrated FTS5 tables/triggers can fail\n // with `no such column: T.event_id` when processing synthetic deletes.\n sqliteExec(this.db, `\n DROP TRIGGER IF EXISTS events_fts_insert;\n DROP TRIGGER IF EXISTS events_fts_delete;\n DROP TRIGGER IF EXISTS events_fts_update;\n DROP TABLE IF EXISTS events_fts;\n\n CREATE VIRTUAL TABLE events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n INSERT INTO events_fts(rowid, content, event_id)\n SELECT rowid, content, id FROM events;\n\n CREATE TRIGGER events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n return totalEvents;\n }\n\n /**\n * Get database instance for direct access\n */\n getDatabase(): SQLiteDatabase {\n return this.db;\n }\n\n\n async recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n selectedDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void> {\n await this.initialize();\n\n const traceId = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO retrieval_traces (\n trace_id, session_id, project_hash, query_text, strategy,\n candidate_event_ids, selected_event_ids, candidate_details_json, selected_details_json,\n candidate_count, selected_count, confidence, fallback_trace\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n traceId,\n input.sessionId || null,\n input.projectHash || null,\n input.queryText,\n input.strategy || null,\n JSON.stringify(input.candidateEventIds || []),\n JSON.stringify(input.selectedEventIds || []),\n JSON.stringify(input.candidateDetails || []),\n JSON.stringify(input.selectedDetails || []),\n (input.candidateEventIds || []).length,\n (input.selectedEventIds || []).length,\n input.confidence || null,\n JSON.stringify(input.fallbackTrace || [])\n ]\n );\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<Array<{\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n selectedDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n }>> {\n await this.initialize();\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n traceId: row.trace_id as string,\n sessionId: (row.session_id as string) || undefined,\n projectHash: (row.project_hash as string) || undefined,\n queryText: row.query_text as string,\n strategy: (row.strategy as string) || undefined,\n candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids as string) : [],\n selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids as string) : [],\n candidateDetails: row.candidate_details_json ? JSON.parse(row.candidate_details_json as string) : [],\n selectedDetails: row.selected_details_json ? JSON.parse(row.selected_details_json as string) : [],\n candidateCount: Number(row.candidate_count || 0),\n selectedCount: Number(row.selected_count || 0),\n confidence: (row.confidence as string) || undefined,\n fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace as string) : [],\n createdAt: toDateFromSQLite(row.created_at),\n }));\n } catch (err: any) {\n if (err?.message?.includes('no such table')) return [];\n throw err;\n }\n }\n\n async getRetrievalTraceStats(): Promise<{\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n }> {\n await this.initialize();\n\n try {\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n COUNT(*) as total_queries,\n AVG(candidate_count) as avg_candidate_count,\n AVG(selected_count) as avg_selected_count,\n CASE\n WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))\n ELSE 0\n END as selection_rate\n FROM retrieval_traces`,\n []\n );\n\n return {\n totalQueries: Number(row?.total_queries || 0),\n avgCandidateCount: Number(row?.avg_candidate_count || 0),\n avgSelectedCount: Number(row?.avg_selected_count || 0),\n selectionRate: Number(row?.selection_rate || 0),\n };\n } catch (err: any) {\n if (err?.message?.includes('no such table')) {\n return { totalQueries: 0, avgCandidateCount: 0, avgSelectedCount: 0, selectionRate: 0 };\n }\n throw err;\n }\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n sqliteClose(this.db);\n }\n\n /**\n * Get events grouped by turn_id for a session\n * Returns turns ordered by first event timestamp (newest first)\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n await this.initialize();\n\n const limit = options?.limit || 20;\n const offset = options?.offset || 0;\n\n // Get distinct turn_ids for this session, ordered by first event timestamp\n const turnRows = sqliteAll<{ turn_id: string; min_ts: string }>(\n this.db,\n `SELECT turn_id, MIN(timestamp) as min_ts\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n GROUP BY turn_id\n ORDER BY min_ts DESC\n LIMIT ? OFFSET ?`,\n [sessionId, limit, offset]\n );\n\n const turns: Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }> = [];\n\n for (const turnRow of turnRows) {\n const events = await this.getEventsByTurn(turnRow.turn_id);\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const hasResponse = events.some(e => e.eventType === 'agent_response');\n\n turns.push({\n turnId: turnRow.turn_id,\n events,\n startedAt: toDateFromSQLite(turnRow.min_ts),\n promptPreview: promptEvent\n ? promptEvent.content.slice(0, 200) + (promptEvent.content.length > 200 ? '...' : '')\n : '(no prompt)',\n eventCount: events.length,\n toolCount: toolEvents.length,\n hasResponse\n });\n }\n\n return turns;\n }\n\n /**\n * Get all events for a specific turn_id\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE turn_id = ? ORDER BY timestamp ASC`,\n [turnId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n\n const row = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(DISTINCT turn_id) as count\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL`,\n [sessionId]\n );\n\n return row?.count || 0;\n }\n\n /**\n * Migrate existing events: backfill turn_id for events that have turnId in metadata\n * but no turn_id column value (for events stored before this migration)\n */\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n\n // Find events with turnId in metadata JSON but no turn_id column value\n const rows = sqliteAll<{ id: string; metadata: string }>(\n this.db,\n `SELECT id, metadata FROM events\n WHERE turn_id IS NULL AND metadata IS NOT NULL AND metadata LIKE '%turnId%'`\n );\n\n let updated = 0;\n for (const row of rows) {\n try {\n const metadata = JSON.parse(row.metadata);\n if (metadata.turnId) {\n sqliteRun(\n this.db,\n `UPDATE events SET turn_id = ? WHERE id = ?`,\n [metadata.turnId, row.id]\n );\n updated++;\n }\n } catch {\n // Skip rows with invalid JSON\n }\n }\n\n return updated;\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n\n // Get event IDs first for cascading deletes\n const events = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE session_id = ?`,\n [sessionId]\n );\n\n if (events.length === 0) return 0;\n\n const eventIds = events.map(e => e.id);\n const placeholders = eventIds.map(() => '?').join(',');\n\n // Drop FTS triggers to prevent SQLITE_CORRUPT_VTAB during bulk delete\n const ftsTriggersDropped: string[] = [];\n for (const triggerName of ['events_fts_delete', 'events_fts_update', 'events_fts_insert']) {\n try {\n sqliteRun(this.db, `DROP TRIGGER IF EXISTS ${triggerName}`);\n ftsTriggersDropped.push(triggerName);\n } catch {\n // Trigger may not exist\n }\n }\n\n // Delete from related tables first (some may not exist depending on DB version)\n for (const table of ['event_dedup', 'memory_levels', 'embedding_queue', 'embedding_outbox', 'vector_outbox']) {\n try {\n sqliteRun(this.db, `DELETE FROM ${table} WHERE event_id IN (${placeholders})`, eventIds);\n } catch {\n // Table may not exist\n }\n }\n\n // Delete events\n const result = sqliteRun(this.db, `DELETE FROM events WHERE session_id = ?`, [sessionId]);\n\n // Rebuild FTS index if we dropped triggers\n if (ftsTriggersDropped.length > 0) {\n try {\n // Rebuild FTS from remaining events\n sqliteRun(this.db, `INSERT INTO events_fts(events_fts) VALUES('rebuild')`);\n\n // Recreate triggers\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n } catch {\n // FTS rebuild failed - non-critical, will be rebuilt on next initialize\n }\n }\n\n return result.changes || 0;\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n const event: any = {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDateFromSQLite(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n };\n\n // Include access tracking fields if present\n if (row.access_count !== undefined) {\n event.access_count = row.access_count;\n }\n if (row.last_accessed_at !== undefined) {\n event.last_accessed_at = row.last_accessed_at;\n }\n // Include turn_id if present\n if (row.turn_id !== undefined && row.turn_id !== null) {\n event.turn_id = row.turn_id;\n }\n\n return event;\n }\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * SQLite Wrapper with WAL Mode Support\n * Primary store for hooks - always available, no lock conflicts\n */\n\nimport Database from 'better-sqlite3';\nimport * as fs from 'fs';\nimport * as nodePath from 'path';\n\nexport type SQLiteDatabase = Database.Database;\n\nexport interface SQLiteOptions {\n readonly?: boolean;\n walMode?: boolean;\n}\n\n/**\n * Creates a new SQLite database with WAL mode\n */\nexport function createSQLiteDatabase(path: string, options?: SQLiteOptions): SQLiteDatabase {\n // Ensure parent directory exists\n const dir = nodePath.dirname(path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const db = new Database(path, {\n readonly: options?.readonly ?? false,\n });\n\n // Enable WAL mode for concurrent access (unless read-only)\n if (!options?.readonly && (options?.walMode ?? true)) {\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n }\n\n return db;\n}\n\n/**\n * Execute a statement that doesn't return rows (INSERT, UPDATE, DELETE)\n */\nexport function sqliteRun(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): Database.RunResult {\n const stmt = db.prepare(sql);\n return stmt.run(...params);\n}\n\n/**\n * Execute a query and return all rows\n */\nexport function sqliteAll<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T[] {\n const stmt = db.prepare(sql);\n return stmt.all(...params) as T[];\n}\n\n/**\n * Execute a query and return first row\n */\nexport function sqliteGet<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T | undefined {\n const stmt = db.prepare(sql);\n return stmt.get(...params) as T | undefined;\n}\n\n/**\n * Execute multiple statements (for schema creation)\n */\nexport function sqliteExec(db: SQLiteDatabase, sql: string): void {\n db.exec(sql);\n}\n\n/**\n * Close database connection\n */\nexport function sqliteClose(db: SQLiteDatabase): void {\n db.close();\n}\n\n/**\n * Run multiple statements in a transaction\n */\nexport function sqliteTransaction<T>(\n db: SQLiteDatabase,\n fn: () => T\n): T {\n return db.transaction(fn)();\n}\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDateFromSQLite(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\n/**\n * Convert Date to ISO string for SQLite storage\n */\nexport function toSQLiteTimestamp(date: Date): string {\n return date.toISOString();\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { MemoryEvent } from './types.js';\n\nconst DEFAULT_NAMESPACE = 'default';\nconst DEFAULT_CATEGORY = 'uncategorized';\n\nexport function sanitizeSegment(input: unknown, fallback: string): string {\n const raw = String(input ?? '').trim().toLowerCase();\n const safe = raw\n .normalize('NFKD')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n if (!safe || safe === '.' || safe === '..') return fallback;\n return safe;\n}\n\nfunction getCategorySegments(metadata: Record<string, unknown> | undefined, eventType: string): string[] {\n const raw = metadata?.categoryPath;\n if (Array.isArray(raw) && raw.length > 0) {\n return raw.map((s) => sanitizeSegment(s, DEFAULT_CATEGORY));\n }\n const single = metadata?.category;\n if (typeof single === 'string' && single.trim()) {\n return [sanitizeSegment(single, DEFAULT_CATEGORY)];\n }\n return [sanitizeSegment(eventType, DEFAULT_CATEGORY)];\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEvent): string {\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const namespace = sanitizeSegment(metadata?.namespace, DEFAULT_NAMESPACE);\n const categories = getCategorySegments(metadata, event.eventType);\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categories, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport function formatMirrorEntry(event: MemoryEvent): string {\n const category = Array.isArray((event.metadata as any)?.categoryPath)\n ? ((event.metadata as any).categoryPath as unknown[]).join('/')\n : String((event.metadata as any)?.category ?? event.eventType);\n\n return [\n '',\n `- ts: ${event.timestamp.toISOString()}`,\n ` id: ${event.id}`,\n ` type: ${event.eventType}`,\n ` session: ${event.sessionId}`,\n ` category: ${category}`,\n ' content: |',\n ...event.content.split('\\n').map((line) => ` ${line}`)\n ].join('\\n') + '\\n';\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEvent): Promise<string> {\n const outPath = buildMirrorPath(this.rootDir, event);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.appendFile(outPath, formatMirrorEntry(event), 'utf8');\n return outPath;\n }\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n // Try to open existing table\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n\n if (!this.table) {\n // Create table with first record (handle race condition)\n try {\n this.table = await this.db.createTable(this.tableName, [data]);\n } catch (e: any) {\n if (e?.message?.includes('already exists')) {\n this.table = await this.db.openTable(this.tableName);\n await this.table.add([data]);\n } else {\n throw e;\n }\n }\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n }));\n\n if (!this.table) {\n try {\n this.table = await this.db.createTable(this.tableName, data);\n } catch (e: any) {\n if (e?.message?.includes('already exists')) {\n this.table = await this.db.openTable(this.tableName);\n await this.table.add(data);\n } else {\n throw e;\n }\n }\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = '${sessionId}'`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Clear all vectors (used for embedding model migration)\n */\n async clearAll(): Promise<void> {\n await this.initialize();\n if (!this.db) return;\n\n try {\n if (typeof (this.db as any).dropTable === 'function') {\n await (this.db as any).dropTable(this.tableName);\n } else if (typeof (this.db as any).drop_table === 'function') {\n await (this.db as any).drop_table(this.tableName);\n }\n } catch {\n // Ignore if table does not exist\n }\n\n this.table = null;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "import type { MemoryEventInput } from './types.js';\n\nexport type IngestStage = 'before' | 'after' | 'error';\n\nexport interface IngestContext {\n stage: IngestStage;\n operation: 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n sessionId: string;\n event: MemoryEventInput;\n error?: Error;\n}\n\nexport type IngestInterceptor = (context: IngestContext) => Promise<void> | void;\n\nexport class IngestInterceptorRegistry {\n private before: IngestInterceptor[] = [];\n private after: IngestInterceptor[] = [];\n private onError: IngestInterceptor[] = [];\n\n registerBefore(interceptor: IngestInterceptor): () => void {\n this.before.push(interceptor);\n return () => {\n this.before = this.before.filter((i) => i !== interceptor);\n };\n }\n\n registerAfter(interceptor: IngestInterceptor): () => void {\n this.after.push(interceptor);\n return () => {\n this.after = this.after.filter((i) => i !== interceptor);\n };\n }\n\n registerOnError(interceptor: IngestInterceptor): () => void {\n this.onError.push(interceptor);\n return () => {\n this.onError = this.onError.filter((i) => i !== interceptor);\n };\n }\n\n async run(stage: IngestStage, context: Omit<IngestContext, 'stage'>): Promise<void> {\n const interceptors = stage === 'before'\n ? this.before\n : stage === 'after'\n ? this.after\n : this.onError;\n\n for (const interceptor of interceptors) {\n await interceptor({ ...context, stage });\n }\n }\n}\n\nexport function mergeHierarchicalMetadata(\n base: Record<string, unknown> | undefined,\n patch: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !patch) return undefined;\n if (!base) return patch;\n if (!patch) return base;\n\n const result: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n if (\n typeof current === 'object' && current !== null && !Array.isArray(current) &&\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ) {\n result[key] = mergeHierarchicalMetadata(\n current as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n", "export const TAG_NAMESPACES = {\n SYSTEM: 'sys:',\n QUALITY: 'q:',\n PROJECT: 'proj:',\n TOPIC: 'topic:',\n TEMPORAL: 't:',\n USER: 'user:',\n AGENT: 'agent:'\n} as const;\n\nexport const VALID_TAG_NAMESPACES = new Set<string>(Object.values(TAG_NAMESPACES));\n\nexport function parseTag(tag: string): { namespace?: string; value: string } {\n const value = (tag || '').trim();\n const idx = value.indexOf(':');\n if (idx <= 0) return { value };\n\n const namespace = `${value.slice(0, idx)}:`;\n const tagValue = value.slice(idx + 1);\n if (!tagValue) return { value };\n\n return { namespace, value: tagValue };\n}\n\nexport function validateTag(tag: string): boolean {\n const normalized = (tag || '').trim();\n if (!normalized) return false;\n\n const { namespace } = parseTag(normalized);\n if (!namespace) return true; // backward compatibility for legacy tags\n return VALID_TAG_NAMESPACES.has(namespace);\n}\n\nexport function withNamespace(value: string, namespace: string): string {\n const clean = parseTag(value).value.trim();\n return `${namespace}${clean}`;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n\n const dedup = new Set<string>();\n for (const item of tags) {\n if (typeof item !== 'string') continue;\n const normalized = item.trim();\n if (!validateTag(normalized)) continue;\n dedup.add(normalized);\n }\n\n return [...dedup];\n}\n", "import type { MemoryEvent } from '../types.js';\n\nexport interface SessionSummaryDerivation {\n text: string;\n metadata: {\n generated: 'rule-based';\n eventCount: number;\n };\n}\n\nconst MAX_FIRST_PROMPT_LENGTH = 120;\nconst MAX_TOOL_NAMES = 6;\n\nexport class SummaryDeriver {\n /**\n * Derive the current lightweight rule-based session summary from raw events.\n *\n * The deriver is intentionally pure: callers own persistence and lifecycle\n * orchestration, while this class owns summary text and metadata decisions.\n */\n deriveSessionSummary(events: MemoryEvent[]): SessionSummaryDerivation | null {\n if (events.length < 3) return null;\n if (events.some((event) => event.eventType === 'session_summary')) return null;\n\n const prompts = events.filter((event) => event.eventType === 'user_prompt');\n const toolObservations = events.filter((event) => event.eventType === 'tool_observation');\n const toolNames = Array.from(new Set(\n toolObservations\n .map((event) => this.asRecord(event.metadata).toolName)\n .filter((toolName): toolName is string => typeof toolName === 'string' && toolName.length > 0)\n ));\n const errorObservations = toolObservations.filter((event) => this.isErrorObservation(event));\n\n const datePart = events[0].timestamp.toISOString().split('T')[0];\n const parts: string[] = [`[${datePart}] ${prompts.length}\uD134 \uC138\uC158`];\n\n if (prompts.length > 0) {\n parts.push(`\uC8FC\uC694 \uC791\uC5C5: ${this.firstPromptPreview(prompts[0].content)}`);\n }\n if (toolNames.length > 0) {\n parts.push(`\uC0AC\uC6A9 \uD234: ${toolNames.slice(0, MAX_TOOL_NAMES).join(', ')}`);\n }\n if (errorObservations.length > 0) {\n parts.push(`\uC624\uB958 ${errorObservations.length}\uAC74 \uBC1C\uC0DD`);\n }\n\n return {\n text: parts.join('. '),\n metadata: { generated: 'rule-based', eventCount: events.length }\n };\n }\n\n private firstPromptPreview(content: string): string {\n return content.slice(0, MAX_FIRST_PROMPT_LENGTH).replace(/\\r?\\n/g, ' ');\n }\n\n private isErrorObservation(event: MemoryEvent): boolean {\n const metadata = this.asRecord(event.metadata);\n\n if (metadata.exitCode !== undefined) {\n return metadata.exitCode !== 0;\n }\n\n return metadata.success === false;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n }\n}\n\nexport function createSummaryDeriver(): SummaryDeriver {\n return new SummaryDeriver();\n}\n", "import {\n IngestInterceptor,\n IngestInterceptorRegistry,\n mergeHierarchicalMetadata\n} from '../ingest-interceptor.js';\nimport { normalizeTags } from '../tag-taxonomy.js';\nimport { createSummaryDeriver, type SummaryDeriver } from '../derive/summary-deriver.js';\nimport type { AppendResult, MemoryEvent, MemoryEventInput, ToolObservationPayload } from '../types.js';\n\ninterface SessionRecord {\n id: string;\n startedAt?: Date;\n endedAt?: Date;\n projectPath?: string;\n summary?: string;\n}\n\ninterface SessionUpsertStore {\n upsertSession(session: SessionRecord): Promise<void>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getSessionsWithoutSummary(currentSessionId: string, limit?: number): Promise<string[]>;\n}\n\ninterface IngestEventStore extends SessionUpsertStore {\n append(input: MemoryEventInput): Promise<AppendResult>;\n enqueueForEmbedding(eventId: string, content: string): Promise<unknown>;\n}\n\ninterface IngestMarkdownMirror {\n append(event: MemoryEventInput, eventId?: string): Promise<void>;\n}\n\nexport type IngestOperation = 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n\nexport interface MemoryIngestServiceOptions {\n initialize: () => Promise<void>;\n eventStore: IngestEventStore;\n markdownMirror: IngestMarkdownMirror;\n createToolEmbedding: (payload: ToolObservationPayload) => string;\n getProjectHash?: () => string | null;\n getProjectPath?: () => string | null;\n summaryDeriver?: SummaryDeriver;\n}\n\n/**\n * Thin-core ingest service for session lifecycle and event writes.\n *\n * Owns the ingest normalization/interceptor/append pipeline so the public\n * MemoryService facade can delegate ingest behavior without coordinating\n * storage-side effects itself.\n */\nexport class MemoryIngestService {\n private readonly initialize: () => Promise<void>;\n private readonly eventStore: IngestEventStore;\n private readonly markdownMirror: IngestMarkdownMirror;\n private readonly createToolEmbedding: (payload: ToolObservationPayload) => string;\n private readonly getProjectHash: () => string | null;\n private readonly getProjectPath: () => string | null;\n private readonly summaryDeriver: SummaryDeriver;\n private readonly ingestInterceptors = new IngestInterceptorRegistry();\n\n constructor(options: MemoryIngestServiceOptions) {\n this.initialize = options.initialize;\n this.eventStore = options.eventStore;\n this.markdownMirror = options.markdownMirror;\n this.createToolEmbedding = options.createToolEmbedding;\n this.getProjectHash = options.getProjectHash ?? (() => null);\n this.getProjectPath = options.getProjectPath ?? (() => null);\n this.summaryDeriver = options.summaryDeriver ?? createSummaryDeriver();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerOnError(interceptor);\n }\n\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n startedAt: new Date(),\n projectPath\n });\n }\n\n async endSession(sessionId: string, summary?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n endedAt: new Date(),\n summary\n });\n }\n\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'user_prompt',\n input: {\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'agent_response',\n input: {\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'session_summary',\n input: {\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary,\n metadata\n },\n embeddingContent: summary\n });\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n await this.initialize();\n\n const recentSessionIds = await this.eventStore.getSessionsWithoutSummary(currentSessionId, limit);\n for (const sessionId of recentSessionIds) {\n try {\n await this.generateSessionSummary(sessionId);\n } catch {\n // non-critical backfill path\n }\n }\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Skips short sessions and sessions that already contain a summary event.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n await this.initialize();\n\n const events = await this.eventStore.getSessionEvents(sessionId);\n const summary = this.summaryDeriver.deriveSessionSummary(events);\n if (!summary) return;\n\n await this.storeSessionSummary(sessionId, summary.text, summary.metadata);\n }\n\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n const content = JSON.stringify(payload);\n const turnId = (payload.metadata as Record<string, unknown> | undefined)?.turnId;\n\n return this.ingestEvent({\n operation: 'tool_observation',\n input: {\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success,\n ...(typeof turnId === 'string' && turnId.length > 0 ? { turnId } : {})\n }\n },\n embeddingContent: this.createToolEmbedding(payload)\n });\n }\n\n private async ingestEvent(options: {\n operation: IngestOperation;\n input: MemoryEventInput;\n embeddingContent?: string;\n }): Promise<AppendResult> {\n const normalizedInput = this.normalizeInput(options.operation, options.input);\n\n await this.ingestInterceptors.run('before', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n try {\n const result = await this.eventStore.append(normalizedInput);\n if (result.success === false) {\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: new Error(result.error)\n });\n return result;\n }\n\n if (!result.isDuplicate) {\n if (options.embeddingContent) {\n await this.eventStore.enqueueForEmbedding(result.eventId, options.embeddingContent);\n }\n try {\n await this.markdownMirror.append(normalizedInput, result.eventId);\n } catch {\n // non-breaking markdown mirror write\n }\n }\n\n await this.ingestInterceptors.run('after', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n return result;\n } catch (error) {\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: normalizedError\n });\n throw error;\n }\n }\n\n private normalizeInput(operation: IngestOperation, input: MemoryEventInput): MemoryEventInput {\n const projectHash = this.getProjectHash();\n const projectPath = this.getProjectPath();\n const normalizedInput: MemoryEventInput = {\n ...input,\n metadata: mergeHierarchicalMetadata(\n {\n ingest: {\n operation,\n pipeline: 'default',\n ts: new Date().toISOString()\n },\n ...(projectHash\n ? {\n scope: {\n project: {\n hash: projectHash,\n ...(projectPath ? { path: projectPath } : {})\n }\n },\n tags: [`proj:${projectHash}`]\n }\n : {})\n },\n input.metadata\n )\n };\n\n if (projectHash && normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const currentTags = Array.isArray(meta.tags)\n ? meta.tags.filter((x): x is string => typeof x === 'string')\n : [];\n const projectTag = `proj:${projectHash}`;\n if (!currentTags.includes(projectTag)) {\n meta.tags = [...currentTags, projectTag];\n }\n }\n\n if (normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const normalizedTags = normalizeTags(meta.tags);\n if (normalizedTags.length > 0) {\n meta.tags = normalizedTags;\n }\n }\n\n return normalizedInput;\n }\n}\n", "import type { MemoryEvent } from '../types.js';\n\ninterface RankedKeywordResult {\n event: MemoryEvent;\n rank: number;\n}\n\nexport interface MemorySessionTurn {\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n}\n\nexport interface MemoryOutboxStats {\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n}\n\nexport interface MemoryStats {\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n}\n\ninterface QueryStore {\n keywordSearch(query: string, topK: number): Promise<RankedKeywordResult[]>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getRecentEvents(limit: number): Promise<MemoryEvent[]>;\n}\n\ninterface QueryMaintenanceStore extends QueryStore {\n rebuildFtsIndex(): Promise<number>;\n getOutboxStats(): Promise<MemoryOutboxStats>;\n getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]>;\n getEventLevel(eventId: string): Promise<string | null>;\n getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<MemorySessionTurn[]>;\n getEventsByTurn(turnId: string): Promise<MemoryEvent[]>;\n countSessionTurns(sessionId: string): Promise<number>;\n backfillTurnIds(): Promise<number>;\n deleteSessionEvents(sessionId: string): Promise<number>;\n}\n\ninterface MemoryQueryServiceDeps {\n vectorStore: { count(): Promise<number> };\n graduation: { getStats(): Promise<Array<{ level: string; count: number }>> };\n}\n\n/**\n * Thin-core query service for lightweight read and maintenance paths.\n *\n * Higher-level retrieval orchestration lives in RetrievalOrchestrator;\n * this service keeps storage-backed read models and maintenance delegates separate.\n */\nexport class MemoryQueryService {\n constructor(\n private readonly initialize: () => Promise<void>,\n private readonly queryStore: QueryStore,\n private readonly deps?: MemoryQueryServiceDeps\n ) {}\n\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{ event: MemoryEvent; score: number }>> {\n await this.initialize();\n\n const results = await this.queryStore.keywordSearch(query, options?.topK ?? 10);\n if (results.length === 0) return [];\n\n const maxRank = Math.min(...results.map((r) => r.rank), -0.001);\n const minRank = Math.max(...results.map((r) => r.rank), -1000);\n const rankRange = maxRank - minRank || 1;\n\n return results\n .map((r) => ({\n event: r.event,\n score: 1 - (r.rank - minRank) / rankRange\n }))\n .filter((r) => !options?.minScore || r.score >= options.minScore);\n }\n\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getSessionEvents(sessionId);\n }\n\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getRecentEvents(limit);\n }\n\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('rebuildFtsIndex').rebuildFtsIndex();\n }\n\n async getOutboxStats(): Promise<MemoryOutboxStats> {\n await this.initialize();\n return this.getMaintenanceStore('getOutboxStats').getOutboxStats();\n }\n\n async getStats(): Promise<MemoryStats> {\n await this.initialize();\n\n const deps = this.getStatsDeps();\n const recentEvents = await this.queryStore.getRecentEvents(10000);\n const vectorCount = await deps.vectorStore.count();\n const levelStats = await deps.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByLevel').getEventsByLevel(level, options);\n }\n\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n return this.getMaintenanceStore('getEventLevel').getEventLevel(eventId);\n }\n\n async getSessionTurns(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<MemorySessionTurn[]> {\n await this.initialize();\n return this.getMaintenanceStore('getSessionTurns').getSessionTurns(sessionId, options);\n }\n\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByTurn').getEventsByTurn(turnId);\n }\n\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('countSessionTurns').countSessionTurns(sessionId);\n }\n\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('backfillTurnIds').backfillTurnIds();\n }\n\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('deleteSessionEvents').deleteSessionEvents(sessionId);\n }\n\n private getMaintenanceStore(method: keyof QueryMaintenanceStore): QueryMaintenanceStore {\n const store = this.queryStore as QueryStore & Partial<QueryMaintenanceStore>;\n if (typeof store[method] !== 'function') {\n throw new Error(`MemoryQueryService requires queryStore.${String(method)}() for this operation`);\n }\n return store as QueryMaintenanceStore;\n }\n\n private getStatsDeps(): MemoryQueryServiceDeps {\n if (!this.deps) {\n throw new Error('MemoryQueryService requires vectorStore and graduation dependencies for getStats()');\n }\n return this.deps;\n }\n}\n", "/**\n * Retrieval quality guards.\n *\n * These are deliberately small deterministic heuristics used to avoid injecting\n * obviously irrelevant memories. They are not a second source of truth; they\n * only filter candidate retrieval results before context assembly.\n */\n\nconst COMMAND_ARTIFACT_PATTERNS = [\n /<\\/?(?:local-command-(?:stdout|stderr)|command-(?:name|message))\\b/i,\n /<command-name>[\\s\\S]*?<\\/command-name>/i,\n /<local-command-stdout>[\\s\\S]*?<\\/local-command-stdout>/i,\n /<local-command-stderr>[\\s\\S]*?<\\/local-command-stderr>/i\n];\n\nconst LOW_SIGNAL_CONTEXT_PATTERNS = [\n /<environment_context\\b[\\s\\S]*<\\/environment_context>/i,\n /<turn_aborted>/i,\n /^#\\s*AGENTS\\.md\\s+instructions\\b[\\s\\S]*<INSTRUCTIONS>/i,\n /^\\s*(?:understood[,\\s.]*)?(?:stopping|stopped|pausing|paused)\\s+here\\b[\\s\\S]{0,180}\\blet\\s+me\\s+know\\s+when\\s+you(?:'d|\\s+would)?\\s+like\\s+to\\s+continue\\b/i,\n /^\u279C\\s+\\S+\\s+git:\\([^)]*\\)\\s+/i,\n /^\\$\\s+\\S+/i\n];\n\nconst CONTINUATION_QUERY_PATTERNS = [\n /^\\s*(?:continue|resume|next|what(?:'s| is)? next|next\\s+(?:step|task|action)|recommended\\s+(?:next\\s+)?(?:step|task|action)|what should (?:we|i) do next)\\??\\s*$/i,\n /^\\s*(?:\uC774\uC5B4\uC11C(?:\\s*\uC9C4\uD589\uD574\uC918)?|\uACC4\uC18D(?:\\s*\uD574\uC918)?|\uB2E4\uC74C\\s*(?:\uB2E8\uACC4|\uC791\uC5C5|\uCD94\uCC9C\\s*\uC791\uC5C5|\uCD94\uCC9C|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uCD94\uCC9C\\s*\uC791\uC5C5(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uC9C4\uD589\uD574\uC918)\\s*$/i\n];\n\nconst GENERIC_TECHNICAL_TERMS = new Set([\n 'api',\n 'cli',\n 'ui',\n 'json',\n 'jsonl',\n 'html',\n 'http',\n 'https',\n 'url',\n 'uri',\n 'id',\n 'ids',\n 'uuid',\n 'db',\n 'sql'\n]);\n\nexport function isCommandArtifactQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isCommandArtifactContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowSignalContextContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return true;\n if (isCommandArtifactContent(trimmed)) return true;\n if (LOW_SIGNAL_CONTEXT_PATTERNS.some((pattern) => pattern.test(trimmed))) return true;\n return false;\n}\n\nexport function isGenericContinuationQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (!CONTINUATION_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed))) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 10) return false;\n\n return !/[A-Za-z0-9_-]+\\.[A-Za-z0-9]+/.test(trimmed) &&\n !/(?:^|\\s)(?:feat|fix|chore|refactor|docs)\\/[A-Za-z0-9._-]+/.test(trimmed) &&\n !/[A-Za-z]:?[\\\\/]|\\/Users\\/|\\.\\/|\\.\\.\\//.test(trimmed);\n}\n\nexport function extractTechnicalQueryTerms(query: string): string[] {\n const matches = query.match(/[A-Za-z][A-Za-z0-9_.:-]{2,}/g) ?? [];\n const terms = matches.filter((term) => {\n const lower = term.toLowerCase();\n if (GENERIC_TECHNICAL_TERMS.has(lower)) return false;\n return /[._:-]/.test(term) || /[a-z][A-Z]/.test(term) || /[A-Z]{2,}/.test(term) || /\\d/.test(term);\n });\n\n return Array.from(new Set(terms.map((term) => term.toLowerCase())));\n}\n\nexport function hasTechnicalTermOverlap(query: string, content: string): boolean {\n const terms = extractTechnicalQueryTerms(query);\n if (terms.length === 0) return true;\n\n const normalizedContent = content.toLowerCase();\n return terms.some((term) => normalizedContent.includes(term));\n}\n\nexport function shouldApplyTechnicalGuard(query: string): boolean {\n return extractTechnicalQueryTerms(query).length > 0;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, keyword search, scoped filtering, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { GraduationPipeline } from './graduation.js';\nimport {\n hasTechnicalTermOverlap,\n isCommandArtifactQuery,\n shouldApplyTechnicalGuard\n} from './retrieval-quality.js';\nimport type { MemoryEvent, MatchResult, SharedTroubleshootingEntry } from './types.js';\n\nexport interface RetrievalScope {\n sessionId?: string;\n eventTypes?: MemoryEvent['eventType'][];\n metadata?: Record<string, unknown>;\n canonicalKeyPrefix?: string;\n sessionIdPrefix?: string;\n contentIncludes?: string[];\n}\n\nexport type RetrievalStrategy = 'auto' | 'fast' | 'deep';\nexport type ProjectScopeMode = 'strict' | 'prefer' | 'global';\ntype DecayPolicy = NonNullable<RetrievalOptions['decayPolicy']>;\ntype GraphHopOptions = NonNullable<RetrievalOptions['graphHop']>;\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n scope?: RetrievalScope;\n strategy?: RetrievalStrategy;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: {\n enabled?: boolean;\n windowDays?: number;\n maxPenalty?: number;\n };\n intentRewrite?: boolean;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n fallbackTrace?: string[];\n selectedDebug?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n candidateDebug?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nexport interface UnifiedRetrievalOptions extends RetrievalOptions {\n includeShared?: boolean;\n projectHash?: string;\n}\n\nexport interface UnifiedRetrievalResult extends RetrievalResult {\n sharedMemories?: SharedTroubleshootingEntry[];\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true,\n strategy: 'auto',\n rerankWithKeyword: true,\n decayPolicy: {\n enabled: true,\n windowDays: 30,\n maxPenalty: 0.15\n },\n graphHop: {\n enabled: true,\n maxHops: 1,\n hopPenalty: 0.08\n },\n projectScopeMode: 'global'\n};\n\nexport interface SharedStoreOptions {\n sharedStore?: SharedStore;\n sharedVectorStore?: SharedVectorStore;\n}\n\ntype EventStoreLike = EventStore & {\n keywordSearch?: (query: string, limit?: number) => Promise<Array<{ event: MemoryEvent; rank: number }>>;\n};\n\nexport class Retriever {\n private readonly eventStore: EventStoreLike;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private sharedStore?: SharedStore;\n private sharedVectorStore?: SharedVectorStore;\n private graduation?: GraduationPipeline;\n private queryRewriter?: (query: string) => Promise<string | null>;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n ) {\n this.eventStore = eventStore as EventStoreLike;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n this.sharedStore = sharedOptions?.sharedStore;\n this.sharedVectorStore = sharedOptions?.sharedVectorStore;\n }\n\n setGraduationPipeline(graduation: GraduationPipeline): void {\n this.graduation = graduation;\n }\n\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void {\n this.sharedStore = sharedStore;\n this.sharedVectorStore = sharedVectorStore;\n }\n\n setQueryRewriter(rewriter: (query: string) => Promise<string | null>): void {\n this.queryRewriter = rewriter;\n }\n\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const sessionFilter = opts.scope?.sessionId ?? opts.sessionId;\n const fallbackTrace: string[] = [];\n\n if (isCommandArtifactQuery(query)) {\n fallbackTrace.push('guard:command-artifact-query');\n const emptyMatch = this.matcher.matchSearchResults([], () => 0);\n return {\n memories: [],\n matchResult: emptyMatch,\n totalTokens: 0,\n context: '',\n fallbackTrace,\n selectedDebug: [],\n candidateDebug: []\n };\n }\n\n const fallbackEnabled = (opts.strategy ?? 'auto') === 'auto';\n\n // Stage 1: primary retrieval\n const primaryStrategy: RetrievalStrategy = opts.strategy === 'auto' ? 'fast' : (opts.strategy || 'fast');\n let current = await this.runStage(query, {\n strategy: primaryStrategy,\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n intentRewrite: opts.intentRewrite === true,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push(`stage:primary:${primaryStrategy}`);\n\n // Stage 2: deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results) && primaryStrategy !== 'deep') {\n current = await this.runStage(query, {\n strategy: 'deep',\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push('fallback:deep');\n }\n\n // Stage 3: scope-expanded deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n current = await this.runStage(query, {\n strategy: 'deep',\n topK: opts.topK,\n minScore: Math.max(0.5, opts.minScore - 0.15),\n sessionId: undefined,\n scope: undefined,\n rerankWithKeyword: true,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push('fallback:scope-expanded');\n }\n\n // Stage 4: summary fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n const summary = await this.buildSummaryFallback(query, opts.topK);\n current = {\n results: summary,\n candidateResults: summary,\n matchResult: this.matcher.matchSearchResults(summary, () => 0)\n };\n fallbackTrace.push('fallback:summary');\n }\n\n const memories = await this.enrichResults(current.results.slice(0, opts.topK), opts as RetrievalOptions);\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult: current.matchResult,\n totalTokens: this.estimateTokens(context),\n context,\n fallbackTrace,\n selectedDebug: current.results.slice(0, opts.topK).map((r: SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }) => ({\n eventId: r.eventId,\n score: r.score,\n semanticScore: r.semanticScore,\n lexicalScore: r.lexicalScore,\n recencyScore: r.recencyScore,\n })),\n candidateDebug: (current.candidateResults || []).slice(0, Math.max(opts.topK * 3, 20)).map((r: SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }) => ({\n eventId: r.eventId,\n score: r.score,\n semanticScore: r.semanticScore,\n lexicalScore: r.lexicalScore,\n recencyScore: r.recencyScore,\n }))\n };\n }\n\n async retrieveUnified(\n query: string,\n options: Partial<UnifiedRetrievalOptions> = {}\n ): Promise<UnifiedRetrievalResult> {\n const projectResult = await this.retrieve(query, options);\n\n if (!options.includeShared || !this.sharedStore || !this.sharedVectorStore) {\n return projectResult;\n }\n\n try {\n const queryEmbedding = await this.embedder.embed(query);\n const sharedVectorResults = await this.sharedVectorStore.search(queryEmbedding.vector, {\n limit: options.topK || 5,\n minScore: options.minScore || 0.7,\n excludeProjectHash: options.projectHash\n });\n\n const sharedMemories: SharedTroubleshootingEntry[] = [];\n for (const result of sharedVectorResults) {\n const entry = await this.sharedStore.get(result.entryId);\n if (!entry) continue;\n if (!options.projectHash || entry.sourceProjectHash !== options.projectHash) {\n sharedMemories.push(entry);\n await this.sharedStore.recordUsage(entry.entryId);\n }\n }\n\n const unifiedContext = this.buildUnifiedContext(projectResult, sharedMemories);\n return {\n ...projectResult,\n context: unifiedContext,\n totalTokens: this.estimateTokens(unifiedContext),\n sharedMemories\n };\n } catch (error) {\n console.error('Shared search failed:', error);\n return projectResult;\n }\n }\n\n private async runStage(\n query: string,\n input: {\n strategy: RetrievalStrategy;\n topK: number;\n minScore: number;\n sessionId?: string;\n scope?: RetrievalScope;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: DecayPolicy;\n intentRewrite?: boolean;\n graphHop?: GraphHopOptions;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n }\n ): Promise<{ results: SearchResult[]; candidateResults: SearchResult[]; matchResult: MatchResult }> {\n let rerankQuery = query;\n let initialResults = await this.searchByStrategy(query, {\n strategy: input.strategy,\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n\n if (input.intentRewrite && input.strategy === 'deep' && this.queryRewriter) {\n const rewritten = (await this.queryRewriter(query))?.trim();\n if (rewritten && rewritten !== query) {\n rerankQuery = `${query} ${rewritten}`;\n const rewrittenResults = await this.searchByStrategy(rewritten, {\n strategy: 'deep',\n topK: input.topK,\n minScore: Math.max(0.5, input.minScore - 0.1),\n sessionId: input.sessionId\n });\n initialResults = this.mergeResults(initialResults, rewrittenResults, input.topK * 3);\n }\n }\n\n const expandedResults = input.graphHop?.enabled === false\n ? initialResults\n : await this.expandGraphHops(initialResults, {\n maxHops: Math.max(1, input.graphHop?.maxHops ?? 1),\n hopPenalty: Math.max(0, input.graphHop?.hopPenalty ?? 0.08),\n limit: input.topK * 4,\n });\n\n const rerankedResults = input.rerankWithKeyword\n ? this.rerankByKeywordOverlap(expandedResults, rerankQuery, input.rerankWeights, input.decayPolicy)\n : expandedResults;\n\n const filtered = await this.applyScopeFilters(rerankedResults, {\n scope: input.scope,\n projectScopeMode: input.projectScopeMode,\n projectHash: input.projectHash,\n allowedProjectHashes: input.allowedProjectHashes\n });\n const qualityFiltered = this.applyQualityFilters(filtered, {\n query,\n minScore: input.minScore\n });\n const top = qualityFiltered.slice(0, input.topK);\n const matchResult = this.matcher.matchSearchResults(top, () => 0);\n\n return { results: top, candidateResults: qualityFiltered, matchResult };\n }\n\n private applyQualityFilters(\n results: Array<SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }>,\n options: { query: string; minScore: number }\n ): Array<SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }> {\n let filtered = [...results];\n\n if (shouldApplyTechnicalGuard(options.query)) {\n filtered = filtered.filter((result) => hasTechnicalTermOverlap(options.query, result.content));\n }\n\n if (filtered.length <= 2) return filtered;\n\n const topScore = filtered[0].score;\n if (topScore < 0.8) return filtered;\n\n const cliffThreshold = Math.max(options.minScore, topScore - 0.25);\n return filtered.filter((result) => result.score >= cliffThreshold);\n }\n\n private mergeResults(primary: SearchResult[], secondary: SearchResult[], limit: number): SearchResult[] {\n const byId = new Map<string, SearchResult>();\n for (const row of primary) byId.set(row.eventId, row);\n for (const row of secondary) {\n const prev = byId.get(row.eventId);\n if (!prev || row.score > prev.score) {\n byId.set(row.eventId, row);\n }\n }\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n private async expandGraphHops(\n seeds: SearchResult[],\n opts: { maxHops: number; hopPenalty: number; limit: number }\n ): Promise<SearchResult[]> {\n const byId = new Map<string, SearchResult>();\n for (const s of seeds) byId.set(s.eventId, s);\n\n let frontier = seeds.map((s) => ({ row: s, hop: 0 }));\n\n for (let hop = 1; hop <= opts.maxHops; hop += 1) {\n const next: Array<{ row: SearchResult; hop: number }> = [];\n\n for (const f of frontier) {\n const ev = await this.eventStore.getEvent(f.row.eventId);\n if (!ev) continue;\n const rel = ((ev.metadata as Record<string, unknown> | undefined)?.relatedEventIds ?? []) as unknown;\n const relatedIds = Array.isArray(rel)\n ? rel.filter((x): x is string => typeof x === 'string')\n : [];\n\n for (const rid of relatedIds) {\n if (byId.has(rid)) continue;\n const target = await this.eventStore.getEvent(rid);\n if (!target) continue;\n\n const score = Math.max(0, f.row.score - opts.hopPenalty * hop);\n const row: SearchResult = {\n id: `hop-${hop}-${rid}`,\n eventId: target.id,\n content: target.content,\n score,\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n };\n\n byId.set(row.eventId, row);\n next.push({ row, hop });\n if (byId.size >= opts.limit) break;\n }\n if (byId.size >= opts.limit) break;\n }\n\n frontier = next;\n if (frontier.length === 0 || byId.size >= opts.limit) break;\n }\n\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, opts.limit);\n }\n\n private shouldFallback(matchResult: MatchResult, results: SearchResult[]): boolean {\n if (results.length === 0) return true;\n if (matchResult.confidence === 'none') return true;\n return false;\n }\n\n private async buildSummaryFallback(query: string, topK: number): Promise<SearchResult[]> {\n const recent = await this.eventStore.getRecentEvents(Math.max(topK * 6, 20));\n const q = this.tokenize(query);\n\n const ranked = recent\n .map((e) => ({ e, overlap: this.keywordOverlap(q, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, topK)\n .map((row, idx) => ({\n id: `summary-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score: Math.max(0.25, 0.6 - idx * 0.05),\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }));\n\n return ranked;\n }\n\n private async searchByStrategy(\n query: string,\n input: { strategy: RetrievalStrategy; topK: number; minScore: number; sessionId?: string }\n ): Promise<SearchResult[]> {\n const strategy = input.strategy === 'auto' ? 'deep' : input.strategy;\n\n if (strategy === 'fast') {\n const keyword = await this.searchByKeyword(query, {\n limit: Math.max(5, input.topK * 3),\n sessionId: input.sessionId\n });\n return keyword;\n }\n\n const queryEmbedding = await this.embedder.embed(query);\n return this.vectorStore.search(queryEmbedding.vector, {\n limit: Math.max(5, input.topK * 3),\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n }\n\n private async searchByKeyword(\n query: string,\n input: { limit: number; sessionId?: string }\n ): Promise<SearchResult[]> {\n if (this.eventStore.keywordSearch) {\n const rows = await this.eventStore.keywordSearch(query, input.limit);\n const filtered = input.sessionId ? rows.filter((r) => r.event.sessionId === input.sessionId) : rows;\n return filtered.map((row, idx) => ({\n id: `kw-${row.event.id}`,\n eventId: row.event.id,\n content: row.event.content,\n score: Math.max(0.4, 1 - idx * 0.04),\n sessionId: row.event.sessionId,\n eventType: row.event.eventType,\n timestamp: row.event.timestamp.toISOString()\n }));\n }\n\n const recent = await this.eventStore.getRecentEvents(input.limit * 4);\n const tokens = this.tokenize(query);\n const filtered = recent\n .filter((e) => (input.sessionId ? e.sessionId === input.sessionId : true))\n .map((e) => ({ e, overlap: this.keywordOverlap(tokens, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, input.limit);\n\n return filtered.map((row, idx) => ({\n id: `kw-fallback-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score: Math.max(0.3, 0.9 - idx * 0.05),\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }));\n }\n\n private rerankByKeywordOverlap(\n results: SearchResult[],\n query: string,\n weights?: { semantic?: number; lexical?: number; recency?: number },\n decayPolicy?: { enabled?: boolean; windowDays?: number; maxPenalty?: number }\n ): SearchResult[] {\n const q = this.tokenize(query);\n const now = Date.now();\n\n const sw = Math.max(0, weights?.semantic ?? 0.7);\n const lw = Math.max(0, weights?.lexical ?? 0.2);\n const rw = Math.max(0, weights?.recency ?? 0.1);\n const total = sw + lw + rw || 1;\n\n const decayEnabled = decayPolicy?.enabled !== false;\n const decayWindow = Math.max(1, decayPolicy?.windowDays ?? 30);\n const decayMaxPenalty = Math.max(0, decayPolicy?.maxPenalty ?? 0.15);\n\n return [...results]\n .map((r) => {\n const overlap = this.keywordOverlap(q, this.tokenize(r.content));\n const recencyDays = Math.max(0, (now - new Date(r.timestamp).getTime()) / (1000 * 60 * 60 * 24));\n const recency = Math.max(0, 1 - recencyDays / decayWindow);\n let blended = (r.score * sw + overlap * lw + recency * rw) / total;\n\n if (decayEnabled && recencyDays > decayWindow && overlap < 0.5) {\n const ageFactor = Math.min(1, (recencyDays - decayWindow) / decayWindow);\n blended -= decayMaxPenalty * ageFactor;\n }\n\n return { ...r, score: Math.max(0, blended), semanticScore: r.score, lexicalScore: overlap, recencyScore: recency };\n })\n .sort((a, b) => b.score - a.score);\n }\n\n private async applyScopeFilters(\n results: SearchResult[],\n options?: {\n scope?: RetrievalScope;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n }\n ): Promise<SearchResult[]> {\n const scope = options?.scope;\n const projectScopeMode = options?.projectScopeMode ?? 'global';\n const allowedProjectHashes = new Set(\n [options?.projectHash, ...(options?.allowedProjectHashes || [])].filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n )\n );\n\n if (!scope && projectScopeMode === 'global') return results;\n\n const normalizedIncludes = (scope?.contentIncludes || []).map((s) => s.toLowerCase());\n const filtered: Array<{ result: SearchResult; projectHash?: string }> = [];\n\n for (const result of results) {\n if (scope?.sessionId && result.sessionId !== scope.sessionId) continue;\n if (scope?.sessionIdPrefix && !result.sessionId.startsWith(scope.sessionIdPrefix)) continue;\n if (scope?.eventTypes && scope.eventTypes.length > 0 && !scope.eventTypes.includes(result.eventType as MemoryEvent['eventType'])) continue;\n\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (scope?.canonicalKeyPrefix && !event.canonicalKey.startsWith(scope.canonicalKeyPrefix)) continue;\n if (normalizedIncludes.length > 0) {\n const lc = event.content.toLowerCase();\n if (!normalizedIncludes.some((needle) => lc.includes(needle))) continue;\n }\n if (scope?.metadata && !this.matchesMetadataScope(event.metadata, scope.metadata)) continue;\n\n const projectHash = this.extractProjectHash(event.metadata);\n filtered.push({ result, projectHash });\n }\n\n if (projectScopeMode === 'global' || allowedProjectHashes.size === 0) {\n return filtered.map((x) => x.result);\n }\n\n const projectMatched = filtered.filter((x) => x.projectHash && allowedProjectHashes.has(x.projectHash));\n\n if (projectScopeMode === 'strict') {\n return projectMatched.map((x) => x.result);\n }\n\n return (projectMatched.length > 0 ? projectMatched : filtered).map((x) => x.result);\n }\n\n private extractProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata || typeof metadata !== 'object') return undefined;\n const scope = metadata.scope;\n if (!scope || typeof scope !== 'object') return undefined;\n const project = (scope as Record<string, unknown>).project;\n if (!project || typeof project !== 'object') return undefined;\n const hash = (project as Record<string, unknown>).hash;\n return typeof hash === 'string' && hash.length > 0 ? hash : undefined;\n }\n\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n private async enrichResults(results: SearchResult[], options: RetrievalOptions): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (this.graduation) {\n this.graduation.recordAccess(event.id, options.sessionId || 'unknown', result.score);\n }\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({ event, score: result.score, sessionContext });\n }\n\n return memories;\n }\n\n private async getSessionContext(sessionId: string, eventId: string): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n private buildUnifiedContext(projectResult: RetrievalResult, sharedMemories: SharedTroubleshootingEntry[]): string {\n let context = projectResult.context;\n if (sharedMemories.length === 0) return context;\n\n context += '\\n\\n## Cross-Project Knowledge\\n\\n';\n for (const memory of sharedMemories.slice(0, 3)) {\n context += `### ${memory.title}\\n`;\n if (memory.symptoms.length > 0) context += `**Symptoms:** ${memory.symptoms.join(', ')}\\n`;\n context += `**Root Cause:** ${memory.rootCause}\\n`;\n context += `**Solution:** ${memory.solution}\\n`;\n if (memory.technologies && memory.technologies.length > 0) context += `**Technologies:** ${memory.technologies.join(', ')}\\n`;\n context += `_Confidence: ${(memory.confidence * 100).toFixed(0)}%_\\n\\n`;\n }\n\n return context;\n }\n\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n if (currentTokens + memoryTokens > maxTokens) break;\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) return '';\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n if (sessionContext) text += `\\n\\n_Context:_ ${sessionContext}`;\n return text;\n }\n\n private matchesMetadataScope(\n metadata: Record<string, unknown> | undefined,\n expected: Record<string, unknown>\n ): boolean {\n if (!metadata) return false;\n\n return Object.entries(expected).every(([path, value]) => {\n const actual = path.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) return undefined;\n return (acc as Record<string, unknown>)[key];\n }, metadata);\n\n return actual === value;\n });\n }\n\n private tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .filter((t) => t.length >= 2)\n .slice(0, 64);\n }\n\n private keywordOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const bs = new Set(b);\n let hit = 0;\n for (const t of a) if (bs.has(t)) hit += 1;\n return hit / a.length;\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n}\n\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\n}\n", "/**\n * Retrieval Analytics Service\n *\n * Owns retrieval telemetry read-model and helpfulness evaluation workflows so\n * MemoryService can remain a thin facade over focused engine services.\n */\n\nimport type { MemoryEvent } from '../types.js';\n\nexport interface RetrievalTraceStats {\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n}\n\nexport interface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\nexport interface HelpfulMemory {\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n}\n\nexport interface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport interface RetrievalTrace {\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: RetrievalTraceDetail[];\n selectedDetails: RetrievalTraceDetail[];\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n}\n\nexport interface AccessedMemory {\n memoryId: string;\n summary: string;\n topics: string[];\n accessCount: number;\n lastAccessed: string | null;\n confidence: number;\n createdAt: Date;\n}\n\ntype AccessedMemoryEvent = MemoryEvent & {\n access_count?: number;\n last_accessed_at?: string | null;\n};\n\nexport interface RetrievalAnalyticsStore {\n getRetrievalTraceStats(): Promise<RetrievalTraceStats>;\n getRecentRetrievalTraces(limit?: number): Promise<RetrievalTrace[]>;\n getMostAccessed(limit?: number): Promise<AccessedMemoryEvent[]>;\n evaluateSessionHelpfulness(sessionId: string): Promise<void>;\n getUnevaluatedSessions(currentSessionId: string, limit?: number): Promise<string[]>;\n getHelpfulMemories(limit?: number): Promise<HelpfulMemory[]>;\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n}\n\nexport interface RetrievalAnalyticsServiceDeps {\n initialize: () => Promise<void>;\n retrievalStore: RetrievalAnalyticsStore;\n}\n\nexport class RetrievalAnalyticsService {\n constructor(private readonly deps: RetrievalAnalyticsServiceDeps) {}\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRecentRetrievalTraces(limit);\n }\n\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n // Preserve the historical lightweight path: SQLiteEventStore.getMostAccessed()\n // initializes itself and no-ops safely in read-only scenarios, so dashboard\n // access summaries should not trigger vector/embedder/worker initialization.\n const events = await this.deps.retrievalStore.getMostAccessed(limit);\n\n return events.map((event) => ({\n memoryId: event.id,\n summary: event.content.substring(0, 200) + (event.content.length > 200 ? '...' : ''),\n topics: this.extractTopicsFromContent(event.content),\n accessCount: event.access_count || 0,\n lastAccessed: event.last_accessed_at || null,\n confidence: 1.0,\n createdAt: event.timestamp,\n }));\n }\n\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.deps.initialize();\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n }\n\n async evaluatePendingSessions(currentSessionId: string, limit: number = 5): Promise<void> {\n await this.deps.initialize();\n const sessions = await this.deps.retrievalStore.getUnevaluatedSessions(currentSessionId, limit);\n\n for (const sessionId of sessions) {\n try {\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n } catch {\n // Best-effort backfill: one broken session should not block hook startup.\n }\n }\n }\n\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulMemories(limit);\n }\n\n async getHelpfulnessStats(): Promise<HelpfulnessStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulnessStats();\n }\n\n /**\n * Extract topic keywords from event content (markdown headings and key terms).\n */\n private extractTopicsFromContent(content: string): string[] {\n const topics: Set<string> = new Set();\n\n const headings = content.match(/^#{1,3}\\s+(.+)$/gm);\n if (headings) {\n for (const heading of headings.slice(0, 5)) {\n const text = heading.replace(/^#+\\s+/, '').replace(/[*_`#]/g, '').trim();\n if (text.length > 2 && text.length < 50) {\n topics.add(text);\n }\n }\n }\n\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n for (const boldTerm of boldTerms.slice(0, 5)) {\n const text = boldTerm.replace(/\\*\\*/g, '').trim();\n if (text.length > 2 && text.length < 30) {\n topics.add(text);\n }\n }\n }\n\n return Array.from(topics).slice(0, 5);\n }\n}\n\nexport function createRetrievalAnalyticsService(\n deps: RetrievalAnalyticsServiceDeps\n): RetrievalAnalyticsService {\n return new RetrievalAnalyticsService(deps);\n}\n", "/**\n * Retrieval Disclosure Service\n *\n * Provides a product-facing progressive disclosure surface on top of retrieval:\n * search -> expand -> source. Search returns compact, spec-aligned result\n * envelopes; expand adds surrounding context; source resolves to canonical raw\n * events or other source references.\n */\n\nimport type { RetrievalReason, RetrievalResultEnvelope, RetrievalResultType } from '../model/retrieval-result.js';\nimport type { UnifiedRetrievalResult, MemoryWithContext } from '../retriever.js';\nimport type { MemoryEvent, SharedTroubleshootingEntry } from '../types.js';\nimport type { RetrieveMemoriesOptions } from './retrieval-orchestrator.js';\n\nexport type RetrievalDisclosureResultType = RetrievalResultType;\nexport type RetrievalDisclosureReason = RetrievalReason;\nexport type RetrievalDisclosureEnvelope = RetrievalResultEnvelope;\nexport type RetrievalDisclosureSourceType =\n | 'raw_event'\n | 'transcript'\n | 'tool_output'\n | 'imported_history'\n | 'shared_troubleshooting';\n\nexport interface RetrievalDisclosureSearchResponse {\n results: RetrievalResultEnvelope[];\n meta: {\n total: number;\n usedVector: boolean;\n usedKeyword: boolean;\n fallbackApplied: boolean;\n confidence?: UnifiedRetrievalResult['matchResult']['confidence'];\n totalTokens?: number;\n fallbackTrace?: string[];\n };\n}\n\nexport interface RetrievalDisclosureSourceReference {\n sourceRef: string;\n sourceType: RetrievalDisclosureSourceType;\n eventIds: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RetrievalDisclosureExpansion {\n target: RetrievalResultEnvelope;\n surroundingFacts?: RetrievalResultEnvelope[];\n summaries?: RetrievalResultEnvelope[];\n relatedSources?: RetrievalDisclosureSourceReference[];\n expandedContext?: string;\n}\n\nexport interface RetrievalDisclosureSource extends RetrievalDisclosureSourceReference {\n rawEvents: MemoryEvent[];\n primaryEvent?: MemoryEvent;\n}\n\nexport interface RetrievalDisclosureSearchOptions extends RetrieveMemoriesOptions {}\n\nexport interface RetrievalDisclosureExpandOptions {\n windowSize?: number;\n}\n\nexport interface RetrievalDisclosureOrchestrator {\n retrieveMemories(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<UnifiedRetrievalResult>;\n}\n\nexport interface RetrievalDisclosureEventStore {\n getEvent(id: string): Promise<MemoryEvent | null>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n}\n\nexport interface RetrievalDisclosureSharedStore {\n get(entryId: string): Promise<SharedTroubleshootingEntry | null>;\n}\n\nexport interface RetrievalDisclosureServiceDeps {\n initialize: () => Promise<void>;\n retrievalOrchestrator: RetrievalDisclosureOrchestrator;\n eventStore: RetrievalDisclosureEventStore;\n sharedStore?: RetrievalDisclosureSharedStore;\n}\n\nexport class RetrievalDisclosureService {\n constructor(private readonly deps: RetrievalDisclosureServiceDeps) {}\n\n async search(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n const result = await this.deps.retrievalOrchestrator.retrieveMemories(query, options);\n const debugByEventId = this.buildDebugIndex(result);\n const projectResults = result.memories.map((memory) => this.memoryToEnvelope(\n memory,\n result,\n debugByEventId.get(memory.event.id)\n ));\n const sharedResults = (result.sharedMemories || []).map((entry) => this.sharedToEnvelope(entry));\n const results = [...projectResults, ...sharedResults];\n\n return {\n results,\n meta: {\n total: results.length,\n usedVector: this.usedVector(result),\n usedKeyword: this.usedKeyword(result),\n fallbackApplied: this.fallbackApplied(result),\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens,\n fallbackTrace: result.fallbackTrace || []\n }\n };\n }\n\n async expand(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.expandShared(parsedId.entryId);\n }\n\n const targetEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!targetEvent) return null;\n\n const windowSize = Math.max(0, options?.windowSize ?? 3);\n const sessionEvents = (await this.deps.eventStore.getSessionEvents(targetEvent.sessionId))\n .slice()\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const targetIndex = sessionEvents.findIndex((event) => event.id === targetEvent.id);\n const surroundingEvents = targetIndex === -1\n ? []\n : sessionEvents.slice(\n Math.max(0, targetIndex - windowSize),\n Math.min(sessionEvents.length, targetIndex + windowSize + 1)\n );\n const nearbyEvents = surroundingEvents.length > 0 ? surroundingEvents : [targetEvent];\n const nonTargetEvents = nearbyEvents.filter((event) => event.id !== targetEvent.id);\n\n return {\n target: this.eventToEnvelope(targetEvent, 1, ['continuity_link']),\n surroundingFacts: nonTargetEvents.map((event) => this.eventToEnvelope(event, 1, this.reasonsForContextEvent(event))),\n summaries: nonTargetEvents\n .filter((event) => event.eventType === 'session_summary')\n .map((event) => this.eventToEnvelope(event, 1, ['summary_fallback'])),\n relatedSources: nearbyEvents.map((event) => this.sourceReferenceForEvent(event)),\n expandedContext: this.formatTimelineContext(nearbyEvents)\n };\n }\n\n async source(resultId: string): Promise<RetrievalDisclosureSource | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.sourceShared(parsedId.entryId);\n }\n\n const rawEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!rawEvent) return null;\n\n return {\n ...this.sourceReferenceForEvent(rawEvent),\n rawEvents: [rawEvent],\n primaryEvent: rawEvent\n };\n }\n\n private async expandShared(entryId: string): Promise<RetrievalDisclosureExpansion | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n return {\n target: this.sharedToEnvelope(entry),\n surroundingFacts: [],\n summaries: [],\n relatedSources: [this.sourceReferenceForShared(entry)],\n expandedContext: this.formatSharedContext(entry)\n };\n }\n\n private async sourceShared(entryId: string): Promise<RetrievalDisclosureSource | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n const sourceReference = this.sourceReferenceForShared(entry);\n return {\n ...sourceReference,\n rawEvents: [],\n metadata: {\n ...sourceReference.metadata,\n symptoms: entry.symptoms,\n rootCause: entry.rootCause,\n solution: entry.solution,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private memoryToEnvelope(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalResultEnvelope {\n return this.eventToEnvelope(\n memory.event,\n memory.score,\n this.inferReasons(memory, result, debug),\n {\n semanticScore: debug?.semanticScore,\n lexicalScore: debug?.lexicalScore,\n recencyScore: debug?.recencyScore\n }\n );\n }\n\n private eventToEnvelope(\n event: MemoryEvent,\n score: number,\n reasons: RetrievalDisclosureReason[],\n extraMetadata?: Record<string, unknown>\n ): RetrievalResultEnvelope {\n return {\n id: toDisclosureResultId(event.id),\n resultType: this.resultTypeForEvent(event),\n title: this.titleForEvent(event),\n snippet: this.preview(event.content, 240),\n score,\n reasons,\n sourceRef: toDisclosureResultId(event.id),\n sessionId: event.sessionId,\n metadata: {\n eventId: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp.toISOString(),\n canonicalKey: event.canonicalKey,\n ...event.metadata,\n ...extraMetadata\n }\n };\n }\n\n private sharedToEnvelope(entry: SharedTroubleshootingEntry): RetrievalResultEnvelope {\n return {\n id: `shared:${entry.entryId}`,\n resultType: 'rule',\n title: entry.title,\n snippet: this.preview(entry.solution || entry.rootCause || entry.symptoms.join(' '), 240),\n score: entry.confidence,\n reasons: ['semantic_match'],\n sourceRef: `shared:${entry.entryId}`,\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private buildDebugIndex(result: UnifiedRetrievalResult): Map<string, RetrievalDebugDetail> {\n const byEventId = new Map<string, RetrievalDebugDetail>();\n\n for (const detail of result.candidateDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n for (const detail of result.selectedDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n\n return byEventId;\n }\n\n private inferReasons(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalDisclosureReason[] {\n const reasons = new Set<RetrievalDisclosureReason>();\n\n const usedVector = this.usedVector(result);\n const usedKeyword = this.usedKeyword(result);\n\n if (usedVector && (debug?.semanticScore ?? 0) > 0) reasons.add('semantic_match');\n if ((debug?.lexicalScore ?? 0) > 0 || usedKeyword) reasons.add('keyword_match');\n if ((debug?.recencyScore ?? 0) > 0) reasons.add('recent_relevance');\n if ((result.fallbackTrace || []).some((step) => step === 'fallback:summary')) reasons.add('summary_fallback');\n if (memory.sessionContext) reasons.add('continuity_link');\n if (memory.event.eventType === 'tool_observation') reasons.add('tool_followup');\n if (reasons.size === 0) reasons.add(usedVector ? 'semantic_match' : 'keyword_match');\n\n return Array.from(reasons);\n }\n\n private reasonsForContextEvent(event: MemoryEvent): RetrievalDisclosureReason[] {\n if (event.eventType === 'tool_observation') return ['tool_followup'];\n if (event.eventType === 'session_summary') return ['summary_fallback'];\n return ['continuity_link'];\n }\n\n private resultTypeForEvent(event: MemoryEvent): RetrievalDisclosureResultType {\n if (event.eventType === 'session_summary') return 'summary';\n if (event.eventType === 'tool_observation') return 'tool_evidence';\n return 'source';\n }\n\n private sourceReferenceForEvent(event: MemoryEvent): RetrievalDisclosureSourceReference {\n return {\n sourceRef: toDisclosureResultId(event.id),\n sourceType: this.sourceTypeForEvent(event),\n eventIds: [event.id]\n };\n }\n\n private sourceReferenceForShared(entry: SharedTroubleshootingEntry): RetrievalDisclosureSourceReference {\n return {\n sourceRef: `shared:${entry.entryId}`,\n sourceType: 'shared_troubleshooting',\n eventIds: [],\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics\n }\n };\n }\n\n private sourceTypeForEvent(event: MemoryEvent): RetrievalDisclosureSourceType {\n const metadata = event.metadata || {};\n if (event.eventType === 'tool_observation') return 'tool_output';\n if (typeof metadata.transcriptPath === 'string') return 'transcript';\n if (typeof metadata.importedFrom === 'string') return 'imported_history';\n return 'raw_event';\n }\n\n private titleForEvent(event: MemoryEvent): string {\n if (event.eventType === 'session_summary') return 'Session summary';\n if (event.eventType === 'tool_observation') return 'Tool evidence';\n if (event.eventType === 'agent_response') return 'Agent response';\n return 'User prompt';\n }\n\n private usedVector(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':deep'));\n }\n\n private usedKeyword(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':fast')) ||\n [...(result.selectedDebug || []), ...(result.candidateDebug || [])]\n .some((detail) => (detail.lexicalScore ?? 0) > 0);\n }\n\n private fallbackApplied(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes('fallback'));\n }\n\n private formatTimelineContext(events: MemoryEvent[]): string {\n return events\n .map((event) => `[${event.eventType}] ${event.content}`)\n .join('\\n\\n');\n }\n\n private formatSharedContext(entry: SharedTroubleshootingEntry): string {\n return [\n `[shared_troubleshooting] ${entry.title}`,\n `Symptoms: ${entry.symptoms.join('; ')}`,\n `Root cause: ${entry.rootCause}`,\n `Solution: ${entry.solution}`,\n `Topics: ${entry.topics.join(', ')}`\n ].join('\\n');\n }\n\n private preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n }\n}\n\ninterface RetrievalDebugDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport function toDisclosureResultId(eventId: string): string {\n return eventId.startsWith('event:') ? eventId : `event:${eventId}`;\n}\n\nexport type ParsedDisclosureResultId =\n | { kind: 'event'; eventId: string }\n | { kind: 'shared'; entryId: string };\n\nexport function parseDisclosureResultId(resultId: string): string {\n return resultId.startsWith('event:') ? resultId.slice('event:'.length) : resultId;\n}\n\nexport function parseDisclosureResultRef(resultId: string): ParsedDisclosureResultId {\n if (resultId.startsWith('shared:')) {\n return { kind: 'shared', entryId: resultId.slice('shared:'.length) };\n }\n return {\n kind: 'event',\n eventId: parseDisclosureResultId(resultId)\n };\n}\n\nexport function createRetrievalDisclosureService(\n deps: RetrievalDisclosureServiceDeps\n): RetrievalDisclosureService {\n return new RetrievalDisclosureService(deps);\n}\n", "/**\n * Retrieval Orchestrator\n *\n * Coordinates MemoryService-level retrieval concerns around the lower-level\n * Retriever: initialization, rerank policy, project/shared scoping, optional\n * intent rewriting, and non-blocking retrieval trace telemetry.\n */\n\nimport {\n Retriever,\n type ProjectScopeMode,\n type RetrievalResult,\n type RetrievalStrategy,\n type UnifiedRetrievalResult\n} from '../retriever.js';\n\nexport interface RetrieveMemoriesOptions {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: ProjectScopeMode;\n allowedProjectHashes?: string[];\n strategy?: RetrievalStrategy;\n /**\n * Disable automatic retrieval trace writes for read-only/navigation callers\n * that may receive secret-bearing ad-hoc queries.\n */\n recordTrace?: boolean;\n}\n\nexport interface RecordQueryTraceInput {\n sessionId: string;\n queryText: string;\n strategy: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n confidence: string;\n}\n\ninterface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\ntype RerankWeights = {\n semantic: number;\n lexical: number;\n recency: number;\n};\n\ninterface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport interface RetrievalTraceStore {\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: RetrievalTraceDetail[];\n selectedDetails?: RetrievalTraceDetail[];\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void>;\n}\n\nexport interface RetrievalAccessStore {\n incrementAccessCount(eventIds: string[]): Promise<void>;\n recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void>;\n}\n\nexport interface RetrievalOrchestratorDeps {\n initialize: () => Promise<void>;\n retriever: Retriever;\n traceStore: RetrievalTraceStore;\n accessStore: RetrievalAccessStore;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n}\n\nexport class RetrievalOrchestrator {\n constructor(private readonly deps: RetrievalOrchestratorDeps) {\n this.deps.retriever.setQueryRewriter((query) => this.rewriteQueryIntent(query));\n }\n\n /**\n * Retrieve relevant memories for a query.\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n const { recordTrace = true, ...retrieverOptions } = options ?? {};\n const lightweightFastRead = this.isLightweightFastRead(options);\n if (!lightweightFastRead) {\n await this.deps.initialize();\n }\n\n // Note: Pending embeddings are processed by the background worker.\n // Don't block retrieval - search with whatever vectors are available.\n const rerankWeights = lightweightFastRead\n ? undefined\n : await this.getRerankWeights(options?.adaptiveRerank === true);\n const projectHash = this.deps.getProjectHash();\n const projectScopeMode = retrieverOptions.projectScopeMode ?? (projectHash ? 'strict' : 'global');\n\n let result: UnifiedRetrievalResult;\n\n if (retrieverOptions.includeShared && this.deps.hasSharedStore()) {\n result = await this.deps.retriever.retrieveUnified(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n includeShared: true,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n } else {\n result = await this.deps.retriever.retrieve(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n }\n\n if (recordTrace) {\n try {\n await this.recordAutomaticTrace(query, result, options, projectHash);\n } catch {\n // Non-blocking telemetry.\n }\n }\n\n return result;\n }\n\n /**\n * Format retrieval results as context for Claude.\n */\n formatAsContext(result: RetrievalResult): string {\n if (!result.context) {\n return '';\n }\n\n const confidence = result.matchResult.confidence;\n let header = '';\n\n if (confidence === 'high') {\n header = '\uD83C\uDFAF **High-confidence memory match found:**\\n\\n';\n } else if (confidence === 'suggested') {\n header = '\uD83D\uDCA1 **Suggested memories (may be relevant):**\\n\\n';\n }\n\n return header + result.context;\n }\n\n /**\n * Record a query-level retrieval trace used by hooks and dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n await this.deps.initialize();\n await this.deps.traceStore.recordRetrievalTrace({\n ...input,\n projectHash: this.deps.getProjectHash() || undefined,\n candidateDetails: [],\n selectedDetails: [],\n fallbackTrace: [],\n });\n }\n\n /**\n * Increment access count for memories that were injected into prompts.\n *\n * Access count writes are intentionally store-scoped: the SQLite access store\n * initializes itself and no-ops in read-only mode, so this avoids triggering\n * the heavier retrieval/vector initialization path for prompt telemetry.\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n await this.deps.accessStore.incrementAccessCount(eventIds);\n }\n\n /**\n * Record a selected retrieval for helpfulness analytics.\n */\n async recordRetrieval(\n eventId: string,\n sessionId: string,\n score: number,\n query: string\n ): Promise<void> {\n await this.deps.initialize();\n await this.deps.accessStore.recordRetrieval(eventId, sessionId, score, query);\n }\n\n private async recordAutomaticTrace(\n query: string,\n result: UnifiedRetrievalResult,\n options: RetrieveMemoriesOptions | undefined,\n projectHash: string | null\n ): Promise<void> {\n const selectedEventIds = result.memories.map((memory) => memory.event.id);\n const selectedDetails = (result.selectedDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n }));\n const candidateDetails = (result.candidateDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n }));\n const candidateEventIds = candidateDetails.length > 0\n ? candidateDetails.map((detail) => detail.eventId)\n : selectedEventIds;\n\n await this.deps.traceStore.recordRetrievalTrace({\n sessionId: options?.sessionId,\n projectHash: projectHash || undefined,\n queryText: query,\n strategy: options?.strategy || 'auto',\n candidateEventIds,\n selectedEventIds,\n candidateDetails,\n selectedDetails,\n confidence: result.matchResult.confidence,\n fallbackTrace: result.fallbackTrace || []\n });\n }\n\n private isLightweightFastRead(options: RetrieveMemoriesOptions | undefined): boolean {\n const requiresSharedRuntime = options?.includeShared === true && this.deps.hasSharedStore();\n\n return options?.strategy === 'fast'\n && !requiresSharedRuntime\n && options.adaptiveRerank !== true;\n }\n\n private getConfiguredRerankWeights(): RerankWeights | undefined {\n const semantic = Number(process.env.MEMORY_RERANK_WEIGHT_SEMANTIC ?? '');\n const lexical = Number(process.env.MEMORY_RERANK_WEIGHT_LEXICAL ?? '');\n const recency = Number(process.env.MEMORY_RERANK_WEIGHT_RECENCY ?? '');\n\n const allFinite = [semantic, lexical, recency].every((value) => Number.isFinite(value));\n if (!allFinite) return undefined;\n\n const nonNegative = [semantic, lexical, recency].every((value) => value >= 0);\n const total = semantic + lexical + recency;\n if (!nonNegative || total <= 0) return undefined;\n\n return {\n semantic: semantic / total,\n lexical: lexical / total,\n recency: recency / total,\n };\n }\n\n private async getRerankWeights(adaptive: boolean): Promise<RerankWeights | undefined> {\n const configured = this.getConfiguredRerankWeights();\n if (configured) return configured;\n if (adaptive) return this.getAdaptiveRerankWeights();\n return undefined;\n }\n\n private async getAdaptiveRerankWeights(): Promise<RerankWeights | undefined> {\n try {\n const stats = await this.deps.traceStore.getHelpfulnessStats();\n if (stats.totalEvaluated < 20) return undefined;\n\n // Base weights.\n let semantic = 0.7;\n let lexical = 0.2;\n let recency = 0.1;\n\n if (stats.avgScore < 0.45) {\n semantic -= 0.1;\n lexical += 0.1;\n } else if (stats.avgScore > 0.75) {\n semantic += 0.05;\n lexical -= 0.05;\n }\n\n if (stats.unhelpful > stats.helpful) {\n recency += 0.05;\n semantic -= 0.03;\n lexical -= 0.02;\n }\n\n return { semantic, lexical, recency };\n } catch {\n return undefined;\n }\n }\n\n private async rewriteQueryIntent(query: string): Promise<string | null> {\n if (process.env.MEMORY_INTENT_REWRITE_ENABLED !== '1') return null;\n\n const apiUrl = process.env.COMPANY_STOCK_API_URL || process.env.COMPANY_INT_API_URL;\n if (!apiUrl) return null;\n\n const controller = new AbortController();\n const timeoutMs = Number(process.env.MEMORY_INTENT_REWRITE_TIMEOUT_MS || 5000);\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const prompt = [\n 'Rewrite user query for memory retrieval intent expansion.',\n 'Return plain text only, one line, no markdown.',\n `Query: ${query}`,\n ].join('\\n');\n\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Origin: process.env.COMPANY_INT_ORIGIN || 'http://company-int.aplusai.ai',\n Referer: process.env.COMPANY_INT_REFERER || 'http://company-int.aplusai.ai/',\n },\n body: JSON.stringify({\n question: prompt,\n company_name: null,\n conversation_id: null,\n }),\n signal: controller.signal,\n });\n\n const text = (await res.text()).trim();\n if (!text) return null;\n\n const oneLine = text\n .replace(/^data:\\s*/gm, '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(' ')\n .slice(0, 240);\n\n if (!oneLine || oneLine.toLowerCase() === query.toLowerCase()) return null;\n return oneLine;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nexport function createRetrievalOrchestrator(\n deps: RetrievalOrchestratorDeps\n): RetrievalOrchestrator {\n return new RetrievalOrchestrator(deps);\n}\n", "/**\n * Retrieval Services Bundle\n *\n * Owns construction and wiring for retrieval-facing engine services so\n * MemoryService can hold a thin facade boundary instead of directly\n * instantiating each retrieval collaborator.\n */\n\nimport type { Embedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport type { Matcher } from '../matcher.js';\nimport type { MemoryEvent } from '../types.js';\nimport {\n createRetriever as createCoreRetriever,\n type Retriever\n} from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createRetrievalAnalyticsService,\n type RetrievalAnalyticsService,\n type RetrievalAnalyticsStore\n} from './retrieval-analytics-service.js';\nimport {\n createRetrievalDisclosureService,\n type RetrievalDisclosureEventStore,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore\n} from './retrieval-disclosure-service.js';\nimport {\n createRetrievalOrchestrator,\n type RetrievalAccessStore,\n type RetrievalOrchestrator,\n type RetrievalTraceStore\n} from './retrieval-orchestrator.js';\n\nexport interface RetrievalSourceStore {\n getRecentEvents(limit?: number): Promise<MemoryEvent[]>;\n}\n\nexport type RetrievalEventStore = RetrievalTraceStore\n & RetrievalAccessStore\n & RetrievalDisclosureEventStore\n & RetrievalAnalyticsStore\n & RetrievalSourceStore;\n\nexport type CreateRetrieverFn = (\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n) => Retriever;\n\nexport interface RetrievalServicesDeps {\n initialize: () => Promise<void>;\n eventStore: RetrievalEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n sharedStore?: RetrievalDisclosureSharedStore;\n createRetriever?: CreateRetrieverFn;\n}\n\nexport interface RetrievalServices {\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n}\n\nexport function createRetrievalServices(deps: RetrievalServicesDeps): RetrievalServices {\n const retrieverFactory = deps.createRetriever ?? defaultCreateRetriever;\n const retriever = retrieverFactory(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder,\n deps.matcher\n );\n const retrievalOrchestrator = createRetrievalOrchestrator({\n initialize: deps.initialize,\n retriever,\n traceStore: deps.eventStore,\n accessStore: deps.eventStore,\n getProjectHash: deps.getProjectHash,\n hasSharedStore: deps.hasSharedStore\n });\n const retrievalDisclosureService = createRetrievalDisclosureService({\n initialize: deps.initialize,\n retrievalOrchestrator,\n eventStore: deps.eventStore,\n sharedStore: deps.sharedStore\n });\n const retrievalAnalyticsService = createRetrievalAnalyticsService({\n initialize: deps.initialize,\n retrievalStore: deps.eventStore\n });\n\n return {\n retriever,\n retrievalOrchestrator,\n retrievalDisclosureService,\n retrievalAnalyticsService\n };\n}\n\nfunction defaultCreateRetriever(\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n assertDefaultRetrieverStore(eventStore);\n return createCoreRetriever(\n eventStore as unknown as EventStore,\n vectorStore,\n embedder,\n matcher\n );\n}\n\nfunction assertDefaultRetrieverStore(eventStore: RetrievalEventStore): void {\n const store = eventStore as unknown as Record<string, unknown>;\n for (const method of ['getEvent', 'getSessionEvents', 'getRecentEvents']) {\n if (typeof store[method] !== 'function') {\n throw new TypeError(`Default retrieval service eventStore requires ${method}()`);\n }\n }\n}\n\nexport {\n RetrievalAnalyticsService,\n createRetrievalAnalyticsService\n} from './retrieval-analytics-service.js';\nexport type {\n AccessedMemory,\n HelpfulMemory,\n HelpfulnessStats,\n RetrievalAnalyticsServiceDeps,\n RetrievalAnalyticsStore,\n RetrievalTrace,\n RetrievalTraceStats\n} from './retrieval-analytics-service.js';\nexport {\n RetrievalDisclosureService,\n createRetrievalDisclosureService,\n parseDisclosureResultId,\n parseDisclosureResultRef,\n toDisclosureResultId\n} from './retrieval-disclosure-service.js';\nexport type {\n RetrievalDisclosureEnvelope,\n RetrievalDisclosureEventStore,\n RetrievalDisclosureExpansion,\n RetrievalDisclosureExpandOptions,\n RetrievalDisclosureOrchestrator,\n RetrievalDisclosureReason,\n RetrievalDisclosureSearchOptions,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureServiceDeps,\n RetrievalDisclosureSharedStore,\n RetrievalDisclosureSource,\n RetrievalDisclosureSourceReference,\n RetrievalDisclosureSourceType\n} from './retrieval-disclosure-service.js';\nexport {\n RetrievalOrchestrator,\n createRetrievalOrchestrator\n} from './retrieval-orchestrator.js';\nexport type {\n RecordQueryTraceInput,\n RetrievalAccessStore,\n RetrievalOrchestratorDeps,\n RetrievalTraceStore,\n RetrieveMemoriesOptions\n} from './retrieval-orchestrator.js';\n", "/**\n * Graduation Worker\n * Periodically evaluates memory events for promotion to higher levels\n * L0 \u2192 L1 \u2192 L2 \u2192 L3 \u2192 L4 based on access patterns and confidence\n */\n\nimport type { MemoryLevel } from './types.js';\nimport { EventStore } from './event-store.js';\nimport { GraduationPipeline } from './graduation.js';\n\nexport interface GraduationWorkerConfig {\n /** How often to run graduation evaluation (ms) */\n evaluationIntervalMs: number;\n /** Batch size for graduation evaluation */\n batchSize: number;\n /** Minimum time between evaluations of the same event (ms) */\n cooldownMs: number;\n}\n\nconst DEFAULT_CONFIG: GraduationWorkerConfig = {\n evaluationIntervalMs: 300000, // 5 minutes\n batchSize: 50,\n cooldownMs: 3600000 // 1 hour cooldown between evaluations\n};\n\nexport class GraduationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastEvaluated: Map<string, number> = new Map();\n\n constructor(\n private eventStore: EventStore,\n private graduation: GraduationPipeline,\n private config: GraduationWorkerConfig = DEFAULT_CONFIG\n ) {}\n\n /**\n * Start the graduation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the graduation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceRun(): Promise<GraduationRunResult> {\n return await this.runGraduation();\n }\n\n /**\n * Schedule the next graduation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.evaluationIntervalMs\n );\n }\n\n /**\n * Run graduation evaluation\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.runGraduation();\n } catch (error) {\n console.error('Graduation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Perform graduation evaluation across all levels\n */\n private async runGraduation(): Promise<GraduationRunResult> {\n const result: GraduationRunResult = {\n evaluated: 0,\n graduated: 0,\n byLevel: {}\n };\n\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3'];\n const now = Date.now();\n\n for (const level of levels) {\n const events = await this.eventStore.getEventsByLevel(level, {\n limit: this.config.batchSize\n });\n\n let levelGraduated = 0;\n\n for (const event of events) {\n // Check cooldown\n const lastEval = this.lastEvaluated.get(event.id);\n if (lastEval && (now - lastEval) < this.config.cooldownMs) {\n continue;\n }\n\n result.evaluated++;\n this.lastEvaluated.set(event.id, now);\n\n const gradResult = await this.graduation.evaluateGraduation(event.id, level);\n\n if (gradResult.success) {\n result.graduated++;\n levelGraduated++;\n }\n }\n\n if (levelGraduated > 0) {\n result.byLevel[level] = levelGraduated;\n }\n }\n\n // Clean up old cooldown entries (keep last 1000)\n if (this.lastEvaluated.size > 1000) {\n const entries = Array.from(this.lastEvaluated.entries());\n entries.sort((a, b) => b[1] - a[1]);\n this.lastEvaluated = new Map(entries.slice(0, 1000));\n }\n\n return result;\n }\n}\n\nexport interface GraduationRunResult {\n evaluated: number;\n graduated: number;\n byLevel: Record<string, number>;\n}\n\n/**\n * Create a Graduation Worker instance\n */\nexport function createGraduationWorker(\n eventStore: EventStore,\n graduation: GraduationPipeline,\n config?: Partial<GraduationWorkerConfig>\n): GraduationWorker {\n return new GraduationWorker(\n eventStore,\n graduation,\n { ...DEFAULT_CONFIG, ...config }\n );\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent)\n */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await dbRun(\n this.db,\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed, but only if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n } catch (failError) {\n // Database might be closed during shutdown, ignore\n console.warn('Could not mark outbox items as failed (database may be closed)');\n }\n }\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n // Only try to mark as failed if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n } catch {\n // Database might be closed during shutdown, ignore\n }\n }\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker V2 error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * Memory Runtime Service\n * Owns MemoryService lifecycle concerns: initialization, background workers,\n * lightweight/read-only modes, and orderly shutdown.\n */\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport {\n createGraduationWorker as defaultCreateGraduationWorker,\n type GraduationRunResult,\n type GraduationWorker\n} from '../graduation-worker.js';\nimport type { Retriever } from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createVectorWorker as defaultCreateVectorWorker,\n type VectorWorker\n} from '../vector-worker.js';\n\nexport interface RuntimeSQLiteStore {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface RuntimeEndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n shutdown(): void;\n}\n\nexport interface RuntimeSharedMemoryServices {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface MemoryRuntimeServicesFactories {\n createVectorWorker?: typeof defaultCreateVectorWorker;\n createGraduationWorker?: typeof defaultCreateGraduationWorker;\n}\n\nexport interface MemoryRuntimeServicesDeps {\n sqliteStore: RuntimeSQLiteStore;\n eventStore: EventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n graduation: GraduationPipeline;\n endlessMemoryServices: RuntimeEndlessMemoryServices;\n sharedMemoryServices: RuntimeSharedMemoryServices;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n factories?: MemoryRuntimeServicesFactories;\n}\n\nexport interface MemoryRuntimeService {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n processPendingEmbeddings(): Promise<number>;\n forceGraduation(): Promise<GraduationRunResult>;\n recordMemoryAccess(eventId: string, sessionId: string, confidence?: number): void;\n getVectorWorker(): VectorWorker | null;\n isInitialized(): boolean;\n}\n\nfunction createEmptyGraduationResult(): GraduationRunResult {\n return { evaluated: 0, graduated: 0, byLevel: {} };\n}\n\nexport function createMemoryRuntimeService(deps: MemoryRuntimeServicesDeps): MemoryRuntimeService {\n const createVectorWorker = deps.factories?.createVectorWorker ?? defaultCreateVectorWorker;\n const createGraduationWorker = deps.factories?.createGraduationWorker ?? defaultCreateGraduationWorker;\n\n let initialized = false;\n let vectorWorker: VectorWorker | null = null;\n let graduationWorker: GraduationWorker | null = null;\n\n return {\n async initialize(): Promise<void> {\n if (initialized) return;\n\n // Initialize PRIMARY store: SQLite (always)\n await deps.sqliteStore.initialize();\n\n // Lightweight mode: only SQLite, no embedder/vector/workers.\n // Used for hooks that just need to store data quickly.\n if (deps.lightweightMode) {\n initialized = true;\n return;\n }\n\n await deps.vectorStore.initialize();\n await deps.embedder.initialize();\n\n // Skip write-related workers in read-only mode.\n if (!deps.readOnly) {\n vectorWorker = createVectorWorker(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorker.start();\n\n if (!deps.embeddingOnly) {\n deps.retriever.setGraduationPipeline(deps.graduation);\n graduationWorker = createGraduationWorker(\n deps.eventStore,\n deps.graduation\n );\n graduationWorker.start();\n }\n\n await deps.endlessMemoryServices.initializeFromSavedMode();\n await deps.sharedMemoryServices.initialize();\n }\n\n initialized = true;\n },\n\n async shutdown(): Promise<void> {\n if (graduationWorker) {\n graduationWorker.stop();\n }\n\n deps.endlessMemoryServices.shutdown();\n\n if (vectorWorker) {\n vectorWorker.stop();\n }\n\n await deps.sharedMemoryServices.close();\n await deps.sqliteStore.close();\n },\n\n async processPendingEmbeddings(): Promise<number> {\n if (vectorWorker) {\n return vectorWorker.processAll();\n }\n return 0;\n },\n\n async forceGraduation(): Promise<GraduationRunResult> {\n if (!graduationWorker) {\n return createEmptyGraduationResult();\n }\n return graduationWorker.forceRun();\n },\n\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n deps.graduation.recordAccess(eventId, sessionId, confidence);\n },\n\n getVectorWorker(): VectorWorker | null {\n return vectorWorker;\n },\n\n isInitialized(): boolean {\n return initialized;\n }\n };\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Embedder } from '../vector/index.js';\nimport { createSharedEventStore, type SharedEventStore } from '../../core/shared-event-store.js';\nimport { createSharedPromoter, type PromotionResult, type SharedPromoter } from '../../core/shared-promoter.js';\nimport { createSharedStore, type SharedStore } from '../../core/shared-store.js';\nimport { createSharedVectorStore, type SharedVectorStore } from '../../core/shared-vector-store.js';\nimport type { Entry, SharedStoreConfig, SharedTroubleshootingEntry } from '../../core/types.js';\n\nexport interface SharedMemoryRetriever {\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void;\n}\n\nexport interface SharedMemoryServicesFactories {\n existsSync?: (targetPath: string) => boolean;\n mkdirSync?: (targetPath: string) => void;\n createSharedEventStore?: (dbPath: string) => SharedEventStore;\n createSharedStore?: (sharedEventStore: SharedEventStore) => SharedStore;\n createSharedVectorStore?: (dbPath: string) => SharedVectorStore;\n createSharedPromoter?: (\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n ) => SharedPromoter;\n}\n\nexport interface SharedMemoryServicesOptions {\n config: SharedStoreConfig | null;\n defaultSharedStoragePath: string;\n readOnly: boolean;\n expandPath: (targetPath: string) => string;\n embedder: Embedder;\n retriever: SharedMemoryRetriever;\n factories?: SharedMemoryServicesFactories;\n}\n\nexport type SharedStoreStats = {\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n};\n\nexport class SharedMemoryServices {\n private sharedEventStore: SharedEventStore | null = null;\n private sharedStore: SharedStore | null = null;\n private sharedVectorStore: SharedVectorStore | null = null;\n private sharedPromoter: SharedPromoter | null = null;\n private openStorePromise: Promise<SharedStore> | null = null;\n\n constructor(private readonly options: SharedMemoryServicesOptions) {}\n\n get eventStore(): SharedEventStore | null {\n return this.sharedEventStore;\n }\n\n get store(): SharedStore | null {\n return this.sharedStore;\n }\n\n get vectorStore(): SharedVectorStore | null {\n return this.sharedVectorStore;\n }\n\n get promoter(): SharedPromoter | null {\n return this.sharedPromoter;\n }\n\n isEnabled(): boolean {\n return this.sharedStore !== null;\n }\n\n getSharedStoragePath(): string {\n return this.options.config?.sharedStoragePath\n ? this.options.expandPath(this.options.config.sharedStoragePath)\n : this.options.defaultSharedStoragePath;\n }\n\n async initialize(): Promise<void> {\n if (this.options.config?.enabled === false || this.options.readOnly) return;\n\n const sharedPath = this.getSharedStoragePath();\n this.ensureDirectory(sharedPath, { allowCreate: true });\n\n const store = await this.openStore(sharedPath);\n\n this.sharedVectorStore = this.factories.createSharedVectorStore(\n path.join(sharedPath, 'vectors')\n );\n await this.sharedVectorStore.initialize();\n\n this.sharedPromoter = this.factories.createSharedPromoter(\n store,\n this.sharedVectorStore,\n this.options.embedder,\n this.options.config || undefined\n );\n\n this.options.retriever.setSharedStores(store, this.sharedVectorStore);\n }\n\n async ensureStoreForRead(): Promise<SharedStore | null> {\n if (this.options.config?.enabled === false) return null;\n if (this.sharedStore) return this.sharedStore;\n\n const sharedPath = this.getSharedStoragePath();\n const directoryReady = this.ensureDirectory(sharedPath, { allowCreate: !this.options.readOnly });\n if (!directoryReady) return null;\n\n return this.openStore(sharedPath);\n }\n\n async getEntryForDisclosure(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const store = await this.ensureStoreForRead();\n return store?.get(entryId) ?? null;\n }\n\n async promoteToShared(entry: Entry, projectHash: string | null): Promise<PromotionResult> {\n if (!this.sharedPromoter || !projectHash) {\n return {\n success: false,\n error: 'Shared store not initialized or project hash not set'\n };\n }\n\n return this.sharedPromoter.promoteEntry(entry, projectHash);\n }\n\n async getStats(): Promise<SharedStoreStats | null> {\n if (!this.sharedStore) return null;\n return this.sharedStore.getStats();\n }\n\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n if (!this.sharedStore) return [];\n return this.sharedStore.search(query, options);\n }\n\n async close(): Promise<void> {\n if (this.openStorePromise) {\n await this.openStorePromise.catch(() => null);\n }\n\n if (this.sharedEventStore) {\n await this.sharedEventStore.close();\n }\n this.sharedEventStore = null;\n this.sharedStore = null;\n this.sharedVectorStore = null;\n this.sharedPromoter = null;\n this.openStorePromise = null;\n }\n\n private async openStore(sharedPath: string): Promise<SharedStore> {\n if (this.sharedStore) return this.sharedStore;\n\n if (!this.openStorePromise) {\n this.openStorePromise = this.createOpenStorePromise(sharedPath);\n }\n\n try {\n return await this.openStorePromise;\n } finally {\n this.openStorePromise = null;\n }\n }\n\n private async createOpenStorePromise(sharedPath: string): Promise<SharedStore> {\n if (!this.sharedEventStore) {\n const sharedEventStore = this.factories.createSharedEventStore(\n path.join(sharedPath, 'shared.duckdb')\n );\n await sharedEventStore.initialize();\n this.sharedEventStore = sharedEventStore;\n }\n\n if (!this.sharedStore) {\n this.sharedStore = this.factories.createSharedStore(this.sharedEventStore);\n }\n\n return this.sharedStore;\n }\n\n private ensureDirectory(sharedPath: string, options: { allowCreate: boolean }): boolean {\n if (this.factories.existsSync(sharedPath)) return true;\n if (!options.allowCreate) return false;\n this.factories.mkdirSync(sharedPath);\n return true;\n }\n\n private get factories(): Required<SharedMemoryServicesFactories> {\n return {\n existsSync: this.options.factories?.existsSync ?? fs.existsSync,\n mkdirSync: this.options.factories?.mkdirSync ?? ((targetPath: string) => {\n fs.mkdirSync(targetPath, { recursive: true });\n }),\n createSharedEventStore: this.options.factories?.createSharedEventStore ?? createSharedEventStore,\n createSharedStore: this.options.factories?.createSharedStore ?? createSharedStore,\n createSharedVectorStore: this.options.factories?.createSharedVectorStore ?? createSharedVectorStore,\n createSharedPromoter: this.options.factories?.createSharedPromoter ?? createSharedPromoter\n };\n }\n}\n\nexport function createSharedMemoryServices(options: SharedMemoryServicesOptions): SharedMemoryServices {\n return new SharedMemoryServices(options);\n}\n", "/**\n * SharedEventStore - Global database for cross-project knowledge\n * Location: ~/.claude-code/memory/shared/\n */\n\nimport {\n createDatabase,\n dbRun,\n dbClose,\n type Database\n} from './db-wrapper.js';\n\nexport class SharedEventStore {\n private db: Database;\n private initialized = false;\n\n constructor(dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Shared troubleshooting entries table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_troubleshooting (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n symptoms JSON NOT NULL,\n root_cause TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n last_used_at TIMESTAMP,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: best practices table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_best_practices (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n topics JSON NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: common errors table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_common_errors (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n error_pattern TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Indexes for troubleshooting\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence\n ON shared_troubleshooting(confidence DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_usage\n ON shared_troubleshooting(usage_count DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_source\n ON shared_troubleshooting(source_project_hash)\n `);\n\n this.initialized = true;\n }\n\n getDatabase(): Database {\n return this.db;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async close(): Promise<void> {\n await dbClose(this.db);\n this.initialized = false;\n }\n}\n\nexport function createSharedEventStore(dbPath: string): SharedEventStore {\n return new SharedEventStore(dbPath);\n}\n", "/**\n * SharedPromoter - Handles auto-promotion of verified troubleshooting entries\n * Promotes entries from project-local storage to cross-project shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { Entry, SharedTroubleshootingInput, SharedStoreConfig } from './types.js';\n\nexport interface TroubleshootingContent {\n symptoms?: string[];\n rootCause?: string;\n solution?: string;\n technologies?: string[];\n}\n\nexport interface PromotionResult {\n success: boolean;\n entryId?: string;\n error?: string;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport class SharedPromoter {\n constructor(\n private sharedStore: SharedStore,\n private sharedVectorStore: SharedVectorStore,\n private embedder: Embedder,\n private config?: SharedStoreConfig\n ) {}\n\n /**\n * Check if an entry is eligible for promotion\n */\n isEligibleForPromotion(entry: Entry): boolean {\n // Must be troubleshooting type\n if (entry.entryType !== 'troubleshooting') {\n return false;\n }\n\n // Must be at least 'verified' stage\n if (entry.stage !== 'verified' && entry.stage !== 'certified') {\n return false;\n }\n\n // Must be active status\n if (entry.status !== 'active') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n entry: Entry,\n projectHash: string\n ): Promise<PromotionResult> {\n // Validate eligibility\n if (!this.isEligibleForPromotion(entry)) {\n return {\n success: false,\n skipped: true,\n skipReason: `Entry not eligible: type=${entry.entryType}, stage=${entry.stage}, status=${entry.status}`\n };\n }\n\n // Check if already promoted\n const exists = await this.sharedStore.exists(projectHash, entry.entryId);\n if (exists) {\n return {\n success: true,\n skipped: true,\n skipReason: 'Entry already exists in shared store'\n };\n }\n\n try {\n const content = entry.contentJson as TroubleshootingContent;\n const confidence = this.calculateConfidence(entry);\n\n // Check minimum confidence threshold\n const minConfidence = this.config?.minConfidenceForPromotion ?? 0.8;\n if (confidence < minConfidence) {\n return {\n success: false,\n skipped: true,\n skipReason: `Confidence ${confidence} below threshold ${minConfidence}`\n };\n }\n\n const input: SharedTroubleshootingInput = {\n sourceProjectHash: projectHash,\n sourceEntryId: entry.entryId,\n title: entry.title,\n symptoms: content.symptoms || [],\n rootCause: content.rootCause || '',\n solution: content.solution || '',\n topics: this.extractTopics(entry),\n technologies: content.technologies || [],\n confidence\n };\n\n // Promote to shared store\n const entryId = await this.sharedStore.promoteEntry(input);\n\n // Create embedding for vector search\n const embeddingContent = this.createEmbeddingContent(input);\n const embedding = await this.embedder.embed(embeddingContent);\n\n await this.sharedVectorStore.upsert({\n id: randomUUID(),\n entryId,\n entryType: 'troubleshooting',\n content: embeddingContent,\n vector: embedding.vector,\n topics: input.topics,\n sourceProjectHash: projectHash\n });\n\n return {\n success: true,\n entryId\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Batch promote multiple entries\n */\n async promoteEntries(\n entries: Entry[],\n projectHash: string\n ): Promise<Map<string, PromotionResult>> {\n const results = new Map<string, PromotionResult>();\n\n for (const entry of entries) {\n const result = await this.promoteEntry(entry, projectHash);\n results.set(entry.entryId, result);\n }\n\n return results;\n }\n\n /**\n * Extract topics from entry\n */\n private extractTopics(entry: Entry): string[] {\n const topics: string[] = [];\n\n // Extract from title (meaningful words)\n const titleWords = entry.title\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter(w => w.length > 3 && !this.isStopWord(w));\n topics.push(...titleWords);\n\n // Extract from content if available\n const content = entry.contentJson as Record<string, unknown>;\n if (content.topics && Array.isArray(content.topics)) {\n topics.push(...content.topics.map(t => String(t).toLowerCase()));\n }\n\n // Extract technologies as topics\n if (content.technologies && Array.isArray(content.technologies)) {\n topics.push(...content.technologies.map(t => String(t).toLowerCase()));\n }\n\n // Dedupe and return\n return [...new Set(topics)];\n }\n\n /**\n * Check if word is a stop word\n */\n private isStopWord(word: string): boolean {\n const stopWords = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have', 'been',\n 'were', 'are', 'was', 'had', 'has', 'will', 'would', 'could', 'should',\n 'when', 'where', 'what', 'which', 'while', 'error', 'problem', 'issue'\n ]);\n return stopWords.has(word);\n }\n\n /**\n * Calculate confidence score for entry\n */\n private calculateConfidence(entry: Entry): number {\n let confidence = 0.8; // Base confidence for verified entries\n\n // Boost if certified\n if (entry.stage === 'certified') {\n confidence = 0.95;\n }\n\n // Could add more factors:\n // - Number of evidence items\n // - Age of entry (older verified entries may be more reliable)\n // - Usage count if tracked\n\n return Math.min(confidence, 1.0);\n }\n\n /**\n * Create embedding content from input\n */\n private createEmbeddingContent(input: SharedTroubleshootingInput): string {\n const parts: string[] = [];\n\n parts.push(`Problem: ${input.title}`);\n\n if (input.symptoms.length > 0) {\n parts.push(`Symptoms: ${input.symptoms.join(', ')}`);\n }\n\n if (input.rootCause) {\n parts.push(`Root Cause: ${input.rootCause}`);\n }\n\n if (input.solution) {\n parts.push(`Solution: ${input.solution}`);\n }\n\n if (input.technologies && input.technologies.length > 0) {\n parts.push(`Technologies: ${input.technologies.join(', ')}`);\n }\n\n return parts.join('\\n');\n }\n}\n\nexport function createSharedPromoter(\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n): SharedPromoter {\n return new SharedPromoter(sharedStore, sharedVectorStore, embedder, config);\n}\n", "/**\n * SharedStore - Cross-project troubleshooting knowledge store\n * Manages promotion from verified entries to shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n SharedTroubleshootingEntry,\n SharedTroubleshootingInput\n} from './types.js';\nimport { SharedEventStore } from './shared-event-store.js';\n\nexport class SharedStore {\n constructor(private sharedEventStore: SharedEventStore) {}\n\n private get db(): Database {\n return this.sharedEventStore.getDatabase();\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n input: SharedTroubleshootingInput\n ): Promise<string> {\n const entryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO shared_troubleshooting (\n entry_id, source_project_hash, source_entry_id,\n title, symptoms, root_cause, solution, topics,\n technologies, confidence, promoted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (source_project_hash, source_entry_id)\n DO UPDATE SET\n title = excluded.title,\n symptoms = excluded.symptoms,\n root_cause = excluded.root_cause,\n solution = excluded.solution,\n topics = excluded.topics,\n technologies = excluded.technologies,\n confidence = CASE\n WHEN excluded.confidence > shared_troubleshooting.confidence\n THEN excluded.confidence\n ELSE shared_troubleshooting.confidence\n END`,\n [\n entryId,\n input.sourceProjectHash,\n input.sourceEntryId,\n input.title,\n JSON.stringify(input.symptoms),\n input.rootCause,\n input.solution,\n JSON.stringify(input.topics),\n JSON.stringify(input.technologies || []),\n input.confidence\n ]\n );\n\n return entryId;\n }\n\n /**\n * Search troubleshooting entries by text query\n */\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n const minConfidence = options?.minConfidence || 0.5;\n const searchPattern = `%${query}%`;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE (title LIKE ? OR root_cause LIKE ? OR solution LIKE ?)\n AND confidence >= ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [searchPattern, searchPattern, searchPattern, minConfidence, topK]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(\n topics: string[],\n options?: { topK?: number; excludeProjectHash?: string }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n\n if (topics.length === 0) {\n return [];\n }\n\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n let query = `SELECT * FROM shared_troubleshooting WHERE (${topicConditions})`;\n const params: unknown[] = [...topicParams];\n\n if (options?.excludeProjectHash) {\n query += ` AND source_project_hash != ?`;\n params.push(options.excludeProjectHash);\n }\n\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(topK);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Record usage of a shared entry (for ranking)\n */\n async recordUsage(entryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE shared_troubleshooting\n SET usage_count = usage_count + 1,\n last_used_at = CURRENT_TIMESTAMP\n WHERE entry_id = ?`,\n [entryId]\n );\n }\n\n /**\n * Get entry by ID\n */\n async get(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Get entry by source (project hash + entry ID)\n */\n async getBySource(\n projectHash: string,\n sourceEntryId: string\n ): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Check if an entry already exists in shared store\n */\n async exists(projectHash: string, sourceEntryId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Get all entries (with limit for safety)\n */\n async getAll(options?: { limit?: number }): Promise<SharedTroubleshootingEntry[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get statistics\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n }> {\n const countResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n const total = countResult[0]?.count || 0;\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM shared_troubleshooting`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const usageResult = await dbAll<{ total: number }>(\n this.db,\n `SELECT SUM(usage_count) as total FROM shared_troubleshooting`\n );\n const totalUsageCount = usageResult[0]?.total || 0;\n\n // Get topic counts\n const entries = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const entry of entries) {\n for (const topic of entry.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n const topTopics = Object.entries(topicCounts)\n .map(([topic, count]) => ({ topic, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return { total, averageConfidence, topTopics, totalUsageCount };\n }\n\n /**\n * Delete an entry\n */\n async delete(entryId: string): Promise<boolean> {\n const before = await this.count();\n await dbRun(\n this.db,\n `DELETE FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n const after = await this.count();\n return before > after;\n }\n\n private rowToEntry(row: Record<string, unknown>): SharedTroubleshootingEntry {\n return {\n entryId: row.entry_id as string,\n sourceProjectHash: row.source_project_hash as string,\n sourceEntryId: row.source_entry_id as string,\n title: row.title as string,\n symptoms: JSON.parse(row.symptoms as string || '[]'),\n rootCause: row.root_cause as string,\n solution: row.solution as string,\n topics: JSON.parse(row.topics as string || '[]'),\n technologies: JSON.parse(row.technologies as string || '[]'),\n confidence: row.confidence as number,\n usageCount: row.usage_count as number || 0,\n lastUsedAt: row.last_used_at ? toDate(row.last_used_at) : undefined,\n promotedAt: toDate(row.promoted_at),\n createdAt: toDate(row.created_at)\n };\n }\n}\n\nexport function createSharedStore(\n sharedEventStore: SharedEventStore\n): SharedStore {\n return new SharedStore(sharedEventStore);\n}\n", "/**\n * SharedVectorStore - Vector store for cross-project semantic search\n * Location: ~/.claude-code/memory/shared/vectors/\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { SharedEntryType, SharedSearchResult } from './types.js';\n\nexport interface SharedVectorRecord {\n id: string;\n entryId: string;\n entryType: SharedEntryType;\n content: string;\n vector: number[];\n topics: string[];\n sourceProjectHash?: string;\n}\n\nexport class SharedVectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'shared_knowledge';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n this.table = null;\n }\n }\n\n /**\n * Add or update a shared vector record\n */\n async upsert(record: SharedVectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n };\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n // Delete existing entry before adding (upsert behavior)\n try {\n await this.table.delete(`entryId = '${record.entryId}'`);\n } catch {\n // Entry might not exist, ignore\n }\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple records in batch\n */\n async upsertBatch(records: SharedVectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n excludeProjectHash?: string;\n entryType?: SharedEntryType;\n } = {}\n ): Promise<SharedSearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, excludeProjectHash, entryType } = options;\n\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2);\n\n // Apply filters\n const filters: string[] = [];\n if (excludeProjectHash) {\n filters.push(`sourceProjectHash != '${excludeProjectHash}'`);\n }\n if (entryType) {\n filters.push(`entryType = '${entryType}'`);\n }\n\n if (filters.length > 0) {\n query = query.where(filters.join(' AND '));\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n entryId: r.entryId as string,\n content: r.content as string,\n score,\n entryType: r.entryType as SharedEntryType\n };\n });\n }\n\n /**\n * Delete vector by entry ID\n */\n async delete(entryId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`entryId = '${entryId}'`);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n return this.table.countRows();\n }\n\n /**\n * Check if vector exists for entry\n */\n async exists(entryId: string): Promise<boolean> {\n if (!this.table) return false;\n\n try {\n const results = await this.table\n .search([])\n .where(`entryId = '${entryId}'`)\n .limit(1)\n .toArray();\n return results.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createSharedVectorStore(dbPath: string): SharedVectorStore {\n return new SharedVectorStore(dbPath);\n}\n", "/**\n * Project path registry utilities.\n *\n * These helpers are intentionally core-level and Claude-agnostic.\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Normalize and resolve a project path, handling symlinks when possible.\n */\nexport function normalizeProjectPath(projectPath: string): string {\n const expanded = projectPath.startsWith('~')\n ? path.join(os.homedir(), projectPath.slice(1))\n : projectPath;\n\n try {\n return fs.realpathSync(expanded);\n } catch {\n return path.resolve(expanded);\n }\n}\n\n/**\n * Generate a stable 8-character hash from a normalized project path.\n */\nexport function hashProjectPath(projectPath: string): string {\n const normalizedPath = normalizeProjectPath(projectPath);\n return crypto.createHash('sha256')\n .update(normalizedPath)\n .digest('hex')\n .slice(0, 8);\n}\n\n/**\n * Get the storage path for a project-local memory database.\n */\nexport function getProjectStoragePath(projectPath: string): string {\n const hash = hashProjectPath(projectPath);\n return path.join(os.homedir(), '.claude-code', 'memory', 'projects', hash);\n}\n\n/**\n * Resolve either an explicit project hash or a project path into a storage path.\n */\nexport function resolveProjectStoragePath(projectOrHash: string): string {\n const isHash = /^[a-f0-9]{8}$/.test(projectOrHash);\n return isHash\n ? path.join(os.homedir(), '.claude-code', 'memory', 'projects', projectOrHash)\n : getProjectStoragePath(projectOrHash);\n}\n", "/**\n * Session registry for mapping Claude session IDs to project-local storage.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { hashProjectPath, normalizeProjectPath } from './project-path.js';\n\nconst REGISTRY_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'session-registry.json');\n\nexport interface SessionRegistryEntry {\n projectPath: string;\n projectHash: string;\n registeredAt: string;\n}\n\nexport interface SessionRegistry {\n version: number;\n sessions: Record<string, SessionRegistryEntry>;\n}\n\nexport function loadSessionRegistry(): SessionRegistry {\n try {\n if (fs.existsSync(REGISTRY_PATH)) {\n const data = fs.readFileSync(REGISTRY_PATH, 'utf-8');\n return JSON.parse(data);\n }\n } catch (error) {\n console.error('Failed to load session registry:', error);\n }\n return { version: 1, sessions: {} };\n}\n\nfunction saveSessionRegistry(registry: SessionRegistry): void {\n const dir = path.dirname(REGISTRY_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = REGISTRY_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(registry, null, 2));\n fs.renameSync(tempPath, REGISTRY_PATH);\n}\n\nexport function registerSession(sessionId: string, projectPath: string): void {\n const registry = loadSessionRegistry();\n\n registry.sessions[sessionId] = {\n projectPath: normalizeProjectPath(projectPath),\n projectHash: hashProjectPath(projectPath),\n registeredAt: new Date().toISOString()\n };\n\n const entries = Object.entries(registry.sessions);\n if (entries.length > 1000) {\n const sorted = entries.sort((a, b) =>\n new Date(b[1].registeredAt).getTime() - new Date(a[1].registeredAt).getTime()\n );\n registry.sessions = Object.fromEntries(sorted.slice(0, 1000));\n }\n\n saveSessionRegistry(registry);\n}\n\nexport function getSessionProject(sessionId: string): SessionRegistryEntry | null {\n const registry = loadSessionRegistry();\n return registry.sessions[sessionId] || null;\n}\n", "import * as os from 'os';\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n /** Enable DuckDB analytics store (default: true for server, false for hooks) */\n analyticsEnabled?: boolean;\n /** Lightweight mode for hooks - skip heavy initialization (default: false) */\n lightweightMode?: boolean;\n /** Start only VectorWorker, skip GraduationWorker and SyncWorker (default: false) */\n embeddingOnly?: boolean;\n}\n\nconst SHARED_STORAGE_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'shared');\n\nexport const DISABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: false,\n autoPromote: false,\n searchShared: false,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_ENABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_SHARED_STORAGE_PATH = SHARED_STORAGE_PATH;\n", "/**\n * Memory Service Registry\n *\n * Owns process-local MemoryService instance caching and project/session service\n * resolution. Keeping this out of MemoryService prevents the compatibility\n * facade from also being the application-level service locator.\n */\n\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\nimport type { MemoryServiceConfig } from './memory-service-config.js';\n\nexport type MemoryServiceRegistryConfig = MemoryServiceConfig & {\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n};\n\nexport interface MemoryServiceRegistryDeps<TService> {\n createService: (config: MemoryServiceRegistryConfig) => TService;\n hashProjectPath: (projectPath: string) => string;\n getProjectStoragePath: (projectPath: string) => string;\n getSessionProject: (sessionId: string) => { projectHash: string; projectPath: string } | null;\n homedir: () => string;\n disabledSharedStoreConfig: SharedStoreConfig;\n serviceCache?: Map<string, TService>;\n}\n\nexport interface MemoryServiceRegistry<TService> {\n getDefaultMemoryService(): TService;\n getReadOnlyMemoryService(): TService;\n getMemoryServiceForProject(projectPath: string, sharedStoreConfig?: SharedStoreConfig): TService;\n getMemoryServiceForSession(sessionId: string): TService;\n getLightweightMemoryService(sessionId: string): TService;\n getLightweightMemoryServiceForProject(projectPath: string): TService;\n createMemoryService(config: MemoryServiceConfig): TService;\n}\n\nconst GLOBAL_KEY = '__global__';\n\nexport function createMemoryServiceRegistry<TService>(\n deps: MemoryServiceRegistryDeps<TService>\n): MemoryServiceRegistry<TService> {\n const serviceCache = deps.serviceCache ?? new Map<string, TService>();\n\n const getDefaultMemoryService = (): TService => {\n if (!serviceCache.has(GLOBAL_KEY)) {\n serviceCache.set(GLOBAL_KEY, deps.createService({\n storagePath: '~/.claude-code/memory',\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n return serviceCache.get(GLOBAL_KEY)!;\n };\n\n const getReadOnlyMemoryService = (): TService => deps.createService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n });\n\n const getMemoryServiceForProject = (\n projectPath: string,\n sharedStoreConfig?: SharedStoreConfig\n ): TService => {\n const hash = deps.hashProjectPath(projectPath);\n\n if (!serviceCache.has(hash)) {\n serviceCache.set(hash, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash: hash,\n projectPath,\n sharedStoreConfig: sharedStoreConfig ?? deps.disabledSharedStoreConfig,\n analyticsEnabled: false\n }));\n }\n\n // Project services are keyed only by project hash. This intentionally means\n // the first sharedStoreConfig used for a project wins; later calls for the\n // same project reuse the cached instance to preserve historical lock/cache\n // semantics instead of replacing the service graph under existing callers.\n return serviceCache.get(hash)!;\n };\n\n const getMemoryServiceForSession = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n\n if (projectInfo) {\n return getMemoryServiceForProject(projectInfo.projectPath);\n }\n\n return getDefaultMemoryService();\n };\n\n const getOrCreateLightweightProjectService = (\n projectHash: string,\n projectPath: string\n ): TService => {\n const key = `lightweight_${projectHash}`;\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash,\n projectPath,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryService = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n if (projectInfo) {\n return getOrCreateLightweightProjectService(projectInfo.projectHash, projectInfo.projectPath);\n }\n\n const key = 'lightweight_global';\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: path.join(deps.homedir(), '.claude-code', 'memory'),\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryServiceForProject = (projectPath: string): TService => {\n const projectHash = deps.hashProjectPath(projectPath);\n return getOrCreateLightweightProjectService(projectHash, projectPath);\n };\n\n return {\n getDefaultMemoryService,\n getReadOnlyMemoryService,\n getMemoryServiceForProject,\n getMemoryServiceForSession,\n getLightweightMemoryService,\n getLightweightMemoryServiceForProject,\n createMemoryService: (config: MemoryServiceConfig): TService => deps.createService(config)\n };\n}\n", "/**\n * Session History Importer\n * Imports existing Claude Code conversation history into memory\n *\n * Claude Code stores session history in:\n * ~/.claude/projects/<project-hash>/<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { randomUUID } from 'crypto';\nimport { MemoryService } from './memory-service.js';\nimport { registerSession } from '../core/registry/session-registry.js';\n\nexport type ProgressEvent =\n | { phase: 'scan'; message: string }\n | { phase: 'session-start'; sessionIndex: number; totalSessions: number; filePath: string }\n | { phase: 'session-progress'; sessionIndex: number; messagesProcessed: number; imported: number; skipped: number }\n | { phase: 'session-done'; sessionIndex: number; importedPrompts: number; importedResponses: number; skipped: number }\n | { phase: 'embedding'; processed: number; total: number }\n | { phase: 'done'; result: ImportResult };\n\nexport interface ImportOptions {\n projectPath?: string;\n sessionId?: string;\n limit?: number;\n /** Limit how many matching sessions are imported. Useful for freshness jobs that only need the latest active session. */\n sessionLimit?: number;\n skipExisting?: boolean;\n force?: boolean;\n verbose?: boolean;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nexport interface ImportResult {\n totalSessions: number;\n totalMessages: number;\n importedPrompts: number;\n importedResponses: number;\n skippedDuplicates: number;\n errors: string[];\n}\n\nexport interface ClaudeMessage {\n type: string;\n message?: {\n role: string;\n content: string | Array<{ type: string; text?: string; name?: string; tool_use_id?: string }>;\n };\n sessionId?: string;\n timestamp?: string;\n}\n\n/**\n * Classify a JSONL entry into a logical message type:\n * - 'user_prompt': Real user input (string content or text blocks without tool_result)\n * - 'tool_result': Tool execution result (user message with tool_result blocks)\n * - 'agent_text': Assistant text response (text blocks)\n * - 'tool_use': Assistant tool call (tool_use blocks)\n * - 'thinking': Assistant thinking (thinking blocks)\n * - 'skip': Everything else (progress, system, summary, etc.)\n */\n/**\n * Filter trivial user inputs that aren't worth storing.\n * Mirrors the shouldStorePrompt() logic from user-prompt-submit.ts.\n */\nexport function isClaudeLocalCommandArtifact(content: string): boolean {\n const trimmed = content.trim();\n return (\n /^<local-command-(stdout|stderr)>/.test(trimmed) ||\n /^<command-(name|message)>/.test(trimmed) ||\n (trimmed.includes('<command-name>') && trimmed.includes('<local-command-stdout>'))\n );\n}\n\nexport function isWorthStoringPrompt(content: string): boolean {\n const trimmed = content.trim();\n if (isClaudeLocalCommandArtifact(trimmed)) return false;\n if (trimmed.startsWith('/')) return false;\n if (trimmed.length < 15) return false;\n if (!/[a-zA-Z\uAC00-\uD7A3]{2,}/.test(trimmed)) return false;\n return true;\n}\n\nfunction getFileMtimeMs(filePath: string): number {\n try {\n return fs.statSync(filePath).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction selectRecentSessionFiles(files: string[], sessionLimit?: number): string[] {\n if (sessionLimit === undefined) return files;\n return [...files]\n .sort((a, b) => getFileMtimeMs(b) - getFileMtimeMs(a) || b.localeCompare(a))\n .slice(0, sessionLimit);\n}\n\nfunction parseSessionLimit(value?: number): number | undefined {\n if (value === undefined) return undefined;\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;\n}\n\nfunction applySessionLimit(files: string[], options: ImportOptions): string[] {\n return selectRecentSessionFiles(files, parseSessionLimit(options.sessionLimit));\n}\n\nfunction classifyEntry(entry: ClaudeMessage): 'user_prompt' | 'tool_result' | 'agent_text' | 'tool_use' | 'thinking' | 'skip' {\n if (entry.type !== 'user' && entry.type !== 'assistant') {\n return 'skip';\n }\n\n const content = entry.message?.content;\n if (!content) return 'skip';\n\n if (entry.type === 'user') {\n // String content = real user input\n if (typeof content === 'string') return 'user_prompt';\n\n // Array content: check for tool_result blocks\n if (Array.isArray(content)) {\n const hasToolResult = content.some(b => b.type === 'tool_result');\n if (hasToolResult) return 'tool_result';\n\n // Text-only blocks from user = real user input\n const hasText = content.some(b => b.type === 'text' && b.text);\n if (hasText) return 'user_prompt';\n }\n return 'skip';\n }\n\n // assistant type\n if (Array.isArray(content)) {\n const hasToolUse = content.some(b => b.type === 'tool_use');\n if (hasToolUse) return 'tool_use';\n\n const hasText = content.some(b => b.type === 'text' && b.text);\n if (hasText) return 'agent_text';\n\n const hasThinking = content.some(b => b.type === 'thinking');\n if (hasThinking) return 'thinking';\n } else if (typeof content === 'string' && content.length > 0) {\n return 'agent_text';\n }\n\n return 'skip';\n}\n\nexport class SessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly claudeDir: string;\n\n constructor(memoryService: MemoryService) {\n this.memoryService = memoryService;\n this.claudeDir = path.join(os.homedir(), '.claude');\n }\n\n /**\n * Import all sessions from a project\n */\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n\n // Find project directory\n onProgress?.({ phase: 'scan', message: 'Scanning for session files...' });\n const projectDirs = await this.findProjectDirs(projectPath);\n if (projectDirs.length === 0) {\n result.errors.push(`Project directory not found for: ${projectPath}`);\n return result;\n }\n\n // Find all session files across matched directories\n const allSessionFiles: string[] = [];\n for (const dir of projectDirs) {\n const files = await this.findSessionFiles(dir);\n allSessionFiles.push(...files);\n }\n const sessionFiles = [...new Set(allSessionFiles)];\n const selectedSessionFiles = applySessionLimit(sessionFiles, options);\n result.totalSessions = selectedSessionFiles.length;\n onProgress?.({\n phase: 'scan',\n message: `Found ${sessionFiles.length} sessions in ${projectDirs.length} matched project folder(s)`\n });\n\n if (options.verbose) {\n console.log(`Matched project folders:`);\n for (const dir of projectDirs) {\n console.log(` - ${dir}`);\n }\n console.log(`Found ${sessionFiles.length} session files across matched folders`);\n }\n\n // Import each selected session\n for (let i = 0; i < selectedSessionFiles.length; i++) {\n const sessionFile = selectedSessionFiles[i];\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessionFiles.length, filePath: sessionFile });\n const sessionResult = await this.importSessionFile(sessionFile, {\n ...options,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n onProgress?.({\n phase: 'session-done', sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to import ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Import a specific session file\n */\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n // Extract session ID from filename\n const sessionId = path.basename(filePath, '.jsonl');\n\n // Force reimport: delete existing events for this session\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(sessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${sessionId}`);\n }\n }\n\n // Start session in memory\n await this.memoryService.startSession(sessionId, options.projectPath);\n\n // Read and parse JSONL file\n const fileStream = fs.createReadStream(filePath);\n const rl = readline.createInterface({\n input: fileStream,\n crlfDelay: Infinity\n });\n\n let lineCount = 0;\n const limit = options.limit || Infinity;\n const onProgress = options.onProgress;\n const sessionIndex = (options as ImportOptions & { _sessionIndex?: number })._sessionIndex ?? 0;\n let lastProgressAt = 0;\n\n // Turn grouping with buffering:\n // - Buffer assistant text blocks within a turn\n // - On new user_prompt or EOF, flush buffer as a single merged agent_response\n // - Filter out short transitional text (< 100 chars) like \"Let me check...\"\n let currentTurnId: string | null = null;\n let textBuffer: string[] = [];\n let lastTimestamp: string | undefined;\n\n // Flush buffered text as a single agent_response\n const flushTextBuffer = async () => {\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n // Filter: keep substantive text (>= 100 chars), discard short transitional phrases\n const substantive = textBuffer.filter(t => t.length >= 100);\n\n // If all filtered out, keep the longest block (there's always something meaningful)\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : textBuffer.reduce((a, b) => a.length >= b.length ? a : b, '');\n\n if (!merged) { textBuffer = []; return; }\n\n // Truncate if very long\n const truncated = merged.length > 10000\n ? merged.slice(0, 10000) + '...[truncated]'\n : merged;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncated,\n { importedFrom: filePath, originalTimestamp: lastTimestamp, turnId: currentTurnId }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n lineCount++;\n textBuffer = [];\n };\n\n for await (const line of rl) {\n if (lineCount >= limit) break;\n\n try {\n const entry = JSON.parse(line) as ClaudeMessage;\n result.totalMessages++;\n\n const msgClass = classifyEntry(entry);\n\n if (msgClass === 'user_prompt') {\n // Flush previous turn's buffered responses before starting new turn\n await flushTextBuffer();\n\n const content = this.extractContent(entry);\n if (!content) continue;\n\n // Skip trivial inputs: slash commands, very short, no real words\n if (!isWorthStoringPrompt(content)) {\n result.skippedDuplicates++;\n continue;\n }\n\n // New turn starts with each real user prompt\n currentTurnId = randomUUID();\n\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp, turnId: currentTurnId }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n lineCount++;\n } else if (msgClass === 'agent_text') {\n // Buffer text instead of storing immediately\n const content = this.extractContent(entry);\n if (content) {\n textBuffer.push(content);\n lastTimestamp = entry.timestamp;\n }\n }\n // tool_result, tool_use, thinking, skip \u2192 ignored\n\n // Emit progress periodically\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n } catch (parseError) {\n // Skip malformed lines\n result.errors.push(`Parse error on line: ${parseError}`);\n }\n }\n\n // Flush any remaining buffered text from the last turn\n await flushTextBuffer();\n\n // End session\n await this.memoryService.endSession(sessionId);\n\n // Register session in registry so projects API can map hash \u2192 path\n if (options.projectPath) {\n registerSession(sessionId, options.projectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n /**\n * Import all sessions from all projects\n */\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n result.errors.push(`Projects directory not found: ${projectsDir}`);\n return result;\n }\n\n // Find all project directories and session files\n onProgress?.({ phase: 'scan', message: 'Scanning all projects...' });\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n // Collect all session files across all projects\n const allSessionFiles: string[] = [];\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n allSessionFiles.push(...sessionFiles);\n }\n onProgress?.({ phase: 'scan', message: `Found ${allSessionFiles.length} sessions across ${projectDirs.length} projects` });\n\n if (options.verbose) {\n console.log(`Found ${projectDirs.length} project directories, ${allSessionFiles.length} sessions`);\n }\n\n const selectedSessionFiles = applySessionLimit(allSessionFiles, options);\n result.totalSessions = selectedSessionFiles.length;\n onProgress?.({\n phase: 'scan',\n message: `Selected ${selectedSessionFiles.length} of ${allSessionFiles.length} session(s) for import`\n });\n\n // Import selected session files with progress tracking\n for (let i = 0; i < selectedSessionFiles.length; i++) {\n const sessionFile = selectedSessionFiles[i];\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessionFiles.length, filePath: sessionFile });\n const sessionResult = await this.importSessionFile(sessionFile, {\n ...options,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n onProgress?.({\n phase: 'session-done', sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to process ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Find project directories from project path.\n * Supports wrappers (e.g. happy) that append extra path segments in folder names.\n */\n private async findProjectDirs(projectPath: string): Promise<string[]> {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n return [];\n }\n\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n const normalizedPath = projectPath.replace(/\\+/g, '/').replace(/\\/$/, '');\n const normalizeToken = (value: string) => value\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/\\/+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n const normalizedDashed = normalizeToken(normalizedPath);\n const baseName = normalizeToken(path.basename(normalizedPath));\n\n const scored = projectDirs.map((dir) => {\n const dirName = path.basename(dir);\n const normalizedDirName = dirName.toLowerCase().replace(/[\\s_]+/g, '-');\n let score = 0;\n\n // strong matches\n if (normalizedDirName.includes(normalizedDashed)) score += 100;\n if (normalizedDashed.includes(normalizedDirName)) score += 80;\n\n // basename signal (handles wrappers adding extra suffix)\n if (baseName && normalizedDirName.includes(baseName)) score += 30;\n\n // token overlap signal\n const pathTokens = normalizedDashed.split('-').filter(Boolean);\n const tokenHits = pathTokens.filter(t => t.length >= 3 && normalizedDirName.includes(t)).length;\n score += Math.min(tokenHits, 20);\n\n return { dir, score, dirName };\n }).filter(x => x.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) return [];\n\n // Keep close matches (same family) to include wrapper-generated variants\n const top = scored[0].score;\n const threshold = Math.max(30, top - 25);\n\n return scored\n .filter(x => x.score >= threshold)\n .map(x => x.dir);\n }\n\n /**\n * Find all JSONL session files in a directory\n */\n private async findSessionFiles(dir: string): Promise<string[]> {\n if (!fs.existsSync(dir)) {\n return [];\n }\n\n return fs.readdirSync(dir)\n .filter(name => name.endsWith('.jsonl'))\n .map(name => path.join(dir, name))\n .filter(p => fs.statSync(p).isFile());\n }\n\n /**\n * Extract text content from Claude message\n */\n private extractContent(entry: ClaudeMessage): string | null {\n if (!entry.message?.content) {\n return null;\n }\n\n const content = entry.message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n // Extract text from content blocks\n const texts = content\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text as string);\n\n return texts.join('\\n');\n }\n\n return null;\n }\n\n /**\n * List available sessions for import\n */\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessions: Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }> = [];\n\n let projectDirs: string[] = [];\n\n if (projectPath) {\n projectDirs = await this.findProjectDirs(projectPath);\n } else {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (fs.existsSync(projectsDir)) {\n projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n }\n }\n\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const filePath of sessionFiles) {\n const stats = fs.statSync(filePath);\n sessions.push({\n sessionId: path.basename(filePath, '.jsonl'),\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n }\n }\n\n // Sort by modified date (newest first)\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return sessions;\n }\n}\n\n/**\n * Create importer with default memory service\n */\nexport function createSessionHistoryImporter(memoryService: MemoryService): SessionHistoryImporter {\n return new SessionHistoryImporter(memoryService);\n}\n", "/**\n * Codex Session History Importer\n * Imports existing Codex CLI conversation history into memory\n *\n * Codex stores session history in:\n * ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { createHash, randomUUID } from 'crypto';\nimport { MemoryService } from './memory-service.js';\nimport { registerSession } from '../core/registry/session-registry.js';\nimport type { ImportOptions, ImportResult } from './session-history-importer.js';\n\ntype CodexLogLine = {\n timestamp?: string;\n type?: string;\n payload?: unknown;\n};\n\ntype CodexSessionMetaPayload = {\n id?: unknown;\n cwd?: unknown;\n timestamp?: unknown;\n};\n\ntype CodexResponseItemMessagePayload = {\n type?: unknown;\n role?: unknown;\n content?: unknown;\n};\n\ntype CodexContentBlock = {\n type?: unknown;\n text?: unknown;\n};\n\nexport const CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS = 10_000;\n\nexport interface CodexSessionMeta {\n sessionId: string | null;\n cwd: string | null;\n}\n\nexport interface CodexValidationOptions {\n sessionsDir?: string;\n projectPath?: string;\n limit?: number;\n maxContentChars?: number;\n anonymizeProjects?: boolean;\n now?: Date;\n}\n\nexport interface CodexValidationSource {\n sessionsDir: string;\n projectPath?: string;\n projectFilterApplied: boolean;\n sourcePaths: string[];\n}\n\nexport interface CodexValidationLimits {\n sessionLimit?: number;\n maxContentChars: number;\n}\n\nexport interface CodexValidationTotals {\n sessionsScanned: number;\n sessionsMatched: number;\n filesRead: number;\n recordsRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectCwd: number;\n warnings: number;\n}\n\nexport interface CodexProjectSummary {\n projectHash: string;\n pathLabel: string;\n sessions: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n truncatedMessages: number;\n emptyAssistantMessages: number;\n}\n\nexport interface CodexSessionReplaySummary {\n sessionId: string;\n filePath: string;\n projectHash: string;\n pathLabel: string;\n matched: boolean;\n recordsRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectCwd: boolean;\n warnings: string[];\n}\n\nexport interface CodexSessionValidationReport {\n generatedAt: string;\n dryRun: true;\n willMutate: false;\n source: CodexValidationSource;\n limits: CodexValidationLimits;\n totals: CodexValidationTotals;\n topProjects: CodexProjectSummary[];\n sessions: CodexSessionReplaySummary[];\n warnings: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeMaybeRealpath(p: string): string {\n try {\n return fs.realpathSync(p);\n } catch {\n return path.resolve(p);\n }\n}\n\ninterface CodexExtractedContent {\n text: string | null;\n originalLength: number;\n truncated: boolean;\n}\n\nfunction extractCodexContentText(\n content: unknown,\n maxContentChars = CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS\n): CodexExtractedContent {\n const texts: string[] = [];\n\n if (typeof content === 'string') {\n if (content.length > 0) texts.push(content);\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (!isRecord(block)) continue;\n const b = block as CodexContentBlock;\n const t = typeof b.type === 'string' ? b.type : '';\n if (t !== 'input_text' && t !== 'output_text' && t !== 'text') continue;\n if (typeof b.text === 'string' && b.text.length > 0) {\n texts.push(b.text);\n }\n }\n }\n\n if (texts.length === 0) {\n return { text: null, originalLength: 0, truncated: false };\n }\n\n const merged = texts.join('\\n');\n const truncated = merged.length > maxContentChars;\n return {\n text: truncated ? `${merged.slice(0, maxContentChars)}...[truncated]` : merged,\n originalLength: merged.length,\n truncated\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n return extractCodexContentText(content).text;\n}\n\nexport function getDefaultCodexSessionsDir(): string {\n return path.join(os.homedir(), '.codex', 'sessions');\n}\n\nexport function listCodexSessionFilesRecursive(rootDir: string): string[] {\n if (!fs.existsSync(rootDir)) return [];\n const out: string[] = [];\n const stack: string[] = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const ent of entries) {\n const fullPath = path.join(dir, ent.name);\n if (ent.isDirectory()) {\n stack.push(fullPath);\n } else if (ent.isFile() && ent.name.endsWith('.jsonl')) {\n out.push(fullPath);\n }\n }\n }\n\n return out.sort();\n}\n\nfunction getFileMtimeMs(filePath: string): number {\n try {\n return fs.statSync(filePath).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction selectRecentCodexSessionFiles(files: string[], sessionLimit?: number): string[] {\n if (sessionLimit === undefined) return files;\n const limit = Number.isFinite(sessionLimit) && sessionLimit > 0 ? Math.floor(sessionLimit) : undefined;\n if (limit === undefined) return files;\n return [...files]\n .sort((a, b) => getFileMtimeMs(b) - getFileMtimeMs(a) || b.localeCompare(a))\n .slice(0, limit);\n}\n\nfunction normalizePositiveImportLimit(limit?: number): number | undefined {\n if (limit === undefined) return undefined;\n return Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : undefined;\n}\n\nfunction countStoredEntries(result: ImportResult): number {\n return result.importedPrompts + result.importedResponses + result.skippedDuplicates;\n}\n\nexport async function readCodexSessionMeta(filePath: string): Promise<CodexSessionMeta> {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n let linesRead = 0;\n for await (const line of rl) {\n linesRead++;\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line) as CodexLogLine;\n if (obj.type !== 'session_meta') continue;\n if (!isRecord(obj.payload)) break;\n const payload = obj.payload as CodexSessionMetaPayload;\n const sessionId = typeof payload.id === 'string' ? payload.id : null;\n const cwd = typeof payload.cwd === 'string' ? payload.cwd : null;\n return { sessionId, cwd };\n } catch {\n // Ignore malformed preamble lines while looking for session_meta.\n }\n\n // session_meta is expected near the top; do not scan huge transcripts twice.\n if (linesRead >= 25) break;\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return { sessionId: null, cwd: null };\n}\n\nexport function deriveCodexSessionIdFromFileName(filePath: string): string | null {\n const base = path.basename(filePath, '.jsonl');\n // Common: rollout-<date>-<uuid>\n const m = base.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i);\n if (m?.[1]) return m[1];\n return base.length > 0 ? base : null;\n}\n\nfunction createEmptyCodexValidationTotals(): CodexValidationTotals {\n return {\n sessionsScanned: 0,\n sessionsMatched: 0,\n filesRead: 0,\n recordsRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectCwd: 0,\n warnings: 0\n };\n}\n\nfunction projectHashFor(cwd: string | null): string {\n return createHash('sha256').update(cwd ?? '(missing cwd)').digest('hex').slice(0, 12);\n}\n\nfunction projectPathLabel(cwd: string | null, anonymizeProjects: boolean): string {\n const hash = projectHashFor(cwd);\n if (anonymizeProjects) return cwd ? `project:${hash}` : `project:${hash}:missing-cwd`;\n return cwd ?? '(missing cwd)';\n}\n\nfunction isProjectMatch(cwd: string | null, projectPath?: string): boolean {\n if (!projectPath) return true;\n if (!cwd) return false;\n return normalizeMaybeRealpath(cwd) === normalizeMaybeRealpath(projectPath);\n}\n\nfunction addSessionToProject(projects: Map<string, CodexProjectSummary>, session: CodexSessionReplaySummary): void {\n const existing = projects.get(session.projectHash) ?? {\n projectHash: session.projectHash,\n pathLabel: session.pathLabel,\n sessions: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n truncatedMessages: 0,\n emptyAssistantMessages: 0\n };\n\n existing.sessions += 1;\n existing.messagesNormalized += session.messagesNormalized;\n existing.turnsNormalized += session.turnsNormalized;\n existing.userMessages += session.userMessages;\n existing.assistantMessages += session.assistantMessages;\n existing.malformedLines += session.malformedLines;\n existing.skippedUnsupportedRecords += session.skippedUnsupportedRecords;\n existing.truncatedMessages += session.truncatedMessages;\n existing.emptyAssistantMessages += session.emptyAssistantMessages;\n projects.set(session.projectHash, existing);\n}\n\nfunction addSessionToTotals(totals: CodexValidationTotals, session: CodexSessionReplaySummary): void {\n totals.filesRead += 1;\n totals.recordsRead += session.recordsRead;\n totals.messagesNormalized += session.messagesNormalized;\n totals.turnsNormalized += session.turnsNormalized;\n totals.userMessages += session.userMessages;\n totals.assistantMessages += session.assistantMessages;\n totals.malformedLines += session.malformedLines;\n totals.skippedUnsupportedRecords += session.skippedUnsupportedRecords;\n totals.emptyAssistantMessages += session.emptyAssistantMessages;\n totals.truncatedMessages += session.truncatedMessages;\n}\n\nexport async function normalizeCodexSessionFile(\n filePath: string,\n options: {\n meta?: CodexSessionMeta;\n matched?: boolean;\n maxContentChars?: number;\n anonymizeProjects?: boolean;\n } = {}\n): Promise<CodexSessionReplaySummary> {\n const meta = options.meta ?? await readCodexSessionMeta(filePath);\n const sessionId = meta.sessionId ?? deriveCodexSessionIdFromFileName(filePath) ?? path.basename(filePath, '.jsonl');\n const projectHash = projectHashFor(meta.cwd);\n const pathLabel = projectPathLabel(meta.cwd, options.anonymizeProjects === true);\n const summary: CodexSessionReplaySummary = {\n sessionId,\n filePath,\n projectHash,\n pathLabel,\n matched: options.matched ?? true,\n recordsRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectCwd: !meta.cwd,\n warnings: []\n };\n\n if (!meta.cwd) {\n summary.warnings.push('session_meta missing cwd; project matching is unavailable for this session');\n }\n\n const maxContentChars = options.maxContentChars ?? CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n for await (const line of rl) {\n if (!line.trim()) continue;\n summary.recordsRead += 1;\n\n let entry: CodexLogLine;\n try {\n entry = JSON.parse(line) as CodexLogLine;\n } catch {\n summary.malformedLines += 1;\n continue;\n }\n\n if (entry.type === 'session_meta') continue;\n if (entry.type !== 'response_item' || !isRecord(entry.payload)) {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const payload = entry.payload as CodexResponseItemMessagePayload;\n if (payload.type !== 'message') {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const role = typeof payload.role === 'string' ? payload.role : null;\n if (role !== 'user' && role !== 'assistant') {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const extracted = extractCodexContentText(payload.content, maxContentChars);\n if (!extracted.text) {\n if (role === 'assistant') {\n summary.emptyAssistantMessages += 1;\n } else {\n summary.skippedUnsupportedRecords += 1;\n }\n continue;\n }\n\n if (extracted.truncated) {\n summary.truncatedMessages += 1;\n }\n\n summary.messagesNormalized += 1;\n if (role === 'user') {\n summary.userMessages += 1;\n summary.turnsNormalized += 1;\n } else {\n summary.assistantMessages += 1;\n }\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return summary;\n}\n\nexport async function validateCodexSessions(options: CodexValidationOptions = {}): Promise<CodexSessionValidationReport> {\n const sessionsDir = path.resolve(options.sessionsDir ?? getDefaultCodexSessionsDir());\n const maxContentChars = options.maxContentChars ?? CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const report: CodexSessionValidationReport = {\n generatedAt: (options.now ?? new Date()).toISOString(),\n dryRun: true,\n willMutate: false,\n source: {\n sessionsDir,\n projectPath: options.projectPath,\n projectFilterApplied: Boolean(options.projectPath),\n sourcePaths: [sessionsDir]\n },\n limits: {\n sessionLimit: options.limit,\n maxContentChars\n },\n totals: createEmptyCodexValidationTotals(),\n topProjects: [],\n sessions: [],\n warnings: []\n };\n\n if (!fs.existsSync(sessionsDir)) {\n report.warnings.push(`Codex sessions directory not found: ${sessionsDir}`);\n report.totals.warnings = report.warnings.length;\n return report;\n }\n\n const sessionFiles = listCodexSessionFilesRecursive(sessionsDir);\n const limitedFiles = typeof options.limit === 'number' && Number.isFinite(options.limit) && options.limit > 0\n ? sessionFiles.slice(0, Math.floor(options.limit))\n : sessionFiles;\n const projects = new Map<string, CodexProjectSummary>();\n\n for (const filePath of limitedFiles) {\n const meta = await readCodexSessionMeta(filePath);\n report.totals.sessionsScanned += 1;\n if (!meta.cwd) {\n report.totals.missingProjectCwd += 1;\n }\n\n const matched = isProjectMatch(meta.cwd, options.projectPath);\n if (!matched) continue;\n\n report.totals.sessionsMatched += 1;\n const sessionSummary = await normalizeCodexSessionFile(filePath, {\n meta,\n matched,\n maxContentChars,\n anonymizeProjects: options.anonymizeProjects\n });\n report.sessions.push(sessionSummary);\n addSessionToTotals(report.totals, sessionSummary);\n addSessionToProject(projects, sessionSummary);\n }\n\n report.topProjects = [...projects.values()].sort((a, b) => {\n const byMessages = b.messagesNormalized - a.messagesNormalized;\n if (byMessages !== 0) return byMessages;\n return b.sessions - a.sessions;\n }).slice(0, 10);\n\n if (report.totals.missingProjectCwd > 0) {\n report.warnings.push(`${report.totals.missingProjectCwd} session(s) missing cwd; project matching only uses sessions with cwd`);\n }\n if (report.totals.malformedLines > 0) {\n report.warnings.push(`${report.totals.malformedLines} malformed JSONL line(s) skipped`);\n }\n if (options.projectPath && report.totals.sessionsMatched === 0) {\n report.warnings.push(`No Codex sessions matched project cwd: ${options.projectPath}`);\n }\n report.totals.warnings = report.warnings.length;\n\n return report;\n}\n\nexport interface CodexSessionHistoryImporterOptions {\n sessionsDir?: string;\n}\n\nexport class CodexSessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly sessionsRoot: string;\n\n constructor(memoryService: MemoryService, options: CodexSessionHistoryImporterOptions = {}) {\n this.memoryService = memoryService;\n this.sessionsRoot = options.sessionsDir\n ? path.resolve(options.sessionsDir)\n : path.join(os.homedir(), '.codex', 'sessions');\n }\n\n private getSessionsRoot(): string {\n return this.sessionsRoot;\n }\n\n private listSessionFilesRecursive(rootDir: string): string[] {\n if (!fs.existsSync(rootDir)) return [];\n const out: string[] = [];\n const stack: string[] = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const ent of entries) {\n const fullPath = path.join(dir, ent.name);\n if (ent.isDirectory()) {\n stack.push(fullPath);\n } else if (ent.isFile() && ent.name.endsWith('.jsonl')) {\n out.push(fullPath);\n }\n }\n }\n\n return out;\n }\n\n private async readSessionMeta(filePath: string): Promise<{ sessionId: string | null; cwd: string | null }> {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n let linesRead = 0;\n for await (const line of rl) {\n linesRead++;\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line) as CodexLogLine;\n if (obj.type !== 'session_meta') continue;\n if (!isRecord(obj.payload)) break;\n const payload = obj.payload as CodexSessionMetaPayload;\n const sessionId = typeof payload.id === 'string' ? payload.id : null;\n const cwd = typeof payload.cwd === 'string' ? payload.cwd : null;\n return { sessionId, cwd };\n } catch {\n // ignore parse errors; keep scanning initial lines\n }\n\n // session_meta is expected at the top; don't scan entire file.\n if (linesRead >= 25) break;\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return { sessionId: null, cwd: null };\n }\n\n private deriveSessionIdFromFileName(filePath: string): string | null {\n const base = path.basename(filePath, '.jsonl');\n // Common: rollout-<date>-<uuid>\n const m = base.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i);\n if (m?.[1]) return m[1];\n return base.length > 0 ? base : null;\n }\n\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) {\n result.errors.push(`Codex sessions directory not found: ${sessionsRoot}`);\n return result;\n }\n\n const normalizedTarget = normalizeMaybeRealpath(projectPath);\n onProgress?.({ phase: 'scan', message: 'Scanning Codex session files...' });\n\n const sessionFiles = this.listSessionFilesRecursive(sessionsRoot);\n const matchingFiles: string[] = [];\n\n // Filter by original CWD stored in session_meta.payload.cwd\n for (const filePath of sessionFiles) {\n try {\n const meta = await this.readSessionMeta(filePath);\n if (!meta.cwd) continue;\n if (normalizeMaybeRealpath(meta.cwd) === normalizedTarget) {\n matchingFiles.push(filePath);\n }\n } catch {\n // ignore\n }\n }\n\n const selectedFiles = selectRecentCodexSessionFiles(matchingFiles, options.sessionLimit);\n onProgress?.({ phase: 'scan', message: `Found ${matchingFiles.length} Codex session(s) for this project` });\n\n const effectiveProjectPath = options.projectPath ?? projectPath;\n const totalLimit = normalizePositiveImportLimit(options.limit);\n let storedAcrossSessions = 0;\n\n for (let i = 0; i < selectedFiles.length; i++) {\n if (totalLimit !== undefined && storedAcrossSessions >= totalLimit) break;\n const filePath = selectedFiles[i];\n const remainingLimit = totalLimit === undefined ? undefined : totalLimit - storedAcrossSessions;\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedFiles.length, filePath });\n const sessionResult = await this.importSessionFile(filePath, {\n ...options,\n limit: remainingLimit,\n projectPath: effectiveProjectPath,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n storedAcrossSessions += countStoredEntries(sessionResult);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to import ${filePath}: ${error}`);\n }\n }\n\n return result;\n }\n\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) {\n result.errors.push(`Codex sessions directory not found: ${sessionsRoot}`);\n return result;\n }\n\n onProgress?.({ phase: 'scan', message: 'Scanning all Codex sessions...' });\n const sessionFiles = this.listSessionFilesRecursive(sessionsRoot);\n const selectedFiles = selectRecentCodexSessionFiles(sessionFiles, options.sessionLimit);\n onProgress?.({ phase: 'scan', message: `Found ${sessionFiles.length} Codex session file(s)` });\n\n const totalLimit = normalizePositiveImportLimit(options.limit);\n let storedAcrossSessions = 0;\n\n for (let i = 0; i < selectedFiles.length; i++) {\n if (totalLimit !== undefined && storedAcrossSessions >= totalLimit) break;\n const filePath = selectedFiles[i];\n const remainingLimit = totalLimit === undefined ? undefined : totalLimit - storedAcrossSessions;\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedFiles.length, filePath });\n const sessionResult = await this.importSessionFile(filePath, {\n ...options,\n limit: remainingLimit,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n storedAcrossSessions += countStoredEntries(sessionResult);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to process ${filePath}: ${error}`);\n }\n }\n\n return result;\n }\n\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n const meta = await this.readSessionMeta(filePath);\n const sessionId = meta.sessionId ?? this.deriveSessionIdFromFileName(filePath);\n\n if (!sessionId) {\n result.errors.push(`Could not determine session id for: ${filePath}`);\n return result;\n }\n\n const effectiveProjectPath = options.projectPath ?? meta.cwd ?? undefined;\n\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(sessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${sessionId}`);\n }\n }\n\n await this.memoryService.startSession(sessionId, effectiveProjectPath);\n\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n const onProgress = options.onProgress;\n const sessionIndex = (options as ImportOptions & { _sessionIndex?: number })._sessionIndex ?? 0;\n let lastProgressAt = 0;\n const limit = options.limit || Infinity;\n let storedCount = 0;\n\n let currentTurnId: string | null = null;\n let textBuffer: string[] = [];\n let lastTimestamp: string | undefined;\n\n const flushTextBuffer = async () => {\n if (storedCount >= limit) { textBuffer = []; return; }\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n const substantive = textBuffer.filter(t => t.length >= 100);\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : textBuffer.reduce((a, b) => a.length >= b.length ? a : b, '');\n\n if (!merged) { textBuffer = []; return; }\n\n const truncated = merged.length > 10000\n ? merged.slice(0, 10000) + '...[truncated]'\n : merged;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncated,\n { importedFrom: filePath, originalTimestamp: lastTimestamp, turnId: currentTurnId, source: 'codex' }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n storedCount++;\n textBuffer = [];\n };\n\n try {\n for await (const line of rl) {\n if (storedCount >= limit) break;\n try {\n const entry = JSON.parse(line) as CodexLogLine;\n result.totalMessages++;\n\n if (entry.type === 'response_item' && isRecord(entry.payload)) {\n const payload = entry.payload as CodexResponseItemMessagePayload;\n if (payload.type !== 'message') continue;\n\n const role = typeof payload.role === 'string' ? payload.role : null;\n if (!role) continue;\n\n if (role === 'user') {\n await flushTextBuffer();\n\n const content = extractTextFromContent(payload.content);\n if (!content) continue;\n\n currentTurnId = randomUUID();\n\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp, turnId: currentTurnId, source: 'codex' }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n storedCount++;\n } else if (role === 'assistant') {\n const content = extractTextFromContent(payload.content);\n if (content) {\n textBuffer.push(content);\n if (typeof entry.timestamp === 'string') {\n lastTimestamp = entry.timestamp;\n }\n }\n } else {\n // developer/system/tool messages are ignored by default\n }\n }\n\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n } catch (parseError) {\n result.errors.push(`Parse error: ${parseError}`);\n }\n }\n } finally {\n await flushTextBuffer();\n rl.close();\n fileStream.close();\n }\n\n await this.memoryService.endSession(sessionId);\n\n if (effectiveProjectPath) {\n registerSession(sessionId, effectiveProjectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) return [];\n\n const files = this.listSessionFilesRecursive(sessionsRoot);\n const sessions: Array<{ sessionId: string; filePath: string; size: number; modifiedAt: Date }> = [];\n\n const normalizedTarget = projectPath ? normalizeMaybeRealpath(projectPath) : null;\n\n for (const filePath of files) {\n try {\n const stats = fs.statSync(filePath);\n\n let sessionId = this.deriveSessionIdFromFileName(filePath) ?? path.basename(filePath, '.jsonl');\n if (normalizedTarget) {\n const meta = await this.readSessionMeta(filePath);\n if (!meta.cwd) continue;\n if (normalizeMaybeRealpath(meta.cwd) !== normalizedTarget) continue;\n sessionId = meta.sessionId ?? sessionId;\n }\n\n sessions.push({\n sessionId,\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n } catch {\n // ignore\n }\n }\n\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n return sessions;\n }\n}\n\nexport function createCodexSessionHistoryImporter(\n memoryService: MemoryService,\n options: CodexSessionHistoryImporterOptions = {}\n): CodexSessionHistoryImporter {\n return new CodexSessionHistoryImporter(memoryService, options);\n}\n", "/**\n * Hermes SessionDB Importer\n *\n * Imports explicit, read-only snapshots from Hermes Agent's ~/.hermes/state.db\n * into claude-memory-layer. This intentionally does not tail/live-sync Hermes:\n * SessionDB remains the raw source of truth; imports are opt-in and project-scoped.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { createHash, randomUUID } from 'crypto';\nimport { createDatabase, type Database } from '../core/db-wrapper.js';\nimport { applyPrivacyFilter, truncateOutput } from '../core/privacy/index.js';\nimport { registerSession } from '../core/registry/session-registry.js';\nimport type { Config } from '../core/types.js';\nimport { MemoryService } from './memory-service.js';\nimport { isWorthStoringPrompt, type ImportOptions, type ImportResult } from './session-history-importer.js';\n\nexport const HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS = 10_000;\nconst HERMES_MEMORY_SESSION_PREFIX = 'hermes:';\n\nconst DEFAULT_PRIVACY_CONFIG: Config['privacy'] = {\n excludePatterns: ['password', 'secret', 'api_key', 'token', 'bearer'],\n anonymize: false,\n privateTags: {\n enabled: true,\n marker: '[PRIVATE]',\n preserveLineCount: false,\n supportedFormats: ['xml']\n }\n};\n\nexport interface HermesSessionHistoryImporterOptions {\n stateDbPath?: string;\n}\n\nexport interface HermesValidationOptions {\n stateDbPath?: string;\n projectPath?: string;\n limit?: number;\n maxContentChars?: number;\n now?: Date;\n}\n\nexport interface HermesValidationSource {\n stateDbPath: string;\n projectPath?: string;\n projectFilterApplied: boolean;\n sourcePaths: string[];\n}\n\nexport interface HermesValidationLimits {\n sessionLimit?: number;\n maxContentChars: number;\n}\n\nexport interface HermesValidationTotals {\n sessionsScanned: number;\n sessionsMatched: number;\n messagesRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectContext: number;\n warnings: number;\n}\n\nexport interface HermesSourceSummary {\n source: string;\n sessions: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n truncatedMessages: number;\n emptyAssistantMessages: number;\n}\n\nexport interface HermesSessionReplaySummary {\n sessionId: string;\n source: string;\n matched: boolean;\n messagesRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectContext: boolean;\n warnings: string[];\n}\n\nexport interface HermesSessionValidationReport {\n generatedAt: string;\n dryRun: true;\n willMutate: false;\n source: HermesValidationSource;\n limits: HermesValidationLimits;\n totals: HermesValidationTotals;\n topSources: HermesSourceSummary[];\n sessions: HermesSessionReplaySummary[];\n warnings: string[];\n}\n\ntype HermesSessionRow = {\n id: string;\n source: string;\n user_id: string | null;\n model: string | null;\n system_prompt: string | null;\n started_at: number;\n ended_at?: number | null;\n title?: string | null;\n};\n\ntype HermesMessageRow = {\n id: number;\n session_id: string;\n role: string;\n content: string | null;\n tool_name: string | null;\n timestamp: number;\n};\n\ntype NormalizedHermesMessage = {\n role: 'user' | 'assistant';\n content: string;\n truncated: boolean;\n};\n\nfunction normalizeMaybeRealpath(p: string): string {\n try {\n return fs.realpathSync(p);\n } catch {\n return path.resolve(p);\n }\n}\n\nfunction hashLabel(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 12);\n}\n\nfunction makeMemorySessionId(sessionId: string): string {\n return sessionId.startsWith(HERMES_MEMORY_SESSION_PREFIX)\n ? sessionId\n : `${HERMES_MEMORY_SESSION_PREFIX}${sessionId}`;\n}\n\nfunction timestampToIso(timestamp: number | null | undefined): string | undefined {\n if (typeof timestamp !== 'number' || !Number.isFinite(timestamp)) return undefined;\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction getProjectMatchVariants(projectPath: string): string[] {\n const variants = new Set<string>();\n variants.add(projectPath);\n variants.add(path.resolve(projectPath));\n variants.add(normalizeMaybeRealpath(projectPath));\n variants.add(projectPath.replace(/\\\\/g, '/'));\n variants.add(path.resolve(projectPath).replace(/\\\\/g, '/'));\n return [...variants].filter(Boolean).map((v) => v.toLowerCase());\n}\n\nfunction getSessionProjectHaystack(session: HermesSessionRow): string {\n return [session.system_prompt, session.title]\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n .join('\\n')\n .replace(/\\\\/g, '/')\n .toLowerCase();\n}\n\nfunction hasProjectContext(session: HermesSessionRow): boolean {\n return Boolean(\n (typeof session.system_prompt === 'string' && session.system_prompt.trim().length > 0) ||\n (typeof session.title === 'string' && session.title.trim().length > 0)\n );\n}\n\nfunction matchesProject(session: HermesSessionRow, projectPath?: string): boolean {\n if (!projectPath) return true;\n const haystack = getSessionProjectHaystack(session);\n if (!haystack) return false;\n return getProjectMatchVariants(projectPath).some((variant) => haystack.includes(variant));\n}\n\nfunction parseHermesEncodedContent(content: string | null): string | null {\n if (typeof content !== 'string') return null;\n if (content.length === 0) return null;\n\n const trimmed = content.trim();\n if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || (trimmed.startsWith('{') && trimmed.endsWith('}'))) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n const extracted = extractTextFromStructuredContent(parsed);\n if (extracted) return extracted;\n } catch {\n // Plain text that happens to look like JSON; keep it below.\n }\n }\n\n return content;\n}\n\nfunction extractTextFromStructuredContent(value: unknown): string | null {\n if (typeof value === 'string') return value.length > 0 ? value : null;\n if (Array.isArray(value)) {\n const texts = value\n .map((item) => extractTextFromStructuredContent(item))\n .filter((item): item is string => Boolean(item));\n return texts.length > 0 ? texts.join('\\n') : null;\n }\n if (typeof value === 'object' && value !== null) {\n const record = value as Record<string, unknown>;\n if (typeof record.text === 'string' && record.text.length > 0) return record.text;\n if (typeof record.content === 'string' && record.content.length > 0) return record.content;\n if (Array.isArray(record.content)) return extractTextFromStructuredContent(record.content);\n }\n return null;\n}\n\nfunction normalizeHermesMessage(\n row: HermesMessageRow,\n maxContentChars = HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS\n): NormalizedHermesMessage | 'empty-assistant' | 'unsupported' | 'trivial-user' {\n if (row.role !== 'user' && row.role !== 'assistant') return 'unsupported';\n const extracted = parseHermesEncodedContent(row.content);\n if (!extracted || extracted.trim().length === 0) {\n return row.role === 'assistant' ? 'empty-assistant' : 'trivial-user';\n }\n if (row.role === 'user' && !isWorthStoringPrompt(extracted)) return 'trivial-user';\n\n const truncated = extracted.length > maxContentChars;\n return {\n role: row.role,\n content: truncated ? `${extracted.slice(0, maxContentChars)}...[truncated]` : extracted,\n truncated\n };\n}\n\nfunction sanitizeForMemory(content: string): string {\n const filtered = applyPrivacyFilter(content, DEFAULT_PRIVACY_CONFIG).content;\n return truncateOutput(filtered, { maxLength: HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS, maxLines: 200 });\n}\n\nexport function getDefaultHermesStateDbPath(): string {\n return path.join(os.homedir(), '.hermes', 'state.db');\n}\n\nfunction openHermesDbReadOnly(stateDbPath: string): Database {\n if (!fs.existsSync(stateDbPath)) {\n throw new Error(`Hermes state database not found: ${stateDbPath}`);\n }\n return createDatabase(stateDbPath, { readOnly: true });\n}\n\nfunction listHermesSessions(db: Database): HermesSessionRow[] {\n return db.prepare(`\n SELECT id, source, user_id, model, system_prompt, started_at, ended_at, title\n FROM sessions\n ORDER BY started_at DESC, id DESC\n `).all() as HermesSessionRow[];\n}\n\nfunction getHermesSession(db: Database, sessionId: string): HermesSessionRow | null {\n const row = db.prepare(`\n SELECT id, source, user_id, model, system_prompt, started_at, ended_at, title\n FROM sessions\n WHERE id = ?\n `).get(sessionId) as HermesSessionRow | undefined;\n return row ?? null;\n}\n\nfunction listHermesMessages(db: Database, sessionId: string): HermesMessageRow[] {\n return db.prepare(`\n SELECT id, session_id, role, content, tool_name, timestamp\n FROM messages\n WHERE session_id = ?\n ORDER BY timestamp ASC, id ASC\n `).all(sessionId) as HermesMessageRow[];\n}\n\nexport const HERMES_IMPORTABLE_SESSION_SCAN_FACTOR = 50;\n\nfunction hasImportableHermesMessages(db: Database, sessionId: string): boolean {\n return listHermesMessages(db, sessionId).some((message) => {\n const normalized = normalizeHermesMessage(message);\n return typeof normalized === 'object' && normalized.role === 'user';\n });\n}\n\nfunction selectImportableHermesSessions(db: Database, sessions: HermesSessionRow[], sessionLimit: number): HermesSessionRow[] {\n if (!Number.isFinite(sessionLimit) || sessionLimit <= 0) return sessions;\n\n const selected: HermesSessionRow[] = [];\n const maxSessions = Math.floor(sessionLimit);\n const scanLimit = Math.min(sessions.length, Math.max(maxSessions, maxSessions * HERMES_IMPORTABLE_SESSION_SCAN_FACTOR));\n for (const session of sessions.slice(0, scanLimit)) {\n if (!hasImportableHermesMessages(db, session.id)) continue;\n selected.push(session);\n if (selected.length >= maxSessions) break;\n }\n return selected;\n}\n\nfunction createEmptyImportResult(): ImportResult {\n return {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n}\n\nfunction createEmptySessionSummary(session: HermesSessionRow, matched: boolean): HermesSessionReplaySummary {\n return {\n sessionId: session.id,\n source: session.source,\n matched,\n messagesRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectContext: !hasProjectContext(session),\n warnings: []\n };\n}\n\nfunction addToSourceSummary(\n summaries: Map<string, HermesSourceSummary>,\n sessionSummary: HermesSessionReplaySummary\n): void {\n const current = summaries.get(sessionSummary.source) ?? {\n source: sessionSummary.source,\n sessions: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n truncatedMessages: 0,\n emptyAssistantMessages: 0\n };\n\n current.sessions += 1;\n current.messagesNormalized += sessionSummary.messagesNormalized;\n current.turnsNormalized += sessionSummary.turnsNormalized;\n current.userMessages += sessionSummary.userMessages;\n current.assistantMessages += sessionSummary.assistantMessages;\n current.skippedUnsupportedMessages += sessionSummary.skippedUnsupportedMessages;\n current.truncatedMessages += sessionSummary.truncatedMessages;\n current.emptyAssistantMessages += sessionSummary.emptyAssistantMessages;\n summaries.set(sessionSummary.source, current);\n}\n\nexport async function validateHermesSessions(options: HermesValidationOptions = {}): Promise<HermesSessionValidationReport> {\n const stateDbPath = options.stateDbPath ?? getDefaultHermesStateDbPath();\n const maxContentChars = options.maxContentChars ?? HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const warnings: string[] = [];\n const totals: HermesValidationTotals = {\n sessionsScanned: 0,\n sessionsMatched: 0,\n messagesRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectContext: 0,\n warnings: 0\n };\n\n const db = openHermesDbReadOnly(stateDbPath);\n try {\n const sourceSummaries = new Map<string, HermesSourceSummary>();\n const sessionSummaries: HermesSessionReplaySummary[] = [];\n const sessions = listHermesSessions(db);\n const sessionLimit = options.limit ?? Infinity;\n let matchedCount = 0;\n\n for (const session of sessions) {\n totals.sessionsScanned++;\n const missingContext = !hasProjectContext(session);\n if (missingContext) totals.missingProjectContext++;\n\n const matched = matchesProject(session, options.projectPath);\n if (!matched) continue;\n if (matchedCount >= sessionLimit) continue;\n matchedCount++;\n totals.sessionsMatched++;\n\n const summary = createEmptySessionSummary(session, true);\n const messages = listHermesMessages(db, session.id);\n for (const message of messages) {\n summary.messagesRead++;\n totals.messagesRead++;\n\n const normalized = normalizeHermesMessage(message, maxContentChars);\n if (normalized === 'unsupported') {\n summary.skippedUnsupportedMessages++;\n totals.skippedUnsupportedMessages++;\n continue;\n }\n if (normalized === 'empty-assistant') {\n summary.emptyAssistantMessages++;\n totals.emptyAssistantMessages++;\n continue;\n }\n if (normalized === 'trivial-user') {\n continue;\n }\n\n summary.messagesNormalized++;\n totals.messagesNormalized++;\n if (normalized.truncated) {\n summary.truncatedMessages++;\n totals.truncatedMessages++;\n }\n if (normalized.role === 'user') {\n summary.userMessages++;\n summary.turnsNormalized++;\n totals.userMessages++;\n totals.turnsNormalized++;\n } else {\n summary.assistantMessages++;\n totals.assistantMessages++;\n }\n }\n\n sessionSummaries.push(summary);\n addToSourceSummary(sourceSummaries, summary);\n }\n\n if (totals.missingProjectContext > 0) {\n warnings.push(`${totals.missingProjectContext} Hermes session(s) have no project context in system prompt/title`);\n }\n totals.warnings = warnings.length;\n\n return {\n generatedAt: (options.now ?? new Date()).toISOString(),\n dryRun: true,\n willMutate: false,\n source: {\n stateDbPath,\n projectPath: options.projectPath,\n projectFilterApplied: Boolean(options.projectPath),\n sourcePaths: [stateDbPath]\n },\n limits: {\n sessionLimit: options.limit,\n maxContentChars\n },\n totals,\n topSources: [...sourceSummaries.values()].sort((a, b) => b.sessions - a.sessions || b.messagesNormalized - a.messagesNormalized),\n sessions: sessionSummaries,\n warnings\n };\n } finally {\n db.close();\n }\n}\n\nexport class HermesSessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly stateDbPath: string;\n\n constructor(memoryService: MemoryService, options: HermesSessionHistoryImporterOptions = {}) {\n this.memoryService = memoryService;\n this.stateDbPath = options.stateDbPath ?? getDefaultHermesStateDbPath();\n }\n\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n const sessions = listHermesSessions(db).filter((session) => matchesProject(session, projectPath));\n return await this.importSessionRows(db, sessions, { ...options, projectPath });\n } finally {\n db.close();\n }\n }\n\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n return await this.importSessionRows(db, listHermesSessions(db), options);\n } finally {\n db.close();\n }\n }\n\n async importSession(sessionId: string, options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n const sourceSessionId = sessionId.startsWith(HERMES_MEMORY_SESSION_PREFIX)\n ? sessionId.slice(HERMES_MEMORY_SESSION_PREFIX.length)\n : sessionId;\n const session = getHermesSession(db, sourceSessionId);\n if (!session) {\n return { ...createEmptyImportResult(), totalSessions: 1, errors: [`Hermes session not found: ${sessionId}`] };\n }\n return await this.importSessionRows(db, [session], options);\n } finally {\n db.close();\n }\n }\n\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n source: string;\n startedAt: Date;\n messageCount: number;\n }>> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n return listHermesSessions(db)\n .filter((session) => matchesProject(session, projectPath))\n .map((session) => ({\n sessionId: session.id,\n source: session.source,\n startedAt: new Date(session.started_at * 1000),\n messageCount: listHermesMessages(db, session.id).length\n }));\n } finally {\n db.close();\n }\n }\n\n private async importSessionRows(\n db: Database,\n sessions: HermesSessionRow[],\n options: ImportOptions = {}\n ): Promise<ImportResult> {\n const result = createEmptyImportResult();\n const onProgress = options.onProgress;\n const sessionLimit = options.sessionLimit ?? Infinity;\n const selectedSessions = selectImportableHermesSessions(db, sessions, sessionLimit);\n\n onProgress?.({ phase: 'scan', message: `Found ${sessions.length} Hermes session(s)` });\n\n for (let i = 0; i < selectedSessions.length; i++) {\n const session = selectedSessions[i];\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessions.length, filePath: this.stateDbPath });\n\n let sessionStoredCount = 0;\n const memorySessionId = makeMemorySessionId(session.id);\n const sessionResult = await this.importOneSession(\n db,\n session,\n memorySessionId,\n options,\n i,\n () => sessionStoredCount,\n (next) => { sessionStoredCount = next; }\n );\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n }\n\n onProgress?.({ phase: 'done', result });\n return result;\n }\n\n private async importOneSession(\n db: Database,\n session: HermesSessionRow,\n memorySessionId: string,\n options: ImportOptions,\n sessionIndex: number,\n getStoredCount: () => number,\n setStoredCount: (next: number) => void\n ): Promise<ImportResult> {\n const result = { ...createEmptyImportResult(), totalSessions: 1 };\n const effectiveProjectPath = options.projectPath;\n\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(memorySessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${memorySessionId}`);\n }\n }\n\n await this.memoryService.startSession(memorySessionId, effectiveProjectPath);\n\n const messages = listHermesMessages(db, session.id);\n let currentTurnId: string | null = null;\n let textBuffer: Array<{ content: string; row: HermesMessageRow }> = [];\n let lastProgressAt = 0;\n\n const flushTextBuffer = async () => {\n if (getStoredCount() >= (options.limit ?? Infinity)) {\n textBuffer = [];\n return;\n }\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n const contentBlocks = textBuffer.map((item) => item.content);\n const substantive = contentBlocks.filter((content) => content.length >= 100);\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : contentBlocks.reduce((a, b) => a.length >= b.length ? a : b, '');\n if (!merged) {\n textBuffer = [];\n return;\n }\n\n const lastRow = textBuffer[textBuffer.length - 1].row;\n const appendResult = await this.memoryService.storeAgentResponse(\n memorySessionId,\n sanitizeForMemory(merged),\n {\n importedFrom: this.stateDbPath,\n originalTimestamp: timestampToIso(lastRow.timestamp),\n sourceMessageId: lastRow.id,\n turnId: currentTurnId,\n source: 'hermes',\n hermesSource: session.source,\n sourceSessionId: session.id,\n sourceSessionHash: hashLabel(session.id)\n }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n setStoredCount(getStoredCount() + 1);\n textBuffer = [];\n };\n\n for (const message of messages) {\n if (getStoredCount() >= (options.limit ?? Infinity)) break;\n result.totalMessages++;\n const normalized = normalizeHermesMessage(message);\n\n if (normalized === 'unsupported' || normalized === 'empty-assistant') {\n continue;\n }\n if (normalized === 'trivial-user') {\n result.skippedDuplicates++;\n continue;\n }\n\n if (normalized.role === 'user') {\n await flushTextBuffer();\n currentTurnId = randomUUID();\n const appendResult = await this.memoryService.storeUserPrompt(\n memorySessionId,\n sanitizeForMemory(normalized.content),\n {\n importedFrom: this.stateDbPath,\n originalTimestamp: timestampToIso(message.timestamp),\n sourceMessageId: message.id,\n turnId: currentTurnId,\n source: 'hermes',\n hermesSource: session.source,\n sourceSessionId: session.id,\n sourceSessionHash: hashLabel(session.id)\n }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n setStoredCount(getStoredCount() + 1);\n } else {\n textBuffer.push({ content: normalized.content, row: message });\n }\n\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n options.onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n }\n\n await flushTextBuffer();\n await this.memoryService.endSession(memorySessionId);\n\n if (effectiveProjectPath) {\n registerSession(memorySessionId, effectiveProjectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from Hermes session ${session.id}`);\n }\n\n return result;\n }\n}\n\nexport function createHermesSessionHistoryImporter(\n memoryService: MemoryService,\n options: HermesSessionHistoryImporterOptions = {}\n): HermesSessionHistoryImporter {\n return new HermesSessionHistoryImporter(memoryService, options);\n}\n", "/**\n * Private Tag Parser\n * Parses and removes <private> tags from content\n */\n\nexport interface PrivateSection {\n start: number;\n end: number;\n content: string;\n format: 'xml' | 'bracket' | 'comment';\n}\n\nexport interface ParseResult {\n filtered: string;\n sections: PrivateSection[];\n stats: {\n count: number;\n totalLength: number;\n };\n}\n\nexport interface ParseOptions {\n formats: Array<'xml' | 'bracket' | 'comment'>;\n marker: string;\n}\n\n// Tag patterns for different formats\nconst TAG_PATTERNS: Record<string, RegExp> = {\n xml: /<private>([\\s\\S]*?)<\\/private>/gi,\n bracket: /\\[private\\]([\\s\\S]*?)\\[\\/private\\]/gi,\n comment: /<!--\\s*private\\s*-->([\\s\\S]*?)<!--\\s*\\/private\\s*-->/gi\n};\n\n/**\n * Parse and remove private tags from text\n */\nexport function parsePrivateTags(\n text: string,\n options: ParseOptions\n): ParseResult {\n const sections: PrivateSection[] = [];\n let filtered = text;\n\n // Find all private sections for each format\n for (const format of options.formats) {\n const pattern = TAG_PATTERNS[format];\n if (!pattern) continue;\n\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match;\n while ((match = pattern.exec(text)) !== null) {\n sections.push({\n start: match.index,\n end: match.index + match[0].length,\n content: match[1],\n format: format as PrivateSection['format']\n });\n }\n }\n\n // Remove all tags and replace with marker\n for (const format of options.formats) {\n const pattern = TAG_PATTERNS[format];\n if (!pattern) continue;\n\n // Need to create new regex for replacement (global flag issues)\n const replacePattern = new RegExp(pattern.source, 'gi');\n\n filtered = filtered.replace(replacePattern, (_match, content: string) => {\n // Empty tags are completely removed\n if (!content.trim()) return '';\n return options.marker;\n });\n }\n\n return {\n filtered,\n sections,\n stats: {\n count: sections.length,\n totalLength: sections.reduce((sum, s) => sum + s.content.length, 0)\n }\n };\n}\n\n/**\n * Parse private tags safely, protecting code blocks\n */\nexport function parsePrivateTagsSafe(\n text: string,\n options: ParseOptions\n): ParseResult {\n // 1. Extract and protect code blocks\n const codeBlocks: string[] = [];\n const textWithPlaceholders = text.replace(\n /```[\\s\\S]*?```/g,\n (match) => {\n codeBlocks.push(match);\n return `__CODE_BLOCK_${codeBlocks.length - 1}__`;\n }\n );\n\n // Also protect inline code\n const inlineCode: string[] = [];\n const textWithAllPlaceholders = textWithPlaceholders.replace(\n /`[^`]+`/g,\n (match) => {\n inlineCode.push(match);\n return `__INLINE_CODE_${inlineCode.length - 1}__`;\n }\n );\n\n // 2. Parse private tags\n const result = parsePrivateTags(textWithAllPlaceholders, options);\n\n // 3. Restore inline code\n result.filtered = result.filtered.replace(\n /__INLINE_CODE_(\\d+)__/g,\n (_, idx) => inlineCode[Number(idx)]\n );\n\n // 4. Restore code blocks\n result.filtered = result.filtered.replace(\n /__CODE_BLOCK_(\\d+)__/g,\n (_, idx) => codeBlocks[Number(idx)]\n );\n\n return result;\n}\n\n/**\n * Check if text has unclosed private tags\n */\nexport function hasUnmatchedOpenTag(text: string): boolean {\n // Check for opening tags without closing\n const openXml = (text.match(/<private>/gi) || []).length;\n const closeXml = (text.match(/<\\/private>/gi) || []).length;\n\n const openBracket = (text.match(/\\[private\\]/gi) || []).length;\n const closeBracket = (text.match(/\\[\\/private\\]/gi) || []).length;\n\n return openXml !== closeXml || openBracket !== closeBracket;\n}\n", "/**\n * Privacy Filter\n * Combines pattern-based filtering with private tag parsing\n */\n\nimport { parsePrivateTagsSafe, hasUnmatchedOpenTag } from './tag-parser.js';\nimport type { Config } from '../types.js';\n\nexport interface FilterResult {\n content: string;\n metadata: {\n hasPrivateTags: boolean;\n privateTagCount: number;\n patternMatchCount: number;\n originalLength: number;\n filteredLength: number;\n hasUnmatchedTags: boolean;\n };\n}\n\n// Sensitive data patterns\nconst SENSITIVE_PATTERNS = [\n // Credential-bearing URLs/connection strings with userinfo before the host.\n // Redact the whole URI so usernames, credentials, hosts, paths, and query\n // params do not leak either.\n /\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s'\"`<>/@]+@[^\\s'\"`<>]+/gi,\n /password\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /api[_-]?key\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /secret\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /token\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /bearer\\s+[a-zA-Z0-9\\-_.]+/gi,\n /AWS[_-]?ACCESS[_-]?KEY[_-]?ID\\s*[:=]\\s*['\"]?[A-Z0-9]+/gi,\n /AWS[_-]?SECRET[_-]?ACCESS[_-]?KEY\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /-----BEGIN\\s+(RSA\\s+)?PRIVATE\\s+KEY-----[\\s\\S]*?-----END\\s+(RSA\\s+)?PRIVATE\\s+KEY-----/g,\n /ghp_[a-zA-Z0-9]{36}/g, // GitHub Personal Access Token\n /sk-[a-zA-Z0-9]{48}/g, // OpenAI API Key\n];\n\nfunction maskSensitiveString(value: string): string {\n let filtered = value;\n for (const pattern of SENSITIVE_PATTERNS) {\n pattern.lastIndex = 0;\n filtered = filtered.replace(pattern, '[REDACTED]');\n }\n return filtered;\n}\n\n/**\n * Apply privacy filter to content\n */\nexport function applyPrivacyFilter(\n content: string,\n config: Config['privacy']\n): FilterResult {\n let filtered = content;\n let privateTagCount = 0;\n let patternMatchCount = 0;\n const hasUnmatchedTags = hasUnmatchedOpenTag(content);\n\n // 1. Private tag filtering\n if (config.privateTags?.enabled !== false) {\n const tagResult = parsePrivateTagsSafe(filtered, {\n formats: config.privateTags?.supportedFormats || ['xml'],\n marker: config.privateTags?.marker || '[PRIVATE]'\n });\n filtered = tagResult.filtered;\n privateTagCount = tagResult.stats.count;\n }\n\n // 2. Built-in sensitive pattern filtering\n for (const pattern of SENSITIVE_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n const matches = filtered.match(pattern);\n if (matches) {\n patternMatchCount += matches.length;\n filtered = filtered.replace(pattern, '[REDACTED]');\n }\n }\n\n // 3. Custom pattern filtering from config\n for (const patternStr of config.excludePatterns || []) {\n try {\n const regex = new RegExp(\n `(${patternStr})\\\\s*[:=]\\\\s*['\"]?[^\\\\s'\"]+`,\n 'gi'\n );\n const matches = filtered.match(regex);\n if (matches) {\n patternMatchCount += matches.length;\n filtered = filtered.replace(regex, '[REDACTED]');\n }\n } catch {\n // Invalid regex pattern, skip\n }\n }\n\n // 4. Clean up consecutive markers\n filtered = filtered.replace(/(\\[PRIVATE\\]\\s*)+/g, '[PRIVATE]\\n');\n filtered = filtered.replace(/(\\[REDACTED\\]\\s*)+/g, '[REDACTED] ');\n\n return {\n content: filtered,\n metadata: {\n hasPrivateTags: privateTagCount > 0,\n privateTagCount,\n patternMatchCount,\n originalLength: content.length,\n filteredLength: filtered.length,\n hasUnmatchedTags\n }\n };\n}\n\n/**\n * Mask sensitive data in tool input (recursively)\n */\nexport function maskSensitiveInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n // Check if key suggests sensitive data\n const sensitiveKeys = ['password', 'secret', 'key', 'token', 'auth', 'credential'];\n const isSensitiveKey = sensitiveKeys.some(k =>\n key.toLowerCase().includes(k)\n );\n\n if (isSensitiveKey && typeof value === 'string') {\n result[key] = '[REDACTED]';\n } else if (typeof value === 'string') {\n // Apply pattern filtering to string values\n result[key] = maskSensitiveString(value);\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result[key] = maskSensitiveInput(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[key] = value.map(item => {\n if (typeof item === 'string') {\n return isSensitiveKey ? '[REDACTED]' : maskSensitiveString(item);\n }\n return typeof item === 'object' && item !== null\n ? maskSensitiveInput(item as Record<string, unknown>)\n : item;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Truncate output with head + tail strategy\n */\nexport function truncateOutput(\n output: string,\n options: { maxLength?: number; maxLines?: number }\n): string {\n const { maxLength = 10000, maxLines = 100 } = options;\n\n // Split into lines\n const lines = output.split('\\n');\n\n // Apply line limit first\n if (lines.length > maxLines) {\n const headLines = Math.ceil(maxLines / 2);\n const tailLines = Math.floor(maxLines / 2);\n const head = lines.slice(0, headLines);\n const tail = lines.slice(-tailLines);\n const truncatedLines = [\n ...head,\n `\\n... [${lines.length - maxLines} lines truncated] ...\\n`,\n ...tail\n ];\n output = truncatedLines.join('\\n');\n }\n\n // Apply character limit\n if (output.length > maxLength) {\n const headChars = Math.ceil(maxLength / 2);\n const tailChars = Math.floor(maxLength / 2);\n output = output.slice(0, headChars) +\n `\\n... [${output.length - maxLength} characters truncated] ...\\n` +\n output.slice(-tailChars);\n }\n\n return output;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport interface BootstrapKnowledgeOptions {\n repoPath: string;\n outDir: string;\n since?: string;\n maxCommits?: number;\n incremental?: boolean;\n}\n\ninterface CommitInfo {\n hash: string;\n date: string;\n author: string;\n subject: string;\n files: string[];\n}\n\ninterface ModuleSummary {\n name: string;\n root: string;\n fileCount: number;\n languages: string[];\n entryCandidates: string[];\n}\n\nconst EXCLUDED_DIRS = new Set(['.git', 'node_modules', 'dist', 'build', 'coverage', '.next', '.turbo', 'memory']);\nconst CODE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', '.java', '.kt', '.swift', '.rb', '.php', '.cs',\n '.scala', '.sh', '.zsh', '.yaml', '.yml', '.json', '.sql', '.md'\n]);\n\nfunction safeRel(base: string, target: string): string {\n return path.relative(base, target).replaceAll('\\\\', '/');\n}\n\nfunction mkdirp(dir: string): void {\n fs.mkdirSync(dir, { recursive: true });\n}\n\nfunction walkCodeFiles(root: string): string[] {\n const out: string[] = [];\n\n function walk(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (!EXCLUDED_DIRS.has(e.name)) walk(full);\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (CODE_EXTENSIONS.has(ext)) out.push(full);\n }\n }\n }\n\n walk(root);\n return out.sort();\n}\n\nfunction detectLanguage(file: string): string {\n const ext = path.extname(file).toLowerCase();\n const map: Record<string, string> = {\n '.ts': 'TypeScript', '.tsx': 'TypeScript', '.js': 'JavaScript', '.jsx': 'JavaScript', '.mjs': 'JavaScript', '.cjs': 'JavaScript',\n '.py': 'Python', '.go': 'Go', '.rs': 'Rust', '.java': 'Java', '.kt': 'Kotlin', '.swift': 'Swift', '.rb': 'Ruby', '.php': 'PHP',\n '.cs': 'C#', '.scala': 'Scala', '.sh': 'Shell', '.zsh': 'Shell', '.yaml': 'YAML', '.yml': 'YAML', '.json': 'JSON', '.sql': 'SQL', '.md': 'Markdown'\n };\n return map[ext] || 'Other';\n}\n\nfunction summarizeModules(repoPath: string, files: string[]): ModuleSummary[] {\n const modules = new Map<string, { files: string[]; langs: Map<string, number> }>();\n\n for (const abs of files) {\n const rel = safeRel(repoPath, abs);\n const seg = rel.split('/').filter(Boolean);\n const top = seg[0] || 'root';\n\n if (!modules.has(top)) modules.set(top, { files: [], langs: new Map() });\n\n const bucket = modules.get(top)!;\n bucket.files.push(rel);\n\n const lang = detectLanguage(abs);\n bucket.langs.set(lang, (bucket.langs.get(lang) || 0) + 1);\n }\n\n return [...modules.entries()]\n .map(([name, data]) => ({\n name,\n root: name,\n fileCount: data.files.length,\n languages: [...data.langs.entries()].sort((a, b) => b[1] - a[1]).map(([l]) => l).slice(0, 5),\n entryCandidates: data.files.filter((f) => /(index|main|app|server|cli)\\./i.test(path.basename(f))).slice(0, 10)\n }))\n .sort((a, b) => b.fileCount - a.fileCount || a.name.localeCompare(b.name));\n}\n\nfunction runGit(repoPath: string, command: string): string {\n return execSync(`git -C ${JSON.stringify(repoPath)} ${command}`, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });\n}\n\nfunction parseGitLog(raw: string): CommitInfo[] {\n const lines = raw.split(/\\r?\\n/);\n const commits: CommitInfo[] = [];\n let current: CommitInfo | null = null;\n\n for (const line of lines) {\n if (!line.trim()) {\n if (current) {\n commits.push(current);\n current = null;\n }\n continue;\n }\n\n if (line.includes('\\t') && line.split('\\t').length >= 4) {\n if (current) commits.push(current);\n const [hash, date, author, ...subjectRest] = line.split('\\t');\n current = { hash, date, author, subject: subjectRest.join('\\t').trim(), files: [] };\n } else if (current) {\n current.files.push(line.trim());\n }\n }\n\n if (current) commits.push(current);\n return commits;\n}\n\nfunction getGitCommits(repoPath: string, since = '180 days ago', maxCommits = 1000): CommitInfo[] {\n try {\n const raw = runGit(\n repoPath,\n `log --since=${JSON.stringify(since)} -n ${Math.max(1, maxCommits)} --date=short --pretty=format:%H%x09%ad%x09%an%x09%s --name-only --reverse`\n );\n return parseGitLog(raw);\n } catch {\n return [];\n }\n}\n\nfunction getGitCommitsAfterHash(repoPath: string, hash: string, maxCommits = 1000): CommitInfo[] {\n try {\n const raw = runGit(\n repoPath,\n `log ${JSON.stringify(`${hash}..HEAD`)} -n ${Math.max(1, maxCommits)} --date=short --pretty=format:%H%x09%ad%x09%an%x09%s --name-only --reverse`\n );\n return parseGitLog(raw);\n } catch {\n return [];\n }\n}\n\nfunction extractDecisions(commits: CommitInfo[]): CommitInfo[] {\n const decisionPattern = /(refactor|migrate|deprecat|remove|replace|introduce|adopt|switch|upgrade|breaking|architecture|feat|fix)/i;\n return commits.filter((c) => decisionPattern.test(c.subject));\n}\n\nfunction buildTimeline(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const timeline = new Map<string, CommitInfo[]>();\n for (const c of commits) {\n const key = (c.date || '').slice(0, 7) || 'unknown';\n if (!timeline.has(key)) timeline.set(key, []);\n timeline.get(key)!.push(c);\n }\n return new Map([...timeline.entries()].sort((a, b) => a[0].localeCompare(b[0])));\n}\n\nfunction buildGlossary(files: string[]): string[] {\n const stop = new Set(['src', 'test', 'dist', 'lib', 'core', 'index', 'main', 'app', 'server', 'client', 'utils']);\n const freq = new Map<string, number>();\n\n for (const f of files) {\n const base = path.basename(f, path.extname(f));\n const tokens = base\n .split(/[^a-zA-Z0-9]+/)\n .flatMap((t) => t.split(/(?=[A-Z])/))\n .map((t) => t.toLowerCase())\n .filter((t) => t.length >= 3 && !stop.has(t));\n\n for (const t of tokens) freq.set(t, (freq.get(t) || 0) + 1);\n }\n\n return [...freq.entries()]\n .filter(([, count]) => count >= 2)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 80)\n .map(([term]) => term);\n}\n\nfunction writeFile(filePath: string, content: string): void {\n mkdirp(path.dirname(filePath));\n fs.writeFileSync(filePath, content, 'utf8');\n}\n\nfunction confidenceByEvidence(sourceCount: number): 'high' | 'mid' | 'low' {\n if (sourceCount >= 3) return 'high';\n if (sourceCount >= 1) return 'mid';\n return 'low';\n}\n\nfunction sourceLine(source: string): string {\n return `- source: ${source}`;\n}\n\ninterface ExistingManifest {\n generatedAt?: string;\n lastCommitDate?: string;\n lastCommitHash?: string;\n}\n\nfunction loadExistingManifest(outDir: string): ExistingManifest | null {\n try {\n const p = path.join(outDir, 'sources', 'manifest.json');\n if (!fs.existsSync(p)) return null;\n const data = JSON.parse(fs.readFileSync(p, 'utf8')) as ExistingManifest;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction listMarkdownOutputs(outDir: string): string[] {\n const out: string[] = [];\n const stack = [outDir];\n while (stack.length) {\n const dir = stack.pop()!;\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nexport async function bootstrapKnowledgeBase(options: BootstrapKnowledgeOptions): Promise<{\n outDir: string;\n fileCount: number;\n moduleCount: number;\n commitCount: number;\n generatedFiles: string[];\n}> {\n const repoPath = path.resolve(options.repoPath);\n const outDir = path.resolve(options.outDir);\n const maxCommits = options.maxCommits ?? 1000;\n\n const existingManifest = options.incremental ? loadExistingManifest(outDir) : null;\n const incrementalSince = existingManifest?.lastCommitDate || existingManifest?.generatedAt;\n const since = options.since || incrementalSince || '180 days ago';\n\n const codeFiles = walkCodeFiles(repoPath);\n const modules = summarizeModules(repoPath, codeFiles);\n const commits = options.incremental && existingManifest?.lastCommitHash\n ? getGitCommitsAfterHash(repoPath, existingManifest.lastCommitHash, maxCommits)\n : getGitCommits(repoPath, since, maxCommits);\n const decisions = extractDecisions(commits);\n const timeline = buildTimeline(commits);\n const glossary = buildGlossary(codeFiles);\n\n const generatedFiles: string[] = [];\n\n const sections = {\n overview: path.join(outDir, 'overview'),\n modules: path.join(outDir, 'modules'),\n decisions: path.join(outDir, 'decisions'),\n timeline: path.join(outDir, 'timeline'),\n glossary: path.join(outDir, 'glossary'),\n sources: path.join(outDir, 'sources')\n };\n\n for (const sectionDir of Object.values(sections)) {\n mkdirp(sectionDir);\n }\n\n const overviewPath = path.join(sections.overview, 'overview.md');\n const overview = [\n '# Codebase Overview',\n '',\n `- generatedAt: ${new Date().toISOString()}`,\n '- deterministicPipeline: true',\n `- repo: ${repoPath}`,\n `- filesAnalyzed: ${codeFiles.length}`,\n `- commitsAnalyzed: ${commits.length}`,\n `- confidence: ${confidenceByEvidence(modules.length > 0 ? 3 : 0)}`,\n '',\n '## Directory / Module Map',\n ...modules.slice(0, 50).map((m) => `- ${m.name}: ${m.fileCount} files (${m.languages.join(', ') || 'n/a'})`),\n '',\n '## Fact',\n '- Generated from deterministic file scan and git history parsing.',\n '',\n '## Inference',\n '- Module responsibilities should be reviewed by maintainers for nuanced boundaries.',\n '',\n '## Sources',\n sourceLine(`repo-scan:${repoPath}`),\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(overviewPath, overview);\n generatedFiles.push(overviewPath);\n\n const touchedRoots = new Set(\n commits\n .flatMap((c) => c.files)\n .map((f) => f.split('/').filter(Boolean)[0])\n .filter(Boolean)\n );\n const moduleTargets = options.incremental && touchedRoots.size > 0\n ? modules.filter((m) => touchedRoots.has(m.root)).slice(0, 200)\n : modules.slice(0, 200);\n\n for (const m of moduleTargets) {\n const relatedCommits = commits.filter((c) => c.files.some((f) => f.startsWith(`${m.root}/`))).slice(0, 15);\n const content = [\n `# Module: ${m.name}`,\n '',\n `- responsibility: inferred from top-level path \\`${m.root}/\\``,\n `- files: ${m.fileCount}`,\n `- languages: ${m.languages.join(', ') || 'n/a'}`,\n `- confidence: ${confidenceByEvidence(relatedCommits.length)}`,\n '',\n '## Entry Candidates',\n ...(m.entryCandidates.length > 0 ? m.entryCandidates.map((f) => `- ${f}`) : ['- none detected']),\n '',\n '## Related Commits (recent sample)',\n ...(relatedCommits.length > 0\n ? relatedCommits.map((c) => `- ${c.date} ${c.hash.slice(0, 8)} ${c.subject}`)\n : ['- none in selected range']),\n '',\n '## Sources',\n sourceLine(`repo-path:${m.root}/**`),\n ...relatedCommits.map((c) => sourceLine(`commit:${c.hash}`)),\n ''\n ].join('\\n');\n\n const modulePath = path.join(sections.modules, `${m.name.replace(/[^a-z0-9._-]+/gi, '-').toLowerCase()}.md`);\n writeFile(modulePath, content);\n generatedFiles.push(modulePath);\n }\n\n const decisionsPath = path.join(sections.decisions, 'decisions.md');\n const decisionsMd = [\n '# Decisions (extracted)',\n '',\n `- confidence: ${confidenceByEvidence(decisions.length)}`,\n '',\n ...(decisions.length > 0\n ? decisions.slice(0, 500).map((d) => [\n `## ${d.date} | ${d.subject}`,\n '- status: active (inferred)',\n sourceLine(`commit:${d.hash}`),\n `- author: ${d.author}`,\n `- changedFiles: ${d.files.length}`,\n `- confidence: ${confidenceByEvidence(d.files.length > 0 ? 2 : 1)}`,\n ''\n ].join('\\n'))\n : ['- No decision-like commits found in selected range.', '']),\n '## Sources',\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(decisionsPath, decisionsMd);\n generatedFiles.push(decisionsPath);\n\n const timelinePath = path.join(sections.timeline, 'timeline.md');\n const timelineMd = [\n '# Timeline',\n '',\n `- confidence: ${confidenceByEvidence(commits.length > 0 ? 2 : 0)}`,\n '',\n ...[...timeline.entries()].flatMap(([month, list]) => [\n `## ${month}`,\n ...list.slice(0, 40).map((c) => `- ${c.date} ${c.hash.slice(0, 8)} ${c.subject}`),\n ''\n ]),\n '## Sources',\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(timelinePath, timelineMd);\n generatedFiles.push(timelinePath);\n\n const glossaryPath = path.join(sections.glossary, 'glossary.md');\n const glossaryMd = [\n '# Glossary (auto-extracted)',\n '',\n `- confidence: ${confidenceByEvidence(glossary.length > 0 ? 1 : 0)}`,\n '',\n ...glossary.map((t) => `- ${t}`),\n '',\n '## Sources',\n sourceLine(`repo-scan:${repoPath}`),\n ''\n ].join('\\n');\n writeFile(glossaryPath, glossaryMd);\n generatedFiles.push(glossaryPath);\n\n const outputs = generatedFiles.map((f) => safeRel(outDir, f)).sort((a, b) => a.localeCompare(b));\n const allOutputs = listMarkdownOutputs(outDir).map((f) => safeRel(outDir, f));\n\n const sourceItems = [\n ...codeFiles.slice(0, 200).map((f) => ({ type: 'file', ref: safeRel(repoPath, f) })),\n ...commits.slice(0, 400).map((c) => ({ type: 'commit', ref: c.hash, date: c.date, subject: c.subject }))\n ];\n\n const latestCommitDate = commits.length > 0 ? commits[commits.length - 1].date : existingManifest?.lastCommitDate;\n const latestCommitHash = commits.length > 0 ? commits[commits.length - 1].hash : existingManifest?.lastCommitHash;\n const manifest = {\n generatedAt: new Date().toISOString(),\n deterministicPipeline: true,\n mode: options.incremental ? 'incremental' : 'full',\n repoPath,\n options: { since, maxCommits, incremental: Boolean(options.incremental) },\n stats: {\n filesAnalyzed: codeFiles.length,\n modules: modules.length,\n modulesGenerated: moduleTargets.length,\n commits: commits.length,\n decisions: decisions.length,\n glossaryTerms: glossary.length\n },\n lastCommitDate: latestCommitDate,\n lastCommitHash: latestCommitHash,\n outputs,\n allOutputs,\n sources: sourceItems\n };\n\n const manifestJsonPath = path.join(sections.sources, 'manifest.json');\n writeFile(manifestJsonPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n generatedFiles.push(manifestJsonPath);\n\n const manifestMdPath = path.join(sections.sources, 'manifest.md');\n const manifestMd = [\n '# Sources Manifest',\n '',\n '- deterministicPipeline: true',\n `- mode: ${options.incremental ? 'incremental' : 'full'}`,\n `- sourceCount: ${sourceItems.length}`,\n '',\n '## Outputs',\n ...outputs.map((o) => `- ${o}`),\n '',\n '## Sources (sample)',\n ...sourceItems.slice(0, 300).map((s) => `- ${s.type}:${s.ref}`),\n ''\n ].join('\\n');\n writeFile(manifestMdPath, manifestMd);\n generatedFiles.push(manifestMdPath);\n\n return {\n outDir,\n fileCount: codeFiles.length,\n moduleCount: modules.length,\n commitCount: commits.length,\n generatedFiles: generatedFiles.sort((a, b) => a.localeCompare(b))\n };\n}\n", "/**\n * Web Viewer HTTP Server\n * Provides REST API and serves static UI files\n */\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { serve } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { fileURLToPath as fileUrlToPath } from 'url';\n\nimport { apiRouter } from './api/index.js';\n\nconst app = new Hono();\nconst moduleDir = path.dirname(fileUrlToPath(import.meta.url));\n\n// Middleware\napp.use('/*', cors());\napp.use('/*', logger());\n\n// API routes\napp.route('/api', apiRouter);\n\n// Health check\napp.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));\n\nfunction resolveUiPath(): string {\n const candidates = [\n // Built server: dist/server/index.js -> dist/ui\n path.resolve(moduleDir, '../ui'),\n // Source/dev server: src/apps/server/index.ts -> src/apps/dashboard\n path.resolve(moduleDir, '../dashboard'),\n // Fallback when running from a repository root.\n path.resolve(process.cwd(), 'dist/ui'),\n path.resolve(process.cwd(), 'src/apps/dashboard')\n ];\n\n return candidates.find((candidate) => fs.existsSync(path.join(candidate, 'index.html'))) ?? candidates[0];\n}\n\n// Static files (UI)\nconst uiPath = resolveUiPath();\nif (fs.existsSync(uiPath)) {\n app.use('/*', serveStatic({ root: uiPath }));\n}\n\n// Fallback for SPA routing\napp.get('*', (c) => {\n const indexPath = path.join(uiPath, 'index.html');\n if (fs.existsSync(indexPath)) {\n return c.html(fs.readFileSync(indexPath, 'utf-8'));\n }\n return c.text('UI not built. Run \"npm run build:ui\" first.', 404);\n});\n\nexport { app };\n\nlet serverInstance: ReturnType<typeof serve> | null = null;\n\n/**\n * Start the HTTP server\n */\nexport function startServer(port: number = 37777): NonNullable<ReturnType<typeof serve>> {\n if (serverInstance) {\n return serverInstance;\n }\n\n serverInstance = serve({\n fetch: app.fetch,\n port,\n hostname: '127.0.0.1'\n });\n\n console.log(`\uD83E\uDDE0 Code Memory viewer started at http://localhost:${port}`);\n\n return serverInstance;\n}\n\n/**\n * Stop the HTTP server\n */\nexport function stopServer(): void {\n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n }\n}\n\n/**\n * Check if server is running on given port\n */\nexport async function isServerRunning(port: number = 37777): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n// Start server if run directly\n// Check if this file is being run directly (not imported)\nconst isMainModule = process.argv[1]?.includes('server/index') ||\n process.argv[1]?.endsWith('server.js');\nif (isMainModule) {\n const port = parseInt(process.env.PORT || '37777', 10);\n startServer(port);\n}\n", "/**\n * API Router\n * Central router for all API endpoints\n */\n\nimport { Hono } from 'hono';\nimport { sessionsRouter } from './sessions.js';\nimport { eventsRouter } from './events.js';\nimport { searchRouter } from './search.js';\nimport { statsRouter } from './stats.js';\nimport { citationsRouter } from './citations.js';\nimport { turnsRouter } from './turns.js';\nimport { projectsRouter } from './projects.js';\nimport { chatRouter } from './chat.js';\nimport { healthRouter } from './health.js';\n\nexport const apiRouter = new Hono()\n .route('/sessions', sessionsRouter)\n .route('/events', eventsRouter)\n .route('/search', searchRouter)\n .route('/stats', statsRouter)\n .route('/citations', citationsRouter)\n .route('/turns', turnsRouter)\n .route('/projects', projectsRouter)\n .route('/chat', chatRouter)\n .route('/health', healthRouter);\n", "/**\n * Sessions API\n * Endpoints for session management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const sessionsRouter = new Hono();\n\n// GET /api/sessions - List all sessions\nsessionsRouter.get('/', async (c) => {\n const page = parseInt(c.req.query('page') || '1', 10);\n const pageSize = parseInt(c.req.query('pageSize') || '20', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Get recent events and extract sessions\n const recentEvents = await memoryService.getRecentEvents(1000);\n\n // Group by session\n const sessionMap = new Map<string, {\n id: string;\n startedAt: Date;\n eventCount: number;\n lastEventAt: Date;\n }>();\n\n for (const event of recentEvents) {\n const existing = sessionMap.get(event.sessionId);\n if (!existing) {\n sessionMap.set(event.sessionId, {\n id: event.sessionId,\n startedAt: event.timestamp,\n eventCount: 1,\n lastEventAt: event.timestamp\n });\n } else {\n existing.eventCount++;\n if (event.timestamp < existing.startedAt) {\n existing.startedAt = event.timestamp;\n }\n if (event.timestamp > existing.lastEventAt) {\n existing.lastEventAt = event.timestamp;\n }\n }\n }\n\n const sessions = Array.from(sessionMap.values())\n .sort((a, b) => b.lastEventAt.getTime() - a.lastEventAt.getTime());\n\n const total = sessions.length;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n const paginatedSessions = sessions.slice(start, end);\n\n return c.json({\n sessions: paginatedSessions,\n total,\n page,\n pageSize,\n hasMore: end < total\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/sessions/:id - Get session details\nsessionsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const events = await memoryService.getSessionHistory(id);\n\n if (events.length === 0) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const session = {\n id,\n startedAt: events[0].timestamp,\n endedAt: events[events.length - 1].timestamp,\n eventCount: events.length\n };\n\n const eventsByType = {\n user_prompt: events.filter(e => e.eventType === 'user_prompt').length,\n agent_response: events.filter(e => e.eventType === 'agent_response').length,\n tool_observation: events.filter(e => e.eventType === 'tool_observation').length\n };\n\n return c.json({\n session,\n events: events.slice(0, 100).map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n preview: e.content.slice(0, 200) + (e.content.length > 200 ? '...' : '')\n })),\n stats: eventsByType\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * API Utilities\n * Shared helpers for API endpoints\n */\n\nimport type { Context } from 'hono';\nimport {\n DISABLED_SHARED_STORE_CONFIG,\n getReadOnlyMemoryService,\n MemoryService\n} from '../../../services/memory-service.js';\nimport { resolveProjectStoragePath } from '../../../core/registry/project-path.js';\n\n/**\n * Get the appropriate MemoryService based on the ?project= query parameter.\n * - If ?project=<hash> is set (8 hex chars), resolves directly to project storage\n * - If ?project=<path> is set, computes hash from path\n * - Otherwise, returns the global read-only service\n *\n * Always creates read-only services for the dashboard API to avoid\n * VectorWorker lifecycle issues with per-request services.\n */\nexport function getServiceFromQuery(c: Context): MemoryService {\n const project = c.req.query('project') || c.req.query('projectId');\n if (project) {\n const storagePath = resolveProjectStoragePath(project);\n\n return new MemoryService({\n storagePath,\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n }\n return getReadOnlyMemoryService();\n}\n\n\n/**\n * Read-only lightweight service for API paths that only need sqlite/keyword reads.\n * This avoids per-request vector/embedder/shared-store initialization for stats and\n * explicit fast searches while preserving the same project query resolution rules.\n */\nexport function getLightweightServiceFromQuery(c: Context): MemoryService {\n const project = c.req.query('project') || c.req.query('projectId');\n if (project) {\n const storagePath = resolveProjectStoragePath(project);\n\n return new MemoryService({\n storagePath,\n readOnly: true,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n }\n\n return new MemoryService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n}\n", "/**\n * Events API\n * Endpoints for event management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const eventsRouter = new Hono();\n\n// GET /api/events - List events with filters\neventsRouter.get('/', async (c) => {\n const sessionId = c.req.query('sessionId');\n const eventType = c.req.query('type');\n const level = c.req.query('level');\n const sort = c.req.query('sort') || 'recent'; // recent | accessed | oldest\n const q = (c.req.query('q') || '').trim().toLowerCase();\n const limit = parseInt(c.req.query('limit') || '100', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n let events: any[];\n\n // Filter by level using the dedicated method\n if (level) {\n events = await memoryService.getEventsByLevel(level, { limit: limit + offset + 1000, offset: 0 });\n } else {\n events = await memoryService.getRecentEvents(limit + offset + 1000);\n }\n\n // Filter by session\n if (sessionId) {\n events = events.filter(e => e.sessionId === sessionId);\n }\n\n // Filter by type\n if (eventType) {\n events = events.filter(e => e.eventType === eventType);\n }\n\n // Content query filter\n if (q) {\n events = events.filter(e => (e.content || '').toLowerCase().includes(q));\n }\n\n // Sort\n if (sort === 'accessed') {\n events.sort((a: any, b: any) => {\n const aTime = a.last_accessed_at || '';\n const bTime = b.last_accessed_at || '';\n return bTime.localeCompare(aTime);\n });\n } else if (sort === 'most-accessed') {\n events.sort((a: any, b: any) => (b.access_count || 0) - (a.access_count || 0));\n } else if (sort === 'oldest') {\n events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n }\n // 'recent' is default (already sorted by timestamp DESC from the query)\n\n // Pagination\n const total = events.length;\n events = events.slice(offset, offset + limit);\n\n return c.json({\n events: events.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n sessionId: e.sessionId,\n preview: e.content.slice(0, 200) + (e.content.length > 200 ? '...' : ''),\n contentLength: e.content.length,\n metadata: e.metadata,\n accessCount: (e as any).access_count || 0,\n lastAccessedAt: (e as any).last_accessed_at || null\n })),\n total,\n limit,\n offset,\n hasMore: offset + limit < total\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/events/:id - Get event details\neventsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const recentEvents = await memoryService.getRecentEvents(10000);\n const event = recentEvents.find(e => e.id === id);\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404);\n }\n\n // Get surrounding events for context\n const sessionEvents = recentEvents\n .filter(e => e.sessionId === event.sessionId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const eventIndex = sessionEvents.findIndex(e => e.id === id);\n const start = Math.max(0, eventIndex - 2);\n const end = Math.min(sessionEvents.length, eventIndex + 3);\n const context = sessionEvents.slice(start, end).filter(e => e.id !== id);\n\n return c.json({\n event: {\n id: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n content: event.content,\n metadata: event.metadata\n },\n context: context.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n preview: e.content.slice(0, 100) + (e.content.length > 100 ? '...' : '')\n }))\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Search API\n * Endpoints for memory search\n */\n\nimport { Hono } from 'hono';\nimport { getLightweightServiceFromQuery, getServiceFromQuery } from './utils.js';\n\nexport const searchRouter = new Hono();\n\ninterface SearchRequest {\n query: string;\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n eventType?: string;\n };\n}\n\ninterface DisclosureSearchRequest {\n query: string;\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: 'strict' | 'prefer' | 'global';\n allowedProjectHashes?: string[];\n strategy?: 'auto' | 'fast' | 'deep';\n };\n}\n\n// POST /api/search - Search memories\nsearchRouter.post('/', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const body = await c.req.json<SearchRequest>();\n\n if (!body.query) {\n return c.json({ error: 'Query is required' }, 400);\n }\n\n await memoryService.initialize();\n\n const startTime = Date.now();\n\n const result = await memoryService.retrieveMemories(body.query, {\n topK: body.options?.topK ?? 10,\n minScore: body.options?.minScore ?? 0.7,\n sessionId: body.options?.sessionId\n });\n\n const searchTime = Date.now() - startTime;\n\n return c.json({\n results: result.memories.map(m => ({\n id: m.event.id,\n eventType: m.event.eventType,\n timestamp: m.event.timestamp,\n sessionId: m.event.sessionId,\n score: m.score,\n content: m.event.content,\n preview: m.event.content.slice(0, 200) + (m.event.content.length > 200 ? '...' : ''),\n context: m.sessionContext\n })),\n meta: {\n totalMatches: result.memories.length,\n searchTime,\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/search/disclosure - Progressive disclosure search (Search layer)\nsearchRouter.post('/disclosure', async (c) => {\n let memoryService: ReturnType<typeof getServiceFromQuery> | undefined;\n try {\n const body = await c.req.json<DisclosureSearchRequest>();\n\n if (!body.query) {\n return c.json({ error: 'Query is required' }, 400);\n }\n\n memoryService = body.options?.strategy === 'fast'\n ? getLightweightServiceFromQuery(c)\n : getServiceFromQuery(c);\n\n await memoryService.initialize();\n const result = await memoryService.searchDisclosure(body.query, body.options);\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService?.shutdown();\n }\n});\n\n// GET /api/search/disclosure/:resultId/expand - Expand a disclosure search result\nsearchRouter.get('/disclosure/:resultId/expand', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const resultId = c.req.param('resultId');\n const rawWindowSize = c.req.query('windowSize');\n const windowSize = rawWindowSize ? parseInt(rawWindowSize, 10) : undefined;\n const result = await memoryService.expandDisclosure(\n resultId,\n Number.isFinite(windowSize) ? { windowSize } : undefined\n );\n\n if (!result) {\n return c.json({ error: 'Expansion target not found' }, 404);\n }\n\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/search/disclosure/:resultId/source - Resolve source for a disclosure search result\nsearchRouter.get('/disclosure/:resultId/source', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const resultId = c.req.param('resultId');\n const result = await memoryService.sourceDisclosure(resultId);\n\n if (!result) {\n return c.json({ error: 'Source not found' }, 404);\n }\n\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/search - Simple search via query param\nsearchRouter.get('/', async (c) => {\n const query = c.req.query('q');\n\n if (!query) {\n return c.json({ error: 'Query parameter \"q\" is required' }, 400);\n }\n\n const topK = parseInt(c.req.query('topK') || '5', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const result = await memoryService.retrieveMemories(query, { topK });\n\n return c.json({\n results: result.memories.map(m => ({\n id: m.event.id,\n eventType: m.event.eventType,\n timestamp: m.event.timestamp,\n score: m.score,\n preview: m.event.content.slice(0, 200) + (m.event.content.length > 200 ? '...' : '')\n })),\n meta: {\n totalMatches: result.memories.length,\n confidence: result.matchResult.confidence\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Stats API\n * Endpoints for storage statistics\n */\n\nimport { Hono } from 'hono';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getMemoryServiceForProject } from '../../../services/memory-service.js';\nimport { getLightweightServiceFromQuery, getServiceFromQuery } from './utils.js';\nimport type { MemoryEvent } from '../../../core/types.js';\n\nexport const statsRouter = new Hono();\n\ntype KpiWindow = '24h' | '7d' | '30d';\n\ntype KpiThresholds = {\n usefulRecallRateMin: number;\n reworkRateMax: number;\n postChangeFailureRateMax: number;\n avgCompletionTurnsMax: number;\n memoryHitRateMin: number;\n};\n\nconst DEFAULT_KPI_THRESHOLDS: KpiThresholds = {\n usefulRecallRateMin: 0.45,\n reworkRateMax: 0.25,\n postChangeFailureRateMax: 0.2,\n avgCompletionTurnsMax: 12,\n memoryHitRateMin: 0.35\n};\n\nfunction loadKpiThresholds(): KpiThresholds {\n try {\n const filePath = path.resolve(process.cwd(), 'config', 'kpi-thresholds.json');\n if (!fs.existsSync(filePath)) return DEFAULT_KPI_THRESHOLDS;\n const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Partial<KpiThresholds>;\n return {\n usefulRecallRateMin: Number(parsed.usefulRecallRateMin ?? DEFAULT_KPI_THRESHOLDS.usefulRecallRateMin),\n reworkRateMax: Number(parsed.reworkRateMax ?? DEFAULT_KPI_THRESHOLDS.reworkRateMax),\n postChangeFailureRateMax: Number(parsed.postChangeFailureRateMax ?? DEFAULT_KPI_THRESHOLDS.postChangeFailureRateMax),\n avgCompletionTurnsMax: Number(parsed.avgCompletionTurnsMax ?? DEFAULT_KPI_THRESHOLDS.avgCompletionTurnsMax),\n memoryHitRateMin: Number(parsed.memoryHitRateMin ?? DEFAULT_KPI_THRESHOLDS.memoryHitRateMin)\n };\n } catch {\n return DEFAULT_KPI_THRESHOLDS;\n }\n}\n\nfunction windowToMs(window: KpiWindow): number {\n if (window === '24h') return 24 * 60 * 60 * 1000;\n if (window === '7d') return 7 * 24 * 60 * 60 * 1000;\n return 30 * 24 * 60 * 60 * 1000;\n}\n\nfunction inWindow(e: MemoryEvent, now: number, window: KpiWindow): boolean {\n return now - e.timestamp.getTime() <= windowToMs(window);\n}\n\nfunction isEditToolName(name: string): boolean {\n return ['Write', 'Edit', 'MultiEdit', 'NotebookEdit'].includes(name);\n}\n\nfunction parseToolPayload(e: MemoryEvent): { toolName?: string; success?: boolean; filePath?: string; command?: string } | null {\n if (e.eventType !== 'tool_observation') return null;\n try {\n const payload = JSON.parse(e.content) as any;\n return {\n toolName: payload?.toolName,\n success: payload?.success,\n filePath: payload?.metadata?.filePath,\n command: payload?.metadata?.command\n };\n } catch {\n return {\n toolName: (e.metadata as any)?.toolName,\n success: (e.metadata as any)?.success,\n filePath: (e.metadata as any)?.filePath,\n command: (e.metadata as any)?.command\n };\n }\n}\n\nfunction isTestLikeCommand(command?: string): boolean {\n if (!command) return false;\n return /(test|jest|vitest|pytest|go test|cargo test|lint|eslint|build|tsc)/i.test(command);\n}\n\nfunction safeRatio(num: number, den: number): number {\n if (!Number.isFinite(num) || !Number.isFinite(den) || den <= 0) return 0;\n return num / den;\n}\n\nfunction round(value: number, digits = 4): number {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n}\n\nfunction computeSessionTurnCount(sessionEvents: MemoryEvent[]): number {\n const turnIds = new Set<string>();\n for (const e of sessionEvents) {\n const turnId = (e.metadata as any)?.turnId;\n if (typeof turnId === 'string' && turnId.length > 0) turnIds.add(turnId);\n }\n if (turnIds.size > 0) return turnIds.size;\n return sessionEvents.filter((e) => e.eventType === 'user_prompt').length;\n}\n\ntype KpiMetrics = {\n memoryHitRate: number;\n usefulRecallRate: number;\n avgCompletionTurns: number;\n timeToFirstValidEditMinutes: number;\n reworkRate: number;\n postChangeFailureRate: number;\n};\n\nfunction computeKpiMetrics(events: MemoryEvent[], usefulRecallRate: number): KpiMetrics {\n const prompts = events.filter((e) => e.eventType === 'user_prompt');\n const promptCount = prompts.length;\n const memoryHitPrompts = prompts.filter((p) => (p.metadata as any)?.adherence?.checked).length;\n const memoryHitRate = round(safeRatio(memoryHitPrompts, promptCount));\n\n const sessions = new Map<string, MemoryEvent[]>();\n for (const e of events) {\n const arr = sessions.get(e.sessionId) || [];\n arr.push(e);\n sessions.set(e.sessionId, arr);\n }\n\n let sessionTurnTotal = 0;\n let sessionTurnSamples = 0;\n let firstValidEditMinutesTotal = 0;\n let firstValidEditSamples = 0;\n\n for (const sessionEvents of sessions.values()) {\n sessionEvents.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const turns = computeSessionTurnCount(sessionEvents);\n if (turns > 0) {\n sessionTurnTotal += turns;\n sessionTurnSamples++;\n }\n\n const firstPrompt = sessionEvents.find((e) => e.eventType === 'user_prompt');\n const firstEdit = sessionEvents.find((e) => {\n const payload = parseToolPayload(e);\n return payload?.toolName && isEditToolName(payload.toolName) && payload.success === true;\n });\n if (firstPrompt && firstEdit) {\n const minutes = (firstEdit.timestamp.getTime() - firstPrompt.timestamp.getTime()) / 60000;\n if (minutes >= 0) {\n firstValidEditMinutesTotal += minutes;\n firstValidEditSamples++;\n }\n }\n }\n\n const avgCompletionTurns = round(safeRatio(sessionTurnTotal, sessionTurnSamples), 2);\n const timeToFirstValidEditMinutes = round(safeRatio(firstValidEditMinutesTotal, firstValidEditSamples), 2);\n\n const editActions: Array<{ sessionId: string; timestamp: number; filePath?: string }> = [];\n let testRunsAfterEdit = 0;\n let failedTestRunsAfterEdit = 0;\n\n for (const [sessionId, sessionEvents] of sessions.entries()) {\n const sorted = [...sessionEvents].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n let seenEdit = false;\n\n for (const e of sorted) {\n const payload = parseToolPayload(e);\n if (!payload?.toolName) continue;\n\n if (isEditToolName(payload.toolName) && payload.success === true) {\n editActions.push({ sessionId, timestamp: e.timestamp.getTime(), filePath: payload.filePath });\n seenEdit = true;\n continue;\n }\n\n if (seenEdit && isTestLikeCommand(payload.command)) {\n testRunsAfterEdit++;\n if (payload.success === false) failedTestRunsAfterEdit++;\n }\n }\n }\n\n const THIRTY_MIN_MS = 30 * 60 * 1000;\n let reworkCount = 0;\n const bySessionFile = new Map<string, number>();\n const sortedEdits = [...editActions].sort((a, b) => a.timestamp - b.timestamp);\n for (const edit of sortedEdits) {\n if (!edit.filePath) continue;\n const key = `${edit.sessionId}::${edit.filePath}`;\n const prev = bySessionFile.get(key);\n if (typeof prev === 'number' && edit.timestamp - prev <= THIRTY_MIN_MS) {\n reworkCount++;\n }\n bySessionFile.set(key, edit.timestamp);\n }\n\n const reworkRate = round(safeRatio(reworkCount, editActions.length));\n const postChangeFailureRate = round(safeRatio(failedTestRunsAfterEdit, testRunsAfterEdit));\n\n return {\n memoryHitRate,\n usefulRecallRate,\n avgCompletionTurns,\n timeToFirstValidEditMinutes,\n reworkRate,\n postChangeFailureRate\n };\n}\n\n\n// GET /api/stats/shared - Get shared store statistics\nstatsRouter.get('/shared', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const sharedStats = await memoryService.getSharedStoreStats();\n return c.json({\n troubleshooting: sharedStats?.total || 0,\n bestPractices: 0,\n commonErrors: 0,\n totalUsageCount: sharedStats?.totalUsageCount || 0,\n lastUpdated: null\n });\n } catch (error) {\n return c.json({\n troubleshooting: 0,\n bestPractices: 0,\n commonErrors: 0,\n totalUsageCount: 0,\n lastUpdated: null\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/endless - Get endless mode status\nstatsRouter.get('/endless', async (c) => {\n const projectPath = c.req.query('project') || process.cwd();\n const memoryService = getMemoryServiceForProject(projectPath);\n try {\n await memoryService.initialize();\n const status = await memoryService.getEndlessModeStatus();\n return c.json({\n mode: status.mode,\n continuityScore: status.continuityScore,\n workingSetSize: status.workingSetSize,\n consolidatedCount: status.consolidatedCount,\n lastConsolidation: status.lastConsolidation?.toISOString() || null\n });\n } catch (error) {\n return c.json({\n mode: 'session',\n continuityScore: 0,\n workingSetSize: 0,\n consolidatedCount: 0,\n lastConsolidation: null\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/levels/:level - Get events by memory level\nstatsRouter.get('/levels/:level', async (c) => {\n const { level } = c.req.param();\n const limit = parseInt(c.req.query('limit') || '20', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n const sort = c.req.query('sort') || 'recent';\n\n // Validate level\n const validLevels = ['L0', 'L1', 'L2', 'L3', 'L4'];\n if (!validLevels.includes(level)) {\n return c.json({ error: `Invalid level. Must be one of: ${validLevels.join(', ')}` }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n let events = await memoryService.getEventsByLevel(level, { limit: limit * 2, offset });\n const stats = await memoryService.getStats();\n const levelStat = stats.levelStats.find(s => s.level === level);\n\n // Apply sorting\n if (sort === 'accessed') {\n // Sort by access count (will need to get from SQLite)\n // For now, add access count from SQLite if available\n const sqliteStore = (memoryService as any).sqliteEventStore;\n if (sqliteStore) {\n const accessedEvents = await sqliteStore.getMostAccessed(1000);\n const accessMap = new Map(accessedEvents.map((e: any) => [e.id, e.access_count || 0]));\n events = events.map((e: any) => ({\n ...e,\n accessCount: accessMap.get(e.id) || 0\n }));\n events.sort((a: any, b: any) => b.accessCount - a.accessCount);\n }\n } else if (sort === 'oldest') {\n events.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n } else {\n // 'recent' - default sorting (newest first)\n events.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n }\n\n // Apply limit after sorting\n events = events.slice(0, limit);\n\n return c.json({\n level,\n events: events.map((e: any) => ({\n id: e.id,\n eventType: e.eventType,\n sessionId: e.sessionId,\n timestamp: e.timestamp.toISOString(),\n content: e.content.slice(0, 500) + (e.content.length > 500 ? '...' : ''),\n metadata: e.metadata,\n accessCount: e.accessCount || 0\n })),\n total: levelStat?.count || 0,\n limit,\n offset,\n hasMore: events.length === limit\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats - Get overall statistics\nstatsRouter.get('/', async (c) => {\n const memoryService = getLightweightServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const stats = await memoryService.getStats();\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n // Calculate event types\n const eventsByType = recentEvents.reduce((acc, e) => {\n acc[e.eventType] = (acc[e.eventType] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n // Calculate unique sessions\n const uniqueSessions = new Set(recentEvents.map(e => e.sessionId));\n\n // Calculate events by day (last 7 days)\n const now = new Date();\n const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n const eventsByDay = recentEvents\n .filter(e => e.timestamp >= sevenDaysAgo)\n .reduce((acc, e) => {\n const day = e.timestamp.toISOString().split('T')[0];\n acc[day] = (acc[day] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n const retrievalTrace = await memoryService.getRetrievalTraceStats();\n\n return c.json({\n storage: {\n eventCount: stats.totalEvents,\n vectorCount: stats.vectorCount\n },\n sessions: {\n total: uniqueSessions.size\n },\n eventsByType,\n activity: {\n daily: eventsByDay,\n total7Days: recentEvents.filter(e => e.timestamp >= sevenDaysAgo).length\n },\n memory: {\n heapUsed: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),\n heapTotal: Math.round(process.memoryUsage().heapTotal / 1024 / 1024)\n },\n levelStats: stats.levelStats,\n retrievalTrace\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/most-accessed - Get most accessed memories\nstatsRouter.get('/most-accessed', async (c) => {\n const limit = parseInt(c.req.query('limit') || '10', 10);\n // Use the same read-only service that other stats endpoints use\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n console.log('[most-accessed] Fetching most accessed memories, limit:', limit);\n const memories = await memoryService.getMostAccessedMemories(limit);\n console.log('[most-accessed] Got memories:', memories.length);\n\n return c.json({\n memories: memories.map(m => ({\n memoryId: m.memoryId,\n summary: m.summary,\n topics: m.topics,\n accessCount: m.accessCount,\n lastAccessed: m.lastAccessed || null,\n confidence: m.confidence,\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : m.createdAt\n })),\n total: memories.length\n });\n } catch (error) {\n console.error('[most-accessed] Error:', error);\n return c.json({\n memories: [],\n total: 0,\n error: (error as Error).message\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/timeline - Get activity timeline\nstatsRouter.get('/timeline', async (c) => {\n const days = parseInt(c.req.query('days') || '7', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n const filteredEvents = recentEvents.filter(e => e.timestamp >= cutoff);\n\n // Group by day\n const daily = filteredEvents.reduce((acc, e) => {\n const day = e.timestamp.toISOString().split('T')[0];\n if (!acc[day]) {\n acc[day] = { date: day, total: 0, prompts: 0, responses: 0, tools: 0 };\n }\n acc[day].total++;\n if (e.eventType === 'user_prompt') acc[day].prompts++;\n if (e.eventType === 'agent_response') acc[day].responses++;\n if (e.eventType === 'tool_observation') acc[day].tools++;\n return acc;\n }, {} as Record<string, { date: string; total: number; prompts: number; responses: number; tools: number }>);\n\n return c.json({\n days,\n daily: Object.values(daily).sort((a, b) => a.date.localeCompare(b.date))\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/helpfulness - Get helpfulness statistics and top helpful memories\nstatsRouter.get('/helpfulness', async (c) => {\n const limit = parseInt(c.req.query('limit') || '10', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const stats = await memoryService.getHelpfulnessStats();\n const topMemories = await memoryService.getHelpfulMemories(limit);\n\n return c.json({\n ...stats,\n topMemories: topMemories.map(m => ({\n eventId: m.eventId,\n summary: m.summary,\n helpfulnessScore: m.helpfulnessScore,\n accessCount: m.accessCount,\n evaluationCount: m.evaluationCount\n }))\n });\n } catch (error) {\n return c.json({\n avgScore: 0,\n totalEvaluated: 0,\n totalRetrievals: 0,\n helpful: 0,\n neutral: 0,\n unhelpful: 0,\n topMemories: []\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n\n\n// GET /api/stats/retrieval-traces - Get recent retrieval traces (query -> selected context)\nstatsRouter.get('/retrieval-traces', async (c) => {\n const limit = parseInt(c.req.query('limit') || '50', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const traces = await memoryService.getRecentRetrievalTraces(limit);\n const traceStats = await memoryService.getRetrievalTraceStats();\n\n return c.json({\n stats: traceStats,\n traces: traces.map((t) => ({\n traceId: t.traceId,\n sessionId: t.sessionId || null,\n projectHash: t.projectHash || null,\n queryText: t.queryText,\n strategy: t.strategy || null,\n candidateEventIds: t.candidateEventIds,\n selectedEventIds: t.selectedEventIds,\n candidateDetails: t.candidateDetails || [],\n selectedDetails: t.selectedDetails || [],\n candidateCount: t.candidateCount,\n selectedCount: t.selectedCount,\n confidence: t.confidence || null,\n fallbackTrace: t.fallbackTrace,\n createdAt: t.createdAt.toISOString()\n }))\n });\n } catch (error) {\n return c.json({\n stats: { totalQueries: 0, avgCandidateCount: 0, avgSelectedCount: 0, selectionRate: 0 },\n traces: [],\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/kpi - Productivity KPI summary + trend\nstatsRouter.get('/kpi', async (c) => {\n const rawWindow = (c.req.query('window') || '7d') as KpiWindow;\n const window: KpiWindow = rawWindow === '24h' || rawWindow === '30d' ? rawWindow : '7d';\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const now = Date.now();\n const thresholds = loadKpiThresholds();\n const allEvents = await memoryService.getRecentEvents(20000);\n const events = allEvents.filter((e) => inWindow(e, now, window));\n\n const helpfulness = await memoryService.getHelpfulnessStats();\n const usefulRecallRate = helpfulness.totalEvaluated > 0\n ? round(safeRatio(helpfulness.helpful, helpfulness.totalEvaluated))\n : 0;\n\n const metrics = computeKpiMetrics(events, usefulRecallRate);\n\n const windowMs = windowToMs(window);\n const prevEvents = allEvents.filter((e) => {\n const age = now - e.timestamp.getTime();\n return age > windowMs && age <= windowMs * 2;\n });\n const previousMetrics = computeKpiMetrics(prevEvents, usefulRecallRate);\n const deltas = {\n memoryHitRate: round(metrics.memoryHitRate - previousMetrics.memoryHitRate),\n usefulRecallRate: round(metrics.usefulRecallRate - previousMetrics.usefulRecallRate),\n avgCompletionTurns: round(metrics.avgCompletionTurns - previousMetrics.avgCompletionTurns, 2),\n timeToFirstValidEditMinutes: round(metrics.timeToFirstValidEditMinutes - previousMetrics.timeToFirstValidEditMinutes, 2),\n reworkRate: round(metrics.reworkRate - previousMetrics.reworkRate),\n postChangeFailureRate: round(metrics.postChangeFailureRate - previousMetrics.postChangeFailureRate)\n };\n\n const THIRTY_MIN_MS = 30 * 60 * 1000;\n\n // Trend (daily buckets for last 30 days)\n const trendWindowMs = 30 * 24 * 60 * 60 * 1000;\n const trendEvents = allEvents.filter((e) => now - e.timestamp.getTime() <= trendWindowMs);\n const buckets = new Map<string, MemoryEvent[]>();\n for (const e of trendEvents) {\n const day = e.timestamp.toISOString().split('T')[0];\n const arr = buckets.get(day) || [];\n arr.push(e);\n buckets.set(day, arr);\n }\n\n const trendDaily = Array.from(buckets.entries())\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([date, dayEvents]) => {\n const dayPrompts = dayEvents.filter((e) => e.eventType === 'user_prompt');\n const dayPromptCount = dayPrompts.length;\n const dayMemoryHit = dayPrompts.filter((p) => (p.metadata as any)?.adherence?.checked).length;\n\n // lightweight day rework/failure approximation\n const dayEdits = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isEditToolName(p.toolName) && p.success === true);\n });\n const dayEditActions = dayEdits\n .map((e) => {\n const p = parseToolPayload(e);\n return { sessionId: e.sessionId, timestamp: e.timestamp.getTime(), filePath: p?.filePath };\n })\n .filter((x) => Boolean(x.filePath));\n let dayReworkCount = 0;\n const dayBySessionFile = new Map<string, number>();\n for (const edit of dayEditActions) {\n const key = `${edit.sessionId}::${edit.filePath}`;\n const prev = dayBySessionFile.get(key);\n if (typeof prev === 'number' && edit.timestamp - prev <= THIRTY_MIN_MS) dayReworkCount++;\n dayBySessionFile.set(key, edit.timestamp);\n }\n const dayTests = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isTestLikeCommand(p.command));\n });\n const dayFailedTests = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isTestLikeCommand(p.command) && p.success === false);\n });\n\n const turnsBySession = new Map<string, MemoryEvent[]>();\n for (const e of dayEvents) {\n const arr = turnsBySession.get(e.sessionId) || [];\n arr.push(e);\n turnsBySession.set(e.sessionId, arr);\n }\n let dayTurnsTotal = 0;\n let dayTurnsSamples = 0;\n for (const sessionEvents of turnsBySession.values()) {\n const turns = computeSessionTurnCount(sessionEvents);\n if (turns > 0) {\n dayTurnsTotal += turns;\n dayTurnsSamples++;\n }\n }\n\n return {\n date,\n memoryHitRate: round(safeRatio(dayMemoryHit, dayPromptCount)),\n usefulRecallRate,\n reworkRate: round(safeRatio(dayReworkCount, dayEditActions.length)),\n postChangeFailureRate: round(safeRatio(dayFailedTests.length, dayTests.length)),\n avgCompletionTurns: round(safeRatio(dayTurnsTotal, dayTurnsSamples), 2)\n };\n });\n\n const alerts: Array<{ metric: string; level: 'warn'; message: string; value: number; threshold: number }> = [];\n if (metrics.usefulRecallRate < thresholds.usefulRecallRateMin) {\n alerts.push({ metric: 'usefulRecallRate', level: 'warn', message: 'Useful recall rate is below threshold', value: metrics.usefulRecallRate, threshold: thresholds.usefulRecallRateMin });\n }\n if (metrics.reworkRate > thresholds.reworkRateMax) {\n alerts.push({ metric: 'reworkRate', level: 'warn', message: 'Rework rate is above threshold', value: metrics.reworkRate, threshold: thresholds.reworkRateMax });\n }\n if (metrics.postChangeFailureRate > thresholds.postChangeFailureRateMax) {\n alerts.push({ metric: 'postChangeFailureRate', level: 'warn', message: 'Post-change failure rate is above threshold', value: metrics.postChangeFailureRate, threshold: thresholds.postChangeFailureRateMax });\n }\n if (metrics.avgCompletionTurns > thresholds.avgCompletionTurnsMax) {\n alerts.push({ metric: 'avgCompletionTurns', level: 'warn', message: 'Average completion turns is above threshold', value: metrics.avgCompletionTurns, threshold: thresholds.avgCompletionTurnsMax });\n }\n if (metrics.memoryHitRate < thresholds.memoryHitRateMin) {\n alerts.push({ metric: 'memoryHitRate', level: 'warn', message: 'Memory hit rate is below threshold', value: metrics.memoryHitRate, threshold: thresholds.memoryHitRateMin });\n }\n\n return c.json({\n window,\n metrics,\n previousMetrics,\n deltas,\n trend: {\n daily: trendDaily\n },\n thresholds,\n alerts\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/stats/graduation/run - Force graduation evaluation\nstatsRouter.post('/graduation/run', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const result = await memoryService.forceGraduation();\n\n return c.json({\n success: true,\n evaluated: result.evaluated,\n graduated: result.graduated,\n byLevel: result.byLevel\n });\n } catch (error) {\n return c.json({\n success: false,\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/graduation - Get graduation criteria info\nstatsRouter.get('/graduation', async (c) => {\n return c.json({\n criteria: {\n L0toL1: { minAccessCount: 1, minConfidence: 0.5, minCrossSessionRefs: 0, maxAgeDays: 30 },\n L1toL2: { minAccessCount: 3, minConfidence: 0.7, minCrossSessionRefs: 1, maxAgeDays: 60 },\n L2toL3: { minAccessCount: 5, minConfidence: 0.85, minCrossSessionRefs: 2, maxAgeDays: 90 },\n L3toL4: { minAccessCount: 10, minConfidence: 0.92, minCrossSessionRefs: 3, maxAgeDays: 180 }\n },\n description: {\n accessCount: 'Number of times the memory was retrieved/referenced',\n confidence: 'Match confidence score when retrieved (0.0-1.0)',\n crossSessionRefs: 'Number of different sessions that referenced this memory',\n maxAgeDays: 'Maximum days since last access (prevents stale promotion)'\n }\n });\n});\n", "/**\n * Citations API\n * Endpoints for citation management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\nimport { generateCitationId, parseCitationId } from '../../../core/citation-generator.js';\n\nexport const citationsRouter = new Hono();\n\n// GET /api/citations/:id - Get citation by ID\ncitationsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n\n // Support both formats: \"a7Bc3x\" or \"mem:a7Bc3x\"\n const citationId = parseCitationId(id) || id;\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Search through recent events to find the one matching this citation ID\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n const event = recentEvents.find(e => {\n const eventCitationId = generateCitationId(e.id);\n return eventCitationId === citationId;\n });\n\n if (!event) {\n return c.json({ error: 'Citation not found' }, 404);\n }\n\n return c.json({\n citation: {\n id: citationId,\n eventId: event.id\n },\n event: {\n id: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n content: event.content,\n metadata: event.metadata\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/citations/:id/related - Get related citations\ncitationsRouter.get('/:id/related', async (c) => {\n const { id } = c.req.param();\n const citationId = parseCitationId(id) || id;\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n // Find the main event\n const event = recentEvents.find(e => {\n const eventCitationId = generateCitationId(e.id);\n return eventCitationId === citationId;\n });\n\n if (!event) {\n return c.json({ error: 'Citation not found' }, 404);\n }\n\n // Get surrounding events from same session\n const sessionEvents = recentEvents\n .filter(e => e.sessionId === event.sessionId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const eventIndex = sessionEvents.findIndex(e => e.id === event.id);\n const prev = eventIndex > 0 ? sessionEvents[eventIndex - 1] : null;\n const next = eventIndex < sessionEvents.length - 1 ? sessionEvents[eventIndex + 1] : null;\n\n return c.json({\n previous: prev ? {\n citationId: generateCitationId(prev.id),\n eventType: prev.eventType,\n timestamp: prev.timestamp,\n preview: prev.content.slice(0, 100) + (prev.content.length > 100 ? '...' : '')\n } : null,\n next: next ? {\n citationId: generateCitationId(next.id),\n eventType: next.eventType,\n timestamp: next.timestamp,\n preview: next.content.slice(0, 100) + (next.content.length > 100 ? '...' : '')\n } : null\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Citation Generator\n * Generates unique, short citation IDs for memory references\n */\n\nimport { createHash } from 'crypto';\n\nconst ID_LENGTH = 6;\nconst CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n/**\n * Generate a citation ID from an event ID using SHA256\n */\nexport function generateCitationId(eventId: string): string {\n const hash = createHash('sha256')\n .update(eventId)\n .digest();\n\n let id = '';\n for (let i = 0; i < ID_LENGTH; i++) {\n id += CHARSET[hash[i] % CHARSET.length];\n }\n\n return id;\n}\n\n/**\n * Generate a unique citation ID with collision handling\n */\nexport async function generateUniqueCitationId(\n eventId: string,\n existsCheck: (id: string) => Promise<boolean>\n): Promise<string> {\n let id = generateCitationId(eventId);\n let attempt = 0;\n\n while (await existsCheck(id) && attempt < 10) {\n // Add salt and regenerate\n id = generateCitationId(`${eventId}:${attempt}`);\n attempt++;\n }\n\n if (attempt >= 10) {\n throw new Error('Failed to generate unique citation ID after 10 attempts');\n }\n\n return id;\n}\n\n/**\n * Format a citation ID for display\n */\nexport function formatCitationId(citationId: string): string {\n return `[mem:${citationId}]`;\n}\n\n/**\n * Parse a citation ID from formatted string\n */\nexport function parseCitationId(formatted: string): string | null {\n const match = formatted.match(/\\[?mem:([A-Za-z0-9]{6})\\]?/);\n return match ? match[1] : null;\n}\n", "/**\n * Turns API\n * Endpoints for viewing events grouped by conversation turn\n *\n * A \"turn\" groups a user_prompt with its associated tool_observations\n * and the final agent_response into a single logical unit.\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const turnsRouter = new Hono();\n\n// GET /api/turns?sessionId=xxx - List turns for a session\nturnsRouter.get('/', async (c) => {\n const sessionId = c.req.query('sessionId');\n const limit = parseInt(c.req.query('limit') || '20', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n\n if (!sessionId) {\n return c.json({ error: 'sessionId is required' }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const turns = await memoryService.getSessionTurns(sessionId, { limit, offset });\n const totalTurns = await memoryService.countSessionTurns(sessionId);\n\n return c.json({\n turns: turns.map(t => ({\n turnId: t.turnId,\n startedAt: t.startedAt.toISOString(),\n promptPreview: t.promptPreview,\n eventCount: t.eventCount,\n toolCount: t.toolCount,\n hasResponse: t.hasResponse,\n events: t.events.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp,\n preview: e.content.slice(0, 300) + (e.content.length > 300 ? '...' : ''),\n contentLength: e.content.length\n }))\n })),\n total: totalTurns,\n limit,\n offset,\n hasMore: offset + limit < totalTurns\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/turns/:turnId - Get full turn details\nturnsRouter.get('/:turnId', async (c) => {\n const { turnId } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const events = await memoryService.getEventsByTurn(turnId);\n\n if (events.length === 0) {\n return c.json({ error: 'Turn not found' }, 404);\n }\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const responseEvents = events.filter(e => e.eventType === 'agent_response');\n\n return c.json({\n turnId,\n sessionId: events[0].sessionId,\n startedAt: events[0].timestamp instanceof Date\n ? events[0].timestamp.toISOString()\n : events[0].timestamp,\n prompt: promptEvent ? {\n id: promptEvent.id,\n content: promptEvent.content,\n timestamp: promptEvent.timestamp instanceof Date\n ? promptEvent.timestamp.toISOString()\n : promptEvent.timestamp\n } : null,\n tools: toolEvents.map(e => {\n let toolName = '';\n let success = true;\n try {\n const parsed = JSON.parse(e.content);\n toolName = parsed.toolName || '';\n success = parsed.success !== false;\n } catch { /* ignore */ }\n\n return {\n id: e.id,\n toolName,\n success,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp,\n preview: e.content.slice(0, 500) + (e.content.length > 500 ? '...' : '')\n };\n }),\n responses: responseEvents.map(e => ({\n id: e.id,\n content: e.content,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp\n })),\n totalEvents: events.length\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/turns/backfill - Backfill turn_ids from metadata\nturnsRouter.post('/backfill', async (c) => {\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const updated = await memoryService.backfillTurnIds();\n\n return c.json({\n success: true,\n updated,\n message: `Backfilled turn_id for ${updated} events`\n });\n } catch (error) {\n return c.json({\n success: false,\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Projects API\n * Endpoints for listing available projects\n */\n\nimport { Hono } from 'hono';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { loadSessionRegistry } from '../../../services/memory-service.js';\n\nexport const projectsRouter = new Hono();\n\n// GET /api/projects - List available projects\nprojectsRouter.get('/', async (c) => {\n try {\n const projectsDir = path.join(os.homedir(), '.claude-code', 'memory', 'projects');\n\n if (!fs.existsSync(projectsDir)) {\n return c.json({ projects: [] });\n }\n\n // Read project directories\n const projectHashes = fs.readdirSync(projectsDir)\n .filter(name => {\n const fullPath = path.join(projectsDir, name);\n return fs.statSync(fullPath).isDirectory();\n });\n\n // Load session registry to map hashes to project paths\n const registry = loadSessionRegistry();\n const hashToPath = new Map<string, string>();\n for (const entry of Object.values(registry.sessions)) {\n if (!hashToPath.has(entry.projectHash)) {\n hashToPath.set(entry.projectHash, entry.projectPath);\n }\n }\n\n // Build project list\n const projects = projectHashes.map(hash => {\n const dirPath = path.join(projectsDir, hash);\n const dbPath = path.join(dirPath, 'events.sqlite');\n let dbSize = 0;\n if (fs.existsSync(dbPath)) {\n dbSize = fs.statSync(dbPath).size;\n }\n\n const projectPath = hashToPath.get(hash) || `unknown (${hash})`;\n\n return {\n hash,\n projectPath,\n projectName: path.basename(projectPath),\n dbSize,\n dbSizeHuman: formatBytes(dbSize)\n };\n });\n\n // Sort by project name\n projects.sort((a, b) => a.projectName.localeCompare(b.projectName));\n\n return c.json({ projects });\n } catch (error) {\n return c.json({ projects: [], error: (error as Error).message }, 500);\n }\n});\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n}\n", "/**\n * Chat API\n * Endpoints for memory-aware chat using Claude CLI\n */\n\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { spawn } from 'child_process';\nimport type { ChildProcess } from 'child_process';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const chatRouter = new Hono();\n\ninterface ChatRequest {\n message: string;\n history?: Array<{ role: 'user' | 'assistant'; content: string }>;\n}\n\nconst CLAUDE_TIMEOUT_MS = 120_000;\n\nchatRouter.post('/', async (c) => {\n let body: ChatRequest;\n try {\n body = await c.req.json<ChatRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n\n if (!body.message?.trim()) {\n return c.json({ error: 'Message is required' }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Retrieve relevant memories for context\n let memoryContext = '';\n let statsContext = '';\n\n try {\n const result = await memoryService.retrieveMemories(body.message, {\n topK: 8,\n minScore: 0.5\n });\n\n if (result.memories.length > 0) {\n const parts: string[] = ['## Relevant Memories\\n'];\n for (const m of result.memories) {\n const date = new Date(m.event.timestamp).toISOString().split('T')[0];\n const content = m.event.content.slice(0, 500);\n parts.push(`### [${m.event.eventType}] ${date} (score: ${m.score.toFixed(2)})`);\n parts.push(content);\n if (m.sessionContext) {\n parts.push(`_Context: ${m.sessionContext}_`);\n }\n parts.push('');\n }\n memoryContext = parts.join('\\n');\n }\n } catch {\n // Continue without memory context if retrieval fails\n }\n\n try {\n const stats = await memoryService.getStats();\n const levels = stats.levelStats.map(l => `${l.level}: ${l.count}`).join(', ');\n statsContext = [\n '## Memory Stats',\n `- Total events: ${stats.totalEvents}`,\n `- Vector nodes: ${stats.vectorCount}`,\n `- By level: ${levels}`\n ].join('\\n');\n } catch {\n // Continue without stats if it fails\n }\n\n const fullPrompt = buildPrompt(\n statsContext,\n memoryContext,\n body.history || [],\n body.message\n );\n\n // Stream response via SSE\n return streamSSE(c, async (stream) => {\n try {\n await streamClaudeResponse(fullPrompt, stream);\n } catch (err) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({ error: (err as Error).message })\n });\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\nfunction buildPrompt(\n statsContext: string,\n memoryContext: string,\n history: Array<{ role: string; content: string }>,\n currentMessage: string\n): string {\n const parts: string[] = [];\n\n parts.push('You are a helpful assistant that answers questions about the user\\'s code memory data.');\n parts.push('The memory system tracks coding sessions, tool usage, prompts, and responses.');\n parts.push('Answer concisely based on the memory context below. If you don\\'t have enough data, say so.');\n parts.push('Use markdown formatting in your responses.\\n');\n\n if (statsContext) {\n parts.push(statsContext);\n parts.push('');\n }\n\n if (memoryContext) {\n parts.push(memoryContext);\n } else {\n parts.push('No directly relevant memories found for this query.');\n parts.push('Answer based on general knowledge or suggest the user rephrase.\\n');\n }\n\n parts.push('---\\n');\n\n // Include recent history (last 10 turns)\n const recentHistory = history.slice(-10);\n if (recentHistory.length > 0) {\n parts.push('## Conversation History\\n');\n for (const msg of recentHistory) {\n const prefix = msg.role === 'user' ? 'User' : 'Assistant';\n parts.push(`**${prefix}:** ${msg.content}\\n`);\n }\n }\n\n parts.push(`**User:** ${currentMessage}`);\n\n return parts.join('\\n');\n}\n\nfunction streamClaudeResponse(\n prompt: string,\n stream: { writeSSE: (msg: { event?: string; data: string }) => Promise<void> }\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc: ChildProcess = spawn('claude', [\n '-p',\n '--output-format', 'stream-json',\n '--verbose'\n ], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env }\n });\n\n const timeout = setTimeout(() => {\n proc.kill('SIGTERM');\n reject(new Error('Chat response timed out after 2 minutes'));\n }, CLAUDE_TIMEOUT_MS);\n\n // Write prompt to stdin\n proc.stdin!.write(prompt);\n proc.stdin!.end();\n\n let buffer = '';\n let lastSentText = '';\n\n proc.stdout!.on('data', async (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line);\n\n // Extract text from assistant messages\n if (parsed.type === 'assistant' && parsed.message?.content) {\n const textBlocks = parsed.message.content\n .filter((b: { type: string }) => b.type === 'text')\n .map((b: { text: string }) => b.text)\n .join('');\n\n if (textBlocks.length > lastSentText.length) {\n const delta = textBlocks.slice(lastSentText.length);\n lastSentText = textBlocks;\n await stream.writeSSE({\n event: 'message',\n data: JSON.stringify({ content: delta })\n });\n }\n }\n\n // Handle completion\n if (parsed.type === 'result') {\n await stream.writeSSE({ event: 'done', data: '{}' });\n }\n } catch {\n // Skip non-JSON lines\n }\n }\n });\n\n proc.stderr!.on('data', (chunk: Buffer) => {\n if (process.env.CLAUDE_MEMORY_DEBUG) {\n console.error('[chat] claude stderr:', chunk.toString());\n }\n });\n\n proc.on('error', (err) => {\n clearTimeout(timeout);\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n reject(new Error('Claude CLI not found. Install with: npm install -g @anthropic-ai/claude-code'));\n } else {\n reject(err);\n }\n });\n\n proc.on('close', async (code) => {\n clearTimeout(timeout);\n\n // Flush remaining buffer\n if (buffer.trim()) {\n try {\n const parsed = JSON.parse(buffer);\n if (parsed.type === 'result') {\n await stream.writeSSE({ event: 'done', data: '{}' });\n }\n } catch { /* ignore */ }\n }\n\n if (code !== 0 && code !== null) {\n reject(new Error(`Claude CLI exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n}\n", "/**\n * Health API\n * Operational health checks including outbox backlog/failures\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const healthRouter = new Hono();\n\n// GET /api/health\nhealthRouter.get('/', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n\n const [stats, outbox] = await Promise.all([\n memoryService.getStats(),\n memoryService.getOutboxStats()\n ]);\n\n const outboxPending = outbox.embedding.pending + outbox.vector.pending;\n const outboxFailed = outbox.embedding.failed + outbox.vector.failed;\n\n const status = outboxFailed > 0 ? 'needs-attention' : 'ok';\n\n return c.json({\n status,\n timestamp: new Date().toISOString(),\n storage: {\n totalEvents: stats.totalEvents,\n vectorCount: stats.vectorCount\n },\n outbox: {\n embedding: outbox.embedding,\n vector: outbox.vector,\n totals: {\n pending: outboxPending,\n failed: outboxFailed\n }\n },\n levelStats: stats.levelStats\n });\n } catch (error) {\n return c.json({\n status: 'error',\n timestamp: new Date().toISOString(),\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Mongo Sync Worker\n * Optional: sync per-project SQLite events to a shared MongoDB database.\n *\n * Design goals:\n * - Optional and decoupled (doesn't affect default local-only flow)\n * - Idempotent (safe to retry)\n * - Incremental push (SQLite rowid) and incremental pull (Mongo seq per project)\n *\n * NOTE:\n * - We only sync immutable L0 events (events table). Derived tables can be rebuilt.\n */\n\nimport { randomUUID } from 'crypto';\nimport * as os from 'os';\nimport { MongoClient } from 'mongodb';\nimport type { Collection, Db } from 'mongodb';\n\nimport type { MemoryEvent } from './types.js';\nimport { SQLiteEventStore } from './sqlite-event-store.js';\n\nexport type MongoSyncDirection = 'push' | 'pull' | 'both';\n\nexport interface MongoSyncWorkerConfig {\n uri: string;\n dbName: string;\n projectKey: string;\n direction?: MongoSyncDirection;\n intervalMs?: number;\n batchSize?: number;\n instanceId?: string;\n}\n\nexport interface MongoSyncStats {\n lastSyncAt: Date | null;\n pushedEvents: number;\n pulledEvents: number;\n errors: number;\n status: 'idle' | 'syncing' | 'error' | 'stopped';\n}\n\ninterface CounterDoc {\n _id: string;\n seq: number;\n}\n\ninterface RemoteEventDoc {\n _id: string;\n projectKey: string;\n seq: number;\n eventId: string;\n eventType: string;\n sessionId: string;\n timestamp: Date;\n content: string;\n canonicalKey: string;\n dedupeKey: string;\n metadata?: Record<string, unknown> | null;\n insertedAt: Date;\n updatedAt: Date;\n source?: {\n hostname?: string;\n instanceId?: string;\n };\n}\n\nfunction redactMongoUri(uri: string): string {\n // mongodb://user:pass@host:port/ -> mongodb://user:***@host:port/\n // mongodb+srv://user:pass@host/ -> mongodb+srv://user:***@host/\n const schemeIdx = uri.indexOf('://');\n if (schemeIdx === -1) return uri;\n const atIdx = uri.indexOf('@', schemeIdx + 3);\n if (atIdx === -1) return uri;\n\n const creds = uri.slice(schemeIdx + 3, atIdx); // user:pass\n const colonIdx = creds.indexOf(':');\n if (colonIdx === -1) return uri;\n\n const prefix = uri.slice(0, schemeIdx + 3 + colonIdx + 1);\n const suffix = uri.slice(atIdx);\n return `${prefix}***${suffix}`;\n}\n\nfunction parseIntOrZero(value: string | null | undefined): number {\n if (!value) return 0;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n}\n\nexport class MongoSyncWorker {\n private readonly config: Required<Omit<MongoSyncWorkerConfig, 'instanceId'>> & { instanceId: string };\n private intervalHandle: NodeJS.Timeout | null = null;\n private running = false;\n\n private client: MongoClient | null = null;\n private db: Db | null = null;\n private counters: Collection<CounterDoc> | null = null;\n private events: Collection<RemoteEventDoc> | null = null;\n private indexesEnsured = false;\n\n private stats: MongoSyncStats = {\n lastSyncAt: null,\n pushedEvents: 0,\n pulledEvents: 0,\n errors: 0,\n status: 'idle'\n };\n\n constructor(\n private readonly sqliteStore: SQLiteEventStore,\n config: MongoSyncWorkerConfig\n ) {\n this.config = {\n uri: config.uri,\n dbName: config.dbName,\n projectKey: config.projectKey,\n direction: config.direction ?? 'both',\n intervalMs: config.intervalMs ?? 30000,\n batchSize: config.batchSize ?? 500,\n instanceId: config.instanceId ?? randomUUID()\n };\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stats.status = 'idle';\n\n // Initial sync\n this.syncNow().catch((err) => {\n console.error('[MongoSyncWorker] Initial sync failed:', err);\n });\n\n // Periodic sync\n this.intervalHandle = setInterval(() => {\n this.syncNow().catch((err) => {\n console.error('[MongoSyncWorker] Periodic sync failed:', err);\n });\n }, this.config.intervalMs);\n }\n\n stop(): void {\n this.running = false;\n this.stats.status = 'stopped';\n\n if (this.intervalHandle) {\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n }\n\n async shutdown(): Promise<void> {\n this.stop();\n await this.disconnect();\n }\n\n getStats(): MongoSyncStats {\n return { ...this.stats };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n async syncNow(): Promise<{ pushed: number; pulled: number }> {\n if (this.stats.status === 'syncing') return { pushed: 0, pulled: 0 };\n\n this.stats.status = 'syncing';\n let pushed = 0;\n let pulled = 0;\n\n try {\n await this.sqliteStore.initialize();\n await this.ensureConnected();\n await this.ensureIndexes();\n\n if (this.config.direction === 'push' || this.config.direction === 'both') {\n pushed = await this.pushEvents();\n this.stats.pushedEvents += pushed;\n }\n\n if (this.config.direction === 'pull' || this.config.direction === 'both') {\n pulled = await this.pullEvents();\n this.stats.pulledEvents += pulled;\n }\n\n this.stats.lastSyncAt = new Date();\n this.stats.status = 'idle';\n return { pushed, pulled };\n } catch (error) {\n this.stats.errors++;\n this.stats.status = 'error';\n throw error;\n }\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.client && this.db && this.counters && this.events) return;\n\n try {\n this.client = new MongoClient(this.config.uri, {\n appName: 'claude-memory-layer',\n serverSelectionTimeoutMS: 5000\n });\n await this.client.connect();\n this.db = this.client.db(this.config.dbName);\n this.counters = this.db.collection<CounterDoc>('cml_counters');\n this.events = this.db.collection<RemoteEventDoc>('cml_events');\n } catch (err) {\n // Avoid leaking credentials in logs\n const safeUri = redactMongoUri(this.config.uri);\n throw new Error(`MongoDB connection failed (${safeUri}, db=${this.config.dbName}): ${String(err)}`);\n }\n }\n\n private async disconnect(): Promise<void> {\n try {\n await this.client?.close();\n } finally {\n this.client = null;\n this.db = null;\n this.counters = null;\n this.events = null;\n this.indexesEnsured = false;\n }\n }\n\n private async ensureIndexes(): Promise<void> {\n if (this.indexesEnsured) return;\n if (!this.events || !this.counters) throw new Error('Mongo not connected');\n\n // Best-effort: if the user lacks index privileges, sync can still work (slower)\n try {\n await this.events.createIndex({ projectKey: 1, seq: 1 }, { unique: true });\n await this.events.createIndex({ projectKey: 1, eventId: 1 }, { unique: true });\n await this.events.createIndex({ projectKey: 1, dedupeKey: 1 });\n } catch (err) {\n console.warn('[MongoSyncWorker] Failed to ensure indexes (continuing):', err);\n }\n\n this.indexesEnsured = true;\n }\n\n private counterKey(kind: 'events'): string {\n return `${kind}:${this.config.projectKey}`;\n }\n\n private async allocateSeqRange(kind: 'events', count: number): Promise<number> {\n if (!this.counters) throw new Error('Mongo not connected');\n if (count <= 0) return 1;\n\n const key = this.counterKey(kind);\n const doc = await this.counters.findOneAndUpdate(\n { _id: key },\n { $inc: { seq: count } },\n { upsert: true, returnDocument: 'after' }\n );\n\n const endSeq = doc?.seq;\n if (typeof endSeq !== 'number') {\n throw new Error(`Failed to allocate seq range for ${key}`);\n }\n\n return endSeq - count + 1;\n }\n\n private pushTargetName(): string {\n return `mongo_push_events_rowid:${this.config.projectKey}`;\n }\n\n private pullTargetName(): string {\n return `mongo_pull_events_seq:${this.config.projectKey}`;\n }\n\n private async pushEvents(): Promise<number> {\n if (!this.events) throw new Error('Mongo not connected');\n\n const position = await this.sqliteStore.getSyncPosition(this.pushTargetName());\n let lastRowid = parseIntOrZero(position.lastEventId);\n\n let pushed = 0;\n\n while (true) {\n const batch = await this.sqliteStore.getEventsSinceRowid(lastRowid, this.config.batchSize);\n if (batch.length === 0) break;\n\n const startSeq = await this.allocateSeqRange('events', batch.length);\n const now = new Date();\n const hostname = os.hostname();\n\n const ops = batch.map((item, idx) => {\n const event = item.event as unknown as MemoryEvent;\n const seq = startSeq + idx;\n const docId = `${this.config.projectKey}:${event.id}`;\n\n return {\n updateOne: {\n filter: { _id: docId },\n update: {\n $setOnInsert: {\n _id: docId,\n projectKey: this.config.projectKey,\n seq,\n eventId: event.id,\n eventType: event.eventType,\n sessionId: event.sessionId,\n timestamp: event.timestamp,\n content: event.content,\n canonicalKey: event.canonicalKey,\n dedupeKey: event.dedupeKey,\n metadata: event.metadata ?? null,\n insertedAt: now,\n updatedAt: now,\n source: { hostname, instanceId: this.config.instanceId }\n }\n },\n upsert: true\n }\n };\n });\n\n await this.events.bulkWrite(ops, { ordered: false });\n\n const last = batch[batch.length - 1];\n lastRowid = last.rowid;\n await this.sqliteStore.updateSyncPosition(\n this.pushTargetName(),\n String(lastRowid),\n last.event.timestamp.toISOString()\n );\n\n pushed += batch.length;\n if (batch.length < this.config.batchSize) break;\n }\n\n return pushed;\n }\n\n private async pullEvents(): Promise<number> {\n if (!this.events) throw new Error('Mongo not connected');\n\n const position = await this.sqliteStore.getSyncPosition(this.pullTargetName());\n let lastSeq = parseIntOrZero(position.lastEventId);\n\n let pulled = 0;\n\n while (true) {\n const docs = await this.events.find(\n { projectKey: this.config.projectKey, seq: { $gt: lastSeq } },\n { sort: { seq: 1 }, limit: this.config.batchSize }\n ).toArray();\n\n if (docs.length === 0) break;\n\n const events: MemoryEvent[] = docs.map((d) => ({\n id: d.eventId,\n eventType: d.eventType as any,\n sessionId: d.sessionId,\n timestamp: d.timestamp instanceof Date ? d.timestamp : new Date(d.timestamp),\n content: d.content,\n canonicalKey: d.canonicalKey,\n dedupeKey: d.dedupeKey,\n metadata: d.metadata ?? undefined\n }));\n\n const result = await this.sqliteStore.importEvents(events);\n pulled += result.inserted;\n\n lastSeq = docs[docs.length - 1].seq;\n await this.sqliteStore.updateSyncPosition(\n this.pullTargetName(),\n String(lastSeq),\n new Date().toISOString()\n );\n\n if (docs.length < this.config.batchSize) break;\n }\n\n return pulled;\n }\n}\n", "import type {\n RetrievalDisclosureExpansion,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureSource\n} from '../../core/engine/retrieval-disclosure-service.js';\nimport type { RetrievalResultEnvelope } from '../../core/model/retrieval-result.js';\nimport type { UnifiedRetrievalResult } from '../../core/retriever.js';\n\nexport function formatPlainSearchResults(result: UnifiedRetrievalResult): string {\n const lines: string[] = [\n '',\n '\uD83D\uDCDA Search Results',\n '',\n `Confidence: ${result.matchResult.confidence}`,\n `Total local memories found: ${result.memories.length}`,\n `Shared memories found: ${result.sharedMemories?.length ?? 0}`,\n ''\n ];\n\n for (const memory of result.memories) {\n const date = memory.event.timestamp.toISOString().split('T')[0];\n lines.push('---');\n lines.push(`\uD83D\uDCCC ${memory.event.eventType} (${date})`);\n lines.push(` Score: ${memory.score.toFixed(3)}`);\n lines.push(` Session: ${memory.event.sessionId.slice(0, 8)}...`);\n lines.push(` Content: ${preview(memory.event.content, 200)}`);\n lines.push('');\n }\n\n if (result.sharedMemories && result.sharedMemories.length > 0) {\n lines.push('\uD83C\uDF10 Shared Memories', '');\n for (const entry of result.sharedMemories) {\n lines.push('---');\n lines.push(`\uD83C\uDF10 ${entry.title}`);\n lines.push(` Source: shared:${entry.entryId}`);\n lines.push(` Project: ${entry.sourceProjectHash}`);\n lines.push(` Score: ${entry.confidence.toFixed(3)}`);\n lines.push(` Topics: ${entry.topics.join(', ') || 'n/a'}`);\n lines.push(` Symptoms: ${entry.symptoms.join('; ') || 'n/a'}`);\n lines.push(` Root cause: ${entry.rootCause}`);\n lines.push(` Solution: ${entry.solution}`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureSearch(response: RetrievalDisclosureSearchResponse): string {\n const lines: string[] = [\n '',\n '\uD83D\uDD0E Progressive Search Results',\n '',\n `Meta: total=${response.meta.total} vector=${yesNo(response.meta.usedVector)} keyword=${yesNo(response.meta.usedKeyword)} fallback=${yesNo(response.meta.fallbackApplied)}`,\n ''\n ];\n\n if (response.results.length === 0) {\n lines.push('No results found.', '');\n return lines.join('\\n');\n }\n\n response.results.forEach((result, index) => {\n lines.push(formatEnvelope(result, index + 1));\n });\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureExpansion(expansion: RetrievalDisclosureExpansion): string {\n const lines: string[] = [\n '',\n '\uD83E\uDDE9 Expanded Retrieval Result',\n '',\n 'Target',\n formatEnvelope(expansion.target),\n ''\n ];\n\n if (expansion.surroundingFacts && expansion.surroundingFacts.length > 0) {\n lines.push('Surrounding');\n expansion.surroundingFacts.forEach((item, index) => {\n lines.push(formatEnvelope(item, index + 1));\n });\n lines.push('');\n }\n\n if (expansion.summaries && expansion.summaries.length > 0) {\n lines.push('Summaries');\n expansion.summaries.forEach((item, index) => {\n lines.push(formatEnvelope(item, index + 1));\n });\n lines.push('');\n }\n\n if (expansion.relatedSources && expansion.relatedSources.length > 0) {\n lines.push('Sources');\n for (const source of expansion.relatedSources) {\n lines.push(`- ${source.sourceRef} (${source.sourceType}) events=${source.eventIds.join(',')}`);\n lines.push(...formatMetadataLines(source.metadata, ' '));\n }\n lines.push('');\n }\n\n if (expansion.expandedContext) {\n lines.push('Expanded Context', expansion.expandedContext, '');\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureSource(source: RetrievalDisclosureSource): string {\n const lines: string[] = [\n '',\n '\uD83D\uDCCE Retrieval Source',\n '',\n `sourceRef: ${source.sourceRef}`,\n `sourceType: ${source.sourceType}`,\n `eventIds: ${source.eventIds.join(', ')}`,\n ''\n ];\n\n if (source.rawEvents.length > 0) {\n lines.push('Raw Events');\n for (const event of source.rawEvents) {\n const timestamp = event.timestamp instanceof Date\n ? event.timestamp.toISOString()\n : String(event.timestamp);\n lines.push(`- ${event.id} ${timestamp}`);\n lines.push(` [${event.eventType}] ${preview(event.content, 500)}`);\n if (event.sessionId) lines.push(` session: ${event.sessionId}`);\n if (event.canonicalKey) lines.push(` canonicalKey: ${event.canonicalKey}`);\n }\n lines.push('');\n } else if (source.sourceType === 'shared_troubleshooting') {\n lines.push('No local raw events for this shared source.', '');\n }\n\n if (source.metadata && Object.keys(source.metadata).length > 0) {\n lines.push('Shared Metadata');\n lines.push(...formatMetadataLines(source.metadata, ' '));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction formatEnvelope(result: RetrievalResultEnvelope, index?: number): string {\n const prefix = index ? `${index}. ` : '- ';\n const title = result.title ? ` ${result.title}` : '';\n const lines = [\n `${prefix}[${result.resultType}]${title}`,\n ` id: ${result.id}`,\n ` score: ${result.score.toFixed(3)}`,\n ` reasons: ${result.reasons.join(', ') || 'n/a'}`,\n ` source: ${result.sourceRef || 'n/a'}`\n ];\n\n if (result.sessionId) {\n lines.push(` session: ${result.sessionId.slice(0, 12)}${result.sessionId.length > 12 ? '...' : ''}`);\n }\n\n lines.push(...formatMetadataLines(result.metadata, ' ', ['sourceProjectHash', 'sourceEntryId', 'topics']));\n lines.push(` snippet: ${result.snippet}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction yesNo(value: boolean): 'yes' | 'no' {\n return value ? 'yes' : 'no';\n}\n\nfunction preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction formatMetadataLines(\n metadata: Record<string, unknown> | undefined,\n prefix: string,\n allowedKeys?: string[]\n): string[] {\n if (!metadata) return [];\n return Object.entries(metadata)\n .filter(([key, value]) => value !== undefined && (!allowedKeys || allowedKeys.includes(key)))\n .map(([key, value]) => `${prefix}${key}: ${formatMetadataValue(value)}`);\n}\n\nfunction formatMetadataValue(value: unknown): string {\n if (Array.isArray(value)) return value.join(', ');\n if (value instanceof Date) return value.toISOString();\n if (value && typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n", "import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface McpServerEntry {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface ClaudeDesktopConfig {\n mcpServers?: Record<string, McpServerEntry>;\n [key: string]: unknown;\n}\n\nexport interface InstallMcpServerOptions extends McpServerEntry {\n serverName: string;\n}\n\nexport function getDefaultClaudeDesktopConfigPath(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n home: string = homedir()\n): string {\n if (platform === 'darwin') {\n return join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n\n if (platform === 'win32') {\n return join(env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n\n return join(env.XDG_CONFIG_HOME ?? join(home, '.config'), 'claude', 'claude_desktop_config.json');\n}\n\nexport function readJsonConfig(configPath: string): ClaudeDesktopConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n const content = readFileSync(configPath, 'utf8').trim();\n if (!content) {\n return {};\n }\n\n return JSON.parse(content) as ClaudeDesktopConfig;\n}\n\nexport function saveJsonConfig(configPath: string, config: ClaudeDesktopConfig): void {\n mkdirSync(dirname(configPath), { recursive: true });\n const tempPath = `${configPath}.tmp`;\n writeFileSync(tempPath, `${JSON.stringify(config, null, 2)}\\n`);\n renameSync(tempPath, configPath);\n}\n\nexport function installMcpServerConfig(\n existingConfig: ClaudeDesktopConfig,\n options: InstallMcpServerOptions\n): ClaudeDesktopConfig {\n const { serverName, command, args, env } = options;\n const serverEntry: McpServerEntry = { command };\n\n if (args && args.length > 0) {\n serverEntry.args = args;\n } else if (args) {\n serverEntry.args = [];\n }\n\n if (env && Object.keys(env).length > 0) {\n serverEntry.env = env;\n }\n\n return {\n ...existingConfig,\n mcpServers: {\n ...(existingConfig.mcpServers ?? {}),\n [serverName]: serverEntry\n }\n };\n}\n\nexport interface InstallMcpServerCommandOptions {\n configPath?: string;\n serverName?: string;\n command?: string;\n args?: string[];\n dryRun?: boolean;\n}\n\nexport function installMcpServer(options: InstallMcpServerCommandOptions = {}): {\n configPath: string;\n config: ClaudeDesktopConfig;\n} {\n const configPath = options.configPath ?? getDefaultClaudeDesktopConfigPath();\n const config = installMcpServerConfig(readJsonConfig(configPath), {\n serverName: options.serverName ?? 'claude-memory-layer',\n command: options.command ?? 'claude-memory-layer-mcp',\n args: options.args ?? []\n });\n\n if (!options.dryRun) {\n saveJsonConfig(configPath, config);\n }\n\n return { configPath, config };\n}\n", "import * as path from 'path';\n\nexport interface ClaudeHookCommand {\n type: string;\n command: string;\n}\n\nexport interface ClaudeHookEntry {\n matcher: string;\n hooks: ClaudeHookCommand[];\n}\n\nexport interface ClaudeSettingsHooks {\n UserPromptSubmit?: ClaudeHookEntry[];\n PostToolUse?: ClaudeHookEntry[];\n SessionStart?: ClaudeHookEntry[];\n Stop?: ClaudeHookEntry[];\n SessionEnd?: ClaudeHookEntry[];\n [key: string]: ClaudeHookEntry[] | undefined;\n}\n\nexport interface ClaudeSettingsWithHooks {\n hooks?: ClaudeSettingsHooks;\n [key: string]: unknown;\n}\n\nexport const REQUIRED_HOOK_FILES = [\n 'user-prompt-submit.js',\n 'post-tool-use.js',\n 'session-start.js',\n 'stop.js',\n 'session-end.js'\n] as const;\n\nexport const PLUGIN_HOOKS = {\n SessionStart: 'session-start.js',\n UserPromptSubmit: 'user-prompt-submit.js',\n PostToolUse: 'post-tool-use.js',\n Stop: 'stop.js',\n SessionEnd: 'session-end.js'\n} as const;\n\nexport type PluginHookName = keyof typeof PLUGIN_HOOKS;\n\nexport function shellQuotePathForNode(filePath: string): string {\n return `'${filePath.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function buildHookCommand(pluginPath: string, fileName: string): string {\n return `node ${shellQuotePathForNode(path.join(pluginPath, 'hooks', fileName))}`;\n}\n\nexport function getHooksConfig(pluginPath: string): ClaudeSettingsHooks {\n const makeHook = (fileName: string): ClaudeHookEntry[] => [\n {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: buildHookCommand(pluginPath, fileName)\n }\n ]\n }\n ];\n\n return Object.fromEntries(\n Object.entries(PLUGIN_HOOKS).map(([hookName, fileName]) => [hookName, makeHook(fileName)])\n ) as ClaudeSettingsHooks;\n}\n\nexport function isPluginHookCommand(command: string | undefined, pluginPath?: string): boolean {\n if (!command) return false;\n const normalized = command.replace(/\\\\/g, '/');\n const normalizedPluginPath = pluginPath?.replace(/\\\\/g, '/').replace(/\\/$/, '');\n\n return REQUIRED_HOOK_FILES.some((fileName) => {\n if (normalizedPluginPath && normalized.includes(`${normalizedPluginPath}/hooks/${fileName}`)) {\n return true;\n }\n return normalized.includes('claude-memory-layer') && normalized.includes(`/hooks/${fileName}`);\n });\n}\n\nexport function hasHook(\n settings: ClaudeSettingsWithHooks,\n hookName: PluginHookName,\n commandFragment: string\n): boolean {\n const hookEntries = settings.hooks?.[hookName];\n if (!hookEntries) return false;\n return hookEntries.some((entry) => entry.hooks?.some((hook) => hook.command?.includes(commandFragment)));\n}\n\nexport function removePluginHooksFromSettings<T extends ClaudeSettingsWithHooks>(settings: T, pluginPath?: string): T {\n const next = { ...settings };\n if (!settings.hooks) return next;\n\n const hooks: ClaudeSettingsHooks = { ...settings.hooks };\n\n for (const hookName of Object.keys(PLUGIN_HOOKS) as PluginHookName[]) {\n const entries = hooks[hookName] ?? [];\n const cleanedEntries = entries\n .map((entry) => ({\n ...entry,\n hooks: (entry.hooks ?? []).filter((hook) => !isPluginHookCommand(hook.command, pluginPath))\n }))\n .filter((entry) => entry.hooks.length > 0);\n\n if (cleanedEntries.length > 0) {\n hooks[hookName] = cleanedEntries;\n } else {\n delete hooks[hookName];\n }\n }\n\n if (Object.keys(hooks).length > 0) {\n next.hooks = hooks;\n } else {\n delete next.hooks;\n }\n\n return next;\n}\n\nexport function mergePluginHooksIntoSettings<T extends ClaudeSettingsWithHooks>(settings: T, pluginPath: string): T {\n const cleaned = removePluginHooksFromSettings(settings, pluginPath);\n const next = { ...cleaned, hooks: { ...(cleaned.hooks ?? {}) } };\n const pluginHooks = getHooksConfig(pluginPath);\n\n for (const hookName of Object.keys(PLUGIN_HOOKS) as PluginHookName[]) {\n next.hooks[hookName] = [\n ...(next.hooks[hookName] ?? []),\n ...(pluginHooks[hookName] ?? [])\n ];\n }\n\n return next;\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { CodexSessionValidationReport } from '../../services/codex-session-history-importer.js';\n\nexport type CodexValidationReportFormat = 'json' | 'markdown';\n\nfunction formatNumber(value: number): string {\n return Number.isFinite(value) ? value.toLocaleString('en-US') : String(value);\n}\n\nexport function formatCodexValidationReport(\n report: CodexSessionValidationReport,\n format: CodexValidationReportFormat = 'markdown'\n): string {\n if (format === 'json') {\n return `${JSON.stringify(report, null, 2)}\\n`;\n }\n\n const lines: string[] = [\n '# Codex dry-run validation report',\n '',\n `Generated: ${report.generatedAt}`,\n `Dry-run: ${report.dryRun ? 'yes' : 'no'}`,\n `Will mutate memory: ${report.willMutate ? 'yes' : 'no'}`,\n `Sessions directory: ${report.source.sessionsDir}`,\n `Project filter: ${report.source.projectPath ?? '(none)'}`,\n `Source paths: ${report.source.sourcePaths.join(', ')}`,\n `Session limit: ${report.limits.sessionLimit ?? '(none)'}`,\n `Max content chars: ${formatNumber(report.limits.maxContentChars)}`,\n '',\n '## Totals',\n '',\n `- Sessions scanned: ${formatNumber(report.totals.sessionsScanned)}`,\n `- Sessions matched: ${formatNumber(report.totals.sessionsMatched)}`,\n `- Files read: ${formatNumber(report.totals.filesRead)}`,\n `- Records read: ${formatNumber(report.totals.recordsRead)}`,\n `- Messages normalized: ${formatNumber(report.totals.messagesNormalized)}`,\n `- Turns normalized: ${formatNumber(report.totals.turnsNormalized)}`,\n `- User messages: ${formatNumber(report.totals.userMessages)}`,\n `- Assistant messages: ${formatNumber(report.totals.assistantMessages)}`,\n `- Malformed lines: ${formatNumber(report.totals.malformedLines)}`,\n `- Skipped/unsupported records: ${formatNumber(report.totals.skippedUnsupportedRecords)}`,\n `- Empty assistant messages: ${formatNumber(report.totals.emptyAssistantMessages)}`,\n `- Truncated messages: ${formatNumber(report.totals.truncatedMessages)}`,\n `- Missing project cwd: ${formatNumber(report.totals.missingProjectCwd)}`,\n `- Warnings: ${formatNumber(report.totals.warnings)}`,\n '',\n '## Top projects',\n '',\n '| Project | Hash | Sessions | Messages | Turns | User | Assistant | Malformed | Skipped/unsupported | Truncated | Empty assistant |',\n '| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |'\n ];\n\n if (report.topProjects.length === 0) {\n lines.push('| (none) | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |');\n } else {\n for (const project of report.topProjects) {\n lines.push([\n `| ${project.pathLabel}`,\n project.projectHash,\n formatNumber(project.sessions),\n formatNumber(project.messagesNormalized),\n formatNumber(project.turnsNormalized),\n formatNumber(project.userMessages),\n formatNumber(project.assistantMessages),\n formatNumber(project.malformedLines),\n formatNumber(project.skippedUnsupportedRecords),\n formatNumber(project.truncatedMessages),\n `${formatNumber(project.emptyAssistantMessages)} |`\n ].join(' | '));\n }\n }\n\n lines.push('', '## Warnings', '');\n if (report.warnings.length === 0) {\n lines.push('- None');\n } else {\n for (const warning of report.warnings) {\n lines.push(`- ${warning}`);\n }\n }\n\n lines.push('', '_Aggregate counts only; transcript content is not included._', '');\n return lines.join('\\n');\n}\n\nexport function writeCodexValidationReport(\n outputPath: string,\n report: CodexSessionValidationReport,\n format: CodexValidationReportFormat = 'markdown'\n): void {\n const dir = path.dirname(outputPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(outputPath, formatCodexValidationReport(report, format), 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { HermesSessionValidationReport } from '../../services/hermes-session-history-importer.js';\n\nexport type HermesValidationReportFormat = 'json' | 'markdown';\n\nfunction formatNumber(value: number): string {\n return Number.isFinite(value) ? value.toLocaleString('en-US') : String(value);\n}\n\nexport function formatHermesValidationReport(\n report: HermesSessionValidationReport,\n format: HermesValidationReportFormat = 'markdown'\n): string {\n if (format === 'json') {\n return `${JSON.stringify(report, null, 2)}\\n`;\n }\n\n const lines: string[] = [\n '# Hermes dry-run validation report',\n '',\n `Generated: ${report.generatedAt}`,\n `Dry-run: ${report.dryRun ? 'yes' : 'no'}`,\n `Will mutate memory: ${report.willMutate ? 'yes' : 'no'}`,\n `State DB: ${report.source.stateDbPath}`,\n `Project filter: ${report.source.projectPath ?? '(none)'}`,\n `Source paths: ${report.source.sourcePaths.join(', ')}`,\n `Session limit: ${report.limits.sessionLimit ?? '(none)'}`,\n `Max content chars: ${formatNumber(report.limits.maxContentChars)}`,\n '',\n '## Totals',\n '',\n `- Sessions scanned: ${formatNumber(report.totals.sessionsScanned)}`,\n `- Sessions matched: ${formatNumber(report.totals.sessionsMatched)}`,\n `- Messages read: ${formatNumber(report.totals.messagesRead)}`,\n `- Messages normalized: ${formatNumber(report.totals.messagesNormalized)}`,\n `- Turns normalized: ${formatNumber(report.totals.turnsNormalized)}`,\n `- User messages: ${formatNumber(report.totals.userMessages)}`,\n `- Assistant messages: ${formatNumber(report.totals.assistantMessages)}`,\n `- Skipped/unsupported messages: ${formatNumber(report.totals.skippedUnsupportedMessages)}`,\n `- Empty assistant messages: ${formatNumber(report.totals.emptyAssistantMessages)}`,\n `- Truncated messages: ${formatNumber(report.totals.truncatedMessages)}`,\n `- Missing project context: ${formatNumber(report.totals.missingProjectContext)}`,\n `- Warnings: ${formatNumber(report.totals.warnings)}`,\n '',\n '## Top sources',\n '',\n '| Source | Sessions | Messages | Turns | User | Assistant | Skipped/unsupported | Truncated | Empty assistant |',\n '| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |'\n ];\n\n if (report.topSources.length === 0) {\n lines.push('| (none) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |');\n } else {\n for (const source of report.topSources) {\n lines.push([\n `| ${source.source}`,\n formatNumber(source.sessions),\n formatNumber(source.messagesNormalized),\n formatNumber(source.turnsNormalized),\n formatNumber(source.userMessages),\n formatNumber(source.assistantMessages),\n formatNumber(source.skippedUnsupportedMessages),\n formatNumber(source.truncatedMessages),\n `${formatNumber(source.emptyAssistantMessages)} |`\n ].join(' | '));\n }\n }\n\n lines.push('', '## Warnings', '');\n if (report.warnings.length === 0) {\n lines.push('- None');\n } else {\n for (const warning of report.warnings) {\n lines.push(`- ${warning}`);\n }\n }\n\n lines.push('', '_Aggregate counts only; transcript content is not included._', '');\n return lines.join('\\n');\n}\n\nexport function writeHermesValidationReport(\n outputPath: string,\n report: HermesSessionValidationReport,\n format: HermesValidationReportFormat = 'markdown'\n): void {\n const dir = path.dirname(outputPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(outputPath, formatHermesValidationReport(report, format), 'utf8');\n}\n", "import {\n createCodexSessionHistoryImporter,\n type CodexSessionHistoryImporter,\n type CodexSessionHistoryImporterOptions\n} from '../../services/codex-session-history-importer.js';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n type MemoryService\n} from '../../services/memory-service.js';\nimport type { ImportOptions, ImportResult, ProgressEvent } from '../../services/session-history-importer.js';\n\nexport interface CodexImportCommandOptions {\n project?: string;\n session?: string;\n all?: boolean;\n limit?: string;\n sessionLimit?: string;\n force?: boolean;\n verbose?: boolean;\n sessionsDir?: string;\n processEmbeddings?: boolean;\n}\n\nexport interface CodexImportOutcome {\n mode: 'project' | 'session' | 'all';\n storageScope: 'project' | 'global';\n projectPath?: string;\n result: ImportResult;\n embedCount: number;\n}\n\nexport interface CodexImportRunnerDeps {\n cwd: () => string;\n getDefaultMemoryService: () => MemoryService;\n getMemoryServiceForProject: (projectPath: string) => MemoryService;\n createImporter: (\n memoryService: MemoryService,\n options?: CodexSessionHistoryImporterOptions\n ) => Pick<CodexSessionHistoryImporter, 'importProject' | 'importAll' | 'importSessionFile'>;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nconst realDeps: CodexImportRunnerDeps = {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createCodexSessionHistoryImporter\n};\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction shouldUseGlobalStorage(options: CodexImportCommandOptions): boolean {\n return options.all === true && !options.project && !options.session;\n}\n\nexport async function runCodexImportOnce(\n options: CodexImportCommandOptions,\n deps: CodexImportRunnerDeps = realDeps\n): Promise<CodexImportOutcome> {\n const targetProjectPath = options.project || deps.cwd();\n const useGlobalStorage = shouldUseGlobalStorage(options);\n const memoryService = useGlobalStorage\n ? deps.getDefaultMemoryService()\n : deps.getMemoryServiceForProject(targetProjectPath);\n const importer = deps.createImporter(memoryService, { sessionsDir: options.sessionsDir });\n\n await memoryService.initialize();\n await memoryService.ensureEmbeddingModelForImport({ autoMigrate: true });\n\n const importOptions: ImportOptions = {\n limit: parsePositiveInteger(options.limit, 'limit'),\n sessionLimit: parsePositiveInteger(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: deps.onProgress\n };\n\n let mode: CodexImportOutcome['mode'];\n let result: ImportResult;\n\n try {\n if (options.session) {\n mode = 'session';\n result = await importer.importSessionFile(options.session, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n } else if (options.all) {\n mode = 'all';\n result = await importer.importAll(importOptions);\n } else {\n mode = 'project';\n result = await importer.importProject(targetProjectPath, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n }\n\n const embedCount = options.processEmbeddings === false\n ? 0\n : await memoryService.processPendingEmbeddings();\n\n return {\n mode,\n storageScope: useGlobalStorage ? 'global' : 'project',\n projectPath: useGlobalStorage ? undefined : targetProjectPath,\n result,\n embedCount\n };\n } finally {\n await memoryService.shutdown();\n }\n}\n", "import {\n createHermesSessionHistoryImporter,\n type HermesSessionHistoryImporter,\n type HermesSessionHistoryImporterOptions\n} from '../../services/hermes-session-history-importer.js';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n type MemoryService\n} from '../../services/memory-service.js';\nimport type { ImportOptions, ImportResult, ProgressEvent } from '../../services/session-history-importer.js';\n\nexport interface HermesImportCommandOptions {\n project?: string;\n session?: string;\n all?: boolean;\n limit?: string;\n sessionLimit?: string;\n force?: boolean;\n verbose?: boolean;\n stateDb?: string;\n stateDbPath?: string;\n processEmbeddings?: boolean;\n}\n\nexport interface HermesImportOutcome {\n mode: 'project' | 'session' | 'all';\n storageScope: 'project' | 'global';\n projectPath?: string;\n result: ImportResult;\n embedCount: number;\n}\n\nexport interface HermesImportRunnerDeps {\n cwd: () => string;\n getDefaultMemoryService: () => MemoryService;\n getMemoryServiceForProject: (projectPath: string) => MemoryService;\n createImporter: (\n memoryService: MemoryService,\n options?: HermesSessionHistoryImporterOptions\n ) => Pick<HermesSessionHistoryImporter, 'importProject' | 'importAll' | 'importSession'>;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nconst realDeps: HermesImportRunnerDeps = {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createHermesSessionHistoryImporter\n};\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction shouldUseGlobalStorage(options: HermesImportCommandOptions): boolean {\n return options.all === true && !options.project && !options.session;\n}\n\nfunction getStateDbPathOption(options: HermesImportCommandOptions): string | undefined {\n return options.stateDbPath ?? options.stateDb;\n}\n\nexport async function runHermesImportOnce(\n options: HermesImportCommandOptions,\n deps: HermesImportRunnerDeps = realDeps\n): Promise<HermesImportOutcome> {\n const targetProjectPath = options.project || deps.cwd();\n const useGlobalStorage = shouldUseGlobalStorage(options);\n const memoryService = useGlobalStorage\n ? deps.getDefaultMemoryService()\n : deps.getMemoryServiceForProject(targetProjectPath);\n const importer = deps.createImporter(memoryService, { stateDbPath: getStateDbPathOption(options) });\n\n await memoryService.initialize();\n await memoryService.ensureEmbeddingModelForImport({ autoMigrate: true });\n\n const importOptions: ImportOptions = {\n limit: parsePositiveInteger(options.limit, 'limit'),\n sessionLimit: parsePositiveInteger(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: deps.onProgress\n };\n\n let mode: HermesImportOutcome['mode'];\n let result: ImportResult;\n\n try {\n if (options.session) {\n mode = 'session';\n result = await importer.importSession(options.session, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n } else if (options.all) {\n mode = 'all';\n result = await importer.importAll(importOptions);\n } else {\n mode = 'project';\n result = await importer.importProject(targetProjectPath, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n }\n\n const embedCount = options.processEmbeddings === false\n ? 0\n : await memoryService.processPendingEmbeddings();\n\n return {\n mode,\n storageScope: useGlobalStorage ? 'global' : 'project',\n projectPath: useGlobalStorage ? undefined : targetProjectPath,\n result,\n embedCount\n };\n } finally {\n await memoryService.shutdown();\n }\n}\n", "const MAX_RENDERED_ITEMS = 8;\nconst MAX_FRED_SERIES = 10;\nconst PROVIDER_FETCH_TIMEOUT_MS = 8_000;\nconst DEFAULT_FRED_SERIES = ['FEDFUNDS', 'CPIAUCSL', 'UNRATE'];\nconst ALLOWED_PROVIDERS = new Set<ExternalMarketProvider>(['dart', 'fred', 'finnhub']);\n\nexport type ExternalMarketProvider = 'dart' | 'fred' | 'finnhub';\nexport type ProviderStatus = 'ok' | 'skipped' | 'error';\nexport type MarketContextInsightConfidence = 'low' | 'medium' | 'high';\nexport type MarketContextInsightHorizon = 'near-term' | 'medium-term' | 'monitor';\nexport type MarketContextDartConfidence = 'exact-corp-code' | 'company-name-fallback' | 'provider-skipped' | 'provider-error' | 'unavailable';\n\nexport interface ExternalMarketContextOptions {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers?: ExternalMarketProvider[];\n fredSeries?: string[];\n includeSnapshot?: boolean;\n now?: Date;\n}\n\nexport interface DartFiling {\n corpName: string;\n receiptNo: string;\n reportName: string;\n filerName?: string;\n receiptDate?: string;\n remark?: string;\n url: string;\n}\n\nexport interface DartProviderResult {\n provider: 'dart';\n status: ProviderStatus;\n filings: DartFiling[];\n displayedFilings: DartFiling[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface FredSeriesSnapshot {\n seriesId: string;\n latestValue?: string;\n latestDate?: string;\n}\n\nexport interface FredProviderResult {\n provider: 'fred';\n status: ProviderStatus;\n series: FredSeriesSnapshot[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface FinnhubProviderResult {\n provider: 'finnhub';\n status: ProviderStatus;\n profile?: Record<string, unknown>;\n warnings?: string[];\n error?: string;\n}\n\nexport interface MarketContextEvidence {\n provider: ExternalMarketProvider;\n title: string;\n reason: string;\n receiptNo?: string;\n receiptDate?: string;\n url?: string;\n category?: string;\n seriesId?: string;\n latestValue?: string;\n latestDate?: string;\n symbol?: string;\n}\n\nexport interface MarketContextInsight {\n signal: string;\n thesis: string;\n confidence: MarketContextInsightConfidence;\n horizon: MarketContextInsightHorizon;\n evidence: MarketContextEvidence[];\n}\n\nexport interface CompanySnapshot {\n company: string;\n filingsAnalyzed: number;\n categoryCounts: Record<string, number>;\n riskSignals: MarketContextEvidence[];\n catalysts: MarketContextEvidence[];\n watchlist: string[];\n followUpQuestions: string[];\n}\n\nexport interface MarketContextSnapshot {\n schemaVersion: 'market-context-snapshot.v1';\n subject: {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n };\n coverage: {\n dart?: {\n status: ProviderStatus;\n filingsAnalyzed: number;\n renderedFilings: number;\n confidence: MarketContextDartConfidence;\n warnings?: string[];\n };\n fred?: {\n status: ProviderStatus;\n seriesAnalyzed: number;\n warnings?: string[];\n };\n finnhub?: {\n status: ProviderStatus;\n hasProfile: boolean;\n warnings?: string[];\n };\n };\n bullCases: MarketContextInsight[];\n bearCases: MarketContextInsight[];\n risks: MarketContextInsight[];\n catalysts: MarketContextInsight[];\n watchlist: string[];\n followUpQuestions: string[];\n}\n\nexport interface ExternalMarketContextAnalysis {\n companySnapshot?: CompanySnapshot;\n marketSnapshot?: MarketContextSnapshot;\n}\n\nexport interface ExternalMarketContextReport {\n generatedAt: string;\n query: {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers: ExternalMarketProvider[];\n fredSeries?: string[];\n };\n dart?: DartProviderResult;\n fred?: FredProviderResult;\n finnhub?: FinnhubProviderResult;\n analysis?: ExternalMarketContextAnalysis;\n}\n\nexport async function fetchExternalMarketContext(options: ExternalMarketContextOptions): Promise<ExternalMarketContextReport> {\n const providers = normalizeProviders(options.providers);\n const fredSelection = selectFredSeries(options.fredSeries);\n const report: ExternalMarketContextReport = {\n generatedAt: (options.now ?? new Date()).toISOString(),\n query: {\n company: optionalTrimmed(options.company),\n dartCorpCode: optionalTrimmed(options.dartCorpCode),\n symbol: optionalTrimmed(options.symbol),\n providers,\n fredSeries: providers.includes('fred') ? fredSelection.series : normalizeStringList(options.fredSeries)\n }\n };\n\n for (const provider of providers) {\n if (provider === 'dart') report.dart = await fetchDartProvider(report.query.company, report.query.dartCorpCode);\n if (provider === 'fred') report.fred = await fetchFredProvider(fredSelection.series, fredSelection.warnings);\n if (provider === 'finnhub') report.finnhub = await fetchFinnhubProvider(report.query.symbol);\n }\n\n if (options.includeSnapshot !== false) {\n const companySnapshot = report.dart?.status === 'ok'\n ? buildCompanySnapshot(report.query.company ?? report.dart.filings[0]?.corpName ?? 'unknown', report.dart.filings)\n : undefined;\n report.analysis = {\n ...(companySnapshot ? { companySnapshot } : {}),\n marketSnapshot: buildMarketContextSnapshot(report)\n };\n }\n\n return report;\n}\n\nasync function fetchDartProvider(company?: string, corpCode?: string): Promise<DartProviderResult> {\n const apiKey = optionalTrimmed(process.env.DART_API_KEY);\n if (!apiKey) return { provider: 'dart', status: 'skipped', filings: [], displayedFilings: [], warnings: ['DART_API_KEY is not set'] };\n if (!company && !corpCode) return { provider: 'dart', status: 'skipped', filings: [], displayedFilings: [], warnings: ['company or dartCorpCode is required for DART'] };\n\n const warnings: string[] = [];\n if (company && !corpCode) warnings.push('DART company-name fallback is low-confidence; prefer dartCorpCode for exact issuer coverage.');\n\n try {\n const url = new URL('https://opendart.fss.or.kr/api/list.json');\n url.searchParams.set('crtfc_key', apiKey);\n if (corpCode) url.searchParams.set('corp_code', corpCode);\n url.searchParams.set('page_count', '100');\n const { response, json } = await fetchJsonWithTimeout(url);\n const status = stringValue(json.status);\n if (status === '013') return { provider: 'dart', status: 'ok', filings: [], displayedFilings: [], warnings };\n if (!response.ok || (status && status !== '000')) {\n return { provider: 'dart', status: 'error', filings: [], displayedFilings: [], warnings, error: redactSecrets(String(json.message ?? `DART status ${status ?? response.status}`)) };\n }\n const rows = Array.isArray(json.list) ? json.list : [];\n const filings = rows\n .map(normalizeDartFiling)\n .filter((filing): filing is DartFiling => filing !== undefined)\n .filter((filing) => corpCode || !company || filing.corpName.includes(company) || company.includes(filing.corpName));\n return { provider: 'dart', status: 'ok', filings, displayedFilings: filings.slice(0, MAX_RENDERED_ITEMS), warnings };\n } catch (error) {\n return { provider: 'dart', status: 'error', filings: [], displayedFilings: [], warnings, error: safeProviderError(error) };\n }\n}\n\nasync function fetchFredProvider(seriesIds: string[], preflightWarnings: string[] = []): Promise<FredProviderResult> {\n const apiKey = optionalTrimmed(process.env.FRED_API_KEY);\n const series = seriesIds;\n if (!apiKey) return { provider: 'fred', status: 'skipped', series: [], warnings: ['FRED_API_KEY is not set', ...preflightWarnings] };\n\n const snapshots: FredSeriesSnapshot[] = [];\n const warnings: string[] = [...preflightWarnings];\n for (const seriesId of series) {\n try {\n const url = new URL('https://api.stlouisfed.org/fred/series/observations');\n url.searchParams.set('api_key', apiKey);\n url.searchParams.set('file_type', 'json');\n url.searchParams.set('series_id', seriesId);\n url.searchParams.set('sort_order', 'desc');\n url.searchParams.set('limit', '1');\n const { response, json } = await fetchJsonWithTimeout(url);\n if (!response.ok || Array.isArray(json.observations) === false) {\n warnings.push(`${seriesId}: ${redactSecrets(String(json.error_message ?? response.statusText ?? 'failed'))}`);\n continue;\n }\n const latest = (json.observations as unknown[]).find((item) => typeof item === 'object' && item !== null) as Record<string, unknown> | undefined;\n snapshots.push({ seriesId, latestValue: stringValue(latest?.value), latestDate: stringValue(latest?.date) });\n } catch (error) {\n warnings.push(`${seriesId}: ${safeProviderError(error)}`);\n }\n }\n return { provider: 'fred', status: snapshots.length > 0 ? 'ok' : 'error', series: snapshots, warnings };\n}\n\nasync function fetchFinnhubProvider(symbol?: string): Promise<FinnhubProviderResult> {\n const apiKey = optionalTrimmed(process.env.FINNHUB_API_KEY);\n if (!apiKey) return { provider: 'finnhub', status: 'skipped', warnings: ['FINNHUB_API_KEY is not set'] };\n if (!symbol) return { provider: 'finnhub', status: 'skipped', warnings: ['symbol is required for Finnhub'] };\n\n try {\n const url = new URL('https://finnhub.io/api/v1/stock/profile2');\n url.searchParams.set('token', apiKey);\n url.searchParams.set('symbol', symbol);\n const { response, json } = await fetchJsonWithTimeout(url);\n if (!response.ok) return { provider: 'finnhub', status: 'error', error: redactSecrets(String(json.error ?? response.statusText ?? 'failed')) };\n if (!hasObjectData(json)) return { provider: 'finnhub', status: 'skipped', warnings: ['Finnhub returned no profile data'] };\n return { provider: 'finnhub', status: 'ok', profile: json };\n } catch (error) {\n return { provider: 'finnhub', status: 'error', error: safeProviderError(error) };\n }\n}\n\nfunction buildCompanySnapshot(company: string, filings: DartFiling[]): CompanySnapshot {\n const categoryCounts: Record<string, number> = {};\n const riskSignals: MarketContextEvidence[] = [];\n const catalysts: MarketContextEvidence[] = [];\n for (const filing of filings) {\n const category = categorizeFiling(filing.reportName);\n categoryCounts[category] = (categoryCounts[category] ?? 0) + 1;\n const evidence = dartEvidence(filing, category, `DART filing categorized as ${category}`);\n if (category === 'risk' || category === 'correction') riskSignals.push(evidence);\n if (category === 'contract' || category === 'capital' || category === 'financial' || category === 'performance') catalysts.push(evidence);\n }\n return {\n company,\n filingsAnalyzed: filings.length,\n categoryCounts,\n riskSignals,\n catalysts,\n watchlist: [\n 'Compare repeat/correction filings with prior filings before relying on trend signals.',\n 'Prefer dartCorpCode-based lookups for exact issuer coverage.',\n 'Review risk-sensitive filings manually before making investment or sales decisions.'\n ],\n followUpQuestions: [\n 'Which recent filings change revenue, margin, capital structure, or governance assumptions?',\n 'Are any risk-sensitive filings one-off events or recurring patterns?',\n 'What customer/sales implication follows from the latest disclosed business changes?'\n ]\n };\n}\n\nfunction buildMarketContextSnapshot(report: ExternalMarketContextReport): MarketContextSnapshot {\n const bullCases: MarketContextInsight[] = [];\n const bearCases: MarketContextInsight[] = [];\n const risks: MarketContextInsight[] = [];\n const catalysts: MarketContextInsight[] = [];\n\n if (report.dart?.status === 'ok') appendDartInsights(report.dart.filings, bullCases, bearCases, risks, catalysts);\n if (report.fred?.status === 'ok') appendFredInsights(report.fred.series, bullCases, bearCases, risks, catalysts);\n if (report.finnhub?.status === 'ok' && report.finnhub.profile) appendFinnhubInsights(report.query.symbol, report.finnhub.profile, bullCases, catalysts);\n\n return {\n schemaVersion: 'market-context-snapshot.v1',\n subject: { company: report.query.company ?? report.dart?.filings[0]?.corpName, dartCorpCode: report.query.dartCorpCode, symbol: report.query.symbol },\n coverage: {\n ...(report.dart ? { dart: { status: report.dart.status, filingsAnalyzed: report.dart.filings.length, renderedFilings: report.dart.displayedFilings.length, confidence: dartConfidence(report), ...(report.dart.warnings?.length ? { warnings: report.dart.warnings } : {}) } } : {}),\n ...(report.fred ? { fred: { status: report.fred.status, seriesAnalyzed: report.fred.series.length, ...(report.fred.warnings?.length ? { warnings: report.fred.warnings } : {}) } } : {}),\n ...(report.finnhub ? { finnhub: { status: report.finnhub.status, hasProfile: report.finnhub.profile !== undefined, ...(report.finnhub.warnings?.length ? { warnings: report.finnhub.warnings } : {}) } } : {})\n },\n bullCases: bullCases.slice(0, 8),\n bearCases: bearCases.slice(0, 8),\n risks: risks.slice(0, 8),\n catalysts: catalysts.slice(0, 8),\n watchlist: [\n 'Verify every insight against original provider data before making investment, sales, or strategy decisions.',\n 'Separate one-off event disclosures from recurring trend signals.',\n 'Use exact identifiers such as DART corpCode and listed ticker for customer-facing reports.'\n ],\n followUpQuestions: [\n 'What changed in the latest filings that affects bull-case revenue or margin assumptions?',\n 'Which bear-case risks require management, customer, or investor follow-up?',\n 'Which catalyst has a concrete date, counterparty, amount, or regulatory dependency?'\n ]\n };\n}\n\nfunction appendDartInsights(filings: DartFiling[], bullCases: MarketContextInsight[], bearCases: MarketContextInsight[], risks: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n for (const filing of filings) {\n const category = categorizeFiling(filing.reportName);\n const evidence = [dartEvidence(filing, category, `DART filing categorized as ${category}`)];\n if (category === 'performance') bullCases.push(insight('Operating performance disclosure', 'Recent operating performance disclosure can support the bull case if the detailed filing confirms improving revenue, margin, or demand signals.', 'medium', 'near-term', evidence));\n if (category === 'contract') {\n catalysts.push(insight('Commercial contract disclosure', 'New contract or supply disclosure is a catalyst candidate because it can change near-term revenue visibility or customer momentum.', 'medium', 'near-term', evidence));\n bullCases.push(insight('Revenue visibility catalyst', 'Contract disclosure can strengthen the bull case if contract size, duration, and counterparty quality are material.', 'medium', 'near-term', evidence));\n }\n if (category === 'capital') {\n bearCases.push(insight('Capital structure dilution watch', 'Capital issuance can pressure the bear case through dilution, financing cost, or balance-sheet stress unless proceeds create clear strategic value.', 'medium', 'medium-term', evidence));\n catalysts.push(insight('Capital allocation event', 'Capital market activity is a catalyst that requires follow-up on use of proceeds, dilution, and investor demand.', 'low', 'monitor', evidence));\n }\n if (category === 'risk') {\n risks.push(insight('Risk-sensitive disclosure', 'Litigation, enforcement, trading-halt, or governance-risk disclosure needs manual review before relying on the company outlook.', 'high', 'near-term', evidence));\n bearCases.push(insight('Event-risk overhang', 'Risk-sensitive filings can create a bear-case overhang until scope, liability, and operational impact are clarified.', 'high', 'near-term', evidence));\n }\n if (category === 'financial') catalysts.push(insight('Scheduled financial disclosure', 'Financial statements are an analysis catalyst because they can update margin, cash-flow, and growth assumptions.', 'low', 'monitor', evidence));\n if (category === 'correction') risks.push(insight('Correction filing', 'Correction filings should be compared with the original disclosure to confirm whether the change alters material assumptions.', 'medium', 'monitor', evidence));\n }\n}\n\nfunction appendFredInsights(series: FredSeriesSnapshot[], bullCases: MarketContextInsight[], bearCases: MarketContextInsight[], risks: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n for (const item of series) {\n const evidence = [fredEvidence(item, 'Latest FRED observation included in macro context')];\n catalysts.push(insight('Macro data update', `${item.seriesId} latest observation can update demand, funding, or consumer backdrop assumptions.`, 'low', 'monitor', evidence));\n const value = numericValue(item.latestValue);\n if (/FEDFUNDS|DFF|SOFR/i.test(item.seriesId) && value !== undefined) {\n if (value >= 4) {\n risks.push(insight('High-rate macro pressure', 'Elevated policy/funding rates can pressure valuation multiples, financing cost, and discretionary demand.', 'medium', 'medium-term', evidence));\n bearCases.push(insight('Funding-cost bear case', 'High interest-rate context supports a bear-case watch on financing-sensitive growth assumptions.', 'medium', 'medium-term', evidence));\n } else if (value <= 2) {\n bullCases.push(insight('Low-rate macro support', 'Lower policy-rate context can support risk appetite, financing conditions, and demand assumptions.', 'low', 'medium-term', evidence));\n }\n }\n if (/CPI|PCE|INFLATION/i.test(item.seriesId)) risks.push(insight('Inflation monitor', 'Inflation-sensitive macro data can affect pricing power, cost assumptions, and consumer demand.', 'low', 'monitor', evidence));\n if (/UNRATE|PAYEMS/i.test(item.seriesId)) catalysts.push(insight('Labor-market signal', 'Labor-market data can update consumer demand and wage-cost assumptions.', 'low', 'monitor', evidence));\n }\n}\n\nfunction appendFinnhubInsights(symbol: string | undefined, profile: Record<string, unknown>, bullCases: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n const ticker = stringValue(profile.ticker) ?? symbol;\n const evidence = [finnhubEvidence(ticker, profile, 'Finnhub company profile included in market context')];\n catalysts.push(insight('Public market profile context', 'Ticker, exchange, industry, and market-cap profile help frame peer set and investor-facing positioning.', 'low', 'monitor', evidence));\n const marketCap = numericValue(profile.marketCapitalization);\n if (marketCap !== undefined && marketCap > 0) {\n bullCases.push(insight('Scale and market presence', 'Available public-market profile and market-cap data can support a scale/visibility bull-case framing when compared with peers.', marketCap >= 10000 ? 'medium' : 'low', 'monitor', evidence));\n }\n}\n\nfunction insight(signal: string, thesis: string, confidence: MarketContextInsightConfidence, horizon: MarketContextInsightHorizon, evidence: MarketContextEvidence[]): MarketContextInsight {\n return { signal, thesis, confidence, horizon, evidence };\n}\n\nfunction dartEvidence(filing: DartFiling, category: string, reason: string): MarketContextEvidence {\n return { provider: 'dart', title: filing.reportName, receiptNo: filing.receiptNo, receiptDate: filing.receiptDate, url: filing.url, category, reason };\n}\n\nfunction fredEvidence(item: FredSeriesSnapshot, reason: string): MarketContextEvidence {\n return { provider: 'fred', title: item.seriesId, seriesId: item.seriesId, latestValue: item.latestValue, latestDate: item.latestDate, reason };\n}\n\nfunction finnhubEvidence(symbol: string | undefined, profile: Record<string, unknown>, reason: string): MarketContextEvidence {\n return { provider: 'finnhub', title: symbol ?? stringValue(profile.name) ?? 'Finnhub profile', symbol, reason };\n}\n\nfunction categorizeFiling(reportName: string): string {\n if (/\uC18C\uC1A1|\uD6A1\uB839|\uBC30\uC784|\uAC70\uB798\uC815\uC9C0|\uC0C1\uC7A5\uD3D0\uC9C0|\uBD88\uC131\uC2E4/i.test(reportName)) return 'risk';\n if (/\uB2E8\uC77C\uD310\uB9E4|\uACF5\uAE09\uACC4\uC57D|\uACC4\uC57D\uCCB4\uACB0|\uC218\uC8FC/i.test(reportName)) return 'contract';\n if (/\uC601\uC5C5\\(\uC7A0\uC815\\)\uC2E4\uC801|\uC7A0\uC815\uC2E4\uC801|\uACF5\uC815\uACF5\uC2DC|\uB9E4\uCD9C\uC561|\uC190\uC775\uAD6C\uC870/i.test(reportName)) return 'performance';\n if (/\uC720\uC0C1\uC99D\uC790|\uC804\uD658\uC0AC\uCC44|\uC2E0\uC8FC\uC778\uC218\uAD8C|\uC99D\uAD8C\uC2E0\uACE0\uC11C|\uC0AC\uCC44\uAD8C/i.test(reportName)) return 'capital';\n if (/\uC0AC\uC5C5\uBCF4\uACE0\uC11C|\uBD84\uAE30\uBCF4\uACE0\uC11C|\uBC18\uAE30\uBCF4\uACE0\uC11C|\uAC10\uC0AC\uBCF4\uACE0\uC11C|\uC7AC\uBB34\uC81C\uD45C/i.test(reportName)) return 'financial';\n if (/\uC815\uC815/i.test(reportName)) return 'correction';\n if (/\uC8FC\uC8FC\uCD1D\uD68C|\uCD5C\uB300\uC8FC\uC8FC|\uC784\uC6D0|\uB300\uD45C\uC774\uC0AC|\uD569\uBCD1|\uBD84\uD560/i.test(reportName)) return 'governance';\n return 'other';\n}\n\nexport function renderExternalMarketContextReport(report: ExternalMarketContextReport): string {\n const lines: string[] = [\n '# External Market Context',\n '',\n `- Generated: ${report.generatedAt}`,\n `- Company: ${report.query.company ?? 'n/a'}`,\n `- DART corpCode: ${report.query.dartCorpCode ?? 'n/a'}`,\n `- Symbol: ${report.query.symbol ?? 'n/a'}`,\n `- Providers: ${report.query.providers.join(', ')}`,\n ''\n ];\n if (report.dart) appendDartSection(lines, report.dart, report.analysis?.companySnapshot);\n if (report.fred) appendFredSection(lines, report.fred);\n if (report.finnhub) appendFinnhubSection(lines, report.finnhub);\n if (report.analysis?.marketSnapshot) appendMarketContextSnapshotSection(lines, report.analysis.marketSnapshot);\n return redactSecrets(lines.join('\\n'));\n}\n\nfunction appendDartSection(lines: string[], result: DartProviderResult, snapshot?: CompanySnapshot): void {\n lines.push('## DART filings', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n if (result.status === 'ok') lines.push(`- Filings analyzed: ${result.filings.length}`, `- Filings displayed: ${result.displayedFilings.length}`);\n lines.push('');\n for (const filing of result.displayedFilings) lines.push(`- ${filing.reportName} (${filing.receiptDate ?? 'n/a'}) \u2014 ${filing.receiptNo} (${filing.url})`);\n lines.push('');\n if (snapshot) {\n lines.push('### DART company analysis snapshot', '', `- ${snapshot.filingsAnalyzed} filings analyzed`, `- Categories: ${Object.entries(snapshot.categoryCounts).map(([key, value]) => `${key}=${value}`).join(', ') || 'none'}`, '');\n lines.push('**Risk signals**');\n if (snapshot.riskSignals.length === 0) lines.push('- none detected in fetched filings');\n for (const item of snapshot.riskSignals) lines.push(`- ${item.title} (${item.receiptNo ?? 'n/a'}): ${item.reason}`);\n lines.push('', '**Catalysts**');\n if (snapshot.catalysts.length === 0) lines.push('- none detected in fetched filings');\n for (const item of snapshot.catalysts) lines.push(`- ${item.title} (${item.receiptNo ?? 'n/a'}): ${item.reason}`);\n lines.push('');\n }\n}\n\nfunction appendFredSection(lines: string[], result: FredProviderResult): void {\n lines.push('## FRED macro series', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n for (const series of result.series) lines.push(`- ${series.seriesId}: ${series.latestValue ?? 'n/a'} (${series.latestDate ?? 'n/a'})`);\n lines.push('');\n}\n\nfunction appendFinnhubSection(lines: string[], result: FinnhubProviderResult): void {\n lines.push('## Finnhub company profile', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n if (result.profile) for (const key of ['name', 'ticker', 'exchange', 'marketCapitalization', 'finnhubIndustry']) if (result.profile[key] !== undefined) lines.push(`- ${key}: ${String(result.profile[key])}`);\n lines.push('');\n}\n\nfunction appendMarketContextSnapshotSection(lines: string[], snapshot: MarketContextSnapshot): void {\n lines.push('### MarketContextSnapshot', '', `- Schema: ${snapshot.schemaVersion}`, `- Subject: ${snapshot.subject.company ?? 'n/a'}${snapshot.subject.dartCorpCode ? ` / DART ${snapshot.subject.dartCorpCode}` : ''}${snapshot.subject.symbol ? ` / ${snapshot.subject.symbol}` : ''}`);\n if (snapshot.coverage.dart) lines.push(`- DART coverage: status=${snapshot.coverage.dart.status}, filings=${snapshot.coverage.dart.filingsAnalyzed}, displayed=${snapshot.coverage.dart.renderedFilings}, confidence=${snapshot.coverage.dart.confidence}`);\n if (snapshot.coverage.fred) lines.push(`- FRED coverage: status=${snapshot.coverage.fred.status}, series=${snapshot.coverage.fred.seriesAnalyzed}`);\n if (snapshot.coverage.finnhub) lines.push(`- Finnhub coverage: status=${snapshot.coverage.finnhub.status}, hasProfile=${snapshot.coverage.finnhub.hasProfile}`);\n lines.push('');\n appendInsightList(lines, '**Bull case**', snapshot.bullCases);\n appendInsightList(lines, '**Bear case**', snapshot.bearCases);\n appendInsightList(lines, '**Risks**', snapshot.risks);\n appendInsightList(lines, '**Catalysts**', snapshot.catalysts);\n lines.push('**Snapshot watchlist**');\n for (const item of snapshot.watchlist) lines.push(`- ${item}`);\n lines.push('', '**Snapshot follow-up questions**');\n for (const item of snapshot.followUpQuestions) lines.push(`- ${item}`);\n lines.push('');\n}\n\nfunction appendInsightList(lines: string[], title: string, insights: MarketContextInsight[]): void {\n lines.push(title);\n if (insights.length === 0) {\n lines.push('- none detected in fetched provider data', '');\n return;\n }\n for (const item of insights) {\n lines.push(`- ${item.signal} [${item.confidence}, ${item.horizon}]: ${item.thesis}`);\n lines.push(` - Evidence: ${item.evidence.map(formatEvidence).join('; ')}`);\n }\n lines.push('');\n}\n\nfunction formatEvidence(evidence: MarketContextEvidence): string {\n if (evidence.provider === 'dart') return `DART: ${evidence.title}${evidence.receiptNo ? ` (${evidence.receiptNo})` : ''}`;\n if (evidence.provider === 'fred') return `FRED: ${evidence.seriesId ?? evidence.title}${evidence.latestValue ? `=${evidence.latestValue}` : ''}`;\n return `Finnhub: ${evidence.symbol ?? evidence.title}`;\n}\n\nfunction normalizeDartFiling(value: unknown): DartFiling | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const row = value as Record<string, unknown>;\n const receiptNo = stringValue(row.rcept_no);\n const reportName = stringValue(row.report_nm);\n const corpName = stringValue(row.corp_name) ?? '';\n if (!receiptNo || !reportName) return undefined;\n return {\n corpName,\n receiptNo,\n reportName,\n filerName: stringValue(row.flr_nm),\n receiptDate: stringValue(row.rcept_dt),\n remark: stringValue(row.rm),\n url: `https://dart.fss.or.kr/dsaf001/main.do?rcpNo=${encodeURIComponent(receiptNo)}`\n };\n}\n\nasync function fetchJsonWithTimeout(url: URL): Promise<{ response: Response; json: Record<string, unknown> }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PROVIDER_FETCH_TIMEOUT_MS);\n try {\n const response = await fetch(url, { signal: controller.signal });\n const json = await response.json() as Record<string, unknown>;\n return { response, json };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction selectFredSeries(value: string[] | undefined): { series: string[]; warnings: string[] } {\n const normalized = normalizeStringList(value);\n const requested = normalized.length > 0 ? normalized : DEFAULT_FRED_SERIES;\n const series = requested.slice(0, MAX_FRED_SERIES);\n const warnings = requested.length > MAX_FRED_SERIES\n ? [`FRED series list truncated to ${MAX_FRED_SERIES} entries`]\n : [];\n return { series, warnings };\n}\n\nfunction hasObjectData(value: Record<string, unknown>): boolean {\n return Object.values(value).some((item) => item !== undefined && item !== null && String(item).trim().length > 0);\n}\n\nfunction normalizeProviders(value: ExternalMarketProvider[] | undefined): ExternalMarketProvider[] {\n if (!value || value.length === 0) return ['dart', 'fred', 'finnhub'];\n const providers: ExternalMarketProvider[] = [];\n for (const provider of value) {\n if (!ALLOWED_PROVIDERS.has(provider)) throw new Error('Invalid providers: expected dart, fred, or finnhub');\n if (!providers.includes(provider)) providers.push(provider);\n }\n return providers;\n}\n\nfunction normalizeStringList(value: string[] | undefined): string[] {\n return Array.from(new Set((value ?? []).map((item) => item.trim()).filter(Boolean)));\n}\n\nfunction dartConfidence(report: ExternalMarketContextReport): MarketContextDartConfidence {\n if (!report.dart) return 'unavailable';\n if (report.dart.status === 'error') return 'provider-error';\n if (report.dart.status === 'skipped') return 'provider-skipped';\n if (report.query.dartCorpCode) return 'exact-corp-code';\n if (report.query.company) return 'company-name-fallback';\n return 'unavailable';\n}\n\nfunction optionalTrimmed(value: string | undefined): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction safeProviderError(error: unknown): string {\n return redactSecrets(error instanceof Error ? error.message : String(error));\n}\n\nfunction redactSecrets(input: string): string {\n let output = input;\n for (const value of [process.env.DART_API_KEY, process.env.FRED_API_KEY, process.env.FINNHUB_API_KEY]) {\n if (value && value.length > 0) output = output.split(value).join('[REDACTED]');\n }\n return output.replace(/([?&](?:crtfc_key|api_key|token)=)[^&\\s)]+/gi, '$1[REDACTED]');\n}\n"],
5
- "mappings": "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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Code Memory CLI\n * Command-line interface for memory operations\n */\n\nimport { Command } from 'commander';\nimport { exec } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n getLightweightMemoryServiceForProject\n} from '../../services/memory-service.js';\nimport { getProjectStoragePath } from '../../core/registry/project-path.js';\nimport { createSessionHistoryImporter, type ProgressEvent } from '../../services/session-history-importer.js';\nimport {\n createCodexSessionHistoryImporter,\n validateCodexSessions\n} from '../../services/codex-session-history-importer.js';\nimport {\n createHermesSessionHistoryImporter,\n validateHermesSessions\n} from '../../services/hermes-session-history-importer.js';\nimport { bootstrapKnowledgeBase } from '../../services/bootstrap-organizer.js';\nimport { startServer, stopServer, isServerRunning } from '../server/index.js';\nimport { SQLiteEventStore } from '../../core/sqlite-event-store.js';\nimport { MongoSyncWorker, type MongoSyncDirection } from '../../core/mongo-sync-worker.js';\nimport {\n formatDisclosureExpansion,\n formatDisclosureSearch,\n formatDisclosureSource,\n formatPlainSearchResults\n} from './retrieval-disclosure-output.js';\nimport { installMcpServer } from './mcp-install.js';\nimport {\n hasHook,\n mergePluginHooksIntoSettings,\n removePluginHooksFromSettings,\n REQUIRED_HOOK_FILES,\n type ClaudeSettingsWithHooks\n} from './claude-settings-hooks.js';\nimport {\n formatCodexValidationReport,\n writeCodexValidationReport,\n type CodexValidationReportFormat\n} from './codex-validation-output.js';\nimport {\n formatHermesValidationReport,\n writeHermesValidationReport,\n type HermesValidationReportFormat\n} from './hermes-validation-output.js';\nimport { runCodexImportOnce } from './codex-import-runner.js';\nimport { runHermesImportOnce } from './hermes-import-runner.js';\nimport {\n fetchExternalMarketContext,\n renderExternalMarketContextReport,\n type ExternalMarketProvider\n} from '../../core/external-market-context.js';\nimport {\n DEFAULT_EMBEDDING_FALLBACK_MODEL,\n DEFAULT_EMBEDDING_MODEL\n} from '../../extensions/vector/embedder.js';\n\n// ============================================================\n// Hook Installation Utilities\n// ============================================================\n\nconst CLAUDE_SETTINGS_PATH = path.join(os.homedir(), '.claude', 'settings.json');\n\ntype ClaudeSettings = ClaudeSettingsWithHooks;\n\nfunction getPluginPath(): string {\n // Try to find the dist directory\n const possiblePaths = [\n path.join(__dirname, '..'), // When running from dist/cli\n path.join(__dirname, '../..', 'dist'), // When running from src\n path.join(process.cwd(), 'dist'), // Current working directory\n ];\n\n for (const p of possiblePaths) {\n const hooksPath = path.join(p, 'hooks', 'user-prompt-submit.js');\n if (fs.existsSync(hooksPath)) {\n return p;\n }\n }\n\n // Fallback to npm global installation path\n return path.join(os.homedir(), '.npm-global', 'lib', 'node_modules', 'claude-memory-layer', 'dist');\n}\n\nfunction loadClaudeSettings(): ClaudeSettings {\n try {\n if (fs.existsSync(CLAUDE_SETTINGS_PATH)) {\n const content = fs.readFileSync(CLAUDE_SETTINGS_PATH, 'utf-8');\n return JSON.parse(content);\n }\n } catch (error) {\n console.error('Warning: Could not read existing settings:', error);\n }\n return {};\n}\n\nfunction saveClaudeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(CLAUDE_SETTINGS_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Atomic write\n const tempPath = CLAUDE_SETTINGS_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2));\n fs.renameSync(tempPath, CLAUDE_SETTINGS_PATH);\n}\n\ntype CodexValidateCommandOptions = {\n project?: string;\n sessionsDir?: string;\n limit?: string;\n format?: string;\n output?: string;\n dryRun?: boolean;\n anonymizeProjects?: boolean;\n};\n\ntype HermesValidateCommandOptions = {\n project?: string;\n stateDb?: string;\n limit?: string;\n format?: string;\n output?: string;\n dryRun?: boolean;\n};\n\ntype MarketContextCommandOptions = {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers?: string;\n fredSeries?: string;\n json?: boolean;\n snapshot?: boolean;\n};\n\nfunction parseCommaList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const selected = value.split(',').map((item) => item.trim()).filter(Boolean);\n return selected.length > 0 ? Array.from(new Set(selected)) : undefined;\n}\n\nfunction parseMarketProviders(value: string | undefined): ExternalMarketProvider[] | undefined {\n const entries = parseCommaList(value);\n if (!entries) return undefined;\n const allowed = new Set<ExternalMarketProvider>(['dart', 'fred', 'finnhub']);\n const selected: ExternalMarketProvider[] = [];\n for (const entry of entries) {\n const normalized = entry.toLowerCase() as ExternalMarketProvider;\n if (!allowed.has(normalized)) throw new Error('Invalid --providers: expected comma-separated dart,fred,finnhub');\n if (!selected.includes(normalized)) selected.push(normalized);\n }\n return selected;\n}\n\nfunction parsePositiveIntegerOption(value: string | undefined, optionName: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${optionName}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${optionName}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction parseCodexValidationReportFormat(value: string | undefined): CodexValidationReportFormat {\n const normalized = (value ?? 'markdown').toLowerCase();\n if (normalized !== 'json' && normalized !== 'markdown') {\n throw new Error('Invalid --format: expected json or markdown');\n }\n return normalized;\n}\n\nfunction parseHermesValidationReportFormat(value: string | undefined): HermesValidationReportFormat {\n const normalized = (value ?? 'markdown').toLowerCase();\n if (normalized !== 'json' && normalized !== 'markdown') {\n throw new Error('Invalid --format: expected json or markdown');\n }\n return normalized;\n}\n\nasync function runCodexValidationCommand(options: CodexValidateCommandOptions): Promise<void> {\n if (options.dryRun === false) {\n throw new Error('Codex validation is read-only; use explicit import commands for mutation');\n }\n\n const format = parseCodexValidationReportFormat(options.format);\n const report = await validateCodexSessions({\n sessionsDir: options.sessionsDir,\n projectPath: options.project,\n limit: parsePositiveIntegerOption(options.limit, 'limit'),\n anonymizeProjects: options.anonymizeProjects === true\n });\n\n const rendered = formatCodexValidationReport(report, format);\n process.stdout.write(rendered.endsWith('\\n') ? rendered : `${rendered}\\n`);\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n writeCodexValidationReport(outputPath, report, format);\n console.log(`\\nReport written to ${outputPath}`);\n }\n}\n\nasync function runHermesValidationCommand(options: HermesValidateCommandOptions): Promise<void> {\n if (options.dryRun === false) {\n throw new Error('Hermes validation is read-only; use explicit import commands for mutation');\n }\n\n const format = parseHermesValidationReportFormat(options.format);\n const report = await validateHermesSessions({\n stateDbPath: options.stateDb,\n projectPath: options.project,\n limit: parsePositiveIntegerOption(options.limit, 'limit')\n });\n\n const rendered = formatHermesValidationReport(report, format);\n process.stdout.write(rendered.endsWith('\\n') ? rendered : `${rendered}\\n`);\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n writeHermesValidationReport(outputPath, report, format);\n console.log(`\\nReport written to ${outputPath}`);\n }\n}\n\nasync function runMarketContextCommand(options: MarketContextCommandOptions): Promise<void> {\n const report = await fetchExternalMarketContext({\n company: options.company,\n dartCorpCode: options.dartCorpCode,\n symbol: options.symbol,\n providers: parseMarketProviders(options.providers),\n fredSeries: parseCommaList(options.fredSeries),\n includeSnapshot: options.snapshot !== false\n });\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderExternalMarketContextReport(report)}\\n`);\n }\n}\n\nconst program = new Command();\n\nprogram\n .name('claude-memory-layer')\n .description('Claude Code Memory Plugin CLI')\n .version(process.env.CLAUDE_MEMORY_LAYER_VERSION || '0.0.0');\n\nprogram\n .command('market-context')\n .description('Fetch read-only DART/FRED/Finnhub context with structured MarketContextSnapshot bull/bear/risk/catalyst analysis')\n .option('--company <name>', 'Company name for DART fallback search and report subject')\n .option('--dart-corp-code <code>', 'Exact DART corp_code for issuer-specific filings')\n .option('--symbol <ticker>', 'Listed ticker for Finnhub company profile')\n .option('--providers <list>', 'Comma-separated providers: dart,fred,finnhub')\n .option('--fred-series <list>', 'Comma-separated FRED series IDs')\n .option('--json', 'Print structured JSON including analysis.marketSnapshot')\n .option('--no-snapshot', 'Disable MarketContextSnapshot and DART company snapshot analysis')\n .action(async (options: MarketContextCommandOptions) => {\n try {\n await runMarketContextCommand(options);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// ============================================================\n// Install / Uninstall Commands\n// ============================================================\n\n/**\n * Install command - register hooks with Claude Code\n */\nprogram\n .command('install')\n .description('Install hooks into Claude Code settings')\n .option('--path <path>', 'Custom plugin path (defaults to auto-detect)')\n .action(async (options) => {\n try {\n const pluginPath = options.path || getPluginPath();\n\n // Verify hooks exist\n const missingHooks = REQUIRED_HOOK_FILES.filter((file) =>\n !fs.existsSync(path.join(pluginPath, 'hooks', file))\n );\n if (missingHooks.length > 0) {\n console.error(`\\n\u274C Hook files not found at: ${pluginPath}`);\n console.error(` Missing: ${missingHooks.join(', ')}`);\n console.error(' Make sure you have built the plugin with \"npm run build\"');\n process.exit(1);\n }\n\n // Load existing settings\n const settings = loadClaudeSettings();\n\n // Add hooks while preserving unrelated Claude Code hooks in the same categories.\n const nextSettings = mergePluginHooksIntoSettings(settings, pluginPath);\n\n // Save settings\n saveClaudeSettings(nextSettings);\n\n console.log('\\n\u2705 Claude Memory Layer installed!\\n');\n console.log('Hooks registered:');\n console.log(' - SessionStart: Register session -> project mapping');\n console.log(' - UserPromptSubmit: Memory retrieval on user input');\n console.log(' - PostToolUse: Store tool observations');\n console.log(' - Stop: Store assistant responses');\n console.log(' - SessionEnd: Persist session summary\\n');\n console.log('Plugin path:', pluginPath);\n console.log('\\n\u26A0\uFE0F Restart Claude Code for changes to take effect.\\n');\n console.log('Commands:');\n console.log(' claude-memory-layer dashboard - Open web dashboard');\n console.log(' claude-memory-layer search - Search memories');\n console.log(' claude-memory-layer stats - View statistics');\n console.log(' claude-memory-layer uninstall - Remove hooks\\n');\n } catch (error) {\n console.error('Install failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Uninstall command - remove hooks from Claude Code\n */\nprogram\n .command('uninstall')\n .description('Remove hooks from Claude Code settings')\n .action(async () => {\n try {\n // Load existing settings\n const settings = loadClaudeSettings();\n\n if (!settings.hooks) {\n console.log('\\n\uD83D\uDCCB No hooks installed.\\n');\n return;\n }\n\n const nextSettings = removePluginHooksFromSettings(settings, getPluginPath());\n\n // Save settings\n saveClaudeSettings(nextSettings);\n\n console.log('\\n\u2705 Claude Memory Layer uninstalled!\\n');\n console.log('Hooks removed from Claude Code settings.');\n console.log('Your memory data is preserved and can be accessed with:');\n console.log(' claude-memory-layer dashboard\\n');\n console.log('\u26A0\uFE0F Restart Claude Code for changes to take effect.\\n');\n } catch (error) {\n console.error('Uninstall failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Status command - check installation status\n */\nprogram\n .command('status')\n .description('Check plugin installation status')\n .action(async () => {\n try {\n const settings = loadClaudeSettings();\n const pluginPath = getPluginPath();\n\n console.log('\\n\uD83E\uDDE0 Claude Memory Layer Status\\n');\n\n // Check hooks\n const hasSessionStartHook = hasHook(settings, 'SessionStart', 'session-start');\n const hasUserPromptHook = hasHook(settings, 'UserPromptSubmit', 'user-prompt-submit');\n const hasPostToolHook = hasHook(settings, 'PostToolUse', 'post-tool-use');\n const hasStopHook = hasHook(settings, 'Stop', 'stop');\n const hasSessionEndHook = hasHook(settings, 'SessionEnd', 'session-end');\n\n console.log('Hooks:');\n console.log(` SessionStart: ${hasSessionStartHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` UserPromptSubmit: ${hasUserPromptHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` PostToolUse: ${hasPostToolHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` Stop: ${hasStopHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n console.log(` SessionEnd: ${hasSessionEndHook ? '\u2705 Installed' : '\u274C Not installed'}`);\n\n // Check plugin files\n const hooksExist = REQUIRED_HOOK_FILES\n .every((file) => fs.existsSync(path.join(pluginPath, 'hooks', file)));\n console.log(`\\nPlugin files: ${hooksExist ? '\u2705 Found' : '\u274C Not found'}`);\n console.log(` Path: ${pluginPath}`);\n\n // Check dashboard\n const dashboardRunning = await isServerRunning(37777);\n console.log(`\\nDashboard: ${dashboardRunning ? '\u2705 Running at http://localhost:37777' : '\u23F9\uFE0F Not running'}`);\n\n if (!hasSessionStartHook || !hasUserPromptHook || !hasPostToolHook || !hasStopHook || !hasSessionEndHook) {\n console.log('\\n\uD83D\uDCA1 Run \"claude-memory-layer install\" to set up hooks.\\n');\n } else {\n console.log('\\n\u2705 Plugin is fully installed and configured.\\n');\n }\n } catch (error) {\n console.error('Status check failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Search command\n */\nprogram\n .command('search <query>')\n .description('Search memories using semantic search')\n .option('-k, --top-k <number>', 'Number of results', '5')\n .option('-s, --min-score <number>', 'Minimum similarity score', '0.7')\n .option('--session <id>', 'Filter by session ID')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--disclosure', 'Use progressive search -> expand -> source output')\n .option('--include-shared', 'Include shared cross-project memory results')\n .option('--strategy <mode>', 'Retrieval strategy: auto, fast, or deep', 'auto')\n .action(async (query: string, options) => {\n const projectPath = options.project || process.cwd();\n const useLightweightRead = options.strategy === 'fast' && options.includeShared !== true;\n const service = useLightweightRead\n ? getLightweightMemoryServiceForProject(projectPath)\n : getMemoryServiceForProject(projectPath);\n\n try {\n if (options.disclosure) {\n const result = await service.searchDisclosure(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session,\n includeShared: options.includeShared === true,\n strategy: options.strategy\n });\n\n console.log(formatDisclosureSearch(result));\n return;\n }\n\n const result = await service.retrieveMemories(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session,\n includeShared: options.includeShared === true,\n strategy: options.strategy\n });\n\n console.log(formatPlainSearchResults(result));\n } catch (error) {\n console.error('Search failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * Expand command - progressive retrieval layer 2\n */\nprogram\n .command('expand <resultId>')\n .description('Expand a progressive retrieval result with surrounding context')\n .option('-w, --window-size <number>', 'Number of surrounding events on each side', '3')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (resultId: string, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const expansion = await service.expandDisclosure(resultId, {\n windowSize: parseInt(options.windowSize)\n });\n\n if (!expansion) {\n console.error(`Expansion target not found: ${resultId}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(formatDisclosureExpansion(expansion));\n } catch (error) {\n console.error('Expand failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * Source command - progressive retrieval layer 3\n */\nprogram\n .command('source <resultId>')\n .description('Show raw source details for a progressive retrieval result')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (resultId: string, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const source = await service.sourceDisclosure(resultId);\n\n if (!source) {\n console.error(`Source not found: ${resultId}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(formatDisclosureSource(source));\n } catch (error) {\n console.error('Source failed:', error);\n process.exitCode = 1;\n } finally {\n await service.shutdown();\n }\n });\n\n/**\n * History command\n */\nprogram\n .command('history')\n .description('View conversation history')\n .option('-l, --limit <number>', 'Number of events', '20')\n .option('--session <id>', 'Filter by session ID')\n .option('--type <type>', 'Filter by event type')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n let events;\n\n if (options.session) {\n events = await service.getSessionHistory(options.session);\n } else {\n events = await service.getRecentEvents(parseInt(options.limit));\n }\n\n if (options.type) {\n events = events.filter(e => e.eventType === options.type);\n }\n\n console.log('\\n\uD83D\uDCDC Memory History\\n');\n console.log(`Total events: ${events.length}\\n`);\n\n for (const event of events.slice(0, parseInt(options.limit))) {\n const date = event.timestamp.toISOString();\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' : '\uD83D\uDCDD';\n\n console.log(`${icon} [${date}] ${event.eventType}`);\n console.log(` Session: ${event.sessionId.slice(0, 8)}...`);\n console.log(` ${event.content.slice(0, 150)}${event.content.length > 150 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('History failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Stats command\n */\nprogram\n .command('stats')\n .description('View memory statistics')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getLightweightMemoryServiceForProject(projectPath);\n\n try {\n const stats = await service.getStats();\n\n console.log('\\n\uD83D\uDCCA Memory Statistics\\n');\n console.log(`Total Events: ${stats.totalEvents}`);\n console.log(`Vector Count: ${stats.vectorCount}`);\n console.log('\\nMemory Levels:');\n\n for (const level of stats.levelStats) {\n const bar = '\u2588'.repeat(Math.min(20, Math.ceil(level.count / 10)));\n console.log(` ${level.level}: ${bar} ${level.count}`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Stats failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Forget command\n */\nprogram\n .command('forget [eventId]')\n .description('Remove memories from storage')\n .option('--session <id>', 'Forget all events from a session')\n .option('--before <date>', 'Forget events before date (YYYY-MM-DD)')\n .option('--confirm', 'Skip confirmation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (eventId: string | undefined, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n if (!eventId && !options.session && !options.before) {\n console.error('Please specify an event ID, --session, or --before option');\n process.exit(1);\n }\n\n if (!options.confirm) {\n console.log('\u26A0\uFE0F This will remove memories from storage.');\n console.log('Add --confirm to proceed.');\n process.exit(0);\n }\n\n // Note: Full forget implementation would require additional EventStore methods\n console.log('\uD83D\uDDD1\uFE0F Forget functionality requires additional implementation.');\n console.log('Events are append-only; soft-delete markers would be added.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Forget failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Process command - manually process pending embeddings\n */\nprogram\n .command('process')\n .description('Process pending embeddings')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n console.log('\u23F3 Processing pending embeddings...');\n const count = await service.processPendingEmbeddings();\n console.log(`\u2705 Processed ${count} embeddings`);\n\n await service.shutdown();\n } catch (error) {\n console.error('Process failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Mongo Sync command - sync local SQLite events with a shared MongoDB database (optional)\n */\nprogram\n .command('mongo-sync')\n .description('Sync events with MongoDB for multi-server collaboration (optional)')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--mongo-uri <uri>', 'MongoDB connection URI (env: CLAUDE_MEMORY_MONGO_URI)')\n .option('--mongo-db <name>', 'MongoDB database name (env: CLAUDE_MEMORY_MONGO_DB)')\n .option('--mongo-project <key>', 'Remote project key (env: CLAUDE_MEMORY_MONGO_PROJECT, default: basename(projectPath))')\n .option('--direction <dir>', 'push|pull|both', 'both')\n .option('--batch-size <n>', 'Batch size', '500')\n .option('--interval <ms>', 'Watch interval ms', '30000')\n .option('--watch', 'Run continuously')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const mongoUri = options.mongoUri || process.env.CLAUDE_MEMORY_MONGO_URI;\n const mongoDb = options.mongoDb || process.env.CLAUDE_MEMORY_MONGO_DB;\n const projectKey = options.mongoProject || process.env.CLAUDE_MEMORY_MONGO_PROJECT || path.basename(projectPath);\n const direction = String(options.direction || 'both').toLowerCase() as MongoSyncDirection;\n\n if (!mongoUri || !mongoDb) {\n console.error('\\n\u274C MongoDB sync is not configured.');\n console.error(' Set --mongo-uri/--mongo-db or env CLAUDE_MEMORY_MONGO_URI/CLAUDE_MEMORY_MONGO_DB.\\n');\n process.exit(1);\n }\n\n if (!['push', 'pull', 'both'].includes(direction)) {\n console.error('\\n\u274C Invalid --direction. Use: push | pull | both\\n');\n process.exit(1);\n }\n\n const storagePath = getProjectStoragePath(projectPath);\n if (!fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const batchSizeParsed = parseInt(options.batchSize, 10);\n const intervalParsed = parseInt(options.interval, 10);\n const batchSize = (Number.isFinite(batchSizeParsed) && batchSizeParsed > 0) ? batchSizeParsed : 500;\n const intervalMs = (Number.isFinite(intervalParsed) && intervalParsed > 0) ? intervalParsed : 30000;\n\n const sqliteStore = new SQLiteEventStore(path.join(storagePath, 'events.sqlite'));\n const worker = new MongoSyncWorker(sqliteStore, {\n uri: mongoUri,\n dbName: mongoDb,\n projectKey,\n direction,\n batchSize,\n intervalMs\n });\n\n const runOnce = async () => {\n const { pushed, pulled } = await worker.syncNow();\n const ts = new Date().toISOString();\n process.stdout.write(`[mongo-sync] ${ts} project=${projectKey} pushed=${pushed} pulled=${pulled}\\n`);\n };\n\n try {\n if (!options.watch) {\n await runOnce();\n await worker.shutdown();\n sqliteStore.close();\n return;\n }\n\n console.log(`[mongo-sync] Watch mode started (interval=${intervalMs}ms, project=${projectKey})`);\n\n const handle = setInterval(() => {\n runOnce().catch((err) => {\n console.error('[mongo-sync] Sync failed:', err);\n });\n }, intervalMs);\n\n const shutdown = async () => {\n clearInterval(handle);\n console.log('\\n[mongo-sync] Shutting down...');\n try {\n await worker.shutdown();\n } finally {\n sqliteStore.close();\n }\n process.exit(0);\n };\n\n process.on('SIGINT', () => { void shutdown(); });\n process.on('SIGTERM', () => { void shutdown(); });\n\n // Run immediately, then keep alive\n await runOnce();\n await new Promise(() => {});\n } catch (error) {\n console.error('[mongo-sync] Failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Render import progress to terminal\n */\nfunction renderProgress(event: ProgressEvent): void {\n switch (event.phase) {\n case 'scan':\n console.log(` \uD83D\uDD0D ${event.message}`);\n break;\n case 'session-start': {\n const pct = Math.round(((event.sessionIndex) / event.totalSessions) * 100);\n const sessionName = path.basename(event.filePath, '.jsonl').slice(0, 8);\n process.stdout.write(\n `\\r \uD83D\uDCC4 [${event.sessionIndex + 1}/${event.totalSessions}] ${pct}% | Session ${sessionName}... `\n );\n break;\n }\n case 'session-progress': {\n process.stdout.write(\n `\\r \uD83D\uDCC4 [${event.sessionIndex + 1}/...] ${event.messagesProcessed} msgs | +${event.imported} imported, ~${event.skipped} skipped `\n );\n break;\n }\n case 'session-done': {\n const imported = event.importedPrompts + event.importedResponses;\n if (imported > 0) {\n process.stdout.write(\n `\\r \u2705 [${event.sessionIndex + 1}] +${event.importedPrompts} prompts, +${event.importedResponses} responses${event.skipped > 0 ? `, ~${event.skipped} skipped` : ''} \\n`\n );\n } else if (event.skipped > 0) {\n process.stdout.write(\n `\\r \u23ED\uFE0F [${event.sessionIndex + 1}] All ${event.skipped} already imported \\n`\n );\n } else {\n process.stdout.write(\n `\\r \u23ED\uFE0F [${event.sessionIndex + 1}] Empty session \\n`\n );\n }\n break;\n }\n case 'embedding':\n process.stdout.write(\n `\\r \uD83E\uDDE0 Embeddings: ${event.processed}/${event.total} processed `\n );\n if (event.processed >= event.total) {\n process.stdout.write('\\n');\n }\n break;\n case 'done':\n break;\n }\n}\n\nfunction printImportSummary(result: import('../../services/session-history-importer.js').ImportResult, embedCount: number): void {\n console.log('\\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510');\n console.log('\u2502 \u2705 Import Complete \u2502');\n console.log('\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524');\n console.log(`\u2502 Sessions processed: ${String(result.totalSessions).padStart(8)} \u2502`);\n console.log(`\u2502 Total messages: ${String(result.totalMessages).padStart(8)} \u2502`);\n console.log(`\u2502 Imported prompts: ${String(result.importedPrompts).padStart(8)} \u2502`);\n console.log(`\u2502 Imported responses: ${String(result.importedResponses).padStart(8)} \u2502`);\n console.log(`\u2502 Skipped duplicates: ${String(result.skippedDuplicates).padStart(8)} \u2502`);\n console.log(`\u2502 Embeddings queued: ${String(embedCount).padStart(8)} \u2502`);\n console.log('\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518');\n\n if (result.errors.length > 0) {\n console.log(`\\n\u26A0\uFE0F Errors (${result.errors.length}):`);\n for (const error of result.errors.slice(0, 5)) {\n console.log(` - ${error}`);\n }\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more`);\n }\n }\n}\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) stack.push(full);\n else if (e.isFile() && e.name.endsWith('.md') && e.name !== '_index.md') out.push(full);\n }\n }\n\n return out.sort();\n}\n\nfunction deriveNamespaceCategory(sourceRoot: string, filePath: string): { namespace: string; categoryPath: string[] } {\n const rel = path.relative(sourceRoot, filePath);\n const dirSeg = path.dirname(rel).split(path.sep).filter(Boolean);\n\n if (dirSeg.length >= 2) {\n const namespace = sanitizeSegment(dirSeg[0], 'default');\n const categoryPath = dirSeg.slice(1).map((s) => sanitizeSegment(s, 'uncategorized'));\n return { namespace, categoryPath: categoryPath.length > 0 ? categoryPath : ['uncategorized'] };\n }\n\n return { namespace: 'default', categoryPath: ['uncategorized'] };\n}\n\nfunction extractImportEvidence(markdown: string): { confidence?: string; sources: string[] } {\n const confidenceMatch = markdown.match(/^-\\s*confidence:\\s*([^\\n]+)/m);\n const sources = markdown\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.startsWith('- source:'))\n .map((line) => line.replace(/^-\\s*source:\\s*/i, '').trim())\n .filter(Boolean)\n .slice(0, 30);\n\n return {\n confidence: confidenceMatch ? confidenceMatch[1].trim() : undefined,\n sources\n };\n}\n\n/**\n * Organize-import command - import legacy markdown memories into structured mirror\n */\nprogram\n .command('organize-import [sourceDir]')\n .description('Import existing markdown memory files, or bootstrap knowledge docs from codebase/git when markdown is missing')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .option('--session <id>', 'Session id for imported events (default: import:organized)')\n .option('--limit <n>', 'Limit number of files to import')\n .option('--dry-run', 'Preview mapping without writing')\n .option('--bootstrap', 'Force-generate structured markdown from codebase + git history before import')\n .option('--bootstrap-if-empty', 'Auto-bootstrap when source has no markdown files (default: true)', true)\n .option('--no-bootstrap-if-empty', 'Disable auto-bootstrap when source has no markdown files')\n .option('--force-bootstrap', 'Run bootstrap even when markdown files exist')\n .option('--repo <path>', 'Repository root for bootstrap analysis (default: project path)')\n .option('--out <path>', 'Output directory for generated bootstrap markdown (default: <sourceDir>/bootstrap-kb)')\n .option('--since <range>', 'Git history range for bootstrap (default: \"180 days ago\")')\n .option('--max-commits <n>', 'Max commits to analyze for bootstrap (default: 1000)')\n .option('--incremental', 'Use previous bootstrap manifest as baseline for incremental updates (default: true)', true)\n .option('--no-incremental', 'Disable incremental bootstrap; regenerate full snapshot')\n .action(async (sourceDir: string | undefined, options) => {\n const projectPath = options.project || process.cwd();\n const sessionId = options.session || 'import:organized';\n const sourceRoot = path.resolve(sourceDir || options.out || projectPath);\n const repoPath = path.resolve(options.repo || projectPath);\n\n if (!fs.existsSync(sourceRoot)) {\n fs.mkdirSync(sourceRoot, { recursive: true });\n }\n\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n let activeSourceRoot = sourceRoot;\n let importRoot = sourceRoot;\n let files = await listMarkdownFiles(importRoot);\n const hasMarkdown = files.length > 0;\n const shouldBootstrap = Boolean(options.forceBootstrap || options.bootstrap || (!hasMarkdown && options.bootstrapIfEmpty));\n\n if (shouldBootstrap) {\n const outDir = path.resolve(options.out || path.join(sourceRoot, 'bootstrap-kb'));\n const since = options.since || '180 days ago';\n const maxCommits = options.maxCommits ? Math.max(1, parseInt(options.maxCommits, 10)) : 1000;\n\n console.log('\\n\uD83E\uDDE0 Bootstrapping markdown knowledge base...');\n const bootstrap = await bootstrapKnowledgeBase({\n repoPath,\n outDir,\n since,\n maxCommits,\n incremental: options.incremental\n });\n console.log(` Repo: ${repoPath}`);\n console.log(` Output: ${bootstrap.outDir}`);\n console.log(` Files analyzed: ${bootstrap.fileCount}`);\n console.log(` Commits analyzed: ${bootstrap.commitCount}`);\n console.log(` Modules: ${bootstrap.moduleCount}`);\n\n activeSourceRoot = outDir;\n importRoot = outDir;\n files = await listMarkdownFiles(importRoot);\n }\n\n if (files.length === 0) {\n console.error('\\n\u274C organize-import found no markdown files to import.\\n');\n process.exit(1);\n }\n\n const limit = options.limit ? Math.max(1, parseInt(options.limit, 10)) : files.length;\n const targets = files.slice(0, limit);\n\n console.log(`\\n\uD83D\uDCE6 organize-import`);\n console.log(` Source: ${activeSourceRoot}`);\n console.log(` Project: ${projectPath}`);\n console.log(` Files: ${targets.length}${targets.length < files.length ? `/${files.length}` : ''}`);\n console.log(` Dry-run: ${options.dryRun ? 'yes' : 'no'}\\n`);\n\n if (!options.dryRun) {\n await service.initialize();\n }\n\n let imported = 0;\n let skipped = 0;\n\n for (const file of targets) {\n const text = await fs.promises.readFile(file, 'utf8');\n if (!text.trim()) {\n skipped += 1;\n continue;\n }\n\n const { namespace, categoryPath } = deriveNamespaceCategory(activeSourceRoot, file);\n const rel = path.relative(activeSourceRoot, file);\n const evidence = extractImportEvidence(text);\n\n if (options.dryRun) {\n console.log(`- ${rel} -> namespace=${namespace} category=${categoryPath.join('/')} confidence=${evidence.confidence || 'n/a'} sources=${evidence.sources.length}`);\n continue;\n }\n\n await service.storeSessionSummary(sessionId, text, {\n namespace,\n categoryPath,\n confidence: evidence.confidence,\n sources: evidence.sources,\n import: {\n sourceFile: rel,\n importedAt: new Date().toISOString(),\n bootstrap: shouldBootstrap === true\n }\n });\n imported += 1;\n }\n\n if (!options.dryRun) {\n const embed = await service.processPendingEmbeddings();\n await service.shutdown();\n console.log(`\\n\u2705 Imported: ${imported}, skipped-empty: ${skipped}, embeddings: ${embed}\\n`);\n } else {\n console.log(`\\n\u2705 Dry-run complete (planned imports: ${targets.length - skipped}, skipped-empty: ${skipped})\\n`);\n }\n } catch (error) {\n console.error('\\n\u274C organize-import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Import command - import existing Claude Code sessions\n */\nprogram\n .command('import')\n .description('Import existing Claude Code conversation history')\n .option('-p, --project <path>', 'Import from specific project path')\n .option('-s, --session <file>', 'Import specific session file (JSONL)')\n .option('-a, --all', 'Import all sessions from all projects')\n .option('-l, --limit <number>', 'Limit messages per session')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Force reimport: delete existing events and reimport with turn_id grouping')\n .option('--embedding-model <name>', `Embedding model override (default: ${DEFAULT_EMBEDDING_MODEL}, or env CLAUDE_MEMORY_EMBEDDING_MODEL; fallback: ${DEFAULT_EMBEDDING_FALLBACK_MODEL} or env CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL)`)\n .option('-v, --verbose', 'Show detailed progress')\n .action(async (options) => {\n const startTime = Date.now();\n\n // Determine target project path for storage\n const targetProjectPath = options.project || process.cwd();\n\n if (options.embeddingModel) {\n process.env.CLAUDE_MEMORY_EMBEDDING_MODEL = options.embeddingModel;\n }\n\n // Use project-specific memory service\n const service = getMemoryServiceForProject(targetProjectPath);\n const importer = createSessionHistoryImporter(service);\n\n const importOpts = {\n limit: parsePositiveIntegerOption(options.limit, 'limit'),\n sessionLimit: parsePositiveIntegerOption(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: renderProgress\n };\n\n try {\n console.log('\\n\u23F3 Initializing memory service...');\n await service.initialize();\n console.log(` \u2705 Ready (embedder: ${service.getEmbeddingModelName()})\\n`);\n\n const migration = await service.ensureEmbeddingModelForImport({ autoMigrate: true });\n if (migration.changed) {\n console.log('\uD83D\uDD01 Embedding model migration detected/required');\n console.log(` Previous: ${migration.previousModel || 'legacy-unknown'}`);\n console.log(` Current: ${migration.currentModel}`);\n console.log(` Re-queued embeddings: ${migration.enqueued}`);\n console.log(' (Import will continue and process embeddings with the new model)\\n');\n }\n\n if (options.force) {\n console.log('\uD83D\uDD04 Force mode: existing events will be deleted and reimported with turn_id grouping\\n');\n }\n\n let result;\n\n if (options.session) {\n // Import specific session file\n console.log(`\uD83D\uDCE5 Importing session: ${options.session}`);\n console.log(` Target: ${targetProjectPath}\\n`);\n result = await importer.importSessionFile(options.session, {\n ...importOpts,\n projectPath: targetProjectPath,\n });\n } else if (options.project) {\n // Import all sessions from a project\n console.log(`\uD83D\uDCE5 Importing project: ${options.project}\\n`);\n result = await importer.importProject(options.project, importOpts);\n } else if (options.all) {\n // Import all sessions from all projects\n console.log('\uD83D\uDCE5 Importing all sessions from all projects');\n console.log(' \u26A0\uFE0F Using global storage (use -p for project-specific)\\n');\n const globalService = getDefaultMemoryService();\n const globalImporter = createSessionHistoryImporter(globalService);\n await globalService.initialize();\n console.log(` \u2705 Global service ready (embedder: ${globalService.getEmbeddingModelName()})`);\n const globalMigration = await globalService.ensureEmbeddingModelForImport({ autoMigrate: true });\n if (globalMigration.changed) {\n console.log('\uD83D\uDD01 Global embedding migration detected');\n console.log(` Previous: ${globalMigration.previousModel || 'legacy-unknown'}`);\n console.log(` Current: ${globalMigration.currentModel}`);\n console.log(` Re-queued embeddings: ${globalMigration.enqueued}`);\n }\n result = await globalImporter.importAll(importOpts);\n\n // Process embeddings\n console.log('\\n\uD83E\uDDE0 Processing embeddings...');\n const embedCount = await globalService.processPendingEmbeddings();\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n printImportSummary(result, embedCount);\n console.log(`\\n\u23F1\uFE0F Completed in ${elapsed}s`);\n\n await globalService.shutdown();\n return;\n } else {\n // Default: import current project\n const cwd = process.cwd();\n console.log(`\uD83D\uDCE5 Importing sessions for: ${cwd}\\n`);\n result = await importer.importProject(cwd, {\n ...importOpts,\n projectPath: cwd,\n });\n }\n\n // Process embeddings\n console.log('\\n\uD83E\uDDE0 Processing embeddings...');\n const embedCount = await service.processPendingEmbeddings();\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n printImportSummary(result, embedCount);\n console.log(`\\n\u23F1\uFE0F Completed in ${elapsed}s`);\n\n await service.shutdown();\n } catch (error) {\n console.error('\\n\u274C Import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * List command - list available sessions for import\n */\nprogram\n .command('list')\n .description('List available Claude Code sessions')\n .option('-p, --project <path>', 'Filter by project path')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n const importer = createSessionHistoryImporter(service);\n\n try {\n const sessions = await importer.listAvailableSessions(options.project);\n\n console.log('\\n\uD83D\uDCCB Available Sessions\\n');\n console.log(`Found ${sessions.length} session(s)\\n`);\n\n for (const session of sessions.slice(0, 20)) {\n const date = session.modifiedAt.toISOString().split('T')[0];\n const sizeKB = (session.size / 1024).toFixed(1);\n console.log(`\uD83D\uDCDD ${session.sessionId.slice(0, 16)}...`);\n console.log(` Modified: ${date}`);\n console.log(` Size: ${sizeKB} KB`);\n console.log(` Path: ${session.filePath}`);\n console.log('');\n }\n\n if (sessions.length > 20) {\n console.log(`... and ${sessions.length - 20} more sessions`);\n }\n\n console.log('\\nUse \"claude-memory-layer import --session <path>\" to import a specific session');\n } catch (error) {\n console.error('List failed:', error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Codex Validation Commands\n// ============================================================\n\nconst codexCmd = program\n .command('codex')\n .description('Read-only Codex session scan/replay validation');\n\ncodexCmd\n .command('validate')\n .description('Dry-run validate Codex JSONL sessions without importing or mutating memory')\n .option('-p, --project <path>', 'Filter sessions by session_meta.payload.cwd')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit number of session files to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .option('--anonymize-projects', 'Show hashed project labels instead of raw cwd paths')\n .action(async (options: CodexValidateCommandOptions) => {\n try {\n await runCodexValidationCommand(options);\n } catch (error) {\n console.error('Codex validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\ncodexCmd\n .command('replay')\n .description('Alias for read-only Codex validation/replay report')\n .option('-p, --project <path>', 'Filter sessions by session_meta.payload.cwd')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit number of session files to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .option('--anonymize-projects', 'Show hashed project labels instead of raw cwd paths')\n .action(async (options: CodexValidateCommandOptions) => {\n try {\n await runCodexValidationCommand(options);\n } catch (error) {\n console.error('Codex replay failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\ncodexCmd\n .command('import')\n .description('Explicitly import Codex JSONL sessions into claude-memory-layer memory (mutates memory)')\n .option('-p, --project <path>', 'Import sessions whose session_meta.payload.cwd matches this project (default: cwd)')\n .option('-s, --session <file>', 'Import one Codex session JSONL file')\n .option('-a, --all', 'Import all Codex sessions into global memory unless --project is supplied')\n .option('--sessions-dir <path>', 'Codex sessions directory (default: ~/.codex/sessions)')\n .option('-l, --limit <number>', 'Limit memories imported across selected matching sessions')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Delete existing events for each imported session before reimporting')\n .option('-v, --verbose', 'Show detailed progress')\n .option('--no-process-embeddings', 'Skip processing pending embeddings after import')\n .action(async (options) => {\n const startTime = Date.now();\n try {\n if (options.all && !options.project && !options.session) {\n console.log('\\n\uD83D\uDCE5 Importing all Codex sessions into global memory');\n console.log(' \u26A0\uFE0F Use --project to keep memory scoped to one project.\\n');\n } else {\n console.log(`\\n\uD83D\uDCE5 Importing Codex sessions for: ${options.project || process.cwd()}\\n`);\n }\n\n const outcome = await runCodexImportOnce(options, {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createCodexSessionHistoryImporter,\n onProgress: renderProgress\n });\n\n printImportSummary(outcome.result, outcome.embedCount);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(`\\n\u23F1\uFE0F Codex import completed in ${elapsed}s (${outcome.mode}, ${outcome.storageScope} storage)`);\n } catch (error) {\n console.error('Codex import failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Hermes Validation Commands\n// ============================================================\n\nconst hermesCmd = program\n .command('hermes')\n .description('Read-only Hermes SessionDB scan/replay validation and explicit import');\n\nhermesCmd\n .command('validate')\n .description('Dry-run validate Hermes ~/.hermes/state.db sessions without importing or mutating memory')\n .option('-p, --project <path>', 'Filter sessions by project path in Hermes session context')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit number of matching sessions to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .action(async (options: HermesValidateCommandOptions) => {\n try {\n await runHermesValidationCommand(options);\n } catch (error) {\n console.error('Hermes validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nhermesCmd\n .command('replay')\n .description('Alias for read-only Hermes SessionDB validation/replay report')\n .option('-p, --project <path>', 'Filter sessions by project path in Hermes session context')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit number of matching sessions to scan')\n .option('--format <format>', 'Report format: json or markdown', 'markdown')\n .option('-o, --output <path>', 'Write report to file')\n .option('--dry-run', 'Read-only validation mode (default; no imports or writes)', true)\n .action(async (options: HermesValidateCommandOptions) => {\n try {\n await runHermesValidationCommand(options);\n } catch (error) {\n console.error('Hermes replay failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nhermesCmd\n .command('import')\n .description('Explicitly import Hermes SessionDB sessions into claude-memory-layer memory (mutates memory)')\n .option('-p, --project <path>', 'Import sessions whose Hermes context matches this project (default: cwd)')\n .option('-s, --session <id>', 'Import one Hermes session id')\n .option('-a, --all', 'Import all Hermes sessions into global memory unless --project is supplied')\n .option('--state-db <path>', 'Hermes state database path (default: ~/.hermes/state.db)')\n .option('-l, --limit <number>', 'Limit messages imported per selected Hermes session')\n .option('--session-limit <number>', 'Limit recent matching sessions to import')\n .option('-f, --force', 'Delete existing events for each imported session before reimporting')\n .option('-v, --verbose', 'Show detailed progress')\n .option('--no-process-embeddings', 'Skip processing pending embeddings after import')\n .action(async (options) => {\n const startTime = Date.now();\n try {\n if (options.all && !options.project && !options.session) {\n console.log('\\n\uD83D\uDCE5 Importing all Hermes sessions into global memory');\n console.log(' \u26A0\uFE0F Use --project to keep memory scoped to one project.\\n');\n } else {\n console.log(`\\n\uD83D\uDCE5 Importing Hermes sessions for: ${options.project || process.cwd()}\\n`);\n }\n\n const outcome = await runHermesImportOnce(options, {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createHermesSessionHistoryImporter,\n onProgress: renderProgress\n });\n\n printImportSummary(outcome.result, outcome.embedCount);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(`\\n\u23F1\uFE0F Hermes import completed in ${elapsed}s (${outcome.mode}, ${outcome.storageScope} storage)`);\n } catch (error) {\n console.error('Hermes import failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Endless Mode Commands\n// ============================================================\n\n/**\n * Endless Mode parent command\n */\nconst endlessCmd = program\n .command('endless')\n .description('Manage Endless Mode (biomimetic continuous memory)');\n\n/**\n * Enable Endless Mode\n */\nendlessCmd\n .command('enable')\n .description('Enable Endless Mode')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('endless');\n\n console.log('\\n\u267E\uFE0F Endless Mode Enabled\\n');\n console.log('Your conversations will now be continuously integrated');\n console.log('across session boundaries.\\n');\n console.log('Features:');\n console.log(' - Working Set: Recent context kept active');\n console.log(' - Consolidation: Automatic memory integration');\n console.log(' - Continuity: Seamless context transitions\\n');\n console.log('Use \"claude-memory-layer endless status\" to view current state');\n\n await service.shutdown();\n } catch (error) {\n console.error('Enable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Disable Endless Mode\n */\nendlessCmd\n .command('disable')\n .description('Disable Endless Mode (return to Session Mode)')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('session');\n\n console.log('\\n\uD83D\uDCCB Session Mode Enabled\\n');\n console.log('Returned to traditional session-based memory.');\n console.log('Existing Endless Mode data is preserved for future use.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Disable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Endless Mode Status\n */\nendlessCmd\n .command('status')\n .description('Show Endless Mode status')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n const status = await service.getEndlessModeStatus();\n\n const modeIcon = status.mode === 'endless' ? '\u267E\uFE0F' : '\uD83D\uDCCB';\n const modeName = status.mode === 'endless' ? 'Endless Mode' : 'Session Mode';\n\n console.log(`\\n${modeIcon} ${modeName}\\n`);\n\n if (status.mode === 'endless') {\n // Continuity score bar\n const continuityBars = '\u2588'.repeat(Math.round(status.continuityScore * 10));\n const continuityEmpty = '\u2591'.repeat(10 - Math.round(status.continuityScore * 10));\n\n console.log('\uD83D\uDCCA Status:');\n console.log(` Working Set: ${status.workingSetSize} events`);\n console.log(` Continuity: [${continuityBars}${continuityEmpty}] ${(status.continuityScore * 100).toFixed(0)}%`);\n console.log(` Consolidated: ${status.consolidatedCount} memories`);\n\n if (status.lastConsolidation) {\n const ago = Math.round((Date.now() - status.lastConsolidation.getTime()) / 60000);\n console.log(` Last Consolidation: ${ago} minutes ago`);\n } else {\n console.log(' Last Consolidation: Never');\n }\n } else {\n console.log('Endless Mode is disabled.');\n console.log('Use \"claude-memory-layer endless enable\" to activate.');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Status failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidate command - manually trigger consolidation\n */\nendlessCmd\n .command('consolidate')\n .description('Manually trigger memory consolidation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"claude-memory-layer endless enable\" first');\n process.exit(1);\n }\n\n console.log('\\n\u23F3 Running memory consolidation...');\n const count = await service.forceConsolidation();\n\n if (count > 0) {\n console.log(`\\n\u2705 Consolidated ${count} memory group(s)`);\n } else {\n console.log('\\n\uD83D\uDCCB No memories to consolidate');\n console.log('(Working set may not have enough events yet)');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Consolidation failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Working Set command - view current working set\n */\nendlessCmd\n .command('working-set')\n .alias('ws')\n .description('View current working set')\n .option('-l, --limit <number>', 'Number of events to show', '10')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"claude-memory-layer endless enable\" first');\n process.exit(1);\n }\n\n const workingSet = await service.getWorkingSet();\n\n if (!workingSet || workingSet.recentEvents.length === 0) {\n console.log('\\n\uD83D\uDCCB Working Set is empty');\n console.log('Events will be added as you interact with Claude');\n process.exit(0);\n }\n\n console.log('\\n\uD83E\uDDE0 Working Set\\n');\n console.log(`Total events: ${workingSet.recentEvents.length}`);\n console.log(`Continuity score: ${(workingSet.continuityScore * 100).toFixed(0)}%`);\n console.log(`Last activity: ${workingSet.lastActivity.toISOString()}\\n`);\n\n const limit = parseInt(options.limit);\n const events = workingSet.recentEvents.slice(0, limit);\n\n for (const event of events) {\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' :\n event.eventType === 'tool_observation' ? '\uD83D\uDD27' : '\uD83D\uDCDD';\n const time = event.timestamp.toLocaleTimeString();\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n\n console.log(`${icon} [${time}] ${event.eventType}`);\n console.log(` ${preview}`);\n console.log('');\n }\n\n if (workingSet.recentEvents.length > limit) {\n console.log(`... and ${workingSet.recentEvents.length - limit} more events`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Working set failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidated memories command\n */\nendlessCmd\n .command('memories')\n .description('View consolidated memories')\n .option('-l, --limit <number>', 'Number of memories to show', '10')\n .option('-q, --query <text>', 'Search consolidated memories')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n let memories;\n\n if (options.query) {\n memories = await service.searchConsolidated(options.query, {\n topK: parseInt(options.limit)\n });\n console.log(`\\n\uD83D\uDD0D Searching for: \"${options.query}\"\\n`);\n } else {\n memories = await service.getConsolidatedMemories(parseInt(options.limit));\n console.log('\\n\uD83D\uDCBE Consolidated Memories\\n');\n }\n\n if (memories.length === 0) {\n console.log('No consolidated memories found.');\n if (!service.isEndlessModeActive()) {\n console.log('Enable Endless Mode to start consolidating memories.');\n }\n process.exit(0);\n }\n\n console.log(`Showing ${memories.length} memory(ies)\\n`);\n\n for (const memory of memories) {\n const date = memory.createdAt.toISOString().split('T')[0];\n const confidenceBars = '\u2588'.repeat(Math.round(memory.confidence * 5));\n\n console.log(`\uD83D\uDCDA ${memory.topics.slice(0, 3).join(', ')}`);\n console.log(` Created: ${date}`);\n console.log(` Confidence: [${confidenceBars}] ${(memory.confidence * 100).toFixed(0)}%`);\n console.log(` Sources: ${memory.sourceEvents.length} events`);\n console.log(` Access count: ${memory.accessCount}`);\n console.log(` Summary: ${memory.summary.slice(0, 200)}${memory.summary.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Memories failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * MCP command - configure Claude Desktop MCP integration\n */\nconst mcpCmd = program\n .command('mcp')\n .description('Manage MCP Desktop integration');\n\nmcpCmd\n .command('install')\n .description('Install claude-memory-layer MCP server into Claude Desktop config')\n .option('-c, --config-path <path>', 'Claude Desktop config path')\n .option('-n, --server-name <name>', 'MCP server name', 'claude-memory-layer')\n .option('--command <command>', 'MCP server command', 'claude-memory-layer-mcp')\n .option('--arg <arg...>', 'Arguments for the MCP server command')\n .option('--dry-run', 'Print the updated config without writing it')\n .action((options: { configPath?: string; serverName: string; command: string; arg?: string[]; dryRun?: boolean }) => {\n try {\n const { configPath, config } = installMcpServer({\n configPath: options.configPath,\n serverName: options.serverName,\n command: options.command,\n args: options.arg ?? [],\n dryRun: options.dryRun ?? false\n });\n\n if (options.dryRun) {\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\nDry run only. No changes written to ${configPath}`);\n return;\n }\n\n console.log(`\\n\u2705 Installed MCP server '${options.serverName}' into Claude Desktop config.`);\n console.log(` Config: ${configPath}`);\n console.log(' Restart Claude Desktop to load the new MCP server.\\n');\n } catch (error) {\n console.error('MCP install failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Dashboard command - start web dashboard\n */\nprogram\n .command('dashboard')\n .description('Open memory dashboard in browser')\n .option('-p, --port <port>', 'Server port', '37777')\n .option('--no-open', 'Do not auto-open browser')\n .action(async (options) => {\n const port = parseInt(options.port, 10);\n\n try {\n // Check if server is already running\n const running = await isServerRunning(port);\n if (running) {\n console.log(`\\n\uD83E\uDDE0 Dashboard already running at http://localhost:${port}\\n`);\n if (options.open) {\n openBrowser(`http://localhost:${port}`);\n }\n return;\n }\n\n // Start the server\n console.log('\\n\uD83E\uDDE0 Starting Code Memory Dashboard...\\n');\n startServer(port);\n\n // Open browser\n if (options.open) {\n setTimeout(() => {\n openBrowser(`http://localhost:${port}`);\n }, 500);\n }\n\n console.log(`\\n\uD83D\uDCCA Dashboard: http://localhost:${port}`);\n console.log('Press Ctrl+C to stop the server\\n');\n\n // Handle graceful shutdown\n const shutdown = () => {\n console.log('\\n\\n\uD83D\uDC4B Shutting down dashboard...');\n stopServer();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n console.error('Dashboard failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Open URL in default browser\n */\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = `open \"${url}\"`;\n } else if (platform === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`\\n\u26A0\uFE0F Could not open browser automatically.`);\n console.log(` Please open ${url} manually.\\n`);\n }\n });\n}\n\nprogram.parse();\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as os from 'os';\n\nimport type { RetrievalResult, UnifiedRetrievalResult } from '../core/retriever.js';\nimport type { PromotionResult } from '../core/shared-promoter.js';\nimport type { SharedMemoryServices } from '../extensions/shared-memory/index.js';\nimport type {\n AppendResult,\n MemoryEvent,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContinuityScore,\n SharedStoreConfig,\n Entry\n} from '../core/types.js';\nimport type { EndlessMemoryServices } from '../extensions/endless-memory/index.js';\nimport {\n type EmbeddingMaintenanceService,\n type EmbeddingModelMaintenanceOptions,\n type EmbeddingModelMaintenanceResult\n} from '../core/engine/embedding-maintenance-service.js';\nimport type { MemoryRuntimeService } from '../core/engine/memory-runtime-service.js';\nimport type { GraduationRunResult } from '../core/graduation-worker.js';\nimport type { IngestInterceptor } from '../core/ingest-interceptor.js';\nimport type { MemoryIngestService } from '../core/engine/memory-ingest-service.js';\nimport type { MemoryQueryService } from '../core/engine/memory-query-service.js';\nimport { createMemoryServiceComposition } from '../core/engine/memory-service-composition.js';\nimport {\n getProjectStoragePath as defaultGetProjectStoragePath,\n hashProjectPath as defaultHashProjectPath\n} from '../core/registry/project-path.js';\nimport { getSessionProject as defaultGetSessionProject } from '../core/registry/session-registry.js';\nimport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\nimport { createMemoryServiceRegistry } from './memory-service-registry.js';\nimport {\n type AccessedMemory,\n type HelpfulMemory,\n type HelpfulnessStats,\n type RecordQueryTraceInput,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureExpansion,\n type RetrievalDisclosureExpandOptions,\n type RetrievalDisclosureSearchOptions,\n type RetrievalDisclosureSearchResponse,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSource,\n type RetrievalOrchestrator,\n type RetrievalTrace,\n type RetrievalTraceStats,\n type RetrieveMemoriesOptions\n} from '../core/engine/retrieval-services.js';\nexport { getProjectStoragePath, hashProjectPath } from '../core/registry/project-path.js';\nexport {\n getSessionProject,\n registerSession,\n type SessionRegistry,\n type SessionRegistryEntry,\n loadSessionRegistry\n} from '../core/registry/session-registry.js';\n\nexport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\n\nexport class MemoryService {\n private readonly retrievalOrchestrator: RetrievalOrchestrator;\n private readonly retrievalDisclosureService: RetrievalDisclosureService;\n private readonly retrievalAnalyticsService: RetrievalAnalyticsService;\n private readonly embeddingMaintenanceService: EmbeddingMaintenanceService;\n private readonly runtimeService: MemoryRuntimeService;\n\n // Endless Mode components\n private readonly endlessMemoryServices: EndlessMemoryServices;\n\n // Shared Store components (cross-project knowledge)\n private sharedMemoryServices!: SharedMemoryServices;\n private projectHash: string | null = null;\n private projectPath: string | null = null;\n\n private readonly readOnly: boolean;\n private readonly lightweightMode: boolean;\n private readonly embeddingOnly: boolean;\n private readonly ingestService: MemoryIngestService;\n private readonly queryService: MemoryQueryService;\n\n constructor(config: MemoryServiceConfig & { projectHash?: string; projectPath?: string; sharedStoreConfig?: SharedStoreConfig }) {\n this.readOnly = config.readOnly ?? false;\n this.lightweightMode = config.lightweightMode ?? false;\n this.embeddingOnly = config.embeddingOnly ?? false;\n\n // Store project hash for shared store operations\n this.projectHash = config.projectHash || null;\n this.projectPath = config.projectPath || null;\n const sharedStoreConfig = config.sharedStoreConfig ?? DEFAULT_ENABLED_SHARED_STORE_CONFIG;\n\n const composition = createMemoryServiceComposition({\n config: {\n ...config,\n storagePath: config.storagePath,\n readOnly: this.readOnly,\n lightweightMode: this.lightweightMode,\n embeddingOnly: this.embeddingOnly,\n sharedStoreConfig\n },\n defaultSharedStoragePath: DEFAULT_SHARED_STORAGE_PATH,\n defaultSharedStoreConfig: DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n initialize: () => this.initialize(),\n getProjectHash: () => this.projectHash,\n getProjectPath: () => this.projectPath\n });\n\n this.retrievalOrchestrator = composition.retrievalOrchestrator;\n this.retrievalDisclosureService = composition.retrievalDisclosureService;\n this.retrievalAnalyticsService = composition.retrievalAnalyticsService;\n this.ingestService = composition.ingestService;\n this.queryService = composition.queryService;\n this.endlessMemoryServices = composition.endlessMemoryServices;\n this.sharedMemoryServices = composition.sharedMemoryServices;\n this.runtimeService = composition.runtimeService;\n this.embeddingMaintenanceService = composition.embeddingMaintenanceService;\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n await this.runtimeService.initialize();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestOnError(interceptor);\n }\n\n /**\n * Start a new session\n */\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n return this.ingestService.startSession(sessionId, projectPath);\n }\n\n /**\n * End a session\n */\n async endSession(sessionId: string, summary?: string): Promise<void> {\n return this.ingestService.endSession(sessionId, summary);\n }\n\n /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeUserPrompt(sessionId, content, metadata);\n }\n\n /**\n * Store an agent response\n */\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeAgentResponse(sessionId, content, metadata);\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeSessionSummary(sessionId, summary, metadata);\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n return this.ingestService.backfillMissingSummaries(currentSessionId, limit);\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Called at session end (Stop hook) when no LLM-generated summary exists.\n * Skips if a summary already exists for this session.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n return this.ingestService.generateSessionSummary(sessionId);\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n return this.ingestService.storeToolObservation(sessionId, payload);\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n return this.retrievalOrchestrator.retrieveMemories(query, options);\n }\n\n /**\n * Layer 1 retrieval disclosure: lightweight search envelopes for UI/API/agent use.\n */\n async searchDisclosure(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n return this.retrievalDisclosureService.search(query, options);\n }\n\n /**\n * Layer 2 retrieval disclosure: expand a search result into surrounding timeline context.\n */\n async expandDisclosure(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n return this.retrievalDisclosureService.expand(resultId, options);\n }\n\n /**\n * Layer 3 retrieval disclosure: resolve a search result to its raw source event.\n */\n async sourceDisclosure(resultId: string): Promise<RetrievalDisclosureSource | null> {\n return this.retrievalDisclosureService.source(resultId);\n }\n\n /**\n * Fast keyword search using SQLite FTS5\n * Much faster than vector search - no embedding model needed\n */\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{event: MemoryEvent; score: number}>> {\n return this.queryService.keywordSearch(query, options);\n }\n\n /**\n * Rebuild FTS index (call after database upgrade)\n */\n async rebuildFtsIndex(): Promise<number> {\n return this.queryService.rebuildFtsIndex();\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n return this.queryService.getSessionHistory(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n return this.queryService.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n\n async getOutboxStats(): Promise<{\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n }> {\n return this.queryService.getOutboxStats();\n }\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n return this.retrievalAnalyticsService.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n return this.retrievalAnalyticsService.getRecentRetrievalTraces(limit);\n }\n\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n return this.queryService.getStats();\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n return this.runtimeService.processPendingEmbeddings();\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByLevel(level, options);\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n return this.queryService.getEventLevel(eventId);\n }\n\n /**\n * Format retrieval results as context for Claude\n */\n formatAsContext(result: RetrievalResult): string {\n return this.retrievalOrchestrator.formatAsContext(result);\n }\n\n // ============================================================\n // Shared Store Methods (Cross-Project Knowledge)\n // ============================================================\n\n /**\n * Check if shared store is enabled and initialized\n */\n isSharedStoreEnabled(): boolean {\n return this.sharedMemoryServices.isEnabled();\n }\n\n /**\n * Promote an entry to shared storage\n */\n async promoteToShared(entry: Entry): Promise<PromotionResult> {\n return this.sharedMemoryServices.promoteToShared(entry, this.projectHash);\n }\n\n /**\n * Get shared store statistics\n */\n async getSharedStoreStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n } | null> {\n return this.sharedMemoryServices.getStats();\n }\n\n /**\n * Search shared troubleshooting entries\n */\n async searchShared(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ) {\n return this.sharedMemoryServices.search(query, options);\n }\n\n /**\n * Get project hash for this service\n */\n getProjectHash(): string | null {\n return this.projectHash;\n }\n\n // ============================================================\n // Endless Mode Methods\n // ============================================================\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n return this.endlessMemoryServices.initializeEndlessMode();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n return this.endlessMemoryServices.getEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n return this.endlessMemoryServices.setEndlessConfig(config);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n return this.endlessMemoryServices.setMode(mode);\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMemoryServices.getMode();\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMemoryServices.isEndlessModeActive();\n }\n\n /**\n * Add event to Working Set (Endless Mode)\n */\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n return this.endlessMemoryServices.addToWorkingSet(eventId, relevanceScore);\n }\n\n /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n return this.endlessMemoryServices.getWorkingSet();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.searchConsolidated(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.getConsolidatedMemories(limit);\n }\n\n /**\n * Increment access count for memories that were used in prompts\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n return this.retrievalOrchestrator.incrementMemoryAccess(eventIds);\n }\n\n /**\n * Get most accessed memories from events\n */\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n return this.retrievalAnalyticsService.getMostAccessedMemories(limit);\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n return this.retrievalOrchestrator.recordRetrieval(eventId, sessionId, score, query);\n }\n\n /**\n * Record a query-level retrieval trace (used by user-prompt-submit hook).\n * Feeds the retrieval_traces table that powers dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n return this.retrievalOrchestrator.recordQueryTrace(input);\n }\n\n /**\n * Evaluate helpfulness of retrievals in a session (called at session end)\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluateSessionHelpfulness(sessionId);\n }\n\n /**\n * Backfill helpfulness evaluation for sessions that ended without Stop hook.\n * Call on first turn of a new session to catch missed evaluations.\n */\n async evaluatePendingSessions(currentSessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluatePendingSessions(currentSessionId);\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n return this.retrievalAnalyticsService.getHelpfulMemories(limit);\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(): Promise<HelpfulnessStats> {\n return this.retrievalAnalyticsService.getHelpfulnessStats();\n }\n\n /**\n * Mark a consolidated memory as accessed\n */\n async markMemoryAccessed(memoryId: string): Promise<void> {\n return this.endlessMemoryServices.markMemoryAccessed(memoryId);\n }\n\n /**\n * Calculate continuity score for current context\n */\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n return this.endlessMemoryServices.calculateContinuity(content, metadata);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n this.endlessMemoryServices.recordActivity();\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n return this.endlessMemoryServices.forceConsolidation();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n return this.endlessMemoryServices.getEndlessModeStatus();\n }\n\n // ============================================================\n // Turn Grouping Methods\n // ============================================================\n\n /**\n * Get events grouped by turn for a session\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n return this.queryService.getSessionTurns(sessionId, options);\n }\n\n /**\n * Get all events for a specific turn\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByTurn(turnId);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n return this.queryService.countSessionTurns(sessionId);\n }\n\n /**\n * Backfill turn_ids from metadata for events stored before the migration\n */\n async backfillTurnIds(): Promise<number> {\n return this.queryService.backfillTurnIds();\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n return this.queryService.deleteSessionEvents(sessionId);\n }\n\n /**\n * Format Endless Mode context for Claude\n */\n async formatEndlessContext(query: string): Promise<string> {\n return this.endlessMemoryServices.formatEndlessContext(query);\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceGraduation(): Promise<GraduationRunResult> {\n return this.runtimeService.forceGraduation();\n }\n\n /**\n * Record access to a memory event (for graduation scoring)\n */\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n this.runtimeService.recordMemoryAccess(eventId, sessionId, confidence);\n }\n\n getEmbeddingModelName(): string {\n return this.embeddingMaintenanceService.getEmbeddingModelName();\n }\n\n /**\n * Ensure embedding model metadata is in sync and optionally migrate vectors.\n * Migration strategy: clear vector index + clear embedding outbox + re-enqueue all events.\n */\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n return this.embeddingMaintenanceService.ensureEmbeddingModelForImport(options);\n }\n\n /**\n * Backward-compatible alias used by some hooks\n */\n async close(): Promise<void> {\n await this.shutdown();\n }\n\n /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n await this.runtimeService.shutdown();\n }\n}\n\nconst defaultRegistry = createMemoryServiceRegistry<MemoryService>({\n createService: (config) => new MemoryService(config),\n hashProjectPath: defaultHashProjectPath,\n getProjectStoragePath: defaultGetProjectStoragePath,\n getSessionProject: defaultGetSessionProject,\n homedir: os.homedir,\n disabledSharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n});\n\nexport const getDefaultMemoryService = defaultRegistry.getDefaultMemoryService;\nexport const getReadOnlyMemoryService = defaultRegistry.getReadOnlyMemoryService;\nexport const getMemoryServiceForProject = defaultRegistry.getMemoryServiceForProject;\nexport const getMemoryServiceForSession = defaultRegistry.getMemoryServiceForSession;\nexport const getLightweightMemoryService = defaultRegistry.getLightweightMemoryService;\nexport const getLightweightMemoryServiceForProject = defaultRegistry.getLightweightMemoryServiceForProject;\nexport const createMemoryService = defaultRegistry.createMemoryService;\n", "/**\n * Memory Service Composition\n *\n * Owns constructor-time service graph wiring for MemoryService so the public\n * facade can stay focused on state assignment and method delegation.\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport { createToolObservationEmbedding as defaultCreateToolObservationEmbedding } from '../metadata-extractor.js';\nimport type { Retriever } from '../retriever.js';\nimport type { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload, SharedStoreConfig } from '../types.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createEmbeddingMaintenanceService as defaultCreateEmbeddingMaintenanceService,\n type EmbeddingMaintenanceService,\n type EmbeddingMaintenanceServiceOptions\n} from './embedding-maintenance-service.js';\nimport {\n createEndlessMemoryServices as defaultCreateEndlessMemoryServices,\n type EndlessMemoryServices,\n type EndlessMemoryServicesOptions\n} from './endless-memory-services.js';\nimport {\n createMemoryEngineServices as defaultCreateMemoryEngineServices,\n type MemoryEngineServices,\n type MemoryEngineServicesOptions\n} from './memory-engine-services.js';\nimport {\n createMemoryRuntimeService as defaultCreateMemoryRuntimeService,\n type MemoryRuntimeService,\n type MemoryRuntimeServicesDeps\n} from './memory-runtime-service.js';\nimport type {\n MemoryIngestService\n} from './memory-ingest-service.js';\nimport type {\n MemoryQueryService\n} from './memory-query-service.js';\nimport {\n createSharedMemoryServices as defaultCreateSharedMemoryServices,\n type SharedMemoryServices,\n type SharedMemoryServicesOptions\n} from './shared-memory-services.js';\nimport type {\n RetrievalAnalyticsService,\n RetrievalDisclosureService,\n RetrievalOrchestrator\n} from './retrieval-services.js';\n\nexport interface MemoryServiceCompositionConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n lightweightMode?: boolean;\n embeddingOnly?: boolean;\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n}\n\nexport interface MemoryServiceCompositionFactories {\n expandPath?: (targetPath: string) => string;\n createToolObservationEmbedding?: (\n toolName: string,\n metadata: Record<string, unknown>,\n success: boolean\n ) => string;\n createMemoryEngineServices?: (options: MemoryEngineServicesOptions) => MemoryEngineServices;\n createEndlessMemoryServices?: (options: EndlessMemoryServicesOptions) => EndlessMemoryServices;\n createSharedMemoryServices?: (options: SharedMemoryServicesOptions) => SharedMemoryServices;\n createMemoryRuntimeService?: (deps: MemoryRuntimeServicesDeps) => MemoryRuntimeService;\n createEmbeddingMaintenanceService?: (\n options: EmbeddingMaintenanceServiceOptions\n ) => EmbeddingMaintenanceService;\n}\n\nexport interface MemoryServiceCompositionOptions {\n config: MemoryServiceCompositionConfig;\n defaultSharedStoragePath: string;\n defaultSharedStoreConfig?: SharedStoreConfig;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n factories?: MemoryServiceCompositionFactories;\n}\n\nexport interface MemoryServiceComposition {\n storagePath: string;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n embeddingMaintenanceService: EmbeddingMaintenanceService;\n runtimeService: MemoryRuntimeService;\n graduation: GraduationPipeline;\n endlessMemoryServices: EndlessMemoryServices;\n sharedMemoryServices: SharedMemoryServices;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryServiceComposition(\n options: MemoryServiceCompositionOptions\n): MemoryServiceComposition {\n const factories = options.factories ?? {};\n const expandPath = factories.expandPath ?? defaultExpandPath;\n const createToolEmbedding = factories.createToolObservationEmbedding ?? defaultCreateToolObservationEmbedding;\n\n const storagePath = expandPath(options.config.storagePath);\n const projectPathForMirror = options.getProjectPath?.() ?? options.config.projectPath ?? process.cwd();\n const readOnly = options.config.readOnly ?? false;\n const lightweightMode = options.config.lightweightMode ?? false;\n const embeddingOnly = options.config.embeddingOnly ?? false;\n const sharedStoreConfig = options.config.sharedStoreConfig ?? options.defaultSharedStoreConfig ?? {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: options.defaultSharedStoragePath\n };\n\n let sharedMemoryServices: SharedMemoryServices | null = null;\n\n const engineServices = (factories.createMemoryEngineServices ?? defaultCreateMemoryEngineServices)({\n storagePath,\n readOnly,\n embeddingModel: options.config.embeddingModel,\n cwd: projectPathForMirror,\n initialize: options.initialize,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n hasSharedStore: () => sharedMemoryServices?.isEnabled() ?? false,\n sharedStore: {\n get: (entryId: string) => sharedMemoryServices?.getEntryForDisclosure(entryId) ?? Promise.resolve(null)\n },\n createToolObservationEmbedding: (payload: ToolObservationPayload) => createToolEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n )\n });\n\n const endlessMemoryServices = (factories.createEndlessMemoryServices ?? defaultCreateEndlessMemoryServices)({\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n configStore: engineServices.sqliteStore,\n initialize: options.initialize\n });\n\n sharedMemoryServices = (factories.createSharedMemoryServices ?? defaultCreateSharedMemoryServices)({\n config: sharedStoreConfig,\n defaultSharedStoragePath: options.defaultSharedStoragePath,\n readOnly,\n expandPath,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever\n });\n\n const runtimeService = (factories.createMemoryRuntimeService ?? defaultCreateMemoryRuntimeService)({\n sqliteStore: engineServices.sqliteStore,\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n readOnly,\n lightweightMode,\n embeddingOnly\n });\n\n const embeddingMaintenanceService = (\n factories.createEmbeddingMaintenanceService ?? defaultCreateEmbeddingMaintenanceService\n )({\n storagePath,\n initialize: options.initialize,\n getEmbeddingModelName: () => engineServices.embedder.getModelName(),\n vectorStore: engineServices.vectorStore,\n eventStore: {\n clearEmbeddingOutbox: () => engineServices.sqliteStore.clearEmbeddingOutbox(),\n getEventsPage: async (limit, offset) => {\n const events = await engineServices.sqliteStore.getEventsPage(limit, offset);\n return events.map((event) => ({ id: event.id, content: event.content }));\n },\n enqueueForEmbedding: async (eventId, content) => {\n await engineServices.sqliteStore.enqueueForEmbedding(eventId, content);\n }\n },\n getVectorWorker: () => runtimeService.getVectorWorker()\n });\n\n return {\n storagePath,\n readOnly,\n lightweightMode,\n embeddingOnly,\n sqliteStore: engineServices.sqliteStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n retrievalOrchestrator: engineServices.retrievalOrchestrator,\n retrievalDisclosureService: engineServices.retrievalDisclosureService,\n retrievalAnalyticsService: engineServices.retrievalAnalyticsService,\n embeddingMaintenanceService,\n runtimeService,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n ingestService: engineServices.ingestService,\n queryService: engineServices.queryService\n };\n}\n\nfunction defaultExpandPath(targetPath: string): string {\n if (targetPath.startsWith('~')) {\n return path.join(os.homedir(), targetPath.slice(1));\n }\n return targetPath;\n}\n", "/**\n * Metadata Extractor\n * Extracts tool-specific metadata from tool inputs and outputs\n */\n\nimport type { ToolMetadata } from './types.js';\n\n/**\n * Get file type from path\n */\nfunction getFileType(filePath: string): string | undefined {\n const ext = filePath.split('.').pop()?.toLowerCase();\n if (!ext) return undefined;\n\n const typeMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n py: 'python',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'header',\n hpp: 'header',\n cs: 'csharp',\n php: 'php',\n html: 'html',\n css: 'css',\n scss: 'scss',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n md: 'markdown',\n sql: 'sql',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell'\n };\n\n return typeMap[ext];\n}\n\n/**\n * Count lines in content\n */\nfunction countLines(content: string): number {\n return content.split('\\n').length;\n}\n\n/**\n * Extract bash command (without arguments that might contain secrets)\n */\nfunction extractCommand(fullCommand: string): string {\n // Get first word (command name)\n const parts = fullCommand.trim().split(/\\s+/);\n const command = parts[0];\n\n // For common commands, include safe arguments\n const safeCommands = ['git', 'npm', 'yarn', 'pnpm', 'node', 'python', 'go', 'cargo', 'make'];\n if (safeCommands.includes(command) && parts.length > 1) {\n // Include subcommand for these\n return `${command} ${parts[1]}`;\n }\n\n return command;\n}\n\n/**\n * Extract metadata from tool usage\n */\nexport function extractMetadata(\n toolName: string,\n input: Record<string, unknown>,\n output: string,\n success: boolean\n): ToolMetadata {\n switch (toolName) {\n case 'Read': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: success ? countLines(output) : undefined\n };\n }\n\n case 'Write': {\n const filePath = input.file_path as string | undefined;\n const content = input.content as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: content ? countLines(content) : undefined\n };\n }\n\n case 'Edit': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined\n };\n }\n\n case 'Bash': {\n const fullCommand = input.command as string | undefined;\n return {\n command: fullCommand ? extractCommand(fullCommand) : undefined\n };\n }\n\n case 'Grep': {\n const pattern = input.pattern as string | undefined;\n // Count matches from output\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'Glob': {\n const pattern = input.pattern as string | undefined;\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'WebFetch': {\n const url = input.url as string | undefined;\n // Try to extract status code from output\n const statusMatch = output.match(/status:\\s*(\\d{3})/i);\n return {\n url,\n statusCode: statusMatch ? parseInt(statusMatch[1], 10) : undefined\n };\n }\n\n case 'WebSearch': {\n return {};\n }\n\n case 'NotebookEdit': {\n const notebookPath = input.notebook_path as string | undefined;\n return {\n filePath: notebookPath,\n fileType: 'jupyter'\n };\n }\n\n default:\n return {};\n }\n}\n\n/**\n * Create embedding content for tool observation\n */\nexport function createToolObservationEmbedding(\n toolName: string,\n metadata: ToolMetadata,\n success: boolean\n): string {\n const parts: string[] = [];\n\n parts.push(`Tool: ${toolName}`);\n\n if (metadata.filePath) {\n parts.push(`File: ${metadata.filePath}`);\n }\n if (metadata.command) {\n parts.push(`Command: ${metadata.command}`);\n }\n if (metadata.pattern) {\n parts.push(`Pattern: ${metadata.pattern}`);\n }\n if (metadata.url) {\n // Only include domain for privacy\n try {\n const url = new URL(metadata.url);\n parts.push(`URL: ${url.hostname}`);\n } catch {\n // Invalid URL, skip\n }\n }\n\n parts.push(`Result: ${success ? 'Success' : 'Failed'}`);\n\n return parts.join('\\n');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface EmbeddingMaintenanceEvent {\n id: string;\n content: string;\n}\n\nexport interface EmbeddingMaintenanceEventStore {\n clearEmbeddingOutbox(): Promise<void>;\n getEventsPage(limit: number, offset: number): Promise<EmbeddingMaintenanceEvent[]>;\n enqueueForEmbedding(eventId: string, content: string): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorStore {\n count(): Promise<number>;\n clearAll(): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorWorker {\n isRunning(): boolean;\n stop(): void;\n start(): void;\n}\n\nexport interface EmbeddingMaintenanceFileSystem {\n existsSync(targetPath: string): boolean;\n readFileSync(targetPath: string, encoding: BufferEncoding): string;\n writeFileSync(targetPath: string, content: string): void;\n}\n\nexport interface EmbeddingModelMaintenanceOptions {\n autoMigrate?: boolean;\n}\n\nexport interface EmbeddingModelMaintenanceResult {\n changed: boolean;\n previousModel: string | null;\n currentModel: string;\n enqueued: number;\n reason?: string;\n}\n\nexport interface EmbeddingMaintenanceServiceOptions {\n storagePath: string;\n initialize: () => Promise<void>;\n getEmbeddingModelName: () => string;\n vectorStore: EmbeddingMaintenanceVectorStore;\n eventStore: EmbeddingMaintenanceEventStore;\n getVectorWorker: () => EmbeddingMaintenanceVectorWorker | null;\n fileSystem?: EmbeddingMaintenanceFileSystem;\n}\n\nexport interface EmbeddingMaintenanceService {\n getEmbeddingModelName(): string;\n ensureEmbeddingModelForImport(options?: EmbeddingModelMaintenanceOptions): Promise<EmbeddingModelMaintenanceResult>;\n}\n\nconst DEFAULT_PAGE_SIZE = 1000;\n\nconst defaultFileSystem: EmbeddingMaintenanceFileSystem = {\n existsSync: fs.existsSync,\n readFileSync: (targetPath, encoding) => fs.readFileSync(targetPath, encoding),\n writeFileSync: (targetPath, content) => fs.writeFileSync(targetPath, content)\n};\n\nclass DefaultEmbeddingMaintenanceService implements EmbeddingMaintenanceService {\n private readonly fileSystem: EmbeddingMaintenanceFileSystem;\n\n constructor(private readonly options: EmbeddingMaintenanceServiceOptions) {\n this.fileSystem = options.fileSystem ?? defaultFileSystem;\n }\n\n getEmbeddingModelName(): string {\n return this.options.getEmbeddingModelName();\n }\n\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n await this.options.initialize();\n\n const currentModel = this.getEmbeddingModelName();\n const metaPath = path.join(this.options.storagePath, 'embedding-meta.json');\n const previousModel = this.readPreviousModel(metaPath);\n const vectorCount = await this.options.vectorStore.count();\n const hasExistingVectors = vectorCount > 0;\n\n // First-time metadata write (no migration needed unless legacy vectors exist)\n if (!previousModel && !hasExistingVectors) {\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify({ model: currentModel, updatedAt: new Date().toISOString() }, null, 2)\n );\n return { changed: false, previousModel: null, currentModel, enqueued: 0, reason: 'initialized-meta' };\n }\n\n const modelChanged = previousModel !== currentModel;\n const legacyUnknownButVectorsExist = !previousModel && hasExistingVectors;\n\n if (!modelChanged && !legacyUnknownButVectorsExist) {\n return { changed: false, previousModel, currentModel, enqueued: 0 };\n }\n\n if (options?.autoMigrate === false) {\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued: 0,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n const worker = this.options.getVectorWorker();\n const wasRunning = worker?.isRunning() || false;\n if (wasRunning) worker?.stop();\n\n await this.options.vectorStore.clearAll();\n await this.options.eventStore.clearEmbeddingOutbox();\n\n const enqueued = await this.reenqueueAllEvents();\n\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify(\n {\n model: currentModel,\n previousModel,\n migratedAt: new Date().toISOString(),\n enqueued\n },\n null,\n 2\n )\n );\n\n if (wasRunning) worker?.start();\n\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n private readPreviousModel(metaPath: string): string | null {\n try {\n if (this.fileSystem.existsSync(metaPath)) {\n const parsed = JSON.parse(this.fileSystem.readFileSync(metaPath, 'utf-8')) as { model?: string };\n return parsed?.model || null;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n private async reenqueueAllEvents(): Promise<number> {\n let offset = 0;\n let enqueued = 0;\n\n while (true) {\n const page = await this.options.eventStore.getEventsPage(DEFAULT_PAGE_SIZE, offset);\n if (page.length === 0) break;\n\n for (const event of page) {\n await this.options.eventStore.enqueueForEmbedding(event.id, event.content);\n enqueued += 1;\n }\n\n offset += page.length;\n if (page.length < DEFAULT_PAGE_SIZE) break;\n }\n\n return enqueued;\n }\n}\n\nexport function createEmbeddingMaintenanceService(\n options: EmbeddingMaintenanceServiceOptions\n): EmbeddingMaintenanceService {\n return new DefaultEmbeddingMaintenanceService(options);\n}\n", "import { randomUUID } from 'crypto';\n\nimport type { EventStore } from '../../core/event-store.js';\nimport {\n createWorkingSetStore,\n type WorkingSetStore\n} from '../../core/working-set-store.js';\nimport {\n createConsolidatedStore,\n type ConsolidatedStore\n} from '../../core/consolidated-store.js';\nimport {\n createConsolidationWorker,\n type ConsolidationWorker\n} from '../../core/consolidation-worker.js';\nimport {\n createContinuityManager,\n type ContinuityManager\n} from '../../core/continuity-manager.js';\nimport type {\n ConsolidatedMemory,\n ContinuityScore,\n EndlessModeConfig,\n EndlessModeStatus,\n MemoryMode,\n WorkingSet\n} from '../../core/types.js';\n\nexport interface EndlessConfigStore {\n getEndlessConfig(key: string): Promise<unknown>;\n setEndlessConfig(key: string, value: unknown): Promise<void>;\n}\n\nexport interface WorkingSetStorePort {\n add(eventId: string, relevanceScore?: number): Promise<void>;\n get(): Promise<WorkingSet>;\n count(): Promise<number>;\n}\n\nexport interface ConsolidatedStorePort {\n search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]>;\n markAccessed(memoryId: string): Promise<void>;\n count(): Promise<number>;\n getLastConsolidationTime(): Promise<Date | null>;\n}\n\nexport interface ConsolidationWorkerPort {\n start(): void;\n stop(): void;\n recordActivity(): void;\n forceRun(): Promise<number>;\n}\n\nexport interface ContinuityManagerPort {\n createSnapshot(\n id: string,\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): unknown;\n calculateScore(snapshot: unknown): Promise<ContinuityScore>;\n}\n\nexport interface EndlessMemoryServicesFactories {\n createWorkingSetStore: (eventStore: EventStore, config: EndlessModeConfig) => WorkingSetStorePort;\n createConsolidatedStore: (eventStore: EventStore) => ConsolidatedStorePort;\n createConsolidationWorker: (\n workingSetStore: WorkingSetStorePort,\n consolidatedStore: ConsolidatedStorePort,\n config: EndlessModeConfig\n ) => ConsolidationWorkerPort;\n createContinuityManager: (eventStore: EventStore, config: EndlessModeConfig) => ContinuityManagerPort;\n randomUUID?: () => string;\n}\n\nexport interface EndlessMemoryServicesOptions {\n eventStore: EventStore;\n configStore: EndlessConfigStore;\n initialize: () => Promise<void>;\n factories?: EndlessMemoryServicesFactories;\n}\n\nexport interface EndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n initializeEndlessMode(): Promise<void>;\n getEndlessConfig(): Promise<EndlessModeConfig>;\n setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void>;\n setMode(mode: MemoryMode): Promise<void>;\n getMode(): MemoryMode;\n isEndlessModeActive(): boolean;\n addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void>;\n getWorkingSet(): Promise<WorkingSet | null>;\n searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]>;\n markMemoryAccessed(memoryId: string): Promise<void>;\n calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null>;\n recordActivity(): void;\n forceConsolidation(): Promise<number>;\n getEndlessModeStatus(): Promise<EndlessModeStatus>;\n formatEndlessContext(query: string): Promise<string>;\n shutdown(): void;\n}\n\nfunction getDefaultEndlessConfig(): EndlessModeConfig {\n return {\n enabled: true,\n workingSet: {\n maxEvents: 100,\n timeWindowHours: 24,\n minRelevanceScore: 0.5\n },\n consolidation: {\n triggerIntervalMs: 3600000,\n triggerEventCount: 100,\n triggerIdleMs: 1800000,\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n}\n\nconst defaultFactories: Required<EndlessMemoryServicesFactories> = {\n createWorkingSetStore: (eventStore, config) => createWorkingSetStore(eventStore, config) as WorkingSetStore,\n createConsolidatedStore: (eventStore) => createConsolidatedStore(eventStore) as ConsolidatedStore,\n createConsolidationWorker: (workingSetStore, consolidatedStore, config) => createConsolidationWorker(\n workingSetStore as WorkingSetStore,\n consolidatedStore as ConsolidatedStore,\n config\n ) as ConsolidationWorker,\n createContinuityManager: (eventStore, config) => createContinuityManager(eventStore, config) as ContinuityManager,\n randomUUID\n};\n\nclass DefaultEndlessMemoryServices implements EndlessMemoryServices {\n private readonly factories: Required<EndlessMemoryServicesFactories>;\n private workingSetStore: WorkingSetStorePort | null = null;\n private consolidatedStore: ConsolidatedStorePort | null = null;\n private consolidationWorker: ConsolidationWorkerPort | null = null;\n private continuityManager: ContinuityManagerPort | null = null;\n private mode: MemoryMode = 'session';\n\n constructor(private readonly options: EndlessMemoryServicesOptions) {\n this.factories = options.factories\n ? { ...options.factories, randomUUID: options.factories.randomUUID ?? randomUUID }\n : defaultFactories;\n }\n\n async initializeFromSavedMode(): Promise<void> {\n const savedMode = await this.options.configStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.mode = 'endless';\n await this.initializeEndlessMode();\n }\n }\n\n async initializeEndlessMode(): Promise<void> {\n if (this.consolidationWorker) return;\n\n const config = await this.getEndlessConfig();\n const workingSetStore = this.factories.createWorkingSetStore(this.options.eventStore, config);\n const consolidatedStore = this.factories.createConsolidatedStore(this.options.eventStore);\n const consolidationWorker = this.factories.createConsolidationWorker(\n workingSetStore,\n consolidatedStore,\n config\n );\n const continuityManager = this.factories.createContinuityManager(this.options.eventStore, config);\n\n try {\n consolidationWorker.start();\n } catch (error) {\n consolidationWorker.stop();\n throw error;\n }\n\n this.workingSetStore = workingSetStore;\n this.consolidatedStore = consolidatedStore;\n this.consolidationWorker = consolidationWorker;\n this.continuityManager = continuityManager;\n }\n\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.options.configStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || getDefaultEndlessConfig();\n }\n\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.options.configStore.setEndlessConfig('config', merged);\n }\n\n async setMode(mode: MemoryMode): Promise<void> {\n await this.options.initialize();\n if (mode === this.mode) return;\n\n this.mode = mode;\n await this.options.configStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n this.stopEndlessMode();\n }\n }\n\n getMode(): MemoryMode {\n return this.mode;\n }\n\n isEndlessModeActive(): boolean {\n return this.mode === 'endless';\n }\n\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n if (!this.workingSetStore) return;\n await this.workingSetStore.add(eventId, relevanceScore);\n }\n\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n async searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\n }\n\n async markMemoryAccessed(memoryId: string): Promise<void> {\n if (!this.consolidatedStore) return;\n await this.consolidatedStore.markAccessed(memoryId);\n }\n\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n if (!this.continuityManager) return null;\n const snapshot = this.continuityManager.createSnapshot(\n this.factories.randomUUID(),\n content,\n metadata\n );\n return this.continuityManager.calculateScore(snapshot);\n }\n\n recordActivity(): void {\n this.consolidationWorker?.recordActivity();\n }\n\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.options.initialize();\n\n let workingSetSize = 0;\n let continuityScore = 0.5;\n let consolidatedCount = 0;\n let lastConsolidation: Date | null = null;\n\n if (this.workingSetStore) {\n workingSetSize = await this.workingSetStore.count();\n const workingSet = await this.workingSetStore.get();\n continuityScore = workingSet.continuityScore;\n }\n\n if (this.consolidatedStore) {\n consolidatedCount = await this.consolidatedStore.count();\n lastConsolidation = await this.consolidatedStore.getLastConsolidationTime();\n }\n\n return {\n mode: this.mode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n async formatEndlessContext(query: string): Promise<string> {\n if (!this.isEndlessModeActive()) {\n return '';\n }\n\n const workingSet = await this.getWorkingSet();\n const consolidated = await this.searchConsolidated(query, { topK: 3 });\n const continuity = await this.calculateContinuity(query);\n\n const parts: string[] = [];\n\n if (continuity) {\n const statusEmoji = continuity.transitionType === 'seamless' ? '\uD83D\uDD17' :\n continuity.transitionType === 'topic_shift' ? '\u21AA\uFE0F' : '\uD83C\uDD95';\n parts.push(`${statusEmoji} Context: ${continuity.transitionType} (score: ${continuity.score.toFixed(2)})`);\n }\n\n if (workingSet && workingSet.recentEvents.length > 0) {\n parts.push('\\n## Recent Context (Working Set)');\n const recent = workingSet.recentEvents.slice(0, 5);\n for (const event of recent) {\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n const time = event.timestamp.toLocaleTimeString();\n parts.push(`- ${time} [${event.eventType}] ${preview}`);\n }\n }\n\n if (consolidated.length > 0) {\n parts.push('\\n## Related Knowledge (Consolidated)');\n for (const memory of consolidated) {\n parts.push(`- ${memory.topics.slice(0, 3).join(', ')}: ${memory.summary.slice(0, 100)}...`);\n }\n }\n\n return parts.join('\\n');\n }\n\n shutdown(): void {\n this.stopEndlessMode();\n }\n\n private stopEndlessMode(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.consolidationWorker = null;\n this.continuityManager = null;\n }\n}\n\nexport function createEndlessMemoryServices(options: EndlessMemoryServicesOptions): EndlessMemoryServices {\n return new DefaultEndlessMemoryServices(options);\n}\n", "/**\n * Working Set Store\n * Manages the active memory window for Endless Mode\n * Biomimetic: Simulates human working memory (7\u00B12 items, 15-30s duration)\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n MemoryEvent,\n EndlessModeConfig,\n WorkingSet,\n WorkingSetItem\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class WorkingSetStore {\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Add an event to the working set\n */\n async add(eventId: string, relevanceScore: number = 1.0, topics?: string[]): Promise<void> {\n const expiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO working_set (id, event_id, added_at, relevance_score, topics, expires_at)\n VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?, ?)`,\n [\n randomUUID(),\n eventId,\n relevanceScore,\n JSON.stringify(topics || []),\n expiresAt.toISOString()\n ]\n );\n\n // Enforce size limit\n await this.enforceLimit();\n }\n\n /**\n * Get the current working set\n */\n async get(): Promise<WorkingSet> {\n // Clean up expired items first\n await this.cleanup();\n\n // Get working set items with their events\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT ws.*, e.*\n FROM working_set ws\n JOIN events e ON ws.event_id = e.id\n ORDER BY ws.relevance_score DESC, ws.added_at DESC\n LIMIT ?`,\n [this.config.workingSet.maxEvents]\n );\n\n const events: MemoryEvent[] = rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n }));\n\n return {\n recentEvents: events,\n lastActivity: events.length > 0 ? events[0].timestamp : new Date(),\n continuityScore: await this.calculateContinuityScore()\n };\n }\n\n /**\n * Get working set items (metadata only)\n */\n async getItems(): Promise<WorkingSetItem[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM working_set ORDER BY relevance_score DESC, added_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n addedAt: toDate(row.added_at),\n relevanceScore: row.relevance_score as number,\n topics: row.topics ? JSON.parse(row.topics as string) : undefined,\n expiresAt: toDate(row.expires_at)\n }));\n }\n\n /**\n * Update relevance score for an event\n */\n async updateRelevance(eventId: string, score: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE working_set SET relevance_score = ? WHERE event_id = ?`,\n [score, eventId]\n );\n }\n\n /**\n * Prune specific events from working set (after consolidation)\n */\n async prune(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n const placeholders = eventIds.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE event_id IN (${placeholders})`,\n eventIds\n );\n }\n\n /**\n * Get the count of items in working set\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Clear the entire working set\n */\n async clear(): Promise<void> {\n await dbRun(this.db, `DELETE FROM working_set`);\n }\n\n /**\n * Check if an event is in the working set\n */\n async contains(eventId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set WHERE event_id = ?`,\n [eventId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Refresh expiration for an event (rehears al - keep relevant items longer)\n */\n async refresh(eventId: string): Promise<void> {\n const newExpiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `UPDATE working_set SET expires_at = ? WHERE event_id = ?`,\n [newExpiresAt.toISOString(), eventId]\n );\n }\n\n /**\n * Clean up expired items\n */\n private async cleanup(): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE expires_at < datetime('now')`\n );\n }\n\n /**\n * Enforce the maximum size limit\n * Removes lowest relevance items when over limit\n */\n private async enforceLimit(): Promise<void> {\n const maxEvents = this.config.workingSet.maxEvents;\n\n // Get IDs to keep (highest relevance, most recent)\n const keepIds = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM working_set\n ORDER BY relevance_score DESC, added_at DESC\n LIMIT ?`,\n [maxEvents]\n );\n\n if (keepIds.length === 0) return;\n\n const keepIdList = keepIds.map(r => r.id);\n const placeholders = keepIdList.map(() => '?').join(',');\n\n // Delete everything not in the keep list\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE id NOT IN (${placeholders})`,\n keepIdList\n );\n }\n\n /**\n * Calculate continuity score based on recent context transitions\n */\n private async calculateContinuityScore(): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-1 hour')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get topics from current working set for context matching\n */\n async getActiveTopics(): Promise<string[]> {\n const rows = await dbAll<{ topics: string }>(\n this.db,\n `SELECT topics FROM working_set WHERE topics IS NOT NULL`\n );\n\n const allTopics = new Set<string>();\n for (const row of rows) {\n const topics = JSON.parse(row.topics) as string[];\n topics.forEach(t => allTopics.add(t));\n }\n\n return Array.from(allTopics);\n }\n}\n\n/**\n * Create a Working Set Store instance\n */\nexport function createWorkingSetStore(\n eventStore: EventStore,\n config: EndlessModeConfig\n): WorkingSetStore {\n return new WorkingSetStore(eventStore, config);\n}\n", "/**\n * SQLite Database Wrapper\n * Provides Promise-based interface over better-sqlite3 synchronous API\n */\n\nimport BetterSqlite3 from 'better-sqlite3';\n\nexport type Database = BetterSqlite3.Database;\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\nexport interface DatabaseOptions {\n readOnly?: boolean;\n}\n\n/**\n * Creates a new SQLite database connection\n */\nexport function createDatabase(dbPath: string, options?: DatabaseOptions): Database {\n return new BetterSqlite3(dbPath, { readonly: options?.readOnly });\n}\n\n/**\n * Executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n db.prepare(sql).run(...(params as never[]));\n return Promise.resolve();\n}\n\n/**\n * Executes a query and returns all rows\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return Promise.resolve(db.prepare(sql).all(...(params as never[])) as T[]);\n}\n\n/**\n * Closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n db.close();\n return Promise.resolve();\n}\n\n/**\n * Executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n db.exec(sql);\n return Promise.resolve();\n}\n", "/**\n * Consolidated Store\n * Manages long-term integrated memories for Endless Mode\n * Biomimetic: Simulates memory consolidation that occurs during sleep\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n ConsolidatedMemory,\n ConsolidatedMemoryInput,\n ConsolidationRule,\n ConsolidationRuleInput\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ConsolidatedStore {\n constructor(private eventStore: EventStore) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Create a new consolidated memory\n */\n async create(input: ConsolidatedMemoryInput): Promise<string> {\n const memoryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_memories\n (memory_id, summary, topics, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n memoryId,\n input.summary,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return memoryId;\n }\n\n /**\n * Get a consolidated memory by ID\n */\n async get(memoryId: string): Promise<ConsolidatedMemory | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToMemory(rows[0]);\n }\n\n /**\n * Search consolidated memories by query (simple text search)\n */\n async search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE summary LIKE ?\n ORDER BY confidence DESC\n LIMIT ?`,\n [`%${query}%`, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(topics: string[], options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n // Build topic filter\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE ${topicConditions}\n ORDER BY confidence DESC\n LIMIT ?`,\n [...topicParams, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get all consolidated memories ordered by confidence\n */\n async getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 100;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n ORDER BY confidence DESC, created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get recently created memories\n */\n async getRecent(options?: { limit?: number; hours?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 10;\n const hours = options?.hours || 24;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE created_at > datetime('now', '-${hours} hours')\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Mark a memory as accessed (tracks usage for importance scoring)\n */\n async markAccessed(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET accessed_at = CURRENT_TIMESTAMP,\n access_count = access_count + 1\n WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Update confidence score for a memory\n */\n async updateConfidence(memoryId: string, confidence: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET confidence = ?\n WHERE memory_id = ?`,\n [confidence, memoryId]\n );\n }\n\n /**\n * Delete a consolidated memory\n */\n async delete(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Create a long-term rule promoted from stable summaries\n */\n async createRule(input: ConsolidationRuleInput): Promise<string> {\n const ruleId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_rules\n (rule_id, rule, topics, source_memory_ids, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n ruleId,\n input.rule,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceMemoryIds),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return ruleId;\n }\n\n async getRules(options?: { limit?: number }): Promise<ConsolidationRule[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_rules ORDER BY confidence DESC, created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n ruleId: row.rule_id as string,\n rule: row.rule as string,\n topics: JSON.parse((row.topics as string) || '[]'),\n sourceMemoryIds: JSON.parse((row.source_memory_ids as string) || '[]'),\n sourceEvents: JSON.parse((row.source_events as string) || '[]'),\n confidence: Number(row.confidence ?? 0.5),\n createdAt: toDate(row.created_at) || new Date()\n }));\n }\n\n async countRules(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules`\n );\n return result[0]?.count || 0;\n }\n\n async hasRuleForSourceMemory(memoryId: string): Promise<boolean> {\n const rows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules WHERE source_memory_ids LIKE ?`,\n [`%\"${memoryId}\"%`]\n );\n return (rows[0]?.count || 0) > 0;\n }\n\n /**\n * Get count of consolidated memories\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get most accessed memories (for importance scoring)\n */\n async getMostAccessed(limit: number = 10): Promise<ConsolidatedMemory[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE access_count > 0\n ORDER BY access_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get statistics about consolidated memories\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topicCounts: Record<string, number>;\n recentCount: number;\n }> {\n const total = await this.count();\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM consolidated_memories`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const recentResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE created_at > datetime('now', '-24 hours')`\n );\n const recentCount = recentResult[0]?.count || 0;\n\n // Get topic counts\n const allMemories = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const memory of allMemories) {\n for (const topic of memory.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n return {\n total,\n averageConfidence,\n topicCounts,\n recentCount\n };\n }\n\n /**\n * Check if source events are already consolidated\n */\n async isAlreadyConsolidated(eventIds: string[]): Promise<boolean> {\n for (const eventId of eventIds) {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE source_events LIKE ?`,\n [`%\"${eventId}\"%`]\n );\n if ((result[0]?.count || 0) > 0) return true;\n }\n return false;\n }\n\n /**\n * Get the last consolidation time\n */\n async getLastConsolidationTime(): Promise<Date | null> {\n const result = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM consolidated_memories\n ORDER BY created_at DESC\n LIMIT 1`\n );\n\n if (result.length === 0) return null;\n return new Date(result[0].created_at);\n }\n\n /**\n * Convert database row to ConsolidatedMemory\n */\n private rowToMemory(row: Record<string, unknown>): ConsolidatedMemory {\n return {\n memoryId: row.memory_id as string,\n summary: row.summary as string,\n topics: JSON.parse(row.topics as string || '[]'),\n sourceEvents: JSON.parse(row.source_events as string || '[]'),\n confidence: row.confidence as number,\n createdAt: toDate(row.created_at),\n accessedAt: row.accessed_at ? toDate(row.accessed_at) : undefined,\n accessCount: row.access_count as number || 0\n };\n }\n}\n\n/**\n * Create a Consolidated Store instance\n */\nexport function createConsolidatedStore(eventStore: EventStore): ConsolidatedStore {\n return new ConsolidatedStore(eventStore);\n}\n", "/**\n * Consolidation Worker\n * Periodically consolidates working set into long-term memory\n * Biomimetic: Simulates memory consolidation during sleep/idle periods\n */\n\nimport type {\n EndlessModeConfig,\n MemoryEvent,\n EventGroup,\n WorkingSet,\n ConsolidationCostQualityReport\n} from './types.js';\nimport { WorkingSetStore } from './working-set-store.js';\nimport { ConsolidatedStore } from './consolidated-store.js';\n\nexport class ConsolidationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastActivity: Date = new Date();\n\n constructor(\n private workingSetStore: WorkingSetStore,\n private consolidatedStore: ConsolidatedStore,\n private config: EndlessModeConfig\n ) {}\n\n /**\n * Start the consolidation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the consolidation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Record activity (resets idle timer)\n */\n recordActivity(): void {\n this.lastActivity = new Date();\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a consolidation run (manual trigger)\n */\n async forceRun(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n /**\n * Force a consolidation run and return metrics report\n */\n async forceRunWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n return this.consolidateWithReport();\n }\n\n /**\n * Schedule the next consolidation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.consolidation.triggerIntervalMs\n );\n }\n\n /**\n * Run consolidation check\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.checkAndConsolidate();\n } catch (error) {\n console.error('Consolidation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Check conditions and consolidate if needed\n */\n private async checkAndConsolidate(): Promise<void> {\n const workingSet = await this.workingSetStore.get();\n\n if (!this.shouldConsolidate(workingSet)) {\n return;\n }\n\n await this.consolidate();\n }\n\n /**\n * Perform consolidation\n */\n private async consolidate(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n private async consolidateWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n const workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return {\n consolidatedCount: 0,\n promotedRuleCount: 0,\n report: this.buildCostQualityReport(workingSet.recentEvents, [], 0)\n };\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\n const createdMemoryIds: string[] = [];\n\n for (const group of groups) {\n // Require minimum 3 events per group\n if (group.events.length < 3) continue;\n\n // Check if already consolidated\n const eventIds = group.events.map(e => e.id);\n const alreadyConsolidated = await this.consolidatedStore.isAlreadyConsolidated(eventIds);\n if (alreadyConsolidated) continue;\n\n // Generate summary\n const summary = await this.summarize(group);\n\n // Create consolidated memory\n const memoryId = await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n createdMemoryIds.push(memoryId);\n consolidatedCount++;\n }\n\n const promotedRuleCount = await this.promoteStableSummariesToRules(createdMemoryIds);\n\n // Prune consolidated events from working set\n if (consolidatedCount > 0) {\n const consolidatedEventIds = groups\n .filter(g => g.events.length >= 3)\n .flatMap(g => g.events.map(e => e.id));\n\n // Only prune old events (keep recent for context)\n const oldEventIds = consolidatedEventIds.filter(id => {\n const event = workingSet.recentEvents.find(e => e.id === id);\n if (!event) return false;\n const ageHours = (Date.now() - event.timestamp.getTime()) / (1000 * 60 * 60);\n return ageHours > this.config.workingSet.timeWindowHours / 2;\n });\n\n if (oldEventIds.length > 0) {\n await this.workingSetStore.prune(oldEventIds);\n }\n }\n\n const report = this.buildCostQualityReport(workingSet.recentEvents, groups, consolidatedCount);\n return { consolidatedCount, promotedRuleCount, report };\n }\n\n private async promoteStableSummariesToRules(memoryIds: string[]): Promise<number> {\n let promoted = 0;\n\n for (const memoryId of memoryIds) {\n const memory = await this.consolidatedStore.get(memoryId);\n if (!memory) continue;\n if (memory.confidence < 0.55) continue;\n if (memory.sourceEvents.length < 4) continue;\n\n const exists = await this.consolidatedStore.hasRuleForSourceMemory(memoryId);\n if (exists) continue;\n\n const rule = this.buildRuleFromSummary(memory.summary, memory.topics);\n if (!rule) continue;\n\n await this.consolidatedStore.createRule({\n rule,\n topics: memory.topics,\n sourceMemoryIds: [memory.memoryId],\n sourceEvents: memory.sourceEvents,\n confidence: Math.min(1, memory.confidence + 0.08)\n });\n promoted++;\n }\n\n return promoted;\n }\n\n private buildRuleFromSummary(summary: string, topics: string[]): string | null {\n const lines = summary\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .filter((l) => !l.toLowerCase().startsWith('topics:'));\n\n const bullet = lines.find((l) => l.startsWith('- '))?.replace(/^-\\s*/, '');\n const seed = bullet || lines[0];\n if (!seed || seed.length < 8) return null;\n\n const topicPrefix = topics.length > 0 ? `[${topics.slice(0, 2).join(', ')}] ` : '';\n return `${topicPrefix}${seed}`;\n }\n\n private buildCostQualityReport(\n events: MemoryEvent[],\n groups: EventGroup[],\n consolidatedCount: number\n ): ConsolidationCostQualityReport {\n const beforeTokenEstimate = events.reduce((acc, e) => acc + this.estimateTokens(e.content), 0);\n\n const afterSummaries = groups\n .filter((g) => g.events.length >= 3)\n .slice(0, Math.max(consolidatedCount, 1));\n\n const afterTokenEstimate = afterSummaries.length > 0\n ? afterSummaries.reduce((acc, g) => acc + this.estimateTokens(this.ruleBasedSummary(g)), 0)\n : beforeTokenEstimate;\n\n const reductionRatio = beforeTokenEstimate > 0\n ? Math.max(0, (beforeTokenEstimate - afterTokenEstimate) / beforeTokenEstimate)\n : 0;\n\n const qualityGuardPassed = consolidatedCount === 0\n ? true\n : groups.filter((g) => g.events.length >= 3).every((g) => this.calculateConfidence(g) >= 0.55);\n\n return {\n beforeTokenEstimate,\n afterTokenEstimate,\n reductionRatio,\n qualityGuardPassed,\n details: `groups=${groups.length}, consolidated=${consolidatedCount}`\n };\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil((text || '').length / 4);\n }\n\n /**\n * Check if consolidation should run\n */\n private shouldConsolidate(workingSet: WorkingSet): boolean {\n // Check event count trigger\n if (workingSet.recentEvents.length >= this.config.consolidation.triggerEventCount) {\n return true;\n }\n\n // Check idle time trigger\n const idleTime = Date.now() - this.lastActivity.getTime();\n if (idleTime >= this.config.consolidation.triggerIdleMs) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Group events by topic using simple keyword extraction\n */\n private groupByTopic(events: MemoryEvent[]): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n\n for (const event of events) {\n const topics = this.extractTopics(event.content);\n\n for (const topic of topics) {\n if (!groups.has(topic)) {\n groups.set(topic, { topics: [topic], events: [] });\n }\n const group = groups.get(topic)!;\n if (!group.events.find(e => e.id === event.id)) {\n group.events.push(event);\n }\n }\n }\n\n // Merge groups with overlapping events\n const mergedGroups = this.mergeOverlappingGroups(Array.from(groups.values()));\n\n return mergedGroups;\n }\n\n /**\n * Extract topics from content using simple keyword extraction\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n\n // Extract code-related keywords\n const codePatterns = [\n /\\b(function|class|interface|type|const|let|var)\\s+(\\w+)/gi,\n /\\b(import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]/gi,\n /\\bfile[:\\s]+([^\\s,]+)/gi\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const keyword = match[2] || match[1];\n if (keyword && keyword.length > 2) {\n topics.push(keyword.toLowerCase());\n }\n }\n }\n\n // Extract common programming terms\n const commonTerms = [\n 'bug', 'fix', 'error', 'issue', 'feature',\n 'test', 'refactor', 'implement', 'add', 'remove',\n 'update', 'change', 'modify', 'create', 'delete'\n ];\n\n const contentLower = content.toLowerCase();\n for (const term of commonTerms) {\n if (contentLower.includes(term)) {\n topics.push(term);\n }\n }\n\n return [...new Set(topics)].slice(0, 5); // Limit to 5 topics\n }\n\n /**\n * Merge groups that have significant event overlap\n */\n private mergeOverlappingGroups(groups: EventGroup[]): EventGroup[] {\n const merged: EventGroup[] = [];\n\n for (const group of groups) {\n let foundMerge = false;\n\n for (const existing of merged) {\n const overlap = group.events.filter(e =>\n existing.events.some(ex => ex.id === e.id)\n );\n\n // If > 50% overlap, merge\n if (overlap.length > group.events.length / 2) {\n existing.topics = [...new Set([...existing.topics, ...group.topics])];\n for (const event of group.events) {\n if (!existing.events.find(e => e.id === event.id)) {\n existing.events.push(event);\n }\n }\n foundMerge = true;\n break;\n }\n }\n\n if (!foundMerge) {\n merged.push(group);\n }\n }\n\n return merged;\n }\n\n /**\n * Generate summary for a group of events\n * Rule-based extraction (no LLM by default)\n */\n private async summarize(group: EventGroup): Promise<string> {\n if (this.config.consolidation.useLLMSummarization) {\n // Future: LLM-based summarization\n return this.ruleBasedSummary(group);\n }\n\n return this.ruleBasedSummary(group);\n }\n\n /**\n * Rule-based summary generation\n */\n private ruleBasedSummary(group: EventGroup): string {\n const keyPoints: string[] = [];\n\n for (const event of group.events.slice(0, 10)) {\n const keyPoint = this.extractKeyPoint(event.content);\n if (keyPoint) {\n keyPoints.push(keyPoint);\n }\n }\n\n const topicsStr = group.topics.slice(0, 3).join(', ');\n const summary = [\n `Topics: ${topicsStr}`,\n '',\n 'Key points:',\n ...keyPoints.map(kp => `- ${kp}`)\n ].join('\\n');\n\n return summary;\n }\n\n /**\n * Extract key point from content\n */\n private extractKeyPoint(content: string): string | null {\n // Get first meaningful sentence\n const sentences = content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10);\n if (sentences.length === 0) return null;\n\n const firstSentence = sentences[0].trim();\n\n // Truncate if too long\n if (firstSentence.length > 100) {\n return firstSentence.slice(0, 100) + '...';\n }\n\n return firstSentence;\n }\n\n /**\n * Calculate confidence score for a group\n */\n private calculateConfidence(group: EventGroup): number {\n // Factor 1: Event count (more events = higher confidence)\n const eventScore = Math.min(group.events.length / 10, 1);\n\n // Factor 2: Time proximity (events closer together = higher confidence)\n const timeScore = this.calculateTimeProximity(group.events);\n\n // Factor 3: Topic consistency (fewer topics per event = higher confidence)\n const topicScore = Math.min(3 / group.topics.length, 1);\n\n return (eventScore * 0.4 + timeScore * 0.4 + topicScore * 0.2);\n }\n\n /**\n * Calculate time proximity score\n */\n private calculateTimeProximity(events: MemoryEvent[]): number {\n if (events.length < 2) return 1;\n\n const timestamps = events.map(e => e.timestamp.getTime()).sort((a, b) => a - b);\n const timeSpan = timestamps[timestamps.length - 1] - timestamps[0];\n\n // Score based on average time between events\n const avgGap = timeSpan / (events.length - 1);\n const hourInMs = 60 * 60 * 1000;\n\n // Within 1 hour average = score 1, 24 hours = score 0.5, etc.\n return Math.max(0, 1 - (avgGap / (24 * hourInMs)));\n }\n}\n\n/**\n * Create a Consolidation Worker instance\n */\nexport function createConsolidationWorker(\n workingSetStore: WorkingSetStore,\n consolidatedStore: ConsolidatedStore,\n config: EndlessModeConfig\n): ConsolidationWorker {\n return new ConsolidationWorker(workingSetStore, consolidatedStore, config);\n}\n", "/**\n * Continuity Manager\n * Tracks and calculates context continuity between interactions\n * Biomimetic: Simulates context-dependent memory retrieval\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n EndlessModeConfig,\n ContextSnapshot,\n ContinuityScore,\n TransitionType,\n ContinuityLog\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ContinuityManager {\n private lastContext: ContextSnapshot | null = null;\n\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Calculate continuity score between current and previous context\n */\n async calculateScore(\n currentContext: ContextSnapshot,\n previousContext?: ContextSnapshot\n ): Promise<ContinuityScore> {\n const prev = previousContext || this.lastContext;\n\n if (!prev) {\n // No previous context - this is a fresh start\n this.lastContext = currentContext;\n return { score: 0.5, transitionType: 'break' };\n }\n\n let score = 0;\n\n // Topic continuity (30%)\n const topicOverlap = this.calculateOverlap(\n currentContext.topics,\n prev.topics\n );\n score += topicOverlap * 0.3;\n\n // File continuity (20%)\n const fileOverlap = this.calculateOverlap(\n currentContext.files,\n prev.files\n );\n score += fileOverlap * 0.2;\n\n // Time proximity (30%)\n const timeDiff = currentContext.timestamp - prev.timestamp;\n const decayHours = this.config.continuity.topicDecayHours;\n const timeScore = Math.exp(-timeDiff / (decayHours * 3600000));\n score += timeScore * 0.3;\n\n // Entity continuity (20%)\n const entityOverlap = this.calculateOverlap(\n currentContext.entities,\n prev.entities\n );\n score += entityOverlap * 0.2;\n\n // Determine transition type\n const transitionType = this.determineTransitionType(score);\n\n // Log the transition\n await this.logTransition(currentContext, prev, score, transitionType);\n\n // Update last context\n this.lastContext = currentContext;\n\n return { score, transitionType };\n }\n\n /**\n * Create a context snapshot from current state\n */\n createSnapshot(\n id: string,\n content: string,\n metadata?: {\n files?: string[];\n entities?: string[];\n }\n ): ContextSnapshot {\n return {\n id,\n timestamp: Date.now(),\n topics: this.extractTopics(content),\n files: metadata?.files || this.extractFiles(content),\n entities: metadata?.entities || this.extractEntities(content)\n };\n }\n\n /**\n * Get recent continuity logs\n */\n async getRecentLogs(limit: number = 10): Promise<ContinuityLog[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM continuity_log\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(row => ({\n logId: row.log_id as string,\n fromContextId: row.from_context_id as string | undefined,\n toContextId: row.to_context_id as string | undefined,\n continuityScore: row.continuity_score as number,\n transitionType: row.transition_type as TransitionType,\n createdAt: toDate(row.created_at)\n }));\n }\n\n /**\n * Get average continuity score over time period\n */\n async getAverageScore(hours: number = 1): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get transition type distribution\n */\n async getTransitionStats(hours: number = 24): Promise<Record<TransitionType, number>> {\n const rows = await dbAll<{ transition_type: string; count: number }>(\n this.db,\n `SELECT transition_type, COUNT(*) as count\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')\n GROUP BY transition_type`\n );\n\n const stats: Record<TransitionType, number> = {\n seamless: 0,\n topic_shift: 0,\n break: 0\n };\n\n for (const row of rows) {\n stats[row.transition_type as TransitionType] = row.count;\n }\n\n return stats;\n }\n\n /**\n * Clear old continuity logs\n */\n async cleanup(olderThanDays: number = 7): Promise<number> {\n const result = await dbAll<{ changes: number }>(\n this.db,\n `DELETE FROM continuity_log\n WHERE created_at < datetime('now', '-${olderThanDays} days')\n RETURNING COUNT(*) as changes`\n );\n\n return result[0]?.changes || 0;\n }\n\n /**\n * Calculate overlap between two arrays\n */\n private calculateOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n\n const setA = new Set(a.map(s => s.toLowerCase()));\n const setB = new Set(b.map(s => s.toLowerCase()));\n\n const intersection = [...setA].filter(x => setB.has(x));\n const union = new Set([...setA, ...setB]);\n\n return intersection.length / union.size; // Jaccard similarity\n }\n\n /**\n * Determine transition type based on score\n */\n private determineTransitionType(score: number): TransitionType {\n if (score >= this.config.continuity.minScoreForSeamless) {\n return 'seamless';\n } else if (score >= 0.4) {\n return 'topic_shift';\n } else {\n return 'break';\n }\n }\n\n /**\n * Log a context transition\n */\n private async logTransition(\n current: ContextSnapshot,\n previous: ContextSnapshot,\n score: number,\n type: TransitionType\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO continuity_log\n (log_id, from_context_id, to_context_id, continuity_score, transition_type, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [randomUUID(), previous.id, current.id, score, type]\n );\n }\n\n /**\n * Extract topics from content\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n const contentLower = content.toLowerCase();\n\n // Programming language keywords\n const langPatterns = [\n { pattern: /typescript|\\.ts\\b/i, topic: 'typescript' },\n { pattern: /javascript|\\.js\\b/i, topic: 'javascript' },\n { pattern: /python|\\.py\\b/i, topic: 'python' },\n { pattern: /rust|\\.rs\\b/i, topic: 'rust' },\n { pattern: /go\\b|golang/i, topic: 'go' }\n ];\n\n for (const { pattern, topic } of langPatterns) {\n if (pattern.test(content)) {\n topics.push(topic);\n }\n }\n\n // Common development topics\n const devTopics = [\n 'api', 'database', 'test', 'bug', 'feature', 'refactor',\n 'component', 'function', 'class', 'module', 'hook',\n 'deploy', 'build', 'config', 'docker', 'git'\n ];\n\n for (const topic of devTopics) {\n if (contentLower.includes(topic)) {\n topics.push(topic);\n }\n }\n\n return [...new Set(topics)].slice(0, 10);\n }\n\n /**\n * Extract file paths from content\n */\n private extractFiles(content: string): string[] {\n const filePatterns = [\n /(?:^|\\s)([a-zA-Z0-9_\\-./]+\\.[a-zA-Z0-9]+)(?:\\s|$|:)/gm,\n /['\"](\\.?\\/[^'\"]+\\.[a-zA-Z0-9]+)['\"]/g,\n /file[:\\s]+([^\\s,]+)/gi\n ];\n\n const files = new Set<string>();\n\n for (const pattern of filePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const file = match[1];\n if (file && file.length > 3 && file.length < 100) {\n // Filter out common non-file patterns\n if (!file.match(/^(https?:|mailto:|ftp:)/i)) {\n files.add(file);\n }\n }\n }\n }\n\n return Array.from(files).slice(0, 10);\n }\n\n /**\n * Extract entity names from content (functions, classes, variables)\n */\n private extractEntities(content: string): string[] {\n const entities = new Set<string>();\n\n const entityPatterns = [\n /\\b(function|const|let|var|class|interface|type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/g,\n /\\b([A-Z][a-zA-Z0-9_]*(?:Component|Service|Store|Manager|Handler|Factory|Provider))\\b/g,\n /\\b(use[A-Z][a-zA-Z0-9_]*)\\b/g // React hooks\n ];\n\n for (const pattern of entityPatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const entity = match[2] || match[1];\n if (entity && entity.length > 2) {\n entities.add(entity);\n }\n }\n }\n\n return Array.from(entities).slice(0, 20);\n }\n\n /**\n * Reset the last context (for testing or manual reset)\n */\n resetLastContext(): void {\n this.lastContext = null;\n }\n\n /**\n * Get the last context snapshot\n */\n getLastContext(): ContextSnapshot | null {\n return this.lastContext;\n }\n}\n\n/**\n * Create a Continuity Manager instance\n */\nexport function createContinuityManager(\n eventStore: EventStore,\n config: EndlessModeConfig\n): ContinuityManager {\n return new ContinuityManager(eventStore, config);\n}\n", "/**\n * Memory Engine Services Bundle\n *\n * Owns construction and wiring for storage-backed engine services so\n * MemoryService can stay focused on public facade/lifecycle behavior.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { Embedder, getDefaultEmbedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport { createGraduationPipeline, type GraduationPipeline } from '../graduation.js';\nimport { getDefaultMatcher, type Matcher } from '../matcher.js';\nimport { MarkdownMirror } from '../md-mirror.js';\nimport type { Retriever } from '../retriever.js';\nimport { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload } from '../types.js';\nimport { VectorStore } from '../vector-store.js';\nimport { MemoryIngestService } from './memory-ingest-service.js';\nimport { MemoryQueryService } from './memory-query-service.js';\nimport {\n createRetrievalServices,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore,\n type RetrievalEventStore,\n type RetrievalOrchestrator,\n type RetrievalServices,\n type RetrievalServicesDeps\n} from './retrieval-services.js';\n\nexport interface MemoryEngineServicesOptions {\n storagePath: string;\n readOnly: boolean;\n embeddingModel?: string;\n cwd?: string;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n hasSharedStore: () => boolean;\n sharedStore?: RetrievalDisclosureSharedStore;\n createToolObservationEmbedding: (payload: ToolObservationPayload) => string;\n factories?: MemoryEngineServicesFactories;\n}\n\nexport interface MemoryEngineServicesFactories {\n createSQLiteEventStore?: (\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n ) => SQLiteEventStore;\n createVectorStore?: (vectorsPath: string) => VectorStore;\n createEmbedder?: (model: string) => Embedder;\n getDefaultEmbedder?: () => Embedder;\n getDefaultMatcher?: () => Matcher;\n createMarkdownMirror?: (cwd: string) => MarkdownMirror;\n createGraduationPipeline?: (eventStore: EventStore) => GraduationPipeline;\n createRetrievalServices?: (deps: RetrievalServicesDeps) => RetrievalServices;\n}\n\nexport interface MemoryEngineServices {\n storagePath: string;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n graduation: GraduationPipeline;\n mdMirror: MarkdownMirror;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryEngineServices(options: MemoryEngineServicesOptions): MemoryEngineServices {\n const factories = options.factories ?? {};\n const storagePath = options.storagePath;\n\n if (!options.readOnly && !fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const sqliteStore = (factories.createSQLiteEventStore ?? defaultCreateSQLiteEventStore)(\n path.join(storagePath, 'events.sqlite'),\n {\n readonly: options.readOnly,\n markdownMirrorRoot: storagePath\n }\n );\n const vectorStore = (factories.createVectorStore ?? defaultCreateVectorStore)(\n path.join(storagePath, 'vectors')\n );\n const embeddingModel = options.embeddingModel || process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n const embedder = embeddingModel\n ? (factories.createEmbedder ?? defaultCreateEmbedder)(embeddingModel)\n : (factories.getDefaultEmbedder ?? getDefaultEmbedder)();\n const matcher = (factories.getDefaultMatcher ?? getDefaultMatcher)();\n const mdMirror = (factories.createMarkdownMirror ?? defaultCreateMarkdownMirror)(\n options.cwd ?? process.cwd()\n );\n const graduation = (factories.createGraduationPipeline ?? defaultCreateGraduationPipeline)(\n sqliteStore as unknown as EventStore\n );\n\n const retrievalServices = (factories.createRetrievalServices ?? createRetrievalServices)({\n initialize: options.initialize,\n eventStore: sqliteStore as unknown as RetrievalEventStore,\n vectorStore,\n embedder,\n matcher,\n getProjectHash: options.getProjectHash,\n hasSharedStore: options.hasSharedStore,\n sharedStore: options.sharedStore\n });\n\n const ingestService = new MemoryIngestService({\n initialize: options.initialize,\n eventStore: sqliteStore,\n markdownMirror: mdMirror,\n createToolEmbedding: options.createToolObservationEmbedding,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath\n });\n const queryService = new MemoryQueryService(\n () => sqliteStore.initialize(),\n sqliteStore,\n { vectorStore, graduation }\n );\n\n return {\n storagePath,\n sqliteStore,\n vectorStore,\n embedder,\n matcher,\n retriever: retrievalServices.retriever,\n retrievalOrchestrator: retrievalServices.retrievalOrchestrator,\n retrievalDisclosureService: retrievalServices.retrievalDisclosureService,\n retrievalAnalyticsService: retrievalServices.retrievalAnalyticsService,\n graduation,\n mdMirror,\n ingestService,\n queryService\n };\n}\n\nfunction defaultCreateSQLiteEventStore(\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n): SQLiteEventStore {\n return new SQLiteEventStore(dbPath, options);\n}\n\nfunction defaultCreateVectorStore(vectorsPath: string): VectorStore {\n return new VectorStore(vectorsPath);\n}\n\nfunction defaultCreateEmbedder(model: string): Embedder {\n return new Embedder(model);\n}\n\nfunction defaultCreateMarkdownMirror(cwd: string): MarkdownMirror {\n return new MarkdownMirror(cwd);\n}\n\nfunction defaultCreateGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return createGraduationPipeline(eventStore);\n}\n", "/**\n * Local Embedding Generator using @huggingface/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\ntype FeatureExtractionPipelineFactory = (\n task: 'feature-extraction',\n model: string\n) => Promise<NonNullable<Embedder['pipeline']>>;\n\nexport const DEFAULT_EMBEDDING_MODEL = 'Xenova/multilingual-e5-small';\nexport const DEFAULT_EMBEDDING_FALLBACK_MODEL = 'intfloat/multilingual-e5-small';\n\nexport class Embedder {\n private pipeline: ((input: string, options?: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n private readonly modelName: string;\n private activeModelName: string;\n private initialized = false;\n\n constructor(modelName: string = DEFAULT_EMBEDDING_MODEL) {\n this.modelName = modelName;\n this.activeModelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const pipeline = await withSuppressedKnownTransformersWarnings(async () => {\n try {\n return await loadTransformersPipeline();\n } catch (error) {\n if (isMissingTransformersDependencyError(error)) {\n throw createEmbeddingBackendUnavailableError(error);\n }\n throw error;\n }\n });\n\n try {\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', this.modelName));\n this.activeModelName = this.modelName;\n this.initialized = true;\n return;\n } catch (primaryError) {\n const fallbackModel = process.env.CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL || DEFAULT_EMBEDDING_FALLBACK_MODEL;\n if (fallbackModel === this.modelName) {\n throw primaryError;\n }\n\n console.warn(`[Embedder] Primary model failed (${this.modelName}). Falling back to ${fallbackModel}`);\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', fallbackModel));\n this.activeModelName = fallbackModel;\n this.initialized = true;\n }\n }\n\n // ~4 chars per token; 512 tokens * 4 = 2048, use 2000 to be safe\n private static readonly MAX_CHARS = 2000;\n\n private truncate(text: string): string {\n return text.length > Embedder.MAX_CHARS ? text.slice(0, Embedder.MAX_CHARS) : text;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n return {\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n results.push({\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.activeModelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n const envModel = process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder(envModel || undefined);\n }\n return defaultEmbedder;\n}\n\nlet transformersWarningSuppressionDepth = 0;\nlet originalConsoleWarn: typeof console.warn | null = null;\n\nexport async function withSuppressedKnownTransformersWarnings<T>(fn: () => Promise<T>): Promise<T> {\n if (transformersWarningSuppressionDepth === 0) {\n originalConsoleWarn = console.warn;\n console.warn = (...args: unknown[]) => {\n const message = args.map(String).join(' ');\n if (isKnownBenignTransformersWarning(message)) return;\n (originalConsoleWarn ?? console.warn)(...args);\n };\n }\n transformersWarningSuppressionDepth += 1;\n\n try {\n return await fn();\n } finally {\n transformersWarningSuppressionDepth -= 1;\n if (transformersWarningSuppressionDepth === 0 && originalConsoleWarn) {\n console.warn = originalConsoleWarn;\n originalConsoleWarn = null;\n }\n }\n}\n\nexport function isKnownBenignTransformersWarning(message: string): boolean {\n return message.includes('Unknown model class \"eurobert\"') ||\n message.includes('dtype not specified for \"model\"');\n}\n\nexport function isMissingTransformersDependencyError(error: unknown): boolean {\n const maybeError = error as { code?: unknown; message?: unknown } | null;\n const message = typeof maybeError?.message === 'string' ? maybeError.message : '';\n return maybeError?.code === 'ERR_MODULE_NOT_FOUND' &&\n message.includes(\"@huggingface/transformers\");\n}\n\nexport function createEmbeddingBackendUnavailableError(cause: unknown): Error & { cause?: unknown } {\n const error = new Error(\n [\n 'Required embedding backend is not installed.',\n '',\n 'Claude Memory Layer requires @huggingface/transformers for local semantic/vector embeddings.',\n 'The backend runs on CPU-only ONNX Runtime; CUDA is not required.',\n 'Reinstall globally with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install -g claude-memory-layer@latest',\n '',\n 'If you are inside a local checkout or package directory, repair only the backend with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --no-save --no-package-lock --omit=dev @huggingface/transformers@3.8.1'\n ].join('\\n')\n ) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n}\n\nasync function loadTransformersPipeline(): Promise<FeatureExtractionPipelineFactory> {\n // Keep @huggingface/transformers lazy so importing MemoryService or pure\n // adapter helpers does not eagerly dlopen onnxruntime native bindings.\n const dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n ) => Promise<{ pipeline: unknown }>;\n const transformers = await dynamicImport('@huggingface/transformers');\n return transformers.pipeline as FeatureExtractionPipelineFactory;\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n // Track which sessions have accessed each event\n private readonly sessionAccesses: Map<string, Set<string>> = new Map();\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n // Track sessions that have accessed this event\n if (!this.sessionAccesses.has(eventId)) {\n this.sessionAccesses.set(eventId, new Set());\n }\n const sessions = this.sessionAccesses.get(eventId)!;\n const isNewSession = !sessions.has(fromSessionId);\n sessions.add(fromSessionId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Update cross-session references count\n if (isNewSession && sessions.size > 1) {\n existing.crossSessionRefs = sessions.size - 1;\n }\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const eventId of this.metrics.keys()) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryMatch,\n MatchResult,\n MatchConfidence\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n result.score, // Reuse the retrieval score as lexical/proxy score when no separate FTS score is provided.\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { MemoryEventInput } from './types.js';\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nfunction getAtPath(obj: Record<string, unknown> | undefined, dotted: string): unknown {\n if (!obj) return undefined;\n return dotted.split('.').reduce<unknown>((acc, key) => {\n if (!acc || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEventInput): string {\n const meta = event.metadata as Record<string, unknown> | undefined;\n\n const namespaceRaw = getAtPath(meta, 'namespace') ?? getAtPath(meta, 'scope.namespace') ?? event.eventType;\n const namespace = sanitizeSegment(typeof namespaceRaw === 'string' ? namespaceRaw : undefined, 'general');\n\n const categoryRaw = getAtPath(meta, 'categoryPath') ?? getAtPath(meta, 'scope.categoryPath');\n const categoryPath = Array.isArray(categoryRaw) && categoryRaw.length > 0\n ? categoryRaw.map((x) => sanitizeSegment(typeof x === 'string' ? x : undefined, 'uncategorized'))\n : ['uncategorized'];\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categoryPath, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEventInput, eventId?: string): Promise<void> {\n const out = buildMirrorPath(this.rootDir, event);\n fs.mkdirSync(path.dirname(out), { recursive: true });\n\n const lines = [\n '',\n `## ${event.timestamp.toISOString()} | ${eventId ?? 'pending-id'}`,\n `- type: ${event.eventType}`,\n `- session: ${event.sessionId}`,\n event.content,\n ];\n\n await fs.promises.appendFile(out, lines.join('\\n'), 'utf8');\n await this.refreshIndex();\n }\n\n private async refreshIndex(): Promise<void> {\n const memoryRoot = path.join(this.rootDir, 'memory');\n await fs.promises.mkdir(memoryRoot, { recursive: true });\n\n const files: string[] = [];\n await this.walk(memoryRoot, files);\n\n const mdFiles = files\n .filter((f) => f.endsWith('.md'))\n .map((f) => path.relative(this.rootDir, f))\n .filter((rel) => rel !== path.join('memory', '_index.md'))\n .sort();\n\n const index = [\n '# Memory Index',\n '',\n 'Generated automatically by MarkdownMirror.',\n '',\n ...mdFiles.map((rel) => `- ${rel}`),\n '',\n ].join('\\n');\n\n await fs.promises.writeFile(path.join(memoryRoot, '_index.md'), index, 'utf8');\n }\n\n private async walk(dir: string, out: string[]): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await this.walk(full, out);\n } else {\n out.push(full);\n }\n }\n }\n}\n", "/**\n * SQLite-based EventStore implementation\n * Primary store for hooks - WAL mode enables concurrent access\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport {\n createSQLiteDatabase,\n sqliteRun,\n sqliteAll,\n sqliteGet,\n sqliteClose,\n sqliteExec,\n toDateFromSQLite,\n toSQLiteTimestamp,\n type SQLiteDatabase,\n type SQLiteOptions\n} from './sqlite-wrapper.js';\nimport { MarkdownMirror } from './markdown-mirror.js';\n\nexport interface SQLiteEventStoreOptions extends SQLiteOptions {\n markdownMirrorRoot?: string;\n}\n\nexport class SQLiteEventStore {\n private db: SQLiteDatabase;\n private initialized = false;\n private readonly readOnly: boolean;\n private readonly markdownMirror: MarkdownMirror | null;\n\n constructor(dbPath: string, options?: SQLiteEventStoreOptions) {\n this.readOnly = options?.readonly ?? false;\n this.db = createSQLiteDatabase(dbPath, {\n readonly: this.readOnly,\n walMode: !this.readOnly\n });\n this.markdownMirror = this.readOnly || !options?.markdownMirrorRoot\n ? null\n : new MarkdownMirror(options.markdownMirrorRoot);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In read-only mode, skip schema creation\n if (this.readOnly) {\n this.initialized = true;\n return;\n }\n\n // Create all tables in a single exec for efficiency\n sqliteExec(this.db, `\n -- L0 EventStore: Single Source of Truth (immutable, append-only)\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n dedupe_key TEXT UNIQUE,\n metadata TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed_at TEXT\n );\n\n -- Dedup table for idempotency\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Session metadata\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n project_path TEXT,\n summary TEXT,\n tags TEXT\n );\n\n -- Insights (derived data, rebuildable)\n CREATE TABLE IF NOT EXISTS insights (\n id TEXT PRIMARY KEY,\n insight_type TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n confidence REAL,\n source_events TEXT,\n created_at TEXT,\n last_updated TEXT\n );\n\n -- Embedding Outbox (Single-Writer Pattern)\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n content TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n processed_at TEXT,\n error_message TEXT\n );\n\n -- Projection offset tracking\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory level tracking\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id TEXT PRIMARY KEY,\n level TEXT NOT NULL DEFAULT 'L0',\n promoted_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entries (immutable memory units)\n CREATE TABLE IF NOT EXISTS entries (\n entry_id TEXT PRIMARY KEY,\n created_ts TEXT NOT NULL,\n entry_type TEXT NOT NULL,\n title TEXT NOT NULL,\n content_json TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT DEFAULT 'active',\n superseded_by TEXT,\n build_id TEXT,\n evidence_json TEXT,\n canonical_key TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entities (task/condition/artifact)\n CREATE TABLE IF NOT EXISTS entities (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n title TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT NOT NULL DEFAULT 'active',\n current_json TEXT NOT NULL,\n title_norm TEXT,\n search_text TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entity aliases for canonical key lookup\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n is_primary INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n PRIMARY KEY(entity_type, canonical_key)\n );\n\n -- Edges (relationships between entries/entities)\n CREATE TABLE IF NOT EXISTS edges (\n edge_id TEXT PRIMARY KEY,\n src_type TEXT NOT NULL,\n src_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n meta_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Vector Outbox V2 Table\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id TEXT PRIMARY KEY,\n item_kind TEXT NOT NULL,\n item_id TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n error TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(item_kind, item_id, embedding_version)\n );\n\n -- Build Runs\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n extractor_model TEXT NOT NULL,\n extractor_prompt_hash TEXT NOT NULL,\n embedder_model TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n idris_version TEXT NOT NULL,\n schema_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n error TEXT\n );\n\n -- Pipeline Metrics\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id TEXT PRIMARY KEY,\n ts TEXT NOT NULL,\n stage TEXT NOT NULL,\n latency_ms REAL NOT NULL,\n success INTEGER NOT NULL,\n error TEXT,\n session_id TEXT\n );\n\n -- Working Set table (active memory window)\n CREATE TABLE IF NOT EXISTS working_set (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n added_at TEXT DEFAULT (datetime('now')),\n relevance_score REAL DEFAULT 1.0,\n topics TEXT,\n expires_at TEXT\n );\n\n -- Consolidated Memories table (long-term integrated memories)\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id TEXT PRIMARY KEY,\n summary TEXT NOT NULL,\n topics TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n accessed_at TEXT,\n access_count INTEGER DEFAULT 0\n );\n\n -- Continuity Log table (tracks context transitions)\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id TEXT PRIMARY KEY,\n from_context_id TEXT,\n to_context_id TEXT,\n continuity_score REAL,\n transition_type TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Consolidated Rules table (long-term stable memory)\n CREATE TABLE IF NOT EXISTS consolidated_rules (\n rule_id TEXT PRIMARY KEY,\n rule TEXT NOT NULL,\n topics TEXT,\n source_memory_ids TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Endless Mode Config table\n CREATE TABLE IF NOT EXISTS endless_config (\n key TEXT PRIMARY KEY,\n value TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Helpfulness tracking\n CREATE TABLE IF NOT EXISTS memory_helpfulness (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n retrieval_score REAL DEFAULT 0,\n query_preview TEXT,\n session_continued INTEGER DEFAULT 0,\n prompt_count_after INTEGER DEFAULT 0,\n tool_success_count INTEGER DEFAULT 0,\n tool_total_count INTEGER DEFAULT 0,\n was_reasked INTEGER DEFAULT 0,\n helpfulness_score REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n measured_at TEXT\n );\n\n -- Retrieval trace log (query -> candidates -> selected for context)\n CREATE TABLE IF NOT EXISTS retrieval_traces (\n trace_id TEXT PRIMARY KEY,\n session_id TEXT,\n project_hash TEXT,\n query_text TEXT NOT NULL,\n strategy TEXT,\n candidate_event_ids TEXT,\n selected_event_ids TEXT,\n candidate_details_json TEXT,\n selected_details_json TEXT,\n candidate_count INTEGER DEFAULT 0,\n selected_count INTEGER DEFAULT 0,\n confidence TEXT,\n fallback_trace TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Sync position tracking (for SQLite -> DuckDB sync)\n CREATE TABLE IF NOT EXISTS sync_positions (\n target_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Create indexes\n CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type);\n CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage);\n CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);\n CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type);\n CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score);\n CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence);\n CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at);\n CREATE INDEX IF NOT EXISTS idx_consolidated_rules_confidence ON consolidated_rules(confidence);\n CREATE INDEX IF NOT EXISTS idx_embedding_outbox_status ON embedding_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_event ON memory_helpfulness(event_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_session ON memory_helpfulness(session_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_score ON memory_helpfulness(helpfulness_score DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_created_at ON retrieval_traces(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_project_hash ON retrieval_traces(project_hash);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_session_id ON retrieval_traces(session_id);\n\n -- FTS5 Full-Text Search for fast keyword search\n CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n -- Triggers to keep FTS in sync with events table\n CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n\n // Best-effort forward migration for retrieval trace detail column\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN selected_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN candidate_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n\n // Migrate existing events table to add new columns if they don't exist\n // Check if columns exist before trying to add them\n const tableInfo = sqliteAll(this.db, \"PRAGMA table_info(events)\", []);\n const columnNames = tableInfo.map((col: any) => col.name);\n\n if (!columnNames.includes('access_count')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN access_count INTEGER DEFAULT 0;\n `);\n } catch (err: any) {\n console.error('Error adding access_count column:', err);\n }\n }\n\n if (!columnNames.includes('last_accessed_at')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN last_accessed_at TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding last_accessed_at column:', err);\n }\n }\n\n // Add turn_id column for grouping events within a conversation turn\n if (!columnNames.includes('turn_id')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN turn_id TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding turn_id column:', err);\n }\n }\n\n // Create indexes for new columns if they don't exist\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_access_count ON events(access_count DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_last_accessed ON events(last_accessed_at DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_turn_id ON events(turn_id);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (Append-only, Idempotent)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = sqliteGet<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing) {\n return {\n success: true,\n eventId: existing.event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = toSQLiteTimestamp(input.timestamp);\n\n try {\n // Extract turnId from metadata if present\n const metadata = input.metadata || {};\n const turnId = (metadata.turnId as string) || null;\n\n // Use transaction for atomicity\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n const transaction = this.db.transaction(() => {\n insertEvent.run(\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId\n );\n insertDedup.run(dedupeKey, id);\n insertLevel.run(id);\n });\n\n transaction();\n\n if (this.markdownMirror) {\n const event: MemoryEvent = {\n id,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey,\n dedupeKey,\n metadata\n };\n this.markdownMirror.append(event).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get session IDs that have events but no session_summary event.\n * Used to backfill summaries for sessions that ended without Stop hook.\n */\n async getSessionsWithoutSummary(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT e.session_id\n FROM events e\n WHERE e.session_id != ?\n AND e.event_type != 'session_summary'\n AND e.session_id NOT IN (\n SELECT DISTINCT session_id FROM events WHERE event_type = 'session_summary'\n )\n GROUP BY e.session_id\n HAVING COUNT(*) >= 3\n ORDER BY MAX(e.timestamp) DESC\n LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n return this.rowToEvent(row);\n }\n\n /**\n * Get events since a timestamp (for sync)\n */\n async getEventsSince(timestamp: string, limit: number = 1000): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE timestamp > ? ORDER BY timestamp ASC LIMIT ?`,\n [timestamp, limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get events since a SQLite rowid (for robust incremental replication).\n * Rowid is monotonic for append-only tables, independent of client timestamps.\n */\n async getEventsSinceRowid(\n lastRowid: number,\n limit: number = 1000\n ): Promise<Array<{ rowid: number; event: MemoryEvent }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT rowid as _rowid, * FROM events WHERE rowid > ? ORDER BY rowid ASC LIMIT ?`,\n [lastRowid, limit]\n );\n\n return rows.map(row => ({\n rowid: row._rowid as number,\n event: this.rowToEvent(row)\n }));\n }\n\n /**\n * Import events with fixed IDs (used for cross-machine replication).\n * Idempotent: skips if event id or dedupeKey already exists.\n *\n * NOTE: This bypasses the append() id generation to preserve stable IDs.\n */\n async importEvents(events: MemoryEvent[]): Promise<{ inserted: number; skipped: number }> {\n if (events.length === 0) return { inserted: 0, skipped: 0 };\n if (this.readOnly) return { inserted: 0, skipped: events.length };\n\n await this.initialize();\n\n const getById = this.db.prepare(`SELECT id FROM events WHERE id = ?`);\n const getByDedupe = this.db.prepare(`SELECT event_id FROM event_dedup WHERE dedupe_key = ?`);\n\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n let inserted = 0;\n let skipped = 0;\n const insertedEvents: MemoryEvent[] = [];\n\n const tx = this.db.transaction((batch: MemoryEvent[]) => {\n for (const ev of batch) {\n // Skip if already present by id\n const existingById = getById.get(ev.id) as { id: string } | undefined;\n if (existingById) {\n skipped++;\n continue;\n }\n\n const canonicalKey = ev.canonicalKey || makeCanonicalKey(ev.content);\n const dedupeKey = ev.dedupeKey || makeDedupeKey(ev.content, ev.sessionId);\n\n // Skip if already present by dedupe key\n const existingByDedupe = getByDedupe.get(dedupeKey) as { event_id: string } | undefined;\n if (existingByDedupe) {\n skipped++;\n continue;\n }\n\n const metadata = ev.metadata || {};\n const turnId = (metadata as any).turnId as string | undefined;\n\n insertEvent.run(\n ev.id,\n ev.eventType,\n ev.sessionId,\n toSQLiteTimestamp(ev.timestamp),\n ev.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId ?? null\n );\n\n insertDedup.run(dedupeKey, ev.id);\n insertLevel.run(ev.id);\n inserted++;\n insertedEvents.push(ev);\n }\n });\n\n tx(events);\n\n if (this.markdownMirror && insertedEvents.length > 0) {\n for (const ev of insertedEvents) {\n this.markdownMirror.append(ev).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n }\n\n return { inserted, skipped };\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = sqliteGet<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (!existing) {\n sqliteRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n toSQLiteTimestamp(session.startedAt || new Date()),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(toSQLiteTimestamp(session.endedAt));\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n sqliteRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n\n return {\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Add to embedding outbox\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n const pending = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox SET status = 'processing' WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDateFromSQLite(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Clear embedding outbox (used for embedding model migration)\n */\n async clearEmbeddingOutbox(): Promise<void> {\n await this.initialize();\n sqliteRun(this.db, `DELETE FROM embedding_outbox`);\n }\n\n /**\n * Count total events\n */\n async countEvents(): Promise<number> {\n await this.initialize();\n const row = sqliteGet<{ count: number }>(this.db, `SELECT COUNT(*) as count FROM events`);\n return row?.count || 0;\n }\n\n /**\n * Get events page in timestamp ascending order (stable migration/reindex scans)\n */\n async getEventsPage(limit: number = 1000, offset: number = 0): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp ASC LIMIT ? OFFSET ?`,\n [limit, offset]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n\n /**\n * Get embedding/vector outbox health statistics\n */\n async getOutboxStats(): Promise<{\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n }> {\n await this.initialize();\n\n const embeddingRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM embedding_outbox GROUP BY status`\n );\n const vectorRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM vector_outbox GROUP BY status`\n );\n\n const fromRows = (rows: Array<{ status: string; count: number }>) => {\n const out = { pending: 0, processing: 0, failed: 0, total: 0 };\n for (const row of rows) {\n const key = row.status as 'pending' | 'processing' | 'failed' | 'done';\n if (key === 'pending' || key === 'processing' || key === 'failed') {\n out[key] += row.count;\n }\n out.total += row.count;\n }\n return out;\n };\n\n return {\n embedding: fromRows(embeddingRows),\n vector: fromRows(vectorRows)\n };\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = datetime('now') WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = sqliteAll<{ level: string; count: number }>(\n this.db,\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM events e\n INNER JOIN memory_levels ml ON e.id = ml.event_id\n WHERE ml.level = ?\n ORDER BY e.timestamp DESC\n LIMIT ? OFFSET ?`,\n [level, limit, offset]\n );\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n\n const row = sqliteGet<{ level: string }>(\n this.db,\n `SELECT level FROM memory_levels WHERE event_id = ?`,\n [eventId]\n );\n\n return row ? row.level : null;\n }\n\n /**\n * Get sync position for a target\n */\n async getSyncPosition(targetName: string): Promise<{ lastEventId: string | null; lastTimestamp: string | null }> {\n await this.initialize();\n\n const row = sqliteGet<{ last_event_id: string | null; last_timestamp: string | null }>(\n this.db,\n `SELECT last_event_id, last_timestamp FROM sync_positions WHERE target_name = ?`,\n [targetName]\n );\n\n return {\n lastEventId: row?.last_event_id ?? null,\n lastTimestamp: row?.last_timestamp ?? null\n };\n }\n\n /**\n * Update sync position for a target\n */\n async updateSyncPosition(targetName: string, lastEventId: string, lastTimestamp: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO sync_positions (target_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, datetime('now'))`,\n [targetName, lastEventId, lastTimestamp]\n );\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const row = sqliteGet<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (!row) return null;\n return JSON.parse(row.value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, datetime('now'))`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Increment access count for events\n */\n async incrementAccessCount(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0 || this.readOnly) return;\n\n await this.initialize();\n\n const placeholders = eventIds.map(() => '?').join(',');\n const currentTime = toSQLiteTimestamp(new Date());\n\n sqliteRun(\n this.db,\n `UPDATE events\n SET access_count = access_count + 1,\n last_accessed_at = ?\n WHERE id IN (${placeholders})`,\n [currentTime, ...eventIds]\n );\n }\n\n /**\n * Get most accessed memories (falls back to recent events if none accessed)\n */\n async getMostAccessed(limit: number = 10): Promise<MemoryEvent[]> {\n await this.initialize();\n\n // First try events with access_count > 0\n let rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE access_count > 0\n ORDER BY access_count DESC, last_accessed_at DESC\n LIMIT ?`,\n [limit]\n );\n\n // Fallback: if no accessed events, show recent events\n if (rows.length === 0) {\n rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n ORDER BY timestamp DESC\n LIMIT ?`,\n [limit]\n );\n }\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_helpfulness (id, event_id, session_id, retrieval_score, query_preview, created_at)\n VALUES (?, ?, ?, ?, ?, datetime('now'))`,\n [id, eventId, sessionId, score, query.slice(0, 100)]\n );\n }\n\n /**\n * Get session IDs that have unevaluated retrievals (measured_at IS NULL).\n * Excludes the current session. Used to backfill sessions that ended without Stop hook.\n */\n async getUnevaluatedSessions(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT session_id FROM memory_helpfulness\n WHERE measured_at IS NULL AND session_id != ?\n ORDER BY created_at DESC LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Evaluate helpfulness for all retrievals in a session\n * Called at session end - uses behavioral signals to compute score\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n // Get all retrieval records for this session\n const retrievals = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM memory_helpfulness WHERE session_id = ? AND measured_at IS NULL`,\n [sessionId]\n );\n\n if (retrievals.length === 0) return;\n\n // Get session events to analyze behavior after retrieval\n const sessionEvents = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n const promptEvents = sessionEvents.filter((e: any) => e.event_type === 'user_prompt');\n const toolEvents = sessionEvents.filter((e: any) => e.event_type === 'tool_observation');\n\n // Count successful vs failed tools\n let toolSuccessCount = 0;\n let toolTotalCount = toolEvents.length;\n for (const t of toolEvents) {\n try {\n const content = JSON.parse(t.content as string);\n if (content.success !== false) toolSuccessCount++;\n } catch {\n toolSuccessCount++; // Assume success if can't parse\n }\n }\n const toolSuccessRatio = toolTotalCount > 0 ? toolSuccessCount / toolTotalCount : 0.5;\n\n for (const retrieval of retrievals) {\n const retrievalTime = retrieval.created_at as string;\n\n // 1. Session continued after retrieval?\n const eventsAfter = sessionEvents.filter((e: any) => e.timestamp > retrievalTime);\n const sessionContinued = eventsAfter.length > 0 ? 1 : 0;\n\n // 2. How many prompts came after?\n const promptsAfter = promptEvents.filter((e: any) => e.timestamp > retrievalTime);\n const promptCountAfter = promptsAfter.length;\n\n // 3. Was a similar query asked again? (simple word overlap check)\n const queryWords = new Set((retrieval.query_preview as string || '').toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n let wasReasked = 0;\n for (const p of promptsAfter) {\n const pWords = new Set((p.content as string).toLowerCase().split(/\\s+/).filter((w: string) => w.length > 2));\n let overlap = 0;\n for (const w of queryWords) {\n if (pWords.has(w)) overlap++;\n }\n if (queryWords.size > 0 && overlap / queryWords.size > 0.5) {\n wasReasked = 1;\n break;\n }\n }\n\n // Calculate helpfulness score\n // Weights tuned for shopping-assistant-like corpora where sessions\n // continue on the same topic (was_reasked was over-penalising normal conversation flow)\n const retrievalScore = retrieval.retrieval_score as number || 0;\n // More prompts after retrieval = memory was actually useful to the conversation\n const promptNorm = Math.min(promptCountAfter / 2, 1.0);\n const helpfulnessScore = (\n 0.40 * Math.min(retrievalScore, 1.0) +\n 0.30 * promptNorm +\n 0.20 * toolSuccessRatio +\n 0.10 * (sessionContinued ? 1.0 : 0.0)\n );\n\n sqliteRun(\n this.db,\n `UPDATE memory_helpfulness\n SET session_continued = ?, prompt_count_after = ?,\n tool_success_count = ?, tool_total_count = ?,\n was_reasked = ?, helpfulness_score = ?,\n measured_at = datetime('now')\n WHERE id = ?`,\n [sessionContinued, promptCountAfter, toolSuccessCount, toolTotalCount,\n wasReasked, helpfulnessScore, retrieval.id]\n );\n }\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<Array<{\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT\n mh.event_id,\n AVG(mh.helpfulness_score) as avg_score,\n COUNT(*) as eval_count,\n e.content,\n e.access_count\n FROM memory_helpfulness mh\n JOIN events e ON e.id = mh.event_id\n WHERE mh.measured_at IS NOT NULL\n GROUP BY mh.event_id\n ORDER BY avg_score DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(r => ({\n eventId: r.event_id as string,\n summary: (r.content as string).substring(0, 200) + ((r.content as string).length > 200 ? '...' : ''),\n helpfulnessScore: Math.round((r.avg_score as number) * 100) / 100,\n accessCount: (r.access_count as number) || 0,\n evaluationCount: r.eval_count as number\n }));\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(): Promise<{\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n }> {\n await this.initialize();\n\n const stats = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n AVG(helpfulness_score) as avg_score,\n COUNT(*) as total_evaluated,\n SUM(CASE WHEN helpfulness_score >= 0.7 THEN 1 ELSE 0 END) as helpful,\n SUM(CASE WHEN helpfulness_score >= 0.4 AND helpfulness_score < 0.7 THEN 1 ELSE 0 END) as neutral,\n SUM(CASE WHEN helpfulness_score < 0.4 THEN 1 ELSE 0 END) as unhelpful\n FROM memory_helpfulness\n WHERE measured_at IS NOT NULL`\n );\n\n const totalRow = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT COUNT(*) as total FROM memory_helpfulness`\n );\n\n return {\n avgScore: Math.round(((stats?.avg_score as number) || 0) * 100) / 100,\n totalEvaluated: (stats?.total_evaluated as number) || 0,\n totalRetrievals: (totalRow?.total as number) || 0,\n helpful: (stats?.helpful as number) || 0,\n neutral: (stats?.neutral as number) || 0,\n unhelpful: (stats?.unhelpful as number) || 0\n };\n }\n\n /**\n * Fast keyword search using FTS5\n * Returns events matching the search query, ranked by relevance\n */\n async keywordSearch(query: string, limit: number = 10): Promise<Array<{event: MemoryEvent; rank: number}>> {\n await this.initialize();\n\n // Escape special FTS5 characters and prepare search terms\n const searchTerms = query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ') // Remove special chars\n .split(/\\s+/)\n .filter(term => term.length > 1) // Filter short terms\n .map(term => `\"${term}\"*`) // Prefix matching\n .join(' OR ');\n\n if (!searchTerms) {\n return [];\n }\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.*, fts.rank\n FROM events_fts fts\n JOIN events e ON e.id = fts.event_id\n WHERE events_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`,\n [searchTerms, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: row.rank as number\n }));\n } catch (error: any) {\n // FTS table might not exist yet (old database)\n // Fallback to LIKE search\n const likePattern = `%${query}%`;\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT *, 0 as rank FROM events\n WHERE content LIKE ?\n ORDER BY timestamp DESC\n LIMIT ?`,\n [likePattern, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: 0\n }));\n }\n }\n\n /**\n * Rebuild FTS index from existing events\n * Call this once after upgrading to FTS5\n */\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n\n // Get count of events to index\n const countRow = sqliteGet<{count: number}>(this.db, 'SELECT COUNT(*) as count FROM events', []);\n const totalEvents = countRow?.count ?? 0;\n\n // Clear and rebuild FTS index. Recreate the virtual table instead of\n // issuing DELETE against it: older migrated FTS5 tables/triggers can fail\n // with `no such column: T.event_id` when processing synthetic deletes.\n sqliteExec(this.db, `\n DROP TRIGGER IF EXISTS events_fts_insert;\n DROP TRIGGER IF EXISTS events_fts_delete;\n DROP TRIGGER IF EXISTS events_fts_update;\n DROP TABLE IF EXISTS events_fts;\n\n CREATE VIRTUAL TABLE events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n INSERT INTO events_fts(rowid, content, event_id)\n SELECT rowid, content, id FROM events;\n\n CREATE TRIGGER events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n return totalEvents;\n }\n\n /**\n * Get database instance for direct access\n */\n getDatabase(): SQLiteDatabase {\n return this.db;\n }\n\n\n async recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n selectedDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void> {\n await this.initialize();\n\n const traceId = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO retrieval_traces (\n trace_id, session_id, project_hash, query_text, strategy,\n candidate_event_ids, selected_event_ids, candidate_details_json, selected_details_json,\n candidate_count, selected_count, confidence, fallback_trace\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n traceId,\n input.sessionId || null,\n input.projectHash || null,\n input.queryText,\n input.strategy || null,\n JSON.stringify(input.candidateEventIds || []),\n JSON.stringify(input.selectedEventIds || []),\n JSON.stringify(input.candidateDetails || []),\n JSON.stringify(input.selectedDetails || []),\n (input.candidateEventIds || []).length,\n (input.selectedEventIds || []).length,\n input.confidence || null,\n JSON.stringify(input.fallbackTrace || [])\n ]\n );\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<Array<{\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n selectedDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n }>> {\n await this.initialize();\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n traceId: row.trace_id as string,\n sessionId: (row.session_id as string) || undefined,\n projectHash: (row.project_hash as string) || undefined,\n queryText: row.query_text as string,\n strategy: (row.strategy as string) || undefined,\n candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids as string) : [],\n selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids as string) : [],\n candidateDetails: row.candidate_details_json ? JSON.parse(row.candidate_details_json as string) : [],\n selectedDetails: row.selected_details_json ? JSON.parse(row.selected_details_json as string) : [],\n candidateCount: Number(row.candidate_count || 0),\n selectedCount: Number(row.selected_count || 0),\n confidence: (row.confidence as string) || undefined,\n fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace as string) : [],\n createdAt: toDateFromSQLite(row.created_at),\n }));\n } catch (err: any) {\n if (err?.message?.includes('no such table')) return [];\n throw err;\n }\n }\n\n async getRetrievalTraceStats(): Promise<{\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n }> {\n await this.initialize();\n\n try {\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n COUNT(*) as total_queries,\n AVG(candidate_count) as avg_candidate_count,\n AVG(selected_count) as avg_selected_count,\n CASE\n WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))\n ELSE 0\n END as selection_rate\n FROM retrieval_traces`,\n []\n );\n\n return {\n totalQueries: Number(row?.total_queries || 0),\n avgCandidateCount: Number(row?.avg_candidate_count || 0),\n avgSelectedCount: Number(row?.avg_selected_count || 0),\n selectionRate: Number(row?.selection_rate || 0),\n };\n } catch (err: any) {\n if (err?.message?.includes('no such table')) {\n return { totalQueries: 0, avgCandidateCount: 0, avgSelectedCount: 0, selectionRate: 0 };\n }\n throw err;\n }\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n sqliteClose(this.db);\n }\n\n /**\n * Get events grouped by turn_id for a session\n * Returns turns ordered by first event timestamp (newest first)\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n await this.initialize();\n\n const limit = options?.limit || 20;\n const offset = options?.offset || 0;\n\n // Get distinct turn_ids for this session, ordered by first event timestamp\n const turnRows = sqliteAll<{ turn_id: string; min_ts: string }>(\n this.db,\n `SELECT turn_id, MIN(timestamp) as min_ts\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n GROUP BY turn_id\n ORDER BY min_ts DESC\n LIMIT ? OFFSET ?`,\n [sessionId, limit, offset]\n );\n\n const turns: Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }> = [];\n\n for (const turnRow of turnRows) {\n const events = await this.getEventsByTurn(turnRow.turn_id);\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const hasResponse = events.some(e => e.eventType === 'agent_response');\n\n turns.push({\n turnId: turnRow.turn_id,\n events,\n startedAt: toDateFromSQLite(turnRow.min_ts),\n promptPreview: promptEvent\n ? promptEvent.content.slice(0, 200) + (promptEvent.content.length > 200 ? '...' : '')\n : '(no prompt)',\n eventCount: events.length,\n toolCount: toolEvents.length,\n hasResponse\n });\n }\n\n return turns;\n }\n\n /**\n * Get all events for a specific turn_id\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE turn_id = ? ORDER BY timestamp ASC`,\n [turnId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n\n const row = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(DISTINCT turn_id) as count\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL`,\n [sessionId]\n );\n\n return row?.count || 0;\n }\n\n /**\n * Migrate existing events: backfill turn_id for events that have turnId in metadata\n * but no turn_id column value (for events stored before this migration)\n */\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n\n // Find events with turnId in metadata JSON but no turn_id column value\n const rows = sqliteAll<{ id: string; metadata: string }>(\n this.db,\n `SELECT id, metadata FROM events\n WHERE turn_id IS NULL AND metadata IS NOT NULL AND metadata LIKE '%turnId%'`\n );\n\n let updated = 0;\n for (const row of rows) {\n try {\n const metadata = JSON.parse(row.metadata);\n if (metadata.turnId) {\n sqliteRun(\n this.db,\n `UPDATE events SET turn_id = ? WHERE id = ?`,\n [metadata.turnId, row.id]\n );\n updated++;\n }\n } catch {\n // Skip rows with invalid JSON\n }\n }\n\n return updated;\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n\n // Get event IDs first for cascading deletes\n const events = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE session_id = ?`,\n [sessionId]\n );\n\n if (events.length === 0) return 0;\n\n const eventIds = events.map(e => e.id);\n const placeholders = eventIds.map(() => '?').join(',');\n\n // Drop FTS triggers to prevent SQLITE_CORRUPT_VTAB during bulk delete\n const ftsTriggersDropped: string[] = [];\n for (const triggerName of ['events_fts_delete', 'events_fts_update', 'events_fts_insert']) {\n try {\n sqliteRun(this.db, `DROP TRIGGER IF EXISTS ${triggerName}`);\n ftsTriggersDropped.push(triggerName);\n } catch {\n // Trigger may not exist\n }\n }\n\n // Delete from related tables first (some may not exist depending on DB version)\n for (const table of ['event_dedup', 'memory_levels', 'embedding_queue', 'embedding_outbox', 'vector_outbox']) {\n try {\n sqliteRun(this.db, `DELETE FROM ${table} WHERE event_id IN (${placeholders})`, eventIds);\n } catch {\n // Table may not exist\n }\n }\n\n // Delete events\n const result = sqliteRun(this.db, `DELETE FROM events WHERE session_id = ?`, [sessionId]);\n\n // Rebuild FTS index if we dropped triggers\n if (ftsTriggersDropped.length > 0) {\n try {\n // Rebuild FTS from remaining events\n sqliteRun(this.db, `INSERT INTO events_fts(events_fts) VALUES('rebuild')`);\n\n // Recreate triggers\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n } catch {\n // FTS rebuild failed - non-critical, will be rebuilt on next initialize\n }\n }\n\n return result.changes || 0;\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n const event: any = {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDateFromSQLite(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n };\n\n // Include access tracking fields if present\n if (row.access_count !== undefined) {\n event.access_count = row.access_count;\n }\n if (row.last_accessed_at !== undefined) {\n event.last_accessed_at = row.last_accessed_at;\n }\n // Include turn_id if present\n if (row.turn_id !== undefined && row.turn_id !== null) {\n event.turn_id = row.turn_id;\n }\n\n return event;\n }\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * SQLite Wrapper with WAL Mode Support\n * Primary store for hooks - always available, no lock conflicts\n */\n\nimport Database from 'better-sqlite3';\nimport * as fs from 'fs';\nimport * as nodePath from 'path';\n\nexport type SQLiteDatabase = Database.Database;\n\nexport interface SQLiteOptions {\n readonly?: boolean;\n walMode?: boolean;\n}\n\n/**\n * Creates a new SQLite database with WAL mode\n */\nexport function createSQLiteDatabase(path: string, options?: SQLiteOptions): SQLiteDatabase {\n // Ensure parent directory exists\n const dir = nodePath.dirname(path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const db = new Database(path, {\n readonly: options?.readonly ?? false,\n });\n\n // Enable WAL mode for concurrent access (unless read-only)\n if (!options?.readonly && (options?.walMode ?? true)) {\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n }\n\n return db;\n}\n\n/**\n * Execute a statement that doesn't return rows (INSERT, UPDATE, DELETE)\n */\nexport function sqliteRun(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): Database.RunResult {\n const stmt = db.prepare(sql);\n return stmt.run(...params);\n}\n\n/**\n * Execute a query and return all rows\n */\nexport function sqliteAll<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T[] {\n const stmt = db.prepare(sql);\n return stmt.all(...params) as T[];\n}\n\n/**\n * Execute a query and return first row\n */\nexport function sqliteGet<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T | undefined {\n const stmt = db.prepare(sql);\n return stmt.get(...params) as T | undefined;\n}\n\n/**\n * Execute multiple statements (for schema creation)\n */\nexport function sqliteExec(db: SQLiteDatabase, sql: string): void {\n db.exec(sql);\n}\n\n/**\n * Close database connection\n */\nexport function sqliteClose(db: SQLiteDatabase): void {\n db.close();\n}\n\n/**\n * Run multiple statements in a transaction\n */\nexport function sqliteTransaction<T>(\n db: SQLiteDatabase,\n fn: () => T\n): T {\n return db.transaction(fn)();\n}\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDateFromSQLite(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\n/**\n * Convert Date to ISO string for SQLite storage\n */\nexport function toSQLiteTimestamp(date: Date): string {\n return date.toISOString();\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { MemoryEvent } from './types.js';\n\nconst DEFAULT_NAMESPACE = 'default';\nconst DEFAULT_CATEGORY = 'uncategorized';\n\nexport function sanitizeSegment(input: unknown, fallback: string): string {\n const raw = String(input ?? '').trim().toLowerCase();\n const safe = raw\n .normalize('NFKD')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n if (!safe || safe === '.' || safe === '..') return fallback;\n return safe;\n}\n\nfunction getCategorySegments(metadata: Record<string, unknown> | undefined, eventType: string): string[] {\n const raw = metadata?.categoryPath;\n if (Array.isArray(raw) && raw.length > 0) {\n return raw.map((s) => sanitizeSegment(s, DEFAULT_CATEGORY));\n }\n const single = metadata?.category;\n if (typeof single === 'string' && single.trim()) {\n return [sanitizeSegment(single, DEFAULT_CATEGORY)];\n }\n return [sanitizeSegment(eventType, DEFAULT_CATEGORY)];\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEvent): string {\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const namespace = sanitizeSegment(metadata?.namespace, DEFAULT_NAMESPACE);\n const categories = getCategorySegments(metadata, event.eventType);\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categories, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport function formatMirrorEntry(event: MemoryEvent): string {\n const category = Array.isArray((event.metadata as any)?.categoryPath)\n ? ((event.metadata as any).categoryPath as unknown[]).join('/')\n : String((event.metadata as any)?.category ?? event.eventType);\n\n return [\n '',\n `- ts: ${event.timestamp.toISOString()}`,\n ` id: ${event.id}`,\n ` type: ${event.eventType}`,\n ` session: ${event.sessionId}`,\n ` category: ${category}`,\n ' content: |',\n ...event.content.split('\\n').map((line) => ` ${line}`)\n ].join('\\n') + '\\n';\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEvent): Promise<string> {\n const outPath = buildMirrorPath(this.rootDir, event);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.appendFile(outPath, formatMirrorEntry(event), 'utf8');\n return outPath;\n }\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n // Try to open existing table\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n\n if (!this.table) {\n // Create table with first record (handle race condition)\n try {\n this.table = await this.db.createTable(this.tableName, [data]);\n } catch (e: any) {\n if (e?.message?.includes('already exists')) {\n this.table = await this.db.openTable(this.tableName);\n await this.table.add([data]);\n } else {\n throw e;\n }\n }\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n }));\n\n if (!this.table) {\n try {\n this.table = await this.db.createTable(this.tableName, data);\n } catch (e: any) {\n if (e?.message?.includes('already exists')) {\n this.table = await this.db.openTable(this.tableName);\n await this.table.add(data);\n } else {\n throw e;\n }\n }\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = '${sessionId}'`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Clear all vectors (used for embedding model migration)\n */\n async clearAll(): Promise<void> {\n await this.initialize();\n if (!this.db) return;\n\n try {\n if (typeof (this.db as any).dropTable === 'function') {\n await (this.db as any).dropTable(this.tableName);\n } else if (typeof (this.db as any).drop_table === 'function') {\n await (this.db as any).drop_table(this.tableName);\n }\n } catch {\n // Ignore if table does not exist\n }\n\n this.table = null;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "import type { MemoryEventInput } from './types.js';\n\nexport type IngestStage = 'before' | 'after' | 'error';\n\nexport interface IngestContext {\n stage: IngestStage;\n operation: 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n sessionId: string;\n event: MemoryEventInput;\n error?: Error;\n}\n\nexport type IngestInterceptor = (context: IngestContext) => Promise<void> | void;\n\nexport class IngestInterceptorRegistry {\n private before: IngestInterceptor[] = [];\n private after: IngestInterceptor[] = [];\n private onError: IngestInterceptor[] = [];\n\n registerBefore(interceptor: IngestInterceptor): () => void {\n this.before.push(interceptor);\n return () => {\n this.before = this.before.filter((i) => i !== interceptor);\n };\n }\n\n registerAfter(interceptor: IngestInterceptor): () => void {\n this.after.push(interceptor);\n return () => {\n this.after = this.after.filter((i) => i !== interceptor);\n };\n }\n\n registerOnError(interceptor: IngestInterceptor): () => void {\n this.onError.push(interceptor);\n return () => {\n this.onError = this.onError.filter((i) => i !== interceptor);\n };\n }\n\n async run(stage: IngestStage, context: Omit<IngestContext, 'stage'>): Promise<void> {\n const interceptors = stage === 'before'\n ? this.before\n : stage === 'after'\n ? this.after\n : this.onError;\n\n for (const interceptor of interceptors) {\n await interceptor({ ...context, stage });\n }\n }\n}\n\nexport function mergeHierarchicalMetadata(\n base: Record<string, unknown> | undefined,\n patch: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !patch) return undefined;\n if (!base) return patch;\n if (!patch) return base;\n\n const result: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n if (\n typeof current === 'object' && current !== null && !Array.isArray(current) &&\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ) {\n result[key] = mergeHierarchicalMetadata(\n current as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n", "export const TAG_NAMESPACES = {\n SYSTEM: 'sys:',\n QUALITY: 'q:',\n PROJECT: 'proj:',\n TOPIC: 'topic:',\n TEMPORAL: 't:',\n USER: 'user:',\n AGENT: 'agent:'\n} as const;\n\nexport const VALID_TAG_NAMESPACES = new Set<string>(Object.values(TAG_NAMESPACES));\n\nexport function parseTag(tag: string): { namespace?: string; value: string } {\n const value = (tag || '').trim();\n const idx = value.indexOf(':');\n if (idx <= 0) return { value };\n\n const namespace = `${value.slice(0, idx)}:`;\n const tagValue = value.slice(idx + 1);\n if (!tagValue) return { value };\n\n return { namespace, value: tagValue };\n}\n\nexport function validateTag(tag: string): boolean {\n const normalized = (tag || '').trim();\n if (!normalized) return false;\n\n const { namespace } = parseTag(normalized);\n if (!namespace) return true; // backward compatibility for legacy tags\n return VALID_TAG_NAMESPACES.has(namespace);\n}\n\nexport function withNamespace(value: string, namespace: string): string {\n const clean = parseTag(value).value.trim();\n return `${namespace}${clean}`;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n\n const dedup = new Set<string>();\n for (const item of tags) {\n if (typeof item !== 'string') continue;\n const normalized = item.trim();\n if (!validateTag(normalized)) continue;\n dedup.add(normalized);\n }\n\n return [...dedup];\n}\n", "import type { MemoryEvent } from '../types.js';\n\nexport interface SessionSummaryDerivation {\n text: string;\n metadata: {\n generated: 'rule-based';\n eventCount: number;\n };\n}\n\nconst MAX_FIRST_PROMPT_LENGTH = 120;\nconst MAX_TOOL_NAMES = 6;\n\nexport class SummaryDeriver {\n /**\n * Derive the current lightweight rule-based session summary from raw events.\n *\n * The deriver is intentionally pure: callers own persistence and lifecycle\n * orchestration, while this class owns summary text and metadata decisions.\n */\n deriveSessionSummary(events: MemoryEvent[]): SessionSummaryDerivation | null {\n if (events.length < 3) return null;\n if (events.some((event) => event.eventType === 'session_summary')) return null;\n\n const prompts = events.filter((event) => event.eventType === 'user_prompt');\n const toolObservations = events.filter((event) => event.eventType === 'tool_observation');\n const toolNames = Array.from(new Set(\n toolObservations\n .map((event) => this.asRecord(event.metadata).toolName)\n .filter((toolName): toolName is string => typeof toolName === 'string' && toolName.length > 0)\n ));\n const errorObservations = toolObservations.filter((event) => this.isErrorObservation(event));\n\n const datePart = events[0].timestamp.toISOString().split('T')[0];\n const parts: string[] = [`[${datePart}] ${prompts.length}\uD134 \uC138\uC158`];\n\n if (prompts.length > 0) {\n parts.push(`\uC8FC\uC694 \uC791\uC5C5: ${this.firstPromptPreview(prompts[0].content)}`);\n }\n if (toolNames.length > 0) {\n parts.push(`\uC0AC\uC6A9 \uD234: ${toolNames.slice(0, MAX_TOOL_NAMES).join(', ')}`);\n }\n if (errorObservations.length > 0) {\n parts.push(`\uC624\uB958 ${errorObservations.length}\uAC74 \uBC1C\uC0DD`);\n }\n\n return {\n text: parts.join('. '),\n metadata: { generated: 'rule-based', eventCount: events.length }\n };\n }\n\n private firstPromptPreview(content: string): string {\n return content.slice(0, MAX_FIRST_PROMPT_LENGTH).replace(/\\r?\\n/g, ' ');\n }\n\n private isErrorObservation(event: MemoryEvent): boolean {\n const metadata = this.asRecord(event.metadata);\n\n if (metadata.exitCode !== undefined) {\n return metadata.exitCode !== 0;\n }\n\n return metadata.success === false;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n }\n}\n\nexport function createSummaryDeriver(): SummaryDeriver {\n return new SummaryDeriver();\n}\n", "import {\n IngestInterceptor,\n IngestInterceptorRegistry,\n mergeHierarchicalMetadata\n} from '../ingest-interceptor.js';\nimport { normalizeTags } from '../tag-taxonomy.js';\nimport { createSummaryDeriver, type SummaryDeriver } from '../derive/summary-deriver.js';\nimport type { AppendResult, MemoryEvent, MemoryEventInput, ToolObservationPayload } from '../types.js';\n\ninterface SessionRecord {\n id: string;\n startedAt?: Date;\n endedAt?: Date;\n projectPath?: string;\n summary?: string;\n}\n\ninterface SessionUpsertStore {\n upsertSession(session: SessionRecord): Promise<void>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getSessionsWithoutSummary(currentSessionId: string, limit?: number): Promise<string[]>;\n}\n\ninterface IngestEventStore extends SessionUpsertStore {\n append(input: MemoryEventInput): Promise<AppendResult>;\n enqueueForEmbedding(eventId: string, content: string): Promise<unknown>;\n}\n\ninterface IngestMarkdownMirror {\n append(event: MemoryEventInput, eventId?: string): Promise<void>;\n}\n\nexport type IngestOperation = 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n\nexport interface MemoryIngestServiceOptions {\n initialize: () => Promise<void>;\n eventStore: IngestEventStore;\n markdownMirror: IngestMarkdownMirror;\n createToolEmbedding: (payload: ToolObservationPayload) => string;\n getProjectHash?: () => string | null;\n getProjectPath?: () => string | null;\n summaryDeriver?: SummaryDeriver;\n}\n\n/**\n * Thin-core ingest service for session lifecycle and event writes.\n *\n * Owns the ingest normalization/interceptor/append pipeline so the public\n * MemoryService facade can delegate ingest behavior without coordinating\n * storage-side effects itself.\n */\nexport class MemoryIngestService {\n private readonly initialize: () => Promise<void>;\n private readonly eventStore: IngestEventStore;\n private readonly markdownMirror: IngestMarkdownMirror;\n private readonly createToolEmbedding: (payload: ToolObservationPayload) => string;\n private readonly getProjectHash: () => string | null;\n private readonly getProjectPath: () => string | null;\n private readonly summaryDeriver: SummaryDeriver;\n private readonly ingestInterceptors = new IngestInterceptorRegistry();\n\n constructor(options: MemoryIngestServiceOptions) {\n this.initialize = options.initialize;\n this.eventStore = options.eventStore;\n this.markdownMirror = options.markdownMirror;\n this.createToolEmbedding = options.createToolEmbedding;\n this.getProjectHash = options.getProjectHash ?? (() => null);\n this.getProjectPath = options.getProjectPath ?? (() => null);\n this.summaryDeriver = options.summaryDeriver ?? createSummaryDeriver();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerOnError(interceptor);\n }\n\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n startedAt: new Date(),\n projectPath\n });\n }\n\n async endSession(sessionId: string, summary?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n endedAt: new Date(),\n summary\n });\n }\n\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'user_prompt',\n input: {\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'agent_response',\n input: {\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'session_summary',\n input: {\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary,\n metadata\n },\n embeddingContent: summary\n });\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n await this.initialize();\n\n const recentSessionIds = await this.eventStore.getSessionsWithoutSummary(currentSessionId, limit);\n for (const sessionId of recentSessionIds) {\n try {\n await this.generateSessionSummary(sessionId);\n } catch {\n // non-critical backfill path\n }\n }\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Skips short sessions and sessions that already contain a summary event.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n await this.initialize();\n\n const events = await this.eventStore.getSessionEvents(sessionId);\n const summary = this.summaryDeriver.deriveSessionSummary(events);\n if (!summary) return;\n\n await this.storeSessionSummary(sessionId, summary.text, summary.metadata);\n }\n\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n const content = JSON.stringify(payload);\n const turnId = (payload.metadata as Record<string, unknown> | undefined)?.turnId;\n\n return this.ingestEvent({\n operation: 'tool_observation',\n input: {\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success,\n ...(typeof turnId === 'string' && turnId.length > 0 ? { turnId } : {})\n }\n },\n embeddingContent: this.createToolEmbedding(payload)\n });\n }\n\n private async ingestEvent(options: {\n operation: IngestOperation;\n input: MemoryEventInput;\n embeddingContent?: string;\n }): Promise<AppendResult> {\n const normalizedInput = this.normalizeInput(options.operation, options.input);\n\n await this.ingestInterceptors.run('before', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n try {\n const result = await this.eventStore.append(normalizedInput);\n if (result.success === false) {\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: new Error(result.error)\n });\n return result;\n }\n\n if (!result.isDuplicate) {\n if (options.embeddingContent) {\n await this.eventStore.enqueueForEmbedding(result.eventId, options.embeddingContent);\n }\n try {\n await this.markdownMirror.append(normalizedInput, result.eventId);\n } catch {\n // non-breaking markdown mirror write\n }\n }\n\n await this.ingestInterceptors.run('after', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n return result;\n } catch (error) {\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: normalizedError\n });\n throw error;\n }\n }\n\n private normalizeInput(operation: IngestOperation, input: MemoryEventInput): MemoryEventInput {\n const projectHash = this.getProjectHash();\n const projectPath = this.getProjectPath();\n const normalizedInput: MemoryEventInput = {\n ...input,\n metadata: mergeHierarchicalMetadata(\n {\n ingest: {\n operation,\n pipeline: 'default',\n ts: new Date().toISOString()\n },\n ...(projectHash\n ? {\n scope: {\n project: {\n hash: projectHash,\n ...(projectPath ? { path: projectPath } : {})\n }\n },\n tags: [`proj:${projectHash}`]\n }\n : {})\n },\n input.metadata\n )\n };\n\n if (projectHash && normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const currentTags = Array.isArray(meta.tags)\n ? meta.tags.filter((x): x is string => typeof x === 'string')\n : [];\n const projectTag = `proj:${projectHash}`;\n if (!currentTags.includes(projectTag)) {\n meta.tags = [...currentTags, projectTag];\n }\n }\n\n if (normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const normalizedTags = normalizeTags(meta.tags);\n if (normalizedTags.length > 0) {\n meta.tags = normalizedTags;\n }\n }\n\n return normalizedInput;\n }\n}\n", "import type { MemoryEvent } from '../types.js';\n\ninterface RankedKeywordResult {\n event: MemoryEvent;\n rank: number;\n}\n\nexport interface MemorySessionTurn {\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n}\n\nexport interface MemoryOutboxStats {\n embedding: { pending: number; processing: number; failed: number; total: number };\n vector: { pending: number; processing: number; failed: number; total: number };\n}\n\nexport interface MemoryStats {\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n}\n\ninterface QueryStore {\n keywordSearch(query: string, topK: number): Promise<RankedKeywordResult[]>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getRecentEvents(limit: number): Promise<MemoryEvent[]>;\n}\n\ninterface QueryMaintenanceStore extends QueryStore {\n rebuildFtsIndex(): Promise<number>;\n getOutboxStats(): Promise<MemoryOutboxStats>;\n getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]>;\n getEventLevel(eventId: string): Promise<string | null>;\n getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<MemorySessionTurn[]>;\n getEventsByTurn(turnId: string): Promise<MemoryEvent[]>;\n countSessionTurns(sessionId: string): Promise<number>;\n backfillTurnIds(): Promise<number>;\n deleteSessionEvents(sessionId: string): Promise<number>;\n}\n\ninterface MemoryQueryServiceDeps {\n vectorStore: { count(): Promise<number> };\n graduation: { getStats(): Promise<Array<{ level: string; count: number }>> };\n}\n\n/**\n * Thin-core query service for lightweight read and maintenance paths.\n *\n * Higher-level retrieval orchestration lives in RetrievalOrchestrator;\n * this service keeps storage-backed read models and maintenance delegates separate.\n */\nexport class MemoryQueryService {\n constructor(\n private readonly initialize: () => Promise<void>,\n private readonly queryStore: QueryStore,\n private readonly deps?: MemoryQueryServiceDeps\n ) {}\n\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{ event: MemoryEvent; score: number }>> {\n await this.initialize();\n\n const results = await this.queryStore.keywordSearch(query, options?.topK ?? 10);\n if (results.length === 0) return [];\n\n const maxRank = Math.min(...results.map((r) => r.rank), -0.001);\n const minRank = Math.max(...results.map((r) => r.rank), -1000);\n const rankRange = maxRank - minRank || 1;\n\n return results\n .map((r) => ({\n event: r.event,\n score: 1 - (r.rank - minRank) / rankRange\n }))\n .filter((r) => !options?.minScore || r.score >= options.minScore);\n }\n\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getSessionEvents(sessionId);\n }\n\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getRecentEvents(limit);\n }\n\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('rebuildFtsIndex').rebuildFtsIndex();\n }\n\n async getOutboxStats(): Promise<MemoryOutboxStats> {\n await this.initialize();\n return this.getMaintenanceStore('getOutboxStats').getOutboxStats();\n }\n\n async getStats(): Promise<MemoryStats> {\n await this.initialize();\n\n const deps = this.getStatsDeps();\n const recentEvents = await this.queryStore.getRecentEvents(10000);\n const vectorCount = await deps.vectorStore.count();\n const levelStats = await deps.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByLevel').getEventsByLevel(level, options);\n }\n\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n return this.getMaintenanceStore('getEventLevel').getEventLevel(eventId);\n }\n\n async getSessionTurns(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<MemorySessionTurn[]> {\n await this.initialize();\n return this.getMaintenanceStore('getSessionTurns').getSessionTurns(sessionId, options);\n }\n\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByTurn').getEventsByTurn(turnId);\n }\n\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('countSessionTurns').countSessionTurns(sessionId);\n }\n\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('backfillTurnIds').backfillTurnIds();\n }\n\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('deleteSessionEvents').deleteSessionEvents(sessionId);\n }\n\n private getMaintenanceStore(method: keyof QueryMaintenanceStore): QueryMaintenanceStore {\n const store = this.queryStore as QueryStore & Partial<QueryMaintenanceStore>;\n if (typeof store[method] !== 'function') {\n throw new Error(`MemoryQueryService requires queryStore.${String(method)}() for this operation`);\n }\n return store as QueryMaintenanceStore;\n }\n\n private getStatsDeps(): MemoryQueryServiceDeps {\n if (!this.deps) {\n throw new Error('MemoryQueryService requires vectorStore and graduation dependencies for getStats()');\n }\n return this.deps;\n }\n}\n", "/**\n * Retrieval quality guards.\n *\n * These are deliberately small deterministic heuristics used to avoid injecting\n * obviously irrelevant memories. They are not a second source of truth; they\n * only filter candidate retrieval results before context assembly.\n */\n\nconst COMMAND_ARTIFACT_PATTERNS = [\n /<\\/?(?:local-command-(?:stdout|stderr)|command-(?:name|message))\\b/i,\n /<command-name>[\\s\\S]*?<\\/command-name>/i,\n /<local-command-stdout>[\\s\\S]*?<\\/local-command-stdout>/i,\n /<local-command-stderr>[\\s\\S]*?<\\/local-command-stderr>/i\n];\n\nconst LOW_SIGNAL_CONTEXT_PATTERNS = [\n /<environment_context\\b[\\s\\S]*<\\/environment_context>/i,\n /<turn_aborted>/i,\n /^#\\s*AGENTS\\.md\\s+instructions\\b[\\s\\S]*<INSTRUCTIONS>/i,\n /^\\s*(?:understood[,\\s.]*)?(?:stopping|stopped|pausing|paused)\\s+here\\b[\\s\\S]{0,180}\\blet\\s+me\\s+know\\s+when\\s+you(?:'d|\\s+would)?\\s+like\\s+to\\s+continue\\b/i,\n /^\u279C\\s+\\S+\\s+git:\\([^)]*\\)\\s+/i,\n /^\\$\\s+\\S+/i\n];\n\nconst CONTINUATION_QUERY_PATTERNS = [\n /^\\s*(?:continue|resume|next|what(?:'s| is)? next|next\\s+(?:step|task|action)|recommended\\s+(?:next\\s+)?(?:step|task|action)|what should (?:we|i) do next)\\??\\s*$/i,\n /^\\s*(?:\uC774\uC5B4\uC11C(?:\\s*\uC9C4\uD589\uD574\uC918)?|\uACC4\uC18D(?:\\s*\uD574\uC918)?|\uB2E4\uC74C\\s*(?:\uB2E8\uACC4|\uC791\uC5C5|\uCD94\uCC9C\\s*\uC791\uC5C5|\uCD94\uCC9C|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uCD94\uCC9C\\s*\uC791\uC5C5(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uC9C4\uD589\uD574\uC918)\\s*$/i\n];\n\nconst GENERIC_TECHNICAL_TERMS = new Set([\n 'api',\n 'cli',\n 'ui',\n 'json',\n 'jsonl',\n 'html',\n 'http',\n 'https',\n 'url',\n 'uri',\n 'id',\n 'ids',\n 'uuid',\n 'db',\n 'sql'\n]);\n\nexport function isCommandArtifactQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isCommandArtifactContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowSignalContextContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return true;\n if (isCommandArtifactContent(trimmed)) return true;\n if (LOW_SIGNAL_CONTEXT_PATTERNS.some((pattern) => pattern.test(trimmed))) return true;\n return false;\n}\n\nexport function isGenericContinuationQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (!CONTINUATION_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed))) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 10) return false;\n\n return !/[A-Za-z0-9_-]+\\.[A-Za-z0-9]+/.test(trimmed) &&\n !/(?:^|\\s)(?:feat|fix|chore|refactor|docs)\\/[A-Za-z0-9._-]+/.test(trimmed) &&\n !/[A-Za-z]:?[\\\\/]|\\/Users\\/|\\.\\/|\\.\\.\\//.test(trimmed);\n}\n\nexport function extractTechnicalQueryTerms(query: string): string[] {\n const matches = query.match(/[A-Za-z][A-Za-z0-9_.:-]{2,}/g) ?? [];\n const terms = matches.filter((term) => {\n const lower = term.toLowerCase();\n if (GENERIC_TECHNICAL_TERMS.has(lower)) return false;\n return /[._:-]/.test(term) || /[a-z][A-Z]/.test(term) || /[A-Z]{2,}/.test(term) || /\\d/.test(term);\n });\n\n return Array.from(new Set(terms.map((term) => term.toLowerCase())));\n}\n\nexport function hasTechnicalTermOverlap(query: string, content: string): boolean {\n const terms = extractTechnicalQueryTerms(query);\n if (terms.length === 0) return true;\n\n const normalizedContent = content.toLowerCase();\n return terms.some((term) => normalizedContent.includes(term));\n}\n\nexport function shouldApplyTechnicalGuard(query: string): boolean {\n return extractTechnicalQueryTerms(query).length > 0;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, keyword search, scoped filtering, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { GraduationPipeline } from './graduation.js';\nimport {\n hasTechnicalTermOverlap,\n isCommandArtifactQuery,\n shouldApplyTechnicalGuard\n} from './retrieval-quality.js';\nimport type { MemoryEvent, MatchResult, SharedTroubleshootingEntry } from './types.js';\n\nexport interface RetrievalScope {\n sessionId?: string;\n eventTypes?: MemoryEvent['eventType'][];\n metadata?: Record<string, unknown>;\n canonicalKeyPrefix?: string;\n sessionIdPrefix?: string;\n contentIncludes?: string[];\n}\n\nexport type RetrievalStrategy = 'auto' | 'fast' | 'deep';\nexport type ProjectScopeMode = 'strict' | 'prefer' | 'global';\ntype DecayPolicy = NonNullable<RetrievalOptions['decayPolicy']>;\ntype GraphHopOptions = NonNullable<RetrievalOptions['graphHop']>;\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n scope?: RetrievalScope;\n strategy?: RetrievalStrategy;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: {\n enabled?: boolean;\n windowDays?: number;\n maxPenalty?: number;\n };\n intentRewrite?: boolean;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n fallbackTrace?: string[];\n selectedDebug?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n candidateDebug?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n }>;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nexport interface UnifiedRetrievalOptions extends RetrievalOptions {\n includeShared?: boolean;\n projectHash?: string;\n}\n\nexport interface UnifiedRetrievalResult extends RetrievalResult {\n sharedMemories?: SharedTroubleshootingEntry[];\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true,\n strategy: 'auto',\n rerankWithKeyword: true,\n decayPolicy: {\n enabled: true,\n windowDays: 30,\n maxPenalty: 0.15\n },\n graphHop: {\n enabled: true,\n maxHops: 1,\n hopPenalty: 0.08\n },\n projectScopeMode: 'global'\n};\n\nexport interface SharedStoreOptions {\n sharedStore?: SharedStore;\n sharedVectorStore?: SharedVectorStore;\n}\n\ntype EventStoreLike = EventStore & {\n keywordSearch?: (query: string, limit?: number) => Promise<Array<{ event: MemoryEvent; rank: number }>>;\n};\n\nexport class Retriever {\n private readonly eventStore: EventStoreLike;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private sharedStore?: SharedStore;\n private sharedVectorStore?: SharedVectorStore;\n private graduation?: GraduationPipeline;\n private queryRewriter?: (query: string) => Promise<string | null>;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n ) {\n this.eventStore = eventStore as EventStoreLike;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n this.sharedStore = sharedOptions?.sharedStore;\n this.sharedVectorStore = sharedOptions?.sharedVectorStore;\n }\n\n setGraduationPipeline(graduation: GraduationPipeline): void {\n this.graduation = graduation;\n }\n\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void {\n this.sharedStore = sharedStore;\n this.sharedVectorStore = sharedVectorStore;\n }\n\n setQueryRewriter(rewriter: (query: string) => Promise<string | null>): void {\n this.queryRewriter = rewriter;\n }\n\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const sessionFilter = opts.scope?.sessionId ?? opts.sessionId;\n const fallbackTrace: string[] = [];\n\n if (isCommandArtifactQuery(query)) {\n fallbackTrace.push('guard:command-artifact-query');\n const emptyMatch = this.matcher.matchSearchResults([], () => 0);\n return {\n memories: [],\n matchResult: emptyMatch,\n totalTokens: 0,\n context: '',\n fallbackTrace,\n selectedDebug: [],\n candidateDebug: []\n };\n }\n\n const fallbackEnabled = (opts.strategy ?? 'auto') === 'auto';\n\n // Stage 1: primary retrieval\n const primaryStrategy: RetrievalStrategy = opts.strategy === 'auto' ? 'fast' : (opts.strategy || 'fast');\n let current = await this.runStage(query, {\n strategy: primaryStrategy,\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n intentRewrite: opts.intentRewrite === true,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push(`stage:primary:${primaryStrategy}`);\n\n // Stage 2: deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results) && primaryStrategy !== 'deep') {\n current = await this.runStage(query, {\n strategy: 'deep',\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push('fallback:deep');\n }\n\n // Stage 3: scope-expanded deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n current = await this.runStage(query, {\n strategy: 'deep',\n topK: opts.topK,\n minScore: Math.max(0.5, opts.minScore - 0.15),\n sessionId: undefined,\n scope: undefined,\n rerankWithKeyword: true,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes\n });\n fallbackTrace.push('fallback:scope-expanded');\n }\n\n // Stage 4: summary fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n const summary = await this.buildSummaryFallback(query, opts.topK);\n current = {\n results: summary,\n candidateResults: summary,\n matchResult: this.matcher.matchSearchResults(summary, () => 0)\n };\n fallbackTrace.push('fallback:summary');\n }\n\n const memories = await this.enrichResults(current.results.slice(0, opts.topK), opts as RetrievalOptions);\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult: current.matchResult,\n totalTokens: this.estimateTokens(context),\n context,\n fallbackTrace,\n selectedDebug: current.results.slice(0, opts.topK).map((r: SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }) => ({\n eventId: r.eventId,\n score: r.score,\n semanticScore: r.semanticScore,\n lexicalScore: r.lexicalScore,\n recencyScore: r.recencyScore,\n })),\n candidateDebug: (current.candidateResults || []).slice(0, Math.max(opts.topK * 3, 20)).map((r: SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }) => ({\n eventId: r.eventId,\n score: r.score,\n semanticScore: r.semanticScore,\n lexicalScore: r.lexicalScore,\n recencyScore: r.recencyScore,\n }))\n };\n }\n\n async retrieveUnified(\n query: string,\n options: Partial<UnifiedRetrievalOptions> = {}\n ): Promise<UnifiedRetrievalResult> {\n const projectResult = await this.retrieve(query, options);\n\n if (!options.includeShared || !this.sharedStore || !this.sharedVectorStore) {\n return projectResult;\n }\n\n try {\n const queryEmbedding = await this.embedder.embed(query);\n const sharedVectorResults = await this.sharedVectorStore.search(queryEmbedding.vector, {\n limit: options.topK || 5,\n minScore: options.minScore || 0.7,\n excludeProjectHash: options.projectHash\n });\n\n const sharedMemories: SharedTroubleshootingEntry[] = [];\n for (const result of sharedVectorResults) {\n const entry = await this.sharedStore.get(result.entryId);\n if (!entry) continue;\n if (!options.projectHash || entry.sourceProjectHash !== options.projectHash) {\n sharedMemories.push(entry);\n await this.sharedStore.recordUsage(entry.entryId);\n }\n }\n\n const unifiedContext = this.buildUnifiedContext(projectResult, sharedMemories);\n return {\n ...projectResult,\n context: unifiedContext,\n totalTokens: this.estimateTokens(unifiedContext),\n sharedMemories\n };\n } catch (error) {\n console.error('Shared search failed:', error);\n return projectResult;\n }\n }\n\n private async runStage(\n query: string,\n input: {\n strategy: RetrievalStrategy;\n topK: number;\n minScore: number;\n sessionId?: string;\n scope?: RetrievalScope;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: DecayPolicy;\n intentRewrite?: boolean;\n graphHop?: GraphHopOptions;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n }\n ): Promise<{ results: SearchResult[]; candidateResults: SearchResult[]; matchResult: MatchResult }> {\n let rerankQuery = query;\n let initialResults = await this.searchByStrategy(query, {\n strategy: input.strategy,\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n\n if (input.intentRewrite && input.strategy === 'deep' && this.queryRewriter) {\n const rewritten = (await this.queryRewriter(query))?.trim();\n if (rewritten && rewritten !== query) {\n rerankQuery = `${query} ${rewritten}`;\n const rewrittenResults = await this.searchByStrategy(rewritten, {\n strategy: 'deep',\n topK: input.topK,\n minScore: Math.max(0.5, input.minScore - 0.1),\n sessionId: input.sessionId\n });\n initialResults = this.mergeResults(initialResults, rewrittenResults, input.topK * 3);\n }\n }\n\n const expandedResults = input.graphHop?.enabled === false\n ? initialResults\n : await this.expandGraphHops(initialResults, {\n maxHops: Math.max(1, input.graphHop?.maxHops ?? 1),\n hopPenalty: Math.max(0, input.graphHop?.hopPenalty ?? 0.08),\n limit: input.topK * 4,\n });\n\n const rerankedResults = input.rerankWithKeyword\n ? this.rerankByKeywordOverlap(expandedResults, rerankQuery, input.rerankWeights, input.decayPolicy)\n : expandedResults;\n\n const filtered = await this.applyScopeFilters(rerankedResults, {\n scope: input.scope,\n projectScopeMode: input.projectScopeMode,\n projectHash: input.projectHash,\n allowedProjectHashes: input.allowedProjectHashes\n });\n const qualityFiltered = this.applyQualityFilters(filtered, {\n query,\n minScore: input.minScore\n });\n const top = qualityFiltered.slice(0, input.topK);\n const matchResult = this.matcher.matchSearchResults(top, () => 0);\n\n return { results: top, candidateResults: qualityFiltered, matchResult };\n }\n\n private applyQualityFilters(\n results: Array<SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }>,\n options: { query: string; minScore: number }\n ): Array<SearchResult & { semanticScore?: number; lexicalScore?: number; recencyScore?: number }> {\n let filtered = [...results];\n\n if (shouldApplyTechnicalGuard(options.query)) {\n filtered = filtered.filter((result) => hasTechnicalTermOverlap(options.query, result.content));\n }\n\n if (filtered.length <= 2) return filtered;\n\n const topScore = filtered[0].score;\n if (topScore < 0.8) return filtered;\n\n const cliffThreshold = Math.max(options.minScore, topScore - 0.25);\n return filtered.filter((result) => result.score >= cliffThreshold);\n }\n\n private mergeResults(primary: SearchResult[], secondary: SearchResult[], limit: number): SearchResult[] {\n const byId = new Map<string, SearchResult>();\n for (const row of primary) byId.set(row.eventId, row);\n for (const row of secondary) {\n const prev = byId.get(row.eventId);\n if (!prev || row.score > prev.score) {\n byId.set(row.eventId, row);\n }\n }\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n private async expandGraphHops(\n seeds: SearchResult[],\n opts: { maxHops: number; hopPenalty: number; limit: number }\n ): Promise<SearchResult[]> {\n const byId = new Map<string, SearchResult>();\n for (const s of seeds) byId.set(s.eventId, s);\n\n let frontier = seeds.map((s) => ({ row: s, hop: 0 }));\n\n for (let hop = 1; hop <= opts.maxHops; hop += 1) {\n const next: Array<{ row: SearchResult; hop: number }> = [];\n\n for (const f of frontier) {\n const ev = await this.eventStore.getEvent(f.row.eventId);\n if (!ev) continue;\n const rel = ((ev.metadata as Record<string, unknown> | undefined)?.relatedEventIds ?? []) as unknown;\n const relatedIds = Array.isArray(rel)\n ? rel.filter((x): x is string => typeof x === 'string')\n : [];\n\n for (const rid of relatedIds) {\n if (byId.has(rid)) continue;\n const target = await this.eventStore.getEvent(rid);\n if (!target) continue;\n\n const score = Math.max(0, f.row.score - opts.hopPenalty * hop);\n const row: SearchResult = {\n id: `hop-${hop}-${rid}`,\n eventId: target.id,\n content: target.content,\n score,\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n };\n\n byId.set(row.eventId, row);\n next.push({ row, hop });\n if (byId.size >= opts.limit) break;\n }\n if (byId.size >= opts.limit) break;\n }\n\n frontier = next;\n if (frontier.length === 0 || byId.size >= opts.limit) break;\n }\n\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, opts.limit);\n }\n\n private shouldFallback(matchResult: MatchResult, results: SearchResult[]): boolean {\n if (results.length === 0) return true;\n if (matchResult.confidence === 'none') return true;\n return false;\n }\n\n private async buildSummaryFallback(query: string, topK: number): Promise<SearchResult[]> {\n const recent = await this.eventStore.getRecentEvents(Math.max(topK * 6, 20));\n const q = this.tokenize(query);\n\n const ranked = recent\n .map((e) => ({ e, overlap: this.keywordOverlap(q, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, topK)\n .map((row, idx) => ({\n id: `summary-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score: Math.max(0.25, 0.6 - idx * 0.05),\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }));\n\n return ranked;\n }\n\n private async searchByStrategy(\n query: string,\n input: { strategy: RetrievalStrategy; topK: number; minScore: number; sessionId?: string }\n ): Promise<SearchResult[]> {\n const strategy = input.strategy === 'auto' ? 'deep' : input.strategy;\n\n if (strategy === 'fast') {\n const keyword = await this.searchByKeyword(query, {\n limit: Math.max(5, input.topK * 3),\n sessionId: input.sessionId\n });\n return keyword;\n }\n\n const queryEmbedding = await this.embedder.embed(query);\n return this.vectorStore.search(queryEmbedding.vector, {\n limit: Math.max(5, input.topK * 3),\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n }\n\n private async searchByKeyword(\n query: string,\n input: { limit: number; sessionId?: string }\n ): Promise<SearchResult[]> {\n if (this.eventStore.keywordSearch) {\n const rows = await this.eventStore.keywordSearch(query, input.limit);\n const filtered = input.sessionId ? rows.filter((r) => r.event.sessionId === input.sessionId) : rows;\n return filtered.map((row, idx) => ({\n id: `kw-${row.event.id}`,\n eventId: row.event.id,\n content: row.event.content,\n score: Math.max(0.4, 1 - idx * 0.04),\n sessionId: row.event.sessionId,\n eventType: row.event.eventType,\n timestamp: row.event.timestamp.toISOString()\n }));\n }\n\n const recent = await this.eventStore.getRecentEvents(input.limit * 4);\n const tokens = this.tokenize(query);\n const filtered = recent\n .filter((e) => (input.sessionId ? e.sessionId === input.sessionId : true))\n .map((e) => ({ e, overlap: this.keywordOverlap(tokens, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, input.limit);\n\n return filtered.map((row, idx) => ({\n id: `kw-fallback-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score: Math.max(0.3, 0.9 - idx * 0.05),\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }));\n }\n\n private rerankByKeywordOverlap(\n results: SearchResult[],\n query: string,\n weights?: { semantic?: number; lexical?: number; recency?: number },\n decayPolicy?: { enabled?: boolean; windowDays?: number; maxPenalty?: number }\n ): SearchResult[] {\n const q = this.tokenize(query);\n const now = Date.now();\n\n const sw = Math.max(0, weights?.semantic ?? 0.7);\n const lw = Math.max(0, weights?.lexical ?? 0.2);\n const rw = Math.max(0, weights?.recency ?? 0.1);\n const total = sw + lw + rw || 1;\n\n const decayEnabled = decayPolicy?.enabled !== false;\n const decayWindow = Math.max(1, decayPolicy?.windowDays ?? 30);\n const decayMaxPenalty = Math.max(0, decayPolicy?.maxPenalty ?? 0.15);\n\n return [...results]\n .map((r) => {\n const overlap = this.keywordOverlap(q, this.tokenize(r.content));\n const recencyDays = Math.max(0, (now - new Date(r.timestamp).getTime()) / (1000 * 60 * 60 * 24));\n const recency = Math.max(0, 1 - recencyDays / decayWindow);\n let blended = (r.score * sw + overlap * lw + recency * rw) / total;\n\n if (decayEnabled && recencyDays > decayWindow && overlap < 0.5) {\n const ageFactor = Math.min(1, (recencyDays - decayWindow) / decayWindow);\n blended -= decayMaxPenalty * ageFactor;\n }\n\n return { ...r, score: Math.max(0, blended), semanticScore: r.score, lexicalScore: overlap, recencyScore: recency };\n })\n .sort((a, b) => b.score - a.score);\n }\n\n private async applyScopeFilters(\n results: SearchResult[],\n options?: {\n scope?: RetrievalScope;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n }\n ): Promise<SearchResult[]> {\n const scope = options?.scope;\n const projectScopeMode = options?.projectScopeMode ?? 'global';\n const allowedProjectHashes = new Set(\n [options?.projectHash, ...(options?.allowedProjectHashes || [])].filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n )\n );\n\n if (!scope && projectScopeMode === 'global') return results;\n\n const normalizedIncludes = (scope?.contentIncludes || []).map((s) => s.toLowerCase());\n const filtered: Array<{ result: SearchResult; projectHash?: string }> = [];\n\n for (const result of results) {\n if (scope?.sessionId && result.sessionId !== scope.sessionId) continue;\n if (scope?.sessionIdPrefix && !result.sessionId.startsWith(scope.sessionIdPrefix)) continue;\n if (scope?.eventTypes && scope.eventTypes.length > 0 && !scope.eventTypes.includes(result.eventType as MemoryEvent['eventType'])) continue;\n\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (scope?.canonicalKeyPrefix && !event.canonicalKey.startsWith(scope.canonicalKeyPrefix)) continue;\n if (normalizedIncludes.length > 0) {\n const lc = event.content.toLowerCase();\n if (!normalizedIncludes.some((needle) => lc.includes(needle))) continue;\n }\n if (scope?.metadata && !this.matchesMetadataScope(event.metadata, scope.metadata)) continue;\n\n const projectHash = this.extractProjectHash(event.metadata);\n filtered.push({ result, projectHash });\n }\n\n if (projectScopeMode === 'global' || allowedProjectHashes.size === 0) {\n return filtered.map((x) => x.result);\n }\n\n const projectMatched = filtered.filter((x) => x.projectHash && allowedProjectHashes.has(x.projectHash));\n\n if (projectScopeMode === 'strict') {\n return projectMatched.map((x) => x.result);\n }\n\n return (projectMatched.length > 0 ? projectMatched : filtered).map((x) => x.result);\n }\n\n private extractProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata || typeof metadata !== 'object') return undefined;\n const scope = metadata.scope;\n if (!scope || typeof scope !== 'object') return undefined;\n const project = (scope as Record<string, unknown>).project;\n if (!project || typeof project !== 'object') return undefined;\n const hash = (project as Record<string, unknown>).hash;\n return typeof hash === 'string' && hash.length > 0 ? hash : undefined;\n }\n\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n private async enrichResults(results: SearchResult[], options: RetrievalOptions): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (this.graduation) {\n this.graduation.recordAccess(event.id, options.sessionId || 'unknown', result.score);\n }\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({ event, score: result.score, sessionContext });\n }\n\n return memories;\n }\n\n private async getSessionContext(sessionId: string, eventId: string): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n private buildUnifiedContext(projectResult: RetrievalResult, sharedMemories: SharedTroubleshootingEntry[]): string {\n let context = projectResult.context;\n if (sharedMemories.length === 0) return context;\n\n context += '\\n\\n## Cross-Project Knowledge\\n\\n';\n for (const memory of sharedMemories.slice(0, 3)) {\n context += `### ${memory.title}\\n`;\n if (memory.symptoms.length > 0) context += `**Symptoms:** ${memory.symptoms.join(', ')}\\n`;\n context += `**Root Cause:** ${memory.rootCause}\\n`;\n context += `**Solution:** ${memory.solution}\\n`;\n if (memory.technologies && memory.technologies.length > 0) context += `**Technologies:** ${memory.technologies.join(', ')}\\n`;\n context += `_Confidence: ${(memory.confidence * 100).toFixed(0)}%_\\n\\n`;\n }\n\n return context;\n }\n\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n if (currentTokens + memoryTokens > maxTokens) break;\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) return '';\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n if (sessionContext) text += `\\n\\n_Context:_ ${sessionContext}`;\n return text;\n }\n\n private matchesMetadataScope(\n metadata: Record<string, unknown> | undefined,\n expected: Record<string, unknown>\n ): boolean {\n if (!metadata) return false;\n\n return Object.entries(expected).every(([path, value]) => {\n const actual = path.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) return undefined;\n return (acc as Record<string, unknown>)[key];\n }, metadata);\n\n return actual === value;\n });\n }\n\n private tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .filter((t) => t.length >= 2)\n .slice(0, 64);\n }\n\n private keywordOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const bs = new Set(b);\n let hit = 0;\n for (const t of a) if (bs.has(t)) hit += 1;\n return hit / a.length;\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n}\n\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\n}\n", "/**\n * Retrieval Analytics Service\n *\n * Owns retrieval telemetry read-model and helpfulness evaluation workflows so\n * MemoryService can remain a thin facade over focused engine services.\n */\n\nimport type { MemoryEvent } from '../types.js';\n\nexport interface RetrievalTraceStats {\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n}\n\nexport interface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\nexport interface HelpfulMemory {\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n}\n\nexport interface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport interface RetrievalTrace {\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: RetrievalTraceDetail[];\n selectedDetails: RetrievalTraceDetail[];\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n}\n\nexport interface AccessedMemory {\n memoryId: string;\n summary: string;\n topics: string[];\n accessCount: number;\n lastAccessed: string | null;\n confidence: number;\n createdAt: Date;\n}\n\ntype AccessedMemoryEvent = MemoryEvent & {\n access_count?: number;\n last_accessed_at?: string | null;\n};\n\nexport interface RetrievalAnalyticsStore {\n getRetrievalTraceStats(): Promise<RetrievalTraceStats>;\n getRecentRetrievalTraces(limit?: number): Promise<RetrievalTrace[]>;\n getMostAccessed(limit?: number): Promise<AccessedMemoryEvent[]>;\n evaluateSessionHelpfulness(sessionId: string): Promise<void>;\n getUnevaluatedSessions(currentSessionId: string, limit?: number): Promise<string[]>;\n getHelpfulMemories(limit?: number): Promise<HelpfulMemory[]>;\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n}\n\nexport interface RetrievalAnalyticsServiceDeps {\n initialize: () => Promise<void>;\n retrievalStore: RetrievalAnalyticsStore;\n}\n\nexport class RetrievalAnalyticsService {\n constructor(private readonly deps: RetrievalAnalyticsServiceDeps) {}\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRecentRetrievalTraces(limit);\n }\n\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n // Preserve the historical lightweight path: SQLiteEventStore.getMostAccessed()\n // initializes itself and no-ops safely in read-only scenarios, so dashboard\n // access summaries should not trigger vector/embedder/worker initialization.\n const events = await this.deps.retrievalStore.getMostAccessed(limit);\n\n return events.map((event) => ({\n memoryId: event.id,\n summary: event.content.substring(0, 200) + (event.content.length > 200 ? '...' : ''),\n topics: this.extractTopicsFromContent(event.content),\n accessCount: event.access_count || 0,\n lastAccessed: event.last_accessed_at || null,\n confidence: 1.0,\n createdAt: event.timestamp,\n }));\n }\n\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.deps.initialize();\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n }\n\n async evaluatePendingSessions(currentSessionId: string, limit: number = 5): Promise<void> {\n await this.deps.initialize();\n const sessions = await this.deps.retrievalStore.getUnevaluatedSessions(currentSessionId, limit);\n\n for (const sessionId of sessions) {\n try {\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n } catch {\n // Best-effort backfill: one broken session should not block hook startup.\n }\n }\n }\n\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulMemories(limit);\n }\n\n async getHelpfulnessStats(): Promise<HelpfulnessStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulnessStats();\n }\n\n /**\n * Extract topic keywords from event content (markdown headings and key terms).\n */\n private extractTopicsFromContent(content: string): string[] {\n const topics: Set<string> = new Set();\n\n const headings = content.match(/^#{1,3}\\s+(.+)$/gm);\n if (headings) {\n for (const heading of headings.slice(0, 5)) {\n const text = heading.replace(/^#+\\s+/, '').replace(/[*_`#]/g, '').trim();\n if (text.length > 2 && text.length < 50) {\n topics.add(text);\n }\n }\n }\n\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n for (const boldTerm of boldTerms.slice(0, 5)) {\n const text = boldTerm.replace(/\\*\\*/g, '').trim();\n if (text.length > 2 && text.length < 30) {\n topics.add(text);\n }\n }\n }\n\n return Array.from(topics).slice(0, 5);\n }\n}\n\nexport function createRetrievalAnalyticsService(\n deps: RetrievalAnalyticsServiceDeps\n): RetrievalAnalyticsService {\n return new RetrievalAnalyticsService(deps);\n}\n", "/**\n * Retrieval Disclosure Service\n *\n * Provides a product-facing progressive disclosure surface on top of retrieval:\n * search -> expand -> source. Search returns compact, spec-aligned result\n * envelopes; expand adds surrounding context; source resolves to canonical raw\n * events or other source references.\n */\n\nimport type { RetrievalReason, RetrievalResultEnvelope, RetrievalResultType } from '../model/retrieval-result.js';\nimport type { UnifiedRetrievalResult, MemoryWithContext } from '../retriever.js';\nimport type { MemoryEvent, SharedTroubleshootingEntry } from '../types.js';\nimport type { RetrieveMemoriesOptions } from './retrieval-orchestrator.js';\n\nexport type RetrievalDisclosureResultType = RetrievalResultType;\nexport type RetrievalDisclosureReason = RetrievalReason;\nexport type RetrievalDisclosureEnvelope = RetrievalResultEnvelope;\nexport type RetrievalDisclosureSourceType =\n | 'raw_event'\n | 'transcript'\n | 'tool_output'\n | 'imported_history'\n | 'shared_troubleshooting';\n\nexport interface RetrievalDisclosureSearchResponse {\n results: RetrievalResultEnvelope[];\n meta: {\n total: number;\n usedVector: boolean;\n usedKeyword: boolean;\n fallbackApplied: boolean;\n confidence?: UnifiedRetrievalResult['matchResult']['confidence'];\n totalTokens?: number;\n fallbackTrace?: string[];\n };\n}\n\nexport interface RetrievalDisclosureSourceReference {\n sourceRef: string;\n sourceType: RetrievalDisclosureSourceType;\n eventIds: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RetrievalDisclosureExpansion {\n target: RetrievalResultEnvelope;\n surroundingFacts?: RetrievalResultEnvelope[];\n summaries?: RetrievalResultEnvelope[];\n relatedSources?: RetrievalDisclosureSourceReference[];\n expandedContext?: string;\n}\n\nexport interface RetrievalDisclosureSource extends RetrievalDisclosureSourceReference {\n rawEvents: MemoryEvent[];\n primaryEvent?: MemoryEvent;\n}\n\nexport interface RetrievalDisclosureSearchOptions extends RetrieveMemoriesOptions {}\n\nexport interface RetrievalDisclosureExpandOptions {\n windowSize?: number;\n}\n\nexport interface RetrievalDisclosureOrchestrator {\n retrieveMemories(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<UnifiedRetrievalResult>;\n}\n\nexport interface RetrievalDisclosureEventStore {\n getEvent(id: string): Promise<MemoryEvent | null>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n}\n\nexport interface RetrievalDisclosureSharedStore {\n get(entryId: string): Promise<SharedTroubleshootingEntry | null>;\n}\n\nexport interface RetrievalDisclosureServiceDeps {\n initialize: () => Promise<void>;\n retrievalOrchestrator: RetrievalDisclosureOrchestrator;\n eventStore: RetrievalDisclosureEventStore;\n sharedStore?: RetrievalDisclosureSharedStore;\n}\n\nexport class RetrievalDisclosureService {\n constructor(private readonly deps: RetrievalDisclosureServiceDeps) {}\n\n async search(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n const result = await this.deps.retrievalOrchestrator.retrieveMemories(query, options);\n const debugByEventId = this.buildDebugIndex(result);\n const projectResults = result.memories.map((memory) => this.memoryToEnvelope(\n memory,\n result,\n debugByEventId.get(memory.event.id)\n ));\n const sharedResults = (result.sharedMemories || []).map((entry) => this.sharedToEnvelope(entry));\n const results = [...projectResults, ...sharedResults];\n\n return {\n results,\n meta: {\n total: results.length,\n usedVector: this.usedVector(result),\n usedKeyword: this.usedKeyword(result),\n fallbackApplied: this.fallbackApplied(result),\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens,\n fallbackTrace: result.fallbackTrace || []\n }\n };\n }\n\n async expand(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.expandShared(parsedId.entryId);\n }\n\n const targetEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!targetEvent) return null;\n\n const windowSize = Math.max(0, options?.windowSize ?? 3);\n const sessionEvents = (await this.deps.eventStore.getSessionEvents(targetEvent.sessionId))\n .slice()\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const targetIndex = sessionEvents.findIndex((event) => event.id === targetEvent.id);\n const surroundingEvents = targetIndex === -1\n ? []\n : sessionEvents.slice(\n Math.max(0, targetIndex - windowSize),\n Math.min(sessionEvents.length, targetIndex + windowSize + 1)\n );\n const nearbyEvents = surroundingEvents.length > 0 ? surroundingEvents : [targetEvent];\n const nonTargetEvents = nearbyEvents.filter((event) => event.id !== targetEvent.id);\n\n return {\n target: this.eventToEnvelope(targetEvent, 1, ['continuity_link']),\n surroundingFacts: nonTargetEvents.map((event) => this.eventToEnvelope(event, 1, this.reasonsForContextEvent(event))),\n summaries: nonTargetEvents\n .filter((event) => event.eventType === 'session_summary')\n .map((event) => this.eventToEnvelope(event, 1, ['summary_fallback'])),\n relatedSources: nearbyEvents.map((event) => this.sourceReferenceForEvent(event)),\n expandedContext: this.formatTimelineContext(nearbyEvents)\n };\n }\n\n async source(resultId: string): Promise<RetrievalDisclosureSource | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.sourceShared(parsedId.entryId);\n }\n\n const rawEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!rawEvent) return null;\n\n return {\n ...this.sourceReferenceForEvent(rawEvent),\n rawEvents: [rawEvent],\n primaryEvent: rawEvent\n };\n }\n\n private async expandShared(entryId: string): Promise<RetrievalDisclosureExpansion | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n return {\n target: this.sharedToEnvelope(entry),\n surroundingFacts: [],\n summaries: [],\n relatedSources: [this.sourceReferenceForShared(entry)],\n expandedContext: this.formatSharedContext(entry)\n };\n }\n\n private async sourceShared(entryId: string): Promise<RetrievalDisclosureSource | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n const sourceReference = this.sourceReferenceForShared(entry);\n return {\n ...sourceReference,\n rawEvents: [],\n metadata: {\n ...sourceReference.metadata,\n symptoms: entry.symptoms,\n rootCause: entry.rootCause,\n solution: entry.solution,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private memoryToEnvelope(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalResultEnvelope {\n return this.eventToEnvelope(\n memory.event,\n memory.score,\n this.inferReasons(memory, result, debug),\n {\n semanticScore: debug?.semanticScore,\n lexicalScore: debug?.lexicalScore,\n recencyScore: debug?.recencyScore\n }\n );\n }\n\n private eventToEnvelope(\n event: MemoryEvent,\n score: number,\n reasons: RetrievalDisclosureReason[],\n extraMetadata?: Record<string, unknown>\n ): RetrievalResultEnvelope {\n return {\n id: toDisclosureResultId(event.id),\n resultType: this.resultTypeForEvent(event),\n title: this.titleForEvent(event),\n snippet: this.preview(event.content, 240),\n score,\n reasons,\n sourceRef: toDisclosureResultId(event.id),\n sessionId: event.sessionId,\n metadata: {\n eventId: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp.toISOString(),\n canonicalKey: event.canonicalKey,\n ...event.metadata,\n ...extraMetadata\n }\n };\n }\n\n private sharedToEnvelope(entry: SharedTroubleshootingEntry): RetrievalResultEnvelope {\n return {\n id: `shared:${entry.entryId}`,\n resultType: 'rule',\n title: entry.title,\n snippet: this.preview(entry.solution || entry.rootCause || entry.symptoms.join(' '), 240),\n score: entry.confidence,\n reasons: ['semantic_match'],\n sourceRef: `shared:${entry.entryId}`,\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private buildDebugIndex(result: UnifiedRetrievalResult): Map<string, RetrievalDebugDetail> {\n const byEventId = new Map<string, RetrievalDebugDetail>();\n\n for (const detail of result.candidateDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n for (const detail of result.selectedDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n\n return byEventId;\n }\n\n private inferReasons(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalDisclosureReason[] {\n const reasons = new Set<RetrievalDisclosureReason>();\n\n const usedVector = this.usedVector(result);\n const usedKeyword = this.usedKeyword(result);\n\n if (usedVector && (debug?.semanticScore ?? 0) > 0) reasons.add('semantic_match');\n if ((debug?.lexicalScore ?? 0) > 0 || usedKeyword) reasons.add('keyword_match');\n if ((debug?.recencyScore ?? 0) > 0) reasons.add('recent_relevance');\n if ((result.fallbackTrace || []).some((step) => step === 'fallback:summary')) reasons.add('summary_fallback');\n if (memory.sessionContext) reasons.add('continuity_link');\n if (memory.event.eventType === 'tool_observation') reasons.add('tool_followup');\n if (reasons.size === 0) reasons.add(usedVector ? 'semantic_match' : 'keyword_match');\n\n return Array.from(reasons);\n }\n\n private reasonsForContextEvent(event: MemoryEvent): RetrievalDisclosureReason[] {\n if (event.eventType === 'tool_observation') return ['tool_followup'];\n if (event.eventType === 'session_summary') return ['summary_fallback'];\n return ['continuity_link'];\n }\n\n private resultTypeForEvent(event: MemoryEvent): RetrievalDisclosureResultType {\n if (event.eventType === 'session_summary') return 'summary';\n if (event.eventType === 'tool_observation') return 'tool_evidence';\n return 'source';\n }\n\n private sourceReferenceForEvent(event: MemoryEvent): RetrievalDisclosureSourceReference {\n return {\n sourceRef: toDisclosureResultId(event.id),\n sourceType: this.sourceTypeForEvent(event),\n eventIds: [event.id]\n };\n }\n\n private sourceReferenceForShared(entry: SharedTroubleshootingEntry): RetrievalDisclosureSourceReference {\n return {\n sourceRef: `shared:${entry.entryId}`,\n sourceType: 'shared_troubleshooting',\n eventIds: [],\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics\n }\n };\n }\n\n private sourceTypeForEvent(event: MemoryEvent): RetrievalDisclosureSourceType {\n const metadata = event.metadata || {};\n if (event.eventType === 'tool_observation') return 'tool_output';\n if (typeof metadata.transcriptPath === 'string') return 'transcript';\n if (typeof metadata.importedFrom === 'string') return 'imported_history';\n return 'raw_event';\n }\n\n private titleForEvent(event: MemoryEvent): string {\n if (event.eventType === 'session_summary') return 'Session summary';\n if (event.eventType === 'tool_observation') return 'Tool evidence';\n if (event.eventType === 'agent_response') return 'Agent response';\n return 'User prompt';\n }\n\n private usedVector(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':deep'));\n }\n\n private usedKeyword(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':fast')) ||\n [...(result.selectedDebug || []), ...(result.candidateDebug || [])]\n .some((detail) => (detail.lexicalScore ?? 0) > 0);\n }\n\n private fallbackApplied(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes('fallback'));\n }\n\n private formatTimelineContext(events: MemoryEvent[]): string {\n return events\n .map((event) => `[${event.eventType}] ${event.content}`)\n .join('\\n\\n');\n }\n\n private formatSharedContext(entry: SharedTroubleshootingEntry): string {\n return [\n `[shared_troubleshooting] ${entry.title}`,\n `Symptoms: ${entry.symptoms.join('; ')}`,\n `Root cause: ${entry.rootCause}`,\n `Solution: ${entry.solution}`,\n `Topics: ${entry.topics.join(', ')}`\n ].join('\\n');\n }\n\n private preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n }\n}\n\ninterface RetrievalDebugDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport function toDisclosureResultId(eventId: string): string {\n return eventId.startsWith('event:') ? eventId : `event:${eventId}`;\n}\n\nexport type ParsedDisclosureResultId =\n | { kind: 'event'; eventId: string }\n | { kind: 'shared'; entryId: string };\n\nexport function parseDisclosureResultId(resultId: string): string {\n return resultId.startsWith('event:') ? resultId.slice('event:'.length) : resultId;\n}\n\nexport function parseDisclosureResultRef(resultId: string): ParsedDisclosureResultId {\n if (resultId.startsWith('shared:')) {\n return { kind: 'shared', entryId: resultId.slice('shared:'.length) };\n }\n return {\n kind: 'event',\n eventId: parseDisclosureResultId(resultId)\n };\n}\n\nexport function createRetrievalDisclosureService(\n deps: RetrievalDisclosureServiceDeps\n): RetrievalDisclosureService {\n return new RetrievalDisclosureService(deps);\n}\n", "/**\n * Retrieval Orchestrator\n *\n * Coordinates MemoryService-level retrieval concerns around the lower-level\n * Retriever: initialization, rerank policy, project/shared scoping, optional\n * intent rewriting, and non-blocking retrieval trace telemetry.\n */\n\nimport {\n Retriever,\n type ProjectScopeMode,\n type RetrievalResult,\n type RetrievalStrategy,\n type UnifiedRetrievalResult\n} from '../retriever.js';\n\nexport interface RetrieveMemoriesOptions {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: ProjectScopeMode;\n allowedProjectHashes?: string[];\n strategy?: RetrievalStrategy;\n /**\n * Disable automatic retrieval trace writes for read-only/navigation callers\n * that may receive secret-bearing ad-hoc queries.\n */\n recordTrace?: boolean;\n}\n\nexport interface RecordQueryTraceInput {\n sessionId: string;\n queryText: string;\n strategy: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n confidence: string;\n}\n\ninterface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\ntype RerankWeights = {\n semantic: number;\n lexical: number;\n recency: number;\n};\n\ninterface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n}\n\nexport interface RetrievalTraceStore {\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: RetrievalTraceDetail[];\n selectedDetails?: RetrievalTraceDetail[];\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void>;\n}\n\nexport interface RetrievalAccessStore {\n incrementAccessCount(eventIds: string[]): Promise<void>;\n recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void>;\n}\n\nexport interface RetrievalOrchestratorDeps {\n initialize: () => Promise<void>;\n retriever: Retriever;\n traceStore: RetrievalTraceStore;\n accessStore: RetrievalAccessStore;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n}\n\nexport class RetrievalOrchestrator {\n constructor(private readonly deps: RetrievalOrchestratorDeps) {\n this.deps.retriever.setQueryRewriter((query) => this.rewriteQueryIntent(query));\n }\n\n /**\n * Retrieve relevant memories for a query.\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n const { recordTrace = true, ...retrieverOptions } = options ?? {};\n const lightweightFastRead = this.isLightweightFastRead(options);\n if (!lightweightFastRead) {\n await this.deps.initialize();\n }\n\n // Note: Pending embeddings are processed by the background worker.\n // Don't block retrieval - search with whatever vectors are available.\n const rerankWeights = lightweightFastRead\n ? undefined\n : await this.getRerankWeights(options?.adaptiveRerank === true);\n const projectHash = this.deps.getProjectHash();\n const projectScopeMode = retrieverOptions.projectScopeMode ?? (projectHash ? 'strict' : 'global');\n\n let result: UnifiedRetrievalResult;\n\n if (retrieverOptions.includeShared && this.deps.hasSharedStore()) {\n result = await this.deps.retriever.retrieveUnified(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n includeShared: true,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n } else {\n result = await this.deps.retriever.retrieve(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n }\n\n if (recordTrace) {\n try {\n await this.recordAutomaticTrace(query, result, options, projectHash);\n } catch {\n // Non-blocking telemetry.\n }\n }\n\n return result;\n }\n\n /**\n * Format retrieval results as context for Claude.\n */\n formatAsContext(result: RetrievalResult): string {\n if (!result.context) {\n return '';\n }\n\n const confidence = result.matchResult.confidence;\n let header = '';\n\n if (confidence === 'high') {\n header = '\uD83C\uDFAF **High-confidence memory match found:**\\n\\n';\n } else if (confidence === 'suggested') {\n header = '\uD83D\uDCA1 **Suggested memories (may be relevant):**\\n\\n';\n }\n\n return header + result.context;\n }\n\n /**\n * Record a query-level retrieval trace used by hooks and dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n await this.deps.initialize();\n await this.deps.traceStore.recordRetrievalTrace({\n ...input,\n projectHash: this.deps.getProjectHash() || undefined,\n candidateDetails: [],\n selectedDetails: [],\n fallbackTrace: [],\n });\n }\n\n /**\n * Increment access count for memories that were injected into prompts.\n *\n * Access count writes are intentionally store-scoped: the SQLite access store\n * initializes itself and no-ops in read-only mode, so this avoids triggering\n * the heavier retrieval/vector initialization path for prompt telemetry.\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n await this.deps.accessStore.incrementAccessCount(eventIds);\n }\n\n /**\n * Record a selected retrieval for helpfulness analytics.\n */\n async recordRetrieval(\n eventId: string,\n sessionId: string,\n score: number,\n query: string\n ): Promise<void> {\n await this.deps.initialize();\n await this.deps.accessStore.recordRetrieval(eventId, sessionId, score, query);\n }\n\n private async recordAutomaticTrace(\n query: string,\n result: UnifiedRetrievalResult,\n options: RetrieveMemoriesOptions | undefined,\n projectHash: string | null\n ): Promise<void> {\n const selectedEventIds = result.memories.map((memory) => memory.event.id);\n const selectedDetails = (result.selectedDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n }));\n const candidateDetails = (result.candidateDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n }));\n const candidateEventIds = candidateDetails.length > 0\n ? candidateDetails.map((detail) => detail.eventId)\n : selectedEventIds;\n\n await this.deps.traceStore.recordRetrievalTrace({\n sessionId: options?.sessionId,\n projectHash: projectHash || undefined,\n queryText: query,\n strategy: options?.strategy || 'auto',\n candidateEventIds,\n selectedEventIds,\n candidateDetails,\n selectedDetails,\n confidence: result.matchResult.confidence,\n fallbackTrace: result.fallbackTrace || []\n });\n }\n\n private isLightweightFastRead(options: RetrieveMemoriesOptions | undefined): boolean {\n const requiresSharedRuntime = options?.includeShared === true && this.deps.hasSharedStore();\n\n return options?.strategy === 'fast'\n && !requiresSharedRuntime\n && options.adaptiveRerank !== true;\n }\n\n private getConfiguredRerankWeights(): RerankWeights | undefined {\n const semantic = Number(process.env.MEMORY_RERANK_WEIGHT_SEMANTIC ?? '');\n const lexical = Number(process.env.MEMORY_RERANK_WEIGHT_LEXICAL ?? '');\n const recency = Number(process.env.MEMORY_RERANK_WEIGHT_RECENCY ?? '');\n\n const allFinite = [semantic, lexical, recency].every((value) => Number.isFinite(value));\n if (!allFinite) return undefined;\n\n const nonNegative = [semantic, lexical, recency].every((value) => value >= 0);\n const total = semantic + lexical + recency;\n if (!nonNegative || total <= 0) return undefined;\n\n return {\n semantic: semantic / total,\n lexical: lexical / total,\n recency: recency / total,\n };\n }\n\n private async getRerankWeights(adaptive: boolean): Promise<RerankWeights | undefined> {\n const configured = this.getConfiguredRerankWeights();\n if (configured) return configured;\n if (adaptive) return this.getAdaptiveRerankWeights();\n return undefined;\n }\n\n private async getAdaptiveRerankWeights(): Promise<RerankWeights | undefined> {\n try {\n const stats = await this.deps.traceStore.getHelpfulnessStats();\n if (stats.totalEvaluated < 20) return undefined;\n\n // Base weights.\n let semantic = 0.7;\n let lexical = 0.2;\n let recency = 0.1;\n\n if (stats.avgScore < 0.45) {\n semantic -= 0.1;\n lexical += 0.1;\n } else if (stats.avgScore > 0.75) {\n semantic += 0.05;\n lexical -= 0.05;\n }\n\n if (stats.unhelpful > stats.helpful) {\n recency += 0.05;\n semantic -= 0.03;\n lexical -= 0.02;\n }\n\n return { semantic, lexical, recency };\n } catch {\n return undefined;\n }\n }\n\n private async rewriteQueryIntent(query: string): Promise<string | null> {\n if (process.env.MEMORY_INTENT_REWRITE_ENABLED !== '1') return null;\n\n const apiUrl = process.env.COMPANY_STOCK_API_URL || process.env.COMPANY_INT_API_URL;\n if (!apiUrl) return null;\n\n const controller = new AbortController();\n const timeoutMs = Number(process.env.MEMORY_INTENT_REWRITE_TIMEOUT_MS || 5000);\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const prompt = [\n 'Rewrite user query for memory retrieval intent expansion.',\n 'Return plain text only, one line, no markdown.',\n `Query: ${query}`,\n ].join('\\n');\n\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Origin: process.env.COMPANY_INT_ORIGIN || 'http://company-int.aplusai.ai',\n Referer: process.env.COMPANY_INT_REFERER || 'http://company-int.aplusai.ai/',\n },\n body: JSON.stringify({\n question: prompt,\n company_name: null,\n conversation_id: null,\n }),\n signal: controller.signal,\n });\n\n const text = (await res.text()).trim();\n if (!text) return null;\n\n const oneLine = text\n .replace(/^data:\\s*/gm, '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(' ')\n .slice(0, 240);\n\n if (!oneLine || oneLine.toLowerCase() === query.toLowerCase()) return null;\n return oneLine;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nexport function createRetrievalOrchestrator(\n deps: RetrievalOrchestratorDeps\n): RetrievalOrchestrator {\n return new RetrievalOrchestrator(deps);\n}\n", "/**\n * Retrieval Services Bundle\n *\n * Owns construction and wiring for retrieval-facing engine services so\n * MemoryService can hold a thin facade boundary instead of directly\n * instantiating each retrieval collaborator.\n */\n\nimport type { Embedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport type { Matcher } from '../matcher.js';\nimport type { MemoryEvent } from '../types.js';\nimport {\n createRetriever as createCoreRetriever,\n type Retriever\n} from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createRetrievalAnalyticsService,\n type RetrievalAnalyticsService,\n type RetrievalAnalyticsStore\n} from './retrieval-analytics-service.js';\nimport {\n createRetrievalDisclosureService,\n type RetrievalDisclosureEventStore,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore\n} from './retrieval-disclosure-service.js';\nimport {\n createRetrievalOrchestrator,\n type RetrievalAccessStore,\n type RetrievalOrchestrator,\n type RetrievalTraceStore\n} from './retrieval-orchestrator.js';\n\nexport interface RetrievalSourceStore {\n getRecentEvents(limit?: number): Promise<MemoryEvent[]>;\n}\n\nexport type RetrievalEventStore = RetrievalTraceStore\n & RetrievalAccessStore\n & RetrievalDisclosureEventStore\n & RetrievalAnalyticsStore\n & RetrievalSourceStore;\n\nexport type CreateRetrieverFn = (\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n) => Retriever;\n\nexport interface RetrievalServicesDeps {\n initialize: () => Promise<void>;\n eventStore: RetrievalEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n sharedStore?: RetrievalDisclosureSharedStore;\n createRetriever?: CreateRetrieverFn;\n}\n\nexport interface RetrievalServices {\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n}\n\nexport function createRetrievalServices(deps: RetrievalServicesDeps): RetrievalServices {\n const retrieverFactory = deps.createRetriever ?? defaultCreateRetriever;\n const retriever = retrieverFactory(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder,\n deps.matcher\n );\n const retrievalOrchestrator = createRetrievalOrchestrator({\n initialize: deps.initialize,\n retriever,\n traceStore: deps.eventStore,\n accessStore: deps.eventStore,\n getProjectHash: deps.getProjectHash,\n hasSharedStore: deps.hasSharedStore\n });\n const retrievalDisclosureService = createRetrievalDisclosureService({\n initialize: deps.initialize,\n retrievalOrchestrator,\n eventStore: deps.eventStore,\n sharedStore: deps.sharedStore\n });\n const retrievalAnalyticsService = createRetrievalAnalyticsService({\n initialize: deps.initialize,\n retrievalStore: deps.eventStore\n });\n\n return {\n retriever,\n retrievalOrchestrator,\n retrievalDisclosureService,\n retrievalAnalyticsService\n };\n}\n\nfunction defaultCreateRetriever(\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n assertDefaultRetrieverStore(eventStore);\n return createCoreRetriever(\n eventStore as unknown as EventStore,\n vectorStore,\n embedder,\n matcher\n );\n}\n\nfunction assertDefaultRetrieverStore(eventStore: RetrievalEventStore): void {\n const store = eventStore as unknown as Record<string, unknown>;\n for (const method of ['getEvent', 'getSessionEvents', 'getRecentEvents']) {\n if (typeof store[method] !== 'function') {\n throw new TypeError(`Default retrieval service eventStore requires ${method}()`);\n }\n }\n}\n\nexport {\n RetrievalAnalyticsService,\n createRetrievalAnalyticsService\n} from './retrieval-analytics-service.js';\nexport type {\n AccessedMemory,\n HelpfulMemory,\n HelpfulnessStats,\n RetrievalAnalyticsServiceDeps,\n RetrievalAnalyticsStore,\n RetrievalTrace,\n RetrievalTraceStats\n} from './retrieval-analytics-service.js';\nexport {\n RetrievalDisclosureService,\n createRetrievalDisclosureService,\n parseDisclosureResultId,\n parseDisclosureResultRef,\n toDisclosureResultId\n} from './retrieval-disclosure-service.js';\nexport type {\n RetrievalDisclosureEnvelope,\n RetrievalDisclosureEventStore,\n RetrievalDisclosureExpansion,\n RetrievalDisclosureExpandOptions,\n RetrievalDisclosureOrchestrator,\n RetrievalDisclosureReason,\n RetrievalDisclosureSearchOptions,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureServiceDeps,\n RetrievalDisclosureSharedStore,\n RetrievalDisclosureSource,\n RetrievalDisclosureSourceReference,\n RetrievalDisclosureSourceType\n} from './retrieval-disclosure-service.js';\nexport {\n RetrievalOrchestrator,\n createRetrievalOrchestrator\n} from './retrieval-orchestrator.js';\nexport type {\n RecordQueryTraceInput,\n RetrievalAccessStore,\n RetrievalOrchestratorDeps,\n RetrievalTraceStore,\n RetrieveMemoriesOptions\n} from './retrieval-orchestrator.js';\n", "/**\n * Graduation Worker\n * Periodically evaluates memory events for promotion to higher levels\n * L0 \u2192 L1 \u2192 L2 \u2192 L3 \u2192 L4 based on access patterns and confidence\n */\n\nimport type { MemoryLevel } from './types.js';\nimport { EventStore } from './event-store.js';\nimport { GraduationPipeline } from './graduation.js';\n\nexport interface GraduationWorkerConfig {\n /** How often to run graduation evaluation (ms) */\n evaluationIntervalMs: number;\n /** Batch size for graduation evaluation */\n batchSize: number;\n /** Minimum time between evaluations of the same event (ms) */\n cooldownMs: number;\n}\n\nconst DEFAULT_CONFIG: GraduationWorkerConfig = {\n evaluationIntervalMs: 300000, // 5 minutes\n batchSize: 50,\n cooldownMs: 3600000 // 1 hour cooldown between evaluations\n};\n\nexport class GraduationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastEvaluated: Map<string, number> = new Map();\n\n constructor(\n private eventStore: EventStore,\n private graduation: GraduationPipeline,\n private config: GraduationWorkerConfig = DEFAULT_CONFIG\n ) {}\n\n /**\n * Start the graduation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the graduation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceRun(): Promise<GraduationRunResult> {\n return await this.runGraduation();\n }\n\n /**\n * Schedule the next graduation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.evaluationIntervalMs\n );\n }\n\n /**\n * Run graduation evaluation\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.runGraduation();\n } catch (error) {\n console.error('Graduation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Perform graduation evaluation across all levels\n */\n private async runGraduation(): Promise<GraduationRunResult> {\n const result: GraduationRunResult = {\n evaluated: 0,\n graduated: 0,\n byLevel: {}\n };\n\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3'];\n const now = Date.now();\n\n for (const level of levels) {\n const events = await this.eventStore.getEventsByLevel(level, {\n limit: this.config.batchSize\n });\n\n let levelGraduated = 0;\n\n for (const event of events) {\n // Check cooldown\n const lastEval = this.lastEvaluated.get(event.id);\n if (lastEval && (now - lastEval) < this.config.cooldownMs) {\n continue;\n }\n\n result.evaluated++;\n this.lastEvaluated.set(event.id, now);\n\n const gradResult = await this.graduation.evaluateGraduation(event.id, level);\n\n if (gradResult.success) {\n result.graduated++;\n levelGraduated++;\n }\n }\n\n if (levelGraduated > 0) {\n result.byLevel[level] = levelGraduated;\n }\n }\n\n // Clean up old cooldown entries (keep last 1000)\n if (this.lastEvaluated.size > 1000) {\n const entries = Array.from(this.lastEvaluated.entries());\n entries.sort((a, b) => b[1] - a[1]);\n this.lastEvaluated = new Map(entries.slice(0, 1000));\n }\n\n return result;\n }\n}\n\nexport interface GraduationRunResult {\n evaluated: number;\n graduated: number;\n byLevel: Record<string, number>;\n}\n\n/**\n * Create a Graduation Worker instance\n */\nexport function createGraduationWorker(\n eventStore: EventStore,\n graduation: GraduationPipeline,\n config?: Partial<GraduationWorkerConfig>\n): GraduationWorker {\n return new GraduationWorker(\n eventStore,\n graduation,\n { ...DEFAULT_CONFIG, ...config }\n );\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent)\n */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await dbRun(\n this.db,\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed, but only if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n } catch (failError) {\n // Database might be closed during shutdown, ignore\n console.warn('Could not mark outbox items as failed (database may be closed)');\n }\n }\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n // Only try to mark as failed if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n } catch {\n // Database might be closed during shutdown, ignore\n }\n }\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker V2 error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * Memory Runtime Service\n * Owns MemoryService lifecycle concerns: initialization, background workers,\n * lightweight/read-only modes, and orderly shutdown.\n */\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport {\n createGraduationWorker as defaultCreateGraduationWorker,\n type GraduationRunResult,\n type GraduationWorker\n} from '../graduation-worker.js';\nimport type { Retriever } from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createVectorWorker as defaultCreateVectorWorker,\n type VectorWorker\n} from '../vector-worker.js';\n\nexport interface RuntimeSQLiteStore {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface RuntimeEndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n shutdown(): void;\n}\n\nexport interface RuntimeSharedMemoryServices {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface MemoryRuntimeServicesFactories {\n createVectorWorker?: typeof defaultCreateVectorWorker;\n createGraduationWorker?: typeof defaultCreateGraduationWorker;\n}\n\nexport interface MemoryRuntimeServicesDeps {\n sqliteStore: RuntimeSQLiteStore;\n eventStore: EventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n graduation: GraduationPipeline;\n endlessMemoryServices: RuntimeEndlessMemoryServices;\n sharedMemoryServices: RuntimeSharedMemoryServices;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n factories?: MemoryRuntimeServicesFactories;\n}\n\nexport interface MemoryRuntimeService {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n processPendingEmbeddings(): Promise<number>;\n forceGraduation(): Promise<GraduationRunResult>;\n recordMemoryAccess(eventId: string, sessionId: string, confidence?: number): void;\n getVectorWorker(): VectorWorker | null;\n isInitialized(): boolean;\n}\n\nfunction createEmptyGraduationResult(): GraduationRunResult {\n return { evaluated: 0, graduated: 0, byLevel: {} };\n}\n\nexport function createMemoryRuntimeService(deps: MemoryRuntimeServicesDeps): MemoryRuntimeService {\n const createVectorWorker = deps.factories?.createVectorWorker ?? defaultCreateVectorWorker;\n const createGraduationWorker = deps.factories?.createGraduationWorker ?? defaultCreateGraduationWorker;\n\n let initialized = false;\n let vectorWorker: VectorWorker | null = null;\n let graduationWorker: GraduationWorker | null = null;\n\n return {\n async initialize(): Promise<void> {\n if (initialized) return;\n\n // Initialize PRIMARY store: SQLite (always)\n await deps.sqliteStore.initialize();\n\n // Lightweight mode: only SQLite, no embedder/vector/workers.\n // Used for hooks that just need to store data quickly.\n if (deps.lightweightMode) {\n initialized = true;\n return;\n }\n\n await deps.vectorStore.initialize();\n await deps.embedder.initialize();\n\n // Skip write-related workers in read-only mode.\n if (!deps.readOnly) {\n vectorWorker = createVectorWorker(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorker.start();\n\n if (!deps.embeddingOnly) {\n deps.retriever.setGraduationPipeline(deps.graduation);\n graduationWorker = createGraduationWorker(\n deps.eventStore,\n deps.graduation\n );\n graduationWorker.start();\n }\n\n await deps.endlessMemoryServices.initializeFromSavedMode();\n await deps.sharedMemoryServices.initialize();\n }\n\n initialized = true;\n },\n\n async shutdown(): Promise<void> {\n if (graduationWorker) {\n graduationWorker.stop();\n }\n\n deps.endlessMemoryServices.shutdown();\n\n if (vectorWorker) {\n vectorWorker.stop();\n }\n\n await deps.sharedMemoryServices.close();\n await deps.sqliteStore.close();\n },\n\n async processPendingEmbeddings(): Promise<number> {\n if (vectorWorker) {\n return vectorWorker.processAll();\n }\n return 0;\n },\n\n async forceGraduation(): Promise<GraduationRunResult> {\n if (!graduationWorker) {\n return createEmptyGraduationResult();\n }\n return graduationWorker.forceRun();\n },\n\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n deps.graduation.recordAccess(eventId, sessionId, confidence);\n },\n\n getVectorWorker(): VectorWorker | null {\n return vectorWorker;\n },\n\n isInitialized(): boolean {\n return initialized;\n }\n };\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Embedder } from '../vector/index.js';\nimport { createSharedEventStore, type SharedEventStore } from '../../core/shared-event-store.js';\nimport { createSharedPromoter, type PromotionResult, type SharedPromoter } from '../../core/shared-promoter.js';\nimport { createSharedStore, type SharedStore } from '../../core/shared-store.js';\nimport { createSharedVectorStore, type SharedVectorStore } from '../../core/shared-vector-store.js';\nimport type { Entry, SharedStoreConfig, SharedTroubleshootingEntry } from '../../core/types.js';\n\nexport interface SharedMemoryRetriever {\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void;\n}\n\nexport interface SharedMemoryServicesFactories {\n existsSync?: (targetPath: string) => boolean;\n mkdirSync?: (targetPath: string) => void;\n createSharedEventStore?: (dbPath: string) => SharedEventStore;\n createSharedStore?: (sharedEventStore: SharedEventStore) => SharedStore;\n createSharedVectorStore?: (dbPath: string) => SharedVectorStore;\n createSharedPromoter?: (\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n ) => SharedPromoter;\n}\n\nexport interface SharedMemoryServicesOptions {\n config: SharedStoreConfig | null;\n defaultSharedStoragePath: string;\n readOnly: boolean;\n expandPath: (targetPath: string) => string;\n embedder: Embedder;\n retriever: SharedMemoryRetriever;\n factories?: SharedMemoryServicesFactories;\n}\n\nexport type SharedStoreStats = {\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n};\n\nexport class SharedMemoryServices {\n private sharedEventStore: SharedEventStore | null = null;\n private sharedStore: SharedStore | null = null;\n private sharedVectorStore: SharedVectorStore | null = null;\n private sharedPromoter: SharedPromoter | null = null;\n private openStorePromise: Promise<SharedStore> | null = null;\n\n constructor(private readonly options: SharedMemoryServicesOptions) {}\n\n get eventStore(): SharedEventStore | null {\n return this.sharedEventStore;\n }\n\n get store(): SharedStore | null {\n return this.sharedStore;\n }\n\n get vectorStore(): SharedVectorStore | null {\n return this.sharedVectorStore;\n }\n\n get promoter(): SharedPromoter | null {\n return this.sharedPromoter;\n }\n\n isEnabled(): boolean {\n return this.sharedStore !== null;\n }\n\n getSharedStoragePath(): string {\n return this.options.config?.sharedStoragePath\n ? this.options.expandPath(this.options.config.sharedStoragePath)\n : this.options.defaultSharedStoragePath;\n }\n\n async initialize(): Promise<void> {\n if (this.options.config?.enabled === false || this.options.readOnly) return;\n\n const sharedPath = this.getSharedStoragePath();\n this.ensureDirectory(sharedPath, { allowCreate: true });\n\n const store = await this.openStore(sharedPath);\n\n this.sharedVectorStore = this.factories.createSharedVectorStore(\n path.join(sharedPath, 'vectors')\n );\n await this.sharedVectorStore.initialize();\n\n this.sharedPromoter = this.factories.createSharedPromoter(\n store,\n this.sharedVectorStore,\n this.options.embedder,\n this.options.config || undefined\n );\n\n this.options.retriever.setSharedStores(store, this.sharedVectorStore);\n }\n\n async ensureStoreForRead(): Promise<SharedStore | null> {\n if (this.options.config?.enabled === false) return null;\n if (this.sharedStore) return this.sharedStore;\n\n const sharedPath = this.getSharedStoragePath();\n const directoryReady = this.ensureDirectory(sharedPath, { allowCreate: !this.options.readOnly });\n if (!directoryReady) return null;\n\n return this.openStore(sharedPath);\n }\n\n async getEntryForDisclosure(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const store = await this.ensureStoreForRead();\n return store?.get(entryId) ?? null;\n }\n\n async promoteToShared(entry: Entry, projectHash: string | null): Promise<PromotionResult> {\n if (!this.sharedPromoter || !projectHash) {\n return {\n success: false,\n error: 'Shared store not initialized or project hash not set'\n };\n }\n\n return this.sharedPromoter.promoteEntry(entry, projectHash);\n }\n\n async getStats(): Promise<SharedStoreStats | null> {\n if (!this.sharedStore) return null;\n return this.sharedStore.getStats();\n }\n\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n if (!this.sharedStore) return [];\n return this.sharedStore.search(query, options);\n }\n\n async close(): Promise<void> {\n if (this.openStorePromise) {\n await this.openStorePromise.catch(() => null);\n }\n\n if (this.sharedEventStore) {\n await this.sharedEventStore.close();\n }\n this.sharedEventStore = null;\n this.sharedStore = null;\n this.sharedVectorStore = null;\n this.sharedPromoter = null;\n this.openStorePromise = null;\n }\n\n private async openStore(sharedPath: string): Promise<SharedStore> {\n if (this.sharedStore) return this.sharedStore;\n\n if (!this.openStorePromise) {\n this.openStorePromise = this.createOpenStorePromise(sharedPath);\n }\n\n try {\n return await this.openStorePromise;\n } finally {\n this.openStorePromise = null;\n }\n }\n\n private async createOpenStorePromise(sharedPath: string): Promise<SharedStore> {\n if (!this.sharedEventStore) {\n const sharedEventStore = this.factories.createSharedEventStore(\n path.join(sharedPath, 'shared.duckdb')\n );\n await sharedEventStore.initialize();\n this.sharedEventStore = sharedEventStore;\n }\n\n if (!this.sharedStore) {\n this.sharedStore = this.factories.createSharedStore(this.sharedEventStore);\n }\n\n return this.sharedStore;\n }\n\n private ensureDirectory(sharedPath: string, options: { allowCreate: boolean }): boolean {\n if (this.factories.existsSync(sharedPath)) return true;\n if (!options.allowCreate) return false;\n this.factories.mkdirSync(sharedPath);\n return true;\n }\n\n private get factories(): Required<SharedMemoryServicesFactories> {\n return {\n existsSync: this.options.factories?.existsSync ?? fs.existsSync,\n mkdirSync: this.options.factories?.mkdirSync ?? ((targetPath: string) => {\n fs.mkdirSync(targetPath, { recursive: true });\n }),\n createSharedEventStore: this.options.factories?.createSharedEventStore ?? createSharedEventStore,\n createSharedStore: this.options.factories?.createSharedStore ?? createSharedStore,\n createSharedVectorStore: this.options.factories?.createSharedVectorStore ?? createSharedVectorStore,\n createSharedPromoter: this.options.factories?.createSharedPromoter ?? createSharedPromoter\n };\n }\n}\n\nexport function createSharedMemoryServices(options: SharedMemoryServicesOptions): SharedMemoryServices {\n return new SharedMemoryServices(options);\n}\n", "/**\n * SharedEventStore - Global database for cross-project knowledge\n * Location: ~/.claude-code/memory/shared/\n */\n\nimport {\n createDatabase,\n dbRun,\n dbClose,\n type Database\n} from './db-wrapper.js';\n\nexport class SharedEventStore {\n private db: Database;\n private initialized = false;\n\n constructor(dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Shared troubleshooting entries table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_troubleshooting (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n symptoms JSON NOT NULL,\n root_cause TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n last_used_at TIMESTAMP,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: best practices table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_best_practices (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n topics JSON NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: common errors table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_common_errors (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n error_pattern TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Indexes for troubleshooting\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence\n ON shared_troubleshooting(confidence DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_usage\n ON shared_troubleshooting(usage_count DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_source\n ON shared_troubleshooting(source_project_hash)\n `);\n\n this.initialized = true;\n }\n\n getDatabase(): Database {\n return this.db;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async close(): Promise<void> {\n await dbClose(this.db);\n this.initialized = false;\n }\n}\n\nexport function createSharedEventStore(dbPath: string): SharedEventStore {\n return new SharedEventStore(dbPath);\n}\n", "/**\n * SharedPromoter - Handles auto-promotion of verified troubleshooting entries\n * Promotes entries from project-local storage to cross-project shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { Entry, SharedTroubleshootingInput, SharedStoreConfig } from './types.js';\n\nexport interface TroubleshootingContent {\n symptoms?: string[];\n rootCause?: string;\n solution?: string;\n technologies?: string[];\n}\n\nexport interface PromotionResult {\n success: boolean;\n entryId?: string;\n error?: string;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport class SharedPromoter {\n constructor(\n private sharedStore: SharedStore,\n private sharedVectorStore: SharedVectorStore,\n private embedder: Embedder,\n private config?: SharedStoreConfig\n ) {}\n\n /**\n * Check if an entry is eligible for promotion\n */\n isEligibleForPromotion(entry: Entry): boolean {\n // Must be troubleshooting type\n if (entry.entryType !== 'troubleshooting') {\n return false;\n }\n\n // Must be at least 'verified' stage\n if (entry.stage !== 'verified' && entry.stage !== 'certified') {\n return false;\n }\n\n // Must be active status\n if (entry.status !== 'active') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n entry: Entry,\n projectHash: string\n ): Promise<PromotionResult> {\n // Validate eligibility\n if (!this.isEligibleForPromotion(entry)) {\n return {\n success: false,\n skipped: true,\n skipReason: `Entry not eligible: type=${entry.entryType}, stage=${entry.stage}, status=${entry.status}`\n };\n }\n\n // Check if already promoted\n const exists = await this.sharedStore.exists(projectHash, entry.entryId);\n if (exists) {\n return {\n success: true,\n skipped: true,\n skipReason: 'Entry already exists in shared store'\n };\n }\n\n try {\n const content = entry.contentJson as TroubleshootingContent;\n const confidence = this.calculateConfidence(entry);\n\n // Check minimum confidence threshold\n const minConfidence = this.config?.minConfidenceForPromotion ?? 0.8;\n if (confidence < minConfidence) {\n return {\n success: false,\n skipped: true,\n skipReason: `Confidence ${confidence} below threshold ${minConfidence}`\n };\n }\n\n const input: SharedTroubleshootingInput = {\n sourceProjectHash: projectHash,\n sourceEntryId: entry.entryId,\n title: entry.title,\n symptoms: content.symptoms || [],\n rootCause: content.rootCause || '',\n solution: content.solution || '',\n topics: this.extractTopics(entry),\n technologies: content.technologies || [],\n confidence\n };\n\n // Promote to shared store\n const entryId = await this.sharedStore.promoteEntry(input);\n\n // Create embedding for vector search\n const embeddingContent = this.createEmbeddingContent(input);\n const embedding = await this.embedder.embed(embeddingContent);\n\n await this.sharedVectorStore.upsert({\n id: randomUUID(),\n entryId,\n entryType: 'troubleshooting',\n content: embeddingContent,\n vector: embedding.vector,\n topics: input.topics,\n sourceProjectHash: projectHash\n });\n\n return {\n success: true,\n entryId\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Batch promote multiple entries\n */\n async promoteEntries(\n entries: Entry[],\n projectHash: string\n ): Promise<Map<string, PromotionResult>> {\n const results = new Map<string, PromotionResult>();\n\n for (const entry of entries) {\n const result = await this.promoteEntry(entry, projectHash);\n results.set(entry.entryId, result);\n }\n\n return results;\n }\n\n /**\n * Extract topics from entry\n */\n private extractTopics(entry: Entry): string[] {\n const topics: string[] = [];\n\n // Extract from title (meaningful words)\n const titleWords = entry.title\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter(w => w.length > 3 && !this.isStopWord(w));\n topics.push(...titleWords);\n\n // Extract from content if available\n const content = entry.contentJson as Record<string, unknown>;\n if (content.topics && Array.isArray(content.topics)) {\n topics.push(...content.topics.map(t => String(t).toLowerCase()));\n }\n\n // Extract technologies as topics\n if (content.technologies && Array.isArray(content.technologies)) {\n topics.push(...content.technologies.map(t => String(t).toLowerCase()));\n }\n\n // Dedupe and return\n return [...new Set(topics)];\n }\n\n /**\n * Check if word is a stop word\n */\n private isStopWord(word: string): boolean {\n const stopWords = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have', 'been',\n 'were', 'are', 'was', 'had', 'has', 'will', 'would', 'could', 'should',\n 'when', 'where', 'what', 'which', 'while', 'error', 'problem', 'issue'\n ]);\n return stopWords.has(word);\n }\n\n /**\n * Calculate confidence score for entry\n */\n private calculateConfidence(entry: Entry): number {\n let confidence = 0.8; // Base confidence for verified entries\n\n // Boost if certified\n if (entry.stage === 'certified') {\n confidence = 0.95;\n }\n\n // Could add more factors:\n // - Number of evidence items\n // - Age of entry (older verified entries may be more reliable)\n // - Usage count if tracked\n\n return Math.min(confidence, 1.0);\n }\n\n /**\n * Create embedding content from input\n */\n private createEmbeddingContent(input: SharedTroubleshootingInput): string {\n const parts: string[] = [];\n\n parts.push(`Problem: ${input.title}`);\n\n if (input.symptoms.length > 0) {\n parts.push(`Symptoms: ${input.symptoms.join(', ')}`);\n }\n\n if (input.rootCause) {\n parts.push(`Root Cause: ${input.rootCause}`);\n }\n\n if (input.solution) {\n parts.push(`Solution: ${input.solution}`);\n }\n\n if (input.technologies && input.technologies.length > 0) {\n parts.push(`Technologies: ${input.technologies.join(', ')}`);\n }\n\n return parts.join('\\n');\n }\n}\n\nexport function createSharedPromoter(\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n): SharedPromoter {\n return new SharedPromoter(sharedStore, sharedVectorStore, embedder, config);\n}\n", "/**\n * SharedStore - Cross-project troubleshooting knowledge store\n * Manages promotion from verified entries to shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n SharedTroubleshootingEntry,\n SharedTroubleshootingInput\n} from './types.js';\nimport { SharedEventStore } from './shared-event-store.js';\n\nexport class SharedStore {\n constructor(private sharedEventStore: SharedEventStore) {}\n\n private get db(): Database {\n return this.sharedEventStore.getDatabase();\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n input: SharedTroubleshootingInput\n ): Promise<string> {\n const entryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO shared_troubleshooting (\n entry_id, source_project_hash, source_entry_id,\n title, symptoms, root_cause, solution, topics,\n technologies, confidence, promoted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (source_project_hash, source_entry_id)\n DO UPDATE SET\n title = excluded.title,\n symptoms = excluded.symptoms,\n root_cause = excluded.root_cause,\n solution = excluded.solution,\n topics = excluded.topics,\n technologies = excluded.technologies,\n confidence = CASE\n WHEN excluded.confidence > shared_troubleshooting.confidence\n THEN excluded.confidence\n ELSE shared_troubleshooting.confidence\n END`,\n [\n entryId,\n input.sourceProjectHash,\n input.sourceEntryId,\n input.title,\n JSON.stringify(input.symptoms),\n input.rootCause,\n input.solution,\n JSON.stringify(input.topics),\n JSON.stringify(input.technologies || []),\n input.confidence\n ]\n );\n\n return entryId;\n }\n\n /**\n * Search troubleshooting entries by text query\n */\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n const minConfidence = options?.minConfidence || 0.5;\n const searchPattern = `%${query}%`;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE (title LIKE ? OR root_cause LIKE ? OR solution LIKE ?)\n AND confidence >= ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [searchPattern, searchPattern, searchPattern, minConfidence, topK]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(\n topics: string[],\n options?: { topK?: number; excludeProjectHash?: string }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n\n if (topics.length === 0) {\n return [];\n }\n\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n let query = `SELECT * FROM shared_troubleshooting WHERE (${topicConditions})`;\n const params: unknown[] = [...topicParams];\n\n if (options?.excludeProjectHash) {\n query += ` AND source_project_hash != ?`;\n params.push(options.excludeProjectHash);\n }\n\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(topK);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Record usage of a shared entry (for ranking)\n */\n async recordUsage(entryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE shared_troubleshooting\n SET usage_count = usage_count + 1,\n last_used_at = CURRENT_TIMESTAMP\n WHERE entry_id = ?`,\n [entryId]\n );\n }\n\n /**\n * Get entry by ID\n */\n async get(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Get entry by source (project hash + entry ID)\n */\n async getBySource(\n projectHash: string,\n sourceEntryId: string\n ): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Check if an entry already exists in shared store\n */\n async exists(projectHash: string, sourceEntryId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Get all entries (with limit for safety)\n */\n async getAll(options?: { limit?: number }): Promise<SharedTroubleshootingEntry[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get statistics\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n }> {\n const countResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n const total = countResult[0]?.count || 0;\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM shared_troubleshooting`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const usageResult = await dbAll<{ total: number }>(\n this.db,\n `SELECT SUM(usage_count) as total FROM shared_troubleshooting`\n );\n const totalUsageCount = usageResult[0]?.total || 0;\n\n // Get topic counts\n const entries = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const entry of entries) {\n for (const topic of entry.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n const topTopics = Object.entries(topicCounts)\n .map(([topic, count]) => ({ topic, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return { total, averageConfidence, topTopics, totalUsageCount };\n }\n\n /**\n * Delete an entry\n */\n async delete(entryId: string): Promise<boolean> {\n const before = await this.count();\n await dbRun(\n this.db,\n `DELETE FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n const after = await this.count();\n return before > after;\n }\n\n private rowToEntry(row: Record<string, unknown>): SharedTroubleshootingEntry {\n return {\n entryId: row.entry_id as string,\n sourceProjectHash: row.source_project_hash as string,\n sourceEntryId: row.source_entry_id as string,\n title: row.title as string,\n symptoms: JSON.parse(row.symptoms as string || '[]'),\n rootCause: row.root_cause as string,\n solution: row.solution as string,\n topics: JSON.parse(row.topics as string || '[]'),\n technologies: JSON.parse(row.technologies as string || '[]'),\n confidence: row.confidence as number,\n usageCount: row.usage_count as number || 0,\n lastUsedAt: row.last_used_at ? toDate(row.last_used_at) : undefined,\n promotedAt: toDate(row.promoted_at),\n createdAt: toDate(row.created_at)\n };\n }\n}\n\nexport function createSharedStore(\n sharedEventStore: SharedEventStore\n): SharedStore {\n return new SharedStore(sharedEventStore);\n}\n", "/**\n * SharedVectorStore - Vector store for cross-project semantic search\n * Location: ~/.claude-code/memory/shared/vectors/\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { SharedEntryType, SharedSearchResult } from './types.js';\n\nexport interface SharedVectorRecord {\n id: string;\n entryId: string;\n entryType: SharedEntryType;\n content: string;\n vector: number[];\n topics: string[];\n sourceProjectHash?: string;\n}\n\nexport class SharedVectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'shared_knowledge';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n this.table = null;\n }\n }\n\n /**\n * Add or update a shared vector record\n */\n async upsert(record: SharedVectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n };\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n // Delete existing entry before adding (upsert behavior)\n try {\n await this.table.delete(`entryId = '${record.entryId}'`);\n } catch {\n // Entry might not exist, ignore\n }\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple records in batch\n */\n async upsertBatch(records: SharedVectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n excludeProjectHash?: string;\n entryType?: SharedEntryType;\n } = {}\n ): Promise<SharedSearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, excludeProjectHash, entryType } = options;\n\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2);\n\n // Apply filters\n const filters: string[] = [];\n if (excludeProjectHash) {\n filters.push(`sourceProjectHash != '${excludeProjectHash}'`);\n }\n if (entryType) {\n filters.push(`entryType = '${entryType}'`);\n }\n\n if (filters.length > 0) {\n query = query.where(filters.join(' AND '));\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n entryId: r.entryId as string,\n content: r.content as string,\n score,\n entryType: r.entryType as SharedEntryType\n };\n });\n }\n\n /**\n * Delete vector by entry ID\n */\n async delete(entryId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`entryId = '${entryId}'`);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n return this.table.countRows();\n }\n\n /**\n * Check if vector exists for entry\n */\n async exists(entryId: string): Promise<boolean> {\n if (!this.table) return false;\n\n try {\n const results = await this.table\n .search([])\n .where(`entryId = '${entryId}'`)\n .limit(1)\n .toArray();\n return results.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createSharedVectorStore(dbPath: string): SharedVectorStore {\n return new SharedVectorStore(dbPath);\n}\n", "/**\n * Project path registry utilities.\n *\n * These helpers are intentionally core-level and Claude-agnostic.\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Normalize and resolve a project path, handling symlinks when possible.\n */\nexport function normalizeProjectPath(projectPath: string): string {\n const expanded = projectPath.startsWith('~')\n ? path.join(os.homedir(), projectPath.slice(1))\n : projectPath;\n\n try {\n return fs.realpathSync(expanded);\n } catch {\n return path.resolve(expanded);\n }\n}\n\n/**\n * Generate a stable 8-character hash from a normalized project path.\n */\nexport function hashProjectPath(projectPath: string): string {\n const normalizedPath = normalizeProjectPath(projectPath);\n return crypto.createHash('sha256')\n .update(normalizedPath)\n .digest('hex')\n .slice(0, 8);\n}\n\n/**\n * Get the storage path for a project-local memory database.\n */\nexport function getProjectStoragePath(projectPath: string): string {\n const hash = hashProjectPath(projectPath);\n return path.join(os.homedir(), '.claude-code', 'memory', 'projects', hash);\n}\n\n/**\n * Resolve either an explicit project hash or a project path into a storage path.\n */\nexport function resolveProjectStoragePath(projectOrHash: string): string {\n const isHash = /^[a-f0-9]{8}$/.test(projectOrHash);\n return isHash\n ? path.join(os.homedir(), '.claude-code', 'memory', 'projects', projectOrHash)\n : getProjectStoragePath(projectOrHash);\n}\n", "/**\n * Session registry for mapping Claude session IDs to project-local storage.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { hashProjectPath, normalizeProjectPath } from './project-path.js';\n\nconst REGISTRY_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'session-registry.json');\n\nexport interface SessionRegistryEntry {\n projectPath: string;\n projectHash: string;\n registeredAt: string;\n}\n\nexport interface SessionRegistry {\n version: number;\n sessions: Record<string, SessionRegistryEntry>;\n}\n\nexport function loadSessionRegistry(): SessionRegistry {\n try {\n if (fs.existsSync(REGISTRY_PATH)) {\n const data = fs.readFileSync(REGISTRY_PATH, 'utf-8');\n return JSON.parse(data);\n }\n } catch (error) {\n console.error('Failed to load session registry:', error);\n }\n return { version: 1, sessions: {} };\n}\n\nfunction saveSessionRegistry(registry: SessionRegistry): void {\n const dir = path.dirname(REGISTRY_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = REGISTRY_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(registry, null, 2));\n fs.renameSync(tempPath, REGISTRY_PATH);\n}\n\nexport function registerSession(sessionId: string, projectPath: string): void {\n const registry = loadSessionRegistry();\n\n registry.sessions[sessionId] = {\n projectPath: normalizeProjectPath(projectPath),\n projectHash: hashProjectPath(projectPath),\n registeredAt: new Date().toISOString()\n };\n\n const entries = Object.entries(registry.sessions);\n if (entries.length > 1000) {\n const sorted = entries.sort((a, b) =>\n new Date(b[1].registeredAt).getTime() - new Date(a[1].registeredAt).getTime()\n );\n registry.sessions = Object.fromEntries(sorted.slice(0, 1000));\n }\n\n saveSessionRegistry(registry);\n}\n\nexport function getSessionProject(sessionId: string): SessionRegistryEntry | null {\n const registry = loadSessionRegistry();\n return registry.sessions[sessionId] || null;\n}\n", "import * as os from 'os';\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n /** Enable DuckDB analytics store (default: true for server, false for hooks) */\n analyticsEnabled?: boolean;\n /** Lightweight mode for hooks - skip heavy initialization (default: false) */\n lightweightMode?: boolean;\n /** Start only VectorWorker, skip GraduationWorker and SyncWorker (default: false) */\n embeddingOnly?: boolean;\n}\n\nconst SHARED_STORAGE_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'shared');\n\nexport const DISABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: false,\n autoPromote: false,\n searchShared: false,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_ENABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_SHARED_STORAGE_PATH = SHARED_STORAGE_PATH;\n", "/**\n * Memory Service Registry\n *\n * Owns process-local MemoryService instance caching and project/session service\n * resolution. Keeping this out of MemoryService prevents the compatibility\n * facade from also being the application-level service locator.\n */\n\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\nimport type { MemoryServiceConfig } from './memory-service-config.js';\n\nexport type MemoryServiceRegistryConfig = MemoryServiceConfig & {\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n};\n\nexport interface MemoryServiceRegistryDeps<TService> {\n createService: (config: MemoryServiceRegistryConfig) => TService;\n hashProjectPath: (projectPath: string) => string;\n getProjectStoragePath: (projectPath: string) => string;\n getSessionProject: (sessionId: string) => { projectHash: string; projectPath: string } | null;\n homedir: () => string;\n disabledSharedStoreConfig: SharedStoreConfig;\n serviceCache?: Map<string, TService>;\n}\n\nexport interface MemoryServiceRegistry<TService> {\n getDefaultMemoryService(): TService;\n getReadOnlyMemoryService(): TService;\n getMemoryServiceForProject(projectPath: string, sharedStoreConfig?: SharedStoreConfig): TService;\n getMemoryServiceForSession(sessionId: string): TService;\n getLightweightMemoryService(sessionId: string): TService;\n getLightweightMemoryServiceForProject(projectPath: string): TService;\n createMemoryService(config: MemoryServiceConfig): TService;\n}\n\nconst GLOBAL_KEY = '__global__';\n\nexport function createMemoryServiceRegistry<TService>(\n deps: MemoryServiceRegistryDeps<TService>\n): MemoryServiceRegistry<TService> {\n const serviceCache = deps.serviceCache ?? new Map<string, TService>();\n\n const getDefaultMemoryService = (): TService => {\n if (!serviceCache.has(GLOBAL_KEY)) {\n serviceCache.set(GLOBAL_KEY, deps.createService({\n storagePath: '~/.claude-code/memory',\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n return serviceCache.get(GLOBAL_KEY)!;\n };\n\n const getReadOnlyMemoryService = (): TService => deps.createService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n });\n\n const getMemoryServiceForProject = (\n projectPath: string,\n sharedStoreConfig?: SharedStoreConfig\n ): TService => {\n const hash = deps.hashProjectPath(projectPath);\n\n if (!serviceCache.has(hash)) {\n serviceCache.set(hash, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash: hash,\n projectPath,\n sharedStoreConfig: sharedStoreConfig ?? deps.disabledSharedStoreConfig,\n analyticsEnabled: false\n }));\n }\n\n // Project services are keyed only by project hash. This intentionally means\n // the first sharedStoreConfig used for a project wins; later calls for the\n // same project reuse the cached instance to preserve historical lock/cache\n // semantics instead of replacing the service graph under existing callers.\n return serviceCache.get(hash)!;\n };\n\n const getMemoryServiceForSession = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n\n if (projectInfo) {\n return getMemoryServiceForProject(projectInfo.projectPath);\n }\n\n return getDefaultMemoryService();\n };\n\n const getOrCreateLightweightProjectService = (\n projectHash: string,\n projectPath: string\n ): TService => {\n const key = `lightweight_${projectHash}`;\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash,\n projectPath,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryService = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n if (projectInfo) {\n return getOrCreateLightweightProjectService(projectInfo.projectHash, projectInfo.projectPath);\n }\n\n const key = 'lightweight_global';\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: path.join(deps.homedir(), '.claude-code', 'memory'),\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryServiceForProject = (projectPath: string): TService => {\n const projectHash = deps.hashProjectPath(projectPath);\n return getOrCreateLightweightProjectService(projectHash, projectPath);\n };\n\n return {\n getDefaultMemoryService,\n getReadOnlyMemoryService,\n getMemoryServiceForProject,\n getMemoryServiceForSession,\n getLightweightMemoryService,\n getLightweightMemoryServiceForProject,\n createMemoryService: (config: MemoryServiceConfig): TService => deps.createService(config)\n };\n}\n", "/**\n * Session History Importer\n * Imports existing Claude Code conversation history into memory\n *\n * Claude Code stores session history in:\n * ~/.claude/projects/<project-hash>/<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { randomUUID } from 'crypto';\nimport { MemoryService } from './memory-service.js';\nimport { registerSession } from '../core/registry/session-registry.js';\n\nexport type ProgressEvent =\n | { phase: 'scan'; message: string }\n | { phase: 'session-start'; sessionIndex: number; totalSessions: number; filePath: string }\n | { phase: 'session-progress'; sessionIndex: number; messagesProcessed: number; imported: number; skipped: number }\n | { phase: 'session-done'; sessionIndex: number; importedPrompts: number; importedResponses: number; skipped: number }\n | { phase: 'embedding'; processed: number; total: number }\n | { phase: 'done'; result: ImportResult };\n\nexport interface ImportOptions {\n projectPath?: string;\n sessionId?: string;\n limit?: number;\n /** Limit how many matching sessions are imported. Useful for freshness jobs that only need the latest active session. */\n sessionLimit?: number;\n skipExisting?: boolean;\n force?: boolean;\n verbose?: boolean;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nexport interface ImportResult {\n totalSessions: number;\n totalMessages: number;\n importedPrompts: number;\n importedResponses: number;\n skippedDuplicates: number;\n errors: string[];\n}\n\nexport interface ClaudeMessage {\n type: string;\n message?: {\n role: string;\n content: string | Array<{ type: string; text?: string; name?: string; tool_use_id?: string }>;\n };\n sessionId?: string;\n timestamp?: string;\n}\n\n/**\n * Classify a JSONL entry into a logical message type:\n * - 'user_prompt': Real user input (string content or text blocks without tool_result)\n * - 'tool_result': Tool execution result (user message with tool_result blocks)\n * - 'agent_text': Assistant text response (text blocks)\n * - 'tool_use': Assistant tool call (tool_use blocks)\n * - 'thinking': Assistant thinking (thinking blocks)\n * - 'skip': Everything else (progress, system, summary, etc.)\n */\n/**\n * Filter trivial user inputs that aren't worth storing.\n * Mirrors the shouldStorePrompt() logic from user-prompt-submit.ts.\n */\nexport function isClaudeLocalCommandArtifact(content: string): boolean {\n const trimmed = content.trim();\n return (\n /^<local-command-(stdout|stderr)>/.test(trimmed) ||\n /^<command-(name|message)>/.test(trimmed) ||\n (trimmed.includes('<command-name>') && trimmed.includes('<local-command-stdout>'))\n );\n}\n\nexport function isWorthStoringPrompt(content: string): boolean {\n const trimmed = content.trim();\n if (isClaudeLocalCommandArtifact(trimmed)) return false;\n if (trimmed.startsWith('/')) return false;\n if (trimmed.length < 15) return false;\n if (!/[a-zA-Z\uAC00-\uD7A3]{2,}/.test(trimmed)) return false;\n return true;\n}\n\nfunction getFileMtimeMs(filePath: string): number {\n try {\n return fs.statSync(filePath).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction selectRecentSessionFiles(files: string[], sessionLimit?: number): string[] {\n if (sessionLimit === undefined) return files;\n return [...files]\n .sort((a, b) => getFileMtimeMs(b) - getFileMtimeMs(a) || b.localeCompare(a))\n .slice(0, sessionLimit);\n}\n\nfunction parseSessionLimit(value?: number): number | undefined {\n if (value === undefined) return undefined;\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;\n}\n\nfunction applySessionLimit(files: string[], options: ImportOptions): string[] {\n return selectRecentSessionFiles(files, parseSessionLimit(options.sessionLimit));\n}\n\nfunction classifyEntry(entry: ClaudeMessage): 'user_prompt' | 'tool_result' | 'agent_text' | 'tool_use' | 'thinking' | 'skip' {\n if (entry.type !== 'user' && entry.type !== 'assistant') {\n return 'skip';\n }\n\n const content = entry.message?.content;\n if (!content) return 'skip';\n\n if (entry.type === 'user') {\n // String content = real user input\n if (typeof content === 'string') return 'user_prompt';\n\n // Array content: check for tool_result blocks\n if (Array.isArray(content)) {\n const hasToolResult = content.some(b => b.type === 'tool_result');\n if (hasToolResult) return 'tool_result';\n\n // Text-only blocks from user = real user input\n const hasText = content.some(b => b.type === 'text' && b.text);\n if (hasText) return 'user_prompt';\n }\n return 'skip';\n }\n\n // assistant type\n if (Array.isArray(content)) {\n const hasToolUse = content.some(b => b.type === 'tool_use');\n if (hasToolUse) return 'tool_use';\n\n const hasText = content.some(b => b.type === 'text' && b.text);\n if (hasText) return 'agent_text';\n\n const hasThinking = content.some(b => b.type === 'thinking');\n if (hasThinking) return 'thinking';\n } else if (typeof content === 'string' && content.length > 0) {\n return 'agent_text';\n }\n\n return 'skip';\n}\n\nexport class SessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly claudeDir: string;\n\n constructor(memoryService: MemoryService) {\n this.memoryService = memoryService;\n this.claudeDir = path.join(os.homedir(), '.claude');\n }\n\n /**\n * Import all sessions from a project\n */\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n\n // Find project directory\n onProgress?.({ phase: 'scan', message: 'Scanning for session files...' });\n const projectDirs = await this.findProjectDirs(projectPath);\n if (projectDirs.length === 0) {\n result.errors.push(`Project directory not found for: ${projectPath}`);\n return result;\n }\n\n // Find all session files across matched directories\n const allSessionFiles: string[] = [];\n for (const dir of projectDirs) {\n const files = await this.findSessionFiles(dir);\n allSessionFiles.push(...files);\n }\n const sessionFiles = [...new Set(allSessionFiles)];\n const selectedSessionFiles = applySessionLimit(sessionFiles, options);\n result.totalSessions = selectedSessionFiles.length;\n onProgress?.({\n phase: 'scan',\n message: `Found ${sessionFiles.length} sessions in ${projectDirs.length} matched project folder(s)`\n });\n\n if (options.verbose) {\n console.log(`Matched project folders:`);\n for (const dir of projectDirs) {\n console.log(` - ${dir}`);\n }\n console.log(`Found ${sessionFiles.length} session files across matched folders`);\n }\n\n // Import each selected session\n for (let i = 0; i < selectedSessionFiles.length; i++) {\n const sessionFile = selectedSessionFiles[i];\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessionFiles.length, filePath: sessionFile });\n const sessionResult = await this.importSessionFile(sessionFile, {\n ...options,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n onProgress?.({\n phase: 'session-done', sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to import ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Import a specific session file\n */\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n // Extract session ID from filename\n const sessionId = path.basename(filePath, '.jsonl');\n\n // Force reimport: delete existing events for this session\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(sessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${sessionId}`);\n }\n }\n\n // Start session in memory\n await this.memoryService.startSession(sessionId, options.projectPath);\n\n // Read and parse JSONL file\n const fileStream = fs.createReadStream(filePath);\n const rl = readline.createInterface({\n input: fileStream,\n crlfDelay: Infinity\n });\n\n let lineCount = 0;\n const limit = options.limit || Infinity;\n const onProgress = options.onProgress;\n const sessionIndex = (options as ImportOptions & { _sessionIndex?: number })._sessionIndex ?? 0;\n let lastProgressAt = 0;\n\n // Turn grouping with buffering:\n // - Buffer assistant text blocks within a turn\n // - On new user_prompt or EOF, flush buffer as a single merged agent_response\n // - Filter out short transitional text (< 100 chars) like \"Let me check...\"\n let currentTurnId: string | null = null;\n let textBuffer: string[] = [];\n let lastTimestamp: string | undefined;\n\n // Flush buffered text as a single agent_response\n const flushTextBuffer = async () => {\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n // Filter: keep substantive text (>= 100 chars), discard short transitional phrases\n const substantive = textBuffer.filter(t => t.length >= 100);\n\n // If all filtered out, keep the longest block (there's always something meaningful)\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : textBuffer.reduce((a, b) => a.length >= b.length ? a : b, '');\n\n if (!merged) { textBuffer = []; return; }\n\n // Truncate if very long\n const truncated = merged.length > 10000\n ? merged.slice(0, 10000) + '...[truncated]'\n : merged;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncated,\n { importedFrom: filePath, originalTimestamp: lastTimestamp, turnId: currentTurnId }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n lineCount++;\n textBuffer = [];\n };\n\n for await (const line of rl) {\n if (lineCount >= limit) break;\n\n try {\n const entry = JSON.parse(line) as ClaudeMessage;\n result.totalMessages++;\n\n const msgClass = classifyEntry(entry);\n\n if (msgClass === 'user_prompt') {\n // Flush previous turn's buffered responses before starting new turn\n await flushTextBuffer();\n\n const content = this.extractContent(entry);\n if (!content) continue;\n\n // Skip trivial inputs: slash commands, very short, no real words\n if (!isWorthStoringPrompt(content)) {\n result.skippedDuplicates++;\n continue;\n }\n\n // New turn starts with each real user prompt\n currentTurnId = randomUUID();\n\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp, turnId: currentTurnId }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n lineCount++;\n } else if (msgClass === 'agent_text') {\n // Buffer text instead of storing immediately\n const content = this.extractContent(entry);\n if (content) {\n textBuffer.push(content);\n lastTimestamp = entry.timestamp;\n }\n }\n // tool_result, tool_use, thinking, skip \u2192 ignored\n\n // Emit progress periodically\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n } catch (parseError) {\n // Skip malformed lines\n result.errors.push(`Parse error on line: ${parseError}`);\n }\n }\n\n // Flush any remaining buffered text from the last turn\n await flushTextBuffer();\n\n // End session\n await this.memoryService.endSession(sessionId);\n\n // Register session in registry so projects API can map hash \u2192 path\n if (options.projectPath) {\n registerSession(sessionId, options.projectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n /**\n * Import all sessions from all projects\n */\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n result.errors.push(`Projects directory not found: ${projectsDir}`);\n return result;\n }\n\n // Find all project directories and session files\n onProgress?.({ phase: 'scan', message: 'Scanning all projects...' });\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n // Collect all session files across all projects\n const allSessionFiles: string[] = [];\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n allSessionFiles.push(...sessionFiles);\n }\n onProgress?.({ phase: 'scan', message: `Found ${allSessionFiles.length} sessions across ${projectDirs.length} projects` });\n\n if (options.verbose) {\n console.log(`Found ${projectDirs.length} project directories, ${allSessionFiles.length} sessions`);\n }\n\n const selectedSessionFiles = applySessionLimit(allSessionFiles, options);\n result.totalSessions = selectedSessionFiles.length;\n onProgress?.({\n phase: 'scan',\n message: `Selected ${selectedSessionFiles.length} of ${allSessionFiles.length} session(s) for import`\n });\n\n // Import selected session files with progress tracking\n for (let i = 0; i < selectedSessionFiles.length; i++) {\n const sessionFile = selectedSessionFiles[i];\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessionFiles.length, filePath: sessionFile });\n const sessionResult = await this.importSessionFile(sessionFile, {\n ...options,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n onProgress?.({\n phase: 'session-done', sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to process ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Find project directories from project path.\n * Supports wrappers (e.g. happy) that append extra path segments in folder names.\n */\n private async findProjectDirs(projectPath: string): Promise<string[]> {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n return [];\n }\n\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n const normalizedPath = projectPath.replace(/\\+/g, '/').replace(/\\/$/, '');\n const normalizeToken = (value: string) => value\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/\\/+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n const normalizedDashed = normalizeToken(normalizedPath);\n const baseName = normalizeToken(path.basename(normalizedPath));\n\n const scored = projectDirs.map((dir) => {\n const dirName = path.basename(dir);\n const normalizedDirName = dirName.toLowerCase().replace(/[\\s_]+/g, '-');\n let score = 0;\n\n // strong matches\n if (normalizedDirName.includes(normalizedDashed)) score += 100;\n if (normalizedDashed.includes(normalizedDirName)) score += 80;\n\n // basename signal (handles wrappers adding extra suffix)\n if (baseName && normalizedDirName.includes(baseName)) score += 30;\n\n // token overlap signal\n const pathTokens = normalizedDashed.split('-').filter(Boolean);\n const tokenHits = pathTokens.filter(t => t.length >= 3 && normalizedDirName.includes(t)).length;\n score += Math.min(tokenHits, 20);\n\n return { dir, score, dirName };\n }).filter(x => x.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) return [];\n\n // Keep close matches (same family) to include wrapper-generated variants\n const top = scored[0].score;\n const threshold = Math.max(30, top - 25);\n\n return scored\n .filter(x => x.score >= threshold)\n .map(x => x.dir);\n }\n\n /**\n * Find all JSONL session files in a directory\n */\n private async findSessionFiles(dir: string): Promise<string[]> {\n if (!fs.existsSync(dir)) {\n return [];\n }\n\n return fs.readdirSync(dir)\n .filter(name => name.endsWith('.jsonl'))\n .map(name => path.join(dir, name))\n .filter(p => fs.statSync(p).isFile());\n }\n\n /**\n * Extract text content from Claude message\n */\n private extractContent(entry: ClaudeMessage): string | null {\n if (!entry.message?.content) {\n return null;\n }\n\n const content = entry.message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n // Extract text from content blocks\n const texts = content\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text as string);\n\n return texts.join('\\n');\n }\n\n return null;\n }\n\n /**\n * List available sessions for import\n */\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessions: Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }> = [];\n\n let projectDirs: string[] = [];\n\n if (projectPath) {\n projectDirs = await this.findProjectDirs(projectPath);\n } else {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (fs.existsSync(projectsDir)) {\n projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n }\n }\n\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const filePath of sessionFiles) {\n const stats = fs.statSync(filePath);\n sessions.push({\n sessionId: path.basename(filePath, '.jsonl'),\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n }\n }\n\n // Sort by modified date (newest first)\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return sessions;\n }\n}\n\n/**\n * Create importer with default memory service\n */\nexport function createSessionHistoryImporter(memoryService: MemoryService): SessionHistoryImporter {\n return new SessionHistoryImporter(memoryService);\n}\n", "/**\n * Codex Session History Importer\n * Imports existing Codex CLI conversation history into memory\n *\n * Codex stores session history in:\n * ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { createHash, randomUUID } from 'crypto';\nimport { MemoryService } from './memory-service.js';\nimport { registerSession } from '../core/registry/session-registry.js';\nimport type { ImportOptions, ImportResult } from './session-history-importer.js';\n\ntype CodexLogLine = {\n timestamp?: string;\n type?: string;\n payload?: unknown;\n};\n\ntype CodexSessionMetaPayload = {\n id?: unknown;\n cwd?: unknown;\n timestamp?: unknown;\n};\n\ntype CodexResponseItemMessagePayload = {\n type?: unknown;\n role?: unknown;\n content?: unknown;\n};\n\ntype CodexContentBlock = {\n type?: unknown;\n text?: unknown;\n};\n\nexport const CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS = 10_000;\n\nexport interface CodexSessionMeta {\n sessionId: string | null;\n cwd: string | null;\n}\n\nexport interface CodexValidationOptions {\n sessionsDir?: string;\n projectPath?: string;\n limit?: number;\n maxContentChars?: number;\n anonymizeProjects?: boolean;\n now?: Date;\n}\n\nexport interface CodexValidationSource {\n sessionsDir: string;\n projectPath?: string;\n projectFilterApplied: boolean;\n sourcePaths: string[];\n}\n\nexport interface CodexValidationLimits {\n sessionLimit?: number;\n maxContentChars: number;\n}\n\nexport interface CodexValidationTotals {\n sessionsScanned: number;\n sessionsMatched: number;\n filesRead: number;\n recordsRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectCwd: number;\n warnings: number;\n}\n\nexport interface CodexProjectSummary {\n projectHash: string;\n pathLabel: string;\n sessions: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n truncatedMessages: number;\n emptyAssistantMessages: number;\n}\n\nexport interface CodexSessionReplaySummary {\n sessionId: string;\n filePath: string;\n projectHash: string;\n pathLabel: string;\n matched: boolean;\n recordsRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n malformedLines: number;\n skippedUnsupportedRecords: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectCwd: boolean;\n warnings: string[];\n}\n\nexport interface CodexSessionValidationReport {\n generatedAt: string;\n dryRun: true;\n willMutate: false;\n source: CodexValidationSource;\n limits: CodexValidationLimits;\n totals: CodexValidationTotals;\n topProjects: CodexProjectSummary[];\n sessions: CodexSessionReplaySummary[];\n warnings: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeMaybeRealpath(p: string): string {\n try {\n return fs.realpathSync(p);\n } catch {\n return path.resolve(p);\n }\n}\n\ninterface CodexExtractedContent {\n text: string | null;\n originalLength: number;\n truncated: boolean;\n}\n\nfunction extractCodexContentText(\n content: unknown,\n maxContentChars = CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS\n): CodexExtractedContent {\n const texts: string[] = [];\n\n if (typeof content === 'string') {\n if (content.length > 0) texts.push(content);\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (!isRecord(block)) continue;\n const b = block as CodexContentBlock;\n const t = typeof b.type === 'string' ? b.type : '';\n if (t !== 'input_text' && t !== 'output_text' && t !== 'text') continue;\n if (typeof b.text === 'string' && b.text.length > 0) {\n texts.push(b.text);\n }\n }\n }\n\n if (texts.length === 0) {\n return { text: null, originalLength: 0, truncated: false };\n }\n\n const merged = texts.join('\\n');\n const truncated = merged.length > maxContentChars;\n return {\n text: truncated ? `${merged.slice(0, maxContentChars)}...[truncated]` : merged,\n originalLength: merged.length,\n truncated\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n return extractCodexContentText(content).text;\n}\n\nexport function getDefaultCodexSessionsDir(): string {\n return path.join(os.homedir(), '.codex', 'sessions');\n}\n\nexport function listCodexSessionFilesRecursive(rootDir: string): string[] {\n if (!fs.existsSync(rootDir)) return [];\n const out: string[] = [];\n const stack: string[] = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const ent of entries) {\n const fullPath = path.join(dir, ent.name);\n if (ent.isDirectory()) {\n stack.push(fullPath);\n } else if (ent.isFile() && ent.name.endsWith('.jsonl')) {\n out.push(fullPath);\n }\n }\n }\n\n return out.sort();\n}\n\nfunction getFileMtimeMs(filePath: string): number {\n try {\n return fs.statSync(filePath).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction selectRecentCodexSessionFiles(files: string[], sessionLimit?: number): string[] {\n if (sessionLimit === undefined) return files;\n const limit = Number.isFinite(sessionLimit) && sessionLimit > 0 ? Math.floor(sessionLimit) : undefined;\n if (limit === undefined) return files;\n return [...files]\n .sort((a, b) => getFileMtimeMs(b) - getFileMtimeMs(a) || b.localeCompare(a))\n .slice(0, limit);\n}\n\nfunction normalizePositiveImportLimit(limit?: number): number | undefined {\n if (limit === undefined) return undefined;\n return Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : undefined;\n}\n\nfunction countStoredEntries(result: ImportResult): number {\n return result.importedPrompts + result.importedResponses + result.skippedDuplicates;\n}\n\nexport async function readCodexSessionMeta(filePath: string): Promise<CodexSessionMeta> {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n let linesRead = 0;\n for await (const line of rl) {\n linesRead++;\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line) as CodexLogLine;\n if (obj.type !== 'session_meta') continue;\n if (!isRecord(obj.payload)) break;\n const payload = obj.payload as CodexSessionMetaPayload;\n const sessionId = typeof payload.id === 'string' ? payload.id : null;\n const cwd = typeof payload.cwd === 'string' ? payload.cwd : null;\n return { sessionId, cwd };\n } catch {\n // Ignore malformed preamble lines while looking for session_meta.\n }\n\n // session_meta is expected near the top; do not scan huge transcripts twice.\n if (linesRead >= 25) break;\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return { sessionId: null, cwd: null };\n}\n\nexport function deriveCodexSessionIdFromFileName(filePath: string): string | null {\n const base = path.basename(filePath, '.jsonl');\n // Common: rollout-<date>-<uuid>\n const m = base.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i);\n if (m?.[1]) return m[1];\n return base.length > 0 ? base : null;\n}\n\nfunction createEmptyCodexValidationTotals(): CodexValidationTotals {\n return {\n sessionsScanned: 0,\n sessionsMatched: 0,\n filesRead: 0,\n recordsRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectCwd: 0,\n warnings: 0\n };\n}\n\nfunction projectHashFor(cwd: string | null): string {\n return createHash('sha256').update(cwd ?? '(missing cwd)').digest('hex').slice(0, 12);\n}\n\nfunction projectPathLabel(cwd: string | null, anonymizeProjects: boolean): string {\n const hash = projectHashFor(cwd);\n if (anonymizeProjects) return cwd ? `project:${hash}` : `project:${hash}:missing-cwd`;\n return cwd ?? '(missing cwd)';\n}\n\nfunction isProjectMatch(cwd: string | null, projectPath?: string): boolean {\n if (!projectPath) return true;\n if (!cwd) return false;\n return normalizeMaybeRealpath(cwd) === normalizeMaybeRealpath(projectPath);\n}\n\nfunction addSessionToProject(projects: Map<string, CodexProjectSummary>, session: CodexSessionReplaySummary): void {\n const existing = projects.get(session.projectHash) ?? {\n projectHash: session.projectHash,\n pathLabel: session.pathLabel,\n sessions: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n truncatedMessages: 0,\n emptyAssistantMessages: 0\n };\n\n existing.sessions += 1;\n existing.messagesNormalized += session.messagesNormalized;\n existing.turnsNormalized += session.turnsNormalized;\n existing.userMessages += session.userMessages;\n existing.assistantMessages += session.assistantMessages;\n existing.malformedLines += session.malformedLines;\n existing.skippedUnsupportedRecords += session.skippedUnsupportedRecords;\n existing.truncatedMessages += session.truncatedMessages;\n existing.emptyAssistantMessages += session.emptyAssistantMessages;\n projects.set(session.projectHash, existing);\n}\n\nfunction addSessionToTotals(totals: CodexValidationTotals, session: CodexSessionReplaySummary): void {\n totals.filesRead += 1;\n totals.recordsRead += session.recordsRead;\n totals.messagesNormalized += session.messagesNormalized;\n totals.turnsNormalized += session.turnsNormalized;\n totals.userMessages += session.userMessages;\n totals.assistantMessages += session.assistantMessages;\n totals.malformedLines += session.malformedLines;\n totals.skippedUnsupportedRecords += session.skippedUnsupportedRecords;\n totals.emptyAssistantMessages += session.emptyAssistantMessages;\n totals.truncatedMessages += session.truncatedMessages;\n}\n\nexport async function normalizeCodexSessionFile(\n filePath: string,\n options: {\n meta?: CodexSessionMeta;\n matched?: boolean;\n maxContentChars?: number;\n anonymizeProjects?: boolean;\n } = {}\n): Promise<CodexSessionReplaySummary> {\n const meta = options.meta ?? await readCodexSessionMeta(filePath);\n const sessionId = meta.sessionId ?? deriveCodexSessionIdFromFileName(filePath) ?? path.basename(filePath, '.jsonl');\n const projectHash = projectHashFor(meta.cwd);\n const pathLabel = projectPathLabel(meta.cwd, options.anonymizeProjects === true);\n const summary: CodexSessionReplaySummary = {\n sessionId,\n filePath,\n projectHash,\n pathLabel,\n matched: options.matched ?? true,\n recordsRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n malformedLines: 0,\n skippedUnsupportedRecords: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectCwd: !meta.cwd,\n warnings: []\n };\n\n if (!meta.cwd) {\n summary.warnings.push('session_meta missing cwd; project matching is unavailable for this session');\n }\n\n const maxContentChars = options.maxContentChars ?? CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n for await (const line of rl) {\n if (!line.trim()) continue;\n summary.recordsRead += 1;\n\n let entry: CodexLogLine;\n try {\n entry = JSON.parse(line) as CodexLogLine;\n } catch {\n summary.malformedLines += 1;\n continue;\n }\n\n if (entry.type === 'session_meta') continue;\n if (entry.type !== 'response_item' || !isRecord(entry.payload)) {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const payload = entry.payload as CodexResponseItemMessagePayload;\n if (payload.type !== 'message') {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const role = typeof payload.role === 'string' ? payload.role : null;\n if (role !== 'user' && role !== 'assistant') {\n summary.skippedUnsupportedRecords += 1;\n continue;\n }\n\n const extracted = extractCodexContentText(payload.content, maxContentChars);\n if (!extracted.text) {\n if (role === 'assistant') {\n summary.emptyAssistantMessages += 1;\n } else {\n summary.skippedUnsupportedRecords += 1;\n }\n continue;\n }\n\n if (extracted.truncated) {\n summary.truncatedMessages += 1;\n }\n\n summary.messagesNormalized += 1;\n if (role === 'user') {\n summary.userMessages += 1;\n summary.turnsNormalized += 1;\n } else {\n summary.assistantMessages += 1;\n }\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return summary;\n}\n\nexport async function validateCodexSessions(options: CodexValidationOptions = {}): Promise<CodexSessionValidationReport> {\n const sessionsDir = path.resolve(options.sessionsDir ?? getDefaultCodexSessionsDir());\n const maxContentChars = options.maxContentChars ?? CODEX_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const report: CodexSessionValidationReport = {\n generatedAt: (options.now ?? new Date()).toISOString(),\n dryRun: true,\n willMutate: false,\n source: {\n sessionsDir,\n projectPath: options.projectPath,\n projectFilterApplied: Boolean(options.projectPath),\n sourcePaths: [sessionsDir]\n },\n limits: {\n sessionLimit: options.limit,\n maxContentChars\n },\n totals: createEmptyCodexValidationTotals(),\n topProjects: [],\n sessions: [],\n warnings: []\n };\n\n if (!fs.existsSync(sessionsDir)) {\n report.warnings.push(`Codex sessions directory not found: ${sessionsDir}`);\n report.totals.warnings = report.warnings.length;\n return report;\n }\n\n const sessionFiles = listCodexSessionFilesRecursive(sessionsDir);\n const limitedFiles = typeof options.limit === 'number' && Number.isFinite(options.limit) && options.limit > 0\n ? sessionFiles.slice(0, Math.floor(options.limit))\n : sessionFiles;\n const projects = new Map<string, CodexProjectSummary>();\n\n for (const filePath of limitedFiles) {\n const meta = await readCodexSessionMeta(filePath);\n report.totals.sessionsScanned += 1;\n if (!meta.cwd) {\n report.totals.missingProjectCwd += 1;\n }\n\n const matched = isProjectMatch(meta.cwd, options.projectPath);\n if (!matched) continue;\n\n report.totals.sessionsMatched += 1;\n const sessionSummary = await normalizeCodexSessionFile(filePath, {\n meta,\n matched,\n maxContentChars,\n anonymizeProjects: options.anonymizeProjects\n });\n report.sessions.push(sessionSummary);\n addSessionToTotals(report.totals, sessionSummary);\n addSessionToProject(projects, sessionSummary);\n }\n\n report.topProjects = [...projects.values()].sort((a, b) => {\n const byMessages = b.messagesNormalized - a.messagesNormalized;\n if (byMessages !== 0) return byMessages;\n return b.sessions - a.sessions;\n }).slice(0, 10);\n\n if (report.totals.missingProjectCwd > 0) {\n report.warnings.push(`${report.totals.missingProjectCwd} session(s) missing cwd; project matching only uses sessions with cwd`);\n }\n if (report.totals.malformedLines > 0) {\n report.warnings.push(`${report.totals.malformedLines} malformed JSONL line(s) skipped`);\n }\n if (options.projectPath && report.totals.sessionsMatched === 0) {\n report.warnings.push(`No Codex sessions matched project cwd: ${options.projectPath}`);\n }\n report.totals.warnings = report.warnings.length;\n\n return report;\n}\n\nexport interface CodexSessionHistoryImporterOptions {\n sessionsDir?: string;\n}\n\nexport class CodexSessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly sessionsRoot: string;\n\n constructor(memoryService: MemoryService, options: CodexSessionHistoryImporterOptions = {}) {\n this.memoryService = memoryService;\n this.sessionsRoot = options.sessionsDir\n ? path.resolve(options.sessionsDir)\n : path.join(os.homedir(), '.codex', 'sessions');\n }\n\n private getSessionsRoot(): string {\n return this.sessionsRoot;\n }\n\n private listSessionFilesRecursive(rootDir: string): string[] {\n if (!fs.existsSync(rootDir)) return [];\n const out: string[] = [];\n const stack: string[] = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const ent of entries) {\n const fullPath = path.join(dir, ent.name);\n if (ent.isDirectory()) {\n stack.push(fullPath);\n } else if (ent.isFile() && ent.name.endsWith('.jsonl')) {\n out.push(fullPath);\n }\n }\n }\n\n return out;\n }\n\n private async readSessionMeta(filePath: string): Promise<{ sessionId: string | null; cwd: string | null }> {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n try {\n let linesRead = 0;\n for await (const line of rl) {\n linesRead++;\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line) as CodexLogLine;\n if (obj.type !== 'session_meta') continue;\n if (!isRecord(obj.payload)) break;\n const payload = obj.payload as CodexSessionMetaPayload;\n const sessionId = typeof payload.id === 'string' ? payload.id : null;\n const cwd = typeof payload.cwd === 'string' ? payload.cwd : null;\n return { sessionId, cwd };\n } catch {\n // ignore parse errors; keep scanning initial lines\n }\n\n // session_meta is expected at the top; don't scan entire file.\n if (linesRead >= 25) break;\n }\n } finally {\n rl.close();\n fileStream.close();\n }\n\n return { sessionId: null, cwd: null };\n }\n\n private deriveSessionIdFromFileName(filePath: string): string | null {\n const base = path.basename(filePath, '.jsonl');\n // Common: rollout-<date>-<uuid>\n const m = base.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i);\n if (m?.[1]) return m[1];\n return base.length > 0 ? base : null;\n }\n\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) {\n result.errors.push(`Codex sessions directory not found: ${sessionsRoot}`);\n return result;\n }\n\n const normalizedTarget = normalizeMaybeRealpath(projectPath);\n onProgress?.({ phase: 'scan', message: 'Scanning Codex session files...' });\n\n const sessionFiles = this.listSessionFilesRecursive(sessionsRoot);\n const matchingFiles: string[] = [];\n\n // Filter by original CWD stored in session_meta.payload.cwd\n for (const filePath of sessionFiles) {\n try {\n const meta = await this.readSessionMeta(filePath);\n if (!meta.cwd) continue;\n if (normalizeMaybeRealpath(meta.cwd) === normalizedTarget) {\n matchingFiles.push(filePath);\n }\n } catch {\n // ignore\n }\n }\n\n const selectedFiles = selectRecentCodexSessionFiles(matchingFiles, options.sessionLimit);\n onProgress?.({ phase: 'scan', message: `Found ${matchingFiles.length} Codex session(s) for this project` });\n\n const effectiveProjectPath = options.projectPath ?? projectPath;\n const totalLimit = normalizePositiveImportLimit(options.limit);\n let storedAcrossSessions = 0;\n\n for (let i = 0; i < selectedFiles.length; i++) {\n if (totalLimit !== undefined && storedAcrossSessions >= totalLimit) break;\n const filePath = selectedFiles[i];\n const remainingLimit = totalLimit === undefined ? undefined : totalLimit - storedAcrossSessions;\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedFiles.length, filePath });\n const sessionResult = await this.importSessionFile(filePath, {\n ...options,\n limit: remainingLimit,\n projectPath: effectiveProjectPath,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n storedAcrossSessions += countStoredEntries(sessionResult);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to import ${filePath}: ${error}`);\n }\n }\n\n return result;\n }\n\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const onProgress = options.onProgress;\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) {\n result.errors.push(`Codex sessions directory not found: ${sessionsRoot}`);\n return result;\n }\n\n onProgress?.({ phase: 'scan', message: 'Scanning all Codex sessions...' });\n const sessionFiles = this.listSessionFilesRecursive(sessionsRoot);\n const selectedFiles = selectRecentCodexSessionFiles(sessionFiles, options.sessionLimit);\n onProgress?.({ phase: 'scan', message: `Found ${sessionFiles.length} Codex session file(s)` });\n\n const totalLimit = normalizePositiveImportLimit(options.limit);\n let storedAcrossSessions = 0;\n\n for (let i = 0; i < selectedFiles.length; i++) {\n if (totalLimit !== undefined && storedAcrossSessions >= totalLimit) break;\n const filePath = selectedFiles[i];\n const remainingLimit = totalLimit === undefined ? undefined : totalLimit - storedAcrossSessions;\n try {\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedFiles.length, filePath });\n const sessionResult = await this.importSessionFile(filePath, {\n ...options,\n limit: remainingLimit,\n _sessionIndex: i,\n } as ImportOptions & { _sessionIndex: number });\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n storedAcrossSessions += countStoredEntries(sessionResult);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n } catch (error) {\n result.errors.push(`Failed to process ${filePath}: ${error}`);\n }\n }\n\n return result;\n }\n\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n const meta = await this.readSessionMeta(filePath);\n const sessionId = meta.sessionId ?? this.deriveSessionIdFromFileName(filePath);\n\n if (!sessionId) {\n result.errors.push(`Could not determine session id for: ${filePath}`);\n return result;\n }\n\n const effectiveProjectPath = options.projectPath ?? meta.cwd ?? undefined;\n\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(sessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${sessionId}`);\n }\n }\n\n await this.memoryService.startSession(sessionId, effectiveProjectPath);\n\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });\n\n const onProgress = options.onProgress;\n const sessionIndex = (options as ImportOptions & { _sessionIndex?: number })._sessionIndex ?? 0;\n let lastProgressAt = 0;\n const limit = options.limit || Infinity;\n let storedCount = 0;\n\n let currentTurnId: string | null = null;\n let textBuffer: string[] = [];\n let lastTimestamp: string | undefined;\n\n const flushTextBuffer = async () => {\n if (storedCount >= limit) { textBuffer = []; return; }\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n const substantive = textBuffer.filter(t => t.length >= 100);\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : textBuffer.reduce((a, b) => a.length >= b.length ? a : b, '');\n\n if (!merged) { textBuffer = []; return; }\n\n const truncated = merged.length > 10000\n ? merged.slice(0, 10000) + '...[truncated]'\n : merged;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncated,\n { importedFrom: filePath, originalTimestamp: lastTimestamp, turnId: currentTurnId, source: 'codex' }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n storedCount++;\n textBuffer = [];\n };\n\n try {\n for await (const line of rl) {\n if (storedCount >= limit) break;\n try {\n const entry = JSON.parse(line) as CodexLogLine;\n result.totalMessages++;\n\n if (entry.type === 'response_item' && isRecord(entry.payload)) {\n const payload = entry.payload as CodexResponseItemMessagePayload;\n if (payload.type !== 'message') continue;\n\n const role = typeof payload.role === 'string' ? payload.role : null;\n if (!role) continue;\n\n if (role === 'user') {\n await flushTextBuffer();\n\n const content = extractTextFromContent(payload.content);\n if (!content) continue;\n\n currentTurnId = randomUUID();\n\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp, turnId: currentTurnId, source: 'codex' }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n storedCount++;\n } else if (role === 'assistant') {\n const content = extractTextFromContent(payload.content);\n if (content) {\n textBuffer.push(content);\n if (typeof entry.timestamp === 'string') {\n lastTimestamp = entry.timestamp;\n }\n }\n } else {\n // developer/system/tool messages are ignored by default\n }\n }\n\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n } catch (parseError) {\n result.errors.push(`Parse error: ${parseError}`);\n }\n }\n } finally {\n await flushTextBuffer();\n rl.close();\n fileStream.close();\n }\n\n await this.memoryService.endSession(sessionId);\n\n if (effectiveProjectPath) {\n registerSession(sessionId, effectiveProjectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessionsRoot = this.getSessionsRoot();\n if (!fs.existsSync(sessionsRoot)) return [];\n\n const files = this.listSessionFilesRecursive(sessionsRoot);\n const sessions: Array<{ sessionId: string; filePath: string; size: number; modifiedAt: Date }> = [];\n\n const normalizedTarget = projectPath ? normalizeMaybeRealpath(projectPath) : null;\n\n for (const filePath of files) {\n try {\n const stats = fs.statSync(filePath);\n\n let sessionId = this.deriveSessionIdFromFileName(filePath) ?? path.basename(filePath, '.jsonl');\n if (normalizedTarget) {\n const meta = await this.readSessionMeta(filePath);\n if (!meta.cwd) continue;\n if (normalizeMaybeRealpath(meta.cwd) !== normalizedTarget) continue;\n sessionId = meta.sessionId ?? sessionId;\n }\n\n sessions.push({\n sessionId,\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n } catch {\n // ignore\n }\n }\n\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n return sessions;\n }\n}\n\nexport function createCodexSessionHistoryImporter(\n memoryService: MemoryService,\n options: CodexSessionHistoryImporterOptions = {}\n): CodexSessionHistoryImporter {\n return new CodexSessionHistoryImporter(memoryService, options);\n}\n", "/**\n * Hermes SessionDB Importer\n *\n * Imports explicit, read-only snapshots from Hermes Agent's ~/.hermes/state.db\n * into claude-memory-layer. This intentionally does not tail/live-sync Hermes:\n * SessionDB remains the raw source of truth; imports are opt-in and project-scoped.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { createHash, randomUUID } from 'crypto';\nimport { createDatabase, type Database } from '../core/db-wrapper.js';\nimport { applyPrivacyFilter, truncateOutput } from '../core/privacy/index.js';\nimport { registerSession } from '../core/registry/session-registry.js';\nimport type { Config } from '../core/types.js';\nimport { MemoryService } from './memory-service.js';\nimport { isWorthStoringPrompt, type ImportOptions, type ImportResult } from './session-history-importer.js';\n\nexport const HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS = 10_000;\nconst HERMES_MEMORY_SESSION_PREFIX = 'hermes:';\n\nconst DEFAULT_PRIVACY_CONFIG: Config['privacy'] = {\n excludePatterns: ['password', 'secret', 'api_key', 'token', 'bearer'],\n anonymize: false,\n privateTags: {\n enabled: true,\n marker: '[PRIVATE]',\n preserveLineCount: false,\n supportedFormats: ['xml']\n }\n};\n\nexport interface HermesSessionHistoryImporterOptions {\n stateDbPath?: string;\n}\n\nexport interface HermesValidationOptions {\n stateDbPath?: string;\n projectPath?: string;\n limit?: number;\n maxContentChars?: number;\n now?: Date;\n}\n\nexport interface HermesValidationSource {\n stateDbPath: string;\n projectPath?: string;\n projectFilterApplied: boolean;\n sourcePaths: string[];\n}\n\nexport interface HermesValidationLimits {\n sessionLimit?: number;\n maxContentChars: number;\n}\n\nexport interface HermesValidationTotals {\n sessionsScanned: number;\n sessionsMatched: number;\n messagesRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectContext: number;\n warnings: number;\n}\n\nexport interface HermesSourceSummary {\n source: string;\n sessions: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n truncatedMessages: number;\n emptyAssistantMessages: number;\n}\n\nexport interface HermesSessionReplaySummary {\n sessionId: string;\n source: string;\n matched: boolean;\n messagesRead: number;\n messagesNormalized: number;\n turnsNormalized: number;\n userMessages: number;\n assistantMessages: number;\n skippedUnsupportedMessages: number;\n emptyAssistantMessages: number;\n truncatedMessages: number;\n missingProjectContext: boolean;\n warnings: string[];\n}\n\nexport interface HermesSessionValidationReport {\n generatedAt: string;\n dryRun: true;\n willMutate: false;\n source: HermesValidationSource;\n limits: HermesValidationLimits;\n totals: HermesValidationTotals;\n topSources: HermesSourceSummary[];\n sessions: HermesSessionReplaySummary[];\n warnings: string[];\n}\n\ntype HermesSessionRow = {\n id: string;\n source: string;\n user_id: string | null;\n model: string | null;\n system_prompt: string | null;\n started_at: number;\n ended_at?: number | null;\n title?: string | null;\n};\n\ntype HermesMessageRow = {\n id: number;\n session_id: string;\n role: string;\n content: string | null;\n tool_name: string | null;\n timestamp: number;\n};\n\ntype NormalizedHermesMessage = {\n role: 'user' | 'assistant';\n content: string;\n truncated: boolean;\n};\n\nfunction normalizeMaybeRealpath(p: string): string {\n try {\n return fs.realpathSync(p);\n } catch {\n return path.resolve(p);\n }\n}\n\nfunction hashLabel(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 12);\n}\n\nfunction makeMemorySessionId(sessionId: string): string {\n return sessionId.startsWith(HERMES_MEMORY_SESSION_PREFIX)\n ? sessionId\n : `${HERMES_MEMORY_SESSION_PREFIX}${sessionId}`;\n}\n\nfunction timestampToIso(timestamp: number | null | undefined): string | undefined {\n if (typeof timestamp !== 'number' || !Number.isFinite(timestamp)) return undefined;\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction getProjectMatchVariants(projectPath: string): string[] {\n const variants = new Set<string>();\n variants.add(projectPath);\n variants.add(path.resolve(projectPath));\n variants.add(normalizeMaybeRealpath(projectPath));\n variants.add(projectPath.replace(/\\\\/g, '/'));\n variants.add(path.resolve(projectPath).replace(/\\\\/g, '/'));\n return [...variants].filter(Boolean).map((v) => v.toLowerCase());\n}\n\nfunction getSessionProjectHaystack(session: HermesSessionRow): string {\n return [session.system_prompt, session.title]\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n .join('\\n')\n .replace(/\\\\/g, '/')\n .toLowerCase();\n}\n\nfunction hasProjectContext(session: HermesSessionRow): boolean {\n return Boolean(\n (typeof session.system_prompt === 'string' && session.system_prompt.trim().length > 0) ||\n (typeof session.title === 'string' && session.title.trim().length > 0)\n );\n}\n\nfunction matchesProject(session: HermesSessionRow, projectPath?: string): boolean {\n if (!projectPath) return true;\n const haystack = getSessionProjectHaystack(session);\n if (!haystack) return false;\n return getProjectMatchVariants(projectPath).some((variant) => haystack.includes(variant));\n}\n\nfunction parseHermesEncodedContent(content: string | null): string | null {\n if (typeof content !== 'string') return null;\n if (content.length === 0) return null;\n\n const trimmed = content.trim();\n if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || (trimmed.startsWith('{') && trimmed.endsWith('}'))) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n const extracted = extractTextFromStructuredContent(parsed);\n if (extracted) return extracted;\n } catch {\n // Plain text that happens to look like JSON; keep it below.\n }\n }\n\n return content;\n}\n\nfunction extractTextFromStructuredContent(value: unknown): string | null {\n if (typeof value === 'string') return value.length > 0 ? value : null;\n if (Array.isArray(value)) {\n const texts = value\n .map((item) => extractTextFromStructuredContent(item))\n .filter((item): item is string => Boolean(item));\n return texts.length > 0 ? texts.join('\\n') : null;\n }\n if (typeof value === 'object' && value !== null) {\n const record = value as Record<string, unknown>;\n if (typeof record.text === 'string' && record.text.length > 0) return record.text;\n if (typeof record.content === 'string' && record.content.length > 0) return record.content;\n if (Array.isArray(record.content)) return extractTextFromStructuredContent(record.content);\n }\n return null;\n}\n\nfunction normalizeHermesMessage(\n row: HermesMessageRow,\n maxContentChars = HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS\n): NormalizedHermesMessage | 'empty-assistant' | 'unsupported' | 'trivial-user' {\n if (row.role !== 'user' && row.role !== 'assistant') return 'unsupported';\n const extracted = parseHermesEncodedContent(row.content);\n if (!extracted || extracted.trim().length === 0) {\n return row.role === 'assistant' ? 'empty-assistant' : 'trivial-user';\n }\n if (row.role === 'user' && !isWorthStoringPrompt(extracted)) return 'trivial-user';\n\n const truncated = extracted.length > maxContentChars;\n return {\n role: row.role,\n content: truncated ? `${extracted.slice(0, maxContentChars)}...[truncated]` : extracted,\n truncated\n };\n}\n\nfunction sanitizeForMemory(content: string): string {\n const filtered = applyPrivacyFilter(content, DEFAULT_PRIVACY_CONFIG).content;\n return truncateOutput(filtered, { maxLength: HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS, maxLines: 200 });\n}\n\nexport function getDefaultHermesStateDbPath(): string {\n return path.join(os.homedir(), '.hermes', 'state.db');\n}\n\nfunction openHermesDbReadOnly(stateDbPath: string): Database {\n if (!fs.existsSync(stateDbPath)) {\n throw new Error(`Hermes state database not found: ${stateDbPath}`);\n }\n return createDatabase(stateDbPath, { readOnly: true });\n}\n\nfunction listHermesSessions(db: Database): HermesSessionRow[] {\n return db.prepare(`\n SELECT id, source, user_id, model, system_prompt, started_at, ended_at, title\n FROM sessions\n ORDER BY started_at DESC, id DESC\n `).all() as HermesSessionRow[];\n}\n\nfunction getHermesSession(db: Database, sessionId: string): HermesSessionRow | null {\n const row = db.prepare(`\n SELECT id, source, user_id, model, system_prompt, started_at, ended_at, title\n FROM sessions\n WHERE id = ?\n `).get(sessionId) as HermesSessionRow | undefined;\n return row ?? null;\n}\n\nfunction listHermesMessages(db: Database, sessionId: string): HermesMessageRow[] {\n return db.prepare(`\n SELECT id, session_id, role, content, tool_name, timestamp\n FROM messages\n WHERE session_id = ?\n ORDER BY timestamp ASC, id ASC\n `).all(sessionId) as HermesMessageRow[];\n}\n\nexport const HERMES_IMPORTABLE_SESSION_SCAN_FACTOR = 50;\n\nfunction hasImportableHermesMessages(db: Database, sessionId: string): boolean {\n return listHermesMessages(db, sessionId).some((message) => {\n const normalized = normalizeHermesMessage(message);\n return typeof normalized === 'object' && normalized.role === 'user';\n });\n}\n\nfunction selectImportableHermesSessions(db: Database, sessions: HermesSessionRow[], sessionLimit: number): HermesSessionRow[] {\n if (!Number.isFinite(sessionLimit) || sessionLimit <= 0) return sessions;\n\n const selected: HermesSessionRow[] = [];\n const maxSessions = Math.floor(sessionLimit);\n const scanLimit = Math.min(sessions.length, Math.max(maxSessions, maxSessions * HERMES_IMPORTABLE_SESSION_SCAN_FACTOR));\n for (const session of sessions.slice(0, scanLimit)) {\n if (!hasImportableHermesMessages(db, session.id)) continue;\n selected.push(session);\n if (selected.length >= maxSessions) break;\n }\n return selected;\n}\n\nfunction createEmptyImportResult(): ImportResult {\n return {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n}\n\nfunction createEmptySessionSummary(session: HermesSessionRow, matched: boolean): HermesSessionReplaySummary {\n return {\n sessionId: session.id,\n source: session.source,\n matched,\n messagesRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectContext: !hasProjectContext(session),\n warnings: []\n };\n}\n\nfunction addToSourceSummary(\n summaries: Map<string, HermesSourceSummary>,\n sessionSummary: HermesSessionReplaySummary\n): void {\n const current = summaries.get(sessionSummary.source) ?? {\n source: sessionSummary.source,\n sessions: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n truncatedMessages: 0,\n emptyAssistantMessages: 0\n };\n\n current.sessions += 1;\n current.messagesNormalized += sessionSummary.messagesNormalized;\n current.turnsNormalized += sessionSummary.turnsNormalized;\n current.userMessages += sessionSummary.userMessages;\n current.assistantMessages += sessionSummary.assistantMessages;\n current.skippedUnsupportedMessages += sessionSummary.skippedUnsupportedMessages;\n current.truncatedMessages += sessionSummary.truncatedMessages;\n current.emptyAssistantMessages += sessionSummary.emptyAssistantMessages;\n summaries.set(sessionSummary.source, current);\n}\n\nexport async function validateHermesSessions(options: HermesValidationOptions = {}): Promise<HermesSessionValidationReport> {\n const stateDbPath = options.stateDbPath ?? getDefaultHermesStateDbPath();\n const maxContentChars = options.maxContentChars ?? HERMES_VALIDATION_DEFAULT_MAX_CONTENT_CHARS;\n const warnings: string[] = [];\n const totals: HermesValidationTotals = {\n sessionsScanned: 0,\n sessionsMatched: 0,\n messagesRead: 0,\n messagesNormalized: 0,\n turnsNormalized: 0,\n userMessages: 0,\n assistantMessages: 0,\n skippedUnsupportedMessages: 0,\n emptyAssistantMessages: 0,\n truncatedMessages: 0,\n missingProjectContext: 0,\n warnings: 0\n };\n\n const db = openHermesDbReadOnly(stateDbPath);\n try {\n const sourceSummaries = new Map<string, HermesSourceSummary>();\n const sessionSummaries: HermesSessionReplaySummary[] = [];\n const sessions = listHermesSessions(db);\n const sessionLimit = options.limit ?? Infinity;\n let matchedCount = 0;\n\n for (const session of sessions) {\n totals.sessionsScanned++;\n const missingContext = !hasProjectContext(session);\n if (missingContext) totals.missingProjectContext++;\n\n const matched = matchesProject(session, options.projectPath);\n if (!matched) continue;\n if (matchedCount >= sessionLimit) continue;\n matchedCount++;\n totals.sessionsMatched++;\n\n const summary = createEmptySessionSummary(session, true);\n const messages = listHermesMessages(db, session.id);\n for (const message of messages) {\n summary.messagesRead++;\n totals.messagesRead++;\n\n const normalized = normalizeHermesMessage(message, maxContentChars);\n if (normalized === 'unsupported') {\n summary.skippedUnsupportedMessages++;\n totals.skippedUnsupportedMessages++;\n continue;\n }\n if (normalized === 'empty-assistant') {\n summary.emptyAssistantMessages++;\n totals.emptyAssistantMessages++;\n continue;\n }\n if (normalized === 'trivial-user') {\n continue;\n }\n\n summary.messagesNormalized++;\n totals.messagesNormalized++;\n if (normalized.truncated) {\n summary.truncatedMessages++;\n totals.truncatedMessages++;\n }\n if (normalized.role === 'user') {\n summary.userMessages++;\n summary.turnsNormalized++;\n totals.userMessages++;\n totals.turnsNormalized++;\n } else {\n summary.assistantMessages++;\n totals.assistantMessages++;\n }\n }\n\n sessionSummaries.push(summary);\n addToSourceSummary(sourceSummaries, summary);\n }\n\n if (totals.missingProjectContext > 0) {\n warnings.push(`${totals.missingProjectContext} Hermes session(s) have no project context in system prompt/title`);\n }\n totals.warnings = warnings.length;\n\n return {\n generatedAt: (options.now ?? new Date()).toISOString(),\n dryRun: true,\n willMutate: false,\n source: {\n stateDbPath,\n projectPath: options.projectPath,\n projectFilterApplied: Boolean(options.projectPath),\n sourcePaths: [stateDbPath]\n },\n limits: {\n sessionLimit: options.limit,\n maxContentChars\n },\n totals,\n topSources: [...sourceSummaries.values()].sort((a, b) => b.sessions - a.sessions || b.messagesNormalized - a.messagesNormalized),\n sessions: sessionSummaries,\n warnings\n };\n } finally {\n db.close();\n }\n}\n\nexport class HermesSessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly stateDbPath: string;\n\n constructor(memoryService: MemoryService, options: HermesSessionHistoryImporterOptions = {}) {\n this.memoryService = memoryService;\n this.stateDbPath = options.stateDbPath ?? getDefaultHermesStateDbPath();\n }\n\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n const sessions = listHermesSessions(db).filter((session) => matchesProject(session, projectPath));\n return await this.importSessionRows(db, sessions, { ...options, projectPath });\n } finally {\n db.close();\n }\n }\n\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n return await this.importSessionRows(db, listHermesSessions(db), options);\n } finally {\n db.close();\n }\n }\n\n async importSession(sessionId: string, options: ImportOptions = {}): Promise<ImportResult> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n const sourceSessionId = sessionId.startsWith(HERMES_MEMORY_SESSION_PREFIX)\n ? sessionId.slice(HERMES_MEMORY_SESSION_PREFIX.length)\n : sessionId;\n const session = getHermesSession(db, sourceSessionId);\n if (!session) {\n return { ...createEmptyImportResult(), totalSessions: 1, errors: [`Hermes session not found: ${sessionId}`] };\n }\n return await this.importSessionRows(db, [session], options);\n } finally {\n db.close();\n }\n }\n\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n source: string;\n startedAt: Date;\n messageCount: number;\n }>> {\n const db = openHermesDbReadOnly(this.stateDbPath);\n try {\n return listHermesSessions(db)\n .filter((session) => matchesProject(session, projectPath))\n .map((session) => ({\n sessionId: session.id,\n source: session.source,\n startedAt: new Date(session.started_at * 1000),\n messageCount: listHermesMessages(db, session.id).length\n }));\n } finally {\n db.close();\n }\n }\n\n private async importSessionRows(\n db: Database,\n sessions: HermesSessionRow[],\n options: ImportOptions = {}\n ): Promise<ImportResult> {\n const result = createEmptyImportResult();\n const onProgress = options.onProgress;\n const sessionLimit = options.sessionLimit ?? Infinity;\n const selectedSessions = selectImportableHermesSessions(db, sessions, sessionLimit);\n\n onProgress?.({ phase: 'scan', message: `Found ${sessions.length} Hermes session(s)` });\n\n for (let i = 0; i < selectedSessions.length; i++) {\n const session = selectedSessions[i];\n onProgress?.({ phase: 'session-start', sessionIndex: i, totalSessions: selectedSessions.length, filePath: this.stateDbPath });\n\n let sessionStoredCount = 0;\n const memorySessionId = makeMemorySessionId(session.id);\n const sessionResult = await this.importOneSession(\n db,\n session,\n memorySessionId,\n options,\n i,\n () => sessionStoredCount,\n (next) => { sessionStoredCount = next; }\n );\n\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n\n onProgress?.({\n phase: 'session-done',\n sessionIndex: i,\n importedPrompts: sessionResult.importedPrompts,\n importedResponses: sessionResult.importedResponses,\n skipped: sessionResult.skippedDuplicates\n });\n }\n\n onProgress?.({ phase: 'done', result });\n return result;\n }\n\n private async importOneSession(\n db: Database,\n session: HermesSessionRow,\n memorySessionId: string,\n options: ImportOptions,\n sessionIndex: number,\n getStoredCount: () => number,\n setStoredCount: (next: number) => void\n ): Promise<ImportResult> {\n const result = { ...createEmptyImportResult(), totalSessions: 1 };\n const effectiveProjectPath = options.projectPath;\n\n if (options.force) {\n const deleted = await this.memoryService.deleteSessionEvents(memorySessionId);\n if (options.verbose && deleted > 0) {\n console.log(` Deleted ${deleted} existing events for session ${memorySessionId}`);\n }\n }\n\n await this.memoryService.startSession(memorySessionId, effectiveProjectPath);\n\n const messages = listHermesMessages(db, session.id);\n let currentTurnId: string | null = null;\n let textBuffer: Array<{ content: string; row: HermesMessageRow }> = [];\n let lastProgressAt = 0;\n\n const flushTextBuffer = async () => {\n if (getStoredCount() >= (options.limit ?? Infinity)) {\n textBuffer = [];\n return;\n }\n if (textBuffer.length === 0 || !currentTurnId) return;\n\n const contentBlocks = textBuffer.map((item) => item.content);\n const substantive = contentBlocks.filter((content) => content.length >= 100);\n const merged = substantive.length > 0\n ? substantive.join('\\n\\n')\n : contentBlocks.reduce((a, b) => a.length >= b.length ? a : b, '');\n if (!merged) {\n textBuffer = [];\n return;\n }\n\n const lastRow = textBuffer[textBuffer.length - 1].row;\n const appendResult = await this.memoryService.storeAgentResponse(\n memorySessionId,\n sanitizeForMemory(merged),\n {\n importedFrom: this.stateDbPath,\n originalTimestamp: timestampToIso(lastRow.timestamp),\n sourceMessageId: lastRow.id,\n turnId: currentTurnId,\n source: 'hermes',\n hermesSource: session.source,\n sourceSessionId: session.id,\n sourceSessionHash: hashLabel(session.id)\n }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n setStoredCount(getStoredCount() + 1);\n textBuffer = [];\n };\n\n for (const message of messages) {\n if (getStoredCount() >= (options.limit ?? Infinity)) break;\n result.totalMessages++;\n const normalized = normalizeHermesMessage(message);\n\n if (normalized === 'unsupported' || normalized === 'empty-assistant') {\n continue;\n }\n if (normalized === 'trivial-user') {\n result.skippedDuplicates++;\n continue;\n }\n\n if (normalized.role === 'user') {\n await flushTextBuffer();\n currentTurnId = randomUUID();\n const appendResult = await this.memoryService.storeUserPrompt(\n memorySessionId,\n sanitizeForMemory(normalized.content),\n {\n importedFrom: this.stateDbPath,\n originalTimestamp: timestampToIso(message.timestamp),\n sourceMessageId: message.id,\n turnId: currentTurnId,\n source: 'hermes',\n hermesSource: session.source,\n sourceSessionId: session.id,\n sourceSessionHash: hashLabel(session.id)\n }\n );\n\n if (appendResult.success && appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n setStoredCount(getStoredCount() + 1);\n } else {\n textBuffer.push({ content: normalized.content, row: message });\n }\n\n const now = Date.now();\n if (now - lastProgressAt > 200) {\n lastProgressAt = now;\n options.onProgress?.({\n phase: 'session-progress',\n sessionIndex,\n messagesProcessed: result.totalMessages,\n imported: result.importedPrompts + result.importedResponses,\n skipped: result.skippedDuplicates\n });\n }\n }\n\n await flushTextBuffer();\n await this.memoryService.endSession(memorySessionId);\n\n if (effectiveProjectPath) {\n registerSession(memorySessionId, effectiveProjectPath);\n }\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from Hermes session ${session.id}`);\n }\n\n return result;\n }\n}\n\nexport function createHermesSessionHistoryImporter(\n memoryService: MemoryService,\n options: HermesSessionHistoryImporterOptions = {}\n): HermesSessionHistoryImporter {\n return new HermesSessionHistoryImporter(memoryService, options);\n}\n", "/**\n * Private Tag Parser\n * Parses and removes <private> tags from content\n */\n\nexport interface PrivateSection {\n start: number;\n end: number;\n content: string;\n format: 'xml' | 'bracket' | 'comment';\n}\n\nexport interface ParseResult {\n filtered: string;\n sections: PrivateSection[];\n stats: {\n count: number;\n totalLength: number;\n };\n}\n\nexport interface ParseOptions {\n formats: Array<'xml' | 'bracket' | 'comment'>;\n marker: string;\n}\n\n// Tag patterns for different formats\nconst TAG_PATTERNS: Record<string, RegExp> = {\n xml: /<private>([\\s\\S]*?)<\\/private>/gi,\n bracket: /\\[private\\]([\\s\\S]*?)\\[\\/private\\]/gi,\n comment: /<!--\\s*private\\s*-->([\\s\\S]*?)<!--\\s*\\/private\\s*-->/gi\n};\n\n/**\n * Parse and remove private tags from text\n */\nexport function parsePrivateTags(\n text: string,\n options: ParseOptions\n): ParseResult {\n const sections: PrivateSection[] = [];\n let filtered = text;\n\n // Find all private sections for each format\n for (const format of options.formats) {\n const pattern = TAG_PATTERNS[format];\n if (!pattern) continue;\n\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match;\n while ((match = pattern.exec(text)) !== null) {\n sections.push({\n start: match.index,\n end: match.index + match[0].length,\n content: match[1],\n format: format as PrivateSection['format']\n });\n }\n }\n\n // Remove all tags and replace with marker\n for (const format of options.formats) {\n const pattern = TAG_PATTERNS[format];\n if (!pattern) continue;\n\n // Need to create new regex for replacement (global flag issues)\n const replacePattern = new RegExp(pattern.source, 'gi');\n\n filtered = filtered.replace(replacePattern, (_match, content: string) => {\n // Empty tags are completely removed\n if (!content.trim()) return '';\n return options.marker;\n });\n }\n\n return {\n filtered,\n sections,\n stats: {\n count: sections.length,\n totalLength: sections.reduce((sum, s) => sum + s.content.length, 0)\n }\n };\n}\n\n/**\n * Parse private tags safely, protecting code blocks\n */\nexport function parsePrivateTagsSafe(\n text: string,\n options: ParseOptions\n): ParseResult {\n // 1. Extract and protect code blocks\n const codeBlocks: string[] = [];\n const textWithPlaceholders = text.replace(\n /```[\\s\\S]*?```/g,\n (match) => {\n codeBlocks.push(match);\n return `__CODE_BLOCK_${codeBlocks.length - 1}__`;\n }\n );\n\n // Also protect inline code\n const inlineCode: string[] = [];\n const textWithAllPlaceholders = textWithPlaceholders.replace(\n /`[^`]+`/g,\n (match) => {\n inlineCode.push(match);\n return `__INLINE_CODE_${inlineCode.length - 1}__`;\n }\n );\n\n // 2. Parse private tags\n const result = parsePrivateTags(textWithAllPlaceholders, options);\n\n // 3. Restore inline code\n result.filtered = result.filtered.replace(\n /__INLINE_CODE_(\\d+)__/g,\n (_, idx) => inlineCode[Number(idx)]\n );\n\n // 4. Restore code blocks\n result.filtered = result.filtered.replace(\n /__CODE_BLOCK_(\\d+)__/g,\n (_, idx) => codeBlocks[Number(idx)]\n );\n\n return result;\n}\n\n/**\n * Check if text has unclosed private tags\n */\nexport function hasUnmatchedOpenTag(text: string): boolean {\n // Check for opening tags without closing\n const openXml = (text.match(/<private>/gi) || []).length;\n const closeXml = (text.match(/<\\/private>/gi) || []).length;\n\n const openBracket = (text.match(/\\[private\\]/gi) || []).length;\n const closeBracket = (text.match(/\\[\\/private\\]/gi) || []).length;\n\n return openXml !== closeXml || openBracket !== closeBracket;\n}\n", "/**\n * Privacy Filter\n * Combines pattern-based filtering with private tag parsing\n */\n\nimport { parsePrivateTagsSafe, hasUnmatchedOpenTag } from './tag-parser.js';\nimport type { Config } from '../types.js';\n\nexport interface FilterResult {\n content: string;\n metadata: {\n hasPrivateTags: boolean;\n privateTagCount: number;\n patternMatchCount: number;\n originalLength: number;\n filteredLength: number;\n hasUnmatchedTags: boolean;\n };\n}\n\n// Sensitive data patterns\nconst SENSITIVE_PATTERNS = [\n // Credential-bearing URLs/connection strings with userinfo before the host.\n // Redact the whole URI so usernames, credentials, hosts, paths, and query\n // params do not leak either.\n /\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s'\"`<>/@]+@[^\\s'\"`<>]+/gi,\n /password\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /api[_-]?key\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /secret\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /token\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /bearer\\s+[a-zA-Z0-9\\-_.]+/gi,\n /AWS[_-]?ACCESS[_-]?KEY[_-]?ID\\s*[:=]\\s*['\"]?[A-Z0-9]+/gi,\n /AWS[_-]?SECRET[_-]?ACCESS[_-]?KEY\\s*[:=]\\s*['\"]?[^\\s'\"]+/gi,\n /-----BEGIN\\s+(RSA\\s+)?PRIVATE\\s+KEY-----[\\s\\S]*?-----END\\s+(RSA\\s+)?PRIVATE\\s+KEY-----/g,\n /ghp_[a-zA-Z0-9]{36}/g, // GitHub Personal Access Token\n /sk-[a-zA-Z0-9]{48}/g, // OpenAI API Key\n];\n\nfunction maskSensitiveString(value: string): string {\n let filtered = value;\n for (const pattern of SENSITIVE_PATTERNS) {\n pattern.lastIndex = 0;\n filtered = filtered.replace(pattern, '[REDACTED]');\n }\n return filtered;\n}\n\n/**\n * Apply privacy filter to content\n */\nexport function applyPrivacyFilter(\n content: string,\n config: Config['privacy']\n): FilterResult {\n let filtered = content;\n let privateTagCount = 0;\n let patternMatchCount = 0;\n const hasUnmatchedTags = hasUnmatchedOpenTag(content);\n\n // 1. Private tag filtering\n if (config.privateTags?.enabled !== false) {\n const tagResult = parsePrivateTagsSafe(filtered, {\n formats: config.privateTags?.supportedFormats || ['xml'],\n marker: config.privateTags?.marker || '[PRIVATE]'\n });\n filtered = tagResult.filtered;\n privateTagCount = tagResult.stats.count;\n }\n\n // 2. Built-in sensitive pattern filtering\n for (const pattern of SENSITIVE_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n const matches = filtered.match(pattern);\n if (matches) {\n patternMatchCount += matches.length;\n filtered = filtered.replace(pattern, '[REDACTED]');\n }\n }\n\n // 3. Custom pattern filtering from config\n for (const patternStr of config.excludePatterns || []) {\n try {\n const regex = new RegExp(\n `(${patternStr})\\\\s*[:=]\\\\s*['\"]?[^\\\\s'\"]+`,\n 'gi'\n );\n const matches = filtered.match(regex);\n if (matches) {\n patternMatchCount += matches.length;\n filtered = filtered.replace(regex, '[REDACTED]');\n }\n } catch {\n // Invalid regex pattern, skip\n }\n }\n\n // 4. Clean up consecutive markers\n filtered = filtered.replace(/(\\[PRIVATE\\]\\s*)+/g, '[PRIVATE]\\n');\n filtered = filtered.replace(/(\\[REDACTED\\]\\s*)+/g, '[REDACTED] ');\n\n return {\n content: filtered,\n metadata: {\n hasPrivateTags: privateTagCount > 0,\n privateTagCount,\n patternMatchCount,\n originalLength: content.length,\n filteredLength: filtered.length,\n hasUnmatchedTags\n }\n };\n}\n\n/**\n * Mask sensitive data in tool input (recursively)\n */\nexport function maskSensitiveInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n // Check if key suggests sensitive data\n const sensitiveKeys = ['password', 'secret', 'key', 'token', 'auth', 'credential'];\n const isSensitiveKey = sensitiveKeys.some(k =>\n key.toLowerCase().includes(k)\n );\n\n if (isSensitiveKey && typeof value === 'string') {\n result[key] = '[REDACTED]';\n } else if (typeof value === 'string') {\n // Apply pattern filtering to string values\n result[key] = maskSensitiveString(value);\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result[key] = maskSensitiveInput(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[key] = value.map(item => {\n if (typeof item === 'string') {\n return isSensitiveKey ? '[REDACTED]' : maskSensitiveString(item);\n }\n return typeof item === 'object' && item !== null\n ? maskSensitiveInput(item as Record<string, unknown>)\n : item;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Truncate output with head + tail strategy\n */\nexport function truncateOutput(\n output: string,\n options: { maxLength?: number; maxLines?: number }\n): string {\n const { maxLength = 10000, maxLines = 100 } = options;\n\n // Split into lines\n const lines = output.split('\\n');\n\n // Apply line limit first\n if (lines.length > maxLines) {\n const headLines = Math.ceil(maxLines / 2);\n const tailLines = Math.floor(maxLines / 2);\n const head = lines.slice(0, headLines);\n const tail = lines.slice(-tailLines);\n const truncatedLines = [\n ...head,\n `\\n... [${lines.length - maxLines} lines truncated] ...\\n`,\n ...tail\n ];\n output = truncatedLines.join('\\n');\n }\n\n // Apply character limit\n if (output.length > maxLength) {\n const headChars = Math.ceil(maxLength / 2);\n const tailChars = Math.floor(maxLength / 2);\n output = output.slice(0, headChars) +\n `\\n... [${output.length - maxLength} characters truncated] ...\\n` +\n output.slice(-tailChars);\n }\n\n return output;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport interface BootstrapKnowledgeOptions {\n repoPath: string;\n outDir: string;\n since?: string;\n maxCommits?: number;\n incremental?: boolean;\n}\n\ninterface CommitInfo {\n hash: string;\n date: string;\n author: string;\n subject: string;\n files: string[];\n}\n\ninterface ModuleSummary {\n name: string;\n root: string;\n fileCount: number;\n languages: string[];\n entryCandidates: string[];\n}\n\nconst EXCLUDED_DIRS = new Set(['.git', 'node_modules', 'dist', 'build', 'coverage', '.next', '.turbo', 'memory']);\nconst CODE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', '.java', '.kt', '.swift', '.rb', '.php', '.cs',\n '.scala', '.sh', '.zsh', '.yaml', '.yml', '.json', '.sql', '.md'\n]);\n\nfunction safeRel(base: string, target: string): string {\n return path.relative(base, target).replaceAll('\\\\', '/');\n}\n\nfunction mkdirp(dir: string): void {\n fs.mkdirSync(dir, { recursive: true });\n}\n\nfunction walkCodeFiles(root: string): string[] {\n const out: string[] = [];\n\n function walk(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (!EXCLUDED_DIRS.has(e.name)) walk(full);\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (CODE_EXTENSIONS.has(ext)) out.push(full);\n }\n }\n }\n\n walk(root);\n return out.sort();\n}\n\nfunction detectLanguage(file: string): string {\n const ext = path.extname(file).toLowerCase();\n const map: Record<string, string> = {\n '.ts': 'TypeScript', '.tsx': 'TypeScript', '.js': 'JavaScript', '.jsx': 'JavaScript', '.mjs': 'JavaScript', '.cjs': 'JavaScript',\n '.py': 'Python', '.go': 'Go', '.rs': 'Rust', '.java': 'Java', '.kt': 'Kotlin', '.swift': 'Swift', '.rb': 'Ruby', '.php': 'PHP',\n '.cs': 'C#', '.scala': 'Scala', '.sh': 'Shell', '.zsh': 'Shell', '.yaml': 'YAML', '.yml': 'YAML', '.json': 'JSON', '.sql': 'SQL', '.md': 'Markdown'\n };\n return map[ext] || 'Other';\n}\n\nfunction summarizeModules(repoPath: string, files: string[]): ModuleSummary[] {\n const modules = new Map<string, { files: string[]; langs: Map<string, number> }>();\n\n for (const abs of files) {\n const rel = safeRel(repoPath, abs);\n const seg = rel.split('/').filter(Boolean);\n const top = seg[0] || 'root';\n\n if (!modules.has(top)) modules.set(top, { files: [], langs: new Map() });\n\n const bucket = modules.get(top)!;\n bucket.files.push(rel);\n\n const lang = detectLanguage(abs);\n bucket.langs.set(lang, (bucket.langs.get(lang) || 0) + 1);\n }\n\n return [...modules.entries()]\n .map(([name, data]) => ({\n name,\n root: name,\n fileCount: data.files.length,\n languages: [...data.langs.entries()].sort((a, b) => b[1] - a[1]).map(([l]) => l).slice(0, 5),\n entryCandidates: data.files.filter((f) => /(index|main|app|server|cli)\\./i.test(path.basename(f))).slice(0, 10)\n }))\n .sort((a, b) => b.fileCount - a.fileCount || a.name.localeCompare(b.name));\n}\n\nfunction runGit(repoPath: string, command: string): string {\n return execSync(`git -C ${JSON.stringify(repoPath)} ${command}`, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });\n}\n\nfunction parseGitLog(raw: string): CommitInfo[] {\n const lines = raw.split(/\\r?\\n/);\n const commits: CommitInfo[] = [];\n let current: CommitInfo | null = null;\n\n for (const line of lines) {\n if (!line.trim()) {\n if (current) {\n commits.push(current);\n current = null;\n }\n continue;\n }\n\n if (line.includes('\\t') && line.split('\\t').length >= 4) {\n if (current) commits.push(current);\n const [hash, date, author, ...subjectRest] = line.split('\\t');\n current = { hash, date, author, subject: subjectRest.join('\\t').trim(), files: [] };\n } else if (current) {\n current.files.push(line.trim());\n }\n }\n\n if (current) commits.push(current);\n return commits;\n}\n\nfunction getGitCommits(repoPath: string, since = '180 days ago', maxCommits = 1000): CommitInfo[] {\n try {\n const raw = runGit(\n repoPath,\n `log --since=${JSON.stringify(since)} -n ${Math.max(1, maxCommits)} --date=short --pretty=format:%H%x09%ad%x09%an%x09%s --name-only --reverse`\n );\n return parseGitLog(raw);\n } catch {\n return [];\n }\n}\n\nfunction getGitCommitsAfterHash(repoPath: string, hash: string, maxCommits = 1000): CommitInfo[] {\n try {\n const raw = runGit(\n repoPath,\n `log ${JSON.stringify(`${hash}..HEAD`)} -n ${Math.max(1, maxCommits)} --date=short --pretty=format:%H%x09%ad%x09%an%x09%s --name-only --reverse`\n );\n return parseGitLog(raw);\n } catch {\n return [];\n }\n}\n\nfunction extractDecisions(commits: CommitInfo[]): CommitInfo[] {\n const decisionPattern = /(refactor|migrate|deprecat|remove|replace|introduce|adopt|switch|upgrade|breaking|architecture|feat|fix)/i;\n return commits.filter((c) => decisionPattern.test(c.subject));\n}\n\nfunction buildTimeline(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const timeline = new Map<string, CommitInfo[]>();\n for (const c of commits) {\n const key = (c.date || '').slice(0, 7) || 'unknown';\n if (!timeline.has(key)) timeline.set(key, []);\n timeline.get(key)!.push(c);\n }\n return new Map([...timeline.entries()].sort((a, b) => a[0].localeCompare(b[0])));\n}\n\nfunction buildGlossary(files: string[]): string[] {\n const stop = new Set(['src', 'test', 'dist', 'lib', 'core', 'index', 'main', 'app', 'server', 'client', 'utils']);\n const freq = new Map<string, number>();\n\n for (const f of files) {\n const base = path.basename(f, path.extname(f));\n const tokens = base\n .split(/[^a-zA-Z0-9]+/)\n .flatMap((t) => t.split(/(?=[A-Z])/))\n .map((t) => t.toLowerCase())\n .filter((t) => t.length >= 3 && !stop.has(t));\n\n for (const t of tokens) freq.set(t, (freq.get(t) || 0) + 1);\n }\n\n return [...freq.entries()]\n .filter(([, count]) => count >= 2)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 80)\n .map(([term]) => term);\n}\n\nfunction writeFile(filePath: string, content: string): void {\n mkdirp(path.dirname(filePath));\n fs.writeFileSync(filePath, content, 'utf8');\n}\n\nfunction confidenceByEvidence(sourceCount: number): 'high' | 'mid' | 'low' {\n if (sourceCount >= 3) return 'high';\n if (sourceCount >= 1) return 'mid';\n return 'low';\n}\n\nfunction sourceLine(source: string): string {\n return `- source: ${source}`;\n}\n\ninterface ExistingManifest {\n generatedAt?: string;\n lastCommitDate?: string;\n lastCommitHash?: string;\n}\n\nfunction loadExistingManifest(outDir: string): ExistingManifest | null {\n try {\n const p = path.join(outDir, 'sources', 'manifest.json');\n if (!fs.existsSync(p)) return null;\n const data = JSON.parse(fs.readFileSync(p, 'utf8')) as ExistingManifest;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction listMarkdownOutputs(outDir: string): string[] {\n const out: string[] = [];\n const stack = [outDir];\n while (stack.length) {\n const dir = stack.pop()!;\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nexport async function bootstrapKnowledgeBase(options: BootstrapKnowledgeOptions): Promise<{\n outDir: string;\n fileCount: number;\n moduleCount: number;\n commitCount: number;\n generatedFiles: string[];\n}> {\n const repoPath = path.resolve(options.repoPath);\n const outDir = path.resolve(options.outDir);\n const maxCommits = options.maxCommits ?? 1000;\n\n const existingManifest = options.incremental ? loadExistingManifest(outDir) : null;\n const incrementalSince = existingManifest?.lastCommitDate || existingManifest?.generatedAt;\n const since = options.since || incrementalSince || '180 days ago';\n\n const codeFiles = walkCodeFiles(repoPath);\n const modules = summarizeModules(repoPath, codeFiles);\n const commits = options.incremental && existingManifest?.lastCommitHash\n ? getGitCommitsAfterHash(repoPath, existingManifest.lastCommitHash, maxCommits)\n : getGitCommits(repoPath, since, maxCommits);\n const decisions = extractDecisions(commits);\n const timeline = buildTimeline(commits);\n const glossary = buildGlossary(codeFiles);\n\n const generatedFiles: string[] = [];\n\n const sections = {\n overview: path.join(outDir, 'overview'),\n modules: path.join(outDir, 'modules'),\n decisions: path.join(outDir, 'decisions'),\n timeline: path.join(outDir, 'timeline'),\n glossary: path.join(outDir, 'glossary'),\n sources: path.join(outDir, 'sources')\n };\n\n for (const sectionDir of Object.values(sections)) {\n mkdirp(sectionDir);\n }\n\n const overviewPath = path.join(sections.overview, 'overview.md');\n const overview = [\n '# Codebase Overview',\n '',\n `- generatedAt: ${new Date().toISOString()}`,\n '- deterministicPipeline: true',\n `- repo: ${repoPath}`,\n `- filesAnalyzed: ${codeFiles.length}`,\n `- commitsAnalyzed: ${commits.length}`,\n `- confidence: ${confidenceByEvidence(modules.length > 0 ? 3 : 0)}`,\n '',\n '## Directory / Module Map',\n ...modules.slice(0, 50).map((m) => `- ${m.name}: ${m.fileCount} files (${m.languages.join(', ') || 'n/a'})`),\n '',\n '## Fact',\n '- Generated from deterministic file scan and git history parsing.',\n '',\n '## Inference',\n '- Module responsibilities should be reviewed by maintainers for nuanced boundaries.',\n '',\n '## Sources',\n sourceLine(`repo-scan:${repoPath}`),\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(overviewPath, overview);\n generatedFiles.push(overviewPath);\n\n const touchedRoots = new Set(\n commits\n .flatMap((c) => c.files)\n .map((f) => f.split('/').filter(Boolean)[0])\n .filter(Boolean)\n );\n const moduleTargets = options.incremental && touchedRoots.size > 0\n ? modules.filter((m) => touchedRoots.has(m.root)).slice(0, 200)\n : modules.slice(0, 200);\n\n for (const m of moduleTargets) {\n const relatedCommits = commits.filter((c) => c.files.some((f) => f.startsWith(`${m.root}/`))).slice(0, 15);\n const content = [\n `# Module: ${m.name}`,\n '',\n `- responsibility: inferred from top-level path \\`${m.root}/\\``,\n `- files: ${m.fileCount}`,\n `- languages: ${m.languages.join(', ') || 'n/a'}`,\n `- confidence: ${confidenceByEvidence(relatedCommits.length)}`,\n '',\n '## Entry Candidates',\n ...(m.entryCandidates.length > 0 ? m.entryCandidates.map((f) => `- ${f}`) : ['- none detected']),\n '',\n '## Related Commits (recent sample)',\n ...(relatedCommits.length > 0\n ? relatedCommits.map((c) => `- ${c.date} ${c.hash.slice(0, 8)} ${c.subject}`)\n : ['- none in selected range']),\n '',\n '## Sources',\n sourceLine(`repo-path:${m.root}/**`),\n ...relatedCommits.map((c) => sourceLine(`commit:${c.hash}`)),\n ''\n ].join('\\n');\n\n const modulePath = path.join(sections.modules, `${m.name.replace(/[^a-z0-9._-]+/gi, '-').toLowerCase()}.md`);\n writeFile(modulePath, content);\n generatedFiles.push(modulePath);\n }\n\n const decisionsPath = path.join(sections.decisions, 'decisions.md');\n const decisionsMd = [\n '# Decisions (extracted)',\n '',\n `- confidence: ${confidenceByEvidence(decisions.length)}`,\n '',\n ...(decisions.length > 0\n ? decisions.slice(0, 500).map((d) => [\n `## ${d.date} | ${d.subject}`,\n '- status: active (inferred)',\n sourceLine(`commit:${d.hash}`),\n `- author: ${d.author}`,\n `- changedFiles: ${d.files.length}`,\n `- confidence: ${confidenceByEvidence(d.files.length > 0 ? 2 : 1)}`,\n ''\n ].join('\\n'))\n : ['- No decision-like commits found in selected range.', '']),\n '## Sources',\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(decisionsPath, decisionsMd);\n generatedFiles.push(decisionsPath);\n\n const timelinePath = path.join(sections.timeline, 'timeline.md');\n const timelineMd = [\n '# Timeline',\n '',\n `- confidence: ${confidenceByEvidence(commits.length > 0 ? 2 : 0)}`,\n '',\n ...[...timeline.entries()].flatMap(([month, list]) => [\n `## ${month}`,\n ...list.slice(0, 40).map((c) => `- ${c.date} ${c.hash.slice(0, 8)} ${c.subject}`),\n ''\n ]),\n '## Sources',\n sourceLine(`git-log:since=${since};max=${maxCommits}`),\n ''\n ].join('\\n');\n writeFile(timelinePath, timelineMd);\n generatedFiles.push(timelinePath);\n\n const glossaryPath = path.join(sections.glossary, 'glossary.md');\n const glossaryMd = [\n '# Glossary (auto-extracted)',\n '',\n `- confidence: ${confidenceByEvidence(glossary.length > 0 ? 1 : 0)}`,\n '',\n ...glossary.map((t) => `- ${t}`),\n '',\n '## Sources',\n sourceLine(`repo-scan:${repoPath}`),\n ''\n ].join('\\n');\n writeFile(glossaryPath, glossaryMd);\n generatedFiles.push(glossaryPath);\n\n const outputs = generatedFiles.map((f) => safeRel(outDir, f)).sort((a, b) => a.localeCompare(b));\n const allOutputs = listMarkdownOutputs(outDir).map((f) => safeRel(outDir, f));\n\n const sourceItems = [\n ...codeFiles.slice(0, 200).map((f) => ({ type: 'file', ref: safeRel(repoPath, f) })),\n ...commits.slice(0, 400).map((c) => ({ type: 'commit', ref: c.hash, date: c.date, subject: c.subject }))\n ];\n\n const latestCommitDate = commits.length > 0 ? commits[commits.length - 1].date : existingManifest?.lastCommitDate;\n const latestCommitHash = commits.length > 0 ? commits[commits.length - 1].hash : existingManifest?.lastCommitHash;\n const manifest = {\n generatedAt: new Date().toISOString(),\n deterministicPipeline: true,\n mode: options.incremental ? 'incremental' : 'full',\n repoPath,\n options: { since, maxCommits, incremental: Boolean(options.incremental) },\n stats: {\n filesAnalyzed: codeFiles.length,\n modules: modules.length,\n modulesGenerated: moduleTargets.length,\n commits: commits.length,\n decisions: decisions.length,\n glossaryTerms: glossary.length\n },\n lastCommitDate: latestCommitDate,\n lastCommitHash: latestCommitHash,\n outputs,\n allOutputs,\n sources: sourceItems\n };\n\n const manifestJsonPath = path.join(sections.sources, 'manifest.json');\n writeFile(manifestJsonPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n generatedFiles.push(manifestJsonPath);\n\n const manifestMdPath = path.join(sections.sources, 'manifest.md');\n const manifestMd = [\n '# Sources Manifest',\n '',\n '- deterministicPipeline: true',\n `- mode: ${options.incremental ? 'incremental' : 'full'}`,\n `- sourceCount: ${sourceItems.length}`,\n '',\n '## Outputs',\n ...outputs.map((o) => `- ${o}`),\n '',\n '## Sources (sample)',\n ...sourceItems.slice(0, 300).map((s) => `- ${s.type}:${s.ref}`),\n ''\n ].join('\\n');\n writeFile(manifestMdPath, manifestMd);\n generatedFiles.push(manifestMdPath);\n\n return {\n outDir,\n fileCount: codeFiles.length,\n moduleCount: modules.length,\n commitCount: commits.length,\n generatedFiles: generatedFiles.sort((a, b) => a.localeCompare(b))\n };\n}\n", "/**\n * Web Viewer HTTP Server\n * Provides REST API and serves static UI files\n */\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { serve } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { fileURLToPath as fileUrlToPath } from 'url';\n\nimport { apiRouter } from './api/index.js';\n\nconst app = new Hono();\nconst moduleDir = path.dirname(fileUrlToPath(import.meta.url));\n\n// Middleware\napp.use('/*', cors());\napp.use('/*', logger());\n\n// API routes\napp.route('/api', apiRouter);\n\n// Health check\napp.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));\n\nfunction resolveUiPath(): string {\n const candidates = [\n // Built server: dist/server/index.js -> dist/ui\n path.resolve(moduleDir, '../ui'),\n // Source/dev server: src/apps/server/index.ts -> src/apps/dashboard\n path.resolve(moduleDir, '../dashboard'),\n // Fallback when running from a repository root.\n path.resolve(process.cwd(), 'dist/ui'),\n path.resolve(process.cwd(), 'src/apps/dashboard')\n ];\n\n return candidates.find((candidate) => fs.existsSync(path.join(candidate, 'index.html'))) ?? candidates[0];\n}\n\n// Static files (UI)\nconst uiPath = resolveUiPath();\nif (fs.existsSync(uiPath)) {\n app.use('/*', serveStatic({ root: uiPath }));\n}\n\n// Fallback for SPA routing\napp.get('*', (c) => {\n const indexPath = path.join(uiPath, 'index.html');\n if (fs.existsSync(indexPath)) {\n return c.html(fs.readFileSync(indexPath, 'utf-8'));\n }\n return c.text('UI not built. Run \"npm run build:ui\" first.', 404);\n});\n\nexport { app };\n\nlet serverInstance: ReturnType<typeof serve> | null = null;\n\n/**\n * Start the HTTP server\n */\nexport function startServer(port: number = 37777): NonNullable<ReturnType<typeof serve>> {\n if (serverInstance) {\n return serverInstance;\n }\n\n serverInstance = serve({\n fetch: app.fetch,\n port,\n hostname: '127.0.0.1'\n });\n\n console.log(`\uD83E\uDDE0 Code Memory viewer started at http://localhost:${port}`);\n\n return serverInstance;\n}\n\n/**\n * Stop the HTTP server\n */\nexport function stopServer(): void {\n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n }\n}\n\n/**\n * Check if server is running on given port\n */\nexport async function isServerRunning(port: number = 37777): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n// Start server if run directly\n// Check if this file is being run directly (not imported)\nconst isMainModule = process.argv[1]?.includes('server/index') ||\n process.argv[1]?.endsWith('server.js');\nif (isMainModule) {\n const port = parseInt(process.env.PORT || '37777', 10);\n startServer(port);\n}\n", "/**\n * API Router\n * Central router for all API endpoints\n */\n\nimport { Hono } from 'hono';\nimport { sessionsRouter } from './sessions.js';\nimport { eventsRouter } from './events.js';\nimport { searchRouter } from './search.js';\nimport { statsRouter } from './stats.js';\nimport { citationsRouter } from './citations.js';\nimport { turnsRouter } from './turns.js';\nimport { projectsRouter } from './projects.js';\nimport { chatRouter } from './chat.js';\nimport { healthRouter } from './health.js';\n\nexport const apiRouter = new Hono()\n .route('/sessions', sessionsRouter)\n .route('/events', eventsRouter)\n .route('/search', searchRouter)\n .route('/stats', statsRouter)\n .route('/citations', citationsRouter)\n .route('/turns', turnsRouter)\n .route('/projects', projectsRouter)\n .route('/chat', chatRouter)\n .route('/health', healthRouter);\n", "/**\n * Sessions API\n * Endpoints for session management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const sessionsRouter = new Hono();\n\n// GET /api/sessions - List all sessions\nsessionsRouter.get('/', async (c) => {\n const page = parseInt(c.req.query('page') || '1', 10);\n const pageSize = parseInt(c.req.query('pageSize') || '20', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Get recent events and extract sessions\n const recentEvents = await memoryService.getRecentEvents(1000);\n\n // Group by session\n const sessionMap = new Map<string, {\n id: string;\n startedAt: Date;\n eventCount: number;\n lastEventAt: Date;\n }>();\n\n for (const event of recentEvents) {\n const existing = sessionMap.get(event.sessionId);\n if (!existing) {\n sessionMap.set(event.sessionId, {\n id: event.sessionId,\n startedAt: event.timestamp,\n eventCount: 1,\n lastEventAt: event.timestamp\n });\n } else {\n existing.eventCount++;\n if (event.timestamp < existing.startedAt) {\n existing.startedAt = event.timestamp;\n }\n if (event.timestamp > existing.lastEventAt) {\n existing.lastEventAt = event.timestamp;\n }\n }\n }\n\n const sessions = Array.from(sessionMap.values())\n .sort((a, b) => b.lastEventAt.getTime() - a.lastEventAt.getTime());\n\n const total = sessions.length;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n const paginatedSessions = sessions.slice(start, end);\n\n return c.json({\n sessions: paginatedSessions,\n total,\n page,\n pageSize,\n hasMore: end < total\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/sessions/:id - Get session details\nsessionsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const events = await memoryService.getSessionHistory(id);\n\n if (events.length === 0) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const session = {\n id,\n startedAt: events[0].timestamp,\n endedAt: events[events.length - 1].timestamp,\n eventCount: events.length\n };\n\n const eventsByType = {\n user_prompt: events.filter(e => e.eventType === 'user_prompt').length,\n agent_response: events.filter(e => e.eventType === 'agent_response').length,\n tool_observation: events.filter(e => e.eventType === 'tool_observation').length\n };\n\n return c.json({\n session,\n events: events.slice(0, 100).map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n preview: e.content.slice(0, 200) + (e.content.length > 200 ? '...' : '')\n })),\n stats: eventsByType\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * API Utilities\n * Shared helpers for API endpoints\n */\n\nimport type { Context } from 'hono';\nimport {\n DISABLED_SHARED_STORE_CONFIG,\n getReadOnlyMemoryService,\n MemoryService\n} from '../../../services/memory-service.js';\nimport { resolveProjectStoragePath } from '../../../core/registry/project-path.js';\n\n/**\n * Get the appropriate MemoryService based on the ?project= query parameter.\n * - If ?project=<hash> is set (8 hex chars), resolves directly to project storage\n * - If ?project=<path> is set, computes hash from path\n * - Otherwise, returns the global read-only service\n *\n * Always creates read-only services for the dashboard API to avoid\n * VectorWorker lifecycle issues with per-request services.\n */\nexport function getServiceFromQuery(c: Context): MemoryService {\n const project = c.req.query('project') || c.req.query('projectId');\n if (project) {\n const storagePath = resolveProjectStoragePath(project);\n\n return new MemoryService({\n storagePath,\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n }\n return getReadOnlyMemoryService();\n}\n\n\n/**\n * Read-only lightweight service for API paths that only need sqlite/keyword reads.\n * This avoids per-request vector/embedder/shared-store initialization for stats and\n * explicit fast searches while preserving the same project query resolution rules.\n */\nexport function getLightweightServiceFromQuery(c: Context): MemoryService {\n const project = c.req.query('project') || c.req.query('projectId');\n if (project) {\n const storagePath = resolveProjectStoragePath(project);\n\n return new MemoryService({\n storagePath,\n readOnly: true,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n }\n\n return new MemoryService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n}\n", "/**\n * Events API\n * Endpoints for event management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const eventsRouter = new Hono();\n\n// GET /api/events - List events with filters\neventsRouter.get('/', async (c) => {\n const sessionId = c.req.query('sessionId');\n const eventType = c.req.query('type');\n const level = c.req.query('level');\n const sort = c.req.query('sort') || 'recent'; // recent | accessed | oldest\n const q = (c.req.query('q') || '').trim().toLowerCase();\n const limit = parseInt(c.req.query('limit') || '100', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n let events: any[];\n\n // Filter by level using the dedicated method\n if (level) {\n events = await memoryService.getEventsByLevel(level, { limit: limit + offset + 1000, offset: 0 });\n } else {\n events = await memoryService.getRecentEvents(limit + offset + 1000);\n }\n\n // Filter by session\n if (sessionId) {\n events = events.filter(e => e.sessionId === sessionId);\n }\n\n // Filter by type\n if (eventType) {\n events = events.filter(e => e.eventType === eventType);\n }\n\n // Content query filter\n if (q) {\n events = events.filter(e => (e.content || '').toLowerCase().includes(q));\n }\n\n // Sort\n if (sort === 'accessed') {\n events.sort((a: any, b: any) => {\n const aTime = a.last_accessed_at || '';\n const bTime = b.last_accessed_at || '';\n return bTime.localeCompare(aTime);\n });\n } else if (sort === 'most-accessed') {\n events.sort((a: any, b: any) => (b.access_count || 0) - (a.access_count || 0));\n } else if (sort === 'oldest') {\n events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n }\n // 'recent' is default (already sorted by timestamp DESC from the query)\n\n // Pagination\n const total = events.length;\n events = events.slice(offset, offset + limit);\n\n return c.json({\n events: events.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n sessionId: e.sessionId,\n preview: e.content.slice(0, 200) + (e.content.length > 200 ? '...' : ''),\n contentLength: e.content.length,\n metadata: e.metadata,\n accessCount: (e as any).access_count || 0,\n lastAccessedAt: (e as any).last_accessed_at || null\n })),\n total,\n limit,\n offset,\n hasMore: offset + limit < total\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/events/:id - Get event details\neventsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const recentEvents = await memoryService.getRecentEvents(10000);\n const event = recentEvents.find(e => e.id === id);\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404);\n }\n\n // Get surrounding events for context\n const sessionEvents = recentEvents\n .filter(e => e.sessionId === event.sessionId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const eventIndex = sessionEvents.findIndex(e => e.id === id);\n const start = Math.max(0, eventIndex - 2);\n const end = Math.min(sessionEvents.length, eventIndex + 3);\n const context = sessionEvents.slice(start, end).filter(e => e.id !== id);\n\n return c.json({\n event: {\n id: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n content: event.content,\n metadata: event.metadata\n },\n context: context.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp,\n preview: e.content.slice(0, 100) + (e.content.length > 100 ? '...' : '')\n }))\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Search API\n * Endpoints for memory search\n */\n\nimport { Hono } from 'hono';\nimport { getLightweightServiceFromQuery, getServiceFromQuery } from './utils.js';\n\nexport const searchRouter = new Hono();\n\ninterface SearchRequest {\n query: string;\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n eventType?: string;\n };\n}\n\ninterface DisclosureSearchRequest {\n query: string;\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: 'strict' | 'prefer' | 'global';\n allowedProjectHashes?: string[];\n strategy?: 'auto' | 'fast' | 'deep';\n };\n}\n\n// POST /api/search - Search memories\nsearchRouter.post('/', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const body = await c.req.json<SearchRequest>();\n\n if (!body.query) {\n return c.json({ error: 'Query is required' }, 400);\n }\n\n await memoryService.initialize();\n\n const startTime = Date.now();\n\n const result = await memoryService.retrieveMemories(body.query, {\n topK: body.options?.topK ?? 10,\n minScore: body.options?.minScore ?? 0.7,\n sessionId: body.options?.sessionId\n });\n\n const searchTime = Date.now() - startTime;\n\n return c.json({\n results: result.memories.map(m => ({\n id: m.event.id,\n eventType: m.event.eventType,\n timestamp: m.event.timestamp,\n sessionId: m.event.sessionId,\n score: m.score,\n content: m.event.content,\n preview: m.event.content.slice(0, 200) + (m.event.content.length > 200 ? '...' : ''),\n context: m.sessionContext\n })),\n meta: {\n totalMatches: result.memories.length,\n searchTime,\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/search/disclosure - Progressive disclosure search (Search layer)\nsearchRouter.post('/disclosure', async (c) => {\n let memoryService: ReturnType<typeof getServiceFromQuery> | undefined;\n try {\n const body = await c.req.json<DisclosureSearchRequest>();\n\n if (!body.query) {\n return c.json({ error: 'Query is required' }, 400);\n }\n\n memoryService = body.options?.strategy === 'fast'\n ? getLightweightServiceFromQuery(c)\n : getServiceFromQuery(c);\n\n await memoryService.initialize();\n const result = await memoryService.searchDisclosure(body.query, body.options);\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService?.shutdown();\n }\n});\n\n// GET /api/search/disclosure/:resultId/expand - Expand a disclosure search result\nsearchRouter.get('/disclosure/:resultId/expand', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const resultId = c.req.param('resultId');\n const rawWindowSize = c.req.query('windowSize');\n const windowSize = rawWindowSize ? parseInt(rawWindowSize, 10) : undefined;\n const result = await memoryService.expandDisclosure(\n resultId,\n Number.isFinite(windowSize) ? { windowSize } : undefined\n );\n\n if (!result) {\n return c.json({ error: 'Expansion target not found' }, 404);\n }\n\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/search/disclosure/:resultId/source - Resolve source for a disclosure search result\nsearchRouter.get('/disclosure/:resultId/source', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n const resultId = c.req.param('resultId');\n const result = await memoryService.sourceDisclosure(resultId);\n\n if (!result) {\n return c.json({ error: 'Source not found' }, 404);\n }\n\n return c.json(result);\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/search - Simple search via query param\nsearchRouter.get('/', async (c) => {\n const query = c.req.query('q');\n\n if (!query) {\n return c.json({ error: 'Query parameter \"q\" is required' }, 400);\n }\n\n const topK = parseInt(c.req.query('topK') || '5', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const result = await memoryService.retrieveMemories(query, { topK });\n\n return c.json({\n results: result.memories.map(m => ({\n id: m.event.id,\n eventType: m.event.eventType,\n timestamp: m.event.timestamp,\n score: m.score,\n preview: m.event.content.slice(0, 200) + (m.event.content.length > 200 ? '...' : '')\n })),\n meta: {\n totalMatches: result.memories.length,\n confidence: result.matchResult.confidence\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Stats API\n * Endpoints for storage statistics\n */\n\nimport { Hono } from 'hono';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getMemoryServiceForProject } from '../../../services/memory-service.js';\nimport { getLightweightServiceFromQuery, getServiceFromQuery } from './utils.js';\nimport type { MemoryEvent } from '../../../core/types.js';\n\nexport const statsRouter = new Hono();\n\ntype KpiWindow = '24h' | '7d' | '30d';\n\ntype KpiThresholds = {\n usefulRecallRateMin: number;\n reworkRateMax: number;\n postChangeFailureRateMax: number;\n avgCompletionTurnsMax: number;\n memoryHitRateMin: number;\n};\n\nconst DEFAULT_KPI_THRESHOLDS: KpiThresholds = {\n usefulRecallRateMin: 0.45,\n reworkRateMax: 0.25,\n postChangeFailureRateMax: 0.2,\n avgCompletionTurnsMax: 12,\n memoryHitRateMin: 0.35\n};\n\nfunction loadKpiThresholds(): KpiThresholds {\n try {\n const filePath = path.resolve(process.cwd(), 'config', 'kpi-thresholds.json');\n if (!fs.existsSync(filePath)) return DEFAULT_KPI_THRESHOLDS;\n const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Partial<KpiThresholds>;\n return {\n usefulRecallRateMin: Number(parsed.usefulRecallRateMin ?? DEFAULT_KPI_THRESHOLDS.usefulRecallRateMin),\n reworkRateMax: Number(parsed.reworkRateMax ?? DEFAULT_KPI_THRESHOLDS.reworkRateMax),\n postChangeFailureRateMax: Number(parsed.postChangeFailureRateMax ?? DEFAULT_KPI_THRESHOLDS.postChangeFailureRateMax),\n avgCompletionTurnsMax: Number(parsed.avgCompletionTurnsMax ?? DEFAULT_KPI_THRESHOLDS.avgCompletionTurnsMax),\n memoryHitRateMin: Number(parsed.memoryHitRateMin ?? DEFAULT_KPI_THRESHOLDS.memoryHitRateMin)\n };\n } catch {\n return DEFAULT_KPI_THRESHOLDS;\n }\n}\n\nfunction windowToMs(window: KpiWindow): number {\n if (window === '24h') return 24 * 60 * 60 * 1000;\n if (window === '7d') return 7 * 24 * 60 * 60 * 1000;\n return 30 * 24 * 60 * 60 * 1000;\n}\n\nfunction inWindow(e: MemoryEvent, now: number, window: KpiWindow): boolean {\n return now - e.timestamp.getTime() <= windowToMs(window);\n}\n\nfunction isEditToolName(name: string): boolean {\n return ['Write', 'Edit', 'MultiEdit', 'NotebookEdit'].includes(name);\n}\n\nfunction parseToolPayload(e: MemoryEvent): { toolName?: string; success?: boolean; filePath?: string; command?: string } | null {\n if (e.eventType !== 'tool_observation') return null;\n try {\n const payload = JSON.parse(e.content) as any;\n return {\n toolName: payload?.toolName,\n success: payload?.success,\n filePath: payload?.metadata?.filePath,\n command: payload?.metadata?.command\n };\n } catch {\n return {\n toolName: (e.metadata as any)?.toolName,\n success: (e.metadata as any)?.success,\n filePath: (e.metadata as any)?.filePath,\n command: (e.metadata as any)?.command\n };\n }\n}\n\nfunction isTestLikeCommand(command?: string): boolean {\n if (!command) return false;\n return /(test|jest|vitest|pytest|go test|cargo test|lint|eslint|build|tsc)/i.test(command);\n}\n\nfunction safeRatio(num: number, den: number): number {\n if (!Number.isFinite(num) || !Number.isFinite(den) || den <= 0) return 0;\n return num / den;\n}\n\nfunction round(value: number, digits = 4): number {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n}\n\nfunction computeSessionTurnCount(sessionEvents: MemoryEvent[]): number {\n const turnIds = new Set<string>();\n for (const e of sessionEvents) {\n const turnId = (e.metadata as any)?.turnId;\n if (typeof turnId === 'string' && turnId.length > 0) turnIds.add(turnId);\n }\n if (turnIds.size > 0) return turnIds.size;\n return sessionEvents.filter((e) => e.eventType === 'user_prompt').length;\n}\n\ntype KpiMetrics = {\n memoryHitRate: number;\n usefulRecallRate: number;\n avgCompletionTurns: number;\n timeToFirstValidEditMinutes: number;\n reworkRate: number;\n postChangeFailureRate: number;\n};\n\nfunction computeKpiMetrics(events: MemoryEvent[], usefulRecallRate: number): KpiMetrics {\n const prompts = events.filter((e) => e.eventType === 'user_prompt');\n const promptCount = prompts.length;\n const memoryHitPrompts = prompts.filter((p) => (p.metadata as any)?.adherence?.checked).length;\n const memoryHitRate = round(safeRatio(memoryHitPrompts, promptCount));\n\n const sessions = new Map<string, MemoryEvent[]>();\n for (const e of events) {\n const arr = sessions.get(e.sessionId) || [];\n arr.push(e);\n sessions.set(e.sessionId, arr);\n }\n\n let sessionTurnTotal = 0;\n let sessionTurnSamples = 0;\n let firstValidEditMinutesTotal = 0;\n let firstValidEditSamples = 0;\n\n for (const sessionEvents of sessions.values()) {\n sessionEvents.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const turns = computeSessionTurnCount(sessionEvents);\n if (turns > 0) {\n sessionTurnTotal += turns;\n sessionTurnSamples++;\n }\n\n const firstPrompt = sessionEvents.find((e) => e.eventType === 'user_prompt');\n const firstEdit = sessionEvents.find((e) => {\n const payload = parseToolPayload(e);\n return payload?.toolName && isEditToolName(payload.toolName) && payload.success === true;\n });\n if (firstPrompt && firstEdit) {\n const minutes = (firstEdit.timestamp.getTime() - firstPrompt.timestamp.getTime()) / 60000;\n if (minutes >= 0) {\n firstValidEditMinutesTotal += minutes;\n firstValidEditSamples++;\n }\n }\n }\n\n const avgCompletionTurns = round(safeRatio(sessionTurnTotal, sessionTurnSamples), 2);\n const timeToFirstValidEditMinutes = round(safeRatio(firstValidEditMinutesTotal, firstValidEditSamples), 2);\n\n const editActions: Array<{ sessionId: string; timestamp: number; filePath?: string }> = [];\n let testRunsAfterEdit = 0;\n let failedTestRunsAfterEdit = 0;\n\n for (const [sessionId, sessionEvents] of sessions.entries()) {\n const sorted = [...sessionEvents].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n let seenEdit = false;\n\n for (const e of sorted) {\n const payload = parseToolPayload(e);\n if (!payload?.toolName) continue;\n\n if (isEditToolName(payload.toolName) && payload.success === true) {\n editActions.push({ sessionId, timestamp: e.timestamp.getTime(), filePath: payload.filePath });\n seenEdit = true;\n continue;\n }\n\n if (seenEdit && isTestLikeCommand(payload.command)) {\n testRunsAfterEdit++;\n if (payload.success === false) failedTestRunsAfterEdit++;\n }\n }\n }\n\n const THIRTY_MIN_MS = 30 * 60 * 1000;\n let reworkCount = 0;\n const bySessionFile = new Map<string, number>();\n const sortedEdits = [...editActions].sort((a, b) => a.timestamp - b.timestamp);\n for (const edit of sortedEdits) {\n if (!edit.filePath) continue;\n const key = `${edit.sessionId}::${edit.filePath}`;\n const prev = bySessionFile.get(key);\n if (typeof prev === 'number' && edit.timestamp - prev <= THIRTY_MIN_MS) {\n reworkCount++;\n }\n bySessionFile.set(key, edit.timestamp);\n }\n\n const reworkRate = round(safeRatio(reworkCount, editActions.length));\n const postChangeFailureRate = round(safeRatio(failedTestRunsAfterEdit, testRunsAfterEdit));\n\n return {\n memoryHitRate,\n usefulRecallRate,\n avgCompletionTurns,\n timeToFirstValidEditMinutes,\n reworkRate,\n postChangeFailureRate\n };\n}\n\n\n// GET /api/stats/shared - Get shared store statistics\nstatsRouter.get('/shared', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const sharedStats = await memoryService.getSharedStoreStats();\n return c.json({\n troubleshooting: sharedStats?.total || 0,\n bestPractices: 0,\n commonErrors: 0,\n totalUsageCount: sharedStats?.totalUsageCount || 0,\n lastUpdated: null\n });\n } catch (error) {\n return c.json({\n troubleshooting: 0,\n bestPractices: 0,\n commonErrors: 0,\n totalUsageCount: 0,\n lastUpdated: null\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/endless - Get endless mode status\nstatsRouter.get('/endless', async (c) => {\n const projectPath = c.req.query('project') || process.cwd();\n const memoryService = getMemoryServiceForProject(projectPath);\n try {\n await memoryService.initialize();\n const status = await memoryService.getEndlessModeStatus();\n return c.json({\n mode: status.mode,\n continuityScore: status.continuityScore,\n workingSetSize: status.workingSetSize,\n consolidatedCount: status.consolidatedCount,\n lastConsolidation: status.lastConsolidation?.toISOString() || null\n });\n } catch (error) {\n return c.json({\n mode: 'session',\n continuityScore: 0,\n workingSetSize: 0,\n consolidatedCount: 0,\n lastConsolidation: null\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/levels/:level - Get events by memory level\nstatsRouter.get('/levels/:level', async (c) => {\n const { level } = c.req.param();\n const limit = parseInt(c.req.query('limit') || '20', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n const sort = c.req.query('sort') || 'recent';\n\n // Validate level\n const validLevels = ['L0', 'L1', 'L2', 'L3', 'L4'];\n if (!validLevels.includes(level)) {\n return c.json({ error: `Invalid level. Must be one of: ${validLevels.join(', ')}` }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n let events = await memoryService.getEventsByLevel(level, { limit: limit * 2, offset });\n const stats = await memoryService.getStats();\n const levelStat = stats.levelStats.find(s => s.level === level);\n\n // Apply sorting\n if (sort === 'accessed') {\n // Sort by access count (will need to get from SQLite)\n // For now, add access count from SQLite if available\n const sqliteStore = (memoryService as any).sqliteEventStore;\n if (sqliteStore) {\n const accessedEvents = await sqliteStore.getMostAccessed(1000);\n const accessMap = new Map(accessedEvents.map((e: any) => [e.id, e.access_count || 0]));\n events = events.map((e: any) => ({\n ...e,\n accessCount: accessMap.get(e.id) || 0\n }));\n events.sort((a: any, b: any) => b.accessCount - a.accessCount);\n }\n } else if (sort === 'oldest') {\n events.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n } else {\n // 'recent' - default sorting (newest first)\n events.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n }\n\n // Apply limit after sorting\n events = events.slice(0, limit);\n\n return c.json({\n level,\n events: events.map((e: any) => ({\n id: e.id,\n eventType: e.eventType,\n sessionId: e.sessionId,\n timestamp: e.timestamp.toISOString(),\n content: e.content.slice(0, 500) + (e.content.length > 500 ? '...' : ''),\n metadata: e.metadata,\n accessCount: e.accessCount || 0\n })),\n total: levelStat?.count || 0,\n limit,\n offset,\n hasMore: events.length === limit\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats - Get overall statistics\nstatsRouter.get('/', async (c) => {\n const memoryService = getLightweightServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const stats = await memoryService.getStats();\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n // Calculate event types\n const eventsByType = recentEvents.reduce((acc, e) => {\n acc[e.eventType] = (acc[e.eventType] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n // Calculate unique sessions\n const uniqueSessions = new Set(recentEvents.map(e => e.sessionId));\n\n // Calculate events by day (last 7 days)\n const now = new Date();\n const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n const eventsByDay = recentEvents\n .filter(e => e.timestamp >= sevenDaysAgo)\n .reduce((acc, e) => {\n const day = e.timestamp.toISOString().split('T')[0];\n acc[day] = (acc[day] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n const retrievalTrace = await memoryService.getRetrievalTraceStats();\n\n return c.json({\n storage: {\n eventCount: stats.totalEvents,\n vectorCount: stats.vectorCount\n },\n sessions: {\n total: uniqueSessions.size\n },\n eventsByType,\n activity: {\n daily: eventsByDay,\n total7Days: recentEvents.filter(e => e.timestamp >= sevenDaysAgo).length\n },\n memory: {\n heapUsed: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),\n heapTotal: Math.round(process.memoryUsage().heapTotal / 1024 / 1024)\n },\n levelStats: stats.levelStats,\n retrievalTrace\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/most-accessed - Get most accessed memories\nstatsRouter.get('/most-accessed', async (c) => {\n const limit = parseInt(c.req.query('limit') || '10', 10);\n // Use the same read-only service that other stats endpoints use\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n console.log('[most-accessed] Fetching most accessed memories, limit:', limit);\n const memories = await memoryService.getMostAccessedMemories(limit);\n console.log('[most-accessed] Got memories:', memories.length);\n\n return c.json({\n memories: memories.map(m => ({\n memoryId: m.memoryId,\n summary: m.summary,\n topics: m.topics,\n accessCount: m.accessCount,\n lastAccessed: m.lastAccessed || null,\n confidence: m.confidence,\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : m.createdAt\n })),\n total: memories.length\n });\n } catch (error) {\n console.error('[most-accessed] Error:', error);\n return c.json({\n memories: [],\n total: 0,\n error: (error as Error).message\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/timeline - Get activity timeline\nstatsRouter.get('/timeline', async (c) => {\n const days = parseInt(c.req.query('days') || '7', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n const filteredEvents = recentEvents.filter(e => e.timestamp >= cutoff);\n\n // Group by day\n const daily = filteredEvents.reduce((acc, e) => {\n const day = e.timestamp.toISOString().split('T')[0];\n if (!acc[day]) {\n acc[day] = { date: day, total: 0, prompts: 0, responses: 0, tools: 0 };\n }\n acc[day].total++;\n if (e.eventType === 'user_prompt') acc[day].prompts++;\n if (e.eventType === 'agent_response') acc[day].responses++;\n if (e.eventType === 'tool_observation') acc[day].tools++;\n return acc;\n }, {} as Record<string, { date: string; total: number; prompts: number; responses: number; tools: number }>);\n\n return c.json({\n days,\n daily: Object.values(daily).sort((a, b) => a.date.localeCompare(b.date))\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/helpfulness - Get helpfulness statistics and top helpful memories\nstatsRouter.get('/helpfulness', async (c) => {\n const limit = parseInt(c.req.query('limit') || '10', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const stats = await memoryService.getHelpfulnessStats();\n const topMemories = await memoryService.getHelpfulMemories(limit);\n\n return c.json({\n ...stats,\n topMemories: topMemories.map(m => ({\n eventId: m.eventId,\n summary: m.summary,\n helpfulnessScore: m.helpfulnessScore,\n accessCount: m.accessCount,\n evaluationCount: m.evaluationCount\n }))\n });\n } catch (error) {\n return c.json({\n avgScore: 0,\n totalEvaluated: 0,\n totalRetrievals: 0,\n helpful: 0,\n neutral: 0,\n unhelpful: 0,\n topMemories: []\n });\n } finally {\n await memoryService.shutdown();\n }\n});\n\n\n\n// GET /api/stats/retrieval-traces - Get recent retrieval traces (query -> selected context)\nstatsRouter.get('/retrieval-traces', async (c) => {\n const limit = parseInt(c.req.query('limit') || '50', 10);\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const traces = await memoryService.getRecentRetrievalTraces(limit);\n const traceStats = await memoryService.getRetrievalTraceStats();\n\n return c.json({\n stats: traceStats,\n traces: traces.map((t) => ({\n traceId: t.traceId,\n sessionId: t.sessionId || null,\n projectHash: t.projectHash || null,\n queryText: t.queryText,\n strategy: t.strategy || null,\n candidateEventIds: t.candidateEventIds,\n selectedEventIds: t.selectedEventIds,\n candidateDetails: t.candidateDetails || [],\n selectedDetails: t.selectedDetails || [],\n candidateCount: t.candidateCount,\n selectedCount: t.selectedCount,\n confidence: t.confidence || null,\n fallbackTrace: t.fallbackTrace,\n createdAt: t.createdAt.toISOString()\n }))\n });\n } catch (error) {\n return c.json({\n stats: { totalQueries: 0, avgCandidateCount: 0, avgSelectedCount: 0, selectionRate: 0 },\n traces: [],\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/kpi - Productivity KPI summary + trend\nstatsRouter.get('/kpi', async (c) => {\n const rawWindow = (c.req.query('window') || '7d') as KpiWindow;\n const window: KpiWindow = rawWindow === '24h' || rawWindow === '30d' ? rawWindow : '7d';\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const now = Date.now();\n const thresholds = loadKpiThresholds();\n const allEvents = await memoryService.getRecentEvents(20000);\n const events = allEvents.filter((e) => inWindow(e, now, window));\n\n const helpfulness = await memoryService.getHelpfulnessStats();\n const usefulRecallRate = helpfulness.totalEvaluated > 0\n ? round(safeRatio(helpfulness.helpful, helpfulness.totalEvaluated))\n : 0;\n\n const metrics = computeKpiMetrics(events, usefulRecallRate);\n\n const windowMs = windowToMs(window);\n const prevEvents = allEvents.filter((e) => {\n const age = now - e.timestamp.getTime();\n return age > windowMs && age <= windowMs * 2;\n });\n const previousMetrics = computeKpiMetrics(prevEvents, usefulRecallRate);\n const deltas = {\n memoryHitRate: round(metrics.memoryHitRate - previousMetrics.memoryHitRate),\n usefulRecallRate: round(metrics.usefulRecallRate - previousMetrics.usefulRecallRate),\n avgCompletionTurns: round(metrics.avgCompletionTurns - previousMetrics.avgCompletionTurns, 2),\n timeToFirstValidEditMinutes: round(metrics.timeToFirstValidEditMinutes - previousMetrics.timeToFirstValidEditMinutes, 2),\n reworkRate: round(metrics.reworkRate - previousMetrics.reworkRate),\n postChangeFailureRate: round(metrics.postChangeFailureRate - previousMetrics.postChangeFailureRate)\n };\n\n const THIRTY_MIN_MS = 30 * 60 * 1000;\n\n // Trend (daily buckets for last 30 days)\n const trendWindowMs = 30 * 24 * 60 * 60 * 1000;\n const trendEvents = allEvents.filter((e) => now - e.timestamp.getTime() <= trendWindowMs);\n const buckets = new Map<string, MemoryEvent[]>();\n for (const e of trendEvents) {\n const day = e.timestamp.toISOString().split('T')[0];\n const arr = buckets.get(day) || [];\n arr.push(e);\n buckets.set(day, arr);\n }\n\n const trendDaily = Array.from(buckets.entries())\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([date, dayEvents]) => {\n const dayPrompts = dayEvents.filter((e) => e.eventType === 'user_prompt');\n const dayPromptCount = dayPrompts.length;\n const dayMemoryHit = dayPrompts.filter((p) => (p.metadata as any)?.adherence?.checked).length;\n\n // lightweight day rework/failure approximation\n const dayEdits = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isEditToolName(p.toolName) && p.success === true);\n });\n const dayEditActions = dayEdits\n .map((e) => {\n const p = parseToolPayload(e);\n return { sessionId: e.sessionId, timestamp: e.timestamp.getTime(), filePath: p?.filePath };\n })\n .filter((x) => Boolean(x.filePath));\n let dayReworkCount = 0;\n const dayBySessionFile = new Map<string, number>();\n for (const edit of dayEditActions) {\n const key = `${edit.sessionId}::${edit.filePath}`;\n const prev = dayBySessionFile.get(key);\n if (typeof prev === 'number' && edit.timestamp - prev <= THIRTY_MIN_MS) dayReworkCount++;\n dayBySessionFile.set(key, edit.timestamp);\n }\n const dayTests = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isTestLikeCommand(p.command));\n });\n const dayFailedTests = dayEvents.filter((e) => {\n const p = parseToolPayload(e);\n return Boolean(p?.toolName && isTestLikeCommand(p.command) && p.success === false);\n });\n\n const turnsBySession = new Map<string, MemoryEvent[]>();\n for (const e of dayEvents) {\n const arr = turnsBySession.get(e.sessionId) || [];\n arr.push(e);\n turnsBySession.set(e.sessionId, arr);\n }\n let dayTurnsTotal = 0;\n let dayTurnsSamples = 0;\n for (const sessionEvents of turnsBySession.values()) {\n const turns = computeSessionTurnCount(sessionEvents);\n if (turns > 0) {\n dayTurnsTotal += turns;\n dayTurnsSamples++;\n }\n }\n\n return {\n date,\n memoryHitRate: round(safeRatio(dayMemoryHit, dayPromptCount)),\n usefulRecallRate,\n reworkRate: round(safeRatio(dayReworkCount, dayEditActions.length)),\n postChangeFailureRate: round(safeRatio(dayFailedTests.length, dayTests.length)),\n avgCompletionTurns: round(safeRatio(dayTurnsTotal, dayTurnsSamples), 2)\n };\n });\n\n const alerts: Array<{ metric: string; level: 'warn'; message: string; value: number; threshold: number }> = [];\n if (metrics.usefulRecallRate < thresholds.usefulRecallRateMin) {\n alerts.push({ metric: 'usefulRecallRate', level: 'warn', message: 'Useful recall rate is below threshold', value: metrics.usefulRecallRate, threshold: thresholds.usefulRecallRateMin });\n }\n if (metrics.reworkRate > thresholds.reworkRateMax) {\n alerts.push({ metric: 'reworkRate', level: 'warn', message: 'Rework rate is above threshold', value: metrics.reworkRate, threshold: thresholds.reworkRateMax });\n }\n if (metrics.postChangeFailureRate > thresholds.postChangeFailureRateMax) {\n alerts.push({ metric: 'postChangeFailureRate', level: 'warn', message: 'Post-change failure rate is above threshold', value: metrics.postChangeFailureRate, threshold: thresholds.postChangeFailureRateMax });\n }\n if (metrics.avgCompletionTurns > thresholds.avgCompletionTurnsMax) {\n alerts.push({ metric: 'avgCompletionTurns', level: 'warn', message: 'Average completion turns is above threshold', value: metrics.avgCompletionTurns, threshold: thresholds.avgCompletionTurnsMax });\n }\n if (metrics.memoryHitRate < thresholds.memoryHitRateMin) {\n alerts.push({ metric: 'memoryHitRate', level: 'warn', message: 'Memory hit rate is below threshold', value: metrics.memoryHitRate, threshold: thresholds.memoryHitRateMin });\n }\n\n return c.json({\n window,\n metrics,\n previousMetrics,\n deltas,\n trend: {\n daily: trendDaily\n },\n thresholds,\n alerts\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/stats/graduation/run - Force graduation evaluation\nstatsRouter.post('/graduation/run', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n const result = await memoryService.forceGraduation();\n\n return c.json({\n success: true,\n evaluated: result.evaluated,\n graduated: result.graduated,\n byLevel: result.byLevel\n });\n } catch (error) {\n return c.json({\n success: false,\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/stats/graduation - Get graduation criteria info\nstatsRouter.get('/graduation', async (c) => {\n return c.json({\n criteria: {\n L0toL1: { minAccessCount: 1, minConfidence: 0.5, minCrossSessionRefs: 0, maxAgeDays: 30 },\n L1toL2: { minAccessCount: 3, minConfidence: 0.7, minCrossSessionRefs: 1, maxAgeDays: 60 },\n L2toL3: { minAccessCount: 5, minConfidence: 0.85, minCrossSessionRefs: 2, maxAgeDays: 90 },\n L3toL4: { minAccessCount: 10, minConfidence: 0.92, minCrossSessionRefs: 3, maxAgeDays: 180 }\n },\n description: {\n accessCount: 'Number of times the memory was retrieved/referenced',\n confidence: 'Match confidence score when retrieved (0.0-1.0)',\n crossSessionRefs: 'Number of different sessions that referenced this memory',\n maxAgeDays: 'Maximum days since last access (prevents stale promotion)'\n }\n });\n});\n", "/**\n * Citations API\n * Endpoints for citation management\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\nimport { generateCitationId, parseCitationId } from '../../../core/citation-generator.js';\n\nexport const citationsRouter = new Hono();\n\n// GET /api/citations/:id - Get citation by ID\ncitationsRouter.get('/:id', async (c) => {\n const { id } = c.req.param();\n\n // Support both formats: \"a7Bc3x\" or \"mem:a7Bc3x\"\n const citationId = parseCitationId(id) || id;\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Search through recent events to find the one matching this citation ID\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n const event = recentEvents.find(e => {\n const eventCitationId = generateCitationId(e.id);\n return eventCitationId === citationId;\n });\n\n if (!event) {\n return c.json({ error: 'Citation not found' }, 404);\n }\n\n return c.json({\n citation: {\n id: citationId,\n eventId: event.id\n },\n event: {\n id: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n content: event.content,\n metadata: event.metadata\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/citations/:id/related - Get related citations\ncitationsRouter.get('/:id/related', async (c) => {\n const { id } = c.req.param();\n const citationId = parseCitationId(id) || id;\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const recentEvents = await memoryService.getRecentEvents(10000);\n\n // Find the main event\n const event = recentEvents.find(e => {\n const eventCitationId = generateCitationId(e.id);\n return eventCitationId === citationId;\n });\n\n if (!event) {\n return c.json({ error: 'Citation not found' }, 404);\n }\n\n // Get surrounding events from same session\n const sessionEvents = recentEvents\n .filter(e => e.sessionId === event.sessionId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const eventIndex = sessionEvents.findIndex(e => e.id === event.id);\n const prev = eventIndex > 0 ? sessionEvents[eventIndex - 1] : null;\n const next = eventIndex < sessionEvents.length - 1 ? sessionEvents[eventIndex + 1] : null;\n\n return c.json({\n previous: prev ? {\n citationId: generateCitationId(prev.id),\n eventType: prev.eventType,\n timestamp: prev.timestamp,\n preview: prev.content.slice(0, 100) + (prev.content.length > 100 ? '...' : '')\n } : null,\n next: next ? {\n citationId: generateCitationId(next.id),\n eventType: next.eventType,\n timestamp: next.timestamp,\n preview: next.content.slice(0, 100) + (next.content.length > 100 ? '...' : '')\n } : null\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Citation Generator\n * Generates unique, short citation IDs for memory references\n */\n\nimport { createHash } from 'crypto';\n\nconst ID_LENGTH = 6;\nconst CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n/**\n * Generate a citation ID from an event ID using SHA256\n */\nexport function generateCitationId(eventId: string): string {\n const hash = createHash('sha256')\n .update(eventId)\n .digest();\n\n let id = '';\n for (let i = 0; i < ID_LENGTH; i++) {\n id += CHARSET[hash[i] % CHARSET.length];\n }\n\n return id;\n}\n\n/**\n * Generate a unique citation ID with collision handling\n */\nexport async function generateUniqueCitationId(\n eventId: string,\n existsCheck: (id: string) => Promise<boolean>\n): Promise<string> {\n let id = generateCitationId(eventId);\n let attempt = 0;\n\n while (await existsCheck(id) && attempt < 10) {\n // Add salt and regenerate\n id = generateCitationId(`${eventId}:${attempt}`);\n attempt++;\n }\n\n if (attempt >= 10) {\n throw new Error('Failed to generate unique citation ID after 10 attempts');\n }\n\n return id;\n}\n\n/**\n * Format a citation ID for display\n */\nexport function formatCitationId(citationId: string): string {\n return `[mem:${citationId}]`;\n}\n\n/**\n * Parse a citation ID from formatted string\n */\nexport function parseCitationId(formatted: string): string | null {\n const match = formatted.match(/\\[?mem:([A-Za-z0-9]{6})\\]?/);\n return match ? match[1] : null;\n}\n", "/**\n * Turns API\n * Endpoints for viewing events grouped by conversation turn\n *\n * A \"turn\" groups a user_prompt with its associated tool_observations\n * and the final agent_response into a single logical unit.\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const turnsRouter = new Hono();\n\n// GET /api/turns?sessionId=xxx - List turns for a session\nturnsRouter.get('/', async (c) => {\n const sessionId = c.req.query('sessionId');\n const limit = parseInt(c.req.query('limit') || '20', 10);\n const offset = parseInt(c.req.query('offset') || '0', 10);\n\n if (!sessionId) {\n return c.json({ error: 'sessionId is required' }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const turns = await memoryService.getSessionTurns(sessionId, { limit, offset });\n const totalTurns = await memoryService.countSessionTurns(sessionId);\n\n return c.json({\n turns: turns.map(t => ({\n turnId: t.turnId,\n startedAt: t.startedAt.toISOString(),\n promptPreview: t.promptPreview,\n eventCount: t.eventCount,\n toolCount: t.toolCount,\n hasResponse: t.hasResponse,\n events: t.events.map(e => ({\n id: e.id,\n eventType: e.eventType,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp,\n preview: e.content.slice(0, 300) + (e.content.length > 300 ? '...' : ''),\n contentLength: e.content.length\n }))\n })),\n total: totalTurns,\n limit,\n offset,\n hasMore: offset + limit < totalTurns\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// GET /api/turns/:turnId - Get full turn details\nturnsRouter.get('/:turnId', async (c) => {\n const { turnId } = c.req.param();\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n const events = await memoryService.getEventsByTurn(turnId);\n\n if (events.length === 0) {\n return c.json({ error: 'Turn not found' }, 404);\n }\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const responseEvents = events.filter(e => e.eventType === 'agent_response');\n\n return c.json({\n turnId,\n sessionId: events[0].sessionId,\n startedAt: events[0].timestamp instanceof Date\n ? events[0].timestamp.toISOString()\n : events[0].timestamp,\n prompt: promptEvent ? {\n id: promptEvent.id,\n content: promptEvent.content,\n timestamp: promptEvent.timestamp instanceof Date\n ? promptEvent.timestamp.toISOString()\n : promptEvent.timestamp\n } : null,\n tools: toolEvents.map(e => {\n let toolName = '';\n let success = true;\n try {\n const parsed = JSON.parse(e.content);\n toolName = parsed.toolName || '';\n success = parsed.success !== false;\n } catch { /* ignore */ }\n\n return {\n id: e.id,\n toolName,\n success,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp,\n preview: e.content.slice(0, 500) + (e.content.length > 500 ? '...' : '')\n };\n }),\n responses: responseEvents.map(e => ({\n id: e.id,\n content: e.content,\n timestamp: e.timestamp instanceof Date ? e.timestamp.toISOString() : e.timestamp\n })),\n totalEvents: events.length\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\n// POST /api/turns/backfill - Backfill turn_ids from metadata\nturnsRouter.post('/backfill', async (c) => {\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n const updated = await memoryService.backfillTurnIds();\n\n return c.json({\n success: true,\n updated,\n message: `Backfilled turn_id for ${updated} events`\n });\n } catch (error) {\n return c.json({\n success: false,\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Projects API\n * Endpoints for listing available projects\n */\n\nimport { Hono } from 'hono';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { loadSessionRegistry } from '../../../services/memory-service.js';\n\nexport const projectsRouter = new Hono();\n\n// GET /api/projects - List available projects\nprojectsRouter.get('/', async (c) => {\n try {\n const projectsDir = path.join(os.homedir(), '.claude-code', 'memory', 'projects');\n\n if (!fs.existsSync(projectsDir)) {\n return c.json({ projects: [] });\n }\n\n // Read project directories\n const projectHashes = fs.readdirSync(projectsDir)\n .filter(name => {\n const fullPath = path.join(projectsDir, name);\n return fs.statSync(fullPath).isDirectory();\n });\n\n // Load session registry to map hashes to project paths\n const registry = loadSessionRegistry();\n const hashToPath = new Map<string, string>();\n for (const entry of Object.values(registry.sessions)) {\n if (!hashToPath.has(entry.projectHash)) {\n hashToPath.set(entry.projectHash, entry.projectPath);\n }\n }\n\n // Build project list\n const projects = projectHashes.map(hash => {\n const dirPath = path.join(projectsDir, hash);\n const dbPath = path.join(dirPath, 'events.sqlite');\n let dbSize = 0;\n if (fs.existsSync(dbPath)) {\n dbSize = fs.statSync(dbPath).size;\n }\n\n const projectPath = hashToPath.get(hash) || `unknown (${hash})`;\n\n return {\n hash,\n projectPath,\n projectName: path.basename(projectPath),\n dbSize,\n dbSizeHuman: formatBytes(dbSize)\n };\n });\n\n // Sort by project name\n projects.sort((a, b) => a.projectName.localeCompare(b.projectName));\n\n return c.json({ projects });\n } catch (error) {\n return c.json({ projects: [], error: (error as Error).message }, 500);\n }\n});\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n}\n", "/**\n * Chat API\n * Endpoints for memory-aware chat using Claude CLI\n */\n\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { spawn } from 'child_process';\nimport type { ChildProcess } from 'child_process';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const chatRouter = new Hono();\n\ninterface ChatRequest {\n message: string;\n history?: Array<{ role: 'user' | 'assistant'; content: string }>;\n}\n\nconst CLAUDE_TIMEOUT_MS = 120_000;\n\nchatRouter.post('/', async (c) => {\n let body: ChatRequest;\n try {\n body = await c.req.json<ChatRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n\n if (!body.message?.trim()) {\n return c.json({ error: 'Message is required' }, 400);\n }\n\n const memoryService = getServiceFromQuery(c);\n\n try {\n await memoryService.initialize();\n\n // Retrieve relevant memories for context\n let memoryContext = '';\n let statsContext = '';\n\n try {\n const result = await memoryService.retrieveMemories(body.message, {\n topK: 8,\n minScore: 0.5\n });\n\n if (result.memories.length > 0) {\n const parts: string[] = ['## Relevant Memories\\n'];\n for (const m of result.memories) {\n const date = new Date(m.event.timestamp).toISOString().split('T')[0];\n const content = m.event.content.slice(0, 500);\n parts.push(`### [${m.event.eventType}] ${date} (score: ${m.score.toFixed(2)})`);\n parts.push(content);\n if (m.sessionContext) {\n parts.push(`_Context: ${m.sessionContext}_`);\n }\n parts.push('');\n }\n memoryContext = parts.join('\\n');\n }\n } catch {\n // Continue without memory context if retrieval fails\n }\n\n try {\n const stats = await memoryService.getStats();\n const levels = stats.levelStats.map(l => `${l.level}: ${l.count}`).join(', ');\n statsContext = [\n '## Memory Stats',\n `- Total events: ${stats.totalEvents}`,\n `- Vector nodes: ${stats.vectorCount}`,\n `- By level: ${levels}`\n ].join('\\n');\n } catch {\n // Continue without stats if it fails\n }\n\n const fullPrompt = buildPrompt(\n statsContext,\n memoryContext,\n body.history || [],\n body.message\n );\n\n // Stream response via SSE\n return streamSSE(c, async (stream) => {\n try {\n await streamClaudeResponse(fullPrompt, stream);\n } catch (err) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({ error: (err as Error).message })\n });\n }\n });\n } catch (error) {\n return c.json({ error: (error as Error).message }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n\nfunction buildPrompt(\n statsContext: string,\n memoryContext: string,\n history: Array<{ role: string; content: string }>,\n currentMessage: string\n): string {\n const parts: string[] = [];\n\n parts.push('You are a helpful assistant that answers questions about the user\\'s code memory data.');\n parts.push('The memory system tracks coding sessions, tool usage, prompts, and responses.');\n parts.push('Answer concisely based on the memory context below. If you don\\'t have enough data, say so.');\n parts.push('Use markdown formatting in your responses.\\n');\n\n if (statsContext) {\n parts.push(statsContext);\n parts.push('');\n }\n\n if (memoryContext) {\n parts.push(memoryContext);\n } else {\n parts.push('No directly relevant memories found for this query.');\n parts.push('Answer based on general knowledge or suggest the user rephrase.\\n');\n }\n\n parts.push('---\\n');\n\n // Include recent history (last 10 turns)\n const recentHistory = history.slice(-10);\n if (recentHistory.length > 0) {\n parts.push('## Conversation History\\n');\n for (const msg of recentHistory) {\n const prefix = msg.role === 'user' ? 'User' : 'Assistant';\n parts.push(`**${prefix}:** ${msg.content}\\n`);\n }\n }\n\n parts.push(`**User:** ${currentMessage}`);\n\n return parts.join('\\n');\n}\n\nfunction streamClaudeResponse(\n prompt: string,\n stream: { writeSSE: (msg: { event?: string; data: string }) => Promise<void> }\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc: ChildProcess = spawn('claude', [\n '-p',\n '--output-format', 'stream-json',\n '--verbose'\n ], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env }\n });\n\n const timeout = setTimeout(() => {\n proc.kill('SIGTERM');\n reject(new Error('Chat response timed out after 2 minutes'));\n }, CLAUDE_TIMEOUT_MS);\n\n // Write prompt to stdin\n proc.stdin!.write(prompt);\n proc.stdin!.end();\n\n let buffer = '';\n let lastSentText = '';\n\n proc.stdout!.on('data', async (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line);\n\n // Extract text from assistant messages\n if (parsed.type === 'assistant' && parsed.message?.content) {\n const textBlocks = parsed.message.content\n .filter((b: { type: string }) => b.type === 'text')\n .map((b: { text: string }) => b.text)\n .join('');\n\n if (textBlocks.length > lastSentText.length) {\n const delta = textBlocks.slice(lastSentText.length);\n lastSentText = textBlocks;\n await stream.writeSSE({\n event: 'message',\n data: JSON.stringify({ content: delta })\n });\n }\n }\n\n // Handle completion\n if (parsed.type === 'result') {\n await stream.writeSSE({ event: 'done', data: '{}' });\n }\n } catch {\n // Skip non-JSON lines\n }\n }\n });\n\n proc.stderr!.on('data', (chunk: Buffer) => {\n if (process.env.CLAUDE_MEMORY_DEBUG) {\n console.error('[chat] claude stderr:', chunk.toString());\n }\n });\n\n proc.on('error', (err) => {\n clearTimeout(timeout);\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n reject(new Error('Claude CLI not found. Install with: npm install -g @anthropic-ai/claude-code'));\n } else {\n reject(err);\n }\n });\n\n proc.on('close', async (code) => {\n clearTimeout(timeout);\n\n // Flush remaining buffer\n if (buffer.trim()) {\n try {\n const parsed = JSON.parse(buffer);\n if (parsed.type === 'result') {\n await stream.writeSSE({ event: 'done', data: '{}' });\n }\n } catch { /* ignore */ }\n }\n\n if (code !== 0 && code !== null) {\n reject(new Error(`Claude CLI exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n}\n", "/**\n * Health API\n * Operational health checks including outbox backlog/failures\n */\n\nimport { Hono } from 'hono';\nimport { getServiceFromQuery } from './utils.js';\n\nexport const healthRouter = new Hono();\n\n// GET /api/health\nhealthRouter.get('/', async (c) => {\n const memoryService = getServiceFromQuery(c);\n try {\n await memoryService.initialize();\n\n const [stats, outbox] = await Promise.all([\n memoryService.getStats(),\n memoryService.getOutboxStats()\n ]);\n\n const outboxPending = outbox.embedding.pending + outbox.vector.pending;\n const outboxFailed = outbox.embedding.failed + outbox.vector.failed;\n\n const status = outboxFailed > 0 ? 'needs-attention' : 'ok';\n\n return c.json({\n status,\n timestamp: new Date().toISOString(),\n storage: {\n totalEvents: stats.totalEvents,\n vectorCount: stats.vectorCount\n },\n outbox: {\n embedding: outbox.embedding,\n vector: outbox.vector,\n totals: {\n pending: outboxPending,\n failed: outboxFailed\n }\n },\n levelStats: stats.levelStats\n });\n } catch (error) {\n return c.json({\n status: 'error',\n timestamp: new Date().toISOString(),\n error: (error as Error).message\n }, 500);\n } finally {\n await memoryService.shutdown();\n }\n});\n", "/**\n * Mongo Sync Worker\n * Optional: sync per-project SQLite events to a shared MongoDB database.\n *\n * Design goals:\n * - Optional and decoupled (doesn't affect default local-only flow)\n * - Idempotent (safe to retry)\n * - Incremental push (SQLite rowid) and incremental pull (Mongo seq per project)\n *\n * NOTE:\n * - We only sync immutable L0 events (events table). Derived tables can be rebuilt.\n */\n\nimport { randomUUID } from 'crypto';\nimport * as os from 'os';\nimport { MongoClient } from 'mongodb';\nimport type { Collection, Db } from 'mongodb';\n\nimport type { MemoryEvent } from './types.js';\nimport { SQLiteEventStore } from './sqlite-event-store.js';\n\nexport type MongoSyncDirection = 'push' | 'pull' | 'both';\n\nexport interface MongoSyncWorkerConfig {\n uri: string;\n dbName: string;\n projectKey: string;\n direction?: MongoSyncDirection;\n intervalMs?: number;\n batchSize?: number;\n instanceId?: string;\n}\n\nexport interface MongoSyncStats {\n lastSyncAt: Date | null;\n pushedEvents: number;\n pulledEvents: number;\n errors: number;\n status: 'idle' | 'syncing' | 'error' | 'stopped';\n}\n\ninterface CounterDoc {\n _id: string;\n seq: number;\n}\n\ninterface RemoteEventDoc {\n _id: string;\n projectKey: string;\n seq: number;\n eventId: string;\n eventType: string;\n sessionId: string;\n timestamp: Date;\n content: string;\n canonicalKey: string;\n dedupeKey: string;\n metadata?: Record<string, unknown> | null;\n insertedAt: Date;\n updatedAt: Date;\n source?: {\n hostname?: string;\n instanceId?: string;\n };\n}\n\nfunction redactMongoUri(uri: string): string {\n // mongodb://user:pass@host:port/ -> mongodb://user:***@host:port/\n // mongodb+srv://user:pass@host/ -> mongodb+srv://user:***@host/\n const schemeIdx = uri.indexOf('://');\n if (schemeIdx === -1) return uri;\n const atIdx = uri.indexOf('@', schemeIdx + 3);\n if (atIdx === -1) return uri;\n\n const creds = uri.slice(schemeIdx + 3, atIdx); // user:pass\n const colonIdx = creds.indexOf(':');\n if (colonIdx === -1) return uri;\n\n const prefix = uri.slice(0, schemeIdx + 3 + colonIdx + 1);\n const suffix = uri.slice(atIdx);\n return `${prefix}***${suffix}`;\n}\n\nfunction parseIntOrZero(value: string | null | undefined): number {\n if (!value) return 0;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n}\n\nexport class MongoSyncWorker {\n private readonly config: Required<Omit<MongoSyncWorkerConfig, 'instanceId'>> & { instanceId: string };\n private intervalHandle: NodeJS.Timeout | null = null;\n private running = false;\n\n private client: MongoClient | null = null;\n private db: Db | null = null;\n private counters: Collection<CounterDoc> | null = null;\n private events: Collection<RemoteEventDoc> | null = null;\n private indexesEnsured = false;\n\n private stats: MongoSyncStats = {\n lastSyncAt: null,\n pushedEvents: 0,\n pulledEvents: 0,\n errors: 0,\n status: 'idle'\n };\n\n constructor(\n private readonly sqliteStore: SQLiteEventStore,\n config: MongoSyncWorkerConfig\n ) {\n this.config = {\n uri: config.uri,\n dbName: config.dbName,\n projectKey: config.projectKey,\n direction: config.direction ?? 'both',\n intervalMs: config.intervalMs ?? 30000,\n batchSize: config.batchSize ?? 500,\n instanceId: config.instanceId ?? randomUUID()\n };\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stats.status = 'idle';\n\n // Initial sync\n this.syncNow().catch((err) => {\n console.error('[MongoSyncWorker] Initial sync failed:', err);\n });\n\n // Periodic sync\n this.intervalHandle = setInterval(() => {\n this.syncNow().catch((err) => {\n console.error('[MongoSyncWorker] Periodic sync failed:', err);\n });\n }, this.config.intervalMs);\n }\n\n stop(): void {\n this.running = false;\n this.stats.status = 'stopped';\n\n if (this.intervalHandle) {\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n }\n\n async shutdown(): Promise<void> {\n this.stop();\n await this.disconnect();\n }\n\n getStats(): MongoSyncStats {\n return { ...this.stats };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n async syncNow(): Promise<{ pushed: number; pulled: number }> {\n if (this.stats.status === 'syncing') return { pushed: 0, pulled: 0 };\n\n this.stats.status = 'syncing';\n let pushed = 0;\n let pulled = 0;\n\n try {\n await this.sqliteStore.initialize();\n await this.ensureConnected();\n await this.ensureIndexes();\n\n if (this.config.direction === 'push' || this.config.direction === 'both') {\n pushed = await this.pushEvents();\n this.stats.pushedEvents += pushed;\n }\n\n if (this.config.direction === 'pull' || this.config.direction === 'both') {\n pulled = await this.pullEvents();\n this.stats.pulledEvents += pulled;\n }\n\n this.stats.lastSyncAt = new Date();\n this.stats.status = 'idle';\n return { pushed, pulled };\n } catch (error) {\n this.stats.errors++;\n this.stats.status = 'error';\n throw error;\n }\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.client && this.db && this.counters && this.events) return;\n\n try {\n this.client = new MongoClient(this.config.uri, {\n appName: 'claude-memory-layer',\n serverSelectionTimeoutMS: 5000\n });\n await this.client.connect();\n this.db = this.client.db(this.config.dbName);\n this.counters = this.db.collection<CounterDoc>('cml_counters');\n this.events = this.db.collection<RemoteEventDoc>('cml_events');\n } catch (err) {\n // Avoid leaking credentials in logs\n const safeUri = redactMongoUri(this.config.uri);\n throw new Error(`MongoDB connection failed (${safeUri}, db=${this.config.dbName}): ${String(err)}`);\n }\n }\n\n private async disconnect(): Promise<void> {\n try {\n await this.client?.close();\n } finally {\n this.client = null;\n this.db = null;\n this.counters = null;\n this.events = null;\n this.indexesEnsured = false;\n }\n }\n\n private async ensureIndexes(): Promise<void> {\n if (this.indexesEnsured) return;\n if (!this.events || !this.counters) throw new Error('Mongo not connected');\n\n // Best-effort: if the user lacks index privileges, sync can still work (slower)\n try {\n await this.events.createIndex({ projectKey: 1, seq: 1 }, { unique: true });\n await this.events.createIndex({ projectKey: 1, eventId: 1 }, { unique: true });\n await this.events.createIndex({ projectKey: 1, dedupeKey: 1 });\n } catch (err) {\n console.warn('[MongoSyncWorker] Failed to ensure indexes (continuing):', err);\n }\n\n this.indexesEnsured = true;\n }\n\n private counterKey(kind: 'events'): string {\n return `${kind}:${this.config.projectKey}`;\n }\n\n private async allocateSeqRange(kind: 'events', count: number): Promise<number> {\n if (!this.counters) throw new Error('Mongo not connected');\n if (count <= 0) return 1;\n\n const key = this.counterKey(kind);\n const doc = await this.counters.findOneAndUpdate(\n { _id: key },\n { $inc: { seq: count } },\n { upsert: true, returnDocument: 'after' }\n );\n\n const endSeq = doc?.seq;\n if (typeof endSeq !== 'number') {\n throw new Error(`Failed to allocate seq range for ${key}`);\n }\n\n return endSeq - count + 1;\n }\n\n private pushTargetName(): string {\n return `mongo_push_events_rowid:${this.config.projectKey}`;\n }\n\n private pullTargetName(): string {\n return `mongo_pull_events_seq:${this.config.projectKey}`;\n }\n\n private async pushEvents(): Promise<number> {\n if (!this.events) throw new Error('Mongo not connected');\n\n const position = await this.sqliteStore.getSyncPosition(this.pushTargetName());\n let lastRowid = parseIntOrZero(position.lastEventId);\n\n let pushed = 0;\n\n while (true) {\n const batch = await this.sqliteStore.getEventsSinceRowid(lastRowid, this.config.batchSize);\n if (batch.length === 0) break;\n\n const startSeq = await this.allocateSeqRange('events', batch.length);\n const now = new Date();\n const hostname = os.hostname();\n\n const ops = batch.map((item, idx) => {\n const event = item.event as unknown as MemoryEvent;\n const seq = startSeq + idx;\n const docId = `${this.config.projectKey}:${event.id}`;\n\n return {\n updateOne: {\n filter: { _id: docId },\n update: {\n $setOnInsert: {\n _id: docId,\n projectKey: this.config.projectKey,\n seq,\n eventId: event.id,\n eventType: event.eventType,\n sessionId: event.sessionId,\n timestamp: event.timestamp,\n content: event.content,\n canonicalKey: event.canonicalKey,\n dedupeKey: event.dedupeKey,\n metadata: event.metadata ?? null,\n insertedAt: now,\n updatedAt: now,\n source: { hostname, instanceId: this.config.instanceId }\n }\n },\n upsert: true\n }\n };\n });\n\n await this.events.bulkWrite(ops, { ordered: false });\n\n const last = batch[batch.length - 1];\n lastRowid = last.rowid;\n await this.sqliteStore.updateSyncPosition(\n this.pushTargetName(),\n String(lastRowid),\n last.event.timestamp.toISOString()\n );\n\n pushed += batch.length;\n if (batch.length < this.config.batchSize) break;\n }\n\n return pushed;\n }\n\n private async pullEvents(): Promise<number> {\n if (!this.events) throw new Error('Mongo not connected');\n\n const position = await this.sqliteStore.getSyncPosition(this.pullTargetName());\n let lastSeq = parseIntOrZero(position.lastEventId);\n\n let pulled = 0;\n\n while (true) {\n const docs = await this.events.find(\n { projectKey: this.config.projectKey, seq: { $gt: lastSeq } },\n { sort: { seq: 1 }, limit: this.config.batchSize }\n ).toArray();\n\n if (docs.length === 0) break;\n\n const events: MemoryEvent[] = docs.map((d) => ({\n id: d.eventId,\n eventType: d.eventType as any,\n sessionId: d.sessionId,\n timestamp: d.timestamp instanceof Date ? d.timestamp : new Date(d.timestamp),\n content: d.content,\n canonicalKey: d.canonicalKey,\n dedupeKey: d.dedupeKey,\n metadata: d.metadata ?? undefined\n }));\n\n const result = await this.sqliteStore.importEvents(events);\n pulled += result.inserted;\n\n lastSeq = docs[docs.length - 1].seq;\n await this.sqliteStore.updateSyncPosition(\n this.pullTargetName(),\n String(lastSeq),\n new Date().toISOString()\n );\n\n if (docs.length < this.config.batchSize) break;\n }\n\n return pulled;\n }\n}\n", "import type {\n RetrievalDisclosureExpansion,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureSource\n} from '../../core/engine/retrieval-disclosure-service.js';\nimport type { RetrievalResultEnvelope } from '../../core/model/retrieval-result.js';\nimport type { UnifiedRetrievalResult } from '../../core/retriever.js';\n\nexport function formatPlainSearchResults(result: UnifiedRetrievalResult): string {\n const lines: string[] = [\n '',\n '\uD83D\uDCDA Search Results',\n '',\n `Confidence: ${result.matchResult.confidence}`,\n `Total local memories found: ${result.memories.length}`,\n `Shared memories found: ${result.sharedMemories?.length ?? 0}`,\n ''\n ];\n\n for (const memory of result.memories) {\n const date = memory.event.timestamp.toISOString().split('T')[0];\n lines.push('---');\n lines.push(`\uD83D\uDCCC ${memory.event.eventType} (${date})`);\n lines.push(` Score: ${memory.score.toFixed(3)}`);\n lines.push(` Session: ${memory.event.sessionId.slice(0, 8)}...`);\n lines.push(` Content: ${preview(memory.event.content, 200)}`);\n lines.push('');\n }\n\n if (result.sharedMemories && result.sharedMemories.length > 0) {\n lines.push('\uD83C\uDF10 Shared Memories', '');\n for (const entry of result.sharedMemories) {\n lines.push('---');\n lines.push(`\uD83C\uDF10 ${entry.title}`);\n lines.push(` Source: shared:${entry.entryId}`);\n lines.push(` Project: ${entry.sourceProjectHash}`);\n lines.push(` Score: ${entry.confidence.toFixed(3)}`);\n lines.push(` Topics: ${entry.topics.join(', ') || 'n/a'}`);\n lines.push(` Symptoms: ${entry.symptoms.join('; ') || 'n/a'}`);\n lines.push(` Root cause: ${entry.rootCause}`);\n lines.push(` Solution: ${entry.solution}`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureSearch(response: RetrievalDisclosureSearchResponse): string {\n const lines: string[] = [\n '',\n '\uD83D\uDD0E Progressive Search Results',\n '',\n `Meta: total=${response.meta.total} vector=${yesNo(response.meta.usedVector)} keyword=${yesNo(response.meta.usedKeyword)} fallback=${yesNo(response.meta.fallbackApplied)}`,\n ''\n ];\n\n if (response.results.length === 0) {\n lines.push('No results found.', '');\n return lines.join('\\n');\n }\n\n response.results.forEach((result, index) => {\n lines.push(formatEnvelope(result, index + 1));\n });\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureExpansion(expansion: RetrievalDisclosureExpansion): string {\n const lines: string[] = [\n '',\n '\uD83E\uDDE9 Expanded Retrieval Result',\n '',\n 'Target',\n formatEnvelope(expansion.target),\n ''\n ];\n\n if (expansion.surroundingFacts && expansion.surroundingFacts.length > 0) {\n lines.push('Surrounding');\n expansion.surroundingFacts.forEach((item, index) => {\n lines.push(formatEnvelope(item, index + 1));\n });\n lines.push('');\n }\n\n if (expansion.summaries && expansion.summaries.length > 0) {\n lines.push('Summaries');\n expansion.summaries.forEach((item, index) => {\n lines.push(formatEnvelope(item, index + 1));\n });\n lines.push('');\n }\n\n if (expansion.relatedSources && expansion.relatedSources.length > 0) {\n lines.push('Sources');\n for (const source of expansion.relatedSources) {\n lines.push(`- ${source.sourceRef} (${source.sourceType}) events=${source.eventIds.join(',')}`);\n lines.push(...formatMetadataLines(source.metadata, ' '));\n }\n lines.push('');\n }\n\n if (expansion.expandedContext) {\n lines.push('Expanded Context', expansion.expandedContext, '');\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDisclosureSource(source: RetrievalDisclosureSource): string {\n const lines: string[] = [\n '',\n '\uD83D\uDCCE Retrieval Source',\n '',\n `sourceRef: ${source.sourceRef}`,\n `sourceType: ${source.sourceType}`,\n `eventIds: ${source.eventIds.join(', ')}`,\n ''\n ];\n\n if (source.rawEvents.length > 0) {\n lines.push('Raw Events');\n for (const event of source.rawEvents) {\n const timestamp = event.timestamp instanceof Date\n ? event.timestamp.toISOString()\n : String(event.timestamp);\n lines.push(`- ${event.id} ${timestamp}`);\n lines.push(` [${event.eventType}] ${preview(event.content, 500)}`);\n if (event.sessionId) lines.push(` session: ${event.sessionId}`);\n if (event.canonicalKey) lines.push(` canonicalKey: ${event.canonicalKey}`);\n }\n lines.push('');\n } else if (source.sourceType === 'shared_troubleshooting') {\n lines.push('No local raw events for this shared source.', '');\n }\n\n if (source.metadata && Object.keys(source.metadata).length > 0) {\n lines.push('Shared Metadata');\n lines.push(...formatMetadataLines(source.metadata, ' '));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction formatEnvelope(result: RetrievalResultEnvelope, index?: number): string {\n const prefix = index ? `${index}. ` : '- ';\n const title = result.title ? ` ${result.title}` : '';\n const lines = [\n `${prefix}[${result.resultType}]${title}`,\n ` id: ${result.id}`,\n ` score: ${result.score.toFixed(3)}`,\n ` reasons: ${result.reasons.join(', ') || 'n/a'}`,\n ` source: ${result.sourceRef || 'n/a'}`\n ];\n\n if (result.sessionId) {\n lines.push(` session: ${result.sessionId.slice(0, 12)}${result.sessionId.length > 12 ? '...' : ''}`);\n }\n\n lines.push(...formatMetadataLines(result.metadata, ' ', ['sourceProjectHash', 'sourceEntryId', 'topics']));\n lines.push(` snippet: ${result.snippet}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction yesNo(value: boolean): 'yes' | 'no' {\n return value ? 'yes' : 'no';\n}\n\nfunction preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction formatMetadataLines(\n metadata: Record<string, unknown> | undefined,\n prefix: string,\n allowedKeys?: string[]\n): string[] {\n if (!metadata) return [];\n return Object.entries(metadata)\n .filter(([key, value]) => value !== undefined && (!allowedKeys || allowedKeys.includes(key)))\n .map(([key, value]) => `${prefix}${key}: ${formatMetadataValue(value)}`);\n}\n\nfunction formatMetadataValue(value: unknown): string {\n if (Array.isArray(value)) return value.join(', ');\n if (value instanceof Date) return value.toISOString();\n if (value && typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n", "import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface McpServerEntry {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface ClaudeDesktopConfig {\n mcpServers?: Record<string, McpServerEntry>;\n [key: string]: unknown;\n}\n\nexport interface InstallMcpServerOptions extends McpServerEntry {\n serverName: string;\n}\n\nexport function getDefaultClaudeDesktopConfigPath(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n home: string = homedir()\n): string {\n if (platform === 'darwin') {\n return join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n\n if (platform === 'win32') {\n return join(env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n\n return join(env.XDG_CONFIG_HOME ?? join(home, '.config'), 'claude', 'claude_desktop_config.json');\n}\n\nexport function readJsonConfig(configPath: string): ClaudeDesktopConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n const content = readFileSync(configPath, 'utf8').trim();\n if (!content) {\n return {};\n }\n\n return JSON.parse(content) as ClaudeDesktopConfig;\n}\n\nexport function saveJsonConfig(configPath: string, config: ClaudeDesktopConfig): void {\n mkdirSync(dirname(configPath), { recursive: true });\n const tempPath = `${configPath}.tmp`;\n writeFileSync(tempPath, `${JSON.stringify(config, null, 2)}\\n`);\n renameSync(tempPath, configPath);\n}\n\nexport function installMcpServerConfig(\n existingConfig: ClaudeDesktopConfig,\n options: InstallMcpServerOptions\n): ClaudeDesktopConfig {\n const { serverName, command, args, env } = options;\n const serverEntry: McpServerEntry = { command };\n\n if (args && args.length > 0) {\n serverEntry.args = args;\n } else if (args) {\n serverEntry.args = [];\n }\n\n if (env && Object.keys(env).length > 0) {\n serverEntry.env = env;\n }\n\n return {\n ...existingConfig,\n mcpServers: {\n ...(existingConfig.mcpServers ?? {}),\n [serverName]: serverEntry\n }\n };\n}\n\nexport interface InstallMcpServerCommandOptions {\n configPath?: string;\n serverName?: string;\n command?: string;\n args?: string[];\n dryRun?: boolean;\n}\n\nexport function installMcpServer(options: InstallMcpServerCommandOptions = {}): {\n configPath: string;\n config: ClaudeDesktopConfig;\n} {\n const configPath = options.configPath ?? getDefaultClaudeDesktopConfigPath();\n const config = installMcpServerConfig(readJsonConfig(configPath), {\n serverName: options.serverName ?? 'claude-memory-layer',\n command: options.command ?? 'claude-memory-layer-mcp',\n args: options.args ?? []\n });\n\n if (!options.dryRun) {\n saveJsonConfig(configPath, config);\n }\n\n return { configPath, config };\n}\n", "import * as path from 'path';\n\nexport interface ClaudeHookCommand {\n type: string;\n command: string;\n}\n\nexport interface ClaudeHookEntry {\n matcher: string;\n hooks: ClaudeHookCommand[];\n}\n\nexport interface ClaudeSettingsHooks {\n UserPromptSubmit?: ClaudeHookEntry[];\n PostToolUse?: ClaudeHookEntry[];\n SessionStart?: ClaudeHookEntry[];\n Stop?: ClaudeHookEntry[];\n SessionEnd?: ClaudeHookEntry[];\n [key: string]: ClaudeHookEntry[] | undefined;\n}\n\nexport interface ClaudeSettingsWithHooks {\n hooks?: ClaudeSettingsHooks;\n [key: string]: unknown;\n}\n\nexport const REQUIRED_HOOK_FILES = [\n 'user-prompt-submit.js',\n 'post-tool-use.js',\n 'session-start.js',\n 'stop.js',\n 'session-end.js'\n] as const;\n\nexport const PLUGIN_HOOKS = {\n SessionStart: 'session-start.js',\n UserPromptSubmit: 'user-prompt-submit.js',\n PostToolUse: 'post-tool-use.js',\n Stop: 'stop.js',\n SessionEnd: 'session-end.js'\n} as const;\n\nexport type PluginHookName = keyof typeof PLUGIN_HOOKS;\n\nexport function shellQuotePathForNode(filePath: string): string {\n return `'${filePath.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function buildHookCommand(pluginPath: string, fileName: string): string {\n return `node ${shellQuotePathForNode(path.join(pluginPath, 'hooks', fileName))}`;\n}\n\nexport function getHooksConfig(pluginPath: string): ClaudeSettingsHooks {\n const makeHook = (fileName: string): ClaudeHookEntry[] => [\n {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: buildHookCommand(pluginPath, fileName)\n }\n ]\n }\n ];\n\n return Object.fromEntries(\n Object.entries(PLUGIN_HOOKS).map(([hookName, fileName]) => [hookName, makeHook(fileName)])\n ) as ClaudeSettingsHooks;\n}\n\nexport function isPluginHookCommand(command: string | undefined, pluginPath?: string): boolean {\n if (!command) return false;\n const normalized = command.replace(/\\\\/g, '/');\n const normalizedPluginPath = pluginPath?.replace(/\\\\/g, '/').replace(/\\/$/, '');\n\n return REQUIRED_HOOK_FILES.some((fileName) => {\n if (normalizedPluginPath && normalized.includes(`${normalizedPluginPath}/hooks/${fileName}`)) {\n return true;\n }\n return normalized.includes('claude-memory-layer') && normalized.includes(`/hooks/${fileName}`);\n });\n}\n\nexport function hasHook(\n settings: ClaudeSettingsWithHooks,\n hookName: PluginHookName,\n commandFragment: string\n): boolean {\n const hookEntries = settings.hooks?.[hookName];\n if (!hookEntries) return false;\n return hookEntries.some((entry) => entry.hooks?.some((hook) => hook.command?.includes(commandFragment)));\n}\n\nexport function removePluginHooksFromSettings<T extends ClaudeSettingsWithHooks>(settings: T, pluginPath?: string): T {\n const next = { ...settings };\n if (!settings.hooks) return next;\n\n const hooks: ClaudeSettingsHooks = { ...settings.hooks };\n\n for (const hookName of Object.keys(PLUGIN_HOOKS) as PluginHookName[]) {\n const entries = hooks[hookName] ?? [];\n const cleanedEntries = entries\n .map((entry) => ({\n ...entry,\n hooks: (entry.hooks ?? []).filter((hook) => !isPluginHookCommand(hook.command, pluginPath))\n }))\n .filter((entry) => entry.hooks.length > 0);\n\n if (cleanedEntries.length > 0) {\n hooks[hookName] = cleanedEntries;\n } else {\n delete hooks[hookName];\n }\n }\n\n if (Object.keys(hooks).length > 0) {\n next.hooks = hooks;\n } else {\n delete next.hooks;\n }\n\n return next;\n}\n\nexport function mergePluginHooksIntoSettings<T extends ClaudeSettingsWithHooks>(settings: T, pluginPath: string): T {\n const cleaned = removePluginHooksFromSettings(settings, pluginPath);\n const next = { ...cleaned, hooks: { ...(cleaned.hooks ?? {}) } };\n const pluginHooks = getHooksConfig(pluginPath);\n\n for (const hookName of Object.keys(PLUGIN_HOOKS) as PluginHookName[]) {\n next.hooks[hookName] = [\n ...(next.hooks[hookName] ?? []),\n ...(pluginHooks[hookName] ?? [])\n ];\n }\n\n return next;\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { CodexSessionValidationReport } from '../../services/codex-session-history-importer.js';\n\nexport type CodexValidationReportFormat = 'json' | 'markdown';\n\nfunction formatNumber(value: number): string {\n return Number.isFinite(value) ? value.toLocaleString('en-US') : String(value);\n}\n\nexport function formatCodexValidationReport(\n report: CodexSessionValidationReport,\n format: CodexValidationReportFormat = 'markdown'\n): string {\n if (format === 'json') {\n return `${JSON.stringify(report, null, 2)}\\n`;\n }\n\n const lines: string[] = [\n '# Codex dry-run validation report',\n '',\n `Generated: ${report.generatedAt}`,\n `Dry-run: ${report.dryRun ? 'yes' : 'no'}`,\n `Will mutate memory: ${report.willMutate ? 'yes' : 'no'}`,\n `Sessions directory: ${report.source.sessionsDir}`,\n `Project filter: ${report.source.projectPath ?? '(none)'}`,\n `Source paths: ${report.source.sourcePaths.join(', ')}`,\n `Session limit: ${report.limits.sessionLimit ?? '(none)'}`,\n `Max content chars: ${formatNumber(report.limits.maxContentChars)}`,\n '',\n '## Totals',\n '',\n `- Sessions scanned: ${formatNumber(report.totals.sessionsScanned)}`,\n `- Sessions matched: ${formatNumber(report.totals.sessionsMatched)}`,\n `- Files read: ${formatNumber(report.totals.filesRead)}`,\n `- Records read: ${formatNumber(report.totals.recordsRead)}`,\n `- Messages normalized: ${formatNumber(report.totals.messagesNormalized)}`,\n `- Turns normalized: ${formatNumber(report.totals.turnsNormalized)}`,\n `- User messages: ${formatNumber(report.totals.userMessages)}`,\n `- Assistant messages: ${formatNumber(report.totals.assistantMessages)}`,\n `- Malformed lines: ${formatNumber(report.totals.malformedLines)}`,\n `- Skipped/unsupported records: ${formatNumber(report.totals.skippedUnsupportedRecords)}`,\n `- Empty assistant messages: ${formatNumber(report.totals.emptyAssistantMessages)}`,\n `- Truncated messages: ${formatNumber(report.totals.truncatedMessages)}`,\n `- Missing project cwd: ${formatNumber(report.totals.missingProjectCwd)}`,\n `- Warnings: ${formatNumber(report.totals.warnings)}`,\n '',\n '## Top projects',\n '',\n '| Project | Hash | Sessions | Messages | Turns | User | Assistant | Malformed | Skipped/unsupported | Truncated | Empty assistant |',\n '| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |'\n ];\n\n if (report.topProjects.length === 0) {\n lines.push('| (none) | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |');\n } else {\n for (const project of report.topProjects) {\n lines.push([\n `| ${project.pathLabel}`,\n project.projectHash,\n formatNumber(project.sessions),\n formatNumber(project.messagesNormalized),\n formatNumber(project.turnsNormalized),\n formatNumber(project.userMessages),\n formatNumber(project.assistantMessages),\n formatNumber(project.malformedLines),\n formatNumber(project.skippedUnsupportedRecords),\n formatNumber(project.truncatedMessages),\n `${formatNumber(project.emptyAssistantMessages)} |`\n ].join(' | '));\n }\n }\n\n lines.push('', '## Warnings', '');\n if (report.warnings.length === 0) {\n lines.push('- None');\n } else {\n for (const warning of report.warnings) {\n lines.push(`- ${warning}`);\n }\n }\n\n lines.push('', '_Aggregate counts only; transcript content is not included._', '');\n return lines.join('\\n');\n}\n\nexport function writeCodexValidationReport(\n outputPath: string,\n report: CodexSessionValidationReport,\n format: CodexValidationReportFormat = 'markdown'\n): void {\n const dir = path.dirname(outputPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(outputPath, formatCodexValidationReport(report, format), 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { HermesSessionValidationReport } from '../../services/hermes-session-history-importer.js';\n\nexport type HermesValidationReportFormat = 'json' | 'markdown';\n\nfunction formatNumber(value: number): string {\n return Number.isFinite(value) ? value.toLocaleString('en-US') : String(value);\n}\n\nexport function formatHermesValidationReport(\n report: HermesSessionValidationReport,\n format: HermesValidationReportFormat = 'markdown'\n): string {\n if (format === 'json') {\n return `${JSON.stringify(report, null, 2)}\\n`;\n }\n\n const lines: string[] = [\n '# Hermes dry-run validation report',\n '',\n `Generated: ${report.generatedAt}`,\n `Dry-run: ${report.dryRun ? 'yes' : 'no'}`,\n `Will mutate memory: ${report.willMutate ? 'yes' : 'no'}`,\n `State DB: ${report.source.stateDbPath}`,\n `Project filter: ${report.source.projectPath ?? '(none)'}`,\n `Source paths: ${report.source.sourcePaths.join(', ')}`,\n `Session limit: ${report.limits.sessionLimit ?? '(none)'}`,\n `Max content chars: ${formatNumber(report.limits.maxContentChars)}`,\n '',\n '## Totals',\n '',\n `- Sessions scanned: ${formatNumber(report.totals.sessionsScanned)}`,\n `- Sessions matched: ${formatNumber(report.totals.sessionsMatched)}`,\n `- Messages read: ${formatNumber(report.totals.messagesRead)}`,\n `- Messages normalized: ${formatNumber(report.totals.messagesNormalized)}`,\n `- Turns normalized: ${formatNumber(report.totals.turnsNormalized)}`,\n `- User messages: ${formatNumber(report.totals.userMessages)}`,\n `- Assistant messages: ${formatNumber(report.totals.assistantMessages)}`,\n `- Skipped/unsupported messages: ${formatNumber(report.totals.skippedUnsupportedMessages)}`,\n `- Empty assistant messages: ${formatNumber(report.totals.emptyAssistantMessages)}`,\n `- Truncated messages: ${formatNumber(report.totals.truncatedMessages)}`,\n `- Missing project context: ${formatNumber(report.totals.missingProjectContext)}`,\n `- Warnings: ${formatNumber(report.totals.warnings)}`,\n '',\n '## Top sources',\n '',\n '| Source | Sessions | Messages | Turns | User | Assistant | Skipped/unsupported | Truncated | Empty assistant |',\n '| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |'\n ];\n\n if (report.topSources.length === 0) {\n lines.push('| (none) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |');\n } else {\n for (const source of report.topSources) {\n lines.push([\n `| ${source.source}`,\n formatNumber(source.sessions),\n formatNumber(source.messagesNormalized),\n formatNumber(source.turnsNormalized),\n formatNumber(source.userMessages),\n formatNumber(source.assistantMessages),\n formatNumber(source.skippedUnsupportedMessages),\n formatNumber(source.truncatedMessages),\n `${formatNumber(source.emptyAssistantMessages)} |`\n ].join(' | '));\n }\n }\n\n lines.push('', '## Warnings', '');\n if (report.warnings.length === 0) {\n lines.push('- None');\n } else {\n for (const warning of report.warnings) {\n lines.push(`- ${warning}`);\n }\n }\n\n lines.push('', '_Aggregate counts only; transcript content is not included._', '');\n return lines.join('\\n');\n}\n\nexport function writeHermesValidationReport(\n outputPath: string,\n report: HermesSessionValidationReport,\n format: HermesValidationReportFormat = 'markdown'\n): void {\n const dir = path.dirname(outputPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(outputPath, formatHermesValidationReport(report, format), 'utf8');\n}\n", "import {\n createCodexSessionHistoryImporter,\n type CodexSessionHistoryImporter,\n type CodexSessionHistoryImporterOptions\n} from '../../services/codex-session-history-importer.js';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n type MemoryService\n} from '../../services/memory-service.js';\nimport type { ImportOptions, ImportResult, ProgressEvent } from '../../services/session-history-importer.js';\n\nexport interface CodexImportCommandOptions {\n project?: string;\n session?: string;\n all?: boolean;\n limit?: string;\n sessionLimit?: string;\n force?: boolean;\n verbose?: boolean;\n sessionsDir?: string;\n processEmbeddings?: boolean;\n}\n\nexport interface CodexImportOutcome {\n mode: 'project' | 'session' | 'all';\n storageScope: 'project' | 'global';\n projectPath?: string;\n result: ImportResult;\n embedCount: number;\n}\n\nexport interface CodexImportRunnerDeps {\n cwd: () => string;\n getDefaultMemoryService: () => MemoryService;\n getMemoryServiceForProject: (projectPath: string) => MemoryService;\n createImporter: (\n memoryService: MemoryService,\n options?: CodexSessionHistoryImporterOptions\n ) => Pick<CodexSessionHistoryImporter, 'importProject' | 'importAll' | 'importSessionFile'>;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nconst realDeps: CodexImportRunnerDeps = {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createCodexSessionHistoryImporter\n};\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction shouldUseGlobalStorage(options: CodexImportCommandOptions): boolean {\n return options.all === true && !options.project && !options.session;\n}\n\nexport async function runCodexImportOnce(\n options: CodexImportCommandOptions,\n deps: CodexImportRunnerDeps = realDeps\n): Promise<CodexImportOutcome> {\n const targetProjectPath = options.project || deps.cwd();\n const useGlobalStorage = shouldUseGlobalStorage(options);\n const memoryService = useGlobalStorage\n ? deps.getDefaultMemoryService()\n : deps.getMemoryServiceForProject(targetProjectPath);\n const importer = deps.createImporter(memoryService, { sessionsDir: options.sessionsDir });\n\n await memoryService.initialize();\n await memoryService.ensureEmbeddingModelForImport({ autoMigrate: true });\n\n const importOptions: ImportOptions = {\n limit: parsePositiveInteger(options.limit, 'limit'),\n sessionLimit: parsePositiveInteger(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: deps.onProgress\n };\n\n let mode: CodexImportOutcome['mode'];\n let result: ImportResult;\n\n try {\n if (options.session) {\n mode = 'session';\n result = await importer.importSessionFile(options.session, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n } else if (options.all) {\n mode = 'all';\n result = await importer.importAll(importOptions);\n } else {\n mode = 'project';\n result = await importer.importProject(targetProjectPath, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n }\n\n const embedCount = options.processEmbeddings === false\n ? 0\n : await memoryService.processPendingEmbeddings();\n\n return {\n mode,\n storageScope: useGlobalStorage ? 'global' : 'project',\n projectPath: useGlobalStorage ? undefined : targetProjectPath,\n result,\n embedCount\n };\n } finally {\n await memoryService.shutdown();\n }\n}\n", "import {\n createHermesSessionHistoryImporter,\n type HermesSessionHistoryImporter,\n type HermesSessionHistoryImporterOptions\n} from '../../services/hermes-session-history-importer.js';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject,\n type MemoryService\n} from '../../services/memory-service.js';\nimport type { ImportOptions, ImportResult, ProgressEvent } from '../../services/session-history-importer.js';\n\nexport interface HermesImportCommandOptions {\n project?: string;\n session?: string;\n all?: boolean;\n limit?: string;\n sessionLimit?: string;\n force?: boolean;\n verbose?: boolean;\n stateDb?: string;\n stateDbPath?: string;\n processEmbeddings?: boolean;\n}\n\nexport interface HermesImportOutcome {\n mode: 'project' | 'session' | 'all';\n storageScope: 'project' | 'global';\n projectPath?: string;\n result: ImportResult;\n embedCount: number;\n}\n\nexport interface HermesImportRunnerDeps {\n cwd: () => string;\n getDefaultMemoryService: () => MemoryService;\n getMemoryServiceForProject: (projectPath: string) => MemoryService;\n createImporter: (\n memoryService: MemoryService,\n options?: HermesSessionHistoryImporterOptions\n ) => Pick<HermesSessionHistoryImporter, 'importProject' | 'importAll' | 'importSession'>;\n onProgress?: (event: ProgressEvent) => void;\n}\n\nconst realDeps: HermesImportRunnerDeps = {\n cwd: () => process.cwd(),\n getDefaultMemoryService,\n getMemoryServiceForProject,\n createImporter: createHermesSessionHistoryImporter\n};\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim();\n if (!/^\\d+$/.test(normalized)) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n const parsed = Number.parseInt(normalized, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid --${name}: expected a positive integer`);\n }\n return parsed;\n}\n\nfunction shouldUseGlobalStorage(options: HermesImportCommandOptions): boolean {\n return options.all === true && !options.project && !options.session;\n}\n\nfunction getStateDbPathOption(options: HermesImportCommandOptions): string | undefined {\n return options.stateDbPath ?? options.stateDb;\n}\n\nexport async function runHermesImportOnce(\n options: HermesImportCommandOptions,\n deps: HermesImportRunnerDeps = realDeps\n): Promise<HermesImportOutcome> {\n const targetProjectPath = options.project || deps.cwd();\n const useGlobalStorage = shouldUseGlobalStorage(options);\n const memoryService = useGlobalStorage\n ? deps.getDefaultMemoryService()\n : deps.getMemoryServiceForProject(targetProjectPath);\n const importer = deps.createImporter(memoryService, { stateDbPath: getStateDbPathOption(options) });\n\n await memoryService.initialize();\n await memoryService.ensureEmbeddingModelForImport({ autoMigrate: true });\n\n const importOptions: ImportOptions = {\n limit: parsePositiveInteger(options.limit, 'limit'),\n sessionLimit: parsePositiveInteger(options.sessionLimit, 'session-limit'),\n force: options.force,\n verbose: options.verbose,\n onProgress: deps.onProgress\n };\n\n let mode: HermesImportOutcome['mode'];\n let result: ImportResult;\n\n try {\n if (options.session) {\n mode = 'session';\n result = await importer.importSession(options.session, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n } else if (options.all) {\n mode = 'all';\n result = await importer.importAll(importOptions);\n } else {\n mode = 'project';\n result = await importer.importProject(targetProjectPath, {\n ...importOptions,\n projectPath: targetProjectPath\n });\n }\n\n const embedCount = options.processEmbeddings === false\n ? 0\n : await memoryService.processPendingEmbeddings();\n\n return {\n mode,\n storageScope: useGlobalStorage ? 'global' : 'project',\n projectPath: useGlobalStorage ? undefined : targetProjectPath,\n result,\n embedCount\n };\n } finally {\n await memoryService.shutdown();\n }\n}\n", "const MAX_RENDERED_ITEMS = 8;\nconst MAX_FRED_SERIES = 10;\nconst PROVIDER_FETCH_TIMEOUT_MS = 8_000;\nconst DEFAULT_FRED_SERIES = ['FEDFUNDS', 'CPIAUCSL', 'UNRATE'];\nconst ALLOWED_PROVIDERS = new Set<ExternalMarketProvider>(['dart', 'fred', 'finnhub']);\n\nexport type ExternalMarketProvider = 'dart' | 'fred' | 'finnhub';\nexport type ProviderStatus = 'ok' | 'skipped' | 'error';\nexport type MarketContextInsightConfidence = 'low' | 'medium' | 'high';\nexport type MarketContextInsightHorizon = 'near-term' | 'medium-term' | 'monitor';\nexport type MarketContextDartConfidence = 'exact-corp-code' | 'company-name-fallback' | 'provider-skipped' | 'provider-error' | 'unavailable';\n\nexport interface ExternalMarketContextOptions {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers?: ExternalMarketProvider[];\n fredSeries?: string[];\n includeSnapshot?: boolean;\n now?: Date;\n}\n\nexport interface DartFiling {\n corpName: string;\n receiptNo: string;\n reportName: string;\n filerName?: string;\n receiptDate?: string;\n remark?: string;\n url: string;\n}\n\nexport interface DartProviderResult {\n provider: 'dart';\n status: ProviderStatus;\n filings: DartFiling[];\n displayedFilings: DartFiling[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface FredSeriesSnapshot {\n seriesId: string;\n latestValue?: string;\n latestDate?: string;\n}\n\nexport interface FredProviderResult {\n provider: 'fred';\n status: ProviderStatus;\n series: FredSeriesSnapshot[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface FinnhubProviderResult {\n provider: 'finnhub';\n status: ProviderStatus;\n profile?: Record<string, unknown>;\n warnings?: string[];\n error?: string;\n}\n\nexport interface MarketContextEvidence {\n provider: ExternalMarketProvider;\n title: string;\n reason: string;\n receiptNo?: string;\n receiptDate?: string;\n url?: string;\n category?: string;\n seriesId?: string;\n latestValue?: string;\n latestDate?: string;\n symbol?: string;\n}\n\nexport interface MarketContextInsight {\n signal: string;\n thesis: string;\n confidence: MarketContextInsightConfidence;\n horizon: MarketContextInsightHorizon;\n evidence: MarketContextEvidence[];\n}\n\nexport interface CompanySnapshot {\n company: string;\n filingsAnalyzed: number;\n categoryCounts: Record<string, number>;\n riskSignals: MarketContextEvidence[];\n catalysts: MarketContextEvidence[];\n watchlist: string[];\n followUpQuestions: string[];\n}\n\nexport interface MarketContextSnapshot {\n schemaVersion: 'market-context-snapshot.v1';\n subject: {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n };\n coverage: {\n dart?: {\n status: ProviderStatus;\n filingsAnalyzed: number;\n renderedFilings: number;\n confidence: MarketContextDartConfidence;\n warnings?: string[];\n };\n fred?: {\n status: ProviderStatus;\n seriesAnalyzed: number;\n warnings?: string[];\n };\n finnhub?: {\n status: ProviderStatus;\n hasProfile: boolean;\n warnings?: string[];\n };\n };\n bullCases: MarketContextInsight[];\n bearCases: MarketContextInsight[];\n risks: MarketContextInsight[];\n catalysts: MarketContextInsight[];\n watchlist: string[];\n followUpQuestions: string[];\n}\n\nexport interface ExternalMarketContextAnalysis {\n companySnapshot?: CompanySnapshot;\n marketSnapshot?: MarketContextSnapshot;\n}\n\nexport interface ExternalMarketContextReport {\n generatedAt: string;\n query: {\n company?: string;\n dartCorpCode?: string;\n symbol?: string;\n providers: ExternalMarketProvider[];\n fredSeries?: string[];\n };\n dart?: DartProviderResult;\n fred?: FredProviderResult;\n finnhub?: FinnhubProviderResult;\n analysis?: ExternalMarketContextAnalysis;\n}\n\nexport async function fetchExternalMarketContext(options: ExternalMarketContextOptions): Promise<ExternalMarketContextReport> {\n const providers = normalizeProviders(options.providers);\n const fredSelection = selectFredSeries(options.fredSeries);\n const report: ExternalMarketContextReport = {\n generatedAt: (options.now ?? new Date()).toISOString(),\n query: {\n company: optionalTrimmed(options.company),\n dartCorpCode: optionalTrimmed(options.dartCorpCode),\n symbol: optionalTrimmed(options.symbol),\n providers,\n fredSeries: providers.includes('fred') ? fredSelection.series : normalizeStringList(options.fredSeries)\n }\n };\n\n for (const provider of providers) {\n if (provider === 'dart') report.dart = await fetchDartProvider(report.query.company, report.query.dartCorpCode);\n if (provider === 'fred') report.fred = await fetchFredProvider(fredSelection.series, fredSelection.warnings);\n if (provider === 'finnhub') report.finnhub = await fetchFinnhubProvider(report.query.symbol);\n }\n\n if (options.includeSnapshot !== false) {\n const companySnapshot = report.dart?.status === 'ok'\n ? buildCompanySnapshot(report.query.company ?? report.dart.filings[0]?.corpName ?? 'unknown', report.dart.filings)\n : undefined;\n report.analysis = {\n ...(companySnapshot ? { companySnapshot } : {}),\n marketSnapshot: buildMarketContextSnapshot(report)\n };\n }\n\n return report;\n}\n\nasync function fetchDartProvider(company?: string, corpCode?: string): Promise<DartProviderResult> {\n const apiKey = optionalTrimmed(process.env.DART_API_KEY);\n if (!apiKey) return { provider: 'dart', status: 'skipped', filings: [], displayedFilings: [], warnings: ['DART_API_KEY is not set'] };\n if (!company && !corpCode) return { provider: 'dart', status: 'skipped', filings: [], displayedFilings: [], warnings: ['company or dartCorpCode is required for DART'] };\n\n const warnings: string[] = [];\n if (company && !corpCode) warnings.push('DART company-name fallback is low-confidence; prefer dartCorpCode for exact issuer coverage.');\n\n try {\n const url = new URL('https://opendart.fss.or.kr/api/list.json');\n url.searchParams.set('crtfc_key', apiKey);\n if (corpCode) url.searchParams.set('corp_code', corpCode);\n url.searchParams.set('page_count', '100');\n const { response, json } = await fetchJsonWithTimeout(url);\n const status = stringValue(json.status);\n if (status === '013') return { provider: 'dart', status: 'ok', filings: [], displayedFilings: [], warnings };\n if (!response.ok || (status && status !== '000')) {\n return { provider: 'dart', status: 'error', filings: [], displayedFilings: [], warnings, error: redactSecrets(String(json.message ?? `DART status ${status ?? response.status}`)) };\n }\n const rows = Array.isArray(json.list) ? json.list : [];\n const filings = rows\n .map(normalizeDartFiling)\n .filter((filing): filing is DartFiling => filing !== undefined)\n .filter((filing) => corpCode || !company || filing.corpName.includes(company) || company.includes(filing.corpName));\n return { provider: 'dart', status: 'ok', filings, displayedFilings: filings.slice(0, MAX_RENDERED_ITEMS), warnings };\n } catch (error) {\n return { provider: 'dart', status: 'error', filings: [], displayedFilings: [], warnings, error: safeProviderError(error) };\n }\n}\n\nasync function fetchFredProvider(seriesIds: string[], preflightWarnings: string[] = []): Promise<FredProviderResult> {\n const apiKey = optionalTrimmed(process.env.FRED_API_KEY);\n const series = seriesIds;\n if (!apiKey) return { provider: 'fred', status: 'skipped', series: [], warnings: ['FRED_API_KEY is not set', ...preflightWarnings] };\n\n const snapshots: FredSeriesSnapshot[] = [];\n const warnings: string[] = [...preflightWarnings];\n for (const seriesId of series) {\n try {\n const url = new URL('https://api.stlouisfed.org/fred/series/observations');\n url.searchParams.set('api_key', apiKey);\n url.searchParams.set('file_type', 'json');\n url.searchParams.set('series_id', seriesId);\n url.searchParams.set('sort_order', 'desc');\n url.searchParams.set('limit', '1');\n const { response, json } = await fetchJsonWithTimeout(url);\n if (!response.ok || Array.isArray(json.observations) === false) {\n warnings.push(`${seriesId}: ${redactSecrets(String(json.error_message ?? response.statusText ?? 'failed'))}`);\n continue;\n }\n const latest = (json.observations as unknown[]).find((item) => typeof item === 'object' && item !== null) as Record<string, unknown> | undefined;\n snapshots.push({ seriesId, latestValue: stringValue(latest?.value), latestDate: stringValue(latest?.date) });\n } catch (error) {\n warnings.push(`${seriesId}: ${safeProviderError(error)}`);\n }\n }\n return { provider: 'fred', status: snapshots.length > 0 ? 'ok' : 'error', series: snapshots, warnings };\n}\n\nasync function fetchFinnhubProvider(symbol?: string): Promise<FinnhubProviderResult> {\n const apiKey = optionalTrimmed(process.env.FINNHUB_API_KEY);\n if (!apiKey) return { provider: 'finnhub', status: 'skipped', warnings: ['FINNHUB_API_KEY is not set'] };\n if (!symbol) return { provider: 'finnhub', status: 'skipped', warnings: ['symbol is required for Finnhub'] };\n\n try {\n const url = new URL('https://finnhub.io/api/v1/stock/profile2');\n url.searchParams.set('token', apiKey);\n url.searchParams.set('symbol', symbol);\n const { response, json } = await fetchJsonWithTimeout(url);\n if (!response.ok) return { provider: 'finnhub', status: 'error', error: redactSecrets(String(json.error ?? response.statusText ?? 'failed')) };\n if (!hasObjectData(json)) return { provider: 'finnhub', status: 'skipped', warnings: ['Finnhub returned no profile data'] };\n return { provider: 'finnhub', status: 'ok', profile: json };\n } catch (error) {\n return { provider: 'finnhub', status: 'error', error: safeProviderError(error) };\n }\n}\n\nfunction buildCompanySnapshot(company: string, filings: DartFiling[]): CompanySnapshot {\n const categoryCounts: Record<string, number> = {};\n const riskSignals: MarketContextEvidence[] = [];\n const catalysts: MarketContextEvidence[] = [];\n for (const filing of filings) {\n const category = categorizeFiling(filing.reportName);\n categoryCounts[category] = (categoryCounts[category] ?? 0) + 1;\n const evidence = dartEvidence(filing, category, `DART filing categorized as ${category}`);\n if (category === 'risk' || category === 'correction') riskSignals.push(evidence);\n if (category === 'contract' || category === 'capital' || category === 'financial' || category === 'performance') catalysts.push(evidence);\n }\n return {\n company,\n filingsAnalyzed: filings.length,\n categoryCounts,\n riskSignals,\n catalysts,\n watchlist: [\n 'Compare repeat/correction filings with prior filings before relying on trend signals.',\n 'Prefer dartCorpCode-based lookups for exact issuer coverage.',\n 'Review risk-sensitive filings manually before making investment or sales decisions.'\n ],\n followUpQuestions: [\n 'Which recent filings change revenue, margin, capital structure, or governance assumptions?',\n 'Are any risk-sensitive filings one-off events or recurring patterns?',\n 'What customer/sales implication follows from the latest disclosed business changes?'\n ]\n };\n}\n\nfunction buildMarketContextSnapshot(report: ExternalMarketContextReport): MarketContextSnapshot {\n const bullCases: MarketContextInsight[] = [];\n const bearCases: MarketContextInsight[] = [];\n const risks: MarketContextInsight[] = [];\n const catalysts: MarketContextInsight[] = [];\n\n if (report.dart?.status === 'ok') appendDartInsights(report.dart.filings, bullCases, bearCases, risks, catalysts);\n if (report.fred?.status === 'ok') appendFredInsights(report.fred.series, bullCases, bearCases, risks, catalysts);\n if (report.finnhub?.status === 'ok' && report.finnhub.profile) appendFinnhubInsights(report.query.symbol, report.finnhub.profile, bullCases, catalysts);\n\n return {\n schemaVersion: 'market-context-snapshot.v1',\n subject: { company: report.query.company ?? report.dart?.filings[0]?.corpName, dartCorpCode: report.query.dartCorpCode, symbol: report.query.symbol },\n coverage: {\n ...(report.dart ? { dart: { status: report.dart.status, filingsAnalyzed: report.dart.filings.length, renderedFilings: report.dart.displayedFilings.length, confidence: dartConfidence(report), ...(report.dart.warnings?.length ? { warnings: report.dart.warnings } : {}) } } : {}),\n ...(report.fred ? { fred: { status: report.fred.status, seriesAnalyzed: report.fred.series.length, ...(report.fred.warnings?.length ? { warnings: report.fred.warnings } : {}) } } : {}),\n ...(report.finnhub ? { finnhub: { status: report.finnhub.status, hasProfile: report.finnhub.profile !== undefined, ...(report.finnhub.warnings?.length ? { warnings: report.finnhub.warnings } : {}) } } : {})\n },\n bullCases: bullCases.slice(0, 8),\n bearCases: bearCases.slice(0, 8),\n risks: risks.slice(0, 8),\n catalysts: catalysts.slice(0, 8),\n watchlist: [\n 'Verify every insight against original provider data before making investment, sales, or strategy decisions.',\n 'Separate one-off event disclosures from recurring trend signals.',\n 'Use exact identifiers such as DART corpCode and listed ticker for customer-facing reports.'\n ],\n followUpQuestions: [\n 'What changed in the latest filings that affects bull-case revenue or margin assumptions?',\n 'Which bear-case risks require management, customer, or investor follow-up?',\n 'Which catalyst has a concrete date, counterparty, amount, or regulatory dependency?'\n ]\n };\n}\n\nfunction appendDartInsights(filings: DartFiling[], bullCases: MarketContextInsight[], bearCases: MarketContextInsight[], risks: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n for (const filing of filings) {\n const category = categorizeFiling(filing.reportName);\n const evidence = [dartEvidence(filing, category, `DART filing categorized as ${category}`)];\n if (category === 'performance') bullCases.push(insight('Operating performance disclosure', 'Recent operating performance disclosure can support the bull case if the detailed filing confirms improving revenue, margin, or demand signals.', 'medium', 'near-term', evidence));\n if (category === 'contract') {\n catalysts.push(insight('Commercial contract disclosure', 'New contract or supply disclosure is a catalyst candidate because it can change near-term revenue visibility or customer momentum.', 'medium', 'near-term', evidence));\n bullCases.push(insight('Revenue visibility catalyst', 'Contract disclosure can strengthen the bull case if contract size, duration, and counterparty quality are material.', 'medium', 'near-term', evidence));\n }\n if (category === 'capital') {\n bearCases.push(insight('Capital structure dilution watch', 'Capital issuance can pressure the bear case through dilution, financing cost, or balance-sheet stress unless proceeds create clear strategic value.', 'medium', 'medium-term', evidence));\n catalysts.push(insight('Capital allocation event', 'Capital market activity is a catalyst that requires follow-up on use of proceeds, dilution, and investor demand.', 'low', 'monitor', evidence));\n }\n if (category === 'risk') {\n risks.push(insight('Risk-sensitive disclosure', 'Litigation, enforcement, trading-halt, or governance-risk disclosure needs manual review before relying on the company outlook.', 'high', 'near-term', evidence));\n bearCases.push(insight('Event-risk overhang', 'Risk-sensitive filings can create a bear-case overhang until scope, liability, and operational impact are clarified.', 'high', 'near-term', evidence));\n }\n if (category === 'financial') catalysts.push(insight('Scheduled financial disclosure', 'Financial statements are an analysis catalyst because they can update margin, cash-flow, and growth assumptions.', 'low', 'monitor', evidence));\n if (category === 'correction') risks.push(insight('Correction filing', 'Correction filings should be compared with the original disclosure to confirm whether the change alters material assumptions.', 'medium', 'monitor', evidence));\n }\n}\n\nfunction appendFredInsights(series: FredSeriesSnapshot[], bullCases: MarketContextInsight[], bearCases: MarketContextInsight[], risks: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n for (const item of series) {\n const evidence = [fredEvidence(item, 'Latest FRED observation included in macro context')];\n catalysts.push(insight('Macro data update', `${item.seriesId} latest observation can update demand, funding, or consumer backdrop assumptions.`, 'low', 'monitor', evidence));\n const value = numericValue(item.latestValue);\n if (/FEDFUNDS|DFF|SOFR/i.test(item.seriesId) && value !== undefined) {\n if (value >= 4) {\n risks.push(insight('High-rate macro pressure', 'Elevated policy/funding rates can pressure valuation multiples, financing cost, and discretionary demand.', 'medium', 'medium-term', evidence));\n bearCases.push(insight('Funding-cost bear case', 'High interest-rate context supports a bear-case watch on financing-sensitive growth assumptions.', 'medium', 'medium-term', evidence));\n } else if (value <= 2) {\n bullCases.push(insight('Low-rate macro support', 'Lower policy-rate context can support risk appetite, financing conditions, and demand assumptions.', 'low', 'medium-term', evidence));\n }\n }\n if (/CPI|PCE|INFLATION/i.test(item.seriesId)) risks.push(insight('Inflation monitor', 'Inflation-sensitive macro data can affect pricing power, cost assumptions, and consumer demand.', 'low', 'monitor', evidence));\n if (/UNRATE|PAYEMS/i.test(item.seriesId)) catalysts.push(insight('Labor-market signal', 'Labor-market data can update consumer demand and wage-cost assumptions.', 'low', 'monitor', evidence));\n }\n}\n\nfunction appendFinnhubInsights(symbol: string | undefined, profile: Record<string, unknown>, bullCases: MarketContextInsight[], catalysts: MarketContextInsight[]): void {\n const ticker = stringValue(profile.ticker) ?? symbol;\n const evidence = [finnhubEvidence(ticker, profile, 'Finnhub company profile included in market context')];\n catalysts.push(insight('Public market profile context', 'Ticker, exchange, industry, and market-cap profile help frame peer set and investor-facing positioning.', 'low', 'monitor', evidence));\n const marketCap = numericValue(profile.marketCapitalization);\n if (marketCap !== undefined && marketCap > 0) {\n bullCases.push(insight('Scale and market presence', 'Available public-market profile and market-cap data can support a scale/visibility bull-case framing when compared with peers.', marketCap >= 10000 ? 'medium' : 'low', 'monitor', evidence));\n }\n}\n\nfunction insight(signal: string, thesis: string, confidence: MarketContextInsightConfidence, horizon: MarketContextInsightHorizon, evidence: MarketContextEvidence[]): MarketContextInsight {\n return { signal, thesis, confidence, horizon, evidence };\n}\n\nfunction dartEvidence(filing: DartFiling, category: string, reason: string): MarketContextEvidence {\n return { provider: 'dart', title: filing.reportName, receiptNo: filing.receiptNo, receiptDate: filing.receiptDate, url: filing.url, category, reason };\n}\n\nfunction fredEvidence(item: FredSeriesSnapshot, reason: string): MarketContextEvidence {\n return { provider: 'fred', title: item.seriesId, seriesId: item.seriesId, latestValue: item.latestValue, latestDate: item.latestDate, reason };\n}\n\nfunction finnhubEvidence(symbol: string | undefined, profile: Record<string, unknown>, reason: string): MarketContextEvidence {\n return { provider: 'finnhub', title: symbol ?? stringValue(profile.name) ?? 'Finnhub profile', symbol, reason };\n}\n\nfunction categorizeFiling(reportName: string): string {\n if (/\uC18C\uC1A1|\uD6A1\uB839|\uBC30\uC784|\uAC70\uB798\uC815\uC9C0|\uC0C1\uC7A5\uD3D0\uC9C0|\uBD88\uC131\uC2E4/i.test(reportName)) return 'risk';\n if (/\uB2E8\uC77C\uD310\uB9E4|\uACF5\uAE09\uACC4\uC57D|\uACC4\uC57D\uCCB4\uACB0|\uC218\uC8FC/i.test(reportName)) return 'contract';\n if (/\uC601\uC5C5\\(\uC7A0\uC815\\)\uC2E4\uC801|\uC7A0\uC815\uC2E4\uC801|\uACF5\uC815\uACF5\uC2DC|\uB9E4\uCD9C\uC561|\uC190\uC775\uAD6C\uC870/i.test(reportName)) return 'performance';\n if (/\uC720\uC0C1\uC99D\uC790|\uC804\uD658\uC0AC\uCC44|\uC2E0\uC8FC\uC778\uC218\uAD8C|\uC99D\uAD8C\uC2E0\uACE0\uC11C|\uC0AC\uCC44\uAD8C/i.test(reportName)) return 'capital';\n if (/\uC0AC\uC5C5\uBCF4\uACE0\uC11C|\uBD84\uAE30\uBCF4\uACE0\uC11C|\uBC18\uAE30\uBCF4\uACE0\uC11C|\uAC10\uC0AC\uBCF4\uACE0\uC11C|\uC7AC\uBB34\uC81C\uD45C/i.test(reportName)) return 'financial';\n if (/\uC815\uC815/i.test(reportName)) return 'correction';\n if (/\uC8FC\uC8FC\uCD1D\uD68C|\uCD5C\uB300\uC8FC\uC8FC|\uC784\uC6D0|\uB300\uD45C\uC774\uC0AC|\uD569\uBCD1|\uBD84\uD560/i.test(reportName)) return 'governance';\n return 'other';\n}\n\nexport function renderExternalMarketContextReport(report: ExternalMarketContextReport): string {\n const lines: string[] = [\n '# External Market Context',\n '',\n `- Generated: ${report.generatedAt}`,\n `- Company: ${report.query.company ?? 'n/a'}`,\n `- DART corpCode: ${report.query.dartCorpCode ?? 'n/a'}`,\n `- Symbol: ${report.query.symbol ?? 'n/a'}`,\n `- Providers: ${report.query.providers.join(', ')}`,\n ''\n ];\n if (report.dart) appendDartSection(lines, report.dart, report.analysis?.companySnapshot);\n if (report.fred) appendFredSection(lines, report.fred);\n if (report.finnhub) appendFinnhubSection(lines, report.finnhub);\n if (report.analysis?.marketSnapshot) appendMarketContextSnapshotSection(lines, report.analysis.marketSnapshot);\n return redactSecrets(lines.join('\\n'));\n}\n\nfunction appendDartSection(lines: string[], result: DartProviderResult, snapshot?: CompanySnapshot): void {\n lines.push('## DART filings', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n if (result.status === 'ok') lines.push(`- Filings analyzed: ${result.filings.length}`, `- Filings displayed: ${result.displayedFilings.length}`);\n lines.push('');\n for (const filing of result.displayedFilings) lines.push(`- ${filing.reportName} (${filing.receiptDate ?? 'n/a'}) \u2014 ${filing.receiptNo} (${filing.url})`);\n lines.push('');\n if (snapshot) {\n lines.push('### DART company analysis snapshot', '', `- ${snapshot.filingsAnalyzed} filings analyzed`, `- Categories: ${Object.entries(snapshot.categoryCounts).map(([key, value]) => `${key}=${value}`).join(', ') || 'none'}`, '');\n lines.push('**Risk signals**');\n if (snapshot.riskSignals.length === 0) lines.push('- none detected in fetched filings');\n for (const item of snapshot.riskSignals) lines.push(`- ${item.title} (${item.receiptNo ?? 'n/a'}): ${item.reason}`);\n lines.push('', '**Catalysts**');\n if (snapshot.catalysts.length === 0) lines.push('- none detected in fetched filings');\n for (const item of snapshot.catalysts) lines.push(`- ${item.title} (${item.receiptNo ?? 'n/a'}): ${item.reason}`);\n lines.push('');\n }\n}\n\nfunction appendFredSection(lines: string[], result: FredProviderResult): void {\n lines.push('## FRED macro series', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n for (const series of result.series) lines.push(`- ${series.seriesId}: ${series.latestValue ?? 'n/a'} (${series.latestDate ?? 'n/a'})`);\n lines.push('');\n}\n\nfunction appendFinnhubSection(lines: string[], result: FinnhubProviderResult): void {\n lines.push('## Finnhub company profile', '', `- Status: ${result.status}`);\n if (result.error) lines.push(`- Error: ${result.error}`);\n if (result.warnings?.length) for (const warning of result.warnings) lines.push(`- Warning: ${warning}`);\n if (result.profile) for (const key of ['name', 'ticker', 'exchange', 'marketCapitalization', 'finnhubIndustry']) if (result.profile[key] !== undefined) lines.push(`- ${key}: ${String(result.profile[key])}`);\n lines.push('');\n}\n\nfunction appendMarketContextSnapshotSection(lines: string[], snapshot: MarketContextSnapshot): void {\n lines.push('### MarketContextSnapshot', '', `- Schema: ${snapshot.schemaVersion}`, `- Subject: ${snapshot.subject.company ?? 'n/a'}${snapshot.subject.dartCorpCode ? ` / DART ${snapshot.subject.dartCorpCode}` : ''}${snapshot.subject.symbol ? ` / ${snapshot.subject.symbol}` : ''}`);\n if (snapshot.coverage.dart) lines.push(`- DART coverage: status=${snapshot.coverage.dart.status}, filings=${snapshot.coverage.dart.filingsAnalyzed}, displayed=${snapshot.coverage.dart.renderedFilings}, confidence=${snapshot.coverage.dart.confidence}`);\n if (snapshot.coverage.fred) lines.push(`- FRED coverage: status=${snapshot.coverage.fred.status}, series=${snapshot.coverage.fred.seriesAnalyzed}`);\n if (snapshot.coverage.finnhub) lines.push(`- Finnhub coverage: status=${snapshot.coverage.finnhub.status}, hasProfile=${snapshot.coverage.finnhub.hasProfile}`);\n lines.push('');\n appendInsightList(lines, '**Bull case**', snapshot.bullCases);\n appendInsightList(lines, '**Bear case**', snapshot.bearCases);\n appendInsightList(lines, '**Risks**', snapshot.risks);\n appendInsightList(lines, '**Catalysts**', snapshot.catalysts);\n lines.push('**Snapshot watchlist**');\n for (const item of snapshot.watchlist) lines.push(`- ${item}`);\n lines.push('', '**Snapshot follow-up questions**');\n for (const item of snapshot.followUpQuestions) lines.push(`- ${item}`);\n lines.push('');\n}\n\nfunction appendInsightList(lines: string[], title: string, insights: MarketContextInsight[]): void {\n lines.push(title);\n if (insights.length === 0) {\n lines.push('- none detected in fetched provider data', '');\n return;\n }\n for (const item of insights) {\n lines.push(`- ${item.signal} [${item.confidence}, ${item.horizon}]: ${item.thesis}`);\n lines.push(` - Evidence: ${item.evidence.map(formatEvidence).join('; ')}`);\n }\n lines.push('');\n}\n\nfunction formatEvidence(evidence: MarketContextEvidence): string {\n if (evidence.provider === 'dart') return `DART: ${evidence.title}${evidence.receiptNo ? ` (${evidence.receiptNo})` : ''}`;\n if (evidence.provider === 'fred') return `FRED: ${evidence.seriesId ?? evidence.title}${evidence.latestValue ? `=${evidence.latestValue}` : ''}`;\n return `Finnhub: ${evidence.symbol ?? evidence.title}`;\n}\n\nfunction normalizeDartFiling(value: unknown): DartFiling | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const row = value as Record<string, unknown>;\n const receiptNo = stringValue(row.rcept_no);\n const reportName = stringValue(row.report_nm);\n const corpName = stringValue(row.corp_name) ?? '';\n if (!receiptNo || !reportName) return undefined;\n return {\n corpName,\n receiptNo,\n reportName,\n filerName: stringValue(row.flr_nm),\n receiptDate: stringValue(row.rcept_dt),\n remark: stringValue(row.rm),\n url: `https://dart.fss.or.kr/dsaf001/main.do?rcpNo=${encodeURIComponent(receiptNo)}`\n };\n}\n\nasync function fetchJsonWithTimeout(url: URL): Promise<{ response: Response; json: Record<string, unknown> }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PROVIDER_FETCH_TIMEOUT_MS);\n try {\n const response = await fetch(url, { signal: controller.signal });\n const json = await response.json() as Record<string, unknown>;\n return { response, json };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction selectFredSeries(value: string[] | undefined): { series: string[]; warnings: string[] } {\n const normalized = normalizeStringList(value);\n const requested = normalized.length > 0 ? normalized : DEFAULT_FRED_SERIES;\n const series = requested.slice(0, MAX_FRED_SERIES);\n const warnings = requested.length > MAX_FRED_SERIES\n ? [`FRED series list truncated to ${MAX_FRED_SERIES} entries`]\n : [];\n return { series, warnings };\n}\n\nfunction hasObjectData(value: Record<string, unknown>): boolean {\n return Object.values(value).some((item) => item !== undefined && item !== null && String(item).trim().length > 0);\n}\n\nfunction normalizeProviders(value: ExternalMarketProvider[] | undefined): ExternalMarketProvider[] {\n if (!value || value.length === 0) return ['dart', 'fred', 'finnhub'];\n const providers: ExternalMarketProvider[] = [];\n for (const provider of value) {\n if (!ALLOWED_PROVIDERS.has(provider)) throw new Error('Invalid providers: expected dart, fred, or finnhub');\n if (!providers.includes(provider)) providers.push(provider);\n }\n return providers;\n}\n\nfunction normalizeStringList(value: string[] | undefined): string[] {\n return Array.from(new Set((value ?? []).map((item) => item.trim()).filter(Boolean)));\n}\n\nfunction dartConfidence(report: ExternalMarketContextReport): MarketContextDartConfidence {\n if (!report.dart) return 'unavailable';\n if (report.dart.status === 'error') return 'provider-error';\n if (report.dart.status === 'skipped') return 'provider-skipped';\n if (report.query.dartCorpCode) return 'exact-corp-code';\n if (report.query.company) return 'company-name-fallback';\n return 'unavailable';\n}\n\nfunction optionalTrimmed(value: string | undefined): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction safeProviderError(error: unknown): string {\n return redactSecrets(error instanceof Error ? error.message : String(error));\n}\n\nfunction redactSecrets(input: string): string {\n let output = input;\n for (const value of [process.env.DART_API_KEY, process.env.FRED_API_KEY, process.env.FINNHUB_API_KEY]) {\n if (value && value.length > 0) output = output.split(value).join('[REDACTED]');\n }\n return output.replace(/([?&](?:crtfc_key|api_key|token)=)[^&\\s)]+/gi, '$1[REDACTED]');\n}\n"],
5
+ "mappings": "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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
6
6
  "names": ["fs", "path", "os", "os", "path", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "preview", "fs", "path", "fs", "path", "randomUUID", "fs", "path", "fs", "path", "sanitizeSegment", "buildMirrorPath", "MarkdownMirror", "MarkdownMirror", "randomUUID", "filtered", "path", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "createVectorWorker", "createGraduationWorker", "fs", "path", "randomUUID", "randomUUID", "randomUUID", "lancedb", "crypto", "fs", "os", "path", "fs", "os", "path", "os", "path", "path", "getDefaultMemoryService", "getReadOnlyMemoryService", "getMemoryServiceForProject", "getMemoryServiceForSession", "getLightweightMemoryService", "getLightweightMemoryServiceForProject", "fs", "path", "os", "randomUUID", "randomUUID", "fs", "path", "os", "readline", "createHash", "randomUUID", "getFileMtimeMs", "createHash", "randomUUID", "fs", "os", "path", "createHash", "randomUUID", "normalizeMaybeRealpath", "createHash", "randomUUID", "fs", "path", "Hono", "path", "fs", "Hono", "Hono", "Hono", "Hono", "Hono", "Hono", "fs", "path", "Hono", "Hono", "createHash", "Hono", "Hono", "Hono", "Hono", "fs", "path", "os", "Hono", "Hono", "Hono", "resolve", "Hono", "Hono", "Hono", "Hono", "randomUUID", "os", "hostname", "existsSync", "mkdirSync", "readFileSync", "renameSync", "writeFileSync", "dirname", "join", "homedir", "path", "fs", "path", "fs", "path", "formatNumber", "realDeps", "parsePositiveInteger", "shouldUseGlobalStorage", "result", "sanitizeSegment", "embedCount", "elapsed", "preview"]
7
7
  }