nlm-memory 0.5.21 → 0.6.0

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 (164) hide show
  1. package/README.md +129 -19
  2. package/dist/cli/classify-parity.js +1 -1
  3. package/dist/cli/classify-parity.js.map +1 -1
  4. package/dist/cli/nlm.js +152 -12
  5. package/dist/cli/nlm.js.map +1 -1
  6. package/dist/core/actions/overlay.d.ts +22 -0
  7. package/dist/core/actions/overlay.js +56 -0
  8. package/dist/core/actions/overlay.js.map +1 -1
  9. package/dist/core/adapters/pi.js +13 -3
  10. package/dist/core/adapters/pi.js.map +1 -1
  11. package/dist/core/classifier/prompt.d.ts +1 -1
  12. package/dist/core/classifier/prompt.js +1 -1
  13. package/dist/core/dataset/build-dataset.d.ts +14 -1
  14. package/dist/core/dataset/build-dataset.js +68 -11
  15. package/dist/core/dataset/build-dataset.js.map +1 -1
  16. package/dist/core/hook/miss-detect.d.ts +32 -0
  17. package/dist/core/hook/miss-detect.js +67 -0
  18. package/dist/core/hook/miss-detect.js.map +1 -0
  19. package/dist/core/hook/pointer-block.d.ts +12 -1
  20. package/dist/core/hook/pointer-block.js +25 -8
  21. package/dist/core/hook/pointer-block.js.map +1 -1
  22. package/dist/core/providers/provider-registry.js +1 -1
  23. package/dist/core/providers/provider-registry.js.map +1 -1
  24. package/dist/core/recall/miss-log.d.ts +47 -0
  25. package/dist/core/recall/miss-log.js +112 -0
  26. package/dist/core/recall/miss-log.js.map +1 -0
  27. package/dist/core/recall/query-log.d.ts +3 -0
  28. package/dist/core/recall/query-log.js +1 -0
  29. package/dist/core/recall/query-log.js.map +1 -1
  30. package/dist/core/recall/recall-service.d.ts +9 -0
  31. package/dist/core/recall/recall-service.js +81 -18
  32. package/dist/core/recall/recall-service.js.map +1 -1
  33. package/dist/core/recall/recency.d.ts +52 -0
  34. package/dist/core/recall/recency.js +98 -0
  35. package/dist/core/recall/recency.js.map +1 -0
  36. package/dist/core/recall/recent-log.d.ts +1 -0
  37. package/dist/core/recall/recent-log.js +1 -0
  38. package/dist/core/recall/recent-log.js.map +1 -1
  39. package/dist/core/recall/related-facts.d.ts +30 -0
  40. package/dist/core/recall/related-facts.js +134 -0
  41. package/dist/core/recall/related-facts.js.map +1 -0
  42. package/dist/core/recall/rewrite-cache.d.ts +25 -0
  43. package/dist/core/recall/rewrite-cache.js +60 -0
  44. package/dist/core/recall/rewrite-cache.js.map +1 -0
  45. package/dist/core/recall/rewrite-prompt.d.ts +23 -0
  46. package/dist/core/recall/rewrite-prompt.js +81 -0
  47. package/dist/core/recall/rewrite-prompt.js.map +1 -0
  48. package/dist/core/recall-facts/fact-recall-service.d.ts +11 -0
  49. package/dist/core/recall-facts/fact-recall-service.js +69 -4
  50. package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
  51. package/dist/core/scheduler/scheduler.d.ts +7 -0
  52. package/dist/core/scheduler/scheduler.js +26 -0
  53. package/dist/core/scheduler/scheduler.js.map +1 -1
  54. package/dist/core/signals/aggregate.d.ts +21 -0
  55. package/dist/core/signals/aggregate.js +34 -0
  56. package/dist/core/signals/aggregate.js.map +1 -0
  57. package/dist/core/signals/failure-mode-recall.d.ts +18 -0
  58. package/dist/core/signals/failure-mode-recall.js +28 -0
  59. package/dist/core/signals/failure-mode-recall.js.map +1 -0
  60. package/dist/core/signals/ingest-signal.d.ts +19 -0
  61. package/dist/core/signals/ingest-signal.js +63 -0
  62. package/dist/core/signals/ingest-signal.js.map +1 -0
  63. package/dist/core/signals/install-scope.d.ts +8 -0
  64. package/dist/core/signals/install-scope.js +41 -0
  65. package/dist/core/signals/install-scope.js.map +1 -0
  66. package/dist/core/signals/recommend.d.ts +13 -0
  67. package/dist/core/signals/recommend.js +24 -0
  68. package/dist/core/signals/recommend.js.map +1 -0
  69. package/dist/core/storage/pg-fact-store.d.ts +5 -0
  70. package/dist/core/storage/pg-fact-store.js +29 -0
  71. package/dist/core/storage/pg-fact-store.js.map +1 -1
  72. package/dist/core/storage/pg-session-store.js +16 -1
  73. package/dist/core/storage/pg-session-store.js.map +1 -1
  74. package/dist/core/storage/pg-signal-store.d.ts +16 -0
  75. package/dist/core/storage/pg-signal-store.js +100 -0
  76. package/dist/core/storage/pg-signal-store.js.map +1 -0
  77. package/dist/core/storage/pg-storage.d.ts +2 -0
  78. package/dist/core/storage/pg-storage.js +3 -0
  79. package/dist/core/storage/pg-storage.js.map +1 -1
  80. package/dist/core/storage/pg-tx-context.d.ts +5 -0
  81. package/dist/core/storage/pg-tx-context.js +3 -0
  82. package/dist/core/storage/pg-tx-context.js.map +1 -1
  83. package/dist/core/storage/sqlite-fact-store.d.ts +5 -0
  84. package/dist/core/storage/sqlite-fact-store.js +30 -0
  85. package/dist/core/storage/sqlite-fact-store.js.map +1 -1
  86. package/dist/core/storage/sqlite-session-store.d.ts +3 -0
  87. package/dist/core/storage/sqlite-session-store.js +21 -1
  88. package/dist/core/storage/sqlite-session-store.js.map +1 -1
  89. package/dist/core/storage/sqlite-signal-store.d.ts +20 -0
  90. package/dist/core/storage/sqlite-signal-store.js +112 -0
  91. package/dist/core/storage/sqlite-signal-store.js.map +1 -0
  92. package/dist/core/storage/sqlite-storage.d.ts +2 -0
  93. package/dist/core/storage/sqlite-storage.js +6 -2
  94. package/dist/core/storage/sqlite-storage.js.map +1 -1
  95. package/dist/hook/pi-extension.d.ts +3 -1
  96. package/dist/hook/pi-extension.js +4 -2
  97. package/dist/hook/pi-extension.js.map +1 -1
  98. package/dist/hook/prompt-recall-hook.d.ts +10 -1
  99. package/dist/hook/prompt-recall-hook.js +11 -5
  100. package/dist/hook/prompt-recall-hook.js.map +1 -1
  101. package/dist/hook/recall-over-http.d.ts +11 -1
  102. package/dist/hook/recall-over-http.js +21 -6
  103. package/dist/hook/recall-over-http.js.map +1 -1
  104. package/dist/hook/session-start-hook.d.ts +2 -0
  105. package/dist/hook/session-start-hook.js +36 -3
  106. package/dist/hook/session-start-hook.js.map +1 -1
  107. package/dist/hook/stop-hook.js +16 -0
  108. package/dist/hook/stop-hook.js.map +1 -1
  109. package/dist/http/app.d.ts +9 -0
  110. package/dist/http/app.js +125 -10
  111. package/dist/http/app.js.map +1 -1
  112. package/dist/install/codex.d.ts +1 -1
  113. package/dist/install/codex.js +4 -4
  114. package/dist/install/codex.js.map +1 -1
  115. package/dist/install/ollama.d.ts +10 -0
  116. package/dist/install/ollama.js +19 -3
  117. package/dist/install/ollama.js.map +1 -1
  118. package/dist/install/pi.d.ts +1 -1
  119. package/dist/install/pi.js +1 -1
  120. package/dist/install/rules-content.d.ts +51 -0
  121. package/dist/install/rules-content.js +140 -0
  122. package/dist/install/rules-content.js.map +1 -0
  123. package/dist/install/rules-install.d.ts +35 -0
  124. package/dist/install/rules-install.js +79 -0
  125. package/dist/install/rules-install.js.map +1 -0
  126. package/dist/install/setup.js +63 -10
  127. package/dist/install/setup.js.map +1 -1
  128. package/dist/llm/classifier-box.d.ts +2 -1
  129. package/dist/llm/classifier-box.js +3 -0
  130. package/dist/llm/classifier-box.js.map +1 -1
  131. package/dist/llm/deepseek-client.d.ts +5 -2
  132. package/dist/llm/deepseek-client.js +51 -1
  133. package/dist/llm/deepseek-client.js.map +1 -1
  134. package/dist/llm/ollama-client.d.ts +3 -2
  135. package/dist/llm/ollama-client.js +45 -2
  136. package/dist/llm/ollama-client.js.map +1 -1
  137. package/dist/mcp/server.d.ts +1 -0
  138. package/dist/mcp/server.js +23 -3
  139. package/dist/mcp/server.js.map +1 -1
  140. package/dist/ports/fact-store.d.ts +0 -0
  141. package/dist/ports/fact-store.js +0 -0
  142. package/dist/ports/fact-store.js.map +1 -1
  143. package/dist/ports/llm-client.d.ts +24 -0
  144. package/dist/ports/signal-store.d.ts +30 -0
  145. package/dist/ports/signal-store.js +9 -0
  146. package/dist/ports/signal-store.js.map +1 -0
  147. package/dist/ports/storage.d.ts +2 -0
  148. package/dist/ports/transcript-adapter.d.ts +6 -0
  149. package/dist/shared/types.d.ts +76 -0
  150. package/dist/ui/assets/index-CgHq6xeZ.css +1 -0
  151. package/dist/ui/assets/index-DLDd-OM_.js +69 -0
  152. package/dist/ui/index.html +2 -2
  153. package/nlm/README.md +1 -1
  154. package/nlm/index.js +46 -21
  155. package/package.json +7 -5
  156. package/plugin/.codex-plugin/plugin.json +2 -2
  157. package/plugin/README.md +3 -3
  158. package/plugin/scripts/prompt-recall-hook.mjs +45 -20
  159. package/plugin/scripts/stop-hook.mjs +80 -6
  160. package/plugin-hermes-agent/README.md +49 -0
  161. package/plugin-hermes-agent/__init__.py +75 -0
  162. package/plugin-hermes-agent/plugin.yaml +15 -0
  163. package/dist/ui/assets/index-B7j5U42U.css +0 -1
  164. package/dist/ui/assets/index-BO0dvNHn.js +0 -69
