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.
- package/README.md +129 -19
- package/dist/cli/classify-parity.js +1 -1
- package/dist/cli/classify-parity.js.map +1 -1
- package/dist/cli/nlm.js +152 -12
- package/dist/cli/nlm.js.map +1 -1
- package/dist/core/actions/overlay.d.ts +22 -0
- package/dist/core/actions/overlay.js +56 -0
- package/dist/core/actions/overlay.js.map +1 -1
- package/dist/core/adapters/pi.js +13 -3
- package/dist/core/adapters/pi.js.map +1 -1
- package/dist/core/classifier/prompt.d.ts +1 -1
- package/dist/core/classifier/prompt.js +1 -1
- package/dist/core/dataset/build-dataset.d.ts +14 -1
- package/dist/core/dataset/build-dataset.js +68 -11
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/hook/miss-detect.d.ts +32 -0
- package/dist/core/hook/miss-detect.js +67 -0
- package/dist/core/hook/miss-detect.js.map +1 -0
- package/dist/core/hook/pointer-block.d.ts +12 -1
- package/dist/core/hook/pointer-block.js +25 -8
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/providers/provider-registry.js +1 -1
- package/dist/core/providers/provider-registry.js.map +1 -1
- package/dist/core/recall/miss-log.d.ts +47 -0
- package/dist/core/recall/miss-log.js +112 -0
- package/dist/core/recall/miss-log.js.map +1 -0
- package/dist/core/recall/query-log.d.ts +3 -0
- package/dist/core/recall/query-log.js +1 -0
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +9 -0
- package/dist/core/recall/recall-service.js +81 -18
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/recency.d.ts +52 -0
- package/dist/core/recall/recency.js +98 -0
- package/dist/core/recall/recency.js.map +1 -0
- package/dist/core/recall/recent-log.d.ts +1 -0
- package/dist/core/recall/recent-log.js +1 -0
- package/dist/core/recall/recent-log.js.map +1 -1
- package/dist/core/recall/related-facts.d.ts +30 -0
- package/dist/core/recall/related-facts.js +134 -0
- package/dist/core/recall/related-facts.js.map +1 -0
- package/dist/core/recall/rewrite-cache.d.ts +25 -0
- package/dist/core/recall/rewrite-cache.js +60 -0
- package/dist/core/recall/rewrite-cache.js.map +1 -0
- package/dist/core/recall/rewrite-prompt.d.ts +23 -0
- package/dist/core/recall/rewrite-prompt.js +81 -0
- package/dist/core/recall/rewrite-prompt.js.map +1 -0
- package/dist/core/recall-facts/fact-recall-service.d.ts +11 -0
- package/dist/core/recall-facts/fact-recall-service.js +69 -4
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +7 -0
- package/dist/core/scheduler/scheduler.js +26 -0
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/signals/aggregate.d.ts +21 -0
- package/dist/core/signals/aggregate.js +34 -0
- package/dist/core/signals/aggregate.js.map +1 -0
- package/dist/core/signals/failure-mode-recall.d.ts +18 -0
- package/dist/core/signals/failure-mode-recall.js +28 -0
- package/dist/core/signals/failure-mode-recall.js.map +1 -0
- package/dist/core/signals/ingest-signal.d.ts +19 -0
- package/dist/core/signals/ingest-signal.js +63 -0
- package/dist/core/signals/ingest-signal.js.map +1 -0
- package/dist/core/signals/install-scope.d.ts +8 -0
- package/dist/core/signals/install-scope.js +41 -0
- package/dist/core/signals/install-scope.js.map +1 -0
- package/dist/core/signals/recommend.d.ts +13 -0
- package/dist/core/signals/recommend.js +24 -0
- package/dist/core/signals/recommend.js.map +1 -0
- package/dist/core/storage/pg-fact-store.d.ts +5 -0
- package/dist/core/storage/pg-fact-store.js +29 -0
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-session-store.js +16 -1
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.d.ts +16 -0
- package/dist/core/storage/pg-signal-store.js +100 -0
- package/dist/core/storage/pg-signal-store.js.map +1 -0
- package/dist/core/storage/pg-storage.d.ts +2 -0
- package/dist/core/storage/pg-storage.js +3 -0
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-tx-context.d.ts +5 -0
- package/dist/core/storage/pg-tx-context.js +3 -0
- package/dist/core/storage/pg-tx-context.js.map +1 -1
- package/dist/core/storage/sqlite-fact-store.d.ts +5 -0
- package/dist/core/storage/sqlite-fact-store.js +30 -0
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +3 -0
- package/dist/core/storage/sqlite-session-store.js +21 -1
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.d.ts +20 -0
- package/dist/core/storage/sqlite-signal-store.js +112 -0
- package/dist/core/storage/sqlite-signal-store.js.map +1 -0
- package/dist/core/storage/sqlite-storage.d.ts +2 -0
- package/dist/core/storage/sqlite-storage.js +6 -2
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/hook/pi-extension.d.ts +3 -1
- package/dist/hook/pi-extension.js +4 -2
- package/dist/hook/pi-extension.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +10 -1
- package/dist/hook/prompt-recall-hook.js +11 -5
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-over-http.d.ts +11 -1
- package/dist/hook/recall-over-http.js +21 -6
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/session-start-hook.d.ts +2 -0
- package/dist/hook/session-start-hook.js +36 -3
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +16 -0
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +9 -0
- package/dist/http/app.js +125 -10
- package/dist/http/app.js.map +1 -1
- package/dist/install/codex.d.ts +1 -1
- package/dist/install/codex.js +4 -4
- package/dist/install/codex.js.map +1 -1
- package/dist/install/ollama.d.ts +10 -0
- package/dist/install/ollama.js +19 -3
- package/dist/install/ollama.js.map +1 -1
- package/dist/install/pi.d.ts +1 -1
- package/dist/install/pi.js +1 -1
- package/dist/install/rules-content.d.ts +51 -0
- package/dist/install/rules-content.js +140 -0
- package/dist/install/rules-content.js.map +1 -0
- package/dist/install/rules-install.d.ts +35 -0
- package/dist/install/rules-install.js +79 -0
- package/dist/install/rules-install.js.map +1 -0
- package/dist/install/setup.js +63 -10
- package/dist/install/setup.js.map +1 -1
- package/dist/llm/classifier-box.d.ts +2 -1
- package/dist/llm/classifier-box.js +3 -0
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/llm/deepseek-client.d.ts +5 -2
- package/dist/llm/deepseek-client.js +51 -1
- package/dist/llm/deepseek-client.js.map +1 -1
- package/dist/llm/ollama-client.d.ts +3 -2
- package/dist/llm/ollama-client.js +45 -2
- package/dist/llm/ollama-client.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +23 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/llm-client.d.ts +24 -0
- package/dist/ports/signal-store.d.ts +30 -0
- package/dist/ports/signal-store.js +9 -0
- package/dist/ports/signal-store.js.map +1 -0
- package/dist/ports/storage.d.ts +2 -0
- package/dist/ports/transcript-adapter.d.ts +6 -0
- package/dist/shared/types.d.ts +76 -0
- package/dist/ui/assets/index-CgHq6xeZ.css +1 -0
- package/dist/ui/assets/index-DLDd-OM_.js +69 -0
- package/dist/ui/index.html +2 -2
- package/nlm/README.md +1 -1
- package/nlm/index.js +46 -21
- package/package.json +7 -5
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/README.md +3 -3
- package/plugin/scripts/prompt-recall-hook.mjs +45 -20
- package/plugin/scripts/stop-hook.mjs +80 -6
- package/plugin-hermes-agent/README.md +49 -0
- package/plugin-hermes-agent/__init__.py +75 -0
- package/plugin-hermes-agent/plugin.yaml +15 -0
- package/dist/ui/assets/index-B7j5U42U.css +0 -1
- package/dist/ui/assets/index-BO0dvNHn.js +0 -69
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* OllamaClient — LLMClient backed by a local Ollama HTTP endpoint.
|
|
3
3
|
*
|
|
4
4
|
* embed() → POST /api/embeddings (nomic-embed-text by default)
|
|
5
|
-
* classify() → POST /api/chat (
|
|
5
|
+
* classify() → POST /api/chat (qwen3:4b-instruct-2507 by default, format=json)
|
|
6
6
|
*
|
|
7
7
|
* Network/HTTP failure maps to LLMUnreachableError so RecallService can
|
|
8
8
|
* degrade to keyword mode without crashing. Classification parse failures
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* Layering: this file lives in the outer ring. core/ depends on LLMClient,
|
|
12
12
|
* not on this concrete class. Tests can substitute a fake client.
|
|
13
13
|
*/
|
|
14
|
-
import type { ClassifyResult, EmbedResult, EmbeddingKind, LLMClient } from "../ports/llm-client.js";
|
|
14
|
+
import type { ClassifyResult, EmbedResult, EmbeddingKind, LLMClient, RewriteResult } from "../ports/llm-client.js";
|
|
15
15
|
export type FetchImpl = typeof fetch;
|
|
16
16
|
export declare function l2Normalize(vec: Float32Array): Float32Array;
|
|
17
17
|
export interface OllamaClientOptions {
|
|
@@ -41,6 +41,7 @@ export declare class OllamaClient implements LLMClient {
|
|
|
41
41
|
* silent nulls.
|
|
42
42
|
*/
|
|
43
43
|
classify(transcript: string, priorContext?: string): Promise<ClassifyResult>;
|
|
44
|
+
rewriteForRecall(query: string): Promise<RewriteResult>;
|
|
44
45
|
}
|
|
45
46
|
export declare class ClassifierSchemaError extends Error {
|
|
46
47
|
constructor(message: string);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* OllamaClient — LLMClient backed by a local Ollama HTTP endpoint.
|
|
3
3
|
*
|
|
4
4
|
* embed() → POST /api/embeddings (nomic-embed-text by default)
|
|
5
|
-
* classify() → POST /api/chat (
|
|
5
|
+
* classify() → POST /api/chat (qwen3:4b-instruct-2507 by default, format=json)
|
|
6
6
|
*
|
|
7
7
|
* Network/HTTP failure maps to LLMUnreachableError so RecallService can
|
|
8
8
|
* degrade to keyword mode without crashing. Classification parse failures
|
|
@@ -13,6 +13,15 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { LLMUnreachableError } from "../ports/llm-client.js";
|
|
15
15
|
import { CLASSIFIER_SYSTEM_PROMPT, buildUserPrompt, coerceClassifyResult, stripJsonFences, validateClassifierJson, } from "../core/classifier/prompt.js";
|
|
16
|
+
import { REWRITE_SYSTEM_PROMPT, parseRewriteJson } from "../core/recall/rewrite-prompt.js";
|
|
17
|
+
const DEFAULT_REWRITE_TIMEOUT_MS = 5_000;
|
|
18
|
+
function rewriteTimeoutMs() {
|
|
19
|
+
const raw = process.env["NLM_RECALL_REWRITE_TIMEOUT_MS"];
|
|
20
|
+
if (!raw)
|
|
21
|
+
return DEFAULT_REWRITE_TIMEOUT_MS;
|
|
22
|
+
const parsed = Number.parseInt(raw, 10);
|
|
23
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_REWRITE_TIMEOUT_MS;
|
|
24
|
+
}
|
|
16
25
|
// Tried raising 8000 → 28000 on 2026-05-25 to recover the answer-tail of
|
|
17
26
|
// long gold sessions (median LongMemEval-S gold body is 14,294 chars). The
|
|
18
27
|
// Ollama /api/embeddings endpoint returned 500 on 54% of those large
|
|
@@ -51,7 +60,7 @@ export class OllamaClient {
|
|
|
51
60
|
constructor(opts = {}) {
|
|
52
61
|
this.baseUrl = (opts.baseUrl ?? "http://localhost:11434").replace(/\/+$/, "");
|
|
53
62
|
this.embedModel = opts.embedModel ?? "nomic-embed-text";
|
|
54
|
-
this.classifyModel = opts.classifyModel ?? "
|
|
63
|
+
this.classifyModel = opts.classifyModel ?? "qwen3:4b-instruct-2507-q4_K_M";
|
|
55
64
|
this.timeoutMs = opts.timeoutMs ?? 10_000;
|
|
56
65
|
this.classifyTimeoutMs = opts.classifyTimeoutMs ?? 180_000;
|
|
57
66
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
@@ -146,6 +155,40 @@ export class OllamaClient {
|
|
|
146
155
|
clearTimeout(timer);
|
|
147
156
|
}
|
|
148
157
|
}
|
|
158
|
+
async rewriteForRecall(query) {
|
|
159
|
+
const controller = new AbortController();
|
|
160
|
+
const timer = setTimeout(() => controller.abort(), rewriteTimeoutMs());
|
|
161
|
+
try {
|
|
162
|
+
const res = await this.fetchImpl(`${this.baseUrl}/api/chat`, {
|
|
163
|
+
method: "POST",
|
|
164
|
+
headers: { "Content-Type": "application/json" },
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
model: this.classifyModel,
|
|
167
|
+
messages: [
|
|
168
|
+
{ role: "system", content: REWRITE_SYSTEM_PROMPT },
|
|
169
|
+
{ role: "user", content: query },
|
|
170
|
+
],
|
|
171
|
+
stream: false,
|
|
172
|
+
format: "json",
|
|
173
|
+
options: { temperature: 0.1 },
|
|
174
|
+
}),
|
|
175
|
+
signal: controller.signal,
|
|
176
|
+
});
|
|
177
|
+
if (!res.ok)
|
|
178
|
+
throw new LLMUnreachableError("ollama-rewrite", `status ${res.status}`);
|
|
179
|
+
const data = (await res.json());
|
|
180
|
+
const rawContent = data.message?.content?.trim() ?? "";
|
|
181
|
+
return parseRewriteJson(rawContent, "ollama");
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
if (e instanceof LLMUnreachableError)
|
|
185
|
+
throw e;
|
|
186
|
+
throw new LLMUnreachableError("ollama-rewrite", e);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
149
192
|
}
|
|
150
193
|
export class ClassifierSchemaError extends Error {
|
|
151
194
|
constructor(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/llm/ollama-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/llm/ollama-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export interface RecallToolInput {
|
|
|
35
35
|
kind: RecallKindFilter | undefined;
|
|
36
36
|
mode: RecallMode | undefined;
|
|
37
37
|
limit: number | undefined;
|
|
38
|
+
rewrite: boolean | undefined;
|
|
38
39
|
}
|
|
39
40
|
export declare function recallSessionsHandler(deps: McpDeps, input: Partial<RecallToolInput>): Promise<ToolResult>;
|
|
40
41
|
export declare function getSessionHandler(deps: McpDeps, input: {
|
package/dist/mcp/server.js
CHANGED
|
@@ -53,12 +53,23 @@ function err(error) {
|
|
|
53
53
|
content: [{ type: "text", text: `Error: ${message}` }],
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
+
function mcpRewriteDefault() {
|
|
57
|
+
// MCP callers default to rewrite=true since they're already in explicit
|
|
58
|
+
// memory-search context and latency-tolerant. Env var overrides per
|
|
59
|
+
// deployment if the rewrite step regresses quality on a given corpus.
|
|
60
|
+
const raw = process.env["NLM_RECALL_REWRITE_DEFAULT"];
|
|
61
|
+
if (raw === undefined)
|
|
62
|
+
return true;
|
|
63
|
+
return raw !== "0" && raw.toLowerCase() !== "false";
|
|
64
|
+
}
|
|
56
65
|
export async function recallSessionsHandler(deps, input) {
|
|
57
66
|
try {
|
|
67
|
+
const rewrite = input.rewrite ?? mcpRewriteDefault();
|
|
58
68
|
const query = {
|
|
59
69
|
query: input.query ?? "",
|
|
60
70
|
mode: input.mode ?? "hybrid",
|
|
61
71
|
limit: input.limit ?? DEFAULT_LIMIT,
|
|
72
|
+
rewrite,
|
|
62
73
|
...(input.entity !== undefined ? { entity: input.entity } : {}),
|
|
63
74
|
...(input.kind !== undefined ? { kind: input.kind } : {}),
|
|
64
75
|
};
|
|
@@ -68,6 +79,7 @@ export async function recallSessionsHandler(deps, input) {
|
|
|
68
79
|
// mirrors the HTTP /api/recall handler.
|
|
69
80
|
void logQuery({
|
|
70
81
|
source: "mcp",
|
|
82
|
+
runtime: null,
|
|
71
83
|
query: input.query ?? null,
|
|
72
84
|
entity: input.entity ?? null,
|
|
73
85
|
kind: input.kind ?? null,
|
|
@@ -237,9 +249,13 @@ Prefer this over recall_sessions when the user wants the *answer*, not the
|
|
|
237
249
|
+ source quote), no scanning required. recall_sessions is the right tool when
|
|
238
250
|
the user wants context, reasoning, or the full discussion.
|
|
239
251
|
|
|
240
|
-
Returns matching Fact records ordered by
|
|
241
|
-
|
|
242
|
-
|
|
252
|
+
Returns matching Fact records ordered by relevance. Each hit carries a
|
|
253
|
+
\`corroborationCount\` — the number of distinct sessions across the full
|
|
254
|
+
history that asserted the same (subject, predicate, value). Highly
|
|
255
|
+
corroborated facts are boosted in scoring (log-scale, capped) so an
|
|
256
|
+
"uses DuckDB" asserted across 10 sessions outranks a one-off mention.
|
|
257
|
+
Superseded facts are excluded by default; call get_fact_history to walk
|
|
258
|
+
the chain of how a value evolved ("when did X flip from Fastify to Hono?").
|
|
243
259
|
|
|
244
260
|
Examples:
|
|
245
261
|
recall_facts(subject="mac-pro-llm-host", predicate="model")
|
|
@@ -375,6 +391,10 @@ export function createMcpServer(deps) {
|
|
|
375
391
|
.max(100)
|
|
376
392
|
.default(DEFAULT_LIMIT)
|
|
377
393
|
.describe("Max results to return."),
|
|
394
|
+
rewrite: z
|
|
395
|
+
.boolean()
|
|
396
|
+
.optional()
|
|
397
|
+
.describe("If true, run a small LLM rewrite on the query before search — extracts entities and strips conversational filler. Set true for vague natural-language queries ('that pgvector thing'); set false for exact-token queries. Defaults to true server-side for MCP callers; the hot-path HTTP hook caller forces it off regardless."),
|
|
378
398
|
},
|
|
379
399
|
annotations: {
|
|
380
400
|
readOnlyHint: true,
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/dist/ports/fact-store.js
CHANGED
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fact-store.js","sourceRoot":"","sources":["../../src/ports/fact-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
1
|
+
{"version":3,"file":"fact-store.js","sourceRoot":"","sources":["../../src/ports/fact-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0IH,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAiB,EAAE,KAAa;IAChF,OAAO,GAAG,OAAO,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -36,7 +36,31 @@ export interface ClassifyResult {
|
|
|
36
36
|
export declare class LLMUnreachableError extends Error {
|
|
37
37
|
constructor(provider: string, cause?: unknown);
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Result of rewriting a vague natural-language recall query into both a
|
|
41
|
+
* keyword-optimized phrasing (entity-rich, suitable for FTS5 BM25) and a
|
|
42
|
+
* semantic-optimized phrasing (cleaner prose, suitable for embedding).
|
|
43
|
+
*
|
|
44
|
+
* The keyword and semantic queries are independent — keyword strips
|
|
45
|
+
* conversational filler and surfaces named entities; semantic preserves
|
|
46
|
+
* paraphrasing so the embedder has something meaningful to embed.
|
|
47
|
+
*/
|
|
48
|
+
export interface RewriteResult {
|
|
49
|
+
readonly keywordQuery: string;
|
|
50
|
+
readonly semanticQuery: string;
|
|
51
|
+
/** Free-text rationale for debugging; not used by the retrieval path. */
|
|
52
|
+
readonly rationale?: string;
|
|
53
|
+
}
|
|
39
54
|
export interface LLMClient {
|
|
40
55
|
embed(text: string, kind: EmbeddingKind): Promise<EmbedResult>;
|
|
41
56
|
classify(transcript: string): Promise<ClassifyResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Rewrite a recall query for better retrieval. Cheap-ish call (one-shot
|
|
59
|
+
* chat completion, ~hundreds of ms locally). Implementations MUST throw
|
|
60
|
+
* LLMUnreachableError on network/transport failure so callers can
|
|
61
|
+
* fail-open back to the raw query. JSON-parse failures should also
|
|
62
|
+
* throw LLMUnreachableError (or a more specific subclass) — the caller
|
|
63
|
+
* never wants a garbage-rewritten query silently substituted.
|
|
64
|
+
*/
|
|
65
|
+
rewriteForRecall(query: string): Promise<RewriteResult>;
|
|
42
66
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SignalStore -- the only way core/ reads or writes the signal corpus.
|
|
3
|
+
*
|
|
4
|
+
* Sibling to FactStore but deliberately simpler: append-only, idempotent on a
|
|
5
|
+
* deterministic id (ON CONFLICT DO NOTHING), no supersedence, no embeddings.
|
|
6
|
+
* Signals are high-volume structured telemetry, not LLM-distilled facts.
|
|
7
|
+
*/
|
|
8
|
+
import type { Signal, SignalKind } from "../shared/types.js";
|
|
9
|
+
export interface SignalAggregationFilter {
|
|
10
|
+
readonly installScope: string;
|
|
11
|
+
readonly repo?: string;
|
|
12
|
+
readonly model?: string;
|
|
13
|
+
readonly kind?: SignalKind;
|
|
14
|
+
/** ISO lower bound on `ts` (inclusive). Omit for all-time. */
|
|
15
|
+
readonly sinceTs?: string;
|
|
16
|
+
/** Safety cap on rows scanned. Defaults to 5000 in the adapter. */
|
|
17
|
+
readonly limit?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface SignalStore {
|
|
20
|
+
/** Insert one signal. Idempotent: a duplicate id is a no-op, not an error. */
|
|
21
|
+
insert(signal: Signal): Promise<void>;
|
|
22
|
+
/** Insert many signals in one transaction. Duplicate ids are skipped. */
|
|
23
|
+
insertMany(signals: ReadonlyArray<Signal>): Promise<void>;
|
|
24
|
+
/** Rows matching the filter, newest `ts` first, for in-process aggregation. */
|
|
25
|
+
listForAggregation(filter: SignalAggregationFilter): Promise<ReadonlyArray<Signal>>;
|
|
26
|
+
/** Count signals for an install with `ts >= sinceTs`. */
|
|
27
|
+
countSince(installScope: string, sinceTs: string): Promise<number>;
|
|
28
|
+
/** Delete signals with `ts < olderThanTs`. Returns rows deleted. */
|
|
29
|
+
pruneOlderThan(olderThanTs: string): Promise<number>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SignalStore -- the only way core/ reads or writes the signal corpus.
|
|
3
|
+
*
|
|
4
|
+
* Sibling to FactStore but deliberately simpler: append-only, idempotent on a
|
|
5
|
+
* deterministic id (ON CONFLICT DO NOTHING), no supersedence, no embeddings.
|
|
6
|
+
* Signals are high-volume structured telemetry, not LLM-distilled facts.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=signal-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-store.js","sourceRoot":"","sources":["../../src/ports/signal-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/ports/storage.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { FactStore } from "./fact-store.js";
|
|
14
14
|
import type { SessionStore } from "./session-store.js";
|
|
15
|
+
import type { SignalStore } from "./signal-store.js";
|
|
15
16
|
export interface StorageContext {
|
|
16
17
|
readonly facts: FactStore;
|
|
17
18
|
readonly sessions: SessionStore;
|
|
@@ -19,6 +20,7 @@ export interface StorageContext {
|
|
|
19
20
|
export interface Storage {
|
|
20
21
|
readonly facts: FactStore;
|
|
21
22
|
readonly sessions: SessionStore;
|
|
23
|
+
readonly signals: SignalStore;
|
|
22
24
|
/**
|
|
23
25
|
* Run `fn` inside an adapter-defined transaction. The handles on the
|
|
24
26
|
* provided StorageContext are bound to that transaction; reads and writes
|
|
@@ -31,6 +31,12 @@ export interface SessionChunk {
|
|
|
31
31
|
readonly gitBranch: string;
|
|
32
32
|
readonly text: string;
|
|
33
33
|
readonly label: string;
|
|
34
|
+
/**
|
|
35
|
+
* Raw `nlm.signal` payloads found in the transcript (Pi custom_message
|
|
36
|
+
* entries). Normalized + persisted by the scheduler, decoupled from session
|
|
37
|
+
* classification. Undefined for adapters that do not emit signals.
|
|
38
|
+
*/
|
|
39
|
+
readonly signals?: ReadonlyArray<unknown>;
|
|
34
40
|
}
|
|
35
41
|
export interface DiscoverOptions {
|
|
36
42
|
readonly since?: Date;
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -40,6 +40,24 @@ export interface RecallQuery {
|
|
|
40
40
|
readonly kind?: RecallKindFilter;
|
|
41
41
|
readonly mode?: RecallMode;
|
|
42
42
|
readonly limit?: number;
|
|
43
|
+
/**
|
|
44
|
+
* If true, RecallService runs an LLM rewrite pass on the query before
|
|
45
|
+
* keyword/semantic search — useful for vague natural-language queries.
|
|
46
|
+
* Falls back to the raw query on LLM errors. Adds ~hundreds of ms.
|
|
47
|
+
* Off by default; MCP `recall_sessions` tool defaults to true since
|
|
48
|
+
* callers there have already committed to a memory search. Hot-path
|
|
49
|
+
* callers (hooks) pass false; the HTTP handler force-overrides to false
|
|
50
|
+
* when the `x-recall-source: hook` header is present.
|
|
51
|
+
*/
|
|
52
|
+
readonly rewrite?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* If true, RecallService attaches a `relatedFacts` array of current
|
|
55
|
+
* high-confidence facts about the entities in the top hits. Defaults
|
|
56
|
+
* to true for the HTTP hook caller (so the pointer block can include
|
|
57
|
+
* structured context); other callers must opt in. Disable globally
|
|
58
|
+
* via NLM_HOOK_INJECT_FACTS=false. Spec G.2.
|
|
59
|
+
*/
|
|
60
|
+
readonly withRelatedFacts?: boolean;
|
|
43
61
|
}
|
|
44
62
|
export interface RecallHit {
|
|
45
63
|
readonly id: string;
|
|
@@ -65,6 +83,13 @@ export interface RecallResult {
|
|
|
65
83
|
readonly total: number;
|
|
66
84
|
readonly results: ReadonlyArray<RecallHit>;
|
|
67
85
|
readonly modeUnavailable?: "ollama_unreachable";
|
|
86
|
+
/**
|
|
87
|
+
* Spec G.2: optional set of current high-confidence facts about the
|
|
88
|
+
* entities in the top hits. Present only when the caller requested
|
|
89
|
+
* `withRelatedFacts`. The pointer-block formatter renders these as a
|
|
90
|
+
* "Known facts" section beneath the session pointer list.
|
|
91
|
+
*/
|
|
92
|
+
readonly relatedFacts?: ReadonlyArray<RelatedFact>;
|
|
68
93
|
}
|
|
69
94
|
/**
|
|
70
95
|
* Fact — a single normalized claim derived from a session.
|
|
@@ -113,6 +138,13 @@ export interface FactHit extends Fact {
|
|
|
113
138
|
readonly matchedIn: ReadonlyArray<FactMatchField>;
|
|
114
139
|
readonly keywordScore?: number;
|
|
115
140
|
readonly semanticScore?: number;
|
|
141
|
+
/**
|
|
142
|
+
* Number of distinct sessions across the full fact history that asserted
|
|
143
|
+
* this exact (subject, predicate, value). >1 means corroborated; the
|
|
144
|
+
* recall service applies a log-scale boost to matchScore based on this
|
|
145
|
+
* count. Capped boost via NLM_FACT_CORROBORATION_BOOST_CAP.
|
|
146
|
+
*/
|
|
147
|
+
readonly corroborationCount?: number;
|
|
116
148
|
}
|
|
117
149
|
export interface FactRecallResult {
|
|
118
150
|
readonly query: string;
|
|
@@ -125,8 +157,52 @@ export interface FactRecallResult {
|
|
|
125
157
|
readonly results: ReadonlyArray<FactHit>;
|
|
126
158
|
readonly modeUnavailable?: "ollama_unreachable";
|
|
127
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* A current high-confidence fact attached to a recall result — the hook
|
|
162
|
+
* uses these to inject structured context ("polysignal uses: duckdb")
|
|
163
|
+
* alongside the session pointer list. Selected by `pickRelatedFacts`
|
|
164
|
+
* server-side using the entities of the top recall hits, the fact-store
|
|
165
|
+
* confidence filter, and the spec G.1 corroborationCount.
|
|
166
|
+
*/
|
|
167
|
+
export interface RelatedFact {
|
|
168
|
+
readonly subject: string;
|
|
169
|
+
readonly predicate: string;
|
|
170
|
+
readonly value: string;
|
|
171
|
+
readonly corroborationCount: number;
|
|
172
|
+
}
|
|
128
173
|
export interface FactHistoryChain {
|
|
129
174
|
readonly subject: string;
|
|
130
175
|
readonly predicate: string;
|
|
131
176
|
readonly history: ReadonlyArray<Fact>;
|
|
132
177
|
}
|
|
178
|
+
export type SignalKind = "gate" | "eval" | "review" | "test";
|
|
179
|
+
export type SignalOutcome = "pass" | "fail" | "fix" | "exhausted";
|
|
180
|
+
/** Producer-side payload. `install_scope` and `id` are stamped server-side. */
|
|
181
|
+
export interface SignalInput {
|
|
182
|
+
readonly v?: number;
|
|
183
|
+
readonly kind: SignalKind;
|
|
184
|
+
readonly producer: string;
|
|
185
|
+
readonly outcome: SignalOutcome;
|
|
186
|
+
readonly model: string;
|
|
187
|
+
readonly repo: string;
|
|
188
|
+
readonly step: string | null;
|
|
189
|
+
readonly detail: Record<string, unknown> | null;
|
|
190
|
+
readonly session: string | null;
|
|
191
|
+
readonly ts: string;
|
|
192
|
+
}
|
|
193
|
+
/** Stored signal. `step` is denormalized from `detail.step` for indexing. */
|
|
194
|
+
export interface Signal {
|
|
195
|
+
readonly id: string;
|
|
196
|
+
readonly v: number;
|
|
197
|
+
readonly installScope: string;
|
|
198
|
+
readonly kind: SignalKind;
|
|
199
|
+
readonly producer: string;
|
|
200
|
+
readonly outcome: SignalOutcome;
|
|
201
|
+
readonly model: string;
|
|
202
|
+
readonly repo: string;
|
|
203
|
+
readonly step: string | null;
|
|
204
|
+
readonly detail: Record<string, unknown> | null;
|
|
205
|
+
readonly sessionId: string | null;
|
|
206
|
+
readonly ts: string;
|
|
207
|
+
readonly createdAt: string;
|
|
208
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--surface-0: #161616;--surface-1: #1d1d1d;--surface-2: #242424;--surface-float: #2c2c2c;--bg-1: var(--surface-float);--bg-2: var(--surface-2);--border-1: #262626;--border-2: #303030;--border-3: #3d3d3d;--border-4: #525252;--text-1: #e8e8e8;--text-2: #b0b0b0;--text-3: #686868;--text-4: #383838;--accent: #e8ff6e;--accent-dim: rgba(232, 255, 110, .12);--accent-glow: rgba(232, 255, 110, .06);--warn: #ff9933;--warn-dim: rgba(255, 153, 51, .12);--danger: #ff6b35;--danger-dim: rgba(255, 107, 53, .07);--danger-glow: rgba(255, 107, 53, .12);--font-mono: "IBM Plex Mono", "Fira Code", ui-monospace, monospace;--text-xs: 10px;--text-sm: 11px;--text-base: 13px;--text-md: 15px;--text-lg: 18px;--text-xl: 22px;--text-stat: 36px;--lh-tight: 1.3;--lh-base: 1.5;--lh-loose: 1.7;--page-x: 28px;--section-gap: 24px;--r-sm: 3px;--r-md: 5px;--r-lg: 7px;--ease-fast: .1s ease;--ease: .15s ease;--ease-slow: .3s ease;--z-base: 0;--z-raised: 1;--z-sticky: 10;--z-sidenav: 20;--z-dropdown: 30;--z-overlay: 40;--z-drawer-bg: 50;--z-drawer: 60;--z-palette-bg: 70;--z-palette: 80;--z-tooltip: 90;--z-toast: 100}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{background-color:var(--surface-0)}body{background-image:radial-gradient(ellipse 100% 40% at 50% -8%,rgba(232,255,110,.032) 0%,transparent 100%);background-attachment:fixed;color:var(--text-1);font-family:var(--font-mono);min-height:100vh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:var(--surface-1)}::-webkit-scrollbar-thumb{background:var(--border-3);border-radius:2px}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-delay:0ms!important;transition-duration:.01ms!important}}.skeleton{display:inline-block;background:linear-gradient(90deg,var(--surface-1) 0%,var(--surface-2) 50%,var(--surface-1) 100%);background-size:200% 100%;animation:skeleton-shimmer 1.2s ease-in-out infinite;vertical-align:middle}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion: reduce){.skeleton{animation:none;background:var(--surface-2)}}.card{background:var(--surface-1);border:1px solid var(--border-2);border-radius:var(--r-md)}.card-lift{transition:border-color var(--ease),background var(--ease)}.card-lift:hover{background:var(--surface-2);border-color:var(--border-3)}.btn{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-mono);font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;padding:5px 12px;border-radius:var(--r-sm);border:1px solid var(--border-3);background:transparent;color:var(--text-2);cursor:pointer;white-space:nowrap;text-decoration:none;-webkit-user-select:none;user-select:none;transition:border-color var(--ease),color var(--ease),background var(--ease)}.btn:hover{border-color:var(--border-4);color:var(--text-1)}.btn:active{background:var(--surface-2)}.btn.active{background:var(--surface-2);border-color:var(--border-3);color:var(--text-1)}.btn-primary{background:var(--accent);border-color:var(--accent);color:#080808;font-weight:600}.btn-primary:hover{background:#d4eb5e;border-color:#d4eb5e;color:#080808}.btn-accent{color:var(--accent);border-color:#e8ff6e40}.btn-accent:hover{background:var(--accent-glow);border-color:#e8ff6e66}.btn-danger:hover{border-color:var(--danger);color:var(--danger)}.btn.small{padding:3px 9px;font-size:var(--text-xs)}.form-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0}.form-row.between{justify-content:space-between}.form-row.tight{gap:8px}.form-row .form-label{color:var(--text-3);font-size:var(--text-xs)}input[type=file].file-input{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-3);max-width:24rem}input[type=file].file-input::file-selector-button{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;padding:5px 12px;margin-right:10px;border-radius:var(--r-sm);border:1px solid var(--border-3);background:transparent;color:var(--text-2);cursor:pointer;transition:border-color var(--ease),color var(--ease),background var(--ease)}input[type=file].file-input::file-selector-button:hover{border-color:var(--border-4);color:var(--text-1)}input[type=file].file-input:disabled{cursor:not-allowed}input[type=file].file-input:disabled::file-selector-button{opacity:.5;cursor:not-allowed}.chip{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:var(--text-sm);letter-spacing:.06em;text-transform:lowercase;padding:3px 9px;border-radius:var(--r-sm);border:1px solid var(--border-1);background:transparent;color:var(--text-3);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;transition:border-color var(--ease),color var(--ease),background var(--ease)}.chip:hover{border-color:var(--border-3);color:var(--text-2)}.chip.active{border-color:var(--border-3);color:var(--text-1);background:var(--surface-2);font-weight:600;box-shadow:inset 0 0 0 1px var(--border-3)}.chip[data-severity=critical].active{border-color:#ff6b3566;color:var(--danger);background:var(--danger-dim)}.chip[data-severity=high].active{border-color:#cc442259;color:#c42;background:#cc44220f}.chip[data-severity=medium].active{border-color:#ff993359;color:var(--warn);background:var(--warn-dim)}.chip[data-severity=low].active{border-color:var(--border-3);color:var(--text-2);background:var(--surface-2)}.chip[data-status=active].active{color:var(--accent);border-color:#e8ff6e4d;background:var(--accent-glow)}.chip[data-status=idle].active{color:#ffcc80}.chip[data-length].active{color:var(--text-1)}.chip[data-marker].active{color:var(--accent);border-color:#e8ff6e4d;background:var(--accent-glow)}.panel-float{background:#101010f5;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid var(--border-3);border-radius:var(--r-md);box-shadow:0 12px 40px #000000a6,0 0 0 1px #ffffff08}.nav-link{display:inline-flex;align-items:center;background:transparent;border:1px solid transparent;color:var(--text-3);border-radius:var(--r-sm);padding:4px 10px;font-size:var(--text-sm);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;text-decoration:none;transition:color var(--ease),border-color var(--ease),background var(--ease)}.nav-link:hover{color:var(--text-2);border-color:var(--border-3)}.nav-link.active{background:var(--surface-2);border-color:var(--border-3);color:var(--text-1)}.search-input{background:var(--surface-1);border:1px solid var(--border-2);color:var(--text-1);font-family:var(--font-mono);font-size:var(--text-xs);padding:5px 10px;border-radius:var(--r-sm);letter-spacing:.04em;outline:none;transition:border-color var(--ease)}.search-input:focus{border-color:var(--border-3)}.search-input::placeholder{color:var(--text-4);letter-spacing:.06em}.ctrl-btn{background:var(--surface-1);border:1px solid var(--border-2);color:var(--text-2);font-family:var(--font-mono);font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;padding:4px 10px;border-radius:var(--r-sm);cursor:pointer;white-space:nowrap;transition:border-color var(--ease),color var(--ease),background var(--ease)}.ctrl-btn:hover{border-color:var(--border-3);color:var(--text-1)}.ctrl-btn.active{background:var(--surface-2);border-color:var(--border-3);color:var(--accent)}.ctrl-btn[data-active="1"]{color:var(--accent);border-color:#e8ff6e40}.ctrl-label{font-size:var(--text-sm);color:var(--text-3);letter-spacing:.06em;text-transform:uppercase;flex-shrink:0}.subnav{padding:0 28px;border-bottom:1px solid var(--border-1);display:flex;gap:0}.subnav-link{font-size:var(--text-sm);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);text-decoration:none;padding:10px 14px;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color var(--ease),border-color var(--ease)}.subnav-link:hover{color:var(--text-2)}.subnav-link.active{color:var(--accent);border-bottom-color:var(--accent)}.page-shell{display:flex;height:100vh;background:var(--surface-0);overflow:hidden}.page-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}.app-header{position:sticky;top:0;z-index:var(--z-sticky);height:52px;padding:0 var(--page-x);display:flex;align-items:center;gap:20px;background:#161616e6;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--border-1)}.app-header .wordmark-page{font-size:var(--text-sm);color:var(--text-3);letter-spacing:.04em;text-transform:lowercase}.app-header .header-spacer{flex:1}.app-header .status-dot{width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 6px var(--accent-dim);animation:pulse-dot 2s ease-in-out infinite}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.app-header .header-info{font-size:var(--text-xs);color:var(--text-3);letter-spacing:.04em}.sidenav{width:180px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface-1);border-right:1px solid var(--border-1);position:sticky;top:0;height:100vh;overflow:hidden;transition:width var(--ease);z-index:var(--z-sidenav)}.sidenav.collapsed{width:52px}.sidenav-header{padding:0 8px 0 16px;height:52px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border-1);flex-shrink:0}.sidenav-wordmark{font-size:var(--text-sm);font-family:var(--font-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--accent);-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;transition:opacity var(--ease-fast),width var(--ease-fast)}.sidenav.collapsed .sidenav-wordmark{opacity:0;width:0;padding:0}.sidenav-toggle{background:none;border:none;color:var(--text-3);cursor:pointer;padding:5px;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color var(--ease),background var(--ease)}.sidenav-toggle:hover{color:var(--text-1);background:var(--surface-2)}.sidenav.collapsed .sidenav-header{justify-content:center;padding:0 8px}.sidenav-items{flex:1;padding:10px 8px;display:flex;flex-direction:column;gap:2px;overflow:hidden}.sidenav-item{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:var(--r-sm);font-size:var(--text-sm);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);text-decoration:none;border-left:3px solid transparent;transition:color var(--ease),background var(--ease),border-color var(--ease);-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;position:relative}.sidenav-item:hover{color:var(--text-1);background:var(--surface-2)}.sidenav-item.active{color:var(--text-1);border-left-color:var(--accent);background:var(--accent-glow)}.item-icon{flex-shrink:0;display:flex;align-items:center;opacity:.7}.sidenav-item.active .item-icon{opacity:1}.item-label{transition:opacity var(--ease-fast)}.sidenav.collapsed .item-label{display:none}.sidenav.collapsed .sidenav-item{gap:0;padding:8px;justify-content:center;border-left:3px solid transparent}.sidenav.collapsed .sidenav-item.active{border-left-color:var(--accent)}.sidenav.collapsed .sidenav-item:after{content:attr(data-label);position:absolute;left:calc(100% + 8px);top:50%;transform:translateY(-50%);background:var(--surface-float);color:var(--text-1);font-size:var(--text-xs);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;padding:4px 8px;border-radius:var(--r-sm);border:1px solid var(--border-2);white-space:nowrap;pointer-events:none;opacity:0;transition:opacity var(--ease-fast);z-index:var(--z-tooltip)}.sidenav.collapsed .sidenav-item:hover:after{opacity:1}.sidenav-footer{padding:8px;border-top:1px solid var(--border-1);flex-shrink:0}.sidenav-data{font-size:var(--text-xs)}.update-banner{padding:8px 10px;margin-bottom:8px;background:var(--bg-2);border:1px solid var(--border-1);border-radius:6px;font-family:var(--font-sans)}.update-banner-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.update-banner-version{color:var(--text-1)}.update-banner-dismiss{background:none;border:none;color:var(--text-3);font-size:16px;line-height:1;cursor:pointer;padding:0 4px}.update-banner-dismiss:hover{color:var(--text-1)}.update-banner-body{margin:4px 0 6px;color:var(--text-2, var(--text-1))}.update-banner-cmd{padding:4px 6px;background:var(--bg-1);border:1px solid var(--border-1);border-radius:4px;color:var(--text-1);overflow-x:auto;white-space:nowrap;margin-bottom:6px}.update-banner-actions{display:flex;align-items:center;justify-content:space-between;gap:8px}.update-banner-copy{background:var(--accent);border:none;color:var(--bg-1);padding:4px 8px;border-radius:4px;cursor:pointer;font-family:var(--font-mono);font-size:var(--text-xs)}.update-banner-link{color:var(--text-3);text-decoration:underline;text-underline-offset:2px}.update-banner-link:hover{color:var(--text-1)}.update-banner-nudge{margin:8px 0 0;padding:6px 8px;background:var(--bg-1);border-left:2px solid var(--accent);border-radius:3px;color:var(--text-2, var(--text-1))}.update-banner-nudge code{padding:1px 4px;background:var(--bg-0, var(--bg-1));border-radius:3px}.update-banner--collapsed{display:flex;align-items:center;justify-content:center;width:100%;background:none;border:none;padding:6px 0;margin-bottom:8px;cursor:pointer}.update-dot{color:var(--accent);font-size:14px;line-height:1;animation:nlm-update-pulse 2.6s ease-in-out infinite}@keyframes nlm-update-pulse{0%,to{opacity:.45}50%{opacity:1}}.live-page{display:flex;flex-direction:column;flex:1;min-height:0}.live-status{display:flex;align-items:center;gap:8px;padding:12px var(--page-x) 4px}.live-status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.live-status-live{background:var(--accent);box-shadow:0 0 6px var(--accent)}.live-status-connecting{background:var(--text-3)}.live-status-reconnecting{background:var(--warn);animation:pulse-dot 1.2s ease-in-out infinite}.live-status-label{font-family:var(--font-mono);font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--text-2)}.live-board{padding:4px var(--page-x) 20px;display:grid;grid-template-columns:repeat(3,1fr);gap:16px;flex:1;min-height:0}.live-col{background:var(--surface-1);border:1px solid var(--border-2);border-radius:var(--r-md);display:flex;flex-direction:column;overflow:hidden;min-height:0}.live-col-head{padding:10px 14px;border-bottom:1px solid var(--border-1);display:flex;align-items:baseline;justify-content:space-between}.live-col-title{font-size:var(--text-sm);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text-2)}.live-col-count{font-size:var(--text-xs);color:var(--text-3);font-family:var(--font-mono)}.live-col-body{overflow-y:auto;overflow-x:hidden;flex:1}.live-row{padding:8px 14px;border-bottom:1px solid var(--border-1);animation:fadeSlideIn .2s ease-out;min-width:0;overflow-wrap:anywhere}.live-row .label,.live-row .body,.live-row .meta{min-width:0;overflow-wrap:anywhere;word-break:break-word}.live-row:last-child{border-bottom:none}.clickable:focus-visible,.bar-item-clickable:focus-visible,.kpi-clickable:focus-visible{outline:1px solid var(--accent);outline-offset:-1px}.clickable[aria-busy=true],.clickable.is-disabled,.bar-item-clickable[aria-busy=true],.bar-item-clickable.is-disabled{opacity:.5;pointer-events:none}.live-row.clickable{cursor:pointer;transition:background var(--ease)}.live-row.clickable:hover{background:var(--surface-2)}.live-row.is-new{animation:fadeSlideIn .2s ease-out,liveFlash 1.2s ease-out}.live-row.is-related{background:var(--accent-glow);border-left:2px solid var(--accent);padding-left:12px}@keyframes liveFlash{0%{background:var(--accent-glow)}to{background:transparent}}.live-row .label{color:var(--text-1);font-size:var(--text-base);line-height:var(--lh-tight)}.live-row .body{color:var(--text-3);font-size:var(--text-sm);margin-top:3px;line-height:var(--lh-tight)}.live-row .meta{color:var(--text-3);font-size:var(--text-xs);margin-top:4px;letter-spacing:.04em}.live-tag{display:inline-block;font-size:var(--text-xs);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;padding:1px 6px;margin-right:6px;border-radius:var(--r-sm);background:var(--surface-2);color:var(--text-2);border:1px solid var(--border-2)}.live-tag[data-kind=decision]{background:var(--accent-glow);border-color:#e8ff6e40;color:var(--accent)}.live-tag[data-kind=open]{background:var(--warn-dim);border-color:#ff993340;color:var(--warn)}.live-empty{padding:32px 16px;text-align:center;color:var(--text-3);font-size:var(--text-xs);letter-spacing:.06em;text-transform:uppercase}.stub-shell{padding:80px var(--page-x);text-align:center;color:var(--text-3);font-size:var(--text-base);line-height:var(--lh-loose)}.stub-shell .stub-name{color:var(--accent);font-size:var(--text-md);text-transform:lowercase;letter-spacing:.04em;display:block;margin-bottom:12px}.stub-shell .stub-hint{color:var(--text-4);font-size:var(--text-sm)}.page-pad{padding:20px var(--page-x) 60px;flex:1;min-width:0;min-height:0;overflow-y:auto}.page-title{font-size:var(--text-lg);font-family:var(--font-mono);font-weight:500;color:var(--text-1);margin-bottom:16px}.page-header{display:flex;align-items:center;gap:24px;margin-bottom:24px;padding-top:8px}.subnav+.page-header,.subnav+.page-title{gap:28px;margin-top:28px;margin-bottom:28px;padding-top:0}.page-header .page-title,.form-row.between .page-title{margin-bottom:0}.page-header .header-spacer,.thread-header .header-spacer,.river-toolbar .header-spacer{flex:1}.section-title{font-size:var(--text-sm);text-transform:uppercase;letter-spacing:.06em;color:var(--text-3);margin:24px 0 8px;font-weight:500}.muted{color:var(--text-3)}.muted.small{font-size:var(--text-xs);letter-spacing:.04em}.muted.error{color:var(--danger)}.right{text-align:right}.mono{font-family:var(--font-mono)}.small{font-size:var(--text-xs)}code,.code-block{font-family:var(--font-mono);font-size:var(--text-sm);background:var(--surface-2);border:1px solid var(--border-2);padding:2px 6px;border-radius:var(--r-sm);color:var(--text-1)}.code-block{display:block;padding:10px 14px;margin:8px 0}.settings-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;margin-top:16px}.settings-card{padding:14px;text-decoration:none;display:flex;flex-direction:column;gap:6px;color:var(--text-1)}.settings-card-title{font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--accent);font-weight:500}.settings-card-body{color:var(--text-2);font-size:var(--text-sm)}.kv-list{display:grid;grid-template-columns:max-content 1fr;gap:6px 16px;margin-top:12px}.kv-label{color:var(--text-3);font-size:var(--text-sm);letter-spacing:.04em}.kv-value{color:var(--text-1);font-size:var(--text-sm)}.kv-value.mono{font-family:var(--font-mono);word-break:break-all}.form-grid{display:grid;gap:12px;margin-top:12px;max-width:420px}.form-field{display:flex;flex-direction:column;gap:4px}.form-label{font-size:var(--text-xs);color:var(--text-3);letter-spacing:.06em;text-transform:uppercase}.form-input{background:var(--surface-1);border:1px solid var(--border-2);color:var(--text-1);padding:6px 10px;font-family:var(--font-mono);font-size:var(--text-sm);border-radius:var(--r-sm);transition:border-color var(--ease)}.form-input:hover:not(:disabled){border-color:var(--border-3)}.form-input:focus{border-color:var(--border-4);outline:none}.form-input:focus-visible{outline:1px solid var(--accent);outline-offset:-1px}.form-input:disabled,.form-input.is-disabled{opacity:.5;cursor:not-allowed}.form-input[aria-invalid=true],.form-input.is-invalid{border-color:var(--danger)}.form-input[aria-invalid=true]:focus-visible,.form-input.is-invalid:focus-visible{outline-color:var(--danger);border-color:var(--danger)}.form-error{color:var(--danger);font-size:var(--text-xs);margin:4px 0 0}.data-table{width:100%;border-collapse:collapse;margin-top:12px;font-size:var(--text-sm)}.data-table th{text-align:left;font-weight:500;font-size:var(--text-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);padding:8px 10px;border-bottom:1px solid var(--border-2)}.data-table th.right{text-align:right}.data-table td{padding:7px 10px;border-bottom:1px solid var(--border-1);color:var(--text-1);vertical-align:middle}.data-table tr:hover td{background:var(--surface-2)}.canonical .dot{margin-right:8px;vertical-align:middle}.topic-name{display:inline-flex;align-items:baseline;gap:8px}.topic-name .muted.small.mono{font-size:var(--text-xs);opacity:.7}.dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0}.dot.lg{width:14px;height:14px}.chip-inline{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--r-sm);border:1px solid var(--border-2);background:var(--surface-2);color:var(--text-2);font-family:var(--font-mono);font-size:var(--text-xs);letter-spacing:.04em;text-transform:lowercase}.chip-inline.status-active{color:var(--accent);border-color:#e8ff6e40;background:var(--accent-glow)}.chip-inline.status-idle{color:#ffcc80;border-color:#ffcc8040}.chip-inline.status-closed{color:var(--text-2)}.chip-inline.status-superseded{color:var(--text-3);text-decoration:line-through}.chip-inline.status-retired{color:var(--danger);border-color:#ff6b3540;background:var(--danger-dim)}.chip-inline.status-stale{color:var(--warn);border-color:#ff993340;background:var(--warn-dim)}.chip-inline.severity-high{color:var(--danger);border-color:#ff6b3559;background:var(--danger-dim)}.chip-inline.severity-medium{color:var(--warn);border-color:#ff993359;background:var(--warn-dim)}.chip-inline.severity-low{color:var(--text-2);border-color:var(--border-3);background:var(--surface-2)}.chip-x{background:none;border:none;color:inherit;cursor:pointer;font-size:12px;padding:0 0 0 4px;line-height:1}.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi{background:var(--surface-1);border:1px solid var(--border-2);border-radius:var(--r-md);padding:14px 16px;display:flex;flex-direction:column;gap:4px}.kpi-label{font-size:var(--text-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3)}.kpi-value{font-size:var(--text-stat);font-family:var(--font-mono);color:var(--text-1);line-height:1}.kpi-hint{font-size:var(--text-xs);color:var(--text-3)}.kpi-sparkline{gap:8px}.sparkline{display:flex;align-items:flex-end;gap:4px;height:40px}.spark-bar{flex:1;background:var(--accent);opacity:.7;border-radius:1px;min-height:2px}.pulse-grid{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr;grid-template-areas:"coherence recent stale" "runtimes recent stale";gap:12px;margin-top:6px;height:calc(100vh - 280px);min-height:360px}.pulse-area-coherence{grid-area:coherence}.pulse-area-runtimes{grid-area:runtimes}.pulse-area-recent{grid-area:recent}.pulse-area-stale{grid-area:stale}.pulse-scroll-card{display:flex;flex-direction:column;min-height:0;overflow:hidden}.pulse-scroll-card .card-head{flex-shrink:0}.kpi,.pulse-grid>.card{transition:outline-color var(--ease),border-color var(--ease);outline:1px solid transparent;outline-offset:-1px}.kpi:hover{outline-color:#ffffff8c}.kpi-clickable{cursor:pointer;text-decoration:none;color:inherit}.kpi-clickable:hover .kpi-value{color:var(--accent)}.kpi-clickable:hover{border-color:var(--border-3)}.pulse-grid>.pulse-scroll-card:hover{outline-color:#ffffff8c}.pulse-scroll-body{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.card-head{display:flex;align-items:baseline;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--border-1)}.card-head h3{font-size:var(--text-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--text-2);font-weight:500}.bar-stack{display:flex;flex-direction:column;padding:4px 0}.bar-item{display:grid;grid-template-columns:80px 1fr auto;gap:10px;align-items:center;background:transparent;border:0;border-bottom:1px solid var(--border-1);padding:8px 14px;width:100%;text-align:left;color:inherit;font:inherit}.bar-stack .bar-item:last-child{border-bottom:none}.bar-item-clickable{cursor:pointer;transition:background var(--ease)}.bar-item-clickable:hover{background:var(--surface-2)}.bar-item-clickable:hover .bar-label{color:var(--accent)}.bar-item[disabled]{cursor:default;opacity:.5}.bar-label{font-size:var(--text-sm);color:var(--text-2)}.bar-track{height:8px;background:var(--surface-2);border-radius:4px;overflow:hidden}.bar-fill{height:100%;transition:width var(--ease-slow)}.bar-fill.tone-active{background:var(--accent)}.bar-fill.tone-warn{background:var(--warn)}.bar-fill.tone-danger{background:var(--danger)}.bar-value{font-size:var(--text-sm);color:var(--text-1);min-width:96px;text-align:right;white-space:nowrap}.bar-pct{margin-left:2px}.recall-head{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;margin-bottom:20px}.recall-note{max-width:60ch;margin:0;line-height:1.5}.recall-block{margin-bottom:28px}.recall-block-head{margin-bottom:14px}.recall-block-head .page-title{margin-bottom:2px}.recall-block-head p{margin:0;max-width:70ch}.recall-empty{padding:18px;font-size:var(--text-sm)}.recall-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin-top:14px}.recall-bars .bar-item{grid-template-columns:140px 1fr auto}.recall-bar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recall-bars .bar-value{min-width:0}@media (max-width: 720px){.recall-head{flex-direction:column;gap:12px}}.runtime-list{list-style:none;padding:4px 0;margin:0}.runtime-row{display:grid;grid-template-columns:12px 1fr auto auto;align-items:center;gap:10px;padding:8px 14px;border-bottom:1px solid var(--border-1)}.runtime-row:last-child{border-bottom:none}.runtime-dot{width:8px;height:8px;border-radius:50%;background:var(--text-3);box-shadow:0 0 0 2px #ffffff0a}.runtime-dot.runtime-active{background:var(--accent);box-shadow:0 0 6px #e8ff6e99}.runtime-dot.runtime-idle{background:var(--warn)}.runtime-dot.runtime-dormant{background:var(--text-3);opacity:.5}.runtime-name{color:var(--text-1);font-size:var(--text-sm)}.runtime-counts{white-space:nowrap}.runtime-counts-sep{margin:0 6px;opacity:.5}.runtime-counts-prev{opacity:.7}.runtime-age{min-width:60px;text-align:right}.runtime-row.clickable{cursor:pointer;transition:background var(--ease)}.runtime-row.clickable:hover{background:var(--surface-2)}.runtime-row.clickable:hover .runtime-name{color:var(--accent)}.runtime-topics{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:4px;align-items:center}.alert-list{list-style:none;padding:4px 0}.alert-row{display:grid;grid-template-columns:auto auto 1fr;gap:10px;align-items:center;padding:7px 14px;border-bottom:1px solid var(--border-1)}.alert-entity{color:var(--text-1);font-size:var(--text-sm);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.alert-summary{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;color:var(--text-3);font-size:var(--text-xs);letter-spacing:.04em;min-width:0;line-height:var(--lh-base)}.alert-row.clickable{cursor:pointer;transition:background var(--ease)}.alert-row.clickable:hover{background:var(--surface-2)}.alert-row.clickable:hover .alert-entity{color:var(--accent)}.drawer-actions{display:flex;flex-wrap:wrap;gap:6px;margin:14px 0 6px}.session-list{list-style:none}.session-list.compact .session-row{padding:6px 0;border-bottom:1px solid var(--border-1)}.session-row{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:8px 14px;border-bottom:1px solid var(--border-1)}.session-row-detail{grid-template-columns:auto 1fr auto}.session-row-main{display:flex;flex-direction:column;gap:2px;min-width:0}.session-label{color:var(--text-1);font-size:var(--text-sm);text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}a.session-label:hover{color:var(--accent)}.session-meta{color:var(--text-3);font-size:var(--text-xs);letter-spacing:.04em}@media (max-width: 1100px){.pulse-grid{grid-template-columns:1fr 1fr;grid-template-rows:auto;grid-template-areas:"coherence runtimes" "recent recent" "stale stale";height:auto;min-height:0}.pulse-scroll-body{max-height:360px}}@media (max-width: 700px){.pulse-grid{grid-template-columns:1fr;grid-template-areas:"coherence" "runtimes" "recent" "stale"}}.search-bar{display:flex;gap:10px;align-items:center;margin-bottom:12px}.search-input.search-big{flex:1;padding:10px 14px;font-size:var(--text-md)}.search-meta{margin:8px 0}.thread-header{display:flex;align-items:center;gap:14px;margin-bottom:16px}.thread-header .page-title{margin-bottom:0}.thread-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:18px}.marker-list{list-style:none;max-height:360px;overflow-y:auto}.marker-row{display:grid;grid-template-columns:auto auto 1fr auto;gap:10px;padding:7px 14px;border-bottom:1px solid var(--border-1);align-items:baseline}.marker-text{color:var(--text-1);font-size:var(--text-sm);min-width:0}.marker-timestamp{font-variant-numeric:tabular-nums;white-space:nowrap}.marker-action-select{min-width:130px;font-size:var(--text-xs)}.marker-editor{display:inline-flex;align-items:center;gap:6px}.marker-editor-input{min-width:260px}.entity-grid{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;margin-top:16px}.entity-card{padding:10px 12px;text-decoration:none;color:var(--text-1);display:flex;align-items:center;gap:8px}.entity-name{flex:1;font-size:var(--text-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (max-width: 800px){.thread-grid{grid-template-columns:1fr}}.river-toolbar{display:flex;align-items:center;gap:12px;margin-bottom:16px}.river-toolbar .page-title{margin-bottom:0;font-size:var(--text-lg)}.river-grid{--river-label-w: 200px;--river-row-gap: 3px;--river-cell-gap: 2px;--river-cell-h: 20px;padding:12px;width:100%;display:flex;flex-direction:column;gap:var(--river-row-gap)}.river-grid.river-density-compact{--river-row-gap: 1px;--river-cell-gap: 1px;--river-cell-h: 10px}.river-grid.river-density-spacious{--river-row-gap: 6px;--river-cell-gap: 4px;--river-cell-h: 24px}.river-row{display:grid;grid-template-columns:var(--river-label-w) 1fr;gap:6px;align-items:center;width:100%;min-width:0}.river-row-dates{margin-bottom:2px}.river-lane-label{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:var(--r-sm);text-decoration:none;color:var(--text-2);font-size:var(--text-sm);white-space:nowrap;overflow:hidden;width:100%;min-width:0}.river-lane-label:hover{background:var(--surface-2);color:var(--text-1)}.river-lane-label--header{padding:0;background:none}.river-lane-name{flex:1;overflow:hidden;text-overflow:ellipsis;min-width:0}.river-cells{display:grid;grid-template-columns:repeat(var(--cells, 1),minmax(0,1fr));gap:var(--river-cell-gap);width:100%;min-width:0}.river-date-cell{font-size:var(--text-xs);color:var(--text-2);letter-spacing:.04em;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.river-cell{height:var(--river-cell-h);border-radius:2px;background:var(--surface-2);min-width:0}.river-cell.tier-1{background:#e8ff6e33}.river-cell.tier-2{background:#e8ff6e66}.river-cell.tier-3{background:#e8ff6ea6}.river-cell.tier-4{background:var(--accent)}.river-cell.has-corrections{box-shadow:inset 0 -2px #ffb400b3}.alert-row{grid-template-columns:auto minmax(0,max-content) minmax(0,1fr) auto}.alert-actions{display:flex;gap:6px;align-items:center}.alert-actions .chip{font-size:var(--text-xs);padding:2px 8px}.row-actions{display:flex;gap:6px}.row-actions .chip{font-size:var(--text-xs);padding:2px 8px}.row-busy{opacity:.5;pointer-events:none;transition:opacity var(--ease)}.form-input-inline{padding:3px 8px;font-size:var(--text-xs);letter-spacing:.04em}.river-grid{position:relative;-webkit-user-select:none;user-select:none}.river-drag-rect{position:absolute;top:0;bottom:0;background:var(--accent-glow);border-left:1px dashed var(--accent);border-right:1px dashed var(--accent);pointer-events:none;z-index:var(--z-raised)}.river-lane-label{background:none;border:none;text-align:left;cursor:pointer;font-family:var(--font-mono)}.river-cell{transition:outline-color var(--ease);outline:1px solid transparent;outline-offset:1px;position:relative;z-index:var(--z-base)}.river-cell:hover{outline-color:#ffffffb3;z-index:var(--z-raised)}.river-hover{position:fixed;display:flex;align-items:center;gap:8px;background:var(--surface-float);border:1px solid var(--border-3);border-radius:var(--r-sm);padding:6px 10px;font-size:var(--text-xs);pointer-events:none;z-index:var(--z-tooltip);box-shadow:0 6px 20px #00000080}.river-hover-name{color:var(--text-1);font-size:var(--text-sm)}.session-row.clickable{cursor:pointer;transition:background var(--ease)}.session-row.clickable:hover{background:var(--surface-2)}.session-row.clickable:hover .session-label{color:var(--accent)}.link-button{background:none;border:none;color:var(--text-3);font-family:var(--font-mono);font-size:var(--text-xs);cursor:pointer;padding:0;letter-spacing:.04em}.link-button:hover{color:var(--accent)}.drawer-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:var(--z-drawer-bg);animation:fadeIn .15s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.session-drawer{position:fixed;top:0;right:0;bottom:0;width:min(560px,100vw);background:var(--surface-1);border-left:1px solid var(--border-3);box-shadow:-16px 0 40px #0000008c;z-index:var(--z-drawer);display:flex;flex-direction:column;animation:slideInRight .18s ease}.coherence-drawer{width:min(480px,100vw)}@keyframes slideInRight{0%{transform:translate(20px);opacity:0}to{transform:translate(0);opacity:1}}.drawer-head{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--border-1)}.drawer-title{flex:1;font-size:var(--text-md);font-family:var(--font-mono);font-weight:500;color:var(--text-1);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drawer-close{background:none;border:none;color:var(--text-3);font-size:24px;line-height:1;cursor:pointer;padding:0 6px}.drawer-close:hover{color:var(--text-1)}.drawer-body{overflow-y:auto;padding:16px 18px 80px;flex:1;min-height:0}.drawer-paragraph.drawer-hint{color:var(--text-2);margin:0 0 16px}.coherence-session-list .session-row{grid-template-columns:auto 1fr auto auto;transition:background var(--ease)}.coherence-session-list .coherence-meta{white-space:nowrap}.coherence-session-list .session-row{cursor:pointer}.coherence-session-list .session-row:hover{background:var(--surface-2)}.coherence-session-list .session-row:hover .session-label{color:var(--accent)}.coherence-session-list .session-row[aria-busy=true]{opacity:.5;pointer-events:none}.coherence-session-list .chip[data-bucket=active].active{color:var(--accent);border-color:#e8ff6e4d;background:var(--accent-glow)}.coherence-session-list .chip[data-bucket=sparse].active{color:var(--warn);border-color:#ff993359;background:var(--warn-dim)}.coherence-session-list .chip[data-bucket=stale].active{color:var(--danger);border-color:#ff6b3566;background:var(--danger-dim)}.coherence-drawer .drawer-body{display:flex;flex-direction:column;overflow:hidden;padding-bottom:0}.coherence-session-list{flex:1;min-height:0;overflow-y:auto}.coherence-drawer .pagination{flex-shrink:0;border-top:1px solid var(--border-1);margin-top:0}.coherence-drawer .pagination.pagination-compact{padding:10px 18px}.merge-picker{background:var(--surface-2);border:1px solid var(--border-2);border-radius:6px;padding:12px;margin-bottom:12px}.merge-result-list{list-style:none;margin:8px 0 0;padding:0;max-height:240px;overflow-y:auto}.merge-result-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;cursor:pointer}.merge-result-row:hover{background:var(--surface-float)}.merge-result-row.is-selected{outline:2px solid var(--accent);outline-offset:-2px;background:var(--surface-float)}.coherence-rows-dimmed{opacity:.4;pointer-events:none}.coherence-filters{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.coherence-search{width:100%}.coherence-filter-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.drawer-section{font-size:var(--text-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);margin:18px 0 8px;font-weight:500}.drawer-list{list-style:none;display:flex;flex-direction:column;gap:8px;font-size:var(--text-sm);color:var(--text-1)}.drawer-list li{display:flex;gap:8px;align-items:baseline}.drawer-paragraph{font-size:var(--text-sm);color:var(--text-1);line-height:var(--lh-loose)}.drawer-body-text{background:var(--surface-0);border:1px solid var(--border-1);border-radius:var(--r-sm);padding:10px 12px;font-size:var(--text-xs);color:var(--text-2);white-space:pre-wrap;word-break:break-word;max-height:360px;overflow-y:auto;line-height:var(--lh-base)}.entity-chips{display:flex;flex-wrap:wrap;gap:6px}.entity-chips-row{margin-top:4px;align-items:center}.supersedence-banner{display:flex;align-items:baseline;flex-wrap:wrap;gap:6px;padding:8px 12px;border-radius:var(--r-sm);margin-bottom:10px;font-size:var(--text-sm)}.supersedence-banner--superseded{background:#ff6b3514;border:1px solid rgba(255,107,53,.25);color:var(--danger)}.supersedence-banner--supersedes{background:#a8a8a80f;border:1px solid var(--border-2);color:var(--text-2)}.supersedence-label{font-weight:500;white-space:nowrap}.supersedence-ids{display:flex;flex-wrap:wrap;gap:4px}.supersedence-id{color:inherit;opacity:.8}.supersedence-link{background:none;border:none;padding:0;cursor:pointer;font-family:var(--font-mono);font-size:var(--text-xs);color:inherit;text-decoration:underline;text-underline-offset:2px}.supersedence-link:hover{opacity:.75}.drawer-menu{position:relative}.drawer-menu-trigger{background:none;border:none;color:var(--text-3);font-size:var(--text-lg);line-height:1;cursor:pointer;padding:4px 8px;border-radius:4px}.drawer-menu-trigger:hover{color:var(--text-1);background:var(--bg-2)}.drawer-menu-trigger:disabled{opacity:.4;cursor:not-allowed}.drawer-menu-list{position:absolute;top:calc(100% + 4px);right:0;z-index:var(--z-dropdown);margin:0;padding:4px;list-style:none;background:var(--bg-1);border:1px solid var(--border-1);border-radius:6px;min-width:200px;box-shadow:0 6px 20px #00000059}.drawer-menu-item{display:block;width:100%;text-align:left;background:none;border:none;color:var(--text-1);padding:8px 10px;font-family:var(--font-sans);font-size:var(--text-sm);cursor:pointer;border-radius:4px}.drawer-menu-item:hover:not(:disabled){background:var(--bg-2)}.drawer-menu-item:disabled{opacity:.4;cursor:not-allowed}.palette-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:var(--z-palette-bg)}.supersede-palette{position:fixed;top:12vh;left:50%;transform:translate(-50%);width:min(640px,92vw);max-height:76vh;display:flex;flex-direction:column;background:var(--bg-1);border:1px solid var(--border-1);border-radius:8px;z-index:var(--z-palette);box-shadow:0 24px 60px #00000073}.palette-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--border-1)}.palette-title{flex:1;font-family:var(--font-mono);font-size:var(--text-md);color:var(--text-1)}.palette-body{padding:14px 16px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:12px}.palette-context{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;padding:10px 12px;background:var(--bg-2);border-radius:4px;border-left:2px solid var(--border-2)}.palette-context-label{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-3);text-transform:uppercase;letter-spacing:.04em}.palette-context-value{color:var(--text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.palette-context-id{grid-column:2;color:var(--text-3)}.palette-field-label{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-3);text-transform:uppercase;letter-spacing:.04em}.palette-input{width:100%;box-sizing:border-box;background:var(--bg-2);border:1px solid var(--border-1);border-radius:4px;padding:8px 10px;color:var(--text-1);font-size:var(--text-sm)}.palette-input:focus{outline:none;border-color:var(--accent)}.palette-list{list-style:none;margin:0;padding:0;border:1px solid var(--border-1);border-radius:4px;max-height:280px;overflow-y:auto}.palette-row{display:grid;grid-template-columns:80px 110px minmax(0,1fr) minmax(80px,160px);gap:10px;align-items:center;padding:6px 10px;cursor:pointer;border-bottom:1px solid var(--border-1)}.palette-row-id{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}.palette-row:last-child{border-bottom:none}.palette-row--hot{background:var(--bg-2)}.palette-row:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.palette-row[aria-selected=true] .palette-row-date,.palette-row[aria-selected=true] .palette-row-runtime,.palette-row[aria-selected=true] .palette-row-id{color:var(--text-2, var(--text-1))}.palette-row-label{color:var(--text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.palette-empty{padding:10px;text-align:center}.palette-pick{display:grid;grid-template-columns:auto 1fr auto;gap:4px 10px;padding:10px 12px;background:var(--bg-2);border-radius:4px;border-left:2px solid var(--accent)}.palette-pick .palette-context-id{grid-column:2 / 3}.palette-undo{grid-row:1 / span 2;grid-column:3;align-self:center;background:none;border:1px solid var(--border-1);color:var(--text-3);padding:4px 8px;border-radius:4px;cursor:pointer;font-size:var(--text-xs)}.palette-undo:hover:not(:disabled){color:var(--text-1);border-color:var(--border-2)}.palette-error{background:#dc50501f;border:1px solid rgba(220,80,80,.35);color:#f0a0a0;padding:8px 10px;border-radius:4px;font-size:var(--text-sm)}.palette-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;border-top:1px solid var(--border-1)}.palette-hint{font-family:var(--font-mono)}.palette-confirm{background:var(--accent);border:none;color:var(--bg-1);padding:8px 14px;border-radius:4px;cursor:pointer;font-family:var(--font-mono);font-size:var(--text-sm)}.palette-confirm:disabled{opacity:.4;cursor:not-allowed}.card-head.card-head-stack{flex-direction:column;align-items:stretch;gap:8px;padding:10px 14px 12px}.card-head-row{display:flex;align-items:baseline;justify-content:space-between}.card-filters{display:flex;gap:12px;flex-wrap:wrap}.filter-group{display:flex;gap:4px}.filter-group .chip{font-size:var(--text-xs);padding:2px 8px}.thread-sessions-head{display:flex;align-items:center;gap:12px;margin:24px 0 8px}.thread-sessions-title{margin:0;flex-shrink:0}.thread-sessions-head .search-input{flex:1}.thread-filters{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}.thread-filters .filter-group{flex-wrap:wrap}.pagination{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:14px 0 4px;border-top:1px solid var(--border-1);margin-top:4px}.page-size{display:flex;align-items:center;gap:8px}.page-nav{display:flex;align-items:center;gap:4px}.page-nav .chip:disabled{opacity:.4;cursor:not-allowed}.page-indicator{font-size:var(--text-sm);color:var(--text-2);padding:0 8px;min-width:60px;text-align:center}.marker-row-promotable{display:grid;grid-template-columns:auto 1fr auto auto;gap:10px;align-items:baseline}.marker-row-promotable .marker-actions{display:flex;gap:6px;align-items:baseline}.promote-chip{font-size:var(--text-xs);padding:2px 8px;color:var(--accent);border-color:#e8ff6e4d;background:var(--accent-glow)}.promote-chip:hover{border-color:#e8ff6e8c;color:var(--accent);background:var(--accent-dim)}.promote-editor{display:flex;gap:6px;align-items:center;min-width:280px}.promote-input{flex:1;min-width:200px}.pagination.pagination-compact{gap:10px;padding:10px 0 4px;font-size:var(--text-xs);flex-wrap:wrap}.pagination.pagination-compact .page-indicator{min-width:40px;padding:0 4px;font-size:var(--text-xs)}.pagination.pagination-compact .chip{padding:1px 6px;font-size:var(--text-xs)}.pagination.pagination-compact .form-label{font-size:9px}.river-date-cell--month-start{border-left:1px solid var(--border-2);padding-left:3px}.river-legend{display:flex;align-items:center;gap:3px}.river-legend-cell{width:12px;height:12px;border-radius:2px;background:var(--surface-2)}.river-legend-cell.tier-1{background:#e8ff6e33}.river-legend-cell.tier-2{background:#e8ff6e66}.river-legend-cell.tier-3{background:#e8ff6ea6}.river-legend-cell.tier-4{background:var(--accent)}.empty-row{color:var(--text-2);padding:16px 14px;font-size:var(--text-sm)}.list-action-row{padding:8px 14px}.toast-host{position:fixed;bottom:24px;right:24px;z-index:var(--z-toast);display:flex;flex-direction:column;gap:8px;max-width:min(420px,calc(100vw - 48px));pointer-events:none}.toast{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;background:var(--surface-float);border:1px solid var(--border-3);border-left:3px solid var(--text-2);border-radius:var(--r-md);box-shadow:0 12px 32px #00000073;font-size:var(--text-sm);color:var(--text-1);pointer-events:auto;animation:fadeSlideIn .2s ease-out}.toast-success{border-left-color:var(--accent)}.toast-error{border-left-color:var(--danger)}.toast-info{border-left-color:var(--text-2)}.toast-message{flex:1;line-height:var(--lh-base)}.toast-close{background:transparent;border:0;color:var(--text-3);cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 2px;margin-top:-2px}.toast-close:hover{color:var(--text-1)}.tooltip-anchor{position:relative;display:inline-flex}.tooltip{position:absolute;left:50%;transform:translate(-50%) translateY(-4px);background:var(--surface-float);color:var(--text-1);border:1px solid var(--border-3);border-radius:var(--r-sm);padding:4px 8px;font-size:var(--text-xs);font-family:var(--font-mono);letter-spacing:.04em;max-width:240px;width:max-content;text-align:center;pointer-events:none;opacity:0;transition:opacity var(--ease-fast),transform var(--ease-fast);z-index:var(--z-tooltip)}.tooltip-top .tooltip{bottom:100%;margin-bottom:4px}.tooltip-bottom .tooltip{top:100%;margin-top:4px}.tooltip-anchor:hover .tooltip,.tooltip-anchor:focus-within .tooltip{opacity:1;transform:translate(-50%) translateY(0)}.confirm-dialog{position:fixed;top:22vh;left:50%;transform:translate(-50%);width:min(440px,92vw);background:var(--surface-float);border:1px solid var(--border-3);border-radius:var(--r-md);padding:20px 22px 16px;z-index:var(--z-palette);box-shadow:0 24px 60px #0000008c;animation:fadeSlideIn .2s ease-out}.confirm-title{margin:0 0 8px;font-family:var(--font-mono);font-size:var(--text-base);color:var(--text-1);letter-spacing:.04em}.confirm-message{margin:0 0 16px;color:var(--text-2);font-size:var(--text-sm);line-height:var(--lh-base)}.confirm-actions{display:flex;justify-content:flex-end;gap:8px}.session-meta{display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}.search-wrap{position:relative;display:flex;align-items:center}.search-wrap .search-input{padding-right:28px;width:100%}.search-clear{position:absolute;right:6px;background:none;border:none;color:var(--text-3);cursor:pointer;display:flex;align-items:center;padding:0}.search-clear:hover{color:var(--text-1)}.drawer-nav{display:flex;gap:4px;align-items:center;flex-shrink:0}.drawer-nav-btn{background:none;border:1px solid var(--border-2);color:var(--text-3);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:3px;border-radius:var(--r-sm);transition:color var(--ease),border-color var(--ease),background var(--ease)}.drawer-nav-btn:hover:not(:disabled){color:var(--text-1);border-color:var(--border-3);background:var(--surface-2)}.drawer-nav-btn:disabled{opacity:.35;cursor:not-allowed}.dot-pulse{animation:dot-pulse 2s ease-in-out infinite}@keyframes dot-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.35)}}.search-hint{margin:8px 0 12px}.search-header{position:sticky;top:0;z-index:var(--z-sticky);background:var(--surface-0);padding-bottom:12px;border-bottom:1px solid var(--border-1);margin-bottom:16px}.session-row.is-selected{background:var(--surface-2);border-left:2px solid var(--accent);padding-left:12px}.live-tag[data-kind=summary]{background:var(--surface-2);color:var(--text-2)}.live-tag[data-kind=label]{background:var(--surface-2);color:var(--text-1)}.live-tag[data-kind=entity]{background:var(--accent-glow);border-color:#e8ff6e40;color:var(--accent)}.match-snippet{color:var(--text-2);font-size:var(--text-xs);line-height:var(--lh-base);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:4px}.match-snippet mark{background:#e8ff6e26;color:var(--accent);padding:0 2px;border-radius:2px}
|