nlm-memory 0.16.0 → 0.19.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/dist/cli/classify-parity.js +2 -2
- package/dist/cli/classify-parity.js.map +1 -1
- package/dist/cli/nlm.js +31 -0
- package/dist/cli/nlm.js.map +1 -1
- package/dist/core/classifier/hierarchical-classify.d.ts +5 -0
- package/dist/core/classifier/hierarchical-classify.js +63 -0
- package/dist/core/classifier/hierarchical-classify.js.map +1 -0
- package/dist/core/ingest/reclassify-oversized.d.ts +39 -0
- package/dist/core/ingest/reclassify-oversized.js +104 -0
- package/dist/core/ingest/reclassify-oversized.js.map +1 -0
- package/dist/core/storage/pg-code-exemplar-store.d.ts +2 -1
- package/dist/core/storage/pg-code-exemplar-store.js +28 -2
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +2 -1
- package/dist/core/storage/sqlite-code-exemplar-store.js +28 -2
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/http/app.js +28 -0
- package/dist/http/app.js.map +1 -1
- package/dist/llm/deepseek-client.d.ts +4 -0
- package/dist/llm/deepseek-client.js +17 -2
- package/dist/llm/deepseek-client.js.map +1 -1
- package/dist/llm/ollama-client.d.ts +8 -9
- package/dist/llm/ollama-client.js +21 -13
- package/dist/llm/ollama-client.js.map +1 -1
- package/dist/mcp/server.js +22 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/code-exemplar-store.d.ts +15 -1
- package/dist/ports/llm-client.d.ts +3 -0
- package/dist/ports/llm-client.js +6 -0
- package/dist/ports/llm-client.js.map +1 -1
- package/dist/shared/types.d.ts +2 -0
- package/migrations/023_code_exemplars_supersedence.sql +10 -0
- package/migrations/pg/001_initial.sql +3 -1
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/migrations/pg/018_repair_self_supersede.sql +0 -16
- package/migrations/pg/020_collapse_duplicate_active_facts.sql +0 -46
- package/migrations/pg/021_code_exemplars.sql +0 -45
- package/migrations/pg/022_facts_retired_at.sql +0 -12
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { classifyAdaptive } from "../classifier/hierarchical-classify.js";
|
|
2
|
+
import { extractFacts } from "../facts/extract-facts.js";
|
|
3
|
+
const BODY_CAP = 200_000;
|
|
4
|
+
const CONFIDENCE_FLOOR = 0.3;
|
|
5
|
+
export function selectOversizedFailures(db, limit) {
|
|
6
|
+
const sql = "SELECT adapter_name, source_path FROM adapter_state " +
|
|
7
|
+
"WHERE session_id IS NULL AND failure_count >= 1 ORDER BY file_size DESC" +
|
|
8
|
+
(limit !== undefined ? ` LIMIT ${Math.floor(limit)}` : "");
|
|
9
|
+
return db.prepare(sql).all();
|
|
10
|
+
}
|
|
11
|
+
export async function reclassifyOversized(deps, opts = {}) {
|
|
12
|
+
const log = deps.log ?? ((m) => console.error(m));
|
|
13
|
+
const byName = new Map(deps.adapters.map((a) => [a.name, a]));
|
|
14
|
+
const rows = selectOversizedFailures(deps.db, opts.limit);
|
|
15
|
+
let ingested = 0;
|
|
16
|
+
let skippedLowConfidence = 0;
|
|
17
|
+
let failed = 0;
|
|
18
|
+
let missingFile = 0;
|
|
19
|
+
let entities = 0;
|
|
20
|
+
let decisions = 0;
|
|
21
|
+
let facts = 0;
|
|
22
|
+
for (const row of rows) {
|
|
23
|
+
const adapter = byName.get(row.adapter_name);
|
|
24
|
+
if (!adapter) {
|
|
25
|
+
failed++;
|
|
26
|
+
log(`[reclassify] no adapter for ${row.adapter_name}`);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
let chunk;
|
|
30
|
+
try {
|
|
31
|
+
chunk = await adapter.parseSession(row.source_path);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
missingFile++;
|
|
35
|
+
log(`[reclassify] parse failed ${row.source_path}: ${e instanceof Error ? e.message : String(e)}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (!chunk) {
|
|
39
|
+
missingFile++;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
let classification;
|
|
43
|
+
try {
|
|
44
|
+
classification = await classifyAdaptive(chunk.text, deps.classifier);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
failed++;
|
|
48
|
+
log(`[reclassify] classify failed ${chunk.id}: ${e instanceof Error ? e.message : String(e)}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (opts.dryRun) {
|
|
52
|
+
// dry-run classifies and counts candidates but performs NO writes —
|
|
53
|
+
// including not resetting failure_count on low-confidence rows.
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (classification.confidence < CONFIDENCE_FLOOR) {
|
|
57
|
+
skippedLowConfidence++;
|
|
58
|
+
deps.db
|
|
59
|
+
.prepare("UPDATE adapter_state SET failure_count = 0 WHERE adapter_name = ? AND source_path = ?")
|
|
60
|
+
.run(row.adapter_name, row.source_path);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const record = {
|
|
64
|
+
id: chunk.id,
|
|
65
|
+
runtime: chunk.runtime,
|
|
66
|
+
runtimeSessionId: chunk.runtimeSessionId,
|
|
67
|
+
startedAt: chunk.startedAt,
|
|
68
|
+
endedAt: chunk.endedAt,
|
|
69
|
+
durationMin: chunk.durationMin,
|
|
70
|
+
label: classification.label,
|
|
71
|
+
summary: classification.summary,
|
|
72
|
+
body: chunk.text.slice(0, BODY_CAP),
|
|
73
|
+
status: "closed",
|
|
74
|
+
transcriptKind: adapter.transcriptKind,
|
|
75
|
+
transcriptPath: row.source_path,
|
|
76
|
+
transcriptOffset: null,
|
|
77
|
+
transcriptLength: chunk.text.length,
|
|
78
|
+
entities: classification.entities,
|
|
79
|
+
decisions: classification.decisions,
|
|
80
|
+
openQuestions: classification.open,
|
|
81
|
+
};
|
|
82
|
+
const extracted = extractFacts(classification, chunk.id, chunk.startedAt);
|
|
83
|
+
try {
|
|
84
|
+
await deps.store.insertSession(record, deps.embedder, null, {
|
|
85
|
+
factStore: deps.factStore,
|
|
86
|
+
facts: extracted,
|
|
87
|
+
});
|
|
88
|
+
deps.db
|
|
89
|
+
.prepare("UPDATE adapter_state SET session_id = ?, last_offset = file_size, failure_count = 0 " +
|
|
90
|
+
"WHERE adapter_name = ? AND source_path = ?")
|
|
91
|
+
.run(chunk.id, row.adapter_name, row.source_path);
|
|
92
|
+
ingested++;
|
|
93
|
+
entities += classification.entities.length;
|
|
94
|
+
decisions += classification.decisions.length;
|
|
95
|
+
facts += extracted.length;
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
failed++;
|
|
99
|
+
log(`[reclassify] ingest failed ${chunk.id}: ${e instanceof Error ? e.message : String(e)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { attempted: rows.length, ingested, skippedLowConfidence, failed, missingFile, entities, decisions, facts };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=reclassify-oversized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reclassify-oversized.js","sourceRoot":"","sources":["../../../src/core/ingest/reclassify-oversized.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* SQLite store, which deletes from code_exemplars_vec explicitly).
|
|
12
12
|
*/
|
|
13
13
|
import type { Pool } from "pg";
|
|
14
|
-
import type { CodeExemplarSearchFilter, CodeExemplarStore } from "../../ports/code-exemplar-store.js";
|
|
14
|
+
import type { CodeExemplarSearchFilter, CodeExemplarStore, ExemplarVerdictPatch, ExemplarVerdictResult, ExemplarVerdictSource } from "../../ports/code-exemplar-store.js";
|
|
15
15
|
import type { CodeExemplar, CodeExemplarHit, CodeExemplarInput } from "../../shared/types.js";
|
|
16
16
|
export declare class PgCodeExemplarStore implements CodeExemplarStore {
|
|
17
17
|
private readonly pool;
|
|
@@ -26,6 +26,7 @@ export declare class PgCodeExemplarStore implements CodeExemplarStore {
|
|
|
26
26
|
getById(id: string): Promise<CodeExemplar | null>;
|
|
27
27
|
applyBucketCap(installScope: string, maxPerBucket: number): Promise<number>;
|
|
28
28
|
pruneReverted(installScope: string): Promise<number>;
|
|
29
|
+
setVerdict(id: string, patch: ExemplarVerdictPatch, source: ExemplarVerdictSource): Promise<ExemplarVerdictResult>;
|
|
29
30
|
pruneOlderThan(olderThanTs: string): Promise<number>;
|
|
30
31
|
private rowToExemplar;
|
|
31
32
|
}
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
import { exemplarId } from "./sqlite-code-exemplar-store.js";
|
|
14
14
|
const VEC_DIM = 768;
|
|
15
15
|
const COLUMNS = "id, install_scope, signal_id, session_id, repo, model, lang, " +
|
|
16
|
-
"task_context, code, code_hash, outcome, git_sha, survived, ts, created_at"
|
|
16
|
+
"task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, " +
|
|
17
|
+
"retired_at, label_source";
|
|
17
18
|
function insertParams(input) {
|
|
18
19
|
const id = exemplarId({
|
|
19
20
|
installScope: input.installScope,
|
|
@@ -98,7 +99,7 @@ export class PgCodeExemplarStore {
|
|
|
98
99
|
e.embedding <-> $1::vector AS distance
|
|
99
100
|
FROM code_exemplar_embeddings e
|
|
100
101
|
JOIN code_exemplars ce ON ce.id = e.exemplar_id
|
|
101
|
-
WHERE ce.install_scope = $2
|
|
102
|
+
WHERE ce.install_scope = $2 AND ce.retired_at IS NULL
|
|
102
103
|
ORDER BY e.embedding <-> $1::vector
|
|
103
104
|
LIMIT $3`, [vecStr, filter.installScope, overFetch]);
|
|
104
105
|
let hits = res.rows.map((r) => ({
|
|
@@ -156,6 +157,29 @@ export class PgCodeExemplarStore {
|
|
|
156
157
|
const res = await this.pool.query("DELETE FROM code_exemplars WHERE install_scope = $1 AND survived = 0", [installScope]);
|
|
157
158
|
return res.rowCount ?? 0;
|
|
158
159
|
}
|
|
160
|
+
async setVerdict(id, patch, source) {
|
|
161
|
+
const cur = await this.pool.query("SELECT label_source FROM code_exemplars WHERE id = $1", [id]);
|
|
162
|
+
if (cur.rows.length === 0)
|
|
163
|
+
return { status: "not_found" };
|
|
164
|
+
if (source === "llm" && cur.rows[0].label_source === "human")
|
|
165
|
+
return { status: "human_locked" };
|
|
166
|
+
const sets = [];
|
|
167
|
+
const values = [];
|
|
168
|
+
let n = 1;
|
|
169
|
+
sets.push(`label_source = $${n++}`);
|
|
170
|
+
values.push(source);
|
|
171
|
+
if (patch.retired !== undefined) {
|
|
172
|
+
sets.push(`retired_at = $${n++}`);
|
|
173
|
+
values.push(patch.retired ? new Date().toISOString() : null);
|
|
174
|
+
}
|
|
175
|
+
if (patch.outcome !== undefined) {
|
|
176
|
+
sets.push(`outcome = $${n++}`);
|
|
177
|
+
values.push(patch.outcome);
|
|
178
|
+
}
|
|
179
|
+
values.push(id);
|
|
180
|
+
await this.pool.query(`UPDATE code_exemplars SET ${sets.join(", ")} WHERE id = $${n}`, values);
|
|
181
|
+
return { status: "applied" };
|
|
182
|
+
}
|
|
159
183
|
async pruneOlderThan(olderThanTs) {
|
|
160
184
|
const res = await this.pool.query("DELETE FROM code_exemplars WHERE ts < $1", [olderThanTs]);
|
|
161
185
|
return res.rowCount ?? 0;
|
|
@@ -177,6 +201,8 @@ export class PgCodeExemplarStore {
|
|
|
177
201
|
survived: row.survived,
|
|
178
202
|
ts: row.ts,
|
|
179
203
|
createdAt: row.created_at,
|
|
204
|
+
retiredAt: row.retired_at,
|
|
205
|
+
labelSource: row.label_source,
|
|
180
206
|
};
|
|
181
207
|
}
|
|
182
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-code-exemplar-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,OAAO,GACX,+DAA+D;IAC/D,
|
|
1
|
+
{"version":3,"file":"pg-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-code-exemplar-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* even when no embedder is configured.
|
|
9
9
|
*/
|
|
10
10
|
import type Database from "better-sqlite3";
|
|
11
|
-
import type { CodeExemplarSearchFilter, CodeExemplarStore } from "../../ports/code-exemplar-store.js";
|
|
11
|
+
import type { CodeExemplarSearchFilter, CodeExemplarStore, ExemplarVerdictPatch, ExemplarVerdictResult, ExemplarVerdictSource } from "../../ports/code-exemplar-store.js";
|
|
12
12
|
import type { CodeExemplar, CodeExemplarHit, CodeExemplarInput } from "../../shared/types.js";
|
|
13
13
|
/**
|
|
14
14
|
* Deterministic primary key: sha256(install_scope|repo|code_hash|outcome)[:16].
|
|
@@ -33,6 +33,7 @@ export declare class SqliteCodeExemplarStore implements CodeExemplarStore {
|
|
|
33
33
|
getById(id: string): Promise<CodeExemplar | null>;
|
|
34
34
|
applyBucketCap(installScope: string, maxPerBucket: number): Promise<number>;
|
|
35
35
|
pruneReverted(installScope: string): Promise<number>;
|
|
36
|
+
setVerdict(id: string, patch: ExemplarVerdictPatch, source: ExemplarVerdictSource): Promise<ExemplarVerdictResult>;
|
|
36
37
|
pruneOlderThan(olderThanTs: string): Promise<number>;
|
|
37
38
|
private insertStmt;
|
|
38
39
|
private toRow;
|
|
@@ -88,7 +88,7 @@ export class SqliteCodeExemplarStore {
|
|
|
88
88
|
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
89
89
|
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
|
|
90
90
|
FROM code_exemplars
|
|
91
|
-
WHERE id IN (${placeholders}) AND install_scope =
|
|
91
|
+
WHERE id IN (${placeholders}) AND install_scope = ? AND retired_at IS NULL`)
|
|
92
92
|
.all(...ids, filter.installScope);
|
|
93
93
|
let hits = rows.map((r) => ({
|
|
94
94
|
id: r.id,
|
|
@@ -123,7 +123,8 @@ export class SqliteCodeExemplarStore {
|
|
|
123
123
|
async getById(id) {
|
|
124
124
|
const row = this.db
|
|
125
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
|
|
126
|
+
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at,
|
|
127
|
+
retired_at, label_source
|
|
127
128
|
FROM code_exemplars WHERE id = ?`)
|
|
128
129
|
.get(id);
|
|
129
130
|
return row ? this.rowToExemplar(row) : null;
|
|
@@ -178,6 +179,27 @@ export class SqliteCodeExemplarStore {
|
|
|
178
179
|
txn();
|
|
179
180
|
return deleted;
|
|
180
181
|
}
|
|
182
|
+
async setVerdict(id, patch, source) {
|
|
183
|
+
const row = this.db
|
|
184
|
+
.prepare("SELECT label_source FROM code_exemplars WHERE id = ?")
|
|
185
|
+
.get(id);
|
|
186
|
+
if (!row)
|
|
187
|
+
return { status: "not_found" };
|
|
188
|
+
if (source === "llm" && row.label_source === "human")
|
|
189
|
+
return { status: "human_locked" };
|
|
190
|
+
const sets = ["label_source = @source"];
|
|
191
|
+
const params = { id, source };
|
|
192
|
+
if (patch.retired !== undefined) {
|
|
193
|
+
sets.push("retired_at = @retiredAt");
|
|
194
|
+
params["retiredAt"] = patch.retired ? new Date().toISOString() : null;
|
|
195
|
+
}
|
|
196
|
+
if (patch.outcome !== undefined) {
|
|
197
|
+
sets.push("outcome = @outcome");
|
|
198
|
+
params["outcome"] = patch.outcome;
|
|
199
|
+
}
|
|
200
|
+
this.db.prepare(`UPDATE code_exemplars SET ${sets.join(", ")} WHERE id = @id`).run(params);
|
|
201
|
+
return { status: "applied" };
|
|
202
|
+
}
|
|
181
203
|
async pruneOlderThan(olderThanTs) {
|
|
182
204
|
const ids = this.db
|
|
183
205
|
.prepare("SELECT id FROM code_exemplars WHERE ts < ?")
|
|
@@ -222,6 +244,8 @@ export class SqliteCodeExemplarStore {
|
|
|
222
244
|
survived: inp.survived,
|
|
223
245
|
ts: inp.ts,
|
|
224
246
|
created_at: new Date().toISOString(),
|
|
247
|
+
retired_at: null,
|
|
248
|
+
label_source: "llm",
|
|
225
249
|
};
|
|
226
250
|
}
|
|
227
251
|
rowToExemplar(row) {
|
|
@@ -241,6 +265,8 @@ export class SqliteCodeExemplarStore {
|
|
|
241
265
|
survived: row.survived,
|
|
242
266
|
ts: row.ts,
|
|
243
267
|
createdAt: row.created_at,
|
|
268
|
+
retiredAt: row.retired_at,
|
|
269
|
+
labelSource: row.label_source,
|
|
244
270
|
};
|
|
245
271
|
}
|
|
246
272
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,OAAO,GAAG,GAAG,CAAC;
|
|
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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"}
|
package/dist/http/app.js
CHANGED
|
@@ -1565,6 +1565,34 @@ function registerSignalRoutes(app, deps) {
|
|
|
1565
1565
|
}
|
|
1566
1566
|
return c.json({ id, skipped, status: "accepted" }, 202);
|
|
1567
1567
|
});
|
|
1568
|
+
app.post("/api/exemplar/:id/verdict", async (c) => {
|
|
1569
|
+
if (!deps.exemplarStore) {
|
|
1570
|
+
return c.json({ error: "exemplar store not wired in this deployment" }, 503);
|
|
1571
|
+
}
|
|
1572
|
+
if (process.env["NLM_CODE_EXEMPLARS_ENABLED"] !== "1") {
|
|
1573
|
+
return c.json({ error: "code exemplars disabled" }, 403);
|
|
1574
|
+
}
|
|
1575
|
+
let body;
|
|
1576
|
+
try {
|
|
1577
|
+
body = (await c.req.json());
|
|
1578
|
+
}
|
|
1579
|
+
catch {
|
|
1580
|
+
return c.json({ error: "body must be JSON" }, 400);
|
|
1581
|
+
}
|
|
1582
|
+
const patch = {};
|
|
1583
|
+
if (typeof body.retire === "boolean")
|
|
1584
|
+
patch.retired = body.retire;
|
|
1585
|
+
if (body.outcome === "pass" || body.outcome === "fail" || body.outcome === "fix" || body.outcome === "exhausted") {
|
|
1586
|
+
patch.outcome = body.outcome;
|
|
1587
|
+
}
|
|
1588
|
+
if (patch.retired === undefined && patch.outcome === undefined) {
|
|
1589
|
+
return c.json({ error: "provide retire (boolean) and/or outcome" }, 400);
|
|
1590
|
+
}
|
|
1591
|
+
const result = await deps.exemplarStore.setVerdict(c.req.param("id"), patch, "human");
|
|
1592
|
+
if (result.status === "not_found")
|
|
1593
|
+
return c.json({ error: "exemplar not found" }, 404);
|
|
1594
|
+
return c.json({ id: c.req.param("id"), status: result.status }, 200);
|
|
1595
|
+
});
|
|
1568
1596
|
app.get("/api/recall-code", async (c) => {
|
|
1569
1597
|
if (!deps.exemplarStore || deps.installScope === undefined) {
|
|
1570
1598
|
return c.json({ error: "exemplar store not wired in this deployment" }, 503);
|