@monoes/monograph 2.24.1 → 2.25.1
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/src/embeddings/store.d.ts +38 -0
- package/dist/src/embeddings/store.d.ts.map +1 -0
- package/dist/src/embeddings/store.js +147 -0
- package/dist/src/embeddings/store.js.map +1 -0
- package/dist/src/embeddings/transformers-embedder.d.ts +19 -0
- package/dist/src/embeddings/transformers-embedder.d.ts.map +1 -0
- package/dist/src/embeddings/transformers-embedder.js +48 -0
- package/dist/src/embeddings/transformers-embedder.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-tools/brief.d.ts +40 -0
- package/dist/src/mcp-tools/brief.d.ts.map +1 -0
- package/dist/src/mcp-tools/brief.js +65 -0
- package/dist/src/mcp-tools/brief.js.map +1 -0
- package/dist/src/mcp-tools/context.d.ts +9 -0
- package/dist/src/mcp-tools/context.d.ts.map +1 -1
- package/dist/src/mcp-tools/context.js +20 -0
- package/dist/src/mcp-tools/context.js.map +1 -1
- package/dist/src/mcp-tools/impact.d.ts +9 -0
- package/dist/src/mcp-tools/impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/impact.js +37 -0
- package/dist/src/mcp-tools/impact.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +1 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +1 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/pipeline/manifest.d.ts +34 -0
- package/dist/src/pipeline/manifest.d.ts.map +1 -0
- package/dist/src/pipeline/manifest.js +38 -0
- package/dist/src/pipeline/manifest.js.map +1 -0
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/src/pipeline/orchestrator.js +15 -0
- package/dist/src/pipeline/orchestrator.js.map +1 -1
- package/dist/src/pipeline/phases/agent-registry.d.ts +33 -0
- package/dist/src/pipeline/phases/agent-registry.d.ts.map +1 -0
- package/dist/src/pipeline/phases/agent-registry.js +153 -0
- package/dist/src/pipeline/phases/agent-registry.js.map +1 -0
- package/dist/src/pipeline/phases/cross-file.d.ts.map +1 -1
- package/dist/src/pipeline/phases/cross-file.js +8 -2
- package/dist/src/pipeline/phases/cross-file.js.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.d.ts +8 -0
- package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.js +8 -0
- package/dist/src/pipeline/phases/god-nodes.js.map +1 -1
- package/dist/src/pipeline/phases/parse.d.ts.map +1 -1
- package/dist/src/pipeline/phases/parse.js +18 -2
- package/dist/src/pipeline/phases/parse.js.map +1 -1
- package/dist/src/pipeline/phases/summaries.d.ts +22 -0
- package/dist/src/pipeline/phases/summaries.d.ts.map +1 -0
- package/dist/src/pipeline/phases/summaries.js +196 -0
- package/dist/src/pipeline/phases/summaries.js.map +1 -0
- package/dist/src/pipeline/phases/tests-edges.d.ts +16 -0
- package/dist/src/pipeline/phases/tests-edges.d.ts.map +1 -0
- package/dist/src/pipeline/phases/tests-edges.js +44 -0
- package/dist/src/pipeline/phases/tests-edges.js.map +1 -0
- package/dist/src/pipeline/runner.d.ts.map +1 -1
- package/dist/src/pipeline/runner.js +5 -0
- package/dist/src/pipeline/runner.js.map +1 -1
- package/dist/src/search/eval.d.ts +44 -0
- package/dist/src/search/eval.d.ts.map +1 -0
- package/dist/src/search/eval.js +35 -0
- package/dist/src/search/eval.js.map +1 -0
- package/dist/src/search/fused-search.d.ts +22 -0
- package/dist/src/search/fused-search.d.ts.map +1 -0
- package/dist/src/search/fused-search.js +103 -0
- package/dist/src/search/fused-search.js.map +1 -0
- package/dist/src/search/hybrid-query.d.ts +29 -2
- package/dist/src/search/hybrid-query.d.ts.map +1 -1
- package/dist/src/search/hybrid-query.js +113 -2
- package/dist/src/search/hybrid-query.js.map +1 -1
- package/dist/src/staleness/git-staleness.d.ts.map +1 -1
- package/dist/src/staleness/git-staleness.js +2 -0
- package/dist/src/staleness/git-staleness.js.map +1 -1
- package/dist/src/storage/db.d.ts.map +1 -1
- package/dist/src/storage/db.js +3 -2
- package/dist/src/storage/db.js.map +1 -1
- package/dist/src/storage/fts-store-hybrid.d.ts +2 -2
- package/dist/src/storage/fts-store-hybrid.d.ts.map +1 -1
- package/dist/src/storage/fts-store-hybrid.js +4 -3
- package/dist/src/storage/fts-store-hybrid.js.map +1 -1
- package/dist/src/storage/fts-store-search.d.ts +14 -1
- package/dist/src/storage/fts-store-search.d.ts.map +1 -1
- package/dist/src/storage/fts-store-search.js +25 -8
- package/dist/src/storage/fts-store-search.js.map +1 -1
- package/dist/src/storage/fts-store-terms.d.ts +1 -0
- package/dist/src/storage/fts-store-terms.d.ts.map +1 -1
- package/dist/src/storage/fts-store-terms.js +1 -1
- package/dist/src/storage/fts-store-terms.js.map +1 -1
- package/dist/src/storage/schema.d.ts +14 -2
- package/dist/src/storage/schema.d.ts.map +1 -1
- package/dist/src/storage/schema.js +22 -5
- package/dist/src/storage/schema.js.map +1 -1
- package/dist/src/storage/summary-search.d.ts +13 -0
- package/dist/src/storage/summary-search.d.ts.map +1 -0
- package/dist/src/storage/summary-search.js +58 -0
- package/dist/src/storage/summary-search.js.map +1 -0
- package/dist/src/types.d.ts +2 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import { type FtsResult, type LabelFilter } from '../storage/fts-store-search.js';
|
|
3
|
+
/** Turns text into L2-normalised vectors. Supplied by the host; monograph has no model dependency. */
|
|
4
|
+
export interface Embedder {
|
|
5
|
+
/** Identifies the model; a change invalidates every stored vector. */
|
|
6
|
+
model: string;
|
|
7
|
+
dim: number;
|
|
8
|
+
embedPassages(texts: string[]): Promise<Float32Array[]>;
|
|
9
|
+
embedQuery(query: string): Promise<Float32Array>;
|
|
10
|
+
}
|
|
11
|
+
export declare function quantize(vec: Float32Array): Buffer;
|
|
12
|
+
export interface EmbeddingStatus {
|
|
13
|
+
/** Symbols and files with a summary — the number that can be embedded. */
|
|
14
|
+
total: number;
|
|
15
|
+
embedded: number;
|
|
16
|
+
model: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function embeddingStatus(db: Database.Database): EmbeddingStatus;
|
|
19
|
+
export interface EmbedOptions {
|
|
20
|
+
batchSize?: number;
|
|
21
|
+
/** Stop after roughly this long; the next call resumes where this one stopped. */
|
|
22
|
+
maxMs?: number;
|
|
23
|
+
onProgress?: (done: number, pending: number) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface EmbedResult {
|
|
26
|
+
embedded: number;
|
|
27
|
+
/** Still without a current vector after this call. */
|
|
28
|
+
remaining: number;
|
|
29
|
+
}
|
|
30
|
+
/** Embeds every summary that has no vector yet, or whose text changed since its vector was made. */
|
|
31
|
+
export declare function embedPending(db: Database.Database, embedder: Embedder, options?: EmbedOptions): Promise<EmbedResult>;
|
|
32
|
+
export interface SemanticHit extends FtsResult {
|
|
33
|
+
/** Cosine similarity to the query, roughly -1..1. */
|
|
34
|
+
similarity: number;
|
|
35
|
+
}
|
|
36
|
+
/** Nearest summaries to `queryVec` by cosine similarity, optionally restricted to some node labels. */
|
|
37
|
+
export declare function semanticSearch(db: Database.Database, queryVec: Float32Array, limit: number, label?: LabelFilter): SemanticHit[];
|
|
38
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/embeddings/store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAe,MAAM,gCAAgC,CAAC;AAE/F,sGAAsG;AACtG,MAAM,WAAW,QAAQ;IACvB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACxD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD;AAQD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAmBtE;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,oGAAoG;AACpG,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA0DtB;AAuCD,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,WAAW,GAClB,WAAW,EAAE,CAiDf"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// ── Semantic index: symbol-summary embeddings ────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Vectors are L2-normalised, stored as int8 (x * 127) — 1 byte per dimension,
|
|
4
|
+
// about a quarter of float32, with a cosine error far below the gap between a
|
|
5
|
+
// good and a bad match. Embedding is incremental (keyed by a hash of the text)
|
|
6
|
+
// and resumable (one transaction per batch), because a cold run over a large
|
|
7
|
+
// repository takes minutes and must never block a build.
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { NOT_ANONYMOUS_CLOSURE_SQL } from '../storage/anonymous-closure.js';
|
|
10
|
+
import { labelClause } from '../storage/fts-store-search.js';
|
|
11
|
+
const MODEL_KEY = 'embedding_model';
|
|
12
|
+
const MAX_TEXT_CHARS = 400;
|
|
13
|
+
const hashText = (text) => createHash('sha1').update(text).digest('hex').slice(0, 16);
|
|
14
|
+
export function quantize(vec) {
|
|
15
|
+
const out = new Int8Array(vec.length);
|
|
16
|
+
for (let i = 0; i < vec.length; i++)
|
|
17
|
+
out[i] = Math.round(Math.max(-1, Math.min(1, vec[i])) * 127);
|
|
18
|
+
return Buffer.from(out.buffer, out.byteOffset, out.byteLength);
|
|
19
|
+
}
|
|
20
|
+
export function embeddingStatus(db) {
|
|
21
|
+
try {
|
|
22
|
+
const total = db.prepare('SELECT COUNT(*) AS n FROM node_summaries_fts').get().n;
|
|
23
|
+
const embedded = db
|
|
24
|
+
.prepare('SELECT COUNT(*) AS n FROM node_embeddings e JOIN node_summaries_fts s ON s.node_id = e.node_id')
|
|
25
|
+
.get().n;
|
|
26
|
+
const row = db.prepare('SELECT value FROM index_meta WHERE key = ?').get(MODEL_KEY);
|
|
27
|
+
return { total, embedded, model: row?.value ?? null };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { total: 0, embedded: 0, model: null };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const isBusy = (e) => /SQLITE_BUSY|database is locked/i.test(String(e));
|
|
34
|
+
/** Embeds every summary that has no vector yet, or whose text changed since its vector was made. */
|
|
35
|
+
export async function embedPending(db, embedder, options = {}) {
|
|
36
|
+
const batchSize = options.batchSize ?? 32;
|
|
37
|
+
const deadline = options.maxMs ? Date.now() + options.maxMs : Infinity;
|
|
38
|
+
const storedModel = db.prepare('SELECT value FROM index_meta WHERE key = ?').get(MODEL_KEY)?.value;
|
|
39
|
+
if (storedModel !== embedder.model) {
|
|
40
|
+
db.exec('DELETE FROM node_embeddings');
|
|
41
|
+
db.prepare('INSERT OR REPLACE INTO index_meta VALUES (?, ?)').run(MODEL_KEY, embedder.model);
|
|
42
|
+
}
|
|
43
|
+
// Vectors of nodes that no longer have a summary are dead weight.
|
|
44
|
+
db.exec('DELETE FROM node_embeddings WHERE node_id NOT IN (SELECT node_id FROM node_summaries_fts)');
|
|
45
|
+
const have = new Map(db.prepare('SELECT node_id, text_hash FROM node_embeddings').all().map((r) => [r.node_id, r.text_hash]));
|
|
46
|
+
const pending = db.prepare('SELECT node_id, text FROM node_summaries_fts').all()
|
|
47
|
+
.map((r) => ({ id: r.node_id, text: r.text.slice(0, MAX_TEXT_CHARS) }))
|
|
48
|
+
.filter((r) => have.get(r.id) !== hashText(r.text));
|
|
49
|
+
const insert = db.prepare('INSERT OR REPLACE INTO node_embeddings (node_id, text_hash, vec) VALUES (?, ?, ?)');
|
|
50
|
+
let embedded = 0;
|
|
51
|
+
for (let i = 0; i < pending.length && Date.now() < deadline; i += batchSize) {
|
|
52
|
+
const chunk = pending.slice(i, i + batchSize);
|
|
53
|
+
const vecs = await embedder.embedPassages(chunk.map((c) => c.text));
|
|
54
|
+
for (let attempt = 0;; attempt++) {
|
|
55
|
+
try {
|
|
56
|
+
db.transaction(() => {
|
|
57
|
+
chunk.forEach((c, j) => insert.run(c.id, hashText(c.text), quantize(vecs[j])));
|
|
58
|
+
})();
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
// A build holds the write lock for its whole run; wait it out rather than lose the batch.
|
|
63
|
+
if (!isBusy(e) || attempt >= 6)
|
|
64
|
+
throw e;
|
|
65
|
+
await new Promise((r) => setTimeout(r, 5_000));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
embedded += chunk.length;
|
|
69
|
+
options.onProgress?.(embedded, pending.length);
|
|
70
|
+
}
|
|
71
|
+
return { embedded, remaining: pending.length - embedded };
|
|
72
|
+
}
|
|
73
|
+
const caches = new Map();
|
|
74
|
+
function loadVectors(db, dim) {
|
|
75
|
+
const v = db.prepare('SELECT COUNT(*) AS c, MAX(rowid) AS m FROM node_embeddings').get();
|
|
76
|
+
if (!v.c)
|
|
77
|
+
return null;
|
|
78
|
+
const key = db.name;
|
|
79
|
+
const version = `${v.c}:${v.m}:${dim}`;
|
|
80
|
+
const hit = caches.get(key);
|
|
81
|
+
if (hit?.version === version)
|
|
82
|
+
return hit;
|
|
83
|
+
const ids = [];
|
|
84
|
+
const mat = new Int8Array(v.c * dim);
|
|
85
|
+
let i = 0;
|
|
86
|
+
for (const row of db.prepare('SELECT node_id, vec FROM node_embeddings').iterate()) {
|
|
87
|
+
if (i >= v.c || row.vec.length !== dim)
|
|
88
|
+
continue;
|
|
89
|
+
mat.set(new Int8Array(row.vec.buffer, row.vec.byteOffset, dim), i * dim);
|
|
90
|
+
ids.push(row.node_id);
|
|
91
|
+
i++;
|
|
92
|
+
}
|
|
93
|
+
const cache = { version, dim, ids, mat };
|
|
94
|
+
caches.set(key, cache);
|
|
95
|
+
return cache;
|
|
96
|
+
}
|
|
97
|
+
/** Nearest summaries to `queryVec` by cosine similarity, optionally restricted to some node labels. */
|
|
98
|
+
export function semanticSearch(db, queryVec, limit, label) {
|
|
99
|
+
const dim = queryVec.length;
|
|
100
|
+
const cache = loadVectors(db, dim);
|
|
101
|
+
if (!cache || cache.ids.length === 0)
|
|
102
|
+
return [];
|
|
103
|
+
const { ids, mat } = cache;
|
|
104
|
+
const n = ids.length;
|
|
105
|
+
const scores = new Float32Array(n);
|
|
106
|
+
for (let i = 0, o = 0; i < n; i++, o += dim) {
|
|
107
|
+
let s = 0;
|
|
108
|
+
for (let d = 0; d < dim; d++)
|
|
109
|
+
s += queryVec[d] * mat[o + d];
|
|
110
|
+
scores[i] = s / 127;
|
|
111
|
+
}
|
|
112
|
+
// Over-fetch: the label, closure and existence filters below drop some candidates.
|
|
113
|
+
const want = Math.min(n, Math.max(limit * 4, 100));
|
|
114
|
+
const order = Array.from({ length: n }, (_, i) => i)
|
|
115
|
+
.sort((a, b) => scores[b] - scores[a])
|
|
116
|
+
.slice(0, want);
|
|
117
|
+
const sim = new Map(order.map((i) => [ids[i], scores[i]]));
|
|
118
|
+
const chunkIds = [...sim.keys()];
|
|
119
|
+
const rows = [];
|
|
120
|
+
for (let i = 0; i < chunkIds.length; i += 400) {
|
|
121
|
+
const part = chunkIds.slice(i, i + 400);
|
|
122
|
+
let sql = `SELECT n.id, n.name, n.norm_label, n.file_path, n.label, n.start_line, n.end_line
|
|
123
|
+
FROM nodes n WHERE n.id IN (${part.map(() => '?').join(',')}) AND ${NOT_ANONYMOUS_CLOSURE_SQL}`;
|
|
124
|
+
const params = [...part];
|
|
125
|
+
if (label) {
|
|
126
|
+
const lc = labelClause(label);
|
|
127
|
+
sql += lc.sql;
|
|
128
|
+
params.push(...lc.params);
|
|
129
|
+
}
|
|
130
|
+
rows.push(...db.prepare(sql).all(...params));
|
|
131
|
+
}
|
|
132
|
+
return rows
|
|
133
|
+
.map((r) => ({
|
|
134
|
+
id: r.id,
|
|
135
|
+
name: r.name,
|
|
136
|
+
normLabel: r.norm_label,
|
|
137
|
+
filePath: r.file_path ?? null,
|
|
138
|
+
label: r.label,
|
|
139
|
+
rank: 0,
|
|
140
|
+
startLine: r.start_line ?? null,
|
|
141
|
+
endLine: r.end_line ?? null,
|
|
142
|
+
similarity: sim.get(r.id) ?? 0,
|
|
143
|
+
}))
|
|
144
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
145
|
+
.slice(0, limit);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/embeddings/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Embedder } from './store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Same model the semantic router uses, so the weights are normally already on
|
|
4
|
+
* disk (`monomind download-embeddings`). 384-dim, ~22M parameters.
|
|
5
|
+
*/
|
|
6
|
+
export declare const EMBEDDING_MODEL = "Snowflake/snowflake-arctic-embed-xs";
|
|
7
|
+
/** Whether the model's files are already on disk under transformers.js' cache directory. */
|
|
8
|
+
export declare function isModelCached(cacheDir: string | undefined): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Builds an {@link Embedder} on `@huggingface/transformers`. The caller supplies
|
|
11
|
+
* the module loader (`() => import('@huggingface/transformers')`) so the
|
|
12
|
+
* dependency resolves from the host package; monograph itself does not depend
|
|
13
|
+
* on it. Returns null when the module or the model is unavailable, and
|
|
14
|
+
* `MONOGRAPH_EMBED=0` turns the semantic index off. The model is never
|
|
15
|
+
* downloaded implicitly (~88 MB): without it on disk this returns null —
|
|
16
|
+
* `monomind download-embeddings` fetches it, or set `MONOGRAPH_ALLOW_DOWNLOAD=1`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTransformersEmbedder(load: () => Promise<unknown>): Promise<Embedder | null>;
|
|
19
|
+
//# sourceMappingURL=transformers-embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.d.ts","sourceRoot":"","sources":["../../../src/embeddings/transformers-embedder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,eAAe,wCAAwC,CAAC;AAOrE,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Same model the semantic router uses, so the weights are normally already on
|
|
5
|
+
* disk (`monomind download-embeddings`). 384-dim, ~22M parameters.
|
|
6
|
+
*/
|
|
7
|
+
export const EMBEDDING_MODEL = 'Snowflake/snowflake-arctic-embed-xs';
|
|
8
|
+
const DIM = 384;
|
|
9
|
+
const QUERY_PREFIX = 'Represent this sentence for searching relevant passages: ';
|
|
10
|
+
/** Whether the model's files are already on disk under transformers.js' cache directory. */
|
|
11
|
+
export function isModelCached(cacheDir) {
|
|
12
|
+
return !!cacheDir && existsSync(join(cacheDir, EMBEDDING_MODEL));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Builds an {@link Embedder} on `@huggingface/transformers`. The caller supplies
|
|
16
|
+
* the module loader (`() => import('@huggingface/transformers')`) so the
|
|
17
|
+
* dependency resolves from the host package; monograph itself does not depend
|
|
18
|
+
* on it. Returns null when the module or the model is unavailable, and
|
|
19
|
+
* `MONOGRAPH_EMBED=0` turns the semantic index off. The model is never
|
|
20
|
+
* downloaded implicitly (~88 MB): without it on disk this returns null —
|
|
21
|
+
* `monomind download-embeddings` fetches it, or set `MONOGRAPH_ALLOW_DOWNLOAD=1`.
|
|
22
|
+
*/
|
|
23
|
+
export async function createTransformersEmbedder(load) {
|
|
24
|
+
if (process.env.MONOGRAPH_EMBED === '0')
|
|
25
|
+
return null;
|
|
26
|
+
let pipe;
|
|
27
|
+
try {
|
|
28
|
+
const hf = (await load());
|
|
29
|
+
if (process.env.MONOGRAPH_ALLOW_DOWNLOAD !== '1' && !isModelCached(hf.env?.cacheDir))
|
|
30
|
+
return null;
|
|
31
|
+
pipe = await hf.pipeline('feature-extraction', EMBEDDING_MODEL, { dtype: 'fp32' });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const run = async (texts) => {
|
|
37
|
+
const out = await pipe(texts, { pooling: 'cls', normalize: true });
|
|
38
|
+
const data = out.data;
|
|
39
|
+
return texts.map((_, i) => data.slice(i * DIM, (i + 1) * DIM));
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
model: EMBEDDING_MODEL,
|
|
43
|
+
dim: DIM,
|
|
44
|
+
embedPassages: run,
|
|
45
|
+
embedQuery: async (q) => (await run([QUERY_PREFIX + q]))[0],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=transformers-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.js","sourceRoot":"","sources":["../../../src/embeddings/transformers-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,qCAAqC,CAAC;AACrE,MAAM,GAAG,GAAG,GAAG,CAAC;AAChB,MAAM,YAAY,GAAG,2DAA2D,CAAC;AAKjF,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAAC,QAA4B;IACxD,OAAO,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAA4B;IAE5B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAGvB,CAAC;QACF,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,EAAE,KAAe,EAA2B,EAAE;QAC7D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAoB,CAAC;QACtC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,GAAG,EAAE,GAAG;QACR,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export * from './cli/eval-server.js';
|
|
|
17
17
|
export * from './cli/hooks-install.js';
|
|
18
18
|
export * from './cli/setup.js';
|
|
19
19
|
export * from './cli/skill-gen.js';
|
|
20
|
+
export * from './embeddings/store.js';
|
|
21
|
+
export * from './embeddings/transformers-embedder.js';
|
|
20
22
|
export * from './export/adjacency-matrix.js';
|
|
21
23
|
export * from './export/canvas.js';
|
|
22
24
|
export * from './export/csv.js';
|
|
@@ -70,6 +72,7 @@ export * from './mcp-tools/tool-map.js';
|
|
|
70
72
|
export * from './parsers/language-parsers.js';
|
|
71
73
|
export * from './parsers/named-bindings.js';
|
|
72
74
|
export * from './pipeline/cluster-only.js';
|
|
75
|
+
export * from './pipeline/manifest.js';
|
|
73
76
|
export * from './pipeline/orchestrator.js';
|
|
74
77
|
export * from './pipeline/phases/evidence.js';
|
|
75
78
|
export * from './pipeline/phases/field-access.js';
|
|
@@ -86,6 +89,7 @@ export * from './reporting/graph-report.js';
|
|
|
86
89
|
export * from './scope-resolution/evidence-weights.js';
|
|
87
90
|
export * from './search/ast-chunker.js';
|
|
88
91
|
export * from './search/diacritic.js';
|
|
92
|
+
export * from './search/fused-search.js';
|
|
89
93
|
export * from './search/hybrid-query.js';
|
|
90
94
|
export * from './search/rrf.js';
|
|
91
95
|
export * from './security/safe-fetch.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,6 +17,8 @@ export * from './cli/eval-server.js';
|
|
|
17
17
|
export * from './cli/hooks-install.js';
|
|
18
18
|
export * from './cli/setup.js';
|
|
19
19
|
export * from './cli/skill-gen.js';
|
|
20
|
+
export * from './embeddings/store.js';
|
|
21
|
+
export * from './embeddings/transformers-embedder.js';
|
|
20
22
|
export * from './export/adjacency-matrix.js';
|
|
21
23
|
export * from './export/canvas.js';
|
|
22
24
|
export * from './export/csv.js';
|
|
@@ -71,6 +73,7 @@ export * from './mcp-tools/tool-map.js';
|
|
|
71
73
|
export * from './parsers/language-parsers.js';
|
|
72
74
|
export * from './parsers/named-bindings.js';
|
|
73
75
|
export * from './pipeline/cluster-only.js';
|
|
76
|
+
export * from './pipeline/manifest.js';
|
|
74
77
|
export * from './pipeline/orchestrator.js';
|
|
75
78
|
export * from './pipeline/phases/evidence.js';
|
|
76
79
|
export * from './pipeline/phases/field-access.js';
|
|
@@ -87,6 +90,7 @@ export * from './reporting/graph-report.js';
|
|
|
87
90
|
export * from './scope-resolution/evidence-weights.js';
|
|
88
91
|
export * from './search/ast-chunker.js';
|
|
89
92
|
export * from './search/diacritic.js';
|
|
93
|
+
export * from './search/fused-search.js';
|
|
90
94
|
export * from './search/hybrid-query.js';
|
|
91
95
|
export * from './search/rrf.js';
|
|
92
96
|
export * from './security/safe-fetch.js';
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { Embedder } from '../embeddings/store.js';
|
|
3
|
+
import type { MonographNode } from '../types.js';
|
|
4
|
+
import { type RiskLevel } from './impact.js';
|
|
5
|
+
export interface BriefSymbol {
|
|
6
|
+
node: MonographNode;
|
|
7
|
+
relevance: number;
|
|
8
|
+
callers: MonographNode[];
|
|
9
|
+
callees: MonographNode[];
|
|
10
|
+
/** Test files that call this symbol, or import its file. */
|
|
11
|
+
tests: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface MonographBrief {
|
|
14
|
+
task: string;
|
|
15
|
+
/** Best-matching code symbols/files, each with its immediate surroundings. */
|
|
16
|
+
entryPoints: BriefSymbol[];
|
|
17
|
+
/** Documentation sections about the task. */
|
|
18
|
+
docs: MonographNode[];
|
|
19
|
+
/** Blast radius of the single best entry point. */
|
|
20
|
+
impact: {
|
|
21
|
+
nodeId: string;
|
|
22
|
+
name: string;
|
|
23
|
+
riskLevel: RiskLevel;
|
|
24
|
+
riskScore: number;
|
|
25
|
+
affectedFiles: string[];
|
|
26
|
+
affectedTests: string[];
|
|
27
|
+
} | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* One call that answers "where do I start on this task": the best code entry
|
|
31
|
+
* points with their callers, callees and tests, the docs that cover it, and the
|
|
32
|
+
* blast radius of the top hit — what an agent otherwise assembles from four or
|
|
33
|
+
* five separate tool calls.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getMonographBrief(db: Database.Database, task: string, options?: {
|
|
36
|
+
entryPoints?: number;
|
|
37
|
+
docs?: number;
|
|
38
|
+
embedder?: Embedder | null;
|
|
39
|
+
}): Promise<MonographBrief>;
|
|
40
|
+
//# sourceMappingURL=brief.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/brief.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC;CACV;AA6BD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAAO,GAChF,OAAO,CAAC,cAAc,CAAC,CA4CzB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { searchGraphFused } from '../search/fused-search.js';
|
|
2
|
+
import { rowToNode } from '../storage/node-store.js';
|
|
3
|
+
import { monographImpact } from './impact.js';
|
|
4
|
+
function related(db, nodeId, inbound, limit) {
|
|
5
|
+
const [filterCol, joinCol] = inbound ? ['target_id', 'source_id'] : ['source_id', 'target_id'];
|
|
6
|
+
const rows = db
|
|
7
|
+
.prepare(`SELECT n.* FROM nodes n JOIN edges e ON n.id = e.${joinCol}
|
|
8
|
+
WHERE e.${filterCol} = ? AND e.relation = 'CALLS' LIMIT ?`)
|
|
9
|
+
.all(nodeId, limit);
|
|
10
|
+
return rows.map(rowToNode);
|
|
11
|
+
}
|
|
12
|
+
function testsFor(db, node) {
|
|
13
|
+
const rows = db
|
|
14
|
+
.prepare(`SELECT DISTINCT s.file_path AS p FROM edges e JOIN nodes s ON s.id = e.source_id
|
|
15
|
+
WHERE e.relation = 'TESTS' AND (e.target_id = ? OR e.target_id IN
|
|
16
|
+
(SELECT id FROM nodes WHERE label = 'File' AND file_path = ?))`)
|
|
17
|
+
.all(node.id, node.filePath ?? '');
|
|
18
|
+
return rows.flatMap((r) => (r.p ? [r.p] : [])).sort();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* One call that answers "where do I start on this task": the best code entry
|
|
22
|
+
* points with their callers, callees and tests, the docs that cover it, and the
|
|
23
|
+
* blast radius of the top hit — what an agent otherwise assembles from four or
|
|
24
|
+
* five separate tool calls.
|
|
25
|
+
*/
|
|
26
|
+
export async function getMonographBrief(db, task, options = {}) {
|
|
27
|
+
const nEntry = options.entryPoints ?? 5;
|
|
28
|
+
const nDocs = options.docs ?? 3;
|
|
29
|
+
const { embedder } = options;
|
|
30
|
+
const code = await searchGraphFused(db, task, { limit: nEntry, scope: 'code', embedder });
|
|
31
|
+
const docHits = await searchGraphFused(db, task, { limit: nDocs, scope: 'docs', embedder });
|
|
32
|
+
const entryPoints = [];
|
|
33
|
+
for (const hit of code) {
|
|
34
|
+
const row = db.prepare('SELECT * FROM nodes WHERE id = ?').get(hit.id);
|
|
35
|
+
if (!row)
|
|
36
|
+
continue;
|
|
37
|
+
const node = rowToNode(row);
|
|
38
|
+
entryPoints.push({
|
|
39
|
+
node,
|
|
40
|
+
relevance: hit.relevance,
|
|
41
|
+
callers: related(db, node.id, true, 4),
|
|
42
|
+
callees: related(db, node.id, false, 4),
|
|
43
|
+
tests: testsFor(db, node),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const docs = docHits.flatMap((h) => {
|
|
47
|
+
const row = db.prepare('SELECT * FROM nodes WHERE id = ?').get(h.id);
|
|
48
|
+
return row ? [rowToNode(row)] : [];
|
|
49
|
+
});
|
|
50
|
+
const top = entryPoints[0]?.node;
|
|
51
|
+
let impact = null;
|
|
52
|
+
if (top) {
|
|
53
|
+
const result = await monographImpact(db, top.id, { maxDepth: 3 });
|
|
54
|
+
impact = {
|
|
55
|
+
nodeId: top.id,
|
|
56
|
+
name: top.name,
|
|
57
|
+
riskLevel: result.riskLevel,
|
|
58
|
+
riskScore: result.riskScore,
|
|
59
|
+
affectedFiles: result.affectedFiles,
|
|
60
|
+
affectedTests: result.affectedTests,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return { task, entryPoints, docs, impact };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../../src/mcp-tools/brief.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AA4B9D,SAAS,OAAO,CACd,EAAqB,EACrB,MAAc,EACd,OAAgB,EAChB,KAAa;IAEb,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,oDAAoD,OAAO;iBAChD,SAAS,uCAAuC,CAC5D;SACA,GAAG,CAAC,MAAM,EAAE,KAAK,CAA8B,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,EAAqB,EAAE,IAAmB;IAC1D,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;wEAEkE,CACnE;SACA,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAA2B,CAAC;IAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAqB,EACrB,IAAY,EACZ,OAAO,GAAwE,EAAE;IAEjF,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE5F,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAExD,CAAC;QACd,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YACf,IAAI;YACJ,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAEtD,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACjC,IAAI,MAAM,GAA6B,IAAI,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,GAAG;YACP,MAAM,EAAE,GAAG,CAAC,EAAE;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -7,6 +7,10 @@ export interface MonographContextResult {
|
|
|
7
7
|
callees: MonographNode[];
|
|
8
8
|
imports: MonographNode[];
|
|
9
9
|
importedBy: MonographNode[];
|
|
10
|
+
/** Test files that call this symbol directly (TESTS edges to the node). */
|
|
11
|
+
testedBy: MonographNode[];
|
|
12
|
+
/** Test files that import this symbol's file — coarser than `testedBy`. */
|
|
13
|
+
fileTests: MonographNode[];
|
|
10
14
|
community: {
|
|
11
15
|
id: number;
|
|
12
16
|
label?: string;
|
|
@@ -20,6 +24,11 @@ export interface MonographContextResult {
|
|
|
20
24
|
/** Populated when ambiguous (non-test first) — re-query with `nodeId` or `filePath`. */
|
|
21
25
|
candidates?: SymbolCandidate[];
|
|
22
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* The 360° view of one symbol: who calls it, what it calls, what imports it,
|
|
29
|
+
* which tests cover it, which community and processes it belongs to. A name
|
|
30
|
+
* that matches several definitions comes back as candidates rather than a guess.
|
|
31
|
+
*/
|
|
23
32
|
export declare function getMonographContext(db: Database.Database, input: {
|
|
24
33
|
name: string;
|
|
25
34
|
filePath?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI5E,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AA2BD,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,sBAAsB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI5E,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,2EAA2E;IAC3E,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AA2BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,sBAAsB,CAkFxB"}
|
|
@@ -12,6 +12,11 @@ function queryRelated(db, nodeId, relation, inbound, limit = 50) {
|
|
|
12
12
|
return rows.map(rowToNode);
|
|
13
13
|
}
|
|
14
14
|
// ── Implementation ─────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* The 360° view of one symbol: who calls it, what it calls, what imports it,
|
|
17
|
+
* which tests cover it, which community and processes it belongs to. A name
|
|
18
|
+
* that matches several definitions comes back as candidates rather than a guess.
|
|
19
|
+
*/
|
|
15
20
|
export function getMonographContext(db, input) {
|
|
16
21
|
const LIMIT = 50;
|
|
17
22
|
// 1. Find the node — several same-named definitions are returned as
|
|
@@ -29,6 +34,8 @@ export function getMonographContext(db, input) {
|
|
|
29
34
|
callees: [],
|
|
30
35
|
imports: [],
|
|
31
36
|
importedBy: [],
|
|
37
|
+
testedBy: [],
|
|
38
|
+
fileTests: [],
|
|
32
39
|
community: null,
|
|
33
40
|
inProcesses: [],
|
|
34
41
|
ambiguous: candidates.length > 1,
|
|
@@ -42,6 +49,17 @@ export function getMonographContext(db, input) {
|
|
|
42
49
|
const callees = queryRelated(db, nodeId, 'CALLS', false, LIMIT);
|
|
43
50
|
const imports = queryRelated(db, nodeId, 'IMPORTS', false, LIMIT);
|
|
44
51
|
const importedBy = queryRelated(db, nodeId, 'IMPORTS', true, LIMIT);
|
|
52
|
+
// Tests: files with a TESTS edge to this symbol, and to the file defining it.
|
|
53
|
+
const testedBy = queryRelated(db, nodeId, 'TESTS', true, LIMIT);
|
|
54
|
+
const fileRow = node.filePath
|
|
55
|
+
? db
|
|
56
|
+
.prepare("SELECT id FROM nodes WHERE label = 'File' AND file_path = ? AND id != ?")
|
|
57
|
+
.get(node.filePath, nodeId)
|
|
58
|
+
: undefined;
|
|
59
|
+
const seen = new Set(testedBy.map((t) => t.id));
|
|
60
|
+
const fileTests = fileRow
|
|
61
|
+
? queryRelated(db, fileRow.id, 'TESTS', true, LIMIT).filter((t) => !seen.has(t.id))
|
|
62
|
+
: [];
|
|
45
63
|
// 6. Community: from node's community_id field
|
|
46
64
|
let community = null;
|
|
47
65
|
if (node.communityId != null) {
|
|
@@ -62,6 +80,8 @@ export function getMonographContext(db, input) {
|
|
|
62
80
|
callees,
|
|
63
81
|
imports,
|
|
64
82
|
importedBy,
|
|
83
|
+
testedBy,
|
|
84
|
+
fileTests,
|
|
65
85
|
community,
|
|
66
86
|
inProcesses: processRows,
|
|
67
87
|
ambiguous: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/mcp-tools/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAwB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/mcp-tools/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ export interface MonographImpactResult {
|
|
|
16
16
|
nodes: MonographNode[];
|
|
17
17
|
}>;
|
|
18
18
|
affectedFiles: string[];
|
|
19
|
+
/** Test files covering the node, its callers, or any affected file — what to run after a change. */
|
|
20
|
+
affectedTests: string[];
|
|
19
21
|
riskScore: number;
|
|
20
22
|
riskLevel: RiskLevel;
|
|
21
23
|
/** True when `name` matched several nodes and nothing narrowed it to one. */
|
|
@@ -23,6 +25,13 @@ export interface MonographImpactResult {
|
|
|
23
25
|
/** Populated when ambiguous (non-test first) — re-query with `nodeId` or `filePath`. */
|
|
24
26
|
candidates?: SymbolCandidate[];
|
|
25
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* "What breaks if I change this?" — walks outward from a symbol through its
|
|
30
|
+
* callers, importers, references and subclasses. Returns the affected symbols
|
|
31
|
+
* by distance, the affected files, the tests that cover any of them
|
|
32
|
+
* (`affectedTests`) and a risk level. A name that matches several definitions
|
|
33
|
+
* comes back as candidates rather than a guess.
|
|
34
|
+
*/
|
|
26
35
|
export declare function getMonographImpact(db: Database.Database, input: {
|
|
27
36
|
name: string;
|
|
28
37
|
filePath?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI5E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAK7D;AAID,MAAM,WAAW,aAAa;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,iBAAiB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAuDD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E,qBAAqB,
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI5E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAK7D;AAID,MAAM,WAAW,aAAa;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,iBAAiB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oGAAoG;IACpG,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAuDD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E,qBAAqB,CAkCvB;AAwFD,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAsBhC"}
|