nlm-memory 0.21.0 → 0.21.13

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 (413) hide show
  1. package/README.md +67 -12
  2. package/assets/replay-eval-dark.svg +26 -0
  3. package/assets/replay-eval-light.svg +26 -0
  4. package/dist/cli/digest.js +34 -7
  5. package/dist/cli/digest.js.map +1 -1
  6. package/dist/cli/nlm.d.ts +14 -0
  7. package/dist/cli/nlm.js +450 -65
  8. package/dist/cli/nlm.js.map +1 -1
  9. package/dist/cli/reprocess-job-adapters.d.ts +35 -0
  10. package/dist/cli/reprocess-job-adapters.js +80 -0
  11. package/dist/cli/reprocess-job-adapters.js.map +1 -0
  12. package/dist/cli/scope-coverage.js +4 -1
  13. package/dist/cli/scope-coverage.js.map +1 -1
  14. package/dist/cli/supersede.js +8 -7
  15. package/dist/cli/supersede.js.map +1 -1
  16. package/dist/core/actions/actions-log.d.ts +65 -8
  17. package/dist/core/actions/actions-log.js +134 -17
  18. package/dist/core/actions/actions-log.js.map +1 -1
  19. package/dist/core/actions/overlay.d.ts +11 -2
  20. package/dist/core/actions/overlay.js +18 -6
  21. package/dist/core/actions/overlay.js.map +1 -1
  22. package/dist/core/adapters/from-source.js +11 -3
  23. package/dist/core/adapters/from-source.js.map +1 -1
  24. package/dist/core/adapters/fs-wiki-writer.d.ts +44 -0
  25. package/dist/core/adapters/fs-wiki-writer.js +132 -0
  26. package/dist/core/adapters/fs-wiki-writer.js.map +1 -0
  27. package/dist/core/adapters/hermes-agent.d.ts +15 -2
  28. package/dist/core/adapters/hermes-agent.js +57 -11
  29. package/dist/core/adapters/hermes-agent.js.map +1 -1
  30. package/dist/core/adapters/memory-wiki-writer.d.ts +8 -0
  31. package/dist/core/adapters/memory-wiki-writer.js +16 -0
  32. package/dist/core/adapters/memory-wiki-writer.js.map +1 -0
  33. package/dist/core/adapters/muse.d.ts +51 -0
  34. package/dist/core/adapters/muse.js +271 -0
  35. package/dist/core/adapters/muse.js.map +1 -0
  36. package/dist/core/adapters/opencode.d.ts +11 -4
  37. package/dist/core/adapters/opencode.js +41 -7
  38. package/dist/core/adapters/opencode.js.map +1 -1
  39. package/dist/core/alerts/alert-state.d.ts +17 -0
  40. package/dist/core/alerts/alert-state.js +45 -0
  41. package/dist/core/alerts/alert-state.js.map +1 -0
  42. package/dist/core/alerts/check-and-alert.d.ts +28 -0
  43. package/dist/core/alerts/check-and-alert.js +53 -0
  44. package/dist/core/alerts/check-and-alert.js.map +1 -0
  45. package/dist/core/alerts/drift-transition.d.ts +27 -0
  46. package/dist/core/alerts/drift-transition.js +56 -0
  47. package/dist/core/alerts/drift-transition.js.map +1 -0
  48. package/dist/core/alerts/embedder-transition.d.ts +23 -0
  49. package/dist/core/alerts/embedder-transition.js +40 -0
  50. package/dist/core/alerts/embedder-transition.js.map +1 -0
  51. package/dist/core/alerts/fire-alert.d.ts +24 -0
  52. package/dist/core/alerts/fire-alert.js +72 -0
  53. package/dist/core/alerts/fire-alert.js.map +1 -0
  54. package/dist/core/alerts/job-alert.d.ts +12 -0
  55. package/dist/core/alerts/job-alert.js +37 -0
  56. package/dist/core/alerts/job-alert.js.map +1 -0
  57. package/dist/core/alerts/types.d.ts +104 -0
  58. package/dist/core/alerts/types.js +11 -0
  59. package/dist/core/alerts/types.js.map +1 -0
  60. package/dist/core/alerts/wiki-alert.d.ts +15 -0
  61. package/dist/core/alerts/wiki-alert.js +31 -0
  62. package/dist/core/alerts/wiki-alert.js.map +1 -0
  63. package/dist/core/classifier/prompt.d.ts +13 -0
  64. package/dist/core/classifier/prompt.js +52 -2
  65. package/dist/core/classifier/prompt.js.map +1 -1
  66. package/dist/core/dataset/build-dataset.d.ts +16 -1
  67. package/dist/core/dataset/build-dataset.js +105 -45
  68. package/dist/core/dataset/build-dataset.js.map +1 -1
  69. package/dist/core/digest/compose.d.ts +8 -0
  70. package/dist/core/digest/compose.js +54 -0
  71. package/dist/core/digest/compose.js.map +1 -1
  72. package/dist/core/digest/hook-injection.d.ts +1 -1
  73. package/dist/core/digest/hook-injection.js +9 -1
  74. package/dist/core/digest/hook-injection.js.map +1 -1
  75. package/dist/core/digest/hook-version-parity.d.ts +31 -0
  76. package/dist/core/digest/hook-version-parity.js +56 -0
  77. package/dist/core/digest/hook-version-parity.js.map +1 -0
  78. package/dist/core/embedding/pg-embed-backfill.js +1 -1
  79. package/dist/core/embedding/pg-embed-backfill.js.map +1 -1
  80. package/dist/core/exemplars/capture-from-session.d.ts +1 -1
  81. package/dist/core/exemplars/capture-from-session.js +3 -3
  82. package/dist/core/exemplars/capture-from-session.js.map +1 -1
  83. package/dist/core/exemplars/embed-backfill.d.ts +9 -0
  84. package/dist/core/exemplars/embed-backfill.js +9 -1
  85. package/dist/core/exemplars/embed-backfill.js.map +1 -1
  86. package/dist/core/exemplars/recall-code.d.ts +1 -1
  87. package/dist/core/exemplars/recall-code.js +2 -2
  88. package/dist/core/exemplars/recall-code.js.map +1 -1
  89. package/dist/core/facts/backfill-facts.d.ts +1 -1
  90. package/dist/core/facts/backfill-facts.js +4 -4
  91. package/dist/core/facts/backfill-facts.js.map +1 -1
  92. package/dist/core/facts/embed-backfill.d.ts +54 -0
  93. package/dist/core/facts/embed-backfill.js +109 -0
  94. package/dist/core/facts/embed-backfill.js.map +1 -0
  95. package/dist/core/facts/reconcile-facts.d.ts +42 -0
  96. package/dist/core/facts/reconcile-facts.js +133 -0
  97. package/dist/core/facts/reconcile-facts.js.map +1 -0
  98. package/dist/core/health/embed-failure-state.d.ts +4 -0
  99. package/dist/core/health/embed-failure-state.js +12 -0
  100. package/dist/core/health/embed-failure-state.js.map +1 -0
  101. package/dist/core/health/warmup-retry.d.ts +27 -0
  102. package/dist/core/health/warmup-retry.js +53 -0
  103. package/dist/core/health/warmup-retry.js.map +1 -0
  104. package/dist/core/health/warmup-state.d.ts +15 -0
  105. package/dist/core/health/warmup-state.js +15 -1
  106. package/dist/core/health/warmup-state.js.map +1 -1
  107. package/dist/core/hook/cite-memo.d.ts +11 -7
  108. package/dist/core/hook/cite-memo.js +25 -17
  109. package/dist/core/hook/cite-memo.js.map +1 -1
  110. package/dist/core/hook/hook-log.d.ts +13 -2
  111. package/dist/core/hook/hook-log.js +16 -8
  112. package/dist/core/hook/hook-log.js.map +1 -1
  113. package/dist/core/hook/memo.d.ts +10 -6
  114. package/dist/core/hook/memo.js +25 -17
  115. package/dist/core/hook/memo.js.map +1 -1
  116. package/dist/core/hook/pointer-block.d.ts +8 -1
  117. package/dist/core/hook/pointer-block.js +17 -4
  118. package/dist/core/hook/pointer-block.js.map +1 -1
  119. package/dist/core/hook/resolve-conversation-by-query.d.ts +6 -5
  120. package/dist/core/hook/resolve-conversation-by-query.js +24 -12
  121. package/dist/core/hook/resolve-conversation-by-query.js.map +1 -1
  122. package/dist/core/ingest/ingest-session.d.ts +1 -1
  123. package/dist/core/ingest/ingest-session.js +3 -3
  124. package/dist/core/ingest/ingest-session.js.map +1 -1
  125. package/dist/core/ingest/reclassify-oversized.d.ts +1 -1
  126. package/dist/core/ingest/reclassify-oversized.js +2 -2
  127. package/dist/core/ingest/reclassify-oversized.js.map +1 -1
  128. package/dist/core/ingest/reprocess.d.ts +1 -1
  129. package/dist/core/ingest/reprocess.js +2 -2
  130. package/dist/core/ingest/reprocess.js.map +1 -1
  131. package/dist/core/jobs/job-supervisor.d.ts +168 -0
  132. package/dist/core/jobs/job-supervisor.js +335 -0
  133. package/dist/core/jobs/job-supervisor.js.map +1 -0
  134. package/dist/core/learner/model.d.ts +63 -0
  135. package/dist/core/learner/model.js +30 -0
  136. package/dist/core/learner/model.js.map +1 -0
  137. package/dist/core/learner/service.d.ts +42 -0
  138. package/dist/core/learner/service.js +74 -0
  139. package/dist/core/learner/service.js.map +1 -0
  140. package/dist/core/learner/summary.d.ts +28 -0
  141. package/dist/core/learner/summary.js +70 -0
  142. package/dist/core/learner/summary.js.map +1 -0
  143. package/dist/core/learner/validate.d.ts +18 -0
  144. package/dist/core/learner/validate.js +95 -0
  145. package/dist/core/learner/validate.js.map +1 -0
  146. package/dist/core/metrics/re-derivation.d.ts +31 -2
  147. package/dist/core/metrics/re-derivation.js +36 -4
  148. package/dist/core/metrics/re-derivation.js.map +1 -1
  149. package/dist/core/outcome/coverage.d.ts +1 -1
  150. package/dist/core/outcome/coverage.js +2 -2
  151. package/dist/core/outcome/coverage.js.map +1 -1
  152. package/dist/core/outcome/rollup.d.ts +1 -1
  153. package/dist/core/outcome/rollup.js +4 -4
  154. package/dist/core/outcome/rollup.js.map +1 -1
  155. package/dist/core/providers/provider-registry.d.ts +40 -23
  156. package/dist/core/providers/provider-registry.js +99 -81
  157. package/dist/core/providers/provider-registry.js.map +1 -1
  158. package/dist/core/recall/citation-log.d.ts +10 -5
  159. package/dist/core/recall/citation-log.js +21 -10
  160. package/dist/core/recall/citation-log.js.map +1 -1
  161. package/dist/core/recall/hook-recall-log.d.ts +5 -2
  162. package/dist/core/recall/hook-recall-log.js +12 -6
  163. package/dist/core/recall/hook-recall-log.js.map +1 -1
  164. package/dist/core/recall/miss-log.d.ts +7 -4
  165. package/dist/core/recall/miss-log.js +18 -11
  166. package/dist/core/recall/miss-log.js.map +1 -1
  167. package/dist/core/recall/query-log.d.ts +8 -5
  168. package/dist/core/recall/query-log.js +16 -9
  169. package/dist/core/recall/query-log.js.map +1 -1
  170. package/dist/core/recall/recall-service.d.ts +10 -1
  171. package/dist/core/recall/recall-service.js +31 -12
  172. package/dist/core/recall/recall-service.js.map +1 -1
  173. package/dist/core/recall/recent-log.d.ts +6 -1
  174. package/dist/core/recall/recent-log.js +13 -5
  175. package/dist/core/recall/recent-log.js.map +1 -1
  176. package/dist/core/recall/related-concepts.d.ts +29 -0
  177. package/dist/core/recall/related-concepts.js +67 -0
  178. package/dist/core/recall/related-concepts.js.map +1 -0
  179. package/dist/core/recall/related-exemplars.d.ts +1 -1
  180. package/dist/core/recall/related-exemplars.js +2 -2
  181. package/dist/core/recall/related-exemplars.js.map +1 -1
  182. package/dist/core/recall/related-facts.d.ts +1 -1
  183. package/dist/core/recall/related-facts.js +3 -3
  184. package/dist/core/recall/related-facts.js.map +1 -1
  185. package/dist/core/recall-facts/fact-query-log.d.ts +8 -4
  186. package/dist/core/recall-facts/fact-query-log.js +16 -8
  187. package/dist/core/recall-facts/fact-query-log.js.map +1 -1
  188. package/dist/core/recall-facts/fact-recall-service.d.ts +2 -2
  189. package/dist/core/recall-facts/fact-recall-service.js +12 -12
  190. package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
  191. package/dist/core/scheduler/scan-once.js +15 -14
  192. package/dist/core/scheduler/scan-once.js.map +1 -1
  193. package/dist/core/scheduler/scheduler.d.ts +3 -0
  194. package/dist/core/scheduler/scheduler.js +15 -11
  195. package/dist/core/scheduler/scheduler.js.map +1 -1
  196. package/dist/core/signals/failure-mode-recall.d.ts +1 -1
  197. package/dist/core/signals/failure-mode-recall.js +2 -2
  198. package/dist/core/signals/failure-mode-recall.js.map +1 -1
  199. package/dist/core/signals/stamp-scope.d.ts +2 -2
  200. package/dist/core/signals/stamp-scope.js +2 -2
  201. package/dist/core/signals/stamp-scope.js.map +1 -1
  202. package/dist/core/sources/source-registry.d.ts +49 -28
  203. package/dist/core/sources/source-registry.js +113 -70
  204. package/dist/core/sources/source-registry.js.map +1 -1
  205. package/dist/core/storage/pg-code-exemplar-store.d.ts +19 -10
  206. package/dist/core/storage/pg-code-exemplar-store.js +58 -27
  207. package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
  208. package/dist/core/storage/pg-entity-store.d.ts +6 -1
  209. package/dist/core/storage/pg-entity-store.js +33 -18
  210. package/dist/core/storage/pg-entity-store.js.map +1 -1
  211. package/dist/core/storage/pg-fact-ingest.d.ts +1 -1
  212. package/dist/core/storage/pg-fact-ingest.js +10 -7
  213. package/dist/core/storage/pg-fact-ingest.js.map +1 -1
  214. package/dist/core/storage/pg-fact-store.d.ts +29 -17
  215. package/dist/core/storage/pg-fact-store.js +99 -46
  216. package/dist/core/storage/pg-fact-store.js.map +1 -1
  217. package/dist/core/storage/pg-learner-store.d.ts +27 -0
  218. package/dist/core/storage/pg-learner-store.js +174 -0
  219. package/dist/core/storage/pg-learner-store.js.map +1 -0
  220. package/dist/core/storage/pg-session-store.d.ts +24 -20
  221. package/dist/core/storage/pg-session-store.js +162 -90
  222. package/dist/core/storage/pg-session-store.js.map +1 -1
  223. package/dist/core/storage/pg-signal-store.d.ts +10 -5
  224. package/dist/core/storage/pg-signal-store.js +24 -12
  225. package/dist/core/storage/pg-signal-store.js.map +1 -1
  226. package/dist/core/storage/pg-storage.d.ts +4 -0
  227. package/dist/core/storage/pg-storage.js +6 -0
  228. package/dist/core/storage/pg-storage.js.map +1 -1
  229. package/dist/core/storage/pg-workstream-store.d.ts +16 -11
  230. package/dist/core/storage/pg-workstream-store.js +46 -29
  231. package/dist/core/storage/pg-workstream-store.js.map +1 -1
  232. package/dist/core/storage/sqlite-code-exemplar-store.d.ts +24 -10
  233. package/dist/core/storage/sqlite-code-exemplar-store.js +84 -40
  234. package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
  235. package/dist/core/storage/sqlite-entity-store.d.ts +8 -1
  236. package/dist/core/storage/sqlite-entity-store.js +46 -27
  237. package/dist/core/storage/sqlite-entity-store.js.map +1 -1
  238. package/dist/core/storage/sqlite-fact-store.d.ts +45 -19
  239. package/dist/core/storage/sqlite-fact-store.js +172 -64
  240. package/dist/core/storage/sqlite-fact-store.js.map +1 -1
  241. package/dist/core/storage/sqlite-learner-store.d.ts +33 -0
  242. package/dist/core/storage/sqlite-learner-store.js +178 -0
  243. package/dist/core/storage/sqlite-learner-store.js.map +1 -0
  244. package/dist/core/storage/sqlite-outcome-store.d.ts +37 -22
  245. package/dist/core/storage/sqlite-outcome-store.js +90 -37
  246. package/dist/core/storage/sqlite-outcome-store.js.map +1 -1
  247. package/dist/core/storage/sqlite-session-store.d.ts +29 -20
  248. package/dist/core/storage/sqlite-session-store.js +207 -121
  249. package/dist/core/storage/sqlite-session-store.js.map +1 -1
  250. package/dist/core/storage/sqlite-signal-store.d.ts +12 -5
  251. package/dist/core/storage/sqlite-signal-store.js +27 -15
  252. package/dist/core/storage/sqlite-signal-store.js.map +1 -1
  253. package/dist/core/storage/sqlite-storage.d.ts +4 -0
  254. package/dist/core/storage/sqlite-storage.js +10 -2
  255. package/dist/core/storage/sqlite-storage.js.map +1 -1
  256. package/dist/core/storage/sqlite-workstream-store.d.ts +16 -11
  257. package/dist/core/storage/sqlite-workstream-store.js +52 -31
  258. package/dist/core/storage/sqlite-workstream-store.js.map +1 -1
  259. package/dist/core/storage/supersedence-log.d.ts +10 -7
  260. package/dist/core/storage/supersedence-log.js +19 -14
  261. package/dist/core/storage/supersedence-log.js.map +1 -1
  262. package/dist/core/tenancy/default-team.d.ts +6 -0
  263. package/dist/core/tenancy/default-team.js +7 -0
  264. package/dist/core/tenancy/default-team.js.map +1 -0
  265. package/dist/core/tenancy/hosted-mode.d.ts +9 -0
  266. package/dist/core/tenancy/hosted-mode.js +12 -0
  267. package/dist/core/tenancy/hosted-mode.js.map +1 -0
  268. package/dist/core/tenancy/team-auth.d.ts +16 -0
  269. package/dist/core/tenancy/team-auth.js +22 -0
  270. package/dist/core/tenancy/team-auth.js.map +1 -0
  271. package/dist/core/tenancy/team-token-store.d.ts +45 -0
  272. package/dist/core/tenancy/team-token-store.js +52 -0
  273. package/dist/core/tenancy/team-token-store.js.map +1 -0
  274. package/dist/core/tenancy/tenant-clause.d.ts +37 -0
  275. package/dist/core/tenancy/tenant-clause.js +11 -0
  276. package/dist/core/tenancy/tenant-clause.js.map +1 -0
  277. package/dist/core/tenancy/tenant-state-path.d.ts +28 -0
  278. package/dist/core/tenancy/tenant-state-path.js +49 -0
  279. package/dist/core/tenancy/tenant-state-path.js.map +1 -0
  280. package/dist/core/wiki/project.d.ts +17 -0
  281. package/dist/core/wiki/project.js +37 -0
  282. package/dist/core/wiki/project.js.map +1 -0
  283. package/dist/core/wiki/reconcile.d.ts +15 -0
  284. package/dist/core/wiki/reconcile.js +14 -0
  285. package/dist/core/wiki/reconcile.js.map +1 -0
  286. package/dist/core/wiki/render.d.ts +5 -0
  287. package/dist/core/wiki/render.js +84 -0
  288. package/dist/core/wiki/render.js.map +1 -0
  289. package/dist/core/wiki/rollup.d.ts +28 -0
  290. package/dist/core/wiki/rollup.js +91 -0
  291. package/dist/core/wiki/rollup.js.map +1 -0
  292. package/dist/core/wiki/select.d.ts +8 -0
  293. package/dist/core/wiki/select.js +7 -0
  294. package/dist/core/wiki/select.js.map +1 -0
  295. package/dist/core/wiki/slug.d.ts +36 -0
  296. package/dist/core/wiki/slug.js +71 -0
  297. package/dist/core/wiki/slug.js.map +1 -0
  298. package/dist/core/wiki/types.d.ts +37 -0
  299. package/dist/core/wiki/types.js +2 -0
  300. package/dist/core/wiki/types.js.map +1 -0
  301. package/dist/core/work-digest/build-work-digest.d.ts +1 -1
  302. package/dist/core/work-digest/build-work-digest.js +3 -3
  303. package/dist/core/work-digest/build-work-digest.js.map +1 -1
  304. package/dist/core/workstream/bind.d.ts +1 -1
  305. package/dist/core/workstream/bind.js +10 -10
  306. package/dist/core/workstream/bind.js.map +1 -1
  307. package/dist/core/workstream/rollup.d.ts +1 -1
  308. package/dist/core/workstream/rollup.js +6 -6
  309. package/dist/core/workstream/rollup.js.map +1 -1
  310. package/dist/hook/hook-helpers.d.ts +14 -0
  311. package/dist/hook/hook-helpers.js +29 -2
  312. package/dist/hook/hook-helpers.js.map +1 -1
  313. package/dist/hook/pre-compact-hook.js +6 -4
  314. package/dist/hook/pre-compact-hook.js.map +1 -1
  315. package/dist/hook/prompt-recall-hook.d.ts +5 -2
  316. package/dist/hook/prompt-recall-hook.js +28 -17
  317. package/dist/hook/prompt-recall-hook.js.map +1 -1
  318. package/dist/hook/recall-over-http.d.ts +27 -3
  319. package/dist/hook/recall-over-http.js +44 -11
  320. package/dist/hook/recall-over-http.js.map +1 -1
  321. package/dist/hook/session-end-hook.js +7 -5
  322. package/dist/hook/session-end-hook.js.map +1 -1
  323. package/dist/hook/session-start-hook.d.ts +14 -1
  324. package/dist/hook/session-start-hook.js +55 -15
  325. package/dist/hook/session-start-hook.js.map +1 -1
  326. package/dist/hook/stop-hook.js +9 -7
  327. package/dist/hook/stop-hook.js.map +1 -1
  328. package/dist/http/app.d.ts +41 -3
  329. package/dist/http/app.js +355 -96
  330. package/dist/http/app.js.map +1 -1
  331. package/dist/install/claude-code.d.ts +17 -0
  332. package/dist/install/claude-code.js +44 -5
  333. package/dist/install/claude-code.js.map +1 -1
  334. package/dist/install/codex.d.ts +23 -2
  335. package/dist/install/codex.js +111 -14
  336. package/dist/install/codex.js.map +1 -1
  337. package/dist/install/cursor.d.ts +2 -2
  338. package/dist/install/cursor.js +7 -7
  339. package/dist/install/cursor.js.map +1 -1
  340. package/dist/install/hermes.d.ts +8 -0
  341. package/dist/install/hermes.js +28 -5
  342. package/dist/install/hermes.js.map +1 -1
  343. package/dist/install/local-source.d.ts +20 -0
  344. package/dist/install/local-source.js +28 -0
  345. package/dist/install/local-source.js.map +1 -0
  346. package/dist/install/mcp-block.d.ts +77 -0
  347. package/dist/install/mcp-block.js +99 -0
  348. package/dist/install/mcp-block.js.map +1 -0
  349. package/dist/install/pi.d.ts +26 -0
  350. package/dist/install/pi.js +43 -0
  351. package/dist/install/pi.js.map +1 -1
  352. package/dist/install/setup.js +6 -0
  353. package/dist/install/setup.js.map +1 -1
  354. package/dist/install/windsurf.d.ts +2 -2
  355. package/dist/install/windsurf.js +7 -7
  356. package/dist/install/windsurf.js.map +1 -1
  357. package/dist/llm/classifier-box.d.ts +5 -0
  358. package/dist/llm/classifier-box.js +5 -0
  359. package/dist/llm/classifier-box.js.map +1 -1
  360. package/dist/mcp/server.d.ts +73 -16
  361. package/dist/mcp/server.js +306 -83
  362. package/dist/mcp/server.js.map +1 -1
  363. package/dist/ports/clock.d.ts +12 -0
  364. package/dist/ports/clock.js +10 -0
  365. package/dist/ports/clock.js.map +1 -0
  366. package/dist/ports/code-exemplar-store.d.ts +13 -13
  367. package/dist/ports/entity-store.d.ts +5 -1
  368. package/dist/ports/fact-store.d.ts +0 -0
  369. package/dist/ports/fact-store.js +0 -0
  370. package/dist/ports/fact-store.js.map +1 -1
  371. package/dist/ports/learner-store.d.ts +80 -0
  372. package/dist/ports/learner-store.js +19 -0
  373. package/dist/ports/learner-store.js.map +1 -0
  374. package/dist/ports/outcome.d.ts +3 -3
  375. package/dist/ports/session-store.d.ts +20 -14
  376. package/dist/ports/session-store.js +5 -0
  377. package/dist/ports/session-store.js.map +1 -1
  378. package/dist/ports/signal-store.d.ts +12 -8
  379. package/dist/ports/spawn-child.d.ts +14 -0
  380. package/dist/ports/spawn-child.js +10 -0
  381. package/dist/ports/spawn-child.js.map +1 -0
  382. package/dist/ports/storage.d.ts +6 -0
  383. package/dist/ports/transcript-adapter.d.ts +11 -0
  384. package/dist/ports/wiki-writer.d.ts +19 -0
  385. package/dist/ports/wiki-writer.js +12 -0
  386. package/dist/ports/wiki-writer.js.map +1 -0
  387. package/dist/ports/workstream-store.d.ts +19 -12
  388. package/dist/shared/types.d.ts +22 -0
  389. package/dist/shared/types.js.map +1 -1
  390. package/dist/shared/version.d.ts +9 -0
  391. package/dist/shared/version.js +11 -0
  392. package/dist/shared/version.js.map +1 -0
  393. package/dist/ui/assets/index-D6F3xAis.js +11 -0
  394. package/dist/ui/index.html +1 -1
  395. package/migrations/033_actions_kind_check.sql +58 -0
  396. package/migrations/034_tenancy_teams_and_stamps.sql +40 -0
  397. package/migrations/035_tenancy_entity_rekey.sql +75 -0
  398. package/migrations/036_tenant_name_uniqueness.sql +59 -0
  399. package/migrations/037_sessions_covering_index.sql +25 -0
  400. package/migrations/038_sources_muse.sql +33 -0
  401. package/migrations/039_learner_evidence.sql +51 -0
  402. package/migrations/pg/033_actions_kind_check.sql +17 -0
  403. package/migrations/pg/034_tenancy.sql +77 -0
  404. package/migrations/pg/035_tenant_name_uniqueness.sql +15 -0
  405. package/migrations/pg/036_sources_muse.sql +12 -0
  406. package/migrations/pg/037_learner_evidence.sql +55 -0
  407. package/nlm/index.js +246 -55
  408. package/package.json +10 -5
  409. package/plugin/.codex-plugin/plugin.json +2 -2
  410. package/plugin/scripts/prompt-recall-hook.mjs +244 -55
  411. package/plugin/scripts/session-start-hook.mjs +273 -53
  412. package/plugin/scripts/stop-hook.mjs +195 -37
  413. package/dist/ui/assets/index-CSaBtgXD.js +0 -11
