nlm-memory 0.19.0 → 0.20.1

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 (398) hide show
  1. package/README.md +17 -10
  2. package/dist/cli/digest.js +21 -0
  3. package/dist/cli/digest.js.map +1 -1
  4. package/dist/cli/init.d.ts +12 -0
  5. package/dist/cli/init.js +49 -0
  6. package/dist/cli/init.js.map +1 -0
  7. package/dist/cli/nlm.d.ts +13 -1
  8. package/dist/cli/nlm.js +766 -55
  9. package/dist/cli/nlm.js.map +1 -1
  10. package/dist/core/actions/overlay.d.ts +20 -6
  11. package/dist/core/actions/overlay.js +32 -18
  12. package/dist/core/actions/overlay.js.map +1 -1
  13. package/dist/core/adapters/claude-code.js +6 -0
  14. package/dist/core/adapters/claude-code.js.map +1 -1
  15. package/dist/core/classifier/hierarchical-classify.d.ts +6 -2
  16. package/dist/core/classifier/hierarchical-classify.js +10 -6
  17. package/dist/core/classifier/hierarchical-classify.js.map +1 -1
  18. package/dist/core/classifier/prompt.js +3 -3
  19. package/dist/core/digest/compose.d.ts +10 -0
  20. package/dist/core/digest/compose.js +7 -1
  21. package/dist/core/digest/compose.js.map +1 -1
  22. package/dist/core/embedding/embed-backfill.d.ts +13 -2
  23. package/dist/core/embedding/embed-backfill.js +181 -43
  24. package/dist/core/embedding/embed-backfill.js.map +1 -1
  25. package/dist/core/embedding/embedding-config.d.ts +17 -0
  26. package/dist/core/embedding/embedding-config.js +12 -0
  27. package/dist/core/embedding/embedding-config.js.map +1 -0
  28. package/dist/core/embedding/pg-embed-backfill.d.ts +31 -0
  29. package/dist/core/embedding/pg-embed-backfill.js +264 -0
  30. package/dist/core/embedding/pg-embed-backfill.js.map +1 -0
  31. package/dist/core/entities/dedup-suggest.d.ts +25 -0
  32. package/dist/core/entities/dedup-suggest.js +107 -0
  33. package/dist/core/entities/dedup-suggest.js.map +1 -0
  34. package/dist/core/eval/classifier-fixture-eval.d.ts +29 -0
  35. package/dist/core/eval/classifier-fixture-eval.js +217 -0
  36. package/dist/core/eval/classifier-fixture-eval.js.map +1 -0
  37. package/dist/core/eval/extraction-scoring.d.ts +63 -0
  38. package/dist/core/eval/extraction-scoring.js +79 -0
  39. package/dist/core/eval/extraction-scoring.js.map +1 -0
  40. package/dist/core/eval/run-eval.d.ts +40 -0
  41. package/dist/core/eval/run-eval.js +34 -0
  42. package/dist/core/eval/run-eval.js.map +1 -0
  43. package/dist/core/exemplars/capture-from-session.d.ts +1 -0
  44. package/dist/core/exemplars/capture-from-session.js +6 -2
  45. package/dist/core/exemplars/capture-from-session.js.map +1 -1
  46. package/dist/core/exemplars/diff-parse.d.ts +23 -0
  47. package/dist/core/exemplars/diff-parse.js +73 -0
  48. package/dist/core/exemplars/diff-parse.js.map +1 -0
  49. package/dist/core/exemplars/embed-backfill.d.ts +36 -0
  50. package/dist/core/exemplars/embed-backfill.js +85 -0
  51. package/dist/core/exemplars/embed-backfill.js.map +1 -0
  52. package/dist/core/exemplars/embed-text.d.ts +15 -0
  53. package/dist/core/exemplars/embed-text.js +18 -0
  54. package/dist/core/exemplars/embed-text.js.map +1 -0
  55. package/dist/core/exemplars/extract-exemplar.js +2 -65
  56. package/dist/core/exemplars/extract-exemplar.js.map +1 -1
  57. package/dist/core/exemplars/recall-code.js +4 -0
  58. package/dist/core/exemplars/recall-code.js.map +1 -1
  59. package/dist/core/exemplars/warm-embedder.d.ts +14 -0
  60. package/dist/core/exemplars/warm-embedder.js +18 -0
  61. package/dist/core/exemplars/warm-embedder.js.map +1 -0
  62. package/dist/core/health/corpus-state.d.ts +8 -0
  63. package/dist/core/health/corpus-state.js +11 -0
  64. package/dist/core/health/corpus-state.js.map +1 -0
  65. package/dist/core/health/embed-inflight.d.ts +9 -0
  66. package/dist/core/health/embed-inflight.js +30 -0
  67. package/dist/core/health/embed-inflight.js.map +1 -0
  68. package/dist/core/health/embedding-lane-state.d.ts +6 -0
  69. package/dist/core/health/embedding-lane-state.js +18 -0
  70. package/dist/core/health/embedding-lane-state.js.map +1 -0
  71. package/dist/core/health/warmup-state.d.ts +12 -0
  72. package/dist/core/health/warmup-state.js +12 -0
  73. package/dist/core/health/warmup-state.js.map +1 -0
  74. package/dist/core/hook/gate.d.ts +13 -6
  75. package/dist/core/hook/gate.js +47 -6
  76. package/dist/core/hook/gate.js.map +1 -1
  77. package/dist/core/hook/hook-log.d.ts +5 -0
  78. package/dist/core/hook/hook-log.js.map +1 -1
  79. package/dist/core/hook/memo.d.ts +12 -0
  80. package/dist/core/hook/memo.js +41 -1
  81. package/dist/core/hook/memo.js.map +1 -1
  82. package/dist/core/hook/pointer-block.d.ts +1 -0
  83. package/dist/core/hook/pointer-block.js +23 -2
  84. package/dist/core/hook/pointer-block.js.map +1 -1
  85. package/dist/core/hook/query-extract.d.ts +2 -1
  86. package/dist/core/hook/query-extract.js +10 -1
  87. package/dist/core/hook/query-extract.js.map +1 -1
  88. package/dist/core/hook/resolve-conversation-by-query.d.ts +28 -0
  89. package/dist/core/hook/resolve-conversation-by-query.js +98 -0
  90. package/dist/core/hook/resolve-conversation-by-query.js.map +1 -0
  91. package/dist/core/hook/select.d.ts +8 -0
  92. package/dist/core/hook/select.js +9 -2
  93. package/dist/core/hook/select.js.map +1 -1
  94. package/dist/core/hook/transcript.js +16 -2
  95. package/dist/core/hook/transcript.js.map +1 -1
  96. package/dist/core/ingest/ingest-session.d.ts +5 -0
  97. package/dist/core/ingest/ingest-session.js +3 -0
  98. package/dist/core/ingest/ingest-session.js.map +1 -1
  99. package/dist/core/ingest/reclassify-oversized.d.ts +5 -0
  100. package/dist/core/ingest/reclassify-oversized.js +3 -0
  101. package/dist/core/ingest/reclassify-oversized.js.map +1 -1
  102. package/dist/core/ingest/reprocess.d.ts +96 -0
  103. package/dist/core/ingest/reprocess.js +275 -0
  104. package/dist/core/ingest/reprocess.js.map +1 -0
  105. package/dist/core/integrity/check-invariants.d.ts +6 -1
  106. package/dist/core/integrity/check-invariants.js +209 -3
  107. package/dist/core/integrity/check-invariants.js.map +1 -1
  108. package/dist/core/metrics/corpus-stats.d.ts +49 -0
  109. package/dist/core/metrics/corpus-stats.js +111 -0
  110. package/dist/core/metrics/corpus-stats.js.map +1 -0
  111. package/dist/core/metrics/re-derivation.d.ts +48 -0
  112. package/dist/core/metrics/re-derivation.js +87 -0
  113. package/dist/core/metrics/re-derivation.js.map +1 -0
  114. package/dist/core/recall/citation-log.d.ts +8 -0
  115. package/dist/core/recall/citation-log.js +17 -0
  116. package/dist/core/recall/citation-log.js.map +1 -1
  117. package/dist/core/recall/query-intent.d.ts +7 -0
  118. package/dist/core/recall/query-intent.js +25 -0
  119. package/dist/core/recall/query-intent.js.map +1 -0
  120. package/dist/core/recall/query-log.d.ts +4 -0
  121. package/dist/core/recall/query-log.js +4 -0
  122. package/dist/core/recall/query-log.js.map +1 -1
  123. package/dist/core/recall/recall-service.d.ts +37 -1
  124. package/dist/core/recall/recall-service.js +106 -63
  125. package/dist/core/recall/recall-service.js.map +1 -1
  126. package/dist/core/recall/related-exemplars.d.ts +1 -0
  127. package/dist/core/recall/related-exemplars.js +4 -1
  128. package/dist/core/recall/related-exemplars.js.map +1 -1
  129. package/dist/core/recall/related-facts.js +2 -2
  130. package/dist/core/recall/related-facts.js.map +1 -1
  131. package/dist/core/recall/reranker.d.ts +2 -1
  132. package/dist/core/recall/reranker.js +3 -3
  133. package/dist/core/recall/reranker.js.map +1 -1
  134. package/dist/core/recall-facts/fact-query-log.d.ts +7 -0
  135. package/dist/core/recall-facts/fact-query-log.js +2 -0
  136. package/dist/core/recall-facts/fact-query-log.js.map +1 -1
  137. package/dist/core/recall-facts/fact-recall-service.d.ts +9 -1
  138. package/dist/core/recall-facts/fact-recall-service.js +21 -8
  139. package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
  140. package/dist/core/scheduler/scan-once.d.ts +6 -6
  141. package/dist/core/scheduler/scan-once.js +13 -49
  142. package/dist/core/scheduler/scan-once.js.map +1 -1
  143. package/dist/core/scheduler/scheduler.d.ts +10 -0
  144. package/dist/core/scheduler/scheduler.js +80 -28
  145. package/dist/core/scheduler/scheduler.js.map +1 -1
  146. package/dist/core/signals/code-signal.d.ts +49 -0
  147. package/dist/core/signals/code-signal.js +53 -0
  148. package/dist/core/signals/code-signal.js.map +1 -0
  149. package/dist/core/storage/db-restore.js +3 -1
  150. package/dist/core/storage/db-restore.js.map +1 -1
  151. package/dist/core/storage/fact-batch.d.ts +9 -0
  152. package/dist/core/storage/fact-batch.js +14 -0
  153. package/dist/core/storage/fact-batch.js.map +1 -0
  154. package/dist/core/storage/pg-code-exemplar-store.d.ts +1 -0
  155. package/dist/core/storage/pg-code-exemplar-store.js +7 -0
  156. package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
  157. package/dist/core/storage/pg-embedding-config.d.ts +29 -0
  158. package/dist/core/storage/pg-embedding-config.js +53 -0
  159. package/dist/core/storage/pg-embedding-config.js.map +1 -0
  160. package/dist/core/storage/pg-entity-store.d.ts +12 -0
  161. package/dist/core/storage/pg-entity-store.js +79 -0
  162. package/dist/core/storage/pg-entity-store.js.map +1 -0
  163. package/dist/core/storage/pg-fact-ingest.d.ts +15 -0
  164. package/dist/core/storage/pg-fact-ingest.js +34 -0
  165. package/dist/core/storage/pg-fact-ingest.js.map +1 -0
  166. package/dist/core/storage/pg-fact-store.d.ts +3 -0
  167. package/dist/core/storage/pg-fact-store.js +26 -30
  168. package/dist/core/storage/pg-fact-store.js.map +1 -1
  169. package/dist/core/storage/pg-migrate.d.ts +18 -0
  170. package/dist/core/storage/pg-migrate.js +73 -0
  171. package/dist/core/storage/pg-migrate.js.map +1 -0
  172. package/dist/core/storage/pg-session-store.d.ts +9 -0
  173. package/dist/core/storage/pg-session-store.js +204 -76
  174. package/dist/core/storage/pg-session-store.js.map +1 -1
  175. package/dist/core/storage/pg-storage.d.ts +9 -7
  176. package/dist/core/storage/pg-storage.js +20 -50
  177. package/dist/core/storage/pg-storage.js.map +1 -1
  178. package/dist/core/storage/pg-workstream-store.d.ts +24 -0
  179. package/dist/core/storage/pg-workstream-store.js +96 -0
  180. package/dist/core/storage/pg-workstream-store.js.map +1 -0
  181. package/dist/core/storage/sqlite-code-exemplar-store.d.ts +1 -0
  182. package/dist/core/storage/sqlite-code-exemplar-store.js +11 -0
  183. package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
  184. package/dist/core/storage/sqlite-embedding-config.d.ts +10 -0
  185. package/dist/core/storage/sqlite-embedding-config.js +27 -0
  186. package/dist/core/storage/sqlite-embedding-config.js.map +1 -0
  187. package/dist/core/storage/sqlite-entity-store.d.ts +13 -0
  188. package/dist/core/storage/sqlite-entity-store.js +96 -0
  189. package/dist/core/storage/sqlite-entity-store.js.map +1 -0
  190. package/dist/core/storage/sqlite-fact-store.d.ts +15 -7
  191. package/dist/core/storage/sqlite-fact-store.js +76 -25
  192. package/dist/core/storage/sqlite-fact-store.js.map +1 -1
  193. package/dist/core/storage/sqlite-session-store.d.ts +20 -5
  194. package/dist/core/storage/sqlite-session-store.js +183 -68
  195. package/dist/core/storage/sqlite-session-store.js.map +1 -1
  196. package/dist/core/storage/sqlite-storage.d.ts +8 -8
  197. package/dist/core/storage/sqlite-storage.js +21 -32
  198. package/dist/core/storage/sqlite-storage.js.map +1 -1
  199. package/dist/core/storage/sqlite-workstream-store.d.ts +24 -0
  200. package/dist/core/storage/sqlite-workstream-store.js +98 -0
  201. package/dist/core/storage/sqlite-workstream-store.js.map +1 -0
  202. package/dist/core/util/with-timeout.d.ts +5 -0
  203. package/dist/core/util/with-timeout.js +20 -0
  204. package/dist/core/util/with-timeout.js.map +1 -0
  205. package/dist/core/work-digest/active-spans.d.ts +8 -0
  206. package/dist/core/work-digest/active-spans.js +29 -0
  207. package/dist/core/work-digest/active-spans.js.map +1 -0
  208. package/dist/core/work-digest/attribute.d.ts +15 -0
  209. package/dist/core/work-digest/attribute.js +76 -0
  210. package/dist/core/work-digest/attribute.js.map +1 -0
  211. package/dist/core/work-digest/build-work-digest.d.ts +12 -0
  212. package/dist/core/work-digest/build-work-digest.js +69 -0
  213. package/dist/core/work-digest/build-work-digest.js.map +1 -0
  214. package/dist/core/work-digest/compose-work-digest.d.ts +3 -0
  215. package/dist/core/work-digest/compose-work-digest.js +52 -0
  216. package/dist/core/work-digest/compose-work-digest.js.map +1 -0
  217. package/dist/core/work-digest/merge-active.d.ts +10 -0
  218. package/dist/core/work-digest/merge-active.js +22 -0
  219. package/dist/core/work-digest/merge-active.js.map +1 -0
  220. package/dist/core/work-digest/read-transcript-timestamps.d.ts +7 -0
  221. package/dist/core/work-digest/read-transcript-timestamps.js +40 -0
  222. package/dist/core/work-digest/read-transcript-timestamps.js.map +1 -0
  223. package/dist/core/work-digest/topics.d.ts +18 -0
  224. package/dist/core/work-digest/topics.js +26 -0
  225. package/dist/core/work-digest/topics.js.map +1 -0
  226. package/dist/core/work-digest/types.d.ts +45 -0
  227. package/dist/core/work-digest/types.js +2 -0
  228. package/dist/core/work-digest/types.js.map +1 -0
  229. package/dist/core/workstream/bind.d.ts +25 -0
  230. package/dist/core/workstream/bind.js +23 -0
  231. package/dist/core/workstream/bind.js.map +1 -0
  232. package/dist/core/workstream/compose-recall.d.ts +2 -0
  233. package/dist/core/workstream/compose-recall.js +39 -0
  234. package/dist/core/workstream/compose-recall.js.map +1 -0
  235. package/dist/core/workstream/merge-suggest.d.ts +19 -0
  236. package/dist/core/workstream/merge-suggest.js +61 -0
  237. package/dist/core/workstream/merge-suggest.js.map +1 -0
  238. package/dist/core/workstream/model.d.ts +20 -0
  239. package/dist/core/workstream/model.js +9 -0
  240. package/dist/core/workstream/model.js.map +1 -0
  241. package/dist/core/workstream/name-match.d.ts +8 -0
  242. package/dist/core/workstream/name-match.js +18 -0
  243. package/dist/core/workstream/name-match.js.map +1 -0
  244. package/dist/core/workstream/resolve.d.ts +10 -0
  245. package/dist/core/workstream/resolve.js +21 -0
  246. package/dist/core/workstream/resolve.js.map +1 -0
  247. package/dist/core/workstream/rollup.d.ts +12 -0
  248. package/dist/core/workstream/rollup.js +17 -0
  249. package/dist/core/workstream/rollup.js.map +1 -0
  250. package/dist/core/workstream/work-topics.d.ts +10 -0
  251. package/dist/core/workstream/work-topics.js +55 -0
  252. package/dist/core/workstream/work-topics.js.map +1 -0
  253. package/dist/hook/hook-helpers.d.ts +4 -0
  254. package/dist/hook/hook-helpers.js +36 -0
  255. package/dist/hook/hook-helpers.js.map +1 -0
  256. package/dist/hook/pre-compact-hook.d.ts +23 -0
  257. package/dist/hook/pre-compact-hook.js +66 -0
  258. package/dist/hook/pre-compact-hook.js.map +1 -0
  259. package/dist/hook/prompt-recall-hook.d.ts +37 -0
  260. package/dist/hook/prompt-recall-hook.js +120 -20
  261. package/dist/hook/prompt-recall-hook.js.map +1 -1
  262. package/dist/hook/recall-gate.d.ts +29 -0
  263. package/dist/hook/recall-gate.js +50 -0
  264. package/dist/hook/recall-gate.js.map +1 -0
  265. package/dist/hook/recall-over-http.d.ts +1 -1
  266. package/dist/hook/recall-over-http.js +11 -11
  267. package/dist/hook/recall-over-http.js.map +1 -1
  268. package/dist/hook/recent-context.d.ts +25 -0
  269. package/dist/hook/recent-context.js +104 -0
  270. package/dist/hook/recent-context.js.map +1 -0
  271. package/dist/hook/score-floor.d.ts +27 -0
  272. package/dist/hook/score-floor.js +42 -0
  273. package/dist/hook/score-floor.js.map +1 -0
  274. package/dist/hook/session-end-hook.js +8 -29
  275. package/dist/hook/session-end-hook.js.map +1 -1
  276. package/dist/hook/session-start-hook.js +24 -59
  277. package/dist/hook/session-start-hook.js.map +1 -1
  278. package/dist/hook/stop-hook.js +22 -59
  279. package/dist/hook/stop-hook.js.map +1 -1
  280. package/dist/hook/subagent-start-hook.d.ts +28 -0
  281. package/dist/hook/subagent-start-hook.js +81 -0
  282. package/dist/hook/subagent-start-hook.js.map +1 -0
  283. package/dist/http/app.js +28 -8
  284. package/dist/http/app.js.map +1 -1
  285. package/dist/install/setup.js +2 -0
  286. package/dist/install/setup.js.map +1 -1
  287. package/dist/llm/build-classifier.d.ts +22 -0
  288. package/dist/llm/build-classifier.js +42 -0
  289. package/dist/llm/build-classifier.js.map +1 -0
  290. package/dist/llm/build-embedder.d.ts +11 -0
  291. package/dist/llm/build-embedder.js +42 -0
  292. package/dist/llm/build-embedder.js.map +1 -0
  293. package/dist/llm/bundled-embedder-client.d.ts +37 -0
  294. package/dist/llm/bundled-embedder-client.js +90 -0
  295. package/dist/llm/bundled-embedder-client.js.map +1 -0
  296. package/dist/llm/classifier-box.d.ts +13 -5
  297. package/dist/llm/classifier-box.js +28 -6
  298. package/dist/llm/classifier-box.js.map +1 -1
  299. package/dist/llm/classifier-egress.d.ts +18 -0
  300. package/dist/llm/classifier-egress.js +59 -0
  301. package/dist/llm/classifier-egress.js.map +1 -0
  302. package/dist/llm/client-shared.d.ts +4 -0
  303. package/dist/llm/client-shared.js +39 -0
  304. package/dist/llm/client-shared.js.map +1 -0
  305. package/dist/llm/deepseek-client.d.ts +20 -0
  306. package/dist/llm/deepseek-client.js +59 -45
  307. package/dist/llm/deepseek-client.js.map +1 -1
  308. package/dist/llm/embedder-info.d.ts +15 -0
  309. package/dist/llm/embedder-info.js +27 -0
  310. package/dist/llm/embedder-info.js.map +1 -0
  311. package/dist/llm/model-quirks.d.ts +4 -0
  312. package/dist/llm/model-quirks.js +7 -0
  313. package/dist/llm/model-quirks.js.map +1 -0
  314. package/dist/llm/naming.d.ts +5 -0
  315. package/dist/llm/naming.js +20 -0
  316. package/dist/llm/naming.js.map +1 -0
  317. package/dist/llm/ollama-client.d.ts +7 -8
  318. package/dist/llm/ollama-client.js +59 -51
  319. package/dist/llm/ollama-client.js.map +1 -1
  320. package/dist/llm/ollama-code-embedder.d.ts +8 -3
  321. package/dist/llm/ollama-code-embedder.js +14 -24
  322. package/dist/llm/ollama-code-embedder.js.map +1 -1
  323. package/dist/llm/openai-code-embedder-client.d.ts +25 -0
  324. package/dist/llm/openai-code-embedder-client.js +52 -0
  325. package/dist/llm/openai-code-embedder-client.js.map +1 -0
  326. package/dist/llm/openai-embedder-client.d.ts +41 -0
  327. package/dist/llm/openai-embedder-client.js +83 -0
  328. package/dist/llm/openai-embedder-client.js.map +1 -0
  329. package/dist/mcp/server.d.ts +47 -2
  330. package/dist/mcp/server.js +303 -18
  331. package/dist/mcp/server.js.map +1 -1
  332. package/dist/ports/code-embedder.d.ts +6 -1
  333. package/dist/ports/code-exemplar-store.d.ts +5 -0
  334. package/dist/ports/entity-store.d.ts +35 -0
  335. package/dist/ports/entity-store.js +7 -0
  336. package/dist/ports/entity-store.js.map +1 -0
  337. package/dist/ports/fact-store.d.ts +0 -0
  338. package/dist/ports/fact-store.js.map +1 -1
  339. package/dist/ports/llm-client.d.ts +9 -1
  340. package/dist/ports/session-store.d.ts +12 -0
  341. package/dist/ports/storage.d.ts +7 -30
  342. package/dist/ports/storage.js +3 -7
  343. package/dist/ports/storage.js.map +1 -1
  344. package/dist/ports/transcript-adapter.d.ts +2 -0
  345. package/dist/ports/workstream-store.d.ts +21 -0
  346. package/dist/ports/workstream-store.js +2 -0
  347. package/dist/ports/workstream-store.js.map +1 -0
  348. package/dist/shared/types.d.ts +23 -2
  349. package/fixtures/classifier-gold/README.md +94 -0
  350. package/fixtures/classifier-gold/reference.json +318 -0
  351. package/fixtures/classifier-gold/transcripts/01-bug-fix-null-pointer-api.txt +75 -0
  352. package/fixtures/classifier-gold/transcripts/02-bug-fix-race-condition-queue.txt +77 -0
  353. package/fixtures/classifier-gold/transcripts/03-bug-fix-jwt-clock-skew.txt +86 -0
  354. package/fixtures/classifier-gold/transcripts/04-feature-webhook-retry.txt +95 -0
  355. package/fixtures/classifier-gold/transcripts/05-feature-csv-export.txt +86 -0
  356. package/fixtures/classifier-gold/transcripts/06-feature-rate-limiting.txt +61 -0
  357. package/fixtures/classifier-gold/transcripts/07-refactor-db-abstraction.txt +72 -0
  358. package/fixtures/classifier-gold/transcripts/08-refactor-config-loading.txt +89 -0
  359. package/fixtures/classifier-gold/transcripts/09-ops-docker-staging.txt +94 -0
  360. package/fixtures/classifier-gold/transcripts/10-ops-nginx-ssl.txt +121 -0
  361. package/fixtures/classifier-gold/transcripts/11-ops-postgres-migration.txt +74 -0
  362. package/fixtures/classifier-gold/transcripts/12-ops-cron-debugging.txt +73 -0
  363. package/fixtures/classifier-gold/transcripts/13-research-vector-db-comparison.txt +59 -0
  364. package/fixtures/classifier-gold/transcripts/14-research-oauth-provider.txt +74 -0
  365. package/fixtures/classifier-gold/transcripts/15-writing-api-docs.txt +154 -0
  366. package/fixtures/classifier-gold/transcripts/16-meeting-sprint-planning.txt +69 -0
  367. package/fixtures/classifier-gold/transcripts/17-trivial-list-files.txt +14 -0
  368. package/fixtures/classifier-gold/transcripts/18-trivial-version-check.txt +21 -0
  369. package/fixtures/classifier-gold/transcripts/19-trivial-syntax-help.txt +29 -0
  370. package/fixtures/classifier-gold/transcripts/20-trivial-read-package-json.txt +41 -0
  371. package/migrations/000_initial_schema.sql +1 -1
  372. package/migrations/024_backfill_exemplar_repo_basename.sql +32 -0
  373. package/migrations/025_workstreams.sql +30 -0
  374. package/migrations/026_embedding_config.sql +12 -0
  375. package/migrations/027_drop_legacy_session_embeddings.sql +7 -0
  376. package/migrations/028_classifier_provenance.sql +5 -0
  377. package/migrations/pg/001_initial.sql +34 -0
  378. package/migrations/pg/019_split_replaces.sql +16 -7
  379. package/migrations/pg/025_workstreams.sql +34 -0
  380. package/migrations/pg/026_embedding_config.sql +12 -0
  381. package/migrations/pg/028_classifier_provenance.sql +5 -0
  382. package/migrations/pg/029_entity_variants.sql +9 -0
  383. package/nlm/index.js +395 -37
  384. package/package.json +12 -2
  385. package/plugin/.codex-plugin/plugin.json +1 -1
  386. package/plugin/scripts/prompt-recall-hook.mjs +402 -41
  387. package/plugin/scripts/session-start-hook.mjs +286 -60
  388. package/plugin/scripts/stop-hook.mjs +85 -65
  389. package/plugin-hermes-agent/__init__.py +2 -1
  390. package/templates/agent-contract/README.md +24 -0
  391. package/templates/agent-contract/claude-code.md +40 -0
  392. package/templates/agent-contract/generic.md +38 -0
  393. package/dist/core/embedding/embed-normalize.d.ts +0 -28
  394. package/dist/core/embedding/embed-normalize.js +0 -98
  395. package/dist/core/embedding/embed-normalize.js.map +0 -1
  396. package/dist/core/storage/pg-tx-context.d.ts +0 -52
  397. package/dist/core/storage/pg-tx-context.js +0 -149
  398. package/dist/core/storage/pg-tx-context.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ ## NLM Memory
