nlm-memory 0.11.1 → 0.13.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 +1 -1
- package/dist/cli/classify-parity.js +1 -1
- package/dist/cli/classify-parity.js.map +1 -1
- package/dist/cli/nlm.js +323 -62
- package/dist/cli/nlm.js.map +1 -1
- package/dist/core/classifier/prompt.d.ts +70 -0
- package/dist/core/classifier/prompt.js +71 -2
- package/dist/core/classifier/prompt.js.map +1 -1
- package/dist/core/exemplars/extract-exemplar.d.ts +36 -0
- package/dist/core/exemplars/extract-exemplar.js +177 -0
- package/dist/core/exemplars/extract-exemplar.js.map +1 -0
- package/dist/core/exemplars/ingest-exemplar.d.ts +30 -0
- package/dist/core/exemplars/ingest-exemplar.js +71 -0
- package/dist/core/exemplars/ingest-exemplar.js.map +1 -0
- package/dist/core/exemplars/recall-code.d.ts +25 -0
- package/dist/core/exemplars/recall-code.js +49 -0
- package/dist/core/exemplars/recall-code.js.map +1 -0
- package/dist/core/facts/backfill-facts.d.ts +4 -2
- package/dist/core/facts/backfill-facts.js +18 -27
- package/dist/core/facts/backfill-facts.js.map +1 -1
- package/dist/core/hook/strip-injected-context.d.ts +24 -0
- package/dist/core/hook/strip-injected-context.js +73 -0
- package/dist/core/hook/strip-injected-context.js.map +1 -0
- package/dist/core/ingest/ingest-session.d.ts +4 -2
- package/dist/core/ingest/ingest-session.js +12 -4
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/providers/provider-registry.d.ts +31 -11
- package/dist/core/providers/provider-registry.js +27 -13
- package/dist/core/providers/provider-registry.js.map +1 -1
- package/dist/core/recall/metadata-tiebreaker.d.ts +32 -0
- package/dist/core/recall/metadata-tiebreaker.js +59 -0
- package/dist/core/recall/metadata-tiebreaker.js.map +1 -0
- package/dist/core/recall/recall-service.js +11 -3
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.js +75 -28
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +4 -2
- package/dist/core/scheduler/scheduler.js +26 -15
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/sources/source-registry.d.ts +36 -12
- package/dist/core/sources/source-registry.js +59 -44
- package/dist/core/sources/source-registry.js.map +1 -1
- package/dist/core/storage/backup-rotation.d.ts +38 -0
- package/dist/core/storage/backup-rotation.js +82 -0
- package/dist/core/storage/backup-rotation.js.map +1 -0
- package/dist/core/storage/null-code-exemplar-store.d.ts +21 -0
- package/dist/core/storage/null-code-exemplar-store.js +19 -0
- package/dist/core/storage/null-code-exemplar-store.js.map +1 -0
- package/dist/core/storage/pg-fact-store.d.ts +2 -0
- package/dist/core/storage/pg-fact-store.js +34 -3
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-session-store.d.ts +14 -4
- package/dist/core/storage/pg-session-store.js +123 -2
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +11 -2
- package/dist/core/storage/pg-storage.js +14 -2
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-tx-context.d.ts +2 -0
- package/dist/core/storage/pg-tx-context.js +12 -0
- package/dist/core/storage/pg-tx-context.js.map +1 -1
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +40 -0
- package/dist/core/storage/sqlite-code-exemplar-store.js +247 -0
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -0
- package/dist/core/storage/sqlite-fact-store.d.ts +2 -0
- package/dist/core/storage/sqlite-fact-store.js +30 -2
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +21 -0
- package/dist/core/storage/sqlite-session-store.js +23 -0
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +6 -0
- package/dist/core/storage/sqlite-storage.js +14 -2
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/supersedence-log.d.ts +8 -0
- package/dist/core/storage/supersedence-log.js +19 -0
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +5 -4
- package/dist/hook/prompt-recall-hook.js +12 -7
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/http/app.d.ts +7 -1
- package/dist/http/app.js +226 -83
- package/dist/http/app.js.map +1 -1
- package/dist/install/codex.d.ts +29 -1
- package/dist/install/codex.js +117 -15
- package/dist/install/codex.js.map +1 -1
- package/dist/install/cursor.d.ts +4 -4
- package/dist/install/cursor.js +7 -7
- package/dist/install/cursor.js.map +1 -1
- package/dist/install/health.d.ts +56 -0
- package/dist/install/health.js +133 -0
- package/dist/install/health.js.map +1 -0
- package/dist/install/setup.js +1 -1
- package/dist/install/setup.js.map +1 -1
- package/dist/install/windsurf.d.ts +4 -4
- package/dist/install/windsurf.js +7 -7
- package/dist/install/windsurf.js.map +1 -1
- package/dist/llm/classifier-box.d.ts +4 -0
- package/dist/llm/classifier-box.js +9 -2
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/llm/ollama-client.d.ts +19 -1
- package/dist/llm/ollama-client.js +14 -6
- package/dist/llm/ollama-client.js.map +1 -1
- package/dist/llm/ollama-code-embedder.d.ts +28 -0
- package/dist/llm/ollama-code-embedder.js +73 -0
- package/dist/llm/ollama-code-embedder.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.js +132 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/code-embedder.d.ts +27 -0
- package/dist/ports/code-embedder.js +15 -0
- package/dist/ports/code-embedder.js.map +1 -0
- package/dist/ports/code-exemplar-store.d.ts +45 -0
- package/dist/ports/code-exemplar-store.js +11 -0
- package/dist/ports/code-exemplar-store.js.map +1 -0
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/storage.d.ts +8 -0
- package/dist/shared/types.d.ts +35 -0
- package/dist/ui/assets/{index-CJgVgxlM.js → index-CVo7KKw2.js} +2 -2
- package/dist/ui/assets/{index-D5lKaksH.css → index-DCuQrzJH.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/migrations/021_code_exemplars.sql +51 -0
- package/migrations/022_facts_retired_at.sql +17 -0
- package/migrations/pg/021_code_exemplars.sql +45 -0
- package/migrations/pg/022_facts_retired_at.sql +12 -0
- package/nlm/index.js +6 -1
- package/package.json +3 -2
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/hooks/hooks.json +13 -2
- package/plugin/scripts/prompt-recall-hook.mjs +7 -1
- package/plugin/scripts/session-start-hook.mjs +275 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-storage.js","sourceRoot":"","sources":["../../../src/core/storage/pg-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"pg-storage.js","sourceRoot":"","sources":["../../../src/core/storage/pg-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,9 +21,11 @@ export declare class PgTxBoundFactStore implements FactStore {
|
|
|
21
21
|
insert(fact: Fact): Promise<void>;
|
|
22
22
|
insertMany(facts: ReadonlyArray<Fact>): Promise<void>;
|
|
23
23
|
markSuperseded(oldId: string, newId: string | null): Promise<void>;
|
|
24
|
+
retire(factId: string): Promise<void>;
|
|
24
25
|
ingestSessionFacts(sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
|
|
25
26
|
upsertEmbedding(factId: string, vector: Float32Array): Promise<void>;
|
|
26
27
|
getById(_id: string): Promise<Fact | null>;
|
|
28
|
+
getByIds(_ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
|
|
27
29
|
findCurrent(_s: string, _p: string): Promise<Fact | null>;
|
|
28
30
|
list(_q: FactQuery): Promise<ReadonlyArray<Fact>>;
|
|
29
31
|
listBySession(_id: string): Promise<ReadonlyArray<Fact>>;
|
|
@@ -32,6 +32,17 @@ export class PgTxBoundFactStore {
|
|
|
32
32
|
});
|
|
33
33
|
return Promise.resolve();
|
|
34
34
|
}
|
|
35
|
+
retire(factId) {
|
|
36
|
+
this.q.push({
|
|
37
|
+
sql: "UPDATE facts SET retired_at = $1 WHERE id = $2",
|
|
38
|
+
params: [new Date().toISOString(), factId],
|
|
39
|
+
});
|
|
40
|
+
this.q.push({
|
|
41
|
+
sql: "DELETE FROM fact_embeddings WHERE fact_id = $1",
|
|
42
|
+
params: [factId],
|
|
43
|
+
});
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
}
|
|
35
46
|
ingestSessionFacts(sessionId, facts) {
|
|
36
47
|
this.q.push({
|
|
37
48
|
sql: "DELETE FROM facts WHERE source_session_id = $1",
|
|
@@ -73,6 +84,7 @@ export class PgTxBoundFactStore {
|
|
|
73
84
|
return Promise.resolve();
|
|
74
85
|
}
|
|
75
86
|
getById(_id) { return noRead("FactStore.getById"); }
|
|
87
|
+
getByIds(_ids) { return noRead("FactStore.getByIds"); }
|
|
76
88
|
findCurrent(_s, _p) { return noRead("FactStore.findCurrent"); }
|
|
77
89
|
list(_q) { return noRead("FactStore.list"); }
|
|
78
90
|
listBySession(_id) { return noRead("FactStore.listBySession"); }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-tx-context.js","sourceRoot":"","sources":["../../../src/core/storage/pg-tx-context.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pg-tx-context.js","sourceRoot":"","sources":["../../../src/core/storage/pg-tx-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteCodeExemplarStore — CodeExemplarStore over the shared better-sqlite3
|
|
3
|
+
* connection (same handle as the rest of SqliteStorage).
|
|
4
|
+
*
|
|
5
|
+
* Insert is idempotent: a duplicate (install_scope, code_hash) is a no-op
|
|
6
|
+
* (INSERT OR IGNORE on the primary key, which is sha256 of the dedup tuple).
|
|
7
|
+
* The vec lane is managed separately via upsertEmbedding; inserts succeed
|
|
8
|
+
* even when no embedder is configured.
|
|
9
|
+
*/
|
|
10
|
+
import type Database from "better-sqlite3";
|
|
11
|
+
import type { CodeExemplarSearchFilter, CodeExemplarStore } from "../../ports/code-exemplar-store.js";
|
|
12
|
+
import type { CodeExemplar, CodeExemplarHit, CodeExemplarInput } from "../../shared/types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Deterministic primary key: sha256(install_scope|repo|code_hash|outcome)[:16].
|
|
15
|
+
* Guarantees one row per unique (scope, repo, exact-code-content, outcome).
|
|
16
|
+
*/
|
|
17
|
+
export declare function exemplarId(parts: {
|
|
18
|
+
installScope: string;
|
|
19
|
+
repo: string;
|
|
20
|
+
codeHash: string;
|
|
21
|
+
outcome: string;
|
|
22
|
+
}): string;
|
|
23
|
+
export declare class SqliteCodeExemplarStore implements CodeExemplarStore {
|
|
24
|
+
private readonly db;
|
|
25
|
+
constructor(db: Database.Database);
|
|
26
|
+
insert(input: CodeExemplarInput): Promise<{
|
|
27
|
+
id: string;
|
|
28
|
+
skipped: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
insertMany(inputs: ReadonlyArray<CodeExemplarInput>): Promise<number>;
|
|
31
|
+
upsertEmbedding(exemplarId: string, vector: Float32Array): Promise<void>;
|
|
32
|
+
searchByVector(queryVector: Float32Array, filter: CodeExemplarSearchFilter): Promise<ReadonlyArray<CodeExemplarHit>>;
|
|
33
|
+
getById(id: string): Promise<CodeExemplar | null>;
|
|
34
|
+
applyBucketCap(installScope: string, maxPerBucket: number): Promise<number>;
|
|
35
|
+
pruneReverted(installScope: string): Promise<number>;
|
|
36
|
+
pruneOlderThan(olderThanTs: string): Promise<number>;
|
|
37
|
+
private insertStmt;
|
|
38
|
+
private toRow;
|
|
39
|
+
private rowToExemplar;
|
|
40
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteCodeExemplarStore — CodeExemplarStore over the shared better-sqlite3
|
|
3
|
+
* connection (same handle as the rest of SqliteStorage).
|
|
4
|
+
*
|
|
5
|
+
* Insert is idempotent: a duplicate (install_scope, code_hash) is a no-op
|
|
6
|
+
* (INSERT OR IGNORE on the primary key, which is sha256 of the dedup tuple).
|
|
7
|
+
* The vec lane is managed separately via upsertEmbedding; inserts succeed
|
|
8
|
+
* even when no embedder is configured.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
const VEC_DIM = 768;
|
|
12
|
+
/**
|
|
13
|
+
* Deterministic primary key: sha256(install_scope|repo|code_hash|outcome)[:16].
|
|
14
|
+
* Guarantees one row per unique (scope, repo, exact-code-content, outcome).
|
|
15
|
+
*/
|
|
16
|
+
export function exemplarId(parts) {
|
|
17
|
+
return createHash("sha256")
|
|
18
|
+
.update([parts.installScope, parts.repo, parts.codeHash, parts.outcome].join("|"))
|
|
19
|
+
.digest("hex")
|
|
20
|
+
.slice(0, 16);
|
|
21
|
+
}
|
|
22
|
+
export class SqliteCodeExemplarStore {
|
|
23
|
+
db;
|
|
24
|
+
constructor(db) {
|
|
25
|
+
this.db = db;
|
|
26
|
+
}
|
|
27
|
+
async insert(input) {
|
|
28
|
+
const id = exemplarId({
|
|
29
|
+
installScope: input.installScope,
|
|
30
|
+
repo: input.repo,
|
|
31
|
+
codeHash: input.codeHash,
|
|
32
|
+
outcome: input.outcome,
|
|
33
|
+
});
|
|
34
|
+
const info = this.insertStmt().run(this.toRow(id, input));
|
|
35
|
+
return { id, skipped: info.changes === 0 };
|
|
36
|
+
}
|
|
37
|
+
async insertMany(inputs) {
|
|
38
|
+
if (inputs.length === 0)
|
|
39
|
+
return 0;
|
|
40
|
+
const stmt = this.insertStmt();
|
|
41
|
+
let inserted = 0;
|
|
42
|
+
const txn = this.db.transaction((rows) => {
|
|
43
|
+
for (const row of rows) {
|
|
44
|
+
const info = stmt.run(row);
|
|
45
|
+
if (info.changes > 0)
|
|
46
|
+
inserted++;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
txn(inputs.map((inp) => {
|
|
50
|
+
const id = exemplarId({
|
|
51
|
+
installScope: inp.installScope,
|
|
52
|
+
repo: inp.repo,
|
|
53
|
+
codeHash: inp.codeHash,
|
|
54
|
+
outcome: inp.outcome,
|
|
55
|
+
});
|
|
56
|
+
return this.toRow(id, inp);
|
|
57
|
+
}));
|
|
58
|
+
return inserted;
|
|
59
|
+
}
|
|
60
|
+
async upsertEmbedding(exemplarId, vector) {
|
|
61
|
+
if (vector.length !== VEC_DIM) {
|
|
62
|
+
throw new Error(`code exemplar embeddings must be ${VEC_DIM}-dim (got ${vector.length})`);
|
|
63
|
+
}
|
|
64
|
+
const buf = Buffer.from(vector.buffer, vector.byteOffset, vector.byteLength);
|
|
65
|
+
this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(exemplarId);
|
|
66
|
+
this.db
|
|
67
|
+
.prepare("INSERT INTO code_exemplars_vec (exemplar_id, embedding) VALUES (?, ?)")
|
|
68
|
+
.run(exemplarId, buf);
|
|
69
|
+
}
|
|
70
|
+
async searchByVector(queryVector, filter) {
|
|
71
|
+
const k = Math.max(1, Math.min(50, filter.k ?? 5));
|
|
72
|
+
const includeNegatives = filter.includeNegatives ?? true;
|
|
73
|
+
const queryBuf = Buffer.from(queryVector.buffer, queryVector.byteOffset, queryVector.byteLength);
|
|
74
|
+
// vec0 doesn't support WHERE on aux columns, so we over-fetch and filter in JS.
|
|
75
|
+
const overFetch = k * 4;
|
|
76
|
+
const vecRows = this.db
|
|
77
|
+
.prepare(`SELECT exemplar_id, distance FROM code_exemplars_vec
|
|
78
|
+
WHERE embedding MATCH ?
|
|
79
|
+
ORDER BY distance
|
|
80
|
+
LIMIT ?`)
|
|
81
|
+
.all(queryBuf, overFetch);
|
|
82
|
+
if (vecRows.length === 0)
|
|
83
|
+
return [];
|
|
84
|
+
const ids = vecRows.map((r) => r.exemplar_id);
|
|
85
|
+
const distanceById = new Map(vecRows.map((r) => [r.exemplar_id, r.distance]));
|
|
86
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
87
|
+
const rows = this.db
|
|
88
|
+
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
89
|
+
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
|
|
90
|
+
FROM code_exemplars
|
|
91
|
+
WHERE id IN (${placeholders}) AND install_scope = ?`)
|
|
92
|
+
.all(...ids, filter.installScope);
|
|
93
|
+
let hits = rows.map((r) => ({
|
|
94
|
+
id: r.id,
|
|
95
|
+
code: r.code,
|
|
96
|
+
taskContext: r.task_context,
|
|
97
|
+
outcome: r.outcome,
|
|
98
|
+
repo: r.repo,
|
|
99
|
+
model: r.model,
|
|
100
|
+
lang: r.lang,
|
|
101
|
+
survived: r.survived,
|
|
102
|
+
gitSha: r.git_sha,
|
|
103
|
+
distance: distanceById.get(r.id) ?? 999,
|
|
104
|
+
}));
|
|
105
|
+
if (filter.repo !== undefined)
|
|
106
|
+
hits = hits.filter((h) => h.repo === filter.repo);
|
|
107
|
+
if (filter.lang !== undefined)
|
|
108
|
+
hits = hits.filter((h) => h.lang === filter.lang);
|
|
109
|
+
if (filter.model !== undefined)
|
|
110
|
+
hits = hits.filter((h) => h.model === filter.model);
|
|
111
|
+
if (!includeNegatives)
|
|
112
|
+
hits = hits.filter((h) => h.outcome === "pass" || h.outcome === "fix");
|
|
113
|
+
// Rerank: survived=0 is downranked; negatives sorted after positives at same distance.
|
|
114
|
+
hits.sort((a, b) => {
|
|
115
|
+
const aIsNeg = a.outcome === "fail" || a.outcome === "exhausted" ? 1 : 0;
|
|
116
|
+
const bIsNeg = b.outcome === "fail" || b.outcome === "exhausted" ? 1 : 0;
|
|
117
|
+
const aSurvPenalty = a.survived === 0 ? 0.05 : 0;
|
|
118
|
+
const bSurvPenalty = b.survived === 0 ? 0.05 : 0;
|
|
119
|
+
return (a.distance + aSurvPenalty + aIsNeg * 0.1) - (b.distance + bSurvPenalty + bIsNeg * 0.1);
|
|
120
|
+
});
|
|
121
|
+
return hits.slice(0, k);
|
|
122
|
+
}
|
|
123
|
+
async getById(id) {
|
|
124
|
+
const row = this.db
|
|
125
|
+
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
126
|
+
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
|
|
127
|
+
FROM code_exemplars WHERE id = ?`)
|
|
128
|
+
.get(id);
|
|
129
|
+
return row ? this.rowToExemplar(row) : null;
|
|
130
|
+
}
|
|
131
|
+
async applyBucketCap(installScope, maxPerBucket) {
|
|
132
|
+
const buckets = this.db
|
|
133
|
+
.prepare(`SELECT DISTINCT repo, lang,
|
|
134
|
+
CASE WHEN outcome IN ('pass','fix') THEN 'positive' ELSE 'negative' END AS outcome_class
|
|
135
|
+
FROM code_exemplars WHERE install_scope = ?`)
|
|
136
|
+
.all(installScope);
|
|
137
|
+
let deleted = 0;
|
|
138
|
+
const delStmt = this.db.prepare("DELETE FROM code_exemplars WHERE id = ?");
|
|
139
|
+
const txn = this.db.transaction(() => {
|
|
140
|
+
for (const bucket of buckets) {
|
|
141
|
+
const outcomeList = bucket.outcome_class === "positive" ? ["pass", "fix"] : ["fail", "exhausted"];
|
|
142
|
+
const placeholders = outcomeList.map(() => "?").join(",");
|
|
143
|
+
const langFilter = bucket.lang !== null ? "AND lang = ?" : "AND lang IS NULL";
|
|
144
|
+
const params = bucket.lang !== null
|
|
145
|
+
? [installScope, bucket.repo, bucket.lang, ...outcomeList]
|
|
146
|
+
: [installScope, bucket.repo, ...outcomeList];
|
|
147
|
+
const allIds = this.db
|
|
148
|
+
.prepare(`SELECT id FROM code_exemplars
|
|
149
|
+
WHERE install_scope = ? AND repo = ? ${langFilter}
|
|
150
|
+
AND outcome IN (${placeholders})
|
|
151
|
+
ORDER BY ts DESC`)
|
|
152
|
+
.all(...params)
|
|
153
|
+
.map((r) => r.id);
|
|
154
|
+
const toDelete = allIds.slice(maxPerBucket);
|
|
155
|
+
for (const id of toDelete) {
|
|
156
|
+
delStmt.run(id);
|
|
157
|
+
this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(id);
|
|
158
|
+
deleted++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
txn();
|
|
163
|
+
return deleted;
|
|
164
|
+
}
|
|
165
|
+
async pruneReverted(installScope) {
|
|
166
|
+
const ids = this.db
|
|
167
|
+
.prepare("SELECT id FROM code_exemplars WHERE install_scope = ? AND survived = 0")
|
|
168
|
+
.all(installScope)
|
|
169
|
+
.map((r) => r.id);
|
|
170
|
+
let deleted = 0;
|
|
171
|
+
const txn = this.db.transaction(() => {
|
|
172
|
+
for (const id of ids) {
|
|
173
|
+
this.db.prepare("DELETE FROM code_exemplars WHERE id = ?").run(id);
|
|
174
|
+
this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(id);
|
|
175
|
+
deleted++;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
txn();
|
|
179
|
+
return deleted;
|
|
180
|
+
}
|
|
181
|
+
async pruneOlderThan(olderThanTs) {
|
|
182
|
+
const ids = this.db
|
|
183
|
+
.prepare("SELECT id FROM code_exemplars WHERE ts < ?")
|
|
184
|
+
.all(olderThanTs)
|
|
185
|
+
.map((r) => r.id);
|
|
186
|
+
let deleted = 0;
|
|
187
|
+
const txn = this.db.transaction(() => {
|
|
188
|
+
for (const id of ids) {
|
|
189
|
+
this.db.prepare("DELETE FROM code_exemplars WHERE id = ?").run(id);
|
|
190
|
+
this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(id);
|
|
191
|
+
deleted++;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
txn();
|
|
195
|
+
return deleted;
|
|
196
|
+
}
|
|
197
|
+
insertStmt() {
|
|
198
|
+
return this.db.prepare(`
|
|
199
|
+
INSERT OR IGNORE INTO code_exemplars (
|
|
200
|
+
id, install_scope, signal_id, session_id, repo, model, lang,
|
|
201
|
+
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
|
|
202
|
+
) VALUES (
|
|
203
|
+
@id, @install_scope, @signal_id, @session_id, @repo, @model, @lang,
|
|
204
|
+
@task_context, @code, @code_hash, @outcome, @git_sha, @survived, @ts, @created_at
|
|
205
|
+
)
|
|
206
|
+
`);
|
|
207
|
+
}
|
|
208
|
+
toRow(id, inp) {
|
|
209
|
+
return {
|
|
210
|
+
id,
|
|
211
|
+
install_scope: inp.installScope,
|
|
212
|
+
signal_id: inp.signalId,
|
|
213
|
+
session_id: inp.sessionId,
|
|
214
|
+
repo: inp.repo,
|
|
215
|
+
model: inp.model,
|
|
216
|
+
lang: inp.lang,
|
|
217
|
+
task_context: inp.taskContext,
|
|
218
|
+
code: inp.code,
|
|
219
|
+
code_hash: inp.codeHash,
|
|
220
|
+
outcome: inp.outcome,
|
|
221
|
+
git_sha: inp.gitSha,
|
|
222
|
+
survived: inp.survived,
|
|
223
|
+
ts: inp.ts,
|
|
224
|
+
created_at: new Date().toISOString(),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
rowToExemplar(row) {
|
|
228
|
+
return {
|
|
229
|
+
id: row.id,
|
|
230
|
+
installScope: row.install_scope,
|
|
231
|
+
signalId: row.signal_id,
|
|
232
|
+
sessionId: row.session_id,
|
|
233
|
+
repo: row.repo,
|
|
234
|
+
model: row.model,
|
|
235
|
+
lang: row.lang,
|
|
236
|
+
taskContext: row.task_context,
|
|
237
|
+
code: row.code,
|
|
238
|
+
codeHash: row.code_hash,
|
|
239
|
+
outcome: row.outcome,
|
|
240
|
+
gitSha: row.git_sha,
|
|
241
|
+
survived: row.survived,
|
|
242
|
+
ts: row.ts,
|
|
243
|
+
createdAt: row.created_at,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=sqlite-code-exemplar-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ export declare class SqliteFactStore implements FactStore {
|
|
|
36
36
|
*/
|
|
37
37
|
insertRowInTxn(fact: Fact): void;
|
|
38
38
|
getById(id: string): Promise<Fact | null>;
|
|
39
|
+
getByIds(ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
|
|
39
40
|
findCurrent(subject: string, predicate: string): Promise<Fact | null>;
|
|
40
41
|
list(query: FactQuery): Promise<ReadonlyArray<Fact>>;
|
|
41
42
|
listBySession(sessionId: string): Promise<ReadonlyArray<Fact>>;
|
|
@@ -54,6 +55,7 @@ export declare class SqliteFactStore implements FactStore {
|
|
|
54
55
|
*/
|
|
55
56
|
upsertEmbedding(factId: string, vector: Float32Array): Promise<void>;
|
|
56
57
|
markSuperseded(oldId: string, newId: string | null): Promise<void>;
|
|
58
|
+
retire(factId: string): Promise<void>;
|
|
57
59
|
ingestSessionFacts(sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
|
|
58
60
|
private insertStmt;
|
|
59
61
|
private toRow;
|
|
@@ -55,12 +55,23 @@ export class SqliteFactStore {
|
|
|
55
55
|
.get(id);
|
|
56
56
|
return row ? this.rowToFact(row) : null;
|
|
57
57
|
}
|
|
58
|
+
async getByIds(ids) {
|
|
59
|
+
if (ids.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
62
|
+
const rows = this.db
|
|
63
|
+
.prepare(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
64
|
+
source_quote, created_at, superseded_by, confidence
|
|
65
|
+
FROM facts WHERE id IN (${placeholders})`)
|
|
66
|
+
.all(...ids);
|
|
67
|
+
return rows.map((r) => this.rowToFact(r));
|
|
68
|
+
}
|
|
58
69
|
async findCurrent(subject, predicate) {
|
|
59
70
|
const row = this.db
|
|
60
71
|
.prepare(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
61
72
|
source_quote, created_at, superseded_by, confidence
|
|
62
73
|
FROM facts
|
|
63
|
-
WHERE subject = ? AND predicate = ? AND superseded_by IS NULL
|
|
74
|
+
WHERE subject = ? AND predicate = ? AND superseded_by IS NULL AND retired_at IS NULL
|
|
64
75
|
ORDER BY created_at DESC
|
|
65
76
|
LIMIT 1`)
|
|
66
77
|
.get(subject, predicate);
|
|
@@ -75,8 +86,10 @@ export class SqliteFactStore {
|
|
|
75
86
|
where.push("predicate = ?");
|
|
76
87
|
params.push(query.predicate);
|
|
77
88
|
}
|
|
78
|
-
if (!includeSuperseded)
|
|
89
|
+
if (!includeSuperseded) {
|
|
79
90
|
where.push("superseded_by IS NULL");
|
|
91
|
+
where.push("retired_at IS NULL");
|
|
92
|
+
}
|
|
80
93
|
params.push(limit);
|
|
81
94
|
const rows = this.db
|
|
82
95
|
.prepare(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
@@ -119,6 +132,7 @@ export class SqliteFactStore {
|
|
|
119
132
|
}
|
|
120
133
|
if (filter.includeSuperseded !== true) {
|
|
121
134
|
where.push("superseded_by IS NULL");
|
|
135
|
+
where.push("retired_at IS NULL");
|
|
122
136
|
}
|
|
123
137
|
const limit = Math.max(1, Math.trunc(filter.limit ?? 500));
|
|
124
138
|
params.push(limit);
|
|
@@ -244,6 +258,20 @@ export class SqliteFactStore {
|
|
|
244
258
|
});
|
|
245
259
|
txn();
|
|
246
260
|
}
|
|
261
|
+
async retire(factId) {
|
|
262
|
+
const txn = this.db.transaction(() => {
|
|
263
|
+
const row = this.db
|
|
264
|
+
.prepare("SELECT id FROM facts WHERE id = ?")
|
|
265
|
+
.get(factId);
|
|
266
|
+
if (!row)
|
|
267
|
+
throw new Error(`Fact ${factId} not found`);
|
|
268
|
+
this.db
|
|
269
|
+
.prepare("UPDATE facts SET retired_at = ? WHERE id = ?")
|
|
270
|
+
.run(new Date().toISOString(), factId);
|
|
271
|
+
this.db.prepare("DELETE FROM fact_embeddings WHERE fact_id = ?").run(factId);
|
|
272
|
+
});
|
|
273
|
+
txn();
|
|
274
|
+
}
|
|
247
275
|
async ingestSessionFacts(sessionId, facts) {
|
|
248
276
|
this.db.prepare("DELETE FROM facts WHERE source_session_id = ?").run(sessionId);
|
|
249
277
|
if (facts.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-fact-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-fact-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA0BH,MAAM,OAAO,eAAe;IAMG;IAL7B;;;;OAIG;IACH,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAU;QACrB,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA0B;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAA4B,EAAE,EAAE;YAC/D,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,IAAU;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;iCAEyB,CAC1B;aACA,GAAG,CAAC,EAAE,CAAC,CAAC;QACX,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,SAAiB;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;;iBAKS,CACV;aACA,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAgB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC;QAE3D,MAAM,KAAK,GAAa,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,MAAM,GAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"sqlite-fact-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-fact-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,21 @@ export interface RecentMarker {
|
|
|
70
70
|
label: string;
|
|
71
71
|
createdAt: string;
|
|
72
72
|
}
|
|
73
|
+
/** Filter for the fact-backfill candidate query (backfill-facts.ts). */
|
|
74
|
+
export interface BackfillCandidateFilter {
|
|
75
|
+
/** Only sessions with started_at strictly before this cutoff (avoid racing live ingest). */
|
|
76
|
+
readonly cutoff: string;
|
|
77
|
+
/** Resume marker: only sessions with id lexicographically greater than this. */
|
|
78
|
+
readonly from?: string;
|
|
79
|
+
/** When false, exclude sessions that already have any facts. */
|
|
80
|
+
readonly reprocess: boolean;
|
|
81
|
+
}
|
|
82
|
+
/** One eligible session for fact backfill. */
|
|
83
|
+
export interface BackfillCandidate {
|
|
84
|
+
readonly id: string;
|
|
85
|
+
readonly startedAt: string;
|
|
86
|
+
readonly body: string | null;
|
|
87
|
+
}
|
|
73
88
|
export declare class SqliteSessionStore implements SessionStore {
|
|
74
89
|
private readonly db;
|
|
75
90
|
/**
|
|
@@ -109,6 +124,12 @@ export declare class SqliteSessionStore implements SessionStore {
|
|
|
109
124
|
} | null): Promise<void>;
|
|
110
125
|
private deleteSessionChunks;
|
|
111
126
|
private insertChunkEmbedding;
|
|
127
|
+
/**
|
|
128
|
+
* Eligible sessions for fact backfill, ordered (started_at, id) ascending.
|
|
129
|
+
* Non-empty body required (the classifier needs transcript text). When
|
|
130
|
+
* `reprocess` is false, sessions that already have facts are excluded.
|
|
131
|
+
*/
|
|
132
|
+
listBackfillCandidates(filter: BackfillCandidateFilter): Promise<BackfillCandidate[]>;
|
|
112
133
|
/**
|
|
113
134
|
* Phase B.5 — backfill entry point. Writes facts (with deterministic
|
|
114
135
|
* supersedence + best-effort embeddings) for an EXISTING session row
|
|
@@ -272,6 +272,29 @@ export class SqliteSessionStore {
|
|
|
272
272
|
const chunkId = Number(info.lastInsertRowid);
|
|
273
273
|
db.prepare("INSERT INTO session_chunk_map (chunk_id, session_id, chunk_idx) VALUES (?, ?, ?)").run(chunkId, sessionId, chunkIdx);
|
|
274
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Eligible sessions for fact backfill, ordered (started_at, id) ascending.
|
|
277
|
+
* Non-empty body required (the classifier needs transcript text). When
|
|
278
|
+
* `reprocess` is false, sessions that already have facts are excluded.
|
|
279
|
+
*/
|
|
280
|
+
async listBackfillCandidates(filter) {
|
|
281
|
+
const sql = filter.reprocess
|
|
282
|
+
? `SELECT id, started_at, body FROM sessions
|
|
283
|
+
WHERE started_at < ? AND body IS NOT NULL AND length(body) > 0
|
|
284
|
+
${filter.from ? "AND id > ?" : ""}
|
|
285
|
+
ORDER BY started_at ASC, id ASC`
|
|
286
|
+
: `SELECT s.id, s.started_at, s.body FROM sessions s
|
|
287
|
+
WHERE s.started_at < ? AND s.body IS NOT NULL AND length(s.body) > 0
|
|
288
|
+
AND NOT EXISTS (SELECT 1 FROM facts f WHERE f.source_session_id = s.id)
|
|
289
|
+
${filter.from ? "AND s.id > ?" : ""}
|
|
290
|
+
ORDER BY s.started_at ASC, s.id ASC`;
|
|
291
|
+
const rows = filter.from
|
|
292
|
+
? this.db.prepare(sql)
|
|
293
|
+
.all(filter.cutoff, filter.from)
|
|
294
|
+
: this.db.prepare(sql)
|
|
295
|
+
.all(filter.cutoff);
|
|
296
|
+
return rows.map((r) => ({ id: r.id, startedAt: r.started_at, body: r.body }));
|
|
297
|
+
}
|
|
275
298
|
/**
|
|
276
299
|
* Phase B.5 — backfill entry point. Writes facts (with deterministic
|
|
277
300
|
* supersedence + best-effort embeddings) for an EXISTING session row
|