nlm-memory 0.20.1 → 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 (475) hide show
  1. package/README.md +69 -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 +69 -4
  5. package/dist/cli/digest.js.map +1 -1
  6. package/dist/cli/nlm.d.ts +14 -0
  7. package/dist/cli/nlm.js +556 -71
  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-backfill.d.ts +34 -0
  13. package/dist/cli/scope-backfill.js +237 -0
  14. package/dist/cli/scope-backfill.js.map +1 -0
  15. package/dist/cli/scope-coverage.d.ts +44 -0
  16. package/dist/cli/scope-coverage.js +208 -0
  17. package/dist/cli/scope-coverage.js.map +1 -0
  18. package/dist/cli/supersede.js +8 -7
  19. package/dist/cli/supersede.js.map +1 -1
  20. package/dist/core/actions/actions-log.d.ts +65 -8
  21. package/dist/core/actions/actions-log.js +134 -17
  22. package/dist/core/actions/actions-log.js.map +1 -1
  23. package/dist/core/actions/overlay.d.ts +11 -2
  24. package/dist/core/actions/overlay.js +18 -6
  25. package/dist/core/actions/overlay.js.map +1 -1
  26. package/dist/core/adapters/claude-code.d.ts +14 -0
  27. package/dist/core/adapters/claude-code.js +30 -0
  28. package/dist/core/adapters/claude-code.js.map +1 -1
  29. package/dist/core/adapters/from-source.js +11 -3
  30. package/dist/core/adapters/from-source.js.map +1 -1
  31. package/dist/core/adapters/fs-wiki-writer.d.ts +44 -0
  32. package/dist/core/adapters/fs-wiki-writer.js +132 -0
  33. package/dist/core/adapters/fs-wiki-writer.js.map +1 -0
  34. package/dist/core/adapters/hermes-agent.d.ts +15 -2
  35. package/dist/core/adapters/hermes-agent.js +57 -11
  36. package/dist/core/adapters/hermes-agent.js.map +1 -1
  37. package/dist/core/adapters/memory-wiki-writer.d.ts +8 -0
  38. package/dist/core/adapters/memory-wiki-writer.js +16 -0
  39. package/dist/core/adapters/memory-wiki-writer.js.map +1 -0
  40. package/dist/core/adapters/muse.d.ts +51 -0
  41. package/dist/core/adapters/muse.js +271 -0
  42. package/dist/core/adapters/muse.js.map +1 -0
  43. package/dist/core/adapters/opencode.d.ts +11 -4
  44. package/dist/core/adapters/opencode.js +41 -7
  45. package/dist/core/adapters/opencode.js.map +1 -1
  46. package/dist/core/alerts/alert-state.d.ts +17 -0
  47. package/dist/core/alerts/alert-state.js +45 -0
  48. package/dist/core/alerts/alert-state.js.map +1 -0
  49. package/dist/core/alerts/check-and-alert.d.ts +28 -0
  50. package/dist/core/alerts/check-and-alert.js +53 -0
  51. package/dist/core/alerts/check-and-alert.js.map +1 -0
  52. package/dist/core/alerts/drift-transition.d.ts +27 -0
  53. package/dist/core/alerts/drift-transition.js +56 -0
  54. package/dist/core/alerts/drift-transition.js.map +1 -0
  55. package/dist/core/alerts/embedder-transition.d.ts +23 -0
  56. package/dist/core/alerts/embedder-transition.js +40 -0
  57. package/dist/core/alerts/embedder-transition.js.map +1 -0
  58. package/dist/core/alerts/fire-alert.d.ts +24 -0
  59. package/dist/core/alerts/fire-alert.js +72 -0
  60. package/dist/core/alerts/fire-alert.js.map +1 -0
  61. package/dist/core/alerts/job-alert.d.ts +12 -0
  62. package/dist/core/alerts/job-alert.js +37 -0
  63. package/dist/core/alerts/job-alert.js.map +1 -0
  64. package/dist/core/alerts/types.d.ts +104 -0
  65. package/dist/core/alerts/types.js +11 -0
  66. package/dist/core/alerts/types.js.map +1 -0
  67. package/dist/core/alerts/wiki-alert.d.ts +15 -0
  68. package/dist/core/alerts/wiki-alert.js +31 -0
  69. package/dist/core/alerts/wiki-alert.js.map +1 -0
  70. package/dist/core/classifier/prompt.d.ts +13 -0
  71. package/dist/core/classifier/prompt.js +52 -2
  72. package/dist/core/classifier/prompt.js.map +1 -1
  73. package/dist/core/dataset/build-dataset.d.ts +16 -1
  74. package/dist/core/dataset/build-dataset.js +46 -13
  75. package/dist/core/dataset/build-dataset.js.map +1 -1
  76. package/dist/core/digest/compose.d.ts +11 -3
  77. package/dist/core/digest/compose.js +70 -17
  78. package/dist/core/digest/compose.js.map +1 -1
  79. package/dist/core/digest/hook-injection.d.ts +43 -0
  80. package/dist/core/digest/hook-injection.js +87 -0
  81. package/dist/core/digest/hook-injection.js.map +1 -0
  82. package/dist/core/digest/hook-version-parity.d.ts +31 -0
  83. package/dist/core/digest/hook-version-parity.js +56 -0
  84. package/dist/core/digest/hook-version-parity.js.map +1 -0
  85. package/dist/core/embedding/pg-embed-backfill.js +1 -1
  86. package/dist/core/embedding/pg-embed-backfill.js.map +1 -1
  87. package/dist/core/exemplars/capture-from-session.d.ts +2 -1
  88. package/dist/core/exemplars/capture-from-session.js +4 -4
  89. package/dist/core/exemplars/capture-from-session.js.map +1 -1
  90. package/dist/core/exemplars/embed-backfill.d.ts +9 -0
  91. package/dist/core/exemplars/embed-backfill.js +9 -1
  92. package/dist/core/exemplars/embed-backfill.js.map +1 -1
  93. package/dist/core/exemplars/extract-exemplar.d.ts +2 -0
  94. package/dist/core/exemplars/extract-exemplar.js +7 -1
  95. package/dist/core/exemplars/extract-exemplar.js.map +1 -1
  96. package/dist/core/exemplars/ingest-exemplar.d.ts +1 -0
  97. package/dist/core/exemplars/ingest-exemplar.js +1 -0
  98. package/dist/core/exemplars/ingest-exemplar.js.map +1 -1
  99. package/dist/core/exemplars/recall-code.d.ts +1 -1
  100. package/dist/core/exemplars/recall-code.js +2 -2
  101. package/dist/core/exemplars/recall-code.js.map +1 -1
  102. package/dist/core/facts/backfill-facts.d.ts +1 -1
  103. package/dist/core/facts/backfill-facts.js +4 -4
  104. package/dist/core/facts/backfill-facts.js.map +1 -1
  105. package/dist/core/facts/embed-backfill.d.ts +54 -0
  106. package/dist/core/facts/embed-backfill.js +109 -0
  107. package/dist/core/facts/embed-backfill.js.map +1 -0
  108. package/dist/core/facts/reconcile-facts.d.ts +42 -0
  109. package/dist/core/facts/reconcile-facts.js +133 -0
  110. package/dist/core/facts/reconcile-facts.js.map +1 -0
  111. package/dist/core/health/embed-failure-state.d.ts +4 -0
  112. package/dist/core/health/embed-failure-state.js +12 -0
  113. package/dist/core/health/embed-failure-state.js.map +1 -0
  114. package/dist/core/health/warmup-retry.d.ts +27 -0
  115. package/dist/core/health/warmup-retry.js +53 -0
  116. package/dist/core/health/warmup-retry.js.map +1 -0
  117. package/dist/core/health/warmup-state.d.ts +15 -0
  118. package/dist/core/health/warmup-state.js +15 -1
  119. package/dist/core/health/warmup-state.js.map +1 -1
  120. package/dist/core/hook/cite-memo.d.ts +11 -7
  121. package/dist/core/hook/cite-memo.js +25 -17
  122. package/dist/core/hook/cite-memo.js.map +1 -1
  123. package/dist/core/hook/claude-settings.d.ts +1 -1
  124. package/dist/core/hook/claude-settings.js +0 -1
  125. package/dist/core/hook/claude-settings.js.map +1 -1
  126. package/dist/core/hook/hook-log.d.ts +13 -2
  127. package/dist/core/hook/hook-log.js +16 -8
  128. package/dist/core/hook/hook-log.js.map +1 -1
  129. package/dist/core/hook/memo.d.ts +10 -6
  130. package/dist/core/hook/memo.js +25 -17
  131. package/dist/core/hook/memo.js.map +1 -1
  132. package/dist/core/hook/pointer-block.d.ts +8 -1
  133. package/dist/core/hook/pointer-block.js +17 -4
  134. package/dist/core/hook/pointer-block.js.map +1 -1
  135. package/dist/core/hook/resolve-conversation-by-query.d.ts +6 -5
  136. package/dist/core/hook/resolve-conversation-by-query.js +24 -12
  137. package/dist/core/hook/resolve-conversation-by-query.js.map +1 -1
  138. package/dist/core/ingest/backfill-derivables.d.ts +92 -0
  139. package/dist/core/ingest/backfill-derivables.js +175 -0
  140. package/dist/core/ingest/backfill-derivables.js.map +1 -0
  141. package/dist/core/ingest/ingest-session.d.ts +1 -1
  142. package/dist/core/ingest/ingest-session.js +23 -3
  143. package/dist/core/ingest/ingest-session.js.map +1 -1
  144. package/dist/core/ingest/reclassify-oversized.d.ts +1 -1
  145. package/dist/core/ingest/reclassify-oversized.js +8 -2
  146. package/dist/core/ingest/reclassify-oversized.js.map +1 -1
  147. package/dist/core/ingest/reprocess.d.ts +1 -1
  148. package/dist/core/ingest/reprocess.js +7 -2
  149. package/dist/core/ingest/reprocess.js.map +1 -1
  150. package/dist/core/ingest/transcript-derivables.d.ts +27 -0
  151. package/dist/core/ingest/transcript-derivables.js +138 -0
  152. package/dist/core/ingest/transcript-derivables.js.map +1 -0
  153. package/dist/core/jobs/job-supervisor.d.ts +168 -0
  154. package/dist/core/jobs/job-supervisor.js +335 -0
  155. package/dist/core/jobs/job-supervisor.js.map +1 -0
  156. package/dist/core/learner/model.d.ts +63 -0
  157. package/dist/core/learner/model.js +30 -0
  158. package/dist/core/learner/model.js.map +1 -0
  159. package/dist/core/learner/service.d.ts +42 -0
  160. package/dist/core/learner/service.js +74 -0
  161. package/dist/core/learner/service.js.map +1 -0
  162. package/dist/core/learner/summary.d.ts +28 -0
  163. package/dist/core/learner/summary.js +70 -0
  164. package/dist/core/learner/summary.js.map +1 -0
  165. package/dist/core/learner/validate.d.ts +18 -0
  166. package/dist/core/learner/validate.js +95 -0
  167. package/dist/core/learner/validate.js.map +1 -0
  168. package/dist/core/metrics/re-derivation.d.ts +31 -2
  169. package/dist/core/metrics/re-derivation.js +36 -4
  170. package/dist/core/metrics/re-derivation.js.map +1 -1
  171. package/dist/core/outcome/coverage.d.ts +33 -0
  172. package/dist/core/outcome/coverage.js +46 -0
  173. package/dist/core/outcome/coverage.js.map +1 -0
  174. package/dist/core/outcome/rollup.d.ts +33 -0
  175. package/dist/core/outcome/rollup.js +113 -0
  176. package/dist/core/outcome/rollup.js.map +1 -0
  177. package/dist/core/providers/provider-registry.d.ts +40 -23
  178. package/dist/core/providers/provider-registry.js +99 -81
  179. package/dist/core/providers/provider-registry.js.map +1 -1
  180. package/dist/core/recall/citation-log.d.ts +10 -5
  181. package/dist/core/recall/citation-log.js +21 -10
  182. package/dist/core/recall/citation-log.js.map +1 -1
  183. package/dist/core/recall/hook-recall-log.d.ts +7 -4
  184. package/dist/core/recall/hook-recall-log.js +14 -8
  185. package/dist/core/recall/hook-recall-log.js.map +1 -1
  186. package/dist/core/recall/miss-log.d.ts +7 -4
  187. package/dist/core/recall/miss-log.js +18 -11
  188. package/dist/core/recall/miss-log.js.map +1 -1
  189. package/dist/core/recall/query-log.d.ts +8 -5
  190. package/dist/core/recall/query-log.js +16 -9
  191. package/dist/core/recall/query-log.js.map +1 -1
  192. package/dist/core/recall/recall-service.d.ts +10 -1
  193. package/dist/core/recall/recall-service.js +31 -12
  194. package/dist/core/recall/recall-service.js.map +1 -1
  195. package/dist/core/recall/recent-log.d.ts +6 -1
  196. package/dist/core/recall/recent-log.js +13 -5
  197. package/dist/core/recall/recent-log.js.map +1 -1
  198. package/dist/core/recall/related-concepts.d.ts +29 -0
  199. package/dist/core/recall/related-concepts.js +67 -0
  200. package/dist/core/recall/related-concepts.js.map +1 -0
  201. package/dist/core/recall/related-exemplars.d.ts +1 -1
  202. package/dist/core/recall/related-exemplars.js +2 -2
  203. package/dist/core/recall/related-exemplars.js.map +1 -1
  204. package/dist/core/recall/related-facts.d.ts +1 -1
  205. package/dist/core/recall/related-facts.js +3 -3
  206. package/dist/core/recall/related-facts.js.map +1 -1
  207. package/dist/core/recall-facts/fact-query-log.d.ts +8 -4
  208. package/dist/core/recall-facts/fact-query-log.js +16 -8
  209. package/dist/core/recall-facts/fact-query-log.js.map +1 -1
  210. package/dist/core/recall-facts/fact-recall-service.d.ts +2 -2
  211. package/dist/core/recall-facts/fact-recall-service.js +13 -12
  212. package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
  213. package/dist/core/scheduler/scan-once.js +15 -12
  214. package/dist/core/scheduler/scan-once.js.map +1 -1
  215. package/dist/core/scheduler/scheduler.d.ts +3 -0
  216. package/dist/core/scheduler/scheduler.js +45 -10
  217. package/dist/core/scheduler/scheduler.js.map +1 -1
  218. package/dist/core/scope/alias-map.d.ts +10 -0
  219. package/dist/core/scope/alias-map.js +41 -0
  220. package/dist/core/scope/alias-map.js.map +1 -0
  221. package/dist/core/scope/derive-scope.d.ts +8 -0
  222. package/dist/core/scope/derive-scope.js +54 -0
  223. package/dist/core/scope/derive-scope.js.map +1 -0
  224. package/dist/core/scope/scope-clause.d.ts +16 -0
  225. package/dist/core/scope/scope-clause.js +21 -0
  226. package/dist/core/scope/scope-clause.js.map +1 -0
  227. package/dist/core/scope/stamp-flag.d.ts +1 -0
  228. package/dist/core/scope/stamp-flag.js +4 -0
  229. package/dist/core/scope/stamp-flag.js.map +1 -0
  230. package/dist/core/signals/code-signal.d.ts +1 -0
  231. package/dist/core/signals/code-signal.js +1 -0
  232. package/dist/core/signals/code-signal.js.map +1 -1
  233. package/dist/core/signals/failure-mode-recall.d.ts +1 -1
  234. package/dist/core/signals/failure-mode-recall.js +2 -2
  235. package/dist/core/signals/failure-mode-recall.js.map +1 -1
  236. package/dist/core/signals/ingest-signal.d.ts +1 -1
  237. package/dist/core/signals/ingest-signal.js +3 -1
  238. package/dist/core/signals/ingest-signal.js.map +1 -1
  239. package/dist/core/signals/stamp-scope.d.ts +18 -0
  240. package/dist/core/signals/stamp-scope.js +28 -0
  241. package/dist/core/signals/stamp-scope.js.map +1 -0
  242. package/dist/core/sources/source-registry.d.ts +49 -28
  243. package/dist/core/sources/source-registry.js +113 -70
  244. package/dist/core/sources/source-registry.js.map +1 -1
  245. package/dist/core/storage/pg-code-exemplar-store.d.ts +19 -10
  246. package/dist/core/storage/pg-code-exemplar-store.js +62 -27
  247. package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
  248. package/dist/core/storage/pg-entity-store.d.ts +6 -1
  249. package/dist/core/storage/pg-entity-store.js +33 -18
  250. package/dist/core/storage/pg-entity-store.js.map +1 -1
  251. package/dist/core/storage/pg-fact-ingest.d.ts +1 -1
  252. package/dist/core/storage/pg-fact-ingest.js +10 -7
  253. package/dist/core/storage/pg-fact-ingest.js.map +1 -1
  254. package/dist/core/storage/pg-fact-store.d.ts +29 -17
  255. package/dist/core/storage/pg-fact-store.js +99 -46
  256. package/dist/core/storage/pg-fact-store.js.map +1 -1
  257. package/dist/core/storage/pg-learner-store.d.ts +27 -0
  258. package/dist/core/storage/pg-learner-store.js +174 -0
  259. package/dist/core/storage/pg-learner-store.js.map +1 -0
  260. package/dist/core/storage/pg-session-store.d.ts +25 -21
  261. package/dist/core/storage/pg-session-store.js +186 -114
  262. package/dist/core/storage/pg-session-store.js.map +1 -1
  263. package/dist/core/storage/pg-signal-store.d.ts +10 -5
  264. package/dist/core/storage/pg-signal-store.js +26 -13
  265. package/dist/core/storage/pg-signal-store.js.map +1 -1
  266. package/dist/core/storage/pg-storage.d.ts +4 -0
  267. package/dist/core/storage/pg-storage.js +6 -0
  268. package/dist/core/storage/pg-storage.js.map +1 -1
  269. package/dist/core/storage/pg-workstream-store.d.ts +17 -11
  270. package/dist/core/storage/pg-workstream-store.js +47 -29
  271. package/dist/core/storage/pg-workstream-store.js.map +1 -1
  272. package/dist/core/storage/sqlite-code-exemplar-store.d.ts +24 -10
  273. package/dist/core/storage/sqlite-code-exemplar-store.js +86 -40
  274. package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
  275. package/dist/core/storage/sqlite-entity-store.d.ts +8 -1
  276. package/dist/core/storage/sqlite-entity-store.js +46 -27
  277. package/dist/core/storage/sqlite-entity-store.js.map +1 -1
  278. package/dist/core/storage/sqlite-fact-store.d.ts +45 -19
  279. package/dist/core/storage/sqlite-fact-store.js +175 -64
  280. package/dist/core/storage/sqlite-fact-store.js.map +1 -1
  281. package/dist/core/storage/sqlite-learner-store.d.ts +33 -0
  282. package/dist/core/storage/sqlite-learner-store.js +178 -0
  283. package/dist/core/storage/sqlite-learner-store.js.map +1 -0
  284. package/dist/core/storage/sqlite-outcome-store.d.ts +104 -0
  285. package/dist/core/storage/sqlite-outcome-store.js +211 -0
  286. package/dist/core/storage/sqlite-outcome-store.js.map +1 -0
  287. package/dist/core/storage/sqlite-session-store.d.ts +50 -21
  288. package/dist/core/storage/sqlite-session-store.js +233 -149
  289. package/dist/core/storage/sqlite-session-store.js.map +1 -1
  290. package/dist/core/storage/sqlite-signal-store.d.ts +12 -5
  291. package/dist/core/storage/sqlite-signal-store.js +29 -15
  292. package/dist/core/storage/sqlite-signal-store.js.map +1 -1
  293. package/dist/core/storage/sqlite-storage.d.ts +4 -0
  294. package/dist/core/storage/sqlite-storage.js +10 -2
  295. package/dist/core/storage/sqlite-storage.js.map +1 -1
  296. package/dist/core/storage/sqlite-workstream-store.d.ts +17 -11
  297. package/dist/core/storage/sqlite-workstream-store.js +53 -31
  298. package/dist/core/storage/sqlite-workstream-store.js.map +1 -1
  299. package/dist/core/storage/supersedence-log.d.ts +10 -7
  300. package/dist/core/storage/supersedence-log.js +21 -14
  301. package/dist/core/storage/supersedence-log.js.map +1 -1
  302. package/dist/core/telemetry/probe-filter.d.ts +35 -0
  303. package/dist/core/telemetry/probe-filter.js +56 -0
  304. package/dist/core/telemetry/probe-filter.js.map +1 -0
  305. package/dist/core/tenancy/default-team.d.ts +6 -0
  306. package/dist/core/tenancy/default-team.js +7 -0
  307. package/dist/core/tenancy/default-team.js.map +1 -0
  308. package/dist/core/tenancy/hosted-mode.d.ts +9 -0
  309. package/dist/core/tenancy/hosted-mode.js +12 -0
  310. package/dist/core/tenancy/hosted-mode.js.map +1 -0
  311. package/dist/core/tenancy/team-auth.d.ts +16 -0
  312. package/dist/core/tenancy/team-auth.js +22 -0
  313. package/dist/core/tenancy/team-auth.js.map +1 -0
  314. package/dist/core/tenancy/team-token-store.d.ts +45 -0
  315. package/dist/core/tenancy/team-token-store.js +52 -0
  316. package/dist/core/tenancy/team-token-store.js.map +1 -0
  317. package/dist/core/tenancy/tenant-clause.d.ts +37 -0
  318. package/dist/core/tenancy/tenant-clause.js +11 -0
  319. package/dist/core/tenancy/tenant-clause.js.map +1 -0
  320. package/dist/core/tenancy/tenant-state-path.d.ts +28 -0
  321. package/dist/core/tenancy/tenant-state-path.js +49 -0
  322. package/dist/core/tenancy/tenant-state-path.js.map +1 -0
  323. package/dist/core/update-check/check.d.ts +6 -0
  324. package/dist/core/update-check/check.js +35 -0
  325. package/dist/core/update-check/check.js.map +1 -1
  326. package/dist/core/wiki/project.d.ts +17 -0
  327. package/dist/core/wiki/project.js +37 -0
  328. package/dist/core/wiki/project.js.map +1 -0
  329. package/dist/core/wiki/reconcile.d.ts +15 -0
  330. package/dist/core/wiki/reconcile.js +14 -0
  331. package/dist/core/wiki/reconcile.js.map +1 -0
  332. package/dist/core/wiki/render.d.ts +5 -0
  333. package/dist/core/wiki/render.js +84 -0
  334. package/dist/core/wiki/render.js.map +1 -0
  335. package/dist/core/wiki/rollup.d.ts +28 -0
  336. package/dist/core/wiki/rollup.js +91 -0
  337. package/dist/core/wiki/rollup.js.map +1 -0
  338. package/dist/core/wiki/select.d.ts +8 -0
  339. package/dist/core/wiki/select.js +7 -0
  340. package/dist/core/wiki/select.js.map +1 -0
  341. package/dist/core/wiki/slug.d.ts +36 -0
  342. package/dist/core/wiki/slug.js +71 -0
  343. package/dist/core/wiki/slug.js.map +1 -0
  344. package/dist/core/wiki/types.d.ts +37 -0
  345. package/dist/core/wiki/types.js +2 -0
  346. package/dist/core/wiki/types.js.map +1 -0
  347. package/dist/core/work-digest/build-work-digest.d.ts +1 -1
  348. package/dist/core/work-digest/build-work-digest.js +3 -3
  349. package/dist/core/work-digest/build-work-digest.js.map +1 -1
  350. package/dist/core/workstream/bind.d.ts +3 -2
  351. package/dist/core/workstream/bind.js +29 -10
  352. package/dist/core/workstream/bind.js.map +1 -1
  353. package/dist/core/workstream/model.d.ts +1 -0
  354. package/dist/core/workstream/model.js.map +1 -1
  355. package/dist/core/workstream/rollup.d.ts +1 -1
  356. package/dist/core/workstream/rollup.js +6 -6
  357. package/dist/core/workstream/rollup.js.map +1 -1
  358. package/dist/hook/hook-helpers.d.ts +14 -0
  359. package/dist/hook/hook-helpers.js +29 -2
  360. package/dist/hook/hook-helpers.js.map +1 -1
  361. package/dist/hook/pre-compact-hook.js +8 -5
  362. package/dist/hook/pre-compact-hook.js.map +1 -1
  363. package/dist/hook/prompt-recall-hook.d.ts +7 -3
  364. package/dist/hook/prompt-recall-hook.js +35 -20
  365. package/dist/hook/prompt-recall-hook.js.map +1 -1
  366. package/dist/hook/recall-over-http.d.ts +28 -3
  367. package/dist/hook/recall-over-http.js +58 -12
  368. package/dist/hook/recall-over-http.js.map +1 -1
  369. package/dist/hook/session-end-hook.js +7 -5
  370. package/dist/hook/session-end-hook.js.map +1 -1
  371. package/dist/hook/session-start-hook.d.ts +14 -1
  372. package/dist/hook/session-start-hook.js +57 -16
  373. package/dist/hook/session-start-hook.js.map +1 -1
  374. package/dist/hook/stop-hook.js +11 -8
  375. package/dist/hook/stop-hook.js.map +1 -1
  376. package/dist/http/app.d.ts +47 -3
  377. package/dist/http/app.js +379 -132
  378. package/dist/http/app.js.map +1 -1
  379. package/dist/install/claude-code.d.ts +17 -0
  380. package/dist/install/claude-code.js +44 -5
  381. package/dist/install/claude-code.js.map +1 -1
  382. package/dist/install/codex.d.ts +23 -2
  383. package/dist/install/codex.js +111 -14
  384. package/dist/install/codex.js.map +1 -1
  385. package/dist/install/cursor.d.ts +2 -2
  386. package/dist/install/cursor.js +7 -7
  387. package/dist/install/cursor.js.map +1 -1
  388. package/dist/install/hermes.d.ts +8 -0
  389. package/dist/install/hermes.js +28 -5
  390. package/dist/install/hermes.js.map +1 -1
  391. package/dist/install/local-source.d.ts +20 -0
  392. package/dist/install/local-source.js +28 -0
  393. package/dist/install/local-source.js.map +1 -0
  394. package/dist/install/mcp-block.d.ts +77 -0
  395. package/dist/install/mcp-block.js +99 -0
  396. package/dist/install/mcp-block.js.map +1 -0
  397. package/dist/install/pi.d.ts +26 -0
  398. package/dist/install/pi.js +43 -0
  399. package/dist/install/pi.js.map +1 -1
  400. package/dist/install/setup.js +6 -0
  401. package/dist/install/setup.js.map +1 -1
  402. package/dist/install/windsurf.d.ts +2 -2
  403. package/dist/install/windsurf.js +7 -7
  404. package/dist/install/windsurf.js.map +1 -1
  405. package/dist/llm/classifier-box.d.ts +5 -0
  406. package/dist/llm/classifier-box.js +5 -0
  407. package/dist/llm/classifier-box.js.map +1 -1
  408. package/dist/mcp/server.d.ts +94 -15
  409. package/dist/mcp/server.js +402 -79
  410. package/dist/mcp/server.js.map +1 -1
  411. package/dist/ports/clock.d.ts +12 -0
  412. package/dist/ports/clock.js +10 -0
  413. package/dist/ports/clock.js.map +1 -0
  414. package/dist/ports/code-exemplar-store.d.ts +13 -13
  415. package/dist/ports/entity-store.d.ts +5 -1
  416. package/dist/ports/fact-store.d.ts +0 -0
  417. package/dist/ports/fact-store.js +0 -0
  418. package/dist/ports/fact-store.js.map +1 -1
  419. package/dist/ports/learner-store.d.ts +80 -0
  420. package/dist/ports/learner-store.js +19 -0
  421. package/dist/ports/learner-store.js.map +1 -0
  422. package/dist/ports/outcome.d.ts +85 -0
  423. package/dist/ports/outcome.js +11 -0
  424. package/dist/ports/outcome.js.map +1 -0
  425. package/dist/ports/session-store.d.ts +20 -20
  426. package/dist/ports/session-store.js +5 -0
  427. package/dist/ports/session-store.js.map +1 -1
  428. package/dist/ports/signal-store.d.ts +12 -8
  429. package/dist/ports/spawn-child.d.ts +14 -0
  430. package/dist/ports/spawn-child.js +10 -0
  431. package/dist/ports/spawn-child.js.map +1 -0
  432. package/dist/ports/storage.d.ts +6 -0
  433. package/dist/ports/transcript-adapter.d.ts +11 -0
  434. package/dist/ports/wiki-writer.d.ts +19 -0
  435. package/dist/ports/wiki-writer.js +12 -0
  436. package/dist/ports/wiki-writer.js.map +1 -0
  437. package/dist/ports/workstream-store.d.ts +20 -12
  438. package/dist/shared/net.d.ts +3 -0
  439. package/dist/shared/net.js +4 -0
  440. package/dist/shared/net.js.map +1 -0
  441. package/dist/shared/types.d.ts +55 -0
  442. package/dist/shared/types.js +4 -1
  443. package/dist/shared/types.js.map +1 -1
  444. package/dist/shared/version.d.ts +9 -0
  445. package/dist/shared/version.js +11 -0
  446. package/dist/shared/version.js.map +1 -0
  447. package/dist/ui/assets/index-D6F3xAis.js +11 -0
  448. package/dist/ui/index.html +1 -1
  449. package/migrations/029_project_scope.sql +21 -0
  450. package/migrations/032_session_derivables.sql +11 -0
  451. package/migrations/033_actions_kind_check.sql +58 -0
  452. package/migrations/034_tenancy_teams_and_stamps.sql +40 -0
  453. package/migrations/035_tenancy_entity_rekey.sql +75 -0
  454. package/migrations/036_tenant_name_uniqueness.sql +59 -0
  455. package/migrations/037_sessions_covering_index.sql +25 -0
  456. package/migrations/038_sources_muse.sql +33 -0
  457. package/migrations/039_learner_evidence.sql +51 -0
  458. package/migrations/pg/030_project_scope.sql +23 -0
  459. package/migrations/pg/031_widen_session_edges_kind.sql +11 -0
  460. package/migrations/pg/032_session_derivables.sql +17 -0
  461. package/migrations/pg/033_actions_kind_check.sql +17 -0
  462. package/migrations/pg/034_tenancy.sql +77 -0
  463. package/migrations/pg/035_tenant_name_uniqueness.sql +15 -0
  464. package/migrations/pg/036_sources_muse.sql +12 -0
  465. package/migrations/pg/037_learner_evidence.sql +55 -0
  466. package/nlm/index.js +258 -59
  467. package/package.json +10 -5
  468. package/plugin/.codex-plugin/plugin.json +1 -1
  469. package/plugin/scripts/prompt-recall-hook.mjs +256 -58
  470. package/plugin/scripts/session-start-hook.mjs +283 -55
  471. package/plugin/scripts/stop-hook.mjs +199 -38
  472. package/dist/hook/subagent-start-hook.d.ts +0 -28
  473. package/dist/hook/subagent-start-hook.js +0 -81
  474. package/dist/hook/subagent-start-hook.js.map +0 -1
  475. package/dist/ui/assets/index-CMpQkbQy.js +0 -11
