nlm-memory 0.5.21 → 0.5.22

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 (67) hide show
  1. package/README.md +26 -8
  2. package/dist/core/actions/overlay.d.ts +22 -0
  3. package/dist/core/actions/overlay.js +56 -0
  4. package/dist/core/actions/overlay.js.map +1 -1
  5. package/dist/core/dataset/build-dataset.d.ts +14 -1
  6. package/dist/core/dataset/build-dataset.js +68 -11
  7. package/dist/core/dataset/build-dataset.js.map +1 -1
  8. package/dist/core/hook/miss-detect.d.ts +32 -0
  9. package/dist/core/hook/miss-detect.js +67 -0
  10. package/dist/core/hook/miss-detect.js.map +1 -0
  11. package/dist/core/recall/miss-log.d.ts +47 -0
  12. package/dist/core/recall/miss-log.js +112 -0
  13. package/dist/core/recall/miss-log.js.map +1 -0
  14. package/dist/core/recall/query-log.d.ts +3 -0
  15. package/dist/core/recall/query-log.js +1 -0
  16. package/dist/core/recall/query-log.js.map +1 -1
  17. package/dist/core/recall/recency.d.ts +52 -0
  18. package/dist/core/recall/recency.js +98 -0
  19. package/dist/core/recall/recency.js.map +1 -0
  20. package/dist/core/recall/recent-log.d.ts +1 -0
  21. package/dist/core/recall/recent-log.js +1 -0
  22. package/dist/core/recall/recent-log.js.map +1 -1
  23. package/dist/core/recall/related-facts.d.ts +30 -0
  24. package/dist/core/recall/related-facts.js +134 -0
  25. package/dist/core/recall/related-facts.js.map +1 -0
  26. package/dist/core/recall/rewrite-cache.d.ts +25 -0
  27. package/dist/core/recall/rewrite-cache.js +60 -0
  28. package/dist/core/recall/rewrite-cache.js.map +1 -0
  29. package/dist/core/recall/rewrite-prompt.d.ts +23 -0
  30. package/dist/core/recall/rewrite-prompt.js +81 -0
  31. package/dist/core/recall/rewrite-prompt.js.map +1 -0
  32. package/dist/core/storage/pg-session-store.js +16 -1
  33. package/dist/core/storage/pg-session-store.js.map +1 -1
  34. package/dist/core/storage/sqlite-session-store.d.ts +3 -0
  35. package/dist/core/storage/sqlite-session-store.js +21 -1
  36. package/dist/core/storage/sqlite-session-store.js.map +1 -1
  37. package/dist/hook/pi-extension.d.ts +3 -1
  38. package/dist/hook/pi-extension.js +4 -2
  39. package/dist/hook/pi-extension.js.map +1 -1
  40. package/dist/hook/prompt-recall-hook.js +1 -1
  41. package/dist/hook/prompt-recall-hook.js.map +1 -1
  42. package/dist/hook/recall-over-http.d.ts +1 -1
  43. package/dist/hook/recall-over-http.js +5 -2
  44. package/dist/hook/recall-over-http.js.map +1 -1
  45. package/dist/hook/session-start-hook.js +4 -1
  46. package/dist/hook/session-start-hook.js.map +1 -1
  47. package/dist/http/app.js +2 -0
  48. package/dist/http/app.js.map +1 -1
  49. package/dist/install/rules-content.d.ts +51 -0
  50. package/dist/install/rules-content.js +140 -0
  51. package/dist/install/rules-content.js.map +1 -0
  52. package/dist/install/rules-install.d.ts +35 -0
  53. package/dist/install/rules-install.js +79 -0
  54. package/dist/install/rules-install.js.map +1 -0
  55. package/dist/mcp/server.js +1 -0
  56. package/dist/mcp/server.js.map +1 -1
  57. package/dist/ui/assets/index-BR1BHwew.js +69 -0
  58. package/dist/ui/assets/index-CgHq6xeZ.css +1 -0
  59. package/dist/ui/index.html +2 -2
  60. package/nlm/index.js +6 -4
  61. package/package.json +2 -1
  62. package/plugin/scripts/prompt-recall-hook.mjs +5 -3
  63. package/plugin-hermes-agent/README.md +49 -0
  64. package/plugin-hermes-agent/__init__.py +75 -0
  65. package/plugin-hermes-agent/plugin.yaml +15 -0
  66. package/dist/ui/assets/index-B7j5U42U.css +0 -1
  67. package/dist/ui/assets/index-BO0dvNHn.js +0 -69
