nlm-memory 0.21.0 → 0.21.12

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 +45 -13
  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
@@ -1 +1 @@
1
- {"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/exemplars/embed-backfill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/exemplars/embed-backfill.ts"],"names":[],"mappings":"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"}
@@ -22,4 +22,4 @@ export interface RecallCodeResult {
22
22
  * Recall code exemplars. Returns positives (pass/fix) and negatives (fail/exhausted)
23
23
  * as separate lists so the caller can surface them with distinct framing.
24
24
  */
25
- export declare function recallCode(opts: RecallCodeOptions, store: CodeExemplarStore, codeEmbedder: CodeEmbedder | null, proseFallback: LLMClient | null): Promise<RecallCodeResult>;
25
+ export declare function recallCode(tenantId: string, opts: RecallCodeOptions, store: CodeExemplarStore, codeEmbedder: CodeEmbedder | null, proseFallback: LLMClient | null): Promise<RecallCodeResult>;
@@ -11,7 +11,7 @@ import { laneHealth } from "../health/embedding-lane-state.js";
11
11
  * Recall code exemplars. Returns positives (pass/fix) and negatives (fail/exhausted)
12
12
  * as separate lists so the caller can surface them with distinct framing.
13
13
  */
14
- export async function recallCode(opts, store, codeEmbedder, proseFallback) {
14
+ export async function recallCode(tenantId, opts, store, codeEmbedder, proseFallback) {
15
15
  if (laneHealth("code") === "stale") {
16
16
  return { positives: [], negatives: [] };
17
17
  }
@@ -45,7 +45,7 @@ export async function recallCode(opts, store, codeEmbedder, proseFallback) {
45
45
  includeNegatives: opts.includeNegatives ?? true,
46
46
  k: opts.k ?? 5,
47
47
  };
48
- const hits = await store.searchByVector(queryVector, filter);
48
+ const hits = await store.searchByVector(tenantId, queryVector, filter);
49
49
  const positives = hits.filter((h) => h.outcome === "pass" || h.outcome === "fix");
50
50
  const negatives = hits.filter((h) => h.outcome === "fail" || h.outcome === "exhausted");
51
51
  return { positives, negatives };
@@ -1 +1 @@
1
- {"version":3,"file":"recall-code.js","sourceRoot":"","sources":["../../../src/core/exemplars/recall-code.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAYlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAuB,EACvB,KAAwB,EACxB,YAAiC,EACjC,aAA+B;IAE/B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAE5C,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACtD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;IAExF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"recall-code.js","sourceRoot":"","sources":["../../../src/core/exemplars/recall-code.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAYlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,IAAuB,EACvB,KAAwB,EACxB,YAAiC,EACjC,aAA+B;IAE/B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAE5C,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACtD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;IAExF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
@@ -57,4 +57,4 @@ export interface BackfillFactsReport {
57
57
  readonly classifyFailures: number;
58
58
  readonly storageFailures: number;
59
59
  }
60
- export declare function backfillFacts(opts: BackfillFactsOptions): Promise<BackfillFactsReport>;
60
+ export declare function backfillFacts(opts: BackfillFactsOptions, tenantId: string): Promise<BackfillFactsReport>;
@@ -40,7 +40,7 @@ function saveState(path, done) {
40
40
  mkdirSync(dir, { recursive: true });
41
41
  writeFileSync(path, JSON.stringify({ done: Array.from(done) }, null, 0));
42
42
  }
43
- export async function backfillFacts(opts) {
43
+ export async function backfillFacts(opts, tenantId) {
44
44
  const startedAtCutoff = new Date().toISOString();
45
45
  const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
46
46
  const done = opts.dryRun ? new Set() : loadState(statePath);
@@ -49,7 +49,7 @@ export async function backfillFacts(opts) {
49
49
  // transcript text). When reprocess=false, exclude sessions that already
50
50
  // have facts attributed to them. SQL lives in each adapter's
51
51
  // listBackfillCandidates so backfill is backend-agnostic.
52
- const rows = await opts.store.listBackfillCandidates({
52
+ const rows = await opts.store.listBackfillCandidates(tenantId, {
53
53
  cutoff: startedAtCutoff,
54
54
  ...(opts.from ? { from: opts.from } : {}),
55
55
  reprocess: opts.reprocess ?? false,
@@ -124,10 +124,10 @@ export async function backfillFacts(opts) {
124
124
  // so the factStore cast is sound — TS just can't correlate the two union
125
125
  // members at one call site.
126
126
  if (opts.store instanceof PgSessionStore) {
127
- await opts.store.insertFactsForSession(sid, opts.factStore, facts, opts.embedder ?? null);
127
+ await opts.store.insertFactsForSession(tenantId, sid, opts.factStore, facts, opts.embedder ?? null);
128
128
  }
129
129
  else {
130
- await opts.store.insertFactsForSession(sid, opts.factStore, facts, opts.embedder ?? null);
130
+ await opts.store.insertFactsForSession(tenantId, sid, opts.factStore, facts, opts.embedder ?? null);
131
131
  }
132
132
  }
133
133
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"backfill-facts.js","sourceRoot":"","sources":["../../../src/core/facts/backfill-facts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backfill-facts.js","sourceRoot":"","sources":["../../../src/core/facts/backfill-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * fact embed-backfill — (re)embed active facts that are missing a vector.
3
+ *
4
+ * The ingest path embeds facts best-effort: `SqliteSessionStore.embedFacts`
5
+ * traps per-fact embed errors so one bad call can't abort a batch, which
6
+ * leaves the fact row current but absent from `fact_embeddings`. Such a fact
7
+ * is still keyword-recallable via FTS5 and permanently invisible to semantic
8
+ * recall — and nothing repairs it, because the only existing fact re-embed
9
+ * runs inside `reembedCorpus` and is gated behind an embedder config change
10
+ * (a same-config rerun reembeds sessions only). This is that missing repair.
11
+ *
12
+ * Mirrors the exemplar embed-backfill (backfillExemplarEmbeddings): same
13
+ * discovery-by-absence, the store's existing tenant-checked upsertEmbedding,
14
+ * and a single retry on transient embedder failures. The retry matters here
15
+ * specifically — the measured production failure is sporadic (~1 in 26 calls,
16
+ * a steady 3-10% on every busy day since April), not a sustained outage, so
17
+ * most rows succeed on a second attempt.
18
+ *
19
+ * Embed text is `${subject} ${predicate} ${value}`.trim() with role
20
+ * "document", byte-identical to embedFacts. A different shape here would
21
+ * produce vectors that don't sit in the same space as live-path ones.
22
+ *
23
+ * Only recall-eligible facts are embedded (superseded_by IS NULL AND
24
+ * retired_at IS NULL). Embedding a dead fact would reintroduce exactly the
25
+ * ghost vectors scripts/repair-fact-embeddings.mjs deletes (#351), where they
26
+ * consume ANN k-nearest slots and reduce effective recall.
27
+ *
28
+ * Idempotent: discovery is by absence from the vec table, so a second run
29
+ * finds nothing.
30
+ *
31
+ * Layering: depends on the FactStore port for the upsert and on a read-only
32
+ * better-sqlite3 handle for discovery — the port has no "list rows missing a
33
+ * vector" method, and adding one for a one-shot operational tool isn't worth
34
+ * it. Same direct-SQLite call the session and exemplar backfills make.
35
+ */
36
+ import type { FactStore } from "../../ports/fact-store.js";
37
+ import type { LLMClient } from "../../ports/llm-client.js";
38
+ export interface FactBackfillOptions {
39
+ readonly tenantId: string;
40
+ readonly dbPath: string;
41
+ readonly embedder: LLMClient;
42
+ readonly store: FactStore;
43
+ readonly limit?: number;
44
+ readonly onProgress?: (i: number, total: number, id: string, status: string) => void;
45
+ }
46
+ export interface FactBackfillReport {
47
+ readonly total: number;
48
+ readonly succeeded: number;
49
+ readonly failed: number;
50
+ readonly dbMissing: boolean;
51
+ }
52
+ /** Byte-identical to SqliteSessionStore.embedFacts — keep the two in sync. */
53
+ export declare function composeFactEmbedText(subject: string, predicate: string, value: string): string;
54
+ export declare function backfillFactEmbeddings(opts: FactBackfillOptions): Promise<FactBackfillReport>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * fact embed-backfill — (re)embed active facts that are missing a vector.
3
+ *
4
+ * The ingest path embeds facts best-effort: `SqliteSessionStore.embedFacts`
5
+ * traps per-fact embed errors so one bad call can't abort a batch, which
6
+ * leaves the fact row current but absent from `fact_embeddings`. Such a fact
7
+ * is still keyword-recallable via FTS5 and permanently invisible to semantic
8
+ * recall — and nothing repairs it, because the only existing fact re-embed
9
+ * runs inside `reembedCorpus` and is gated behind an embedder config change
10
+ * (a same-config rerun reembeds sessions only). This is that missing repair.
11
+ *
12
+ * Mirrors the exemplar embed-backfill (backfillExemplarEmbeddings): same
13
+ * discovery-by-absence, the store's existing tenant-checked upsertEmbedding,
14
+ * and a single retry on transient embedder failures. The retry matters here
15
+ * specifically — the measured production failure is sporadic (~1 in 26 calls,
16
+ * a steady 3-10% on every busy day since April), not a sustained outage, so
17
+ * most rows succeed on a second attempt.
18
+ *
19
+ * Embed text is `${subject} ${predicate} ${value}`.trim() with role
20
+ * "document", byte-identical to embedFacts. A different shape here would
21
+ * produce vectors that don't sit in the same space as live-path ones.
22
+ *
23
+ * Only recall-eligible facts are embedded (superseded_by IS NULL AND
24
+ * retired_at IS NULL). Embedding a dead fact would reintroduce exactly the
25
+ * ghost vectors scripts/repair-fact-embeddings.mjs deletes (#351), where they
26
+ * consume ANN k-nearest slots and reduce effective recall.
27
+ *
28
+ * Idempotent: discovery is by absence from the vec table, so a second run
29
+ * finds nothing.
30
+ *
31
+ * Layering: depends on the FactStore port for the upsert and on a read-only
32
+ * better-sqlite3 handle for discovery — the port has no "list rows missing a
33
+ * vector" method, and adding one for a one-shot operational tool isn't worth
34
+ * it. Same direct-SQLite call the session and exemplar backfills make.
35
+ */
36
+ import { existsSync } from "node:fs";
37
+ import Database from "better-sqlite3";
38
+ import * as sqliteVec from "sqlite-vec";
39
+ import { LLMUnreachableError } from "../../ports/llm-client.js";
40
+ /** Byte-identical to SqliteSessionStore.embedFacts — keep the two in sync. */
41
+ export function composeFactEmbedText(subject, predicate, value) {
42
+ return `${subject} ${predicate} ${value}`.trim();
43
+ }
44
+ export async function backfillFactEmbeddings(opts) {
45
+ if (!existsSync(opts.dbPath)) {
46
+ return { total: 0, succeeded: 0, failed: 0, dbMissing: true };
47
+ }
48
+ const db = new Database(opts.dbPath, { readonly: true });
49
+ sqliteVec.load(db);
50
+ let rows;
51
+ try {
52
+ const sql = "SELECT f.id, f.subject, f.predicate, f.value FROM facts f " +
53
+ "WHERE f.superseded_by IS NULL AND f.retired_at IS NULL " +
54
+ "AND f.id NOT IN (SELECT fact_id FROM fact_embeddings) " +
55
+ "ORDER BY f.created_at" +
56
+ (opts.limit ? ` LIMIT ${Math.trunc(opts.limit)}` : "");
57
+ rows = db.prepare(sql).all();
58
+ }
59
+ finally {
60
+ db.close();
61
+ }
62
+ const total = rows.length;
63
+ let succeeded = 0;
64
+ let failed = 0;
65
+ for (let i = 0; i < rows.length; i++) {
66
+ const row = rows[i];
67
+ const idx = i + 1;
68
+ const text = composeFactEmbedText(row.subject, row.predicate, row.value);
69
+ if (!text) {
70
+ failed += 1;
71
+ opts.onProgress?.(idx, total, row.id, "FAIL (empty embed text)");
72
+ continue;
73
+ }
74
+ let vector;
75
+ let lastErr;
76
+ for (let attempt = 0; attempt < 2; attempt++) {
77
+ try {
78
+ const out = await opts.embedder.embed(text, "document");
79
+ vector = out.vector;
80
+ lastErr = undefined;
81
+ break;
82
+ }
83
+ catch (e) {
84
+ lastErr = e;
85
+ if (!(e instanceof LLMUnreachableError))
86
+ throw e;
87
+ if (attempt === 0)
88
+ await new Promise((r) => setTimeout(r, 200));
89
+ }
90
+ }
91
+ if (vector === undefined) {
92
+ failed += 1;
93
+ opts.onProgress?.(idx, total, row.id, `FAIL (embedder): ${lastErr?.message ?? "unknown"}`);
94
+ continue;
95
+ }
96
+ try {
97
+ await opts.store.upsertEmbedding(opts.tenantId, row.id, vector);
98
+ }
99
+ catch (e) {
100
+ failed += 1;
101
+ opts.onProgress?.(idx, total, row.id, `FAIL (db): ${e.message}`);
102
+ continue;
103
+ }
104
+ succeeded += 1;
105
+ opts.onProgress?.(idx, total, row.id, "OK");
106
+ }
107
+ return { total, succeeded, failed, dbMissing: false };
108
+ }
109
+ //# sourceMappingURL=embed-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/facts/embed-backfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Reconcile live facts against operator-supplied authorities. Structured
3
+ * sources win: a live fact that contradicts an authority, or that names a
4
+ * deleted file, is retired (never replaced). Deterministic, no LLM calls.
5
+ */
6
+ import type Database from "better-sqlite3";
7
+ export interface Authority {
8
+ readonly aliases: readonly string[];
9
+ readonly predicate: string;
10
+ readonly value: string;
11
+ readonly source: string;
12
+ }
13
+ export interface DeletedFile {
14
+ readonly name: string;
15
+ readonly deleted_at?: string;
16
+ readonly source?: string;
17
+ }
18
+ export interface AuthoritiesFile {
19
+ readonly authorities: readonly Authority[];
20
+ readonly deleted_files: readonly DeletedFile[];
21
+ }
22
+ export type FindingType = "value_mismatch" | "dead_reference";
23
+ export interface Finding {
24
+ readonly type: FindingType;
25
+ readonly factId: string;
26
+ readonly subject: string;
27
+ readonly predicate: string;
28
+ readonly value: string;
29
+ readonly createdAt: string;
30
+ readonly tenantId: string;
31
+ readonly authorityValue: string | null;
32
+ readonly authoritySource: string;
33
+ }
34
+ export declare function loadAuthorities(path: string): AuthoritiesFile;
35
+ export declare function normalizeSubject(s: string): string;
36
+ export declare function findContradictions(db: Database.Database, file: AuthoritiesFile): Finding[];
37
+ export interface ApplyResult {
38
+ readonly retired: readonly Finding[];
39
+ readonly backupPath: string | null;
40
+ }
41
+ export declare function applyRetirements(db: Database.Database, dbFilePath: string, findings: readonly Finding[], limit: number, logPath?: string): Promise<ApplyResult>;
42
+ export declare function formatReport(findings: readonly Finding[], limit: number): string;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Reconcile live facts against operator-supplied authorities. Structured
3
+ * sources win: a live fact that contradicts an authority, or that names a
4
+ * deleted file, is retired (never replaced). Deterministic, no LLM calls.
5
+ */
6
+ import { readFileSync } from "node:fs";
7
+ import { appendFactSupersedence } from "../storage/supersedence-log.js";
8
+ import { DEFAULT_TEAM_ID } from "../tenancy/default-team.js";
9
+ export function loadAuthorities(path) {
10
+ const raw = JSON.parse(readFileSync(path, "utf8"));
11
+ const authorities = raw.authorities ?? [];
12
+ const deleted = raw.deleted_files ?? [];
13
+ for (const a of authorities) {
14
+ if (!Array.isArray(a.aliases) || a.aliases.length === 0 || !a.predicate || a.value === undefined) {
15
+ throw new Error("each authority needs non-empty aliases, a predicate and a value");
16
+ }
17
+ }
18
+ for (const d of deleted) {
19
+ if (!d.name)
20
+ throw new Error("each deleted_files entry needs a name");
21
+ }
22
+ return { authorities, deleted_files: deleted };
23
+ }
24
+ export function normalizeSubject(s) {
25
+ return s.toLowerCase().replace(/[\s_-]+/g, " ").trim();
26
+ }
27
+ function ports(value) {
28
+ return (value.match(/\d+/g) ?? []).map(Number);
29
+ }
30
+ /**
31
+ * `host:port` via the WHATWG URL parser only. One parser, so a value can't
32
+ * read one way to this check and another way to whatever consumes it.
33
+ */
34
+ function hostPort(value) {
35
+ try {
36
+ const u = new URL(value.includes("://") ? value : `http://${value}`);
37
+ if (u.username || u.password)
38
+ return null;
39
+ return u.hostname && u.port ? `${u.hostname}:${u.port}`.toLowerCase() : null;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function contradicts(predicate, factValue, authorityValue) {
46
+ if (predicate === "port") {
47
+ const want = Number.parseInt(authorityValue, 10);
48
+ const have = ports(factValue);
49
+ return have.length > 0 && !have.includes(want);
50
+ }
51
+ if (predicate === "host" || predicate === "url" || predicate === "endpoint") {
52
+ // Prose values ("the Pro on :7803") aren't comparable; never retire on a guess.
53
+ const a = hostPort(authorityValue);
54
+ const f = hostPort(factValue.trim());
55
+ return a !== null && f !== null && a !== f;
56
+ }
57
+ return factValue.trim().toLowerCase() !== authorityValue.trim().toLowerCase();
58
+ }
59
+ export function findContradictions(db, file) {
60
+ const rows = db
61
+ .prepare(`SELECT id, subject, predicate, value, created_at, tenant_id FROM facts
62
+ WHERE superseded_by IS NULL AND retired_at IS NULL AND kind != 'decision'
63
+ ORDER BY created_at, id`)
64
+ .all();
65
+ const aliasMap = new Map();
66
+ for (const a of file.authorities) {
67
+ for (const alias of a.aliases) {
68
+ const key = normalizeSubject(alias);
69
+ aliasMap.set(key, [...(aliasMap.get(key) ?? []), a]);
70
+ }
71
+ }
72
+ const dead = file.deleted_files.map((d) => ({ d, key: normalizeSubject(d.name) }));
73
+ const findings = [];
74
+ for (const row of rows) {
75
+ const subject = normalizeSubject(row.subject);
76
+ const base = {
77
+ factId: row.id,
78
+ subject: row.subject,
79
+ predicate: row.predicate,
80
+ value: row.value,
81
+ createdAt: row.created_at,
82
+ tenantId: row.tenant_id ?? DEFAULT_TEAM_ID,
83
+ };
84
+ const predicate = row.predicate.trim().toLowerCase();
85
+ const bad = (aliasMap.get(subject) ?? []).find((a) => a.predicate.trim().toLowerCase() === predicate && contradicts(predicate, row.value, a.value));
86
+ if (bad) {
87
+ findings.push({ ...base, type: "value_mismatch", authorityValue: bad.value, authoritySource: bad.source });
88
+ continue;
89
+ }
90
+ const gone = dead.find(({ key }) => subject === key || subject.startsWith(key));
91
+ if (gone) {
92
+ findings.push({
93
+ ...base,
94
+ type: "dead_reference",
95
+ authorityValue: null,
96
+ authoritySource: gone.d.source ?? `deleted file ${gone.d.name}`,
97
+ });
98
+ }
99
+ }
100
+ return findings;
101
+ }
102
+ export async function applyRetirements(db, dbFilePath, findings, limit, logPath) {
103
+ const batch = findings.slice(0, limit);
104
+ if (batch.length === 0)
105
+ return { retired: [], backupPath: null };
106
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
107
+ const backupPath = `${dbFilePath}.bak-reconcile-${stamp}`;
108
+ await db.backup(backupPath);
109
+ const retire = db.prepare("UPDATE facts SET retired_at = datetime('now') WHERE id = ? AND retired_at IS NULL AND superseded_by IS NULL");
110
+ db.transaction(() => {
111
+ for (const f of batch)
112
+ retire.run(f.factId);
113
+ })();
114
+ for (const f of batch) {
115
+ await appendFactSupersedence(f.tenantId, { factId: f.factId, reason: `${f.type}: contradicted by ${f.authoritySource}`, source: "reconcile" }, logPath);
116
+ }
117
+ return { retired: batch, backupPath };
118
+ }
119
+ export function formatReport(findings, limit) {
120
+ const lines = [];
121
+ for (const type of ["value_mismatch", "dead_reference"]) {
122
+ const group = findings.filter((f) => f.type === type);
123
+ lines.push(`${type} (${group.length})`);
124
+ for (const f of group) {
125
+ const auth = f.authorityValue === null ? "" : `authority=${f.authorityValue} `;
126
+ lines.push(` ${f.factId} subject=${f.subject} predicate=${f.predicate} value=${f.value} ` +
127
+ `${auth}source=${f.authoritySource} created=${f.createdAt}`);
128
+ }
129
+ }
130
+ lines.push(`total: ${findings.length} (--apply would retire ${Math.min(findings.length, limit)})`);
131
+ return lines.join("\n");
132
+ }
133
+ //# sourceMappingURL=reconcile-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-facts.js","sourceRoot":"","sources":["../../../src/core/facts/reconcile-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type EmbedFailureKind = "chunk" | "fact";
2
+ export declare function recordEmbedFailure(kind: EmbedFailureKind): void;
3
+ export declare function embedFailureSnapshot(): Readonly<Record<EmbedFailureKind, number>>;
4
+ export declare function resetEmbedFailureForTests(): void;
@@ -0,0 +1,12 @@
1
+ const state = { chunk: 0, fact: 0 };
2
+ export function recordEmbedFailure(kind) {
3
+ state[kind] += 1;
4
+ }
5
+ export function embedFailureSnapshot() {
6
+ return Object.freeze({ ...state });
7
+ }
8
+ export function resetEmbedFailureForTests() {
9
+ state.chunk = 0;
10
+ state.fact = 0;
11
+ }
12
+ //# sourceMappingURL=embed-failure-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-failure-state.js","sourceRoot":"","sources":["../../../src/core/health/embed-failure-state.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAqC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Retry loop for a warmup probe that must survive a backend being absent.
3
+ *
4
+ * The embedder warmup used to be a single fire-and-forget attempt with an empty
5
+ * catch. If the backend was not servable at that instant the stage latched cold
6
+ * for the daemon's entire uptime, even after the backend returned, and only a
7
+ * restart cleared it. Two costs, both real: a five-day silent outage while the
8
+ * embedder was reachable throughout, and a three-week hunt for a release
9
+ * "regression" that did not exist, because restarting inside the same outage
10
+ * window reproduces the failure every time and reads as determinism.
11
+ *
12
+ * Pure except for the injected `sleep`, so the backoff schedule is testable
13
+ * without timers. Never throws: a warmup probe must not be able to take down
14
+ * the process it is reporting on.
15
+ */
16
+ export interface RetryUntilWarmDeps {
17
+ /** The probe. Resolving means the lane is live. */
18
+ readonly attempt: () => Promise<unknown>;
19
+ readonly onSuccess: () => void;
20
+ /** Called per failed attempt so health can name the cause instead of showing a bare false. */
21
+ readonly onFailure: (reason: string, attempt: number) => void;
22
+ readonly sleep: (ms: number) => Promise<void>;
23
+ readonly maxAttempts?: number;
24
+ readonly baseDelayMs?: number;
25
+ readonly maxDelayMs?: number;
26
+ }
27
+ export declare function retryUntilWarm(deps: RetryUntilWarmDeps): Promise<void>;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Retry loop for a warmup probe that must survive a backend being absent.
3
+ *
4
+ * The embedder warmup used to be a single fire-and-forget attempt with an empty
5
+ * catch. If the backend was not servable at that instant the stage latched cold
6
+ * for the daemon's entire uptime, even after the backend returned, and only a
7
+ * restart cleared it. Two costs, both real: a five-day silent outage while the
8
+ * embedder was reachable throughout, and a three-week hunt for a release
9
+ * "regression" that did not exist, because restarting inside the same outage
10
+ * window reproduces the failure every time and reads as determinism.
11
+ *
12
+ * Pure except for the injected `sleep`, so the backoff schedule is testable
13
+ * without timers. Never throws: a warmup probe must not be able to take down
14
+ * the process it is reporting on.
15
+ */
16
+ const DEFAULT_MAX_ATTEMPTS = 60;
17
+ const DEFAULT_BASE_DELAY_MS = 1_000;
18
+ // Caps the tail at a minute: long enough that a backend absent for hours costs
19
+ // ~60 cheap probes, short enough that recovery is noticed within a minute.
20
+ const DEFAULT_MAX_DELAY_MS = 60_000;
21
+ function reasonOf(err) {
22
+ return err instanceof Error ? err.message : String(err);
23
+ }
24
+ export async function retryUntilWarm(deps) {
25
+ const maxAttempts = deps.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
26
+ const baseDelay = deps.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
27
+ const maxDelay = deps.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
28
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
29
+ try {
30
+ await deps.attempt();
31
+ deps.onSuccess();
32
+ return;
33
+ }
34
+ catch (err) {
35
+ try {
36
+ deps.onFailure(reasonOf(err), attempt);
37
+ }
38
+ catch {
39
+ // A broken reporter must not end the retry loop.
40
+ }
41
+ if (attempt === maxAttempts)
42
+ return;
43
+ const delay = Math.min(baseDelay * 2 ** (attempt - 1), maxDelay);
44
+ try {
45
+ await deps.sleep(delay);
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=warmup-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warmup-retry.js","sourceRoot":"","sources":["../../../src/core/health/warmup-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,IAAI,qBAAqB,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,oBAAoB,CAAC;IAEzD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YACD,IAAI,OAAO,KAAK,WAAW;gBAAE,OAAO;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -2,11 +2,26 @@ interface WarmupState {
2
2
  fts5: boolean;
3
3
  textEmbedder: boolean;
4
4
  }
5
+ /**
6
+ * Why a stage is still cold. A bare `false` is indistinguishable between "the
7
+ * backend was absent at boot" and "this build is broken", and that ambiguity
8
+ * cost three weeks chasing a release regression that did not exist. `since`
9
+ * holds the FIRST failure so health can report how long the lane has been down
10
+ * rather than only the latest retry.
11
+ */
12
+ export interface WarmupFailure {
13
+ readonly reason: string;
14
+ readonly attempts: number;
15
+ readonly since: string;
16
+ }
17
+ type FailureMap = Partial<Record<keyof WarmupState, WarmupFailure>>;
5
18
  export declare function markWarm(stage: keyof WarmupState): void;
19
+ export declare function markWarmFailure(stage: keyof WarmupState, reason: string, attempts: number): void;
6
20
  export declare function warmupSnapshot(): {
7
21
  fts5: boolean;
8
22
  textEmbedder: boolean;
9
23
  ready: boolean;
24
+ lastError?: FailureMap;
10
25
  };
11
26
  export declare function resetWarmupState(): void;
12
27
  export {};