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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded in-memory TTL cache for query rewrites.
|
|
3
|
+
*
|
|
4
|
+
* Same raw query within the TTL window reuses the prior LLM rewrite —
|
|
5
|
+
* avoids burning ~hundreds-of-ms per repeated call when an agent hammers
|
|
6
|
+
* `recall_sessions` with slightly different phrasings of the same intent.
|
|
7
|
+
*
|
|
8
|
+
* Bounded by max entries (LRU eviction) AND TTL (lazy expiry on read).
|
|
9
|
+
* No background timer — entries are checked at read time and dropped if
|
|
10
|
+
* expired, which keeps the cache zero-cost when idle.
|
|
11
|
+
*/
|
|
12
|
+
import type { RewriteResult } from "../../ports/llm-client.js";
|
|
13
|
+
export declare class RewriteCache {
|
|
14
|
+
private readonly store;
|
|
15
|
+
private readonly maxEntries;
|
|
16
|
+
private readonly ttlMs;
|
|
17
|
+
constructor(opts?: {
|
|
18
|
+
readonly maxEntries?: number;
|
|
19
|
+
readonly ttlMs?: number;
|
|
20
|
+
});
|
|
21
|
+
get(rawQuery: string, now?: number): RewriteResult | null;
|
|
22
|
+
set(rawQuery: string, result: RewriteResult, now?: number): void;
|
|
23
|
+
size(): number;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded in-memory TTL cache for query rewrites.
|
|
3
|
+
*
|
|
4
|
+
* Same raw query within the TTL window reuses the prior LLM rewrite —
|
|
5
|
+
* avoids burning ~hundreds-of-ms per repeated call when an agent hammers
|
|
6
|
+
* `recall_sessions` with slightly different phrasings of the same intent.
|
|
7
|
+
*
|
|
8
|
+
* Bounded by max entries (LRU eviction) AND TTL (lazy expiry on read).
|
|
9
|
+
* No background timer — entries are checked at read time and dropped if
|
|
10
|
+
* expired, which keeps the cache zero-cost when idle.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_MAX_ENTRIES = 200;
|
|
13
|
+
const DEFAULT_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
14
|
+
export class RewriteCache {
|
|
15
|
+
store = new Map();
|
|
16
|
+
maxEntries;
|
|
17
|
+
ttlMs;
|
|
18
|
+
constructor(opts = {}) {
|
|
19
|
+
this.maxEntries = opts.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
20
|
+
this.ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;
|
|
21
|
+
}
|
|
22
|
+
get(rawQuery, now = Date.now()) {
|
|
23
|
+
const key = normalize(rawQuery);
|
|
24
|
+
const entry = this.store.get(key);
|
|
25
|
+
if (!entry)
|
|
26
|
+
return null;
|
|
27
|
+
if (entry.expiresAt <= now) {
|
|
28
|
+
this.store.delete(key);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// LRU touch: re-insert so this key is now the most recent.
|
|
32
|
+
this.store.delete(key);
|
|
33
|
+
this.store.set(key, entry);
|
|
34
|
+
return entry.result;
|
|
35
|
+
}
|
|
36
|
+
set(rawQuery, result, now = Date.now()) {
|
|
37
|
+
const key = normalize(rawQuery);
|
|
38
|
+
if (this.store.has(key))
|
|
39
|
+
this.store.delete(key);
|
|
40
|
+
this.store.set(key, { result, expiresAt: now + this.ttlMs });
|
|
41
|
+
while (this.store.size > this.maxEntries) {
|
|
42
|
+
const oldestKey = this.store.keys().next().value;
|
|
43
|
+
if (oldestKey === undefined)
|
|
44
|
+
break;
|
|
45
|
+
this.store.delete(oldestKey);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
size() {
|
|
49
|
+
return this.store.size;
|
|
50
|
+
}
|
|
51
|
+
clear() {
|
|
52
|
+
this.store.clear();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function normalize(s) {
|
|
56
|
+
// Case-insensitive, whitespace-collapsed key — "PGVector thing" hits the
|
|
57
|
+
// same cache slot as "pgvector thing".
|
|
58
|
+
return s.trim().toLowerCase().replace(/\s+/g, " ");
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=rewrite-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite-cache.js","sourceRoot":"","sources":["../../../src/core/recall/rewrite-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAOlD,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjC,UAAU,CAAS;IACnB,KAAK,CAAS;IAE/B,YAAY,OAAkE,EAAE;QAC9E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,2DAA2D;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,MAAqB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACnE,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACjD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,0EAA0E;IAC1E,uCAAuC;IACvC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt + parser for query rewriting (Spec C).
|
|
3
|
+
*
|
|
4
|
+
* Vague natural-language queries ("that pgvector thing", "where did we leave
|
|
5
|
+
* the auth migration") get rewritten into two phrasings: a keyword-optimized
|
|
6
|
+
* one (entity-rich, conversational filler stripped) for FTS5 BM25, and a
|
|
7
|
+
* semantic-optimized one (cleaner prose, paraphrase preserved) for embeddings.
|
|
8
|
+
*
|
|
9
|
+
* Already-specific queries are preserved — the prompt instructs the model to
|
|
10
|
+
* pass them through. Recall is upstream of all scoring, so a wrong rewrite
|
|
11
|
+
* silently corrupts every downstream result; the bar for "do something" is
|
|
12
|
+
* intentionally high.
|
|
13
|
+
*
|
|
14
|
+
* Output schema is strict JSON; parse failures throw so the caller fails
|
|
15
|
+
* open back to the raw query rather than embedding garbage.
|
|
16
|
+
*/
|
|
17
|
+
import { type RewriteResult } from "../../ports/llm-client.js";
|
|
18
|
+
export declare const REWRITE_SYSTEM_PROMPT = "You rewrite vague recall queries for a session-search engine.\n\nGiven a user query, return strict JSON with three fields:\n- \"keywordQuery\": entity-rich phrasing for keyword search. Strip conversational\n filler (\"what was that\", \"remember when\", \"did we\"). Preserve named entities,\n technical tokens (camelCase, snake_case, dotted names), and any specific\n identifiers. If the query is already specific (e.g. \"pgvector migration plan\"),\n return it unchanged.\n- \"semanticQuery\": natural-prose phrasing for semantic embedding. Smooth out\n vague references into a clearer paraphrase if you can, but never invent\n entities or facts not present in the input. If the query is already a clean\n prose phrasing, return it unchanged.\n- \"rationale\": one short sentence explaining what you changed (for debugging).\n\nExamples:\n\nInput: \"what was that pgvector thing we decided on\"\nOutput: {\"keywordQuery\":\"pgvector\",\"semanticQuery\":\"pgvector decision\",\"rationale\":\"stripped conversational filler\"}\n\nInput: \"pgvector migration plan\"\nOutput: {\"keywordQuery\":\"pgvector migration plan\",\"semanticQuery\":\"pgvector migration plan\",\"rationale\":\"already specific, passed through\"}\n\nInput: \"where did we leave the auth migration\"\nOutput: {\"keywordQuery\":\"auth migration\",\"semanticQuery\":\"current state of the auth migration\",\"rationale\":\"extracted topic and reshaped as status query\"}\n\nInput: \"Hermes\"\nOutput: {\"keywordQuery\":\"Hermes\",\"semanticQuery\":\"Hermes\",\"rationale\":\"single entity, passed through\"}\n\nRules:\n- NEVER invent entities, products, or technical names not in the input.\n- NEVER expand acronyms unless you are confident.\n- If the input is empty or makes no sense as a recall query, return it as-is in both fields.\n- Output strict JSON only, no markdown fence, no commentary.\n";
|
|
19
|
+
/**
|
|
20
|
+
* Parse strict JSON rewrite output. Throws LLMUnreachableError on any parse
|
|
21
|
+
* or shape error so the caller falls back to raw query.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseRewriteJson(raw: string, providerLabel: string): RewriteResult;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt + parser for query rewriting (Spec C).
|
|
3
|
+
*
|
|
4
|
+
* Vague natural-language queries ("that pgvector thing", "where did we leave
|
|
5
|
+
* the auth migration") get rewritten into two phrasings: a keyword-optimized
|
|
6
|
+
* one (entity-rich, conversational filler stripped) for FTS5 BM25, and a
|
|
7
|
+
* semantic-optimized one (cleaner prose, paraphrase preserved) for embeddings.
|
|
8
|
+
*
|
|
9
|
+
* Already-specific queries are preserved — the prompt instructs the model to
|
|
10
|
+
* pass them through. Recall is upstream of all scoring, so a wrong rewrite
|
|
11
|
+
* silently corrupts every downstream result; the bar for "do something" is
|
|
12
|
+
* intentionally high.
|
|
13
|
+
*
|
|
14
|
+
* Output schema is strict JSON; parse failures throw so the caller fails
|
|
15
|
+
* open back to the raw query rather than embedding garbage.
|
|
16
|
+
*/
|
|
17
|
+
import { LLMUnreachableError } from "../../ports/llm-client.js";
|
|
18
|
+
export const REWRITE_SYSTEM_PROMPT = `You rewrite vague recall queries for a session-search engine.
|
|
19
|
+
|
|
20
|
+
Given a user query, return strict JSON with three fields:
|
|
21
|
+
- "keywordQuery": entity-rich phrasing for keyword search. Strip conversational
|
|
22
|
+
filler ("what was that", "remember when", "did we"). Preserve named entities,
|
|
23
|
+
technical tokens (camelCase, snake_case, dotted names), and any specific
|
|
24
|
+
identifiers. If the query is already specific (e.g. "pgvector migration plan"),
|
|
25
|
+
return it unchanged.
|
|
26
|
+
- "semanticQuery": natural-prose phrasing for semantic embedding. Smooth out
|
|
27
|
+
vague references into a clearer paraphrase if you can, but never invent
|
|
28
|
+
entities or facts not present in the input. If the query is already a clean
|
|
29
|
+
prose phrasing, return it unchanged.
|
|
30
|
+
- "rationale": one short sentence explaining what you changed (for debugging).
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
|
|
34
|
+
Input: "what was that pgvector thing we decided on"
|
|
35
|
+
Output: {"keywordQuery":"pgvector","semanticQuery":"pgvector decision","rationale":"stripped conversational filler"}
|
|
36
|
+
|
|
37
|
+
Input: "pgvector migration plan"
|
|
38
|
+
Output: {"keywordQuery":"pgvector migration plan","semanticQuery":"pgvector migration plan","rationale":"already specific, passed through"}
|
|
39
|
+
|
|
40
|
+
Input: "where did we leave the auth migration"
|
|
41
|
+
Output: {"keywordQuery":"auth migration","semanticQuery":"current state of the auth migration","rationale":"extracted topic and reshaped as status query"}
|
|
42
|
+
|
|
43
|
+
Input: "Hermes"
|
|
44
|
+
Output: {"keywordQuery":"Hermes","semanticQuery":"Hermes","rationale":"single entity, passed through"}
|
|
45
|
+
|
|
46
|
+
Rules:
|
|
47
|
+
- NEVER invent entities, products, or technical names not in the input.
|
|
48
|
+
- NEVER expand acronyms unless you are confident.
|
|
49
|
+
- If the input is empty or makes no sense as a recall query, return it as-is in both fields.
|
|
50
|
+
- Output strict JSON only, no markdown fence, no commentary.
|
|
51
|
+
`;
|
|
52
|
+
/**
|
|
53
|
+
* Parse strict JSON rewrite output. Throws LLMUnreachableError on any parse
|
|
54
|
+
* or shape error so the caller falls back to raw query.
|
|
55
|
+
*/
|
|
56
|
+
export function parseRewriteJson(raw, providerLabel) {
|
|
57
|
+
let parsed;
|
|
58
|
+
try {
|
|
59
|
+
// Strip a leading code fence if the model returned one despite instruction.
|
|
60
|
+
const trimmed = raw.trim().replace(/^```(?:json)?\s*/i, "").replace(/\s*```\s*$/, "");
|
|
61
|
+
parsed = JSON.parse(trimmed);
|
|
62
|
+
}
|
|
63
|
+
catch (cause) {
|
|
64
|
+
throw new LLMUnreachableError(`${providerLabel}-rewrite-parse`, cause);
|
|
65
|
+
}
|
|
66
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
67
|
+
throw new LLMUnreachableError(`${providerLabel}-rewrite-shape`);
|
|
68
|
+
}
|
|
69
|
+
const obj = parsed;
|
|
70
|
+
const keywordQuery = typeof obj["keywordQuery"] === "string" ? obj["keywordQuery"].trim() : "";
|
|
71
|
+
const semanticQuery = typeof obj["semanticQuery"] === "string" ? obj["semanticQuery"].trim() : "";
|
|
72
|
+
if (!keywordQuery || !semanticQuery) {
|
|
73
|
+
throw new LLMUnreachableError(`${providerLabel}-rewrite-empty`);
|
|
74
|
+
}
|
|
75
|
+
const result = { keywordQuery, semanticQuery };
|
|
76
|
+
if (typeof obj["rationale"] === "string") {
|
|
77
|
+
return { ...result, rationale: obj["rationale"].trim() };
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=rewrite-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite-prompt.js","sourceRoot":"","sources":["../../../src/core/recall/rewrite-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,aAAqB;IACjE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,4EAA4E;QAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAAC,GAAG,aAAa,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,mBAAmB,CAAC,GAAG,aAAa,gBAAgB,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,cAAc,CAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,MAAM,aAAa,GAAG,OAAO,GAAG,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,eAAe,CAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9G,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,mBAAmB,CAAC,GAAG,aAAa,gBAAgB,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9D,IAAI,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAG,GAAG,CAAC,WAAW,CAAY,CAAC,IAAI,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -30,5 +30,16 @@ export declare class FactRecallService {
|
|
|
30
30
|
private readonly deps;
|
|
31
31
|
constructor(deps: FactRecallServiceDeps);
|
|
32
32
|
search(input: FactRecallQuery): Promise<FactRecallResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetch corroboration counts for the candidate hits and apply a log-scale
|
|
35
|
+
* boost to matchScore. Sessions that asserted the same (subject, predicate,
|
|
36
|
+
* value) get a multiplicative bonus capped at NLM_FACT_CORROBORATION_BOOST_CAP
|
|
37
|
+
* (default 2.0). Set the env var to 1.0 to disable the boost while still
|
|
38
|
+
* returning the count on each hit.
|
|
39
|
+
*
|
|
40
|
+
* Failure mode: any DB error reverts to returning the raw hits unchanged.
|
|
41
|
+
* The boost is a quality improvement, not a correctness contract.
|
|
42
|
+
*/
|
|
43
|
+
private applyCorroboration;
|
|
33
44
|
private runSemantic;
|
|
34
45
|
}
|
|
@@ -28,6 +28,16 @@ const STORAGE_FETCH_CAP = 500;
|
|
|
28
28
|
const HYBRID_KW_WEIGHT = 0.4;
|
|
29
29
|
const HYBRID_SEM_WEIGHT = 0.6;
|
|
30
30
|
const SEMANTIC_OVERFETCH = 3;
|
|
31
|
+
const DEFAULT_BOOST_CAP = 2.0;
|
|
32
|
+
function readBoostCap() {
|
|
33
|
+
const raw = process.env["NLM_FACT_CORROBORATION_BOOST_CAP"];
|
|
34
|
+
if (raw === undefined)
|
|
35
|
+
return DEFAULT_BOOST_CAP;
|
|
36
|
+
const parsed = Number.parseFloat(raw);
|
|
37
|
+
if (!Number.isFinite(parsed) || parsed < 1)
|
|
38
|
+
return DEFAULT_BOOST_CAP;
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
31
41
|
const FIELD_WEIGHTS = {
|
|
32
42
|
value: 3,
|
|
33
43
|
subject: 1,
|
|
@@ -104,19 +114,74 @@ export class FactRecallService {
|
|
|
104
114
|
const rows = candidates
|
|
105
115
|
.slice(0, limit)
|
|
106
116
|
.map((f) => factToHit(f, 0, []));
|
|
107
|
-
|
|
117
|
+
const boosted = await this.applyCorroboration(rows);
|
|
118
|
+
return finalize(queryText, subject, predicate, kind, mode, limit, boosted);
|
|
108
119
|
}
|
|
109
120
|
if (mode === "keyword") {
|
|
110
|
-
|
|
121
|
+
const boosted = await this.applyCorroboration(kwHits.map(toKeywordHit));
|
|
122
|
+
return finalize(queryText, subject, predicate, kind, mode, limit, boosted);
|
|
111
123
|
}
|
|
112
124
|
if (mode === "semantic") {
|
|
113
|
-
|
|
125
|
+
const boosted = await this.applyCorroboration(semHits.map(toSemanticHit));
|
|
126
|
+
return finalize(queryText, subject, predicate, kind, mode, limit, boosted);
|
|
114
127
|
}
|
|
115
128
|
// hybrid
|
|
116
129
|
const merged = mergeHybrid(kwHits, semHits, byId);
|
|
117
|
-
const
|
|
130
|
+
const boosted = await this.applyCorroboration(merged);
|
|
131
|
+
const result = finalize(queryText, subject, predicate, kind, mode, limit, boosted);
|
|
118
132
|
return semError ? { ...result, modeUnavailable: semError } : result;
|
|
119
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch corroboration counts for the candidate hits and apply a log-scale
|
|
136
|
+
* boost to matchScore. Sessions that asserted the same (subject, predicate,
|
|
137
|
+
* value) get a multiplicative bonus capped at NLM_FACT_CORROBORATION_BOOST_CAP
|
|
138
|
+
* (default 2.0). Set the env var to 1.0 to disable the boost while still
|
|
139
|
+
* returning the count on each hit.
|
|
140
|
+
*
|
|
141
|
+
* Failure mode: any DB error reverts to returning the raw hits unchanged.
|
|
142
|
+
* The boost is a quality improvement, not a correctness contract.
|
|
143
|
+
*/
|
|
144
|
+
async applyCorroboration(hits) {
|
|
145
|
+
if (hits.length === 0)
|
|
146
|
+
return hits;
|
|
147
|
+
try {
|
|
148
|
+
const triples = hits.map((h) => ({
|
|
149
|
+
subject: h.subject,
|
|
150
|
+
predicate: h.predicate,
|
|
151
|
+
value: h.value,
|
|
152
|
+
}));
|
|
153
|
+
const counts = await this.deps.factStore.corroborationCounts(triples);
|
|
154
|
+
const cap = readBoostCap();
|
|
155
|
+
const boosted = hits.map((h) => {
|
|
156
|
+
const key = `${h.subject} ${h.predicate} ${h.value}`;
|
|
157
|
+
const count = counts.get(key) ?? 1;
|
|
158
|
+
const factor = Math.min(cap, 1 + Math.log10(Math.max(1, count)));
|
|
159
|
+
return {
|
|
160
|
+
...h,
|
|
161
|
+
matchScore: round4(h.matchScore * factor),
|
|
162
|
+
corroborationCount: count,
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
// Sort by matchScore, then corroborationCount as tiebreaker — but only
|
|
166
|
+
// when the boost is active (cap > 1). Cap = 1 means "count is reported
|
|
167
|
+
// but never affects ranking", so the tiebreaker is skipped to preserve
|
|
168
|
+
// native order on ties.
|
|
169
|
+
if (cap > 1) {
|
|
170
|
+
boosted.sort((a, b) => {
|
|
171
|
+
if (b.matchScore !== a.matchScore)
|
|
172
|
+
return b.matchScore - a.matchScore;
|
|
173
|
+
return (b.corroborationCount ?? 0) - (a.corroborationCount ?? 0);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
boosted.sort((a, b) => b.matchScore - a.matchScore);
|
|
178
|
+
}
|
|
179
|
+
return boosted;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return hits;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
120
185
|
async runSemantic(query, byId, fetchLimit) {
|
|
121
186
|
const embedding = await this.deps.llm.embed(query, "query");
|
|
122
187
|
const neighbors = await this.deps.factStore.semanticSearch(embedding.vector, fetchLimit);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fact-recall-service.js","sourceRoot":"","sources":["../../../src/core/recall-facts/fact-recall-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fact-recall-service.js","sourceRoot":"","sources":["../../../src/core/recall-facts/fact-recall-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import type { LLMClient } from "../../ports/llm-client.js";
|
|
20
20
|
import type { TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
21
|
+
import type { SignalStore } from "../../ports/signal-store.js";
|
|
21
22
|
import type { SqliteFactStore } from "../storage/sqlite-fact-store.js";
|
|
22
23
|
import type { SqliteSessionStore } from "../storage/sqlite-session-store.js";
|
|
23
24
|
export interface SchedulerOptions {
|
|
@@ -33,6 +34,11 @@ export interface SchedulerOptions {
|
|
|
33
34
|
* updated, and for any future caller that wants facts off).
|
|
34
35
|
*/
|
|
35
36
|
readonly factStore?: SqliteFactStore | null;
|
|
37
|
+
/** SignalStore for the self-improvement lane. When set, the tick drains
|
|
38
|
+
* each chunk's embedded nlm.signal payloads, decoupled from classification. */
|
|
39
|
+
readonly signalStore?: SignalStore | null;
|
|
40
|
+
/** Per-install scope stamped on drained signals. Required when signalStore is set. */
|
|
41
|
+
readonly installScope?: string;
|
|
36
42
|
readonly intervalMs?: number;
|
|
37
43
|
readonly classifyTimeoutMs?: number;
|
|
38
44
|
readonly confidenceFloor?: number;
|
|
@@ -56,4 +62,5 @@ export declare class ScanScheduler {
|
|
|
56
62
|
stop(): void;
|
|
57
63
|
private scheduleNext;
|
|
58
64
|
tick(): Promise<TickReport>;
|
|
65
|
+
private drainSignals;
|
|
59
66
|
}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* are skipped rather than persisted as low-quality noise.
|
|
18
18
|
*/
|
|
19
19
|
import { extractFacts } from "../facts/extract-facts.js";
|
|
20
|
+
import { normalizeSignal } from "../signals/ingest-signal.js";
|
|
20
21
|
import { MAX_CLASSIFY_FAILURES, getFileSize, recordClassified, recordFailed, recordFailedPg, scanOnce, scanOncePg } from "./scan-once.js";
|
|
21
22
|
const DEFAULT_INTERVAL_MS = 30 * 60 * 1000; // 30 min, matches Python default
|
|
22
23
|
const DEFAULT_CLASSIFY_TIMEOUT_MS = 120_000;
|
|
@@ -34,6 +35,8 @@ export class ScanScheduler {
|
|
|
34
35
|
classifier: opts.classifier,
|
|
35
36
|
embedder: opts.embedder ?? null,
|
|
36
37
|
factStore: opts.factStore ?? null,
|
|
38
|
+
signalStore: opts.signalStore ?? null,
|
|
39
|
+
installScope: opts.installScope ?? "default",
|
|
37
40
|
intervalMs: opts.intervalMs ?? DEFAULT_INTERVAL_MS,
|
|
38
41
|
classifyTimeoutMs: opts.classifyTimeoutMs ?? DEFAULT_CLASSIFY_TIMEOUT_MS,
|
|
39
42
|
confidenceFloor: opts.confidenceFloor ?? DEFAULT_CONFIDENCE_FLOOR,
|
|
@@ -81,6 +84,7 @@ export class ScanScheduler {
|
|
|
81
84
|
}
|
|
82
85
|
for (const { chunk, supersedes } of results) {
|
|
83
86
|
chunksSeen += 1;
|
|
87
|
+
await this.drainSignals(chunk);
|
|
84
88
|
let classification;
|
|
85
89
|
try {
|
|
86
90
|
classification = await withTimeout(this.opts.classifier.classify(chunk.text), this.opts.classifyTimeoutMs);
|
|
@@ -153,6 +157,28 @@ export class ScanScheduler {
|
|
|
153
157
|
}
|
|
154
158
|
return { inserted, skippedLowConfidence, classifyFailures, storageFailures, chunksSeen };
|
|
155
159
|
}
|
|
160
|
+
async drainSignals(chunk) {
|
|
161
|
+
if (process.env["NLM_SIGNALS_ENABLED"] === "0")
|
|
162
|
+
return;
|
|
163
|
+
if (!this.opts.signalStore || !chunk.signals?.length)
|
|
164
|
+
return;
|
|
165
|
+
try {
|
|
166
|
+
const normalized = [];
|
|
167
|
+
for (const raw of chunk.signals) {
|
|
168
|
+
try {
|
|
169
|
+
normalized.push(normalizeSignal(raw, this.opts.installScope));
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// skip a malformed embedded signal; one bad entry must not lose the rest
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (normalized.length > 0)
|
|
176
|
+
await this.opts.signalStore.insertMany(normalized);
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
this.opts.logger(`[scheduler] signal drain failed for ${chunk.id}: ${e instanceof Error ? e.message : String(e)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
156
182
|
}
|
|
157
183
|
class TimeoutError extends Error {
|
|
158
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/core/scheduler/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/core/scheduler/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure roll-up of signals into threshold-gated failure modes. No I/O, no LLM
|
|
3
|
+
* (LLM polish lives in the UI / `nlm improve` layer only). The caller passes a
|
|
4
|
+
* pre-filtered, pre-windowed slice from the SignalStore.
|
|
5
|
+
*/
|
|
6
|
+
import type { Signal } from "../../shared/types.js";
|
|
7
|
+
export interface FailureMode {
|
|
8
|
+
readonly repo: string;
|
|
9
|
+
readonly model: string;
|
|
10
|
+
readonly kind: string;
|
|
11
|
+
readonly step: string | null;
|
|
12
|
+
readonly total: number;
|
|
13
|
+
readonly failures: number;
|
|
14
|
+
readonly failRate: number;
|
|
15
|
+
readonly lastTs: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AggregateOptions {
|
|
18
|
+
readonly minFailRate?: number;
|
|
19
|
+
readonly minSamples?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function aggregateFailureModes(signals: ReadonlyArray<Signal>, opts?: AggregateOptions): ReadonlyArray<FailureMode>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure roll-up of signals into threshold-gated failure modes. No I/O, no LLM
|
|
3
|
+
* (LLM polish lives in the UI / `nlm improve` layer only). The caller passes a
|
|
4
|
+
* pre-filtered, pre-windowed slice from the SignalStore.
|
|
5
|
+
*/
|
|
6
|
+
const FAILING = new Set(["fail", "exhausted"]);
|
|
7
|
+
export function aggregateFailureModes(signals, opts = {}) {
|
|
8
|
+
const minFailRate = opts.minFailRate ?? 0.2;
|
|
9
|
+
const minSamples = opts.minSamples ?? 10;
|
|
10
|
+
const buckets = new Map();
|
|
11
|
+
for (const s of signals) {
|
|
12
|
+
const key = [s.repo, s.model, s.kind, s.step ?? ""].join("\0");
|
|
13
|
+
let b = buckets.get(key);
|
|
14
|
+
if (!b) {
|
|
15
|
+
b = { repo: s.repo, model: s.model, kind: s.kind, step: s.step, total: 0, failures: 0, lastTs: s.ts };
|
|
16
|
+
buckets.set(key, b);
|
|
17
|
+
}
|
|
18
|
+
b.total += 1;
|
|
19
|
+
if (FAILING.has(s.outcome))
|
|
20
|
+
b.failures += 1;
|
|
21
|
+
if (s.ts > b.lastTs)
|
|
22
|
+
b.lastTs = s.ts;
|
|
23
|
+
}
|
|
24
|
+
const modes = [];
|
|
25
|
+
for (const b of buckets.values()) {
|
|
26
|
+
const failRate = b.total === 0 ? 0 : b.failures / b.total;
|
|
27
|
+
if (b.total >= minSamples && failRate >= minFailRate) {
|
|
28
|
+
modes.push({ repo: b.repo, model: b.model, kind: b.kind, step: b.step, total: b.total, failures: b.failures, failRate, lastTs: b.lastTs });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
modes.sort((a, b) => b.failRate - a.failRate || b.total - a.total);
|
|
32
|
+
return modes;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/core/signals/aggregate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,MAAM,OAAO,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAEpE,MAAM,UAAU,qBAAqB,CACnC,OAA8B,EAC9B,OAAyB,EAAE;IAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IAGzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACtG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM;YAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;QAC1D,IAAI,CAAC,CAAC,KAAK,IAAI,UAAU,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7I,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the deterministic "Known failure modes" block injected at session
|
|
3
|
+
* start. No LLM on this path - it runs inside the SessionStart hook's ~2s
|
|
4
|
+
* budget. Threshold-gated via the aggregator.
|
|
5
|
+
*/
|
|
6
|
+
import type { SignalStore } from "../../ports/signal-store.js";
|
|
7
|
+
import { type AggregateOptions, type FailureMode } from "./aggregate.js";
|
|
8
|
+
export interface FailureModeRecallOptions extends AggregateOptions {
|
|
9
|
+
readonly windowDays?: number;
|
|
10
|
+
readonly maxModes?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function renderFailureMode(mode: FailureMode, windowDays: number): string;
|
|
13
|
+
export declare function buildFailureModeBlock(store: SignalStore, args: {
|
|
14
|
+
installScope: string;
|
|
15
|
+
repo: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
}, opts?: FailureModeRecallOptions): Promise<string>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the deterministic "Known failure modes" block injected at session
|
|
3
|
+
* start. No LLM on this path - it runs inside the SessionStart hook's ~2s
|
|
4
|
+
* budget. Threshold-gated via the aggregator.
|
|
5
|
+
*/
|
|
6
|
+
import { aggregateFailureModes } from "./aggregate.js";
|
|
7
|
+
export function renderFailureMode(mode, windowDays) {
|
|
8
|
+
const pct = Math.round(mode.failRate * 100);
|
|
9
|
+
const where = mode.step ? `\`${mode.step}\`` : mode.kind;
|
|
10
|
+
return `- ${mode.model} failed ${where} on ${pct}% of ${mode.kind} checks in this repo (n=${mode.total}, ${windowDays}d).`;
|
|
11
|
+
}
|
|
12
|
+
export async function buildFailureModeBlock(store, args, opts = {}) {
|
|
13
|
+
const windowDays = opts.windowDays ?? 14;
|
|
14
|
+
const maxModes = opts.maxModes ?? 3;
|
|
15
|
+
const now = (args.now ?? (() => new Date()))();
|
|
16
|
+
const sinceTs = new Date(now.getTime() - windowDays * 86_400_000).toISOString();
|
|
17
|
+
const signals = await store.listForAggregation({
|
|
18
|
+
installScope: args.installScope,
|
|
19
|
+
repo: args.repo,
|
|
20
|
+
...(args.model ? { model: args.model } : {}),
|
|
21
|
+
sinceTs,
|
|
22
|
+
});
|
|
23
|
+
const modes = aggregateFailureModes(signals, opts).slice(0, maxModes);
|
|
24
|
+
if (modes.length === 0)
|
|
25
|
+
return "";
|
|
26
|
+
return ["## Known failure modes for this repo", ...modes.map((m) => renderFailureMode(m, windowDays))].join("\n");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=failure-mode-recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-mode-recall.js","sourceRoot":"","sources":["../../../src/core/signals/failure-mode-recall.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,qBAAqB,EAA2C,MAAM,gBAAgB,CAAC;AAOhG,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,UAAkB;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACzD,OAAO,KAAK,IAAI,CAAC,KAAK,WAAW,KAAK,OAAO,GAAG,QAAQ,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,KAAK,KAAK,UAAU,KAAK,CAAC;AAC7H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAkB,EAClB,IAA8E,EAC9E,OAAiC,EAAE;IAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC;QAC7C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,OAAO,CAAC,sCAAsC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boundary validation + normalization for inbound signals (HTTP and
|
|
3
|
+
* session-embedded share this). kind/outcome are the lane definers - invalid
|
|
4
|
+
* values throw (fail loud at the boundary). producer/model/repo/ts soft-default
|
|
5
|
+
* so a sloppy-but-valid producer still records data rather than being dropped.
|
|
6
|
+
*
|
|
7
|
+
* The id is deterministic over (session, producer, ts, step, outcome) so a
|
|
8
|
+
* session file re-parsed after it grows re-emits the same ids and the store's
|
|
9
|
+
* ON CONFLICT DO NOTHING makes re-ingest a no-op.
|
|
10
|
+
*/
|
|
11
|
+
import type { Signal } from "../../shared/types.js";
|
|
12
|
+
export declare function signalId(parts: {
|
|
13
|
+
sessionId: string | null;
|
|
14
|
+
producer: string;
|
|
15
|
+
ts: string;
|
|
16
|
+
step: string | null;
|
|
17
|
+
outcome: string;
|
|
18
|
+
}): string;
|
|
19
|
+
export declare function normalizeSignal(raw: unknown, installScope: string, now?: () => string): Signal;
|