@@ -6,8 +6,19 @@
6
6
  * (INSERT OR IGNORE on the primary key, which is sha256 of the dedup tuple).
7
7
  * The vec lane is managed separately via upsertEmbedding; inserts succeed
8
8
  * even when no embedder is configured.
9
+ *
10
+ * Tenancy (program spec §4, M2 plan Wave B3): every method takes `tenantId`
11
+ * as its non-optional first parameter. `code_exemplars` is a STAMP table;
12
+ * every SELECT/UPDATE/DELETE routes its WHERE fragment through
13
+ * `tenantClause`, and INSERTs stamp `tenant_id` explicitly.
14
+ * `code_exemplars_vec` carries no tenant_id (DERIVE-VIA-FK) — `searchByVector`
15
+ * is the purest vector path in the codebase (no keyword pre-filter at all);
16
+ * its tenant filter is applied inside the id-resolution SQL join against
17
+ * `code_exemplars`, with a JS re-check of each row's own tenant_id as
18
+ * defense in depth (never a substitute for the SQL filter).
9
19
  */
10
20
  import { createHash } from "node:crypto";
21
+ import { tenantClause } from "../tenancy/tenant-clause.js";
11
22
  const VEC_DIM = 768;
12
23
  /**
13
24
  * Deterministic primary key: sha256(install_scope|repo|code_hash|outcome)[:16].
@@ -24,17 +35,17 @@ export class SqliteCodeExemplarStore {
24
35
  constructor(db) {
25
36
  this.db = db;
26
37
  }
27
- async insert(input) {
38
+ async insert(tenantId, input) {
28
39
  const id = exemplarId({
29
40
  installScope: input.installScope,
30
41
  repo: input.repo,
31
42
  codeHash: input.codeHash,
32
43
  outcome: input.outcome,
33
44
  });
34
- const info = this.insertStmt().run(this.toRow(id, input));
45
+ const info = this.insertStmt().run(this.toRow(id, input, tenantId));
35
46
  return { id, skipped: info.changes === 0 };
36
47
  }
37
- async insertMany(inputs) {
48
+ async insertMany(tenantId, inputs) {
38
49
  if (inputs.length === 0)
39
50
  return 0;
40
51
  const stmt = this.insertStmt();
@@ -53,21 +64,31 @@ export class SqliteCodeExemplarStore {
53
64
  codeHash: inp.codeHash,
54
65
  outcome: inp.outcome,
55
66
  });
56
- return this.toRow(id, inp);
67
+ return this.toRow(id, inp, tenantId);
57
68
  }));
58
69
  return inserted;
59
70
  }
60
- async upsertEmbedding(exemplarId, vector) {
71
+ /**
72
+ * No-op if exemplarId isn't owned by tenantId — writing an embedding for
73
+ * another tenant's exemplar must never fall through to a write.
74
+ */
75
+ async upsertEmbedding(tenantId, exemplarId, vector) {
61
76
  if (vector.length !== VEC_DIM) {
62
77
  throw new Error(`code exemplar embeddings must be ${VEC_DIM}-dim (got ${vector.length})`);
63
78
  }
79
+ const tc = tenantClause(tenantId);
80
+ const owned = this.db
81
+ .prepare(`SELECT id FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
82
+ .get(exemplarId, tc.param);
83
+ if (!owned)
84
+ return;
64
85
  const buf = Buffer.from(vector.buffer, vector.byteOffset, vector.byteLength);
65
86
  this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(exemplarId);
66
87
  this.db
67
88
  .prepare("INSERT INTO code_exemplars_vec (exemplar_id, embedding) VALUES (?, ?)")
68
89
  .run(exemplarId, buf);
69
90
  }
70
- async searchByVector(queryVector, filter) {
91
+ async searchByVector(tenantId, queryVector, filter) {
71
92
  const k = Math.max(1, Math.min(50, filter.k ?? 5));
72
93
  const includeNegatives = filter.includeNegatives ?? true;
73
94
  const queryBuf = Buffer.from(queryVector.buffer, queryVector.byteOffset, queryVector.byteLength);
@@ -83,14 +104,26 @@ export class SqliteCodeExemplarStore {
83
104
  return [];
84
105
  const ids = vecRows.map((r) => r.exemplar_id);
85
106
  const distanceById = new Map(vecRows.map((r) => [r.exemplar_id, r.distance]));
107
+ // code_exemplars_vec carries no tenant_id (DERIVE-VIA-FK) — the vec0 KNN
108
+ // scan returns neighbors from the whole corpus regardless of tenant. The
109
+ // tenant filter is re-applied HERE, inside the id-resolution SQL against
110
+ // code_exemplars (program spec §4.3 vector-path rule) — this is the
111
+ // purest vector path in the codebase (no keyword pre-filter at all), so
112
+ // a candidate exemplar id that fails to resolve within the caller's
113
+ // tenant is excluded outright, not merely down-ranked.
86
114
  const placeholders = ids.map(() => "?").join(",");
115
+ const tc = tenantClause(tenantId);
87
116
  const rows = this.db
88
117
  .prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
89
- task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
118
+ task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, tenant_id
90
119
  FROM code_exemplars
91
- WHERE id IN (${placeholders}) AND install_scope = ? AND retired_at IS NULL`)
92
- .all(...ids, filter.installScope);
93
- let hits = rows.map((r) => ({
120
+ WHERE id IN (${placeholders}) AND install_scope = ? AND retired_at IS NULL AND ${tc.sql}`)
121
+ .all(...ids, filter.installScope, tc.param);
122
+ // Defense in depth (never a substitute for the SQL filter above): re-check
123
+ // each resolved row's own tenant, read into a local first so this JS
124
+ // comparison can never be mistaken by the tenant-guard scan for an
125
+ // inlined SQL WHERE fragment (that literal is reserved for tenant-clause.ts).
126
+ let hits = rows.filter((r) => { const rowTenant = r["tenant_id"]; return rowTenant === tenantId; }).map((r) => ({
94
127
  id: r.id,
95
128
  code: r.code,
96
129
  taskContext: r.task_context,
@@ -120,32 +153,35 @@ export class SqliteCodeExemplarStore {
120
153
  });
121
154
  return hits.slice(0, k);
122
155
  }
123
- async getById(id) {
156
+ async getById(tenantId, id) {
157
+ const tc = tenantClause(tenantId);
124
158
  const row = this.db
125
159
  .prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
126
160
  task_context, code, code_hash, outcome, git_sha, survived, ts, created_at,
127
161
  retired_at, label_source
128
- FROM code_exemplars WHERE id = ?`)
129
- .get(id);
162
+ FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
163
+ .get(id, tc.param);
130
164
  return row ? this.rowToExemplar(row) : null;
131
165
  }
132
- async listBySessions(sessionIds) {
166
+ async listBySessions(tenantId, sessionIds) {
133
167
  if (sessionIds.length === 0)
134
168
  return [];
135
169
  const ph = sessionIds.map(() => "?").join(",");
170
+ const tc = tenantClause(tenantId);
136
171
  const rows = this.db
137
172
  .prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
138
173
  task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, retired_at, label_source
139
- FROM code_exemplars WHERE session_id IN (${ph}) AND retired_at IS NULL ORDER BY ts ASC`)
140
- .all(...sessionIds);
174
+ FROM code_exemplars WHERE session_id IN (${ph}) AND retired_at IS NULL AND ${tc.sql} ORDER BY ts ASC`)
175
+ .all(...sessionIds, tc.param);
141
176
  return rows.map((r) => this.rowToExemplar(r));
142
177
  }
143
- async applyBucketCap(installScope, maxPerBucket) {
178
+ async applyBucketCap(tenantId, installScope, maxPerBucket) {
179
+ const bucketTc = tenantClause(tenantId);
144
180
  const buckets = this.db
145
181
  .prepare(`SELECT DISTINCT repo, lang,
146
182
  CASE WHEN outcome IN ('pass','fix') THEN 'positive' ELSE 'negative' END AS outcome_class
147
- FROM code_exemplars WHERE install_scope = ?`)
148
- .all(installScope);
183
+ FROM code_exemplars WHERE install_scope = ? AND ${bucketTc.sql}`)
184
+ .all(installScope, bucketTc.param);
149
185
  let deleted = 0;
150
186
  const delStmt = this.db.prepare("DELETE FROM code_exemplars WHERE id = ?");
151
187
  const txn = this.db.transaction(() => {
@@ -153,13 +189,15 @@ export class SqliteCodeExemplarStore {
153
189
  const outcomeList = bucket.outcome_class === "positive" ? ["pass", "fix"] : ["fail", "exhausted"];
154
190
  const placeholders = outcomeList.map(() => "?").join(",");
155
191
  const langFilter = bucket.lang !== null ? "AND lang = ?" : "AND lang IS NULL";
192
+ const idsTc = tenantClause(tenantId);
156
193
  const params = bucket.lang !== null
157
- ? [installScope, bucket.repo, bucket.lang, ...outcomeList]
158
- : [installScope, bucket.repo, ...outcomeList];
194
+ ? [installScope, bucket.repo, bucket.lang, ...outcomeList, idsTc.param]
195
+ : [installScope, bucket.repo, ...outcomeList, idsTc.param];
159
196
  const allIds = this.db
160
197
  .prepare(`SELECT id FROM code_exemplars
161
198
  WHERE install_scope = ? AND repo = ? ${langFilter}
162
199
  AND outcome IN (${placeholders})
200
+ AND ${idsTc.sql}
163
201
  ORDER BY ts DESC`)
164
202
  .all(...params)
165
203
  .map((r) => r.id);
@@ -174,10 +212,11 @@ export class SqliteCodeExemplarStore {
174
212
  txn();
175
213
  return deleted;
176
214
  }
177
- async pruneReverted(installScope) {
215
+ async pruneReverted(tenantId, installScope) {
216
+ const tc = tenantClause(tenantId);
178
217
  const ids = this.db
179
- .prepare("SELECT id FROM code_exemplars WHERE install_scope = ? AND survived = 0")
180
- .all(installScope)
218
+ .prepare(`SELECT id FROM code_exemplars WHERE install_scope = ? AND survived = 0 AND ${tc.sql}`)
219
+ .all(installScope, tc.param)
181
220
  .map((r) => r.id);
182
221
  let deleted = 0;
183
222
  const txn = this.db.transaction(() => {
@@ -190,31 +229,35 @@ export class SqliteCodeExemplarStore {
190
229
  txn();
191
230
  return deleted;
192
231
  }
193
- async setVerdict(id, patch, source) {
232
+ async setVerdict(tenantId, id, patch, source) {
233
+ const tc = tenantClause(tenantId);
194
234
  const row = this.db
195
- .prepare("SELECT label_source FROM code_exemplars WHERE id = ?")
196
- .get(id);
235
+ .prepare(`SELECT label_source FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
236
+ .get(id, tc.param);
197
237
  if (!row)
198
238
  return { status: "not_found" };
199
239
  if (source === "llm" && row.label_source === "human")
200
240
  return { status: "human_locked" };
201
- const sets = ["label_source = @source"];
202
- const params = { id, source };
241
+ const sets = ["label_source = ?"];
242
+ const params = [source];
203
243
  if (patch.retired !== undefined) {
204
- sets.push("retired_at = @retiredAt");
205
- params["retiredAt"] = patch.retired ? new Date().toISOString() : null;
244
+ sets.push("retired_at = ?");
245
+ params.push(patch.retired ? new Date().toISOString() : null);
206
246
  }
207
247
  if (patch.outcome !== undefined) {
208
- sets.push("outcome = @outcome");
209
- params["outcome"] = patch.outcome;
248
+ sets.push("outcome = ?");
249
+ params.push(patch.outcome);
210
250
  }
211
- this.db.prepare(`UPDATE code_exemplars SET ${sets.join(", ")} WHERE id = @id`).run(params);
251
+ const updateTc = tenantClause(tenantId);
252
+ params.push(id, updateTc.param);
253
+ this.db.prepare(`UPDATE code_exemplars SET ${sets.join(", ")} WHERE id = ? AND ${updateTc.sql}`).run(...params);
212
254
  return { status: "applied" };
213
255
  }
214
- async pruneOlderThan(olderThanTs) {
256
+ async pruneOlderThan(tenantId, olderThanTs) {
257
+ const tc = tenantClause(tenantId);
215
258
  const ids = this.db
216
- .prepare("SELECT id FROM code_exemplars WHERE ts < ?")
217
- .all(olderThanTs)
259
+ .prepare(`SELECT id FROM code_exemplars WHERE ts < ? AND ${tc.sql}`)
260
+ .all(olderThanTs, tc.param)
218
261
  .map((r) => r.id);
219
262
  let deleted = 0;
220
263
  const txn = this.db.transaction(() => {
@@ -231,14 +274,14 @@ export class SqliteCodeExemplarStore {
231
274
  return this.db.prepare(`
232
275
  INSERT OR IGNORE INTO code_exemplars (
233
276
  id, install_scope, signal_id, session_id, repo, model, lang,
234
- task_context, code, code_hash, outcome, git_sha, survived, scope, ts, created_at
277
+ task_context, code, code_hash, outcome, git_sha, survived, scope, ts, created_at, tenant_id
235
278
  ) VALUES (
236
279
  @id, @install_scope, @signal_id, @session_id, @repo, @model, @lang,
237
- @task_context, @code, @code_hash, @outcome, @git_sha, @survived, @scope, @ts, @created_at
280
+ @task_context, @code, @code_hash, @outcome, @git_sha, @survived, @scope, @ts, @created_at, @tenant_id
238
281
  )
239
282
  `);
240
283
  }
241
- toRow(id, inp) {
284
+ toRow(id, inp, tenantId) {
242
285
  return {
243
286
  id,
244
287
  install_scope: inp.installScope,
@@ -258,6 +301,7 @@ export class SqliteCodeExemplarStore {
258
301
  created_at: new Date().toISOString(),
259
302
  retired_at: null,
260
303
  label_source: "llm",
304
+ tenant_id: tenantId,
261
305
  };
262
306
  }
263
307
  rowToExemplar(row) {
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,OAAO,GAAG,GAAG,CAAC;AAyBpB;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAK1B;IACC,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACjF,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,KAAwB;QACnC,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAwC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAgC,EAAE,EAAE;YACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC;oBAAE,QAAQ,EAAE,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,MAAM,EAAE,GAAG,UAAU,CAAC;gBACpB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CACH,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,MAAoB;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,aAAa,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxF,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,uEAAuE,CAAC;aAChF,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,WAAyB,EACzB,MAAgC;QAEhC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;QAEjG,gFAAgF;QAChF,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QAGxB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE9F,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;wBAGgB,YAAY,gDAAgD,CAC7E;aACA,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,YAAY,CAAkB,CAAC;QAErD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC;YAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAwB;YACpC,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG;SACxC,CAAC,CAAC,CAAC;QAEJ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;QACpF,IAAI,CAAC,gBAAgB;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;QAE9F,uFAAuF;QACvF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,YAAY,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,YAAY,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;0CAGkC,CACnC;aACA,GAAG,CAAC,EAAE,CAAC,CAAC;QACX,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAiC;QACpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;oDAE4C,EAAE,0CAA0C,CACzF;aACA,GAAG,CAAC,GAAG,UAAU,CAAkB,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,YAAoB,EAAE,YAAoB;QAE7D,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CACN;;qDAE6C,CAC9C;aACA,GAAG,CAAC,YAAY,CAAC,CAAC;QAErB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAClG,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBAC9E,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,KAAK,IAAI;oBAClB,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,WAAW,CAAC;oBAC1D,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC;gBAGlD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;qBACnB,OAAO,CACN;oDACwC,UAAU;iCAC7B,YAAY;8BACf,CACnB;qBACA,GAAG,CAAC,GAAG,MAAM,CAAC;qBACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAEpB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChF,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAAoB;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,wEAAwE,CACzE;aACA,GAAG,CAAC,YAAY,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,EAAU,EACV,KAA2B,EAC3B,MAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,sDAAsD,CACvD;aACA,GAAG,CAAC,EAAE,CAAC,CAAC;QACX,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACzC,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,YAAY,KAAK,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAExF,MAAM,IAAI,GAAa,CAAC,wBAAwB,CAAC,CAAC;QAClD,MAAM,MAAM,GAA4B,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAChC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6BAA6B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAkB,4CAA4C,CAAC;aACtE,GAAG,CAAC,WAAW,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAc;;;;;;;;KAQnC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,EAAU,EAAE,GAAsB;QAC9C,OAAO;YACL,EAAE;YACF,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,UAAU,EAAE,GAAG,CAAC,SAAS;YACzB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,YAAY,EAAE,GAAG,CAAC,WAAW;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,GAAgB;QACpC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,GAAG,CAAC,QAAwB;YACtC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;YACxB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,WAAW,EAAE,GAAG,CAAC,YAAY;SAC9B,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,18 @@
3
3
  *
4
4
  * All merge operations run inside a single synchronous transaction so
5
5
  * the database is never left in a partially-merged state.
6
+ *
7
+ * Tenancy (program spec §4, M2 plan Wave B4): entities/entity_variants carry
8
+ * a composite PK (tenant_id, canonical/variant); session_entities and
9
+ * workstream_entities are stamped too. merge takes tenantId as its
10
+ * non-optional first parameter and resolves source/target within that
11
+ * tenant only — every SELECT/UPDATE/DELETE routes its WHERE fragment
12
+ * through tenantClause.
6
13
  */
7
14
  import type Database from "better-sqlite3";
8
15
  import type { EntityStore } from "../../ports/entity-store.js";
9
16
  export declare class SqliteEntityStore implements EntityStore {
10
17
  private readonly db;
11
18
  constructor(db: Database.Database);
12
- merge(source: string, target: string): Promise<void>;
19
+ merge(tenantId: string, source: string, target: string): Promise<void>;
13
20
  }
@@ -3,92 +3,111 @@
3
3
  *
4
4
  * All merge operations run inside a single synchronous transaction so
5
5
  * the database is never left in a partially-merged state.
6
+ *
7
+ * Tenancy (program spec §4, M2 plan Wave B4): entities/entity_variants carry
8
+ * a composite PK (tenant_id, canonical/variant); session_entities and
9
+ * workstream_entities are stamped too. merge takes tenantId as its
10
+ * non-optional first parameter and resolves source/target within that
11
+ * tenant only — every SELECT/UPDATE/DELETE routes its WHERE fragment
12
+ * through tenantClause.
6
13
  */
14
+ import { tenantClause } from "../tenancy/tenant-clause.js";
7
15
  export class SqliteEntityStore {
8
16
  db;
9
17
  constructor(db) {
10
18
  this.db = db;
11
19
  }
12
- async merge(source, target) {
20
+ async merge(tenantId, source, target) {
13
21
  const txn = this.db.transaction(() => {
22
+ const targetTc = tenantClause(tenantId);
14
23
  const targetRow = this.db
15
- .prepare("SELECT status FROM entities WHERE canonical = ?")
16
- .get(target);
24
+ .prepare(`SELECT status FROM entities WHERE canonical = ? AND ${targetTc.sql}`)
25
+ .get(target, targetTc.param);
17
26
  if (!targetRow)
18
27
  throw new Error(`merge: target entity not found: ${target}`);
19
28
  if (targetRow.status === "retired") {
20
29
  throw new Error(`merge: target entity is retired: ${target}`);
21
30
  }
31
+ const sourceTc = tenantClause(tenantId);
22
32
  const sourceRow = this.db
23
- .prepare("SELECT status FROM entities WHERE canonical = ?")
24
- .get(source);
33
+ .prepare(`SELECT status FROM entities WHERE canonical = ? AND ${sourceTc.sql}`)
34
+ .get(source, sourceTc.param);
25
35
  if (!sourceRow)
26
36
  throw new Error(`merge: source entity not found: ${source}`);
27
37
  // Step 1: copy source session_entities to target, dedup on composite PK.
38
+ const copyTc = tenantClause(tenantId);
28
39
  this.db
29
- .prepare(`INSERT OR IGNORE INTO session_entities (session_id, entity_canonical)
30
- SELECT session_id, ? FROM session_entities WHERE entity_canonical = ?`)
31
- .run(target, source);
40
+ .prepare(`INSERT OR IGNORE INTO session_entities (tenant_id, session_id, entity_canonical)
41
+ SELECT ?, session_id, ? FROM session_entities WHERE entity_canonical = ? AND ${copyTc.sql}`)
42
+ .run(tenantId, target, source, copyTc.param);
32
43
  // Step 2: delete source's session_entities rows.
44
+ const deleteEntTc = tenantClause(tenantId);
33
45
  this.db
34
- .prepare("DELETE FROM session_entities WHERE entity_canonical = ?")
35
- .run(source);
46
+ .prepare(`DELETE FROM session_entities WHERE entity_canonical = ? AND ${deleteEntTc.sql}`)
47
+ .run(source, deleteEntTc.param);
36
48
  // Step 3: recompute target.session_count exactly from session_entities.
49
+ const countInnerTc = tenantClause(tenantId);
50
+ const countOuterTc = tenantClause(tenantId);
37
51
  this.db
38
52
  .prepare(`UPDATE entities
39
- SET session_count = (SELECT COUNT(*) FROM session_entities WHERE entity_canonical = ?),
53
+ SET session_count = (SELECT COUNT(*) FROM session_entities WHERE entity_canonical = ? AND ${countInnerTc.sql}),
40
54
  updated_at = datetime('now')
41
- WHERE canonical = ?`)
42
- .run(target, target);
55
+ WHERE canonical = ? AND ${countOuterTc.sql}`)
56
+ .run(target, countInnerTc.param, target, countOuterTc.param);
43
57
  // Step 4: widen first_seen_session / last_seen_session.
44
58
  // first_seen and last_seen are session IDs (text), not timestamps.
45
59
  // We use sessions.started_at to order them chronologically and pick
46
60
  // the earliest / latest. This is correct as long as session IDs are
47
61
  // stable references (they are -- FK to sessions(id)).
62
+ const seenTc = tenantClause(tenantId, "e.tenant_id");
48
63
  const bothSeenSessions = this.db
49
64
  .prepare(`SELECT id, started_at FROM sessions
50
65
  WHERE id IN (
51
- SELECT first_seen_session FROM entities WHERE canonical IN (?, ?)
66
+ SELECT first_seen_session FROM entities e WHERE canonical IN (?, ?) AND ${seenTc.sql}
52
67
  UNION
53
- SELECT last_seen_session FROM entities WHERE canonical IN (?, ?)
68
+ SELECT last_seen_session FROM entities e WHERE canonical IN (?, ?) AND ${seenTc.sql}
54
69
  )`)
55
- .all(source, target, source, target);
70
+ .all(source, target, seenTc.param, source, target, seenTc.param);
56
71
  if (bothSeenSessions.length > 0) {
57
72
  bothSeenSessions.sort((a, b) => a.started_at.localeCompare(b.started_at));
58
73
  const earliest = bothSeenSessions[0].id;
59
74
  const latest = bothSeenSessions[bothSeenSessions.length - 1].id;
75
+ const widenTc = tenantClause(tenantId);
60
76
  this.db
61
77
  .prepare(`UPDATE entities
62
78
  SET first_seen_session = ?,
63
79
  last_seen_session = ?,
64
80
  updated_at = datetime('now')
65
- WHERE canonical = ?`)
66
- .run(earliest, latest, target);
81
+ WHERE canonical = ? AND ${widenTc.sql}`)
82
+ .run(earliest, latest, target, widenTc.param);
67
83
  }
68
84
  // Step 5: insert the variant record so future ingest resolves source -> target.
69
85
  this.db
70
- .prepare(`INSERT OR IGNORE INTO entity_variants (variant, canonical, source_session_id)
71
- VALUES (?, ?, NULL)`)
72
- .run(source, target);
86
+ .prepare(`INSERT OR IGNORE INTO entity_variants (tenant_id, variant, canonical, source_session_id)
87
+ VALUES (?, ?, ?, NULL)`)
88
+ .run(tenantId, source, target);
73
89
  // Step 6: re-point existing variants of source to target.
90
+ const listVariantsTc = tenantClause(tenantId);
74
91
  const sourceVariants = this.db
75
- .prepare("SELECT variant FROM entity_variants WHERE canonical = ?")
76
- .all(source);
92
+ .prepare(`SELECT variant FROM entity_variants WHERE canonical = ? AND ${listVariantsTc.sql}`)
93
+ .all(source, listVariantsTc.param);
77
94
  for (const { variant } of sourceVariants) {
78
95
  if (variant === source)
79
96
  continue;
97
+ const repointTc = tenantClause(tenantId);
80
98
  this.db
81
- .prepare("UPDATE entity_variants SET canonical = ? WHERE variant = ?")
82
- .run(target, variant);
99
+ .prepare(`UPDATE entity_variants SET canonical = ? WHERE variant = ? AND ${repointTc.sql}`)
100
+ .run(target, variant, repointTc.param);
83
101
  }
84
102
  // Step 7: retire the source entity row in place.
103
+ const retireTc = tenantClause(tenantId);
85
104
  this.db
86
105
  .prepare(`UPDATE entities
87
106
  SET status = 'retired',
88
107
  session_count = 0,
89
108
  updated_at = datetime('now')
90
- WHERE canonical = ?`)
91
- .run(source);
109
+ WHERE canonical = ? AND ${retireTc.sql}`)
110
+ .run(source, retireTc.param);
92
111
  });
93
112
  txn();
94
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-entity-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-entity-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-entity-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-entity-store.ts"],"names":[],"mappings":"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"}
@@ -14,9 +14,18 @@
14
14
  * B.3 — listForRecall (pre-filter for FactRecallService), semanticSearch,
15
15
  * getHistory (supersedence chain inspection)
16
16
  * B.4 — auto-supersedence on (subject, predicate) collision (deferred)
17
+ *
18
+ * Tenancy (program spec §4, M2 plan Wave B): every method takes `tenantId`
19
+ * as its non-optional first parameter. `facts` is a STAMP table; every
20
+ * SELECT/UPDATE/DELETE routes its WHERE fragment through `tenantClause`,
21
+ * and INSERTs stamp `tenant_id` explicitly. `fact_embeddings` carries no
22
+ * tenant_id (DERIVE-VIA-FK, keyed by fact_id) — `semanticSearch`'s KNN scan
23
+ * has no tenant awareness of its own, so callers (FactRecallService) resolve
24
+ * neighbor ids back through the tenant-filtered `getByIds`/`getById` before
25
+ * trusting them (program spec §4.3, vector-path rule).
17
26
  */
18
27
  import type Database from "better-sqlite3";
19
- import type { FactListFilter, FactQuery, FactSemanticNeighbor, FactStore } from "../../ports/fact-store.js";
28
+ import type { FactListFilter, FactQuery, FactSemanticNeighbor, FactStore, SubjectStat } from "../../ports/fact-store.js";
20
29
  import type { Fact, FactHistoryChain } from "../../shared/types.js";
21
30
  export declare class SqliteFactStore implements FactStore {
22
31
  private readonly db;
@@ -27,33 +36,50 @@ export declare class SqliteFactStore implements FactStore {
27
36
  */
28
37
  constructor(db: Database.Database);
29
38
  private cachedInsertStmt;
30
- insert(fact: Fact): Promise<void>;
31
- insertMany(facts: ReadonlyArray<Fact>): Promise<void>;
32
- getById(id: string): Promise<Fact | null>;
33
- getByIds(ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
34
- findCurrent(subject: string, predicate: string): Promise<Fact | null>;
35
- list(query: FactQuery): Promise<ReadonlyArray<Fact>>;
36
- listBySession(sessionId: string): Promise<ReadonlyArray<Fact>>;
37
- listBySessions(sessionIds: ReadonlyArray<string>, opts?: {
39
+ insert(tenantId: string, fact: Fact): Promise<void>;
40
+ insertMany(tenantId: string, facts: ReadonlyArray<Fact>): Promise<void>;
41
+ getById(tenantId: string, id: string): Promise<Fact | null>;
42
+ getByIds(tenantId: string, ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
43
+ findCurrent(tenantId: string, subject: string, predicate: string): Promise<Fact | null>;
44
+ list(tenantId: string, query: FactQuery): Promise<ReadonlyArray<Fact>>;
45
+ listBySession(tenantId: string, sessionId: string): Promise<ReadonlyArray<Fact>>;
46
+ listBySessions(tenantId: string, sessionIds: ReadonlyArray<string>, opts?: {
38
47
  includeSuperseded?: boolean;
39
48
  }): Promise<ReadonlyArray<Fact>>;
40
- listForRecall(filter: FactListFilter): Promise<ReadonlyArray<Fact>>;
41
- semanticSearch(queryVector: Float32Array, limit: number): Promise<ReadonlyArray<FactSemanticNeighbor>>;
42
- getHistory(subject: string, predicate?: string): Promise<ReadonlyArray<FactHistoryChain>>;
43
- corroborationCounts(triples: ReadonlyArray<{
49
+ listForRecall(tenantId: string, filter: FactListFilter): Promise<ReadonlyArray<Fact>>;
50
+ semanticSearch(tenantId: string, queryVector: Float32Array, limit: number): Promise<ReadonlyArray<FactSemanticNeighbor>>;
51
+ getHistory(tenantId: string, subject: string, predicate?: string): Promise<ReadonlyArray<FactHistoryChain>>;
52
+ corroborationCounts(tenantId: string, triples: ReadonlyArray<{
44
53
  readonly subject: string;
45
54
  readonly predicate: string;
46
55
  readonly value: string;
47
56
  }>): Promise<Map<string, number>>;
57
+ /**
58
+ * Aggregate current (non-superseded, non-retired) facts by subject.
59
+ * Covered by idx_facts_subject_current.
60
+ */
61
+ listSubjectStats(tenantId: string): Promise<ReadonlyArray<SubjectStat>>;
62
+ /**
63
+ * Every non-retired fact for the given subjects, current and superseded,
64
+ * in one query — the wiki projection's rollup stage calls this once for
65
+ * all selected subjects instead of fanning out one listForRecall call per
66
+ * subject. Chunked at 500 subjects per query because SQLite's default
67
+ * host-parameter limit is 999 and the tenant param takes one slot. No SQL
68
+ * ORDER BY: chunk boundaries don't align with the requested subject/date
69
+ * order, so the concatenated rows are sorted once in JS afterward instead.
70
+ */
71
+ listBySubjects(tenantId: string, subjects: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
48
72
  /**
49
73
  * Insert (or replace) the embedding row for a fact. Best-effort: callers
50
74
  * trap embedder errors so an unreachable Ollama doesn't roll back ingest.
51
- * vec0 doesn't UPDATE, so this is a DELETE+INSERT pair.
75
+ * vec0 doesn't UPDATE, so this is a DELETE+INSERT pair. Guarded by a
76
+ * tenant-scoped existence check — writing an embedding for a fact outside
77
+ * the caller's tenant is a no-op, not a fallthrough write.
52
78
  */
53
- upsertEmbedding(factId: string, vector: Float32Array): Promise<void>;
54
- markSuperseded(oldId: string, newId: string | null): Promise<void>;
55
- retire(factId: string): Promise<void>;
56
- ingestSessionFacts(sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
79
+ upsertEmbedding(tenantId: string, factId: string, vector: Float32Array): Promise<void>;
80
+ markSuperseded(tenantId: string, oldId: string, newId: string | null): Promise<void>;
81
+ retire(tenantId: string, factId: string): Promise<void>;
82
+ ingestSessionFacts(tenantId: string, sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
57
83
  /**
58
84
  * Sync core of ingestSessionFacts, callable from inside an existing
59
85
  * better-sqlite3 transaction. SINGLE SOURCE OF TRUTH for the replace +
@@ -64,7 +90,7 @@ export declare class SqliteFactStore implements FactStore {
64
90
  * originally landed only here and silently skipped the inlined copies — the
65
91
  * path production actually uses — leaving both bugs live in production.
66
92
  */
67
- ingestSessionFactsInTxn(sessionId: string, facts: ReadonlyArray<Fact>, scope?: string | null): void;
93
+ ingestSessionFactsInTxn(tenantId: string, sessionId: string, facts: ReadonlyArray<Fact>, scope?: string | null): void;
68
94
  private insertStmt;
69
95
  private toRow;
70
96
  private rowToFact;