@@ -11,6 +11,9 @@
11
11
  import type { RecallKindFilter, RecallMode } from "../../shared/types.js";
12
12
  export interface LogEntry {
13
13
  readonly source: string;
14
+ /** Calling agent runtime (claude-code / hermes / pi.dev / codex / etc).
15
+ * Logged when the caller passes x-recall-runtime; null for legacy entries. */
16
+ readonly runtime: string | null;
14
17
  readonly query: string | null;
15
18
  readonly entity: string | null;
16
19
  readonly kind: RecallKindFilter | null;
@@ -20,6 +20,7 @@ export async function logQuery(entry, logPath = defaultLogPath()) {
20
20
  const payload = {
21
21
  ts: new Date().toISOString(),
22
22
  source: entry.source,
23
+ runtime: entry.runtime,
23
24
  query: entry.query,
24
25
  entity: entry.entity,
25
26
  kind: entry.kind,
@@ -1 +1 @@
1
- {"version":3,"file":"query-log.js","sourceRoot":"","sources":["../../../src/core/recall/query-log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-log.js","sourceRoot":"","sources":["../../../src/core/recall/query-log.ts"],"names":[],"mappings":"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"}
@@ -5,15 +5,24 @@
5
5
  * Depends only on ports (SessionStore, LLMClient). No framework imports,
6
6
  * no SQLite, no HTTP. Tests substitute fake adapters.
7
7
  */
8
+ import type { FactStore } from "../../ports/fact-store.js";
8
9
  import type { LLMClient } from "../../ports/llm-client.js";
9
10
  import type { SessionStore } from "../../ports/session-store.js";
10
11
  import type { RecallQuery, RecallResult } from "../../shared/types.js";
11
12
  export interface RecallServiceDeps {
12
13
  readonly store: SessionStore;
13
14
  readonly llm: LLMClient;
15
+ /**
16
+ * Spec G.2: when present, RecallService can attach `relatedFacts` to its
17
+ * results for callers that request `withRelatedFacts`. Optional — tests
18
+ * and lightweight callers (CLI debugging) can omit it without losing
19
+ * core recall functionality.
20
+ */
21
+ readonly factStore?: FactStore;
14
22
  }
15
23
  export declare class RecallService {
16
24
  private readonly deps;
25
+ private readonly rewriteCache;
17
26
  constructor(deps: RecallServiceDeps);
18
27
  search(input: RecallQuery): Promise<RecallResult>;
19
28
  }
@@ -9,9 +9,18 @@ import { LLMUnreachableError } from "../../ports/llm-client.js";
9
9
  import { applyFilter } from "./filter.js";
10
10
  import { keywordMatchFields } from "./match-fields.js";
11
11
  import { detectQueryShape } from "./query-shape.js";
12
+ import { recencyMultiplier } from "./recency.js";
13
+ import { pickRelatedFacts } from "./related-facts.js";
14
+ import { RewriteCache } from "./rewrite-cache.js";
12
15
  import { tokenSet } from "./tokenize.js";
13
16
  const DEFAULT_LIMIT = 20;
14
17
  const MAX_LIMIT = 100;
18
+ function isFactInjectionEnabled() {
19
+ const raw = process.env["NLM_HOOK_INJECT_FACTS"];
20
+ if (raw === undefined)
21
+ return true;
22
+ return raw !== "0" && raw.toLowerCase() !== "false";
23
+ }
15
24
  // Reciprocal Rank Fusion constant (Cormack et al. 2009). k=60 is the
16
25
  // canonical literature default. RRF combines ranked lists from multiple
17
26
  // retrievers by summing 1/(k + rank) per retriever, ignoring raw scores —
@@ -22,6 +31,7 @@ const SEMANTIC_OVERFETCH = 3;
22
31
  const KEYWORD_OVERFETCH = 3;
23
32
  export class RecallService {
24
33
  deps;
34
+ rewriteCache = new RewriteCache();
25
35
  constructor(deps) {
26
36
  this.deps = deps;
27
37
  }
@@ -41,15 +51,40 @@ export class RecallService {
41
51
  };
42
52
  if (!input.query && !entity && !kind)
43
53
  return empty;
54
+ // 0. Optional query rewrite. Fails open on LLM unreachable / parse error:
55
+ // keyword and semantic both fall back to the raw query, preserving
56
+ // pre-spec-C behavior. Cached for 5min to amortize repeat calls.
57
+ let keywordQuery = input.query;
58
+ let semanticQuery = input.query;
59
+ if (input.rewrite === true && input.query) {
60
+ const cached = this.rewriteCache.get(input.query);
61
+ if (cached) {
62
+ keywordQuery = cached.keywordQuery;
63
+ semanticQuery = cached.semanticQuery;
64
+ }
65
+ else {
66
+ try {
67
+ const rewritten = await this.deps.llm.rewriteForRecall(input.query);
68
+ this.rewriteCache.set(input.query, rewritten);
69
+ keywordQuery = rewritten.keywordQuery;
70
+ semanticQuery = rewritten.semanticQuery;
71
+ }
72
+ catch (err) {
73
+ if (!(err instanceof LLMUnreachableError))
74
+ throw err;
75
+ // fail-open: keywordQuery / semanticQuery already set to raw input.query
76
+ }
77
+ }
78
+ }
44
79
  // 1. Search legs — ranked neighbor IDs only. No session bodies loaded.
45
- const kwNeighbors = (mode === "keyword" || mode === "hybrid") && input.query
46
- ? await this.deps.store.keywordSearch(input.query, limit * KEYWORD_OVERFETCH)
80
+ const kwNeighbors = (mode === "keyword" || mode === "hybrid") && keywordQuery
81
+ ? await this.deps.store.keywordSearch(keywordQuery, limit * KEYWORD_OVERFETCH)
47
82
  : [];
48
83
  let semNeighbors = [];
49
84
  let semError = null;
50
- if ((mode === "semantic" || mode === "hybrid") && input.query) {
85
+ if ((mode === "semantic" || mode === "hybrid") && semanticQuery) {
51
86
  try {
52
- const embedding = await this.deps.llm.embed(input.query, "query");
87
+ const embedding = await this.deps.llm.embed(semanticQuery, "query");
53
88
  semNeighbors = await this.deps.store.semanticSearch(embedding.vector, limit * SEMANTIC_OVERFETCH);
54
89
  }
55
90
  catch (err) {
@@ -76,8 +111,10 @@ export class RecallService {
76
111
  filterArgs.kind = input.kind;
77
112
  const byId = new Map(applyFilter(hitSessions, filterArgs).map((s) => [s.id, s]));
78
113
  // 3. Build hits from the resolved sessions, preserving leg rank order.
79
- const queryTokens = input.query
80
- ? new Set(tokenSet(input.query))
114
+ // matchedIn uses the keyword (possibly rewritten) query so the badge
115
+ // reflects the tokens that actually drove the search.
116
+ const queryTokens = keywordQuery
117
+ ? new Set(tokenSet(keywordQuery))
81
118
  : new Set();
82
119
  const kwHits = [];
83
120
  for (const n of kwNeighbors) {
@@ -98,19 +135,33 @@ export class RecallService {
98
135
  semHits.push({ session, similarity: cosineFromL2(n.distance) });
99
136
  }
100
137
  // 4. Finalize per mode.
138
+ let result;
101
139
  if (mode === "keyword") {
102
- return finalize(input.query, entity, kind, mode, limit, kwHits.map(toKeywordHit));
140
+ result = finalize(input.query, entity, kind, mode, limit, kwHits.map(toKeywordHit));
141
+ }
142
+ else if (mode === "semantic") {
143
+ result = finalize(input.query, entity, kind, mode, limit, semHits.map(toSemanticHit));
103
144
  }
104
- if (mode === "semantic") {
105
- return finalize(input.query, entity, kind, mode, limit, semHits.map(toSemanticHit));
145
+ else {
146
+ const merged = mergeHybrid(kwHits, semHits);
147
+ const shape = detectQueryShape(input.query);
148
+ const forceIncluded = (shape.hasTemporal && shape.hasNamedEntity)
149
+ ? forceIncludeKeywordTop(merged, kwHits, limit)
150
+ : merged;
151
+ result = finalize(input.query, entity, kind, mode, limit, forceIncluded);
152
+ if (semError)
153
+ result = { ...result, modeUnavailable: semError };
154
+ }
155
+ // 5. Spec G.2: optionally attach high-confidence facts about top entities.
156
+ // Only runs when the caller opts in AND a FactStore is wired. Failures
157
+ // silently no-op so recall never breaks because of fact lookup.
158
+ if (input.withRelatedFacts === true && this.deps.factStore && isFactInjectionEnabled()) {
159
+ const relatedFacts = await pickRelatedFacts(result.results, this.deps.factStore);
160
+ if (relatedFacts.length > 0) {
161
+ result = { ...result, relatedFacts };
162
+ }
106
163
  }
107
- const merged = mergeHybrid(kwHits, semHits);
108
- const shape = detectQueryShape(input.query);
109
- const forceIncluded = (shape.hasTemporal && shape.hasNamedEntity)
110
- ? forceIncludeKeywordTop(merged, kwHits, limit)
111
- : merged;
112
- const result = finalize(input.query, entity, kind, mode, limit, forceIncluded);
113
- return semError ? { ...result, modeUnavailable: semError } : result;
164
+ return result;
114
165
  }
115
166
  }
116
167
  function uniqueIds(kw, sem) {
@@ -213,14 +264,26 @@ function sessionHitFields(s) {
213
264
  };
214
265
  }
215
266
  function finalize(query, entity, kind, mode, limit, hits) {
267
+ // Apply recency decay to every hit, then re-sort by adjusted score so
268
+ // newer sessions surface ahead of equally-relevant older ones. The decay
269
+ // is multiplicative; within a single query all hits use the same scale
270
+ // (BM25, similarity, or RRF) so the multiplier preserves intra-mode
271
+ // ranking when ages are similar and skews recent when ages diverge.
272
+ // Disable per-deployment with NLM_RECALL_DECAY_HALF_LIFE_DAYS=0.
273
+ const now = Date.now();
274
+ const adjusted = hits.map((h) => ({
275
+ ...h,
276
+ matchScore: round4(h.matchScore * recencyMultiplier(h.startedAt, now)),
277
+ }));
278
+ adjusted.sort((a, b) => b.matchScore - a.matchScore);
216
279
  return {
217
280
  query,
218
281
  entity,
219
282
  kind,
220
283
  mode,
221
284
  limit,
222
- total: hits.length,
223
- results: hits.slice(0, limit),
285
+ total: adjusted.length,
286
+ results: adjusted.slice(0, limit),
224
287
  };
225
288
  }
226
289
  function clampLimit(limit) {
@@ -1 +1 @@
1
- {"version":3,"file":"recall-service.js","sourceRoot":"","sources":["../../../src/core/recall/recall-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recall-service.js","sourceRoot":"","sources":["../../../src/core/recall/recall-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Recency weighting for recall scoring.
3
+ *
4
+ * Multiplies each RecallHit's matchScore by an age-decay factor so identical-
5
+ * relevance sessions sort newer-first. The factor is exponential half-life:
6
+ *
7
+ * f(age_days) = max(FLOOR, 2 ^ (-age_days / half_life_days))
8
+ *
9
+ * Default half-life: 180 days (6 months). A 180-day-old session scores 0.5×,
10
+ * a 1-year-old session scores 0.25×, an 18-month-old session scores ~0.13×.
11
+ *
12
+ * Default floor: 0.25. A truly-relevant ancient session never drops below
13
+ * a quarter of its raw score — so age alone can't push it out of top results
14
+ * if the keyword/semantic signal is strong enough.
15
+ *
16
+ * Configuration:
17
+ * NLM_RECALL_DECAY_HALF_LIFE_DAYS — override the half-life. Set to 0 to
18
+ * disable decay entirely (returns 1.0).
19
+ * NLM_RECALL_DECAY_FLOOR — override the floor (0.0 - 1.0 range).
20
+ *
21
+ * Env vars are read once at module load and cached. To change at runtime,
22
+ * call resetRecencyConfigForTest() (test-only) and reimport.
23
+ *
24
+ * Design notes:
25
+ * - Applied once at finalize() time in recall-service.ts, after per-mode
26
+ * scoring but before the limit slice. Single call-site covers keyword,
27
+ * semantic, and hybrid modes uniformly.
28
+ * - Future startedAt (clock skew) is clamped to multiplier = 1.0.
29
+ * - Missing/invalid startedAt returns 1.0 (treat as fresh — don't penalize
30
+ * for data we don't have).
31
+ */
32
+ interface RecencyConfig {
33
+ readonly halfLifeDays: number;
34
+ readonly floor: number;
35
+ readonly disabled: boolean;
36
+ }
37
+ /**
38
+ * Test-only: drop the cached config so the next call re-reads env vars.
39
+ */
40
+ export declare function resetRecencyConfigForTest(): void;
41
+ /**
42
+ * Return the multiplier in (0, 1] for a session whose ISO 8601 `startedAt`
43
+ * timestamp is given. `now` defaults to Date.now() and may be overridden
44
+ * for deterministic tests.
45
+ */
46
+ export declare function recencyMultiplier(startedAt: string | null | undefined, now?: number): number;
47
+ /**
48
+ * Read-only view of the active config. Exposed for diagnostics (e.g. the
49
+ * `/api/health` endpoint or operator-facing logs).
50
+ */
51
+ export declare function getRecencyConfig(): RecencyConfig;
52
+ export {};
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Recency weighting for recall scoring.
3
+ *
4
+ * Multiplies each RecallHit's matchScore by an age-decay factor so identical-
5
+ * relevance sessions sort newer-first. The factor is exponential half-life:
6
+ *
7
+ * f(age_days) = max(FLOOR, 2 ^ (-age_days / half_life_days))
8
+ *
9
+ * Default half-life: 180 days (6 months). A 180-day-old session scores 0.5×,
10
+ * a 1-year-old session scores 0.25×, an 18-month-old session scores ~0.13×.
11
+ *
12
+ * Default floor: 0.25. A truly-relevant ancient session never drops below
13
+ * a quarter of its raw score — so age alone can't push it out of top results
14
+ * if the keyword/semantic signal is strong enough.
15
+ *
16
+ * Configuration:
17
+ * NLM_RECALL_DECAY_HALF_LIFE_DAYS — override the half-life. Set to 0 to
18
+ * disable decay entirely (returns 1.0).
19
+ * NLM_RECALL_DECAY_FLOOR — override the floor (0.0 - 1.0 range).
20
+ *
21
+ * Env vars are read once at module load and cached. To change at runtime,
22
+ * call resetRecencyConfigForTest() (test-only) and reimport.
23
+ *
24
+ * Design notes:
25
+ * - Applied once at finalize() time in recall-service.ts, after per-mode
26
+ * scoring but before the limit slice. Single call-site covers keyword,
27
+ * semantic, and hybrid modes uniformly.
28
+ * - Future startedAt (clock skew) is clamped to multiplier = 1.0.
29
+ * - Missing/invalid startedAt returns 1.0 (treat as fresh — don't penalize
30
+ * for data we don't have).
31
+ */
32
+ const DEFAULT_HALF_LIFE_DAYS = 180;
33
+ const DEFAULT_FLOOR = 0.25;
34
+ const MS_PER_DAY = 86_400_000;
35
+ let cached = null;
36
+ function loadConfig() {
37
+ if (cached)
38
+ return cached;
39
+ const halfLifeRaw = process.env["NLM_RECALL_DECAY_HALF_LIFE_DAYS"];
40
+ const floorRaw = process.env["NLM_RECALL_DECAY_FLOOR"];
41
+ let halfLifeDays = DEFAULT_HALF_LIFE_DAYS;
42
+ let disabled = false;
43
+ if (halfLifeRaw !== undefined) {
44
+ const parsed = Number.parseFloat(halfLifeRaw);
45
+ if (Number.isFinite(parsed)) {
46
+ if (parsed <= 0) {
47
+ disabled = true;
48
+ }
49
+ else {
50
+ halfLifeDays = parsed;
51
+ }
52
+ }
53
+ }
54
+ let floor = DEFAULT_FLOOR;
55
+ if (floorRaw !== undefined) {
56
+ const parsed = Number.parseFloat(floorRaw);
57
+ if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 1) {
58
+ floor = parsed;
59
+ }
60
+ }
61
+ cached = { halfLifeDays, floor, disabled };
62
+ return cached;
63
+ }
64
+ /**
65
+ * Test-only: drop the cached config so the next call re-reads env vars.
66
+ */
67
+ export function resetRecencyConfigForTest() {
68
+ cached = null;
69
+ }
70
+ /**
71
+ * Return the multiplier in (0, 1] for a session whose ISO 8601 `startedAt`
72
+ * timestamp is given. `now` defaults to Date.now() and may be overridden
73
+ * for deterministic tests.
74
+ */
75
+ export function recencyMultiplier(startedAt, now = Date.now()) {
76
+ const cfg = loadConfig();
77
+ if (cfg.disabled)
78
+ return 1.0;
79
+ if (!startedAt)
80
+ return 1.0;
81
+ const started = Date.parse(startedAt);
82
+ if (Number.isNaN(started))
83
+ return 1.0;
84
+ const ageMs = now - started;
85
+ if (ageMs <= 0)
86
+ return 1.0;
87
+ const ageDays = ageMs / MS_PER_DAY;
88
+ const raw = Math.pow(2, -ageDays / cfg.halfLifeDays);
89
+ return Math.max(cfg.floor, raw);
90
+ }
91
+ /**
92
+ * Read-only view of the active config. Exposed for diagnostics (e.g. the
93
+ * `/api/health` endpoint or operator-facing logs).
94
+ */
95
+ export function getRecencyConfig() {
96
+ return loadConfig();
97
+ }
98
+ //# sourceMappingURL=recency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recency.js","sourceRoot":"","sources":["../../../src/core/recall/recency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,UAAU,GAAG,UAAU,CAAC;AAQ9B,IAAI,MAAM,GAAyB,IAAI,CAAC;AAExC,SAAS,UAAU;IACjB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEvD,IAAI,YAAY,GAAG,sBAAsB,CAAC;IAC1C,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,MAAM,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,aAAa,CAAC;IAC1B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC1D,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoC,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC9F,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,CAAC;IAEtC,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;IAC5B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAE3B,MAAM,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
@@ -5,6 +5,7 @@
5
5
  export interface RecentLogEntry {
6
6
  readonly ts: string;
7
7
  readonly source: string;
8
+ readonly runtime: string | null;
8
9
  readonly query: string | null;
9
10
  readonly entity: string | null;
10
11
  readonly kind: string | null;
@@ -25,6 +25,7 @@ export function recentQueryLog(limit, logPath = defaultLogPath()) {
25
25
  entries.push({
26
26
  ts: typeof raw["ts"] === "string" ? raw["ts"] : "",
27
27
  source: typeof raw["source"] === "string" ? raw["source"] : "unknown",
28
+ runtime: typeof raw["runtime"] === "string" ? raw["runtime"] : null,
28
29
  query: typeof raw["query"] === "string" ? raw["query"] : null,
29
30
  entity: typeof raw["entity"] === "string" ? raw["entity"] : null,
30
31
  kind: typeof raw["kind"] === "string" ? raw["kind"] : null,
@@ -1 +1 @@
1
- {"version":3,"file":"recent-log.js","sourceRoot":"","sources":["../../../src/core/recall/recent-log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recent-log.js","sourceRoot":"","sources":["../../../src/core/recall/recent-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * pickRelatedFacts — Spec G.2 server-side helper that selects 3–5 current
3
+ * high-confidence facts about the entities in the top recall hits.
4
+ *
5
+ * Algorithm:
6
+ * 1. Walk top-N hits, collect a deduped entity set (cap entities so very
7
+ * entity-rich sessions don't dominate).
8
+ * 2. For each entity, fetch its current (non-superseded) facts from
9
+ * FactStore.list. Filter to confidence ≥ min.
10
+ * 3. Compute corroboration counts (Spec G.1) for all candidates in a
11
+ * single batched query.
12
+ * 4. Filter to facts seen across ≥ MIN_CORROBORATION sessions — a fact
13
+ * asserted by only one session isn't "known" yet for the purposes
14
+ * of hook injection.
15
+ * 5. Sort by (corroborationCount DESC, confidence DESC) and take limit.
16
+ *
17
+ * Defaults are tunable via env vars (NLM_HOOK_FACT_LIMIT,
18
+ * NLM_HOOK_FACT_MIN_CORROBORATION, NLM_HOOK_FACT_MIN_CONFIDENCE) and any
19
+ * fail in the path returns an empty array so the pointer block degrades
20
+ * to the session-only format. This is a quality enhancement; never let
21
+ * it block recall.
22
+ */
23
+ import type { FactStore } from "../../ports/fact-store.js";
24
+ import type { RecallHit, RelatedFact } from "../../shared/types.js";
25
+ export interface PickRelatedFactsOptions {
26
+ readonly limit?: number;
27
+ readonly minCorroboration?: number;
28
+ readonly minConfidence?: number;
29
+ }
30
+ export declare function pickRelatedFacts(hits: ReadonlyArray<RecallHit>, factStore: FactStore, opts?: PickRelatedFactsOptions): Promise<RelatedFact[]>;
@@ -0,0 +1,134 @@
1
+ /**
2
+ * pickRelatedFacts — Spec G.2 server-side helper that selects 3–5 current
3
+ * high-confidence facts about the entities in the top recall hits.
4
+ *
5
+ * Algorithm:
6
+ * 1. Walk top-N hits, collect a deduped entity set (cap entities so very
7
+ * entity-rich sessions don't dominate).
8
+ * 2. For each entity, fetch its current (non-superseded) facts from
9
+ * FactStore.list. Filter to confidence ≥ min.
10
+ * 3. Compute corroboration counts (Spec G.1) for all candidates in a
11
+ * single batched query.
12
+ * 4. Filter to facts seen across ≥ MIN_CORROBORATION sessions — a fact
13
+ * asserted by only one session isn't "known" yet for the purposes
14
+ * of hook injection.
15
+ * 5. Sort by (corroborationCount DESC, confidence DESC) and take limit.
16
+ *
17
+ * Defaults are tunable via env vars (NLM_HOOK_FACT_LIMIT,
18
+ * NLM_HOOK_FACT_MIN_CORROBORATION, NLM_HOOK_FACT_MIN_CONFIDENCE) and any
19
+ * fail in the path returns an empty array so the pointer block degrades
20
+ * to the session-only format. This is a quality enhancement; never let
21
+ * it block recall.
22
+ */
23
+ const DEFAULT_FACT_LIMIT = 5;
24
+ const DEFAULT_MIN_CORROBORATION = 2;
25
+ const DEFAULT_MIN_CONFIDENCE = 0.7;
26
+ const TOP_HITS_FOR_ENTITY_SCAN = 5;
27
+ const MAX_ENTITIES_TO_QUERY = 8;
28
+ function readInt(envKey, fallback) {
29
+ const raw = process.env[envKey];
30
+ if (raw === undefined)
31
+ return fallback;
32
+ const parsed = Number.parseInt(raw, 10);
33
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
34
+ }
35
+ function readFloat(envKey, fallback) {
36
+ const raw = process.env[envKey];
37
+ if (raw === undefined)
38
+ return fallback;
39
+ const parsed = Number.parseFloat(raw);
40
+ return Number.isFinite(parsed) && parsed >= 0 && parsed <= 1 ? parsed : fallback;
41
+ }
42
+ export async function pickRelatedFacts(hits, factStore, opts = {}) {
43
+ if (hits.length === 0)
44
+ return [];
45
+ const limit = opts.limit ?? readInt("NLM_HOOK_FACT_LIMIT", DEFAULT_FACT_LIMIT);
46
+ const minCorroboration = opts.minCorroboration ?? readInt("NLM_HOOK_FACT_MIN_CORROBORATION", DEFAULT_MIN_CORROBORATION);
47
+ const minConfidence = opts.minConfidence ?? readFloat("NLM_HOOK_FACT_MIN_CONFIDENCE", DEFAULT_MIN_CONFIDENCE);
48
+ if (limit <= 0)
49
+ return [];
50
+ try {
51
+ // 1. Collect entities from the top hits.
52
+ const entities = collectEntities(hits.slice(0, TOP_HITS_FOR_ENTITY_SCAN));
53
+ if (entities.length === 0)
54
+ return [];
55
+ // 2. Fetch current facts per entity. Parallelize to keep latency bounded.
56
+ const factLists = await Promise.all(entities.map((entity) => factStore.list({ subject: entity, includeSuperseded: false })));
57
+ // 3. Flatten, filter by confidence.
58
+ const candidates = [];
59
+ for (const list of factLists) {
60
+ for (const f of list) {
61
+ if (f.confidence >= minConfidence)
62
+ candidates.push(f);
63
+ }
64
+ }
65
+ if (candidates.length === 0)
66
+ return [];
67
+ // 4. Batch-compute corroboration for all candidates.
68
+ const triples = candidates.map((f) => ({
69
+ subject: f.subject,
70
+ predicate: f.predicate,
71
+ value: f.value,
72
+ }));
73
+ const counts = await factStore.corroborationCounts(triples);
74
+ // 5. Build RelatedFact[], filter by minCorroboration, dedupe by
75
+ // (subject, predicate) — only the most-corroborated value per pair
76
+ // survives so we don't list "polysignal uses: duckdb" AND
77
+ // "polysignal uses: postgres" as if both were current.
78
+ const byKey = new Map();
79
+ for (const f of candidates) {
80
+ const corrKey = `${f.subject} ${f.predicate} ${f.value}`;
81
+ const corroborationCount = counts.get(corrKey) ?? 1;
82
+ if (corroborationCount < minCorroboration)
83
+ continue;
84
+ const dedupeKey = `${f.subject} ${f.predicate}`;
85
+ const existing = byKey.get(dedupeKey);
86
+ if (!existing ||
87
+ corroborationCount > existing.corroborationCount ||
88
+ (corroborationCount === existing.corroborationCount && f.confidence > existing.confidence)) {
89
+ byKey.set(dedupeKey, {
90
+ subject: f.subject,
91
+ predicate: f.predicate,
92
+ value: f.value,
93
+ corroborationCount,
94
+ confidence: f.confidence,
95
+ });
96
+ }
97
+ }
98
+ const sorted = [...byKey.values()].sort((a, b) => {
99
+ if (b.corroborationCount !== a.corroborationCount) {
100
+ return b.corroborationCount - a.corroborationCount;
101
+ }
102
+ return b.confidence - a.confidence;
103
+ });
104
+ return sorted.slice(0, limit).map((r) => ({
105
+ subject: r.subject,
106
+ predicate: r.predicate,
107
+ value: r.value,
108
+ corroborationCount: r.corroborationCount,
109
+ }));
110
+ }
111
+ catch {
112
+ // Fail-open: empty array means the pointer block renders session-only.
113
+ return [];
114
+ }
115
+ }
116
+ function collectEntities(hits) {
117
+ // Order matters: earlier hits contribute first so the top-ranked
118
+ // session's entities are most likely to make the cut.
119
+ const seen = new Set();
120
+ const out = [];
121
+ for (const hit of hits) {
122
+ for (const ent of hit.entities) {
123
+ const trimmed = ent.trim();
124
+ if (!trimmed || seen.has(trimmed))
125
+ continue;
126
+ seen.add(trimmed);
127
+ out.push(trimmed);
128
+ if (out.length >= MAX_ENTITIES_TO_QUERY)
129
+ return out;
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+ //# sourceMappingURL=related-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"related-facts.js","sourceRoot":"","sources":["../../../src/core/recall/related-facts.ts"],"names":[],"mappings":"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"}