package/README.md CHANGED
@@ -79,15 +79,15 @@ One corpus across every adapter. MCP works against all nine. **Automatic context
79
79
 
80
80
  | Runtime | Connect | Sessions read from | Hooks |
81
81
  |---|---|---|---|
82
- | **Claude Code** | `nlm connect claude-code` | `~/.claude/projects/**/*.jsonl` | 5 (UserPromptSubmit, SessionStart, Stop, PreCompact, SubagentStart) |
83
- | **Codex CLI** | `nlm connect codex` | `~/.codex/sessions/` | Marketplace plugin |
84
- | **Hermes** | `nlm connect hermes` | Hermes session DB | MCP only |
85
- | **Hermes Agent** | `nlm connect hermes-agent` | Hermes plugin path | pre-turn, post-turn, lifecycle |
82
+ | **Claude Code** | `nlm connect claude-code` | `~/.claude/projects/**/*.jsonl` | 6 hooks: UserPromptSubmit, SessionStart, SessionEnd, Stop, PreCompact, SubagentStart |
83
+ | **Codex CLI** | `nlm connect codex` | `~/.codex/sessions/` | Marketplace plugin (UserPromptSubmit + Stop) |
84
+ | **Hermes** | `nlm connect hermes` | `~/.hermes/sessions/` | MCP only |
85
+ | **Hermes Agent** | `nlm connect hermes-agent` | `~/.hermes/state.db` | 6 hooks: pre_llm_call, post_llm_call, on_session_start/end/finalize/reset |
86
86
  | **Cursor** | `nlm connect cursor` | Cursor IDE chat DB | MCP only |
87
87
  | **Windsurf** | `nlm connect windsurf` | Windsurf user dir | MCP only |
88
88
  | **OpenCode** | adapter active | `~/.local/share/opencode/` | MCP only |
89
89
  | **Aider** | adapter active | `AIDER_CHAT_HISTORY_FILE` | MCP only |
90
- | **pi.dev** | `nlm setup` (auto) or `nlm connect pi` | `~/.pi/agent/sessions/**/*.jsonl` | input (prompt-recall) |
90
+ | **pi.dev** | `nlm setup` (auto) or `nlm connect pi` | `~/.pi/agent/sessions/**/*.jsonl` | 1 hook: input (prepend via transform) |
91
91
 
92
92
  `nlm disconnect <runtime>` reverses any of the above.
93
93
 
@@ -99,19 +99,37 @@ Two delivery paths. They share the same index.
99
99
 
100
100
  ### 1. Hooks — automatic context injection
101
101
 
102
- Hooks fire on user input and prepend a pointer block of likely-relevant prior sessions to the model's context. Three runtimes ship them today: Claude Code (full five-hook lifecycle), Hermes Agent (parallel set), and pi.dev (one `input` hook via [nlm/](nlm/README.md), wired by `nlm setup` or `nlm connect pi`). Full lifecycle, modes, logging surface, and the load-bearing daily liveness canary documented in [docs/hooks.md](docs/hooks.md).
102
+ Hooks fire on user input and prepend a pointer block of likely-relevant prior sessions to the model's context. Three runtimes ship hooks today: Claude Code (six-hook lifecycle), Hermes Agent (six parallel hooks), and pi.dev (one `input` hook via [nlm/](nlm/README.md)). On all other runtimes the agent calls `recall_sessions` explicitly via MCP. Full lifecycle, modes, logging surface, and the daily liveness canary documented in [docs/hooks.md](docs/hooks.md).
103
103
 
104
- The Claude Code surface (the most complete) installs five hooks into `~/.claude/settings.json`:
104
+ **Claude Code** — six hooks written to `~/.claude/settings.json` via `nlm connect claude-code`:
105
105
 
106
106
  | Event | What NLM does | Mode |
107
107
  |---|---|---|
108
108
  | **UserPromptSubmit** | Score the prompt, silently prepend pointer block listing 0–3 most likely-relevant prior sessions | live by default |
109
109
  | **SessionStart** | Cold-start agents (cron, background) hit this; same pointer-block delivery without a user prompt | live by default |
110
+ | **SessionEnd** | Delete the per-conversation memo on session close so state files don't accumulate | always on |
110
111
  | **Stop** | Scan the model's response for citations of surfaced session IDs → updates `useful_hit_rate` and builds the reranker training substrate | always on |