2
+
3
+ NLM indexes every AI session across all connected runtimes and surfaces relevant prior context automatically. The rules below govern how to use it.
4
+
5
+ ### When to recall
6
+
7
+ Pull memory at these moments, not just when the phrasing sounds historical:
8
+
9
+ - **Task start.** Before starting substantive work, call `recall_sessions` on the task's subject. Prior sessions routinely contain decisions and dead ends that change the approach.
10
+ - **Before re-deriving a decision.** If you are about to reason out something that has plausibly been settled before (an architecture choice, a tool selection, a naming decision), check first. Re-derivation is how agents silently contradict prior work.
11
+ - **Unfamiliar references.** When the user mentions a project, system, client, or entity you do not recognize from the current conversation, recall it before asking the user or guessing.
12
+ - **After compaction.** When the conversation has been summarized or compacted, re-pull the sessions and facts relevant to the active task; the summary dropped detail you may need.
13
+
14
+ Call `recall_sessions` before answering whenever the prompt references past work, prior decisions, or unresolved questions. Examples that should trigger recall:
15
+
16
+ - Decision questions: "what did we decide about X", "where did we land on X", "what was the conclusion"
17
+ - Status questions: "what's still open on X", "where did we leave X", "is X done"
18
+ - History questions: "have I worked on X", "when did we last do X", "did we already do X"
19
+ - Implicit references: "that X thing", "the discussion about X", "our approach to X"
20
+
21
+ Do not recall when the request is purely forward-looking with no plausible prior context: drafting wholly new content, brainstorming greenfield ideas, naming something new.
22
+
23
+ ### The pointer block
24
+
25
+ At session start, NLM's hooks inject a pointer block listing possibly-relevant sessions with their ids and labels. Read this block first. It arrives once per session: NLM does not inject memory on every prompt, so mid-conversation memory access is your job via the recall tools. When a session looks relevant, call `get_session` to fetch its full transcript before drawing on it.
26
+
27
+ ### MCP tools
28
+
29
+ - **`recall_sessions(query)`** - keyword search over session labels, decisions, entities, and summaries. Call this first when the user references prior work.
30
+ - **`get_session(id)`** - fetch one session's full transcript by its id. Call this after `recall_sessions` when a result digest looks relevant and you need the exact wording or full reasoning.
31
+ - **`recall_facts(query, subject?, predicate?)`** - look up a specific structured fact by free-text query, optionally narrowed by subject or predicate (endpoint, model, port, framework choice, owner). Prefer this over `recall_sessions` when the user wants the direct answer, not the surrounding conversation.
32
+ - **`cite_session(id)`** - record that a surfaced session changed your response. See Citation below.
33
+
34
+ ### Citation
35
+
36
+ Call `cite_session(id)` after writing your response, once per session you actually drew from. A session counts as used if it changed the answer or you read its full transcript via `get_session`. Do not cite sessions you scanned and found irrelevant. Citations feed the recall precision metric, which measures whether surfaced sessions are actually useful.
37
+
38
+ ### Trust boundaries
39
+
40
+ Recall results are hints, not sources of truth. Verify any path, file location, hostname, port, or identifier surfaced by recall against your project's canonical configuration before acting on it. A recalled value that conflicts with the project config is stale; the config wins.
@@ -0,0 +1,38 @@
1
+ # NLM Memory Agent Contract
2
+
3
+ NLM indexes AI sessions across all connected runtimes and surfaces relevant prior context at the start of each conversation. Use this contract to configure any agent that has access to the NLM MCP tools.
4
+
5
+ ## When to recall
6
+
7
+ Pull memory at these moments, not just when the phrasing sounds historical:
8
+
9
+ - **Task start.** Before starting substantive work, search prior sessions on the task's subject. Prior sessions routinely contain decisions and dead ends that change the approach.
10
+ - **Before re-deriving a decision.** If you are about to reason out something that has plausibly been settled before (an architecture choice, a tool selection, a naming decision), check first. Re-derivation is how agents silently contradict prior work.
11
+ - **Unfamiliar references.** When the user mentions a project, system, client, or entity you do not recognize from the current conversation, recall it before asking the user or guessing.
12
+ - **After compaction.** When the conversation has been summarized or compacted, re-pull the sessions and facts relevant to the active task; the summary dropped detail you may need.
13
+
14
+ Search prior sessions before answering whenever the user prompt references past work, prior decisions, or unresolved questions. The clearest triggers: "what did we decide about X", "where did we land on X", "what's still open on X", "have we tried X". Implicit references ("that auth approach", "the thing we built for the client last month") are the dangerous case and the most costly to miss.
15
+
16
+ Do not recall when the request is purely forward-looking with no plausible prior context: drafting wholly new content, brainstorming greenfield ideas, naming something new.
17
+
18
+ ## The pointer block
19
+
20
+ At session start, NLM's hooks inject a block listing possibly-relevant sessions with their ids and labels. Read this block first. It arrives once per session: NLM does not inject memory on every prompt, so mid-conversation recall is your job via the MCP tools. When a session looks relevant, call `get_session` to fetch its full transcript before drawing on it.
21
+
22
+ ## MCP tools
23
+
24
+ `recall_sessions(query)` searches session labels, decisions, entities, and summaries. Call this first when the user references prior work.
25
+
26
+ `get_session(id)` fetches one session's full transcript by its id. Call this after `recall_sessions` when a result looks relevant and you need the exact wording or full reasoning.
27
+
28
+ `recall_facts(query, subject?, predicate?)` looks up a specific structured fact: endpoint, model, port, framework choice, owner, deadline. Prefer this over `recall_sessions` when the user wants the direct answer, not the surrounding conversation.
29
+
30
+ `cite_session(id)` records that a surfaced session changed your response. See Citation below.
31
+
32
+ ## Citation
33
+
34
+ Call `cite_session(id)` after writing your response, once per session you actually drew from. A session counts as used if it changed the answer or you read its full transcript via `get_session`. Do not cite sessions you scanned and found irrelevant. Citations feed the recall precision metric, which measures whether the sessions NLM surfaces are actually useful.
35
+
36
+ ## Trust boundaries
37
+
38
+ Recall results are hints, not sources of truth. Verify any path, file location, hostname, port, or identifier surfaced by recall against your project's canonical configuration before acting on it. A recalled value that conflicts with the project config is stale; the config wins.
@@ -1,28 +0,0 @@
1
- /**
2
- * embed-normalize — one-shot migration: L2-normalize every row in
3
- * session_embeddings. Ports `embed_normalize.py`.
4
- *
5
- * vec0 with implicit L2 distance ranks correctly by cosine similarity
6
- * only when stored vectors are unit-length. New writes (post-this-fix)
7
- * are normalized at source by OllamaClient.embed; this module brings
8
- * existing rows to the same invariant.
9
- *
10
- * Idempotent: re-running on already-normalized vectors is a no-op
11
- * within float tolerance (EPS = 1e-3). Each row is rewritten in its
12
- * own transaction so interrupts are safe.
13
- */
14
- export interface NormalizeOptions {
15
- readonly dbPath: string;
16
- readonly dim?: number;
17
- readonly batchSize?: number;
18
- readonly dryRun?: boolean;
19
- }
20
- export interface NormalizeReport {
21
- readonly total: number;
22
- readonly alreadyNormalized: number;
23
- readonly rewritten: number;
24
- readonly zeroVector: number;
25
- readonly dbMissing: boolean;
26
- readonly dryRun: boolean;
27
- }
28
- export declare function normalizeEmbeddings(opts: NormalizeOptions): NormalizeReport;
@@ -1,98 +0,0 @@
1
- /**
2
- * embed-normalize — one-shot migration: L2-normalize every row in
3
- * session_embeddings. Ports `embed_normalize.py`.
4
- *
5
- * vec0 with implicit L2 distance ranks correctly by cosine similarity
6
- * only when stored vectors are unit-length. New writes (post-this-fix)
7
- * are normalized at source by OllamaClient.embed; this module brings
8
- * existing rows to the same invariant.
9
- *
10
- * Idempotent: re-running on already-normalized vectors is a no-op
11
- * within float tolerance (EPS = 1e-3). Each row is rewritten in its
12
- * own transaction so interrupts are safe.
13
- */
14
- import { existsSync } from "node:fs";
15
- import Database from "better-sqlite3";
16
- import * as sqliteVec from "sqlite-vec";
17
- const EPS = 1e-3;
18
- const DEFAULT_DIM = 768;
19
- const DEFAULT_BATCH = 100;
20
- function bytesToFloats(buf, dim) {
21
- if (buf.byteLength !== dim * 4) {
22
- throw new Error(`expected ${dim * 4} bytes, got ${buf.byteLength}`);
23
- }
24
- return new Float32Array(buf.buffer, buf.byteOffset, dim);
25
- }
26
- function floatsToBytes(vec) {
27
- return Buffer.from(vec.buffer, vec.byteOffset, vec.byteLength);
28
- }
29
- export function normalizeEmbeddings(opts) {
30
- const dim = opts.dim ?? DEFAULT_DIM;
31
- const batchSize = opts.batchSize ?? DEFAULT_BATCH;
32
- const dryRun = opts.dryRun ?? false;
33
- if (!existsSync(opts.dbPath)) {
34
- return { total: 0, alreadyNormalized: 0, rewritten: 0, zeroVector: 0, dbMissing: true, dryRun };
35
- }
36
- const db = new Database(opts.dbPath);
37
- sqliteVec.load(db);
38
- let total = 0;
39
- let alreadyNormalized = 0;
40
- let rewritten = 0;
41
- let zeroVector = 0;
42
- try {
43
- const ids = db
44
- .prepare("SELECT session_id FROM session_embeddings")
45
- .all()
46
- .map((r) => r.session_id);
47
- total = ids.length;
48
- const sel = db.prepare("SELECT session_id, embedding FROM session_embeddings WHERE session_id = ?");
49
- const del = db.prepare("DELETE FROM session_embeddings WHERE session_id = ?");
50
- const ins = db.prepare("INSERT INTO session_embeddings (session_id, embedding) VALUES (?, ?)");
51
- for (let start = 0; start < total; start += batchSize) {
52
- const batch = ids.slice(start, start + batchSize);
53
- for (const sid of batch) {
54
- const row = sel.get(sid);
55
- if (!row)
56
- continue;
57
- const vec = bytesToFloats(row.embedding, dim);
58
- let sumSq = 0;
59
- for (let i = 0; i < dim; i++) {
60
- const v = vec[i] ?? 0;
61
- sumSq += v * v;
62
- }
63
- if (sumSq === 0) {
64
- zeroVector += 1;
65
- continue;
66
- }
67
- const norm = Math.sqrt(sumSq);
68
- if (Math.abs(norm - 1) <= EPS) {
69
- alreadyNormalized += 1;
70
- continue;
71
- }
72
- if (dryRun) {
73
- rewritten += 1;
74
- continue;
75
- }
76
- const normalized = new Float32Array(dim);
77
- for (let i = 0; i < dim; i++) {
78
- normalized[i] = (vec[i] ?? 0) / norm;
79
- }
80
- del.run(sid);
81
- ins.run(sid, floatsToBytes(normalized));
82
- rewritten += 1;
83
- }
84
- }
85
- }
86
- finally {
87
- db.close();
88
- }
89
- return {
90
- total,
91
- alreadyNormalized,
92
- rewritten,
93
- zeroVector,
94
- dbMissing: false,
95
- dryRun,
96
- };
97
- }
98
- //# sourceMappingURL=embed-normalize.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embed-normalize.js","sourceRoot":"","sources":["../../../src/core/embedding/embed-normalize.ts"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- /**
2
- * PgTxContext — write-queue for PgStorage.withTransaction.
3
- *
4
- * PgStorage.withTransaction requires a sync callback (port contract). PG
5
- * transactions are async. Bridge: sync callback queues SQL ops; PgStorage
6
- * flushes the queue in one BEGIN/COMMIT after the callback returns.
7
- *
8
- * Read methods throw — they cannot see uncommitted queue state. The
9
- * FactStore/SessionStore contracts never read inside withTransaction.
10
- */
11
- import type { FactListFilter, FactQuery, FactSemanticNeighbor, FactStore } from "../../ports/fact-store.js";
12
- import type { KeywordNeighbor, SemanticNeighbor, SessionFilter, SessionStore } from "../../ports/session-store.js";
13
- import type { Fact, FactHistoryChain, Session, SessionStatus } from "../../shared/types.js";
14
- export interface QueuedOp {
15
- readonly sql: string;
16
- readonly params: readonly unknown[];
17
- }
18
- export declare class PgTxBoundFactStore implements FactStore {
19
- private readonly q;
20
- constructor(q: QueuedOp[]);
21
- insert(fact: Fact): Promise<void>;
22
- insertMany(facts: ReadonlyArray<Fact>): Promise<void>;
23
- markSuperseded(oldId: string, newId: string | null): Promise<void>;
24
- retire(factId: string): Promise<void>;
25
- ingestSessionFacts(sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
26
- upsertEmbedding(factId: string, vector: Float32Array): Promise<void>;
27
- getById(_id: string): Promise<Fact | null>;
28
- getByIds(_ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
29
- findCurrent(_s: string, _p: string): Promise<Fact | null>;
30
- list(_q: FactQuery): Promise<ReadonlyArray<Fact>>;
31
- listBySession(_id: string): Promise<ReadonlyArray<Fact>>;
32
- listForRecall(_f: FactListFilter): Promise<ReadonlyArray<Fact>>;
33
- semanticSearch(_v: Float32Array, _n: number): Promise<ReadonlyArray<FactSemanticNeighbor>>;
34
- getHistory(_s: string, _p?: string): Promise<ReadonlyArray<FactHistoryChain>>;
35
- corroborationCounts(_t: ReadonlyArray<{
36
- subject: string;
37
- predicate: string;
38
- value: string;
39
- }>): Promise<Map<string, number>>;
40
- }
41
- export declare class PgTxBoundSessionStore implements SessionStore {
42
- private readonly q;
43
- constructor(q: QueuedOp[]);
44
- updateStatus(sessionId: string, status: SessionStatus): Promise<void>;
45
- markSuperseded(predecessorId: string, successorId: string): Promise<void>;
46
- list(_filter?: SessionFilter): Promise<ReadonlyArray<Session>>;
47
- getById(_id: string): Promise<Session | null>;
48
- getByIds(_ids: ReadonlyArray<string>): Promise<ReadonlyArray<Session>>;
49
- semanticSearch(_v: Float32Array, _n: number): Promise<ReadonlyArray<SemanticNeighbor>>;
50
- keywordSearch(_q: string, _n: number): Promise<ReadonlyArray<KeywordNeighbor>>;
51
- resolveSuccessors(_ids: ReadonlyArray<string>): Promise<Map<string, string>>;
52
- }
@@ -1,149 +0,0 @@
1
- /**
2
- * PgTxContext — write-queue for PgStorage.withTransaction.
3
- *
4
- * PgStorage.withTransaction requires a sync callback (port contract). PG
5
- * transactions are async. Bridge: sync callback queues SQL ops; PgStorage
6
- * flushes the queue in one BEGIN/COMMIT after the callback returns.
7
- *
8
- * Read methods throw — they cannot see uncommitted queue state. The
9
- * FactStore/SessionStore contracts never read inside withTransaction.
10
- */
11
- function noRead(method) {
12
- throw new Error(`PgStorage.withTransaction: ${method} read not supported inside sync callback`);
13
- }
14
- export class PgTxBoundFactStore {
15
- q;
16
- constructor(q) {
17
- this.q = q;
18
- }
19
- insert(fact) {
20
- this.q.push(insertFactOp(fact));
21
- return Promise.resolve();
22
- }
23
- insertMany(facts) {
24
- for (const f of facts)
25
- this.q.push(insertFactOp(f));
26
- return Promise.resolve();
27
- }
28
- markSuperseded(oldId, newId) {
29
- this.q.push({
30
- sql: "UPDATE facts SET superseded_by = $1 WHERE id = $2",
31
- params: [newId, oldId],
32
- });
33
- return Promise.resolve();
34
- }
35
- retire(factId) {
36
- this.q.push({
37
- sql: "UPDATE facts SET retired_at = $1 WHERE id = $2",
38
- params: [new Date().toISOString(), factId],
39
- });
40
- this.q.push({
41
- sql: "DELETE FROM fact_embeddings WHERE fact_id = $1",
42
- params: [factId],
43
- });
44
- return Promise.resolve();
45
- }
46
- ingestSessionFacts(sessionId, facts) {
47
- this.q.push({
48
- sql: "DELETE FROM facts WHERE source_session_id = $1",
49
- params: [sessionId],
50
- });
51
- for (const f of facts)
52
- this.q.push(insertFactOp(f));
53
- if (facts.length > 0) {
54
- const values = facts
55
- .map((_, i) => `($${i * 3 + 1}, $${i * 3 + 2}, $${i * 3 + 3})`)
56
- .join(", ");
57
- const params = [];
58
- for (const f of facts)
59
- params.push(f.subject, f.predicate, f.id);
60
- this.q.push({
61
- sql: `
62
- UPDATE facts AS old
63
- SET superseded_by = new_f.new_id
64
- FROM (VALUES ${values}) AS new_f(subject, predicate, new_id)
65
- WHERE old.subject = new_f.subject
66
- AND old.predicate = new_f.predicate
67
- AND old.superseded_by IS NULL
68
- AND old.id != new_f.new_id
69
- `,
70
- params,
71
- });
72
- }
73
- return Promise.resolve();
74
- }
75
- upsertEmbedding(factId, vector) {
76
- this.q.push({
77
- sql: `
78
- INSERT INTO fact_embeddings (fact_id, embedding)
79
- VALUES ($1, $2)
80
- ON CONFLICT (fact_id) DO UPDATE SET embedding = EXCLUDED.embedding
81
- `,
82
- params: [factId, `[${Array.from(vector).join(",")}]`],
83
- });
84
- return Promise.resolve();
85
- }
86
- getById(_id) { return noRead("FactStore.getById"); }
87
- getByIds(_ids) { return noRead("FactStore.getByIds"); }
88
- findCurrent(_s, _p) { return noRead("FactStore.findCurrent"); }
89
- list(_q) { return noRead("FactStore.list"); }
90
- listBySession(_id) { return noRead("FactStore.listBySession"); }
91
- listForRecall(_f) { return noRead("FactStore.listForRecall"); }
92
- semanticSearch(_v, _n) { return noRead("FactStore.semanticSearch"); }
93
- getHistory(_s, _p) { return noRead("FactStore.getHistory"); }
94
- corroborationCounts(_t) {
95
- return noRead("FactStore.corroborationCounts");
96
- }
97
- }
98
- export class PgTxBoundSessionStore {
99
- q;
100
- constructor(q) {
101
- this.q = q;
102
- }
103
- updateStatus(sessionId, status) {
104
- if (status === "idle") {
105
- throw new Error("Cannot persist derived status 'idle'");
106
- }
107
- this.q.push({
108
- sql: "UPDATE sessions SET status = $1, updated_at = NOW() WHERE id = $2",
109
- params: [status, sessionId],
110
- });
111
- return Promise.resolve();
112
- }
113
- markSuperseded(predecessorId, successorId) {
114
- this.q.push({
115
- sql: `
116
- INSERT INTO session_edges (from_session, to_session, kind)
117
- VALUES ($1, $2, 'supersedes')
118
- ON CONFLICT DO NOTHING
119
- `,
120
- params: [successorId, predecessorId],
121
- });
122
- this.q.push({
123
- sql: "UPDATE sessions SET status = 'superseded', updated_at = NOW() WHERE id = $1",
124
- params: [predecessorId],
125
- });
126
- return Promise.resolve();
127
- }
128
- list(_filter) { return noRead("SessionStore.list"); }
129
- getById(_id) { return noRead("SessionStore.getById"); }
130
- getByIds(_ids) { return noRead("SessionStore.getByIds"); }
131
- semanticSearch(_v, _n) { return noRead("SessionStore.semanticSearch"); }
132
- keywordSearch(_q, _n) { return noRead("SessionStore.keywordSearch"); }
133
- resolveSuccessors(_ids) { return noRead("SessionStore.resolveSuccessors"); }
134
- }
135
- function insertFactOp(f) {
136
- return {
137
- sql: `
138
- INSERT INTO facts (
139
- id, kind, subject, predicate, value, source_session_id,
140
- source_quote, created_at, superseded_by, confidence
141
- ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
142
- `,
143
- params: [
144
- f.id, f.kind, f.subject, f.predicate, f.value,
145
- f.sourceSessionId, f.sourceQuote, f.createdAt, f.supersededBy, f.confidence,
146
- ],
147
- };
148
- }
149
- //# sourceMappingURL=pg-tx-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pg-tx-context.js","sourceRoot":"","sources":["../../../src/core/storage/pg-tx-context.ts"],"names":[],"mappings":"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"}