@@ -1,8 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/hook/stop-hook.ts
4
- import { pathToFileURL } from "node:url";
5
-
6
3
  // src/core/hook/citation-detect.ts
7
4
  var MIN_ID_LEN = 6;
8
5
  function detectCitations(input) {
@@ -102,18 +99,48 @@ import {
102
99
  statSync,
103
100
  writeFileSync
104
101
  } from "node:fs";
102
+ import { join as join2 } from "node:path";
103
+
104
+ // src/core/tenancy/tenant-state-path.ts
105
+ import { createHash } from "node:crypto";
105
106
  import { homedir } from "node:os";
106
107
  import { join } from "node:path";
107
- function stateDir() {
108
- return process.env["NLM_HOOK_STATE_DIR"] ?? join(homedir(), ".nlm", "hook-state");
108
+
109
+ // src/core/tenancy/default-team.ts
110
+ var DEFAULT_TEAM_ID = "team_local";
111
+
112
+ // src/core/tenancy/tenant-state-path.ts
113
+ var TENANTS_DIRNAME = "tenants";
114
+ var SAFE_TENANT_ID = /^[A-Za-z0-9_-]+$/;
115
+ function sanitizeTenantId(tenantId) {
116
+ if (SAFE_TENANT_ID.test(tenantId)) return tenantId;
117
+ const sanitized = tenantId.replace(/[^A-Za-z0-9_-]/g, "_") || "unknown";
118
+ const hash = createHash("sha256").update(tenantId).digest("hex").slice(0, 8);
119
+ return `${sanitized}_${hash}`;
120
+ }
121
+ function stateRoot() {
122
+ return process.env["NLM_STATE_ROOT"] || join(homedir(), ".nlm");
123
+ }
124
+ function tenantStatePath(tenantId, ...segments) {
125
+ const base = stateRoot();
126
+ if (tenantId === DEFAULT_TEAM_ID) return join(base, ...segments);
127
+ return join(base, TENANTS_DIRNAME, sanitizeTenantId(tenantId), ...segments);
109
128
  }
110
- function memoPath(conversationId) {
129
+
130
+ // src/core/hook/memo.ts
131
+ function stateDir(tenantId) {
132
+ if (tenantId === DEFAULT_TEAM_ID) {
133
+ return process.env["NLM_HOOK_STATE_DIR"] ?? tenantStatePath(tenantId, "hook-state");
134
+ }
135
+ return tenantStatePath(tenantId, "hook-state");
136
+ }
137
+ function memoPath(tenantId, conversationId) {
111
138
  const safe = conversationId.replace(/[^A-Za-z0-9_-]/g, "_") || "unknown";
112
- return join(stateDir(), `${safe}.json`);
139
+ return join2(stateDir(tenantId), `${safe}.json`);
113
140
  }
114
- function loadSurfaced(conversationId) {
141
+ function loadSurfaced(tenantId, conversationId) {
115
142
  try {
116
- const path = memoPath(conversationId);
143
+ const path = memoPath(tenantId, conversationId);
117
144
  if (!existsSync(path)) return /* @__PURE__ */ new Set();
118
145
  const parsed = JSON.parse(readFileSync(path, "utf8"));
119
146
  if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
@@ -125,18 +152,20 @@ function loadSurfaced(conversationId) {
125
152
 
126
153
  // src/core/hook/cite-memo.ts
127
154
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, rmSync as rmSync2, writeFileSync as writeFileSync2 } from "node:fs";
128
- import { homedir as homedir2 } from "node:os";
129
- import { join as join2 } from "node:path";
130
- function stateDir2() {
131
- return process.env["NLM_HOOK_STATE_DIR"] ?? join2(homedir2(), ".nlm", "hook-state");
155
+ import { join as join3 } from "node:path";
156
+ function stateDir2(tenantId) {
157
+ if (tenantId === DEFAULT_TEAM_ID) {
158
+ return process.env["NLM_HOOK_STATE_DIR"] ?? tenantStatePath(tenantId, "hook-state");
159
+ }
160
+ return tenantStatePath(tenantId, "hook-state");
132
161
  }
133
- function memoPath2(conversationId) {
162
+ function memoPath2(tenantId, conversationId) {
134
163
  const safe = conversationId.replace(/[^A-Za-z0-9_-]/g, "_") || "unknown";
135
- return join2(stateDir2(), `${safe}.cited.json`);
164
+ return join3(stateDir2(tenantId), `${safe}.cited.json`);
136
165
  }
137
- function loadCited(conversationId) {
166
+ function loadCited(tenantId, conversationId) {
138
167
  try {
139
- const path = memoPath2(conversationId);
168
+ const path = memoPath2(tenantId, conversationId);
140
169
  if (!existsSync2(path)) return /* @__PURE__ */ new Set();
141
170
  const parsed = JSON.parse(readFileSync2(path, "utf8"));
142
171
  if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
@@ -145,33 +174,35 @@ function loadCited(conversationId) {
145
174
  return /* @__PURE__ */ new Set();
146
175
  }
147
176
  }
148
- function recordCited(conversationId, ids) {
177
+ function recordCited(tenantId, conversationId, ids) {
149
178
  if (ids.length === 0) return;
150
179
  try {
151
- const merged = loadCited(conversationId);
180
+ const merged = loadCited(tenantId, conversationId);
152
181
  for (const id of ids) merged.add(id);
153
- mkdirSync2(stateDir2(), { recursive: true });
154
- writeFileSync2(memoPath2(conversationId), JSON.stringify([...merged]), "utf8");
182
+ mkdirSync2(stateDir2(tenantId), { recursive: true });
183
+ writeFileSync2(memoPath2(tenantId, conversationId), JSON.stringify([...merged]), "utf8");
155
184
  } catch {
156
185
  }
157
186
  }
158
187
 
159
188
  // src/core/recall/miss-log.ts
160
189
  import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
161
- import { dirname, join as join3 } from "node:path";
162
- import { homedir as homedir3 } from "node:os";
163
- function defaultLogPath() {
164
- return process.env["NLM_MISS_LOG"] ?? join3(homedir3(), ".nlm", "miss-log.jsonl");
190
+ import { dirname } from "node:path";
191
+ function defaultLogPath(tenantId) {
192
+ if (tenantId === DEFAULT_TEAM_ID) {
193
+ return process.env["NLM_MISS_LOG"] ?? tenantStatePath(tenantId, "miss-log.jsonl");
194
+ }
195
+ return tenantStatePath(tenantId, "miss-log.jsonl");
165
196
  }
166
197
  function isEnabled() {
167
198
  const raw = process.env["NLM_MISS_LOG_ENABLED"];
168
199
  if (raw === void 0) return true;
169
200
  return raw !== "0" && raw.toLowerCase() !== "false";
170
201
  }
171
- async function appendMisses(entries, logPath) {
202
+ async function appendMisses(tenantId, entries, logPath) {
172
203
  if (!isEnabled()) return;
173
204
  if (entries.length === 0) return;
174
- const path = logPath ?? defaultLogPath();
205
+ const path = logPath ?? defaultLogPath(tenantId);
175
206
  try {
176
207
  await mkdir(dirname(path), { recursive: true });
177
208
  const ts = (/* @__PURE__ */ new Date()).toISOString();
@@ -244,7 +275,7 @@ function readAllAssistantTurns(transcriptPath) {
244
275
 
245
276
  // src/llm/env-autoload.ts
246
277
  import { readFileSync as readFileSync3, existsSync as existsSync4 } from "node:fs";
247
- import { homedir as homedir4 } from "node:os";
278
+ import { homedir as homedir2 } from "node:os";
248
279
  import { resolve } from "node:path";
249
280
  var DEFAULT_SEARCH_PATHS = [
250
281
  "~/.nlm/.env",
@@ -253,7 +284,7 @@ var DEFAULT_SEARCH_PATHS = [
253
284
  "../../.env"
254
285
  ];
255
286
  function expandHome(p) {
256
- if (p.startsWith("~/")) return resolve(homedir4(), p.slice(2));
287
+ if (p.startsWith("~/")) return resolve(homedir2(), p.slice(2));
257
288
  return p;
258
289
  }
259
290
  function autoloadEnv(extraPaths = []) {
@@ -293,9 +324,135 @@ function hookAuthHeaders(extra = {}) {
293
324
  }
294
325
 
295
326
  // src/hook/hook-helpers.ts
296
- import { appendFileSync, mkdirSync as mkdirSync3 } from "node:fs";
297
- import { homedir as homedir5 } from "node:os";
327
+ import { appendFileSync, mkdirSync as mkdirSync3, realpathSync } from "node:fs";
328
+ import { homedir as homedir3 } from "node:os";
298
329
  import { dirname as dirname2, join as join4 } from "node:path";
330
+ import { pathToFileURL } from "node:url";
331
+
332
+ // package.json
333
+ var package_default = {
334
+ name: "nlm-memory",
335
+ version: "0.21.12",
336
+ description: "Local-first non-linear memory operating system for AI operators.",
337
+ type: "module",
338
+ license: "Apache-2.0",
339
+ engines: {
340
+ node: ">=22.0.0"
341
+ },
342
+ repository: {
343
+ type: "git",
344
+ url: "git+https://github.com/pbmagnet4/nlm-memory.git"
345
+ },
346
+ homepage: "https://github.com/pbmagnet4/nlm-memory#readme",
347
+ bugs: {
348
+ url: "https://github.com/pbmagnet4/nlm-memory/issues"
349
+ },
350
+ keywords: [
351
+ "ai",
352
+ "memory",
353
+ "mcp",
354
+ "claude-code",
355
+ "codex",
356
+ "hermes",
357
+ "local-first",
358
+ "recall",
359
+ "session-memory"
360
+ ],
361
+ files: [
362
+ "dist",
363
+ "migrations",
364
+ "fixtures",
365
+ "templates",
366
+ "plugin",
367
+ "plugin-hermes-agent",
368
+ "nlm",
369
+ "assets",
370
+ "LICENSE",
371
+ "README.md"
372
+ ],
373
+ bin: {
374
+ nlm: "dist/cli/nlm.js"
375
+ },
376
+ scripts: {
377
+ dev: "tsx watch src/cli/nlm.ts start",
378
+ start: "node dist/cli/nlm.js start",
379
+ "build:server": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
380
+ "build:ui": "vite build --config src/ui/vite.config.ts",
381
+ "build:codex-plugin": "node scripts/build-codex-plugin.mjs",
382
+ "verify:codex-release": "node scripts/verify-codex-release.mjs",
383
+ build: "npm run build:server && npm run build:ui && npm run build:codex-plugin",
384
+ prepare: "[ -d src ] && npm run build || true",
385
+ "ui:dev": "vite --config src/ui/vite.config.ts",
386
+ test: "vitest run",
387
+ "test:watch": "vitest",
388
+ "test:unit": "vitest run tests/unit",
389
+ "test:integration": "vitest run tests/integration",
390
+ "test:pg": "vitest run .pg.test.ts --test-timeout=20000",
391
+ typecheck: "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json && tsc -p tsconfig.scripts.json",
392
+ "bench:longmemeval": "tsx scripts/longmemeval/run-harness.ts",
393
+ "bench:classifier": "tsx scripts/longmemeval/run-harness.ts --classifier",
394
+ "bench:compare": "tsx scripts/longmemeval/compare-classifiers.ts",
395
+ "eval:signals": "tsx scripts/eval/signals-eval.ts",
396
+ "eval:classifier": "tsx scripts/eval/classifier-eval.ts",
397
+ "eval:fact-recall": "tsx scripts/eval/fact-recall-eval.ts",
398
+ "eval:recall-impact-replay": "tsx scripts/eval/recall-impact-replay.ts",
399
+ "eval:code-exemplar": "tsx scripts/eval/code-exemplar-eval.ts",
400
+ "eval:reranker": "tsx scripts/eval/reranker-ablation.ts",
401
+ "eval:floor": "tsx scripts/eval/floor-calibration.ts",
402
+ "eval:matcher": "tsx scripts/eval/tune-matcher.ts",
403
+ "eval:naming": "tsx scripts/eval/tune-naming.ts",
404
+ "eval:rederiv-sample": "tsx scripts/eval/re-derivation-sample.ts",
405
+ "eval:rederiv-label": "tsx scripts/eval/re-derivation-label.ts",
406
+ "eval:rederiv-calibrate": "tsx scripts/eval/re-derivation-calibrate.ts"
407
+ },
408
+ dependencies: {
409
+ "@clack/prompts": "^1.4.0",
410
+ "@hono/node-server": "^2.0.3",
411
+ "@huggingface/transformers": "4.2.0",
412
+ "@modelcontextprotocol/sdk": "^1.29.0",
413
+ "@toon-format/toon": "^2.3.0",
414
+ "better-sqlite3": "^13.0.1",
415
+ commander: "^15.0.0",
416
+ hono: "^4.6.0",
417
+ pg: "^8.21.0",
418
+ pgvector: "^0.3.0",
419
+ "sqlite-vec": "^0.1.6",
420
+ yaml: "^2.9.0",
421
+ zod: "^4.4.3"
422
+ },
423
+ devDependencies: {
424
+ "@types/better-sqlite3": "^7.6.13",
425
+ "@types/node": "^22.10.0",
426
+ "@types/pg": "^8.20.0",
427
+ "@types/react": "^19.2.17",
428
+ "@types/react-dom": "^19.2.3",
429
+ "@vitejs/plugin-react": "^6.0.2",
430
+ esbuild: "^0.28.0",
431
+ react: "^19.2.7",
432
+ "react-dom": "^19.2.7",
433
+ "react-router-dom": "^6.30.3",
434
+ "tsc-alias": "^1.8.17",
435
+ tsx: "^4.19.0",
436
+ typescript: "^6.0.3",
437
+ vite: "^8.0.16",
438
+ vitest: "^4.1.8"
439
+ }
440
+ };
441
+
442
+ // src/shared/version.ts
443
+ var NLM_VERSION = package_default.version;
444
+
445
+ // src/hook/hook-helpers.ts
446
+ function isMainModule(metaUrl, argv1) {
447
+ if (!argv1) return false;
448
+ let resolved;
449
+ try {
450
+ resolved = realpathSync(argv1);
451
+ } catch {
452
+ return false;
453
+ }
454
+ return metaUrl === pathToFileURL(resolved).href;
455
+ }
299
456
  function readStdin() {
300
457
  return new Promise((resolve2) => {
301
458
  let data = "";
@@ -319,14 +476,17 @@ function hookModeFromEnv() {
319
476
  }
320
477
  function appendHookEvent(data) {
321
478
  try {
322
- const path = process.env["NLM_HOOK_LOG"] ?? join4(homedir5(), ".nlm", "hook-log.jsonl");
479
+ const path = process.env["NLM_HOOK_LOG"] ?? join4(homedir3(), ".nlm", "hook-log.jsonl");
323
480
  mkdirSync3(dirname2(path), { recursive: true });
324
- appendFileSync(path, `${JSON.stringify(data)}
481
+ appendFileSync(path, `${JSON.stringify({ ...data, v: NLM_VERSION })}
325
482
  `, "utf8");
326
483
  } catch {
327
484
  }
328
485
  }
329
486
 
487
+ // src/shared/net.ts
488
+ var DEFAULT_NLM_PORT = "3940";
489
+
330
490
  // src/hook/stop-hook.ts
331
491
  var RESPONSE_PREVIEW_CHARS = 200;
332
492
  var POST_TIMEOUT_MS = 1500;
@@ -340,7 +500,7 @@ async function runStopHook(input, deps) {
340
500
  skipped: true
341
501
  };
342
502
  }
343
- const surfaced = loadSurfaced(input.conversationId);
503
+ const surfaced = loadSurfaced(DEFAULT_TEAM_ID, input.conversationId);
344
504
  if (surfaced.size === 0) {
345
505
  return {
346
506
  conversationId: input.conversationId,
@@ -372,11 +532,12 @@ async function runStopHook(input, deps) {
372
532
  toolUses: allToolUses,
373
533
  surfacedIds: surfaced
374
534
  });
375
- const alreadyCited = loadCited(input.conversationId);
535
+ const alreadyCited = loadCited(DEFAULT_TEAM_ID, input.conversationId);
376
536
  const fresh = detected.filter((c) => !alreadyCited.has(c.id));
377
537
  const misses = detectMisses({ toolUses: allToolUses, surfacedIds: surfaced });
378
538
  if (misses.length > 0) {
379
539
  void appendMisses(
540
+ DEFAULT_TEAM_ID,
380
541
  misses.map((m) => ({
381
542
  conversationId: input.conversationId,
382
543
  missedId: m.id,
@@ -391,7 +552,7 @@ async function runStopHook(input, deps) {
391
552
  fresh.map((c) => deps.postCitation(input.conversationId, c.id, c.kind, preview))
392
553
  );
393
554
  if (fresh.length > 0) {
394
- recordCited(input.conversationId, fresh.map((c) => c.id));
555
+ recordCited(DEFAULT_TEAM_ID, input.conversationId, fresh.map((c) => c.id));
395
556
  }
396
557
  return {
397
558
  conversationId: input.conversationId,
@@ -414,7 +575,7 @@ function logStopResult(result) {
414
575
  });
415
576
  }
416
577
  async function postCitationOverHttp(conversationId, citedId, kind, responsePreview) {
417
- const port = process.env["NLM_PORT"] ?? "3940";
578
+ const port = process.env["NLM_PORT"] ?? DEFAULT_NLM_PORT;
418
579
  const url = `http://127.0.0.1:${port}/api/recall/cite-event`;
419
580
  await fetchWithTimeout(url, {
420
581
  method: "POST",
@@ -443,7 +604,7 @@ async function main() {
443
604
  } catch {
444
605
  }
445
606
  }
446
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
607
+ if (isMainModule(import.meta.url, process.argv[1])) {
447
608
  void main();
448
609
  }
449
610
  export {
@@ -1,28 +0,0 @@
1
- /**
2
- * Claude Code SubagentStart hook entrypoint for NLM.
3
- *
4
- * Fires when Claude Code dispatches a subagent (Agent tool). Subagents have
5
- * their own session IDs but are invisible to NLM's session corpus today.
6
- * This hook captures the parent→subagent link so NLM can correlate subagent
7
- * transcripts back to the dispatching conversation when SessionEnd fires.
8
- *
9
- * Capture-only. No recall injection — subagents inherit context from their
10
- * dispatch prompt; additional recall would pollute their narrow task scope.
11
- *
12
- * Daemon endpoint: POST /api/hook/subagent-start
13
- *
14
- * Payload: { parent_conversation_id, subagent_session_id, subagent_description, ts }
15
- *
16
- * Fail-open by design: any error yields a clean exit with no output.
17
- */
18
- export interface SubagentStartInput {
19
- readonly parentConversationId: string;
20
- readonly subagentSessionId: string;
21
- readonly subagentDescription: string;
22
- }
23
- export interface SubagentStartResult {
24
- readonly parentConversationId: string;
25
- readonly subagentSessionId: string;
26
- readonly posted: boolean;
27
- }
28
- export declare function runSubagentStart(input: SubagentStartInput, portValue?: string): Promise<SubagentStartResult>;
@@ -1,81 +0,0 @@
1
- /**
2
- * Claude Code SubagentStart hook entrypoint for NLM.
3
- *
4
- * Fires when Claude Code dispatches a subagent (Agent tool). Subagents have
5
- * their own session IDs but are invisible to NLM's session corpus today.
6
- * This hook captures the parent→subagent link so NLM can correlate subagent
7
- * transcripts back to the dispatching conversation when SessionEnd fires.
8
- *
9
- * Capture-only. No recall injection — subagents inherit context from their
10
- * dispatch prompt; additional recall would pollute their narrow task scope.
11
- *
12
- * Daemon endpoint: POST /api/hook/subagent-start
13
- *
14
- * Payload: { parent_conversation_id, subagent_session_id, subagent_description, ts }
15
- *
16
- * Fail-open by design: any error yields a clean exit with no output.
17
- */
18
- import { pathToFileURL } from "node:url";
19
- import { autoloadEnv } from "../llm/env-autoload.js";
20
- import { hookAuthHeaders } from "./hook-auth.js";
21
- import { readStdin, fetchWithTimeout, appendHookEvent } from "./hook-helpers.js";
22
- const POST_TIMEOUT_MS = 1500;
23
- export async function runSubagentStart(input, portValue = process.env["NLM_PORT"] ?? "3940") {
24
- const payload = {
25
- parent_conversation_id: input.parentConversationId,
26
- subagent_session_id: input.subagentSessionId,
27
- subagent_description: input.subagentDescription,
28
- ts: new Date().toISOString(),
29
- };
30
- try {
31
- const res = await fetchWithTimeout(`http://127.0.0.1:${portValue}/api/hook/subagent-start`, {
32
- method: "POST",
33
- headers: hookAuthHeaders({ "content-type": "application/json" }),
34
- body: JSON.stringify(payload),
35
- }, POST_TIMEOUT_MS);
36
- return {
37
- parentConversationId: input.parentConversationId,
38
- subagentSessionId: input.subagentSessionId,
39
- posted: res.ok,
40
- };
41
- }
42
- catch {
43
- return {
44
- parentConversationId: input.parentConversationId,
45
- subagentSessionId: input.subagentSessionId,
46
- posted: false,
47
- };
48
- }
49
- }
50
- function logResult(result) {
51
- appendHookEvent({
52
- ts: new Date().toISOString(),
53
- kind: "subagent-start",
54
- parentConversationId: result.parentConversationId,
55
- subagentSessionId: result.subagentSessionId,
56
- posted: result.posted,
57
- });
58
- }
59
- async function main() {
60
- try {
61
- autoloadEnv();
62
- const raw = await readStdin();
63
- const payload = JSON.parse(raw);
64
- const subagentSessionId = typeof payload.session_id === "string" ? payload.session_id : "unknown";
65
- const parentConversationId = typeof payload.parent_session_id === "string" ? payload.parent_session_id : "unknown";
66
- const subagentDescription = typeof payload.description === "string" ? payload.description : "";
67
- const result = await runSubagentStart({
68
- parentConversationId,
69
- subagentSessionId,
70
- subagentDescription,
71
- });
72
- logResult(result);
73
- }
74
- catch {
75
- // Fail open — never block subagent dispatch.
76
- }
77
- }
78
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
79
- void main();
80
- }
81
- //# sourceMappingURL=subagent-start-hook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-start-hook.js","sourceRoot":"","sources":["../../src/hook/subagent-start-hook.ts"],"names":[],"mappings":"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"}