111
112
  | **PreCompact** | Flush the per-conversation surfaced-IDs memo so post-compaction recalls aren't gated | always on |
112
113
  | **SubagentStart** | Record parent→subagent links so threads stay coherent across dispatches | always on |
113
114
 
114
- Switch to **shadow** mode (log-only, no injection) anytime with `NLM_HOOK_MODE=shadow` on the hook command. Toggle for an existing install: re-run `nlm hook install` after changing the env var. The hook fails open — any error yields a clean exit and never blocks the model.
115
+ **Hermes Agent** — six hooks installed to `~/.hermes/plugins/nlm-memory/` via `nlm connect hermes-agent`. All calls are fire-and-forget except `pre_llm_call`, which returns a context string for injection:
116
+
117
+ | Hook | What NLM does | Blocks turn? |
118
+ |---|---|---|
119
+ | **pre_llm_call** | POST prompt to daemon → inject pointer block of relevant prior sessions into context | yes (returns context string) |
120
+ | **post_llm_call** | POST assistant response to daemon → citation scan, `useful_hit_rate` update | no |
121
+ | **on_session_start** | Signal session open → daemon initialises per-session memo | no |
122
+ | **on_session_end** | Signal session close → daemon flushes memo | no |
123
+ | **on_session_finalize** | Signal transcript finalised → triggers async classifier run | no |
124
+ | **on_session_reset** | Signal session reset → daemon clears per-session state | no |
125
+
126
+ **pi.dev** — one `input` hook registered via `nlm connect pi`. Pi's extension API only exposes `input`, so transcript ingestion is handled separately by the passive adapter scanning `~/.pi/agent/sessions/`:
127
+
128
+ | Hook | What NLM does | Blocks turn? |
129
+ |---|---|---|
130
+ | **input** | Score user message → if relevant sessions found, prepend pointer block to the prompt text via `{ action: "transform" }` | yes (returns transformed text) |
131
+
132
+ All three fail-open: any daemon error yields a clean exit and never blocks the model. Switch Claude Code hooks to **shadow** mode (log-only, no injection) with `NLM_HOOK_MODE=shadow`.
115
133
 
116
134
  ### 2. MCP — explicit tools any agent can call
117
135
 
@@ -15,10 +15,25 @@ export interface ActionOverlay {
15
15
  readonly retiredEntities: Set<string>;
16
16
  readonly snoozedEntities: Map<string, string>;
17
17
  readonly labeledEntities: Map<string, string>;
18
+ /** entity canonical → new display label. Storage canonical is untouched;
19
+ * legacy-name recall still resolves because sessions stay tagged with
20
+ * the original canonical. Last non-reverted rename per subject wins. */
21
+ readonly renamedEntities: Map<string, string>;
18
22
  /** open-question ids resolved without becoming decisions */
19
23
  readonly resolvedOpens: Set<string>;
20
24
  /** open-question id → resolution text (becomes a decision at projection time) */
21
25
  readonly promotedOpens: Map<string, string>;
26
+ /** decision ids hidden from the projection (the underlying session body keeps the original line). */
27
+ readonly dismissedDecisions: Set<string>;
28
+ /** decision id → corrected text shown in place of the original. */
29
+ readonly revisedDecisions: Map<string, string>;
30
+ /** entity canonical → user-asserted coherence bucket. Overrides the
31
+ * computed (session_count + age) classification at projection time;
32
+ * last non-reverted write wins. */
33
+ readonly coherenceOverrides: Map<string, "active" | "sparse" | "stale">;
34
+ /** source canonical → target canonical. Source is hidden at projection
35
+ * time (treated as retired); target absorbs the source's session count. */
36
+ readonly mergedEntities: Map<string, string>;
22
37
  }
23
38
  export declare const EMPTY_OVERLAY: ActionOverlay;
24
39
  export declare function loadActionOverlay(db: Database.Database): ActionOverlay;
@@ -28,3 +43,10 @@ export declare function loadActionOverlay(db: Database.Database): ActionOverlay;
28
43
  * subject_ids round-trip.
29
44
  */
30
45
  export declare function openQuestionId(sessionId: string, text: string): string;
46
+ /**
47
+ * Stable id for a decision: `${sessionId}::dec::${hash12(text)}`. Same
48
+ * deterministic-hash trick as open questions; the `dec::` infix keeps the
49
+ * two ID spaces disjoint so a decision and an open question with the same
50
+ * text in the same session don't collide.
51
+ */
52
+ export declare function decisionId(sessionId: string, text: string): string;
@@ -14,8 +14,13 @@ export const EMPTY_OVERLAY = {
14
14
  retiredEntities: new Set(),
15
15
  snoozedEntities: new Map(),
16
16
  labeledEntities: new Map(),
17
+ renamedEntities: new Map(),
17
18
  resolvedOpens: new Set(),
18
19
  promotedOpens: new Map(),
20
+ dismissedDecisions: new Set(),
21
+ revisedDecisions: new Map(),
22
+ coherenceOverrides: new Map(),
23
+ mergedEntities: new Map(),
19
24
  };
20
25
  export function loadActionOverlay(db) {
21
26
  const hasActions = db
@@ -29,14 +34,22 @@ export function loadActionOverlay(db) {
29
34
  retiredEntities: new Set(),
30
35
  snoozedEntities: new Map(),
31
36
  labeledEntities: new Map(),
37
+ renamedEntities: new Map(),
32
38
  resolvedOpens: new Set(),
33
39
  promotedOpens: new Map(),
40
+ dismissedDecisions: new Set(),
41
+ revisedDecisions: new Map(),
42
+ coherenceOverrides: new Map(),
43
+ mergedEntities: new Map(),
34
44
  };
45
+ // ORDER BY id keeps reducer deterministic: later writes overwrite earlier
46
+ // ones, so the latest non-reverted rename per subject wins.
35
47
  const rows = db
36
48
  .prepare(`
37
49
  SELECT kind, subject_type, subject_id, payload
38
50
  FROM actions
39
51
  WHERE reverted_by IS NULL
52
+ ORDER BY id
40
53
  `)
41
54
  .all();
42
55
  const now = new Date().toISOString();
@@ -63,6 +76,13 @@ export function loadActionOverlay(db) {
63
76
  if (newType)
64
77
  overlay.labeledEntities.set(r.subject_id, newType);
65
78
  }
79
+ else if (r.kind === "rename_entity" && r.subject_type === "entity") {
80
+ const to = typeof payload?.["to"] === "string" ? payload["to"].trim() : "";
81
+ if (to && to !== r.subject_id)
82
+ overlay.renamedEntities.set(r.subject_id, to);
83
+ else
84
+ overlay.renamedEntities.delete(r.subject_id);
85
+ }
66
86
  else if (r.kind === "resolve_open" && r.subject_type === "open_question") {
67
87
  overlay.resolvedOpens.add(r.subject_id);
68
88
  }
@@ -71,6 +91,33 @@ export function loadActionOverlay(db) {
71
91
  if (resolution)
72
92
  overlay.promotedOpens.set(r.subject_id, resolution);
73
93
  }
94
+ else if (r.kind === "dismiss_decision" && r.subject_type === "decision") {
95
+ overlay.dismissedDecisions.add(r.subject_id);
96
+ }
97
+ else if (r.kind === "revise_decision" && r.subject_type === "decision") {
98
+ const to = typeof payload?.["to"] === "string" ? payload["to"].trim() : "";
99
+ if (to)
100
+ overlay.revisedDecisions.set(r.subject_id, to);
101
+ else
102
+ overlay.revisedDecisions.delete(r.subject_id);
103
+ }
104
+ else if (r.kind === "merge_entity" && r.subject_type === "entity") {
105
+ const into = typeof payload?.["into"] === "string" ? payload["into"].trim() : "";
106
+ if (into)
107
+ overlay.mergedEntities.set(r.subject_id, into);
108
+ else
109
+ overlay.mergedEntities.delete(r.subject_id);
110
+ }
111
+ else if (r.kind === "set_coherence" && r.subject_type === "entity") {
112
+ const state = typeof payload?.["state"] === "string" ? payload["state"] : "";
113
+ if (state === "active" || state === "sparse" || state === "stale") {
114
+ overlay.coherenceOverrides.set(r.subject_id, state);
115
+ }
116
+ else {
117
+ // Empty payload reverts to the computed bucket.
118
+ overlay.coherenceOverrides.delete(r.subject_id);
119
+ }
120
+ }
74
121
  }
75
122
  return overlay;
76
123
  }
@@ -82,6 +129,15 @@ export function loadActionOverlay(db) {
82
129
  export function openQuestionId(sessionId, text) {
83
130
  return `${sessionId}::${stableHash12(text)}`;
84
131
  }
132
+ /**
133
+ * Stable id for a decision: `${sessionId}::dec::${hash12(text)}`. Same
134
+ * deterministic-hash trick as open questions; the `dec::` infix keeps the
135
+ * two ID spaces disjoint so a decision and an open question with the same
136
+ * text in the same session don't collide.
137
+ */
138
+ export function decisionId(sessionId, text) {
139
+ return `${sessionId}::dec::${stableHash12(text)}`;
140
+ }
85
141
  function stableHash12(text) {
86
142
  let h = 0xcbf29ce484222325n;
87
143
  for (let i = 0; i < text.length; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/core/actions/overlay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/core/actions/overlay.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,9 @@ export interface DatasetSession {
17
17
  readonly summary: string;
18
18
  readonly entities: ReadonlyArray<string>;
19
19
  readonly decisions: ReadonlyArray<string>;
20
+ /** Stable ids parallel to `decisions[]`. Same length and order; use to
21
+ * target overlay actions (dismiss_decision, revise_decision). */
22
+ readonly decision_ids: ReadonlyArray<string>;
20
23
  readonly open: ReadonlyArray<string>;
21
24
  readonly open_questions: ReadonlyArray<{
22
25
  id: string;
@@ -29,12 +32,20 @@ export interface DatasetSession {
29
32
  readonly supersedes?: string;
30
33
  readonly superseded_by?: string;
31
34
  }
35
+ export type TopicCoherence = "active" | "sparse" | "stale";
32
36
  export interface DatasetEntity {
33
37
  readonly canonical: string;
34
38
  readonly type: string;
35
39
  readonly status: string;
36
40
  readonly session_count: number;
37
41
  readonly last_seen_session: string | null;
42
+ /** Renamed display label from the action overlay; absent if not renamed. */
43
+ readonly display?: string;
44
+ /** Effective coherence bucket (override if user set one, else computed). */
45
+ readonly coherence: TopicCoherence;
46
+ /** Computed bucket from session_count + age, ignoring any override. Lets
47
+ * the UI show "would naturally be X" alongside the user assertion. */
48
+ readonly coherence_computed: TopicCoherence;
38
49
  }
39
50
  export interface DatasetResponse {
40
51
  readonly meta: {
@@ -49,6 +60,8 @@ export interface DatasetResponse {
49
60
  readonly entity_colors: Record<string, string>;
50
61
  readonly entity_type: Record<string, string>;
51
62
  readonly entity_status: Record<string, string>;
63
+ /** canonical → display label; only canonicals with an active rename appear. */
64
+ readonly entity_display: Record<string, string>;
52
65
  readonly metrics: {
53
66
  readonly this_week: number;
54
67
  readonly last_week: number;
@@ -61,7 +74,7 @@ export interface DatasetResponse {
61
74
  readonly alerts: ReadonlyArray<{
62
75
  readonly id: string;
63
76
  readonly type: "stale";
64
- readonly severity: "high" | "medium";
77
+ readonly severity: "high" | "medium" | "low";
65
78
  readonly entity: string;
66
79
  readonly summary: string;
67
80
  readonly sessions: ReadonlyArray<string>;
@@ -11,7 +11,7 @@ import { existsSync } from "node:fs";
11
11
  import Database from "better-sqlite3";
12
12
  import * as sqliteVec from "sqlite-vec";
13
13
  import { liveSessionStatus } from "../storage/live-status.js";
14
- import { loadActionOverlay, openQuestionId } from "../actions/overlay.js";
14
+ import { loadActionOverlay, openQuestionId, decisionId } from "../actions/overlay.js";
15
15
  const EMPTY_DATASET = (dbPath, present) => ({
16
16
  meta: {
17
17
  last_sync: new Date().toISOString(),
@@ -25,6 +25,7 @@ const EMPTY_DATASET = (dbPath, present) => ({
25
25
  entity_colors: {},
26
26
  entity_type: {},
27
27
  entity_status: {},
28
+ entity_display: {},
28
29
  metrics: { this_week: 0, last_week: 0, sparkline: [0, 0, 0, 0, 0, 0, 0], healthy: 0, sparse: 0, stale: 0, closed_decisions: 0 },
29
30
  alerts: [],
30
31
  runtimes: [],
@@ -130,14 +131,32 @@ function projectFromDb(db, dbPath, includePaths) {
130
131
  `)
131
132
  .all();
132
133
  const overlay = loadActionOverlay(db);
134
+ // Count-folding pass (Option B): runs before coherence computation so the
135
+ // target entity's bucket reflects the absorbed session count.
136
+ if (overlay.mergedEntities.size > 0) {
137
+ const byCanonical = new Map(allEntityRows.map((e) => [e.canonical, e]));
138
+ for (const [source, into] of overlay.mergedEntities) {
139
+ const src = byCanonical.get(source);
140
+ const tgt = byCanonical.get(into);
141
+ if (src && tgt)
142
+ tgt.session_count += src.session_count;
143
+ }
144
+ }
145
+ const sessionStartByIdForCoherence = new Map(sessionRows.map((s) => [s.id, s.started_at]));
146
+ const nowMs = Date.now();
133
147
  for (const e of allEntityRows) {
134
- if (overlay.retiredEntities.has(e.canonical))
148
+ if (overlay.retiredEntities.has(e.canonical) || overlay.mergedEntities.has(e.canonical))
135
149
  e.status = "retired";
136
150
  else if (overlay.snoozedEntities.has(e.canonical))
137
151
  e.status = "snoozed";
138
152
  const newType = overlay.labeledEntities.get(e.canonical);
139
153
  if (newType)
140
154
  e.type = newType;
155
+ const newDisplay = overlay.renamedEntities.get(e.canonical);
156
+ if (newDisplay)
157
+ e.display = newDisplay;
158
+ e.coherence_computed = computeCoherence(e, sessionStartByIdForCoherence, nowMs);
159
+ e.coherence = overlay.coherenceOverrides.get(e.canonical) ?? e.coherence_computed;
141
160
  }
142
161
  const entityRows = includePaths
143
162
  ? allEntityRows
@@ -153,6 +172,24 @@ function projectFromDb(db, dbPath, includePaths) {
153
172
  const promotedDecisions = rawOpen
154
173
  .filter((o) => overlay.promotedOpens.has(o.id))
155
174
  .map((o) => overlay.promotedOpens.get(o.id));
175
+ // Project decision overlays: dismissed lines drop out; revised lines
176
+ // show the corrected text. Promoted-from-open lines pass through as-is
177
+ // (the open-question id already governs them).
178
+ const rawDecisions = decisionsBySession.get(s.id) ?? [];
179
+ const projectedDecisions = [];
180
+ const projectedDecisionIds = [];
181
+ for (const text of rawDecisions) {
182
+ const id = decisionId(s.id, text);
183
+ if (overlay.dismissedDecisions.has(id))
184
+ continue;
185
+ const revised = overlay.revisedDecisions.get(id);
186
+ projectedDecisions.push(revised ?? text);
187
+ projectedDecisionIds.push(id);
188
+ }
189
+ for (const text of promotedDecisions) {
190
+ projectedDecisions.push(text);
191
+ projectedDecisionIds.push(decisionId(s.id, text));
192
+ }
156
193
  return {
157
194
  id: s.id,
158
195
  date: (s.started_at ?? "").slice(0, 10),
@@ -161,7 +198,8 @@ function projectFromDb(db, dbPath, includePaths) {
161
198
  label: s.label,
162
199
  summary: s.summary,
163
200
  entities: includePaths ? rawEntities : rawEntities.filter((name) => keptEntities.has(name)),
164
- decisions: [...(decisionsBySession.get(s.id) ?? []), ...promotedDecisions],
201
+ decisions: projectedDecisions,
202
+ decision_ids: projectedDecisionIds,
165
203
  open: activeOpen.map((o) => o.text),
166
204
  open_questions: activeOpen.map((o) => ({ id: o.id, text: o.text, resolved: false })),
167
205
  status,
@@ -176,10 +214,13 @@ function projectFromDb(db, dbPath, includePaths) {
176
214
  const entityColors = {};
177
215
  const entityType = {};
178
216
  const entityStatus = {};
217
+ const entityDisplay = {};
179
218
  for (const e of entityRows) {
180
219
  entityColors[e.canonical] = stableColor(e.canonical);
181
220
  entityType[e.canonical] = e.type;
182
221
  entityStatus[e.canonical] = e.status;
222
+ if (e.display)
223
+ entityDisplay[e.canonical] = e.display;
183
224
  }
184
225
  const metrics = computeMetrics(sessions, entityRows);
185
226
  const alerts = computeStaleAlerts(sessions, entityRows, overlay);
@@ -197,6 +238,7 @@ function projectFromDb(db, dbPath, includePaths) {
197
238
  entity_colors: entityColors,
198
239
  entity_type: entityType,
199
240
  entity_status: entityStatus,
241
+ entity_display: entityDisplay,
200
242
  metrics,
201
243
  alerts,
202
244
  runtimes,
@@ -263,19 +305,18 @@ function computeMetrics(sessions, entityRows) {
263
305
  lastWeek += 1;
264
306
  }
265
307
  }
266
- const sessionsById = new Map(sessions.map((s) => [s.id, s]));
308
+ // Aggregate by the effective coherence (override wins, else computed) so
309
+ // the headline bars match what the user sees after asserting a bucket.
267
310
  let healthy = 0;
268
311
  let sparse = 0;
269
312
  let stale = 0;
270
313
  for (const e of entityRows) {
271
314
  if (e.session_count === 0)
272
315
  continue;
273
- const last = sessionsById.get(e.last_seen_session ?? "");
274
- const lastT = last?.started_at ? Date.parse(last.started_at) : NaN;
275
- const ageDays = Number.isFinite(lastT) ? (now - lastT) / 86_400_000 : 999;
276
- if (ageDays > 30)
316
+ const bucket = e.coherence ?? "sparse";
317
+ if (bucket === "stale")
277
318
  stale += 1;
278
- else if (e.session_count >= 3)
319
+ else if (bucket === "active")
279
320
  healthy += 1;
280
321
  else
281
322
  sparse += 1;
@@ -283,6 +324,20 @@ function computeMetrics(sessions, entityRows) {
283
324
  const closedDecisions = sessions.reduce((sum, s) => sum + (s.status === "superseded" ? 0 : s.decisions.length), 0);
284
325
  return { this_week: thisWeek, last_week: lastWeek, sparkline, healthy, sparse, stale, closed_decisions: closedDecisions };
285
326
  }
327
+ /** Natural coherence bucket for an entity, ignoring overlay overrides.
328
+ * Stale dominates: any topic last touched >30d is stale regardless of count. */
329
+ function computeCoherence(e, startedAtBySession, nowMs) {
330
+ if (e.session_count === 0)
331
+ return "sparse";
332
+ const startedAt = startedAtBySession.get(e.last_seen_session ?? "") ?? null;
333
+ const lastT = startedAt ? Date.parse(startedAt) : NaN;
334
+ const ageDays = Number.isFinite(lastT) ? (nowMs - lastT) / 86_400_000 : 999;
335
+ if (ageDays > 30)
336
+ return "stale";
337
+ if (e.session_count >= 3)
338
+ return "active";
339
+ return "sparse";
340
+ }
286
341
  function computeStaleAlerts(sessions, entityRows, overlay) {
287
342
  const now = Date.now();
288
343
  const sessionsById = new Map(sessions.map((s) => [s.id, s]));
@@ -313,7 +368,7 @@ function computeStaleAlerts(sessions, entityRows, overlay) {
313
368
  alerts.push({
314
369
  id: alertId,
315
370
  type: "stale",
316
- severity: ageDays > 60 ? "high" : "medium",
371
+ severity: ageDays > 60 ? "high" : ageDays > 45 ? "medium" : "low",
317
372
  entity: e.canonical,
318
373
  summary,
319
374
  sessions: last ? [last.id] : [],
@@ -321,7 +376,9 @@ function computeStaleAlerts(sessions, entityRows, overlay) {
321
376
  last_touch_at: last?.started_at ?? null,
322
377
  });
323
378
  }
324
- alerts.sort((a, b) => (a.severity === "high" ? 0 : 1) - (b.severity === "high" ? 0 : 1));
379
+ // high → medium → low, then secondary by age desc so older items surface first within a tier.
380
+ const severityRank = { high: 0, medium: 1, low: 2 };
381
+ alerts.sort((a, b) => severityRank[a.severity] - severityRank[b.severity] || b.age_days - a.age_days);
325
382
  return alerts;
326
383
  }
327
384
  const HUES = [200, 270, 320, 30, 90, 150, 220, 290, 340, 50, 110, 170];
@@ -1 +1 @@
1
- {"version":3,"file":"build-dataset.js","sourceRoot":"","sources":["../../../src/core/dataset/build-dataset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-dataset.js","sourceRoot":"","sources":["../../../src/core/dataset/build-dataset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Detect "recall misses" — sessions the agent explicitly fetched or cited
3
+ * in its response but which the hook's pre-prompt recall never surfaced
4
+ * in this conversation.
5
+ *
6
+ * A miss is the inverse signal of a citation:
7
+ * - Citation = surfaced id appeared in the agent's tool calls / prose
8
+ * - Miss = id appeared in a get_session(id) or cite_session(id) call
9
+ * but was NOT surfaced
10
+ *
11
+ * Only explicit-id tool_use calls count. We don't scan recall_sessions
12
+ * results — those are exploratory and don't mean the agent thought any
13
+ * specific returned id was the right answer. get_session and cite_session,
14
+ * by contrast, are deterministic single-id signals: "I want this session
15
+ * specifically" or "I am citing this exact session."
16
+ *
17
+ * Aggregated miss data shows where the hook's selection gate is wrong —
18
+ * sessions that were relevant but didn't score high enough to fire. Spec E
19
+ * v1 is passive: just log, surface via the `nlm misses` CLI for review.
20
+ * Future specs may consume this data to retrain reranking or trigger
21
+ * targeted reclassification.
22
+ */
23
+ import type { ToolUseBlock } from "./transcript.js";
24
+ export interface DetectedMiss {
25
+ readonly id: string;
26
+ readonly kind: "get_session" | "cite_session";
27
+ }
28
+ export interface MissDetectInput {
29
+ readonly toolUses: ReadonlyArray<ToolUseBlock>;
30
+ readonly surfacedIds: Iterable<string>;
31
+ }
32
+ export declare function detectMisses(input: MissDetectInput): DetectedMiss[];
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Detect "recall misses" — sessions the agent explicitly fetched or cited
3
+ * in its response but which the hook's pre-prompt recall never surfaced
4
+ * in this conversation.
5
+ *
6
+ * A miss is the inverse signal of a citation:
7
+ * - Citation = surfaced id appeared in the agent's tool calls / prose
8
+ * - Miss = id appeared in a get_session(id) or cite_session(id) call
9
+ * but was NOT surfaced
10
+ *
11
+ * Only explicit-id tool_use calls count. We don't scan recall_sessions
12
+ * results — those are exploratory and don't mean the agent thought any
13
+ * specific returned id was the right answer. get_session and cite_session,
14
+ * by contrast, are deterministic single-id signals: "I want this session
15
+ * specifically" or "I am citing this exact session."
16
+ *
17
+ * Aggregated miss data shows where the hook's selection gate is wrong —
18
+ * sessions that were relevant but didn't score high enough to fire. Spec E
19
+ * v1 is passive: just log, surface via the `nlm misses` CLI for review.
20
+ * Future specs may consume this data to retrain reranking or trigger
21
+ * targeted reclassification.
22
+ */
23
+ const MIN_ID_LEN = 6;
24
+ export function detectMisses(input) {
25
+ const surfaced = new Set();
26
+ for (const id of input.surfacedIds) {
27
+ if (id.length >= MIN_ID_LEN)
28
+ surfaced.add(id);
29
+ }
30
+ const seenMissed = new Set();
31
+ const misses = [];
32
+ for (const tu of input.toolUses) {
33
+ if (!isNlmTool(tu.name))
34
+ continue;
35
+ const kind = explicitIdKind(tu.name);
36
+ if (!kind)
37
+ continue;
38
+ const id = extractId(tu.input);
39
+ if (!id || id.length < MIN_ID_LEN)
40
+ continue;
41
+ if (surfaced.has(id))
42
+ continue;
43
+ if (seenMissed.has(id))
44
+ continue;
45
+ seenMissed.add(id);
46
+ misses.push({ id, kind });
47
+ }
48
+ return misses;
49
+ }
50
+ function isNlmTool(name) {
51
+ return /^mcp__[^_]*nlm[^_]*__/.test(name);
52
+ }
53
+ function explicitIdKind(name) {
54
+ if (name.endsWith("__get_session"))
55
+ return "get_session";
56
+ if (name.endsWith("__cite_session"))
57
+ return "cite_session";
58
+ return null;
59
+ }
60
+ function extractId(input) {
61
+ if (input === null || typeof input !== "object")
62
+ return null;
63
+ const obj = input;
64
+ const candidate = obj["id"];
65
+ return typeof candidate === "string" ? candidate : null;
66
+ }
67
+ //# sourceMappingURL=miss-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miss-detect.js","sourceRoot":"","sources":["../../../src/core/hook/miss-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAM,UAAU,YAAY,CAAC,KAAsB;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,MAAM,IAAI,UAAU;YAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,UAAU;YAAE,SAAS;QAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC/B,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACjC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,aAAa,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,cAAc,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC"}