mincut-context 1.0.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/LICENSE +21 -0
- package/README.md +268 -0
- package/dist/adapters/cli/bin.d.ts +3 -0
- package/dist/adapters/cli/bin.d.ts.map +1 -0
- package/dist/adapters/cli/bin.js +119 -0
- package/dist/adapters/cli/bin.js.map +1 -0
- package/dist/adapters/cli/render.d.ts +10 -0
- package/dist/adapters/cli/render.d.ts.map +1 -0
- package/dist/adapters/cli/render.js +65 -0
- package/dist/adapters/cli/render.js.map +1 -0
- package/dist/adapters/cli/tui.d.ts +9 -0
- package/dist/adapters/cli/tui.d.ts.map +1 -0
- package/dist/adapters/cli/tui.js +57 -0
- package/dist/adapters/cli/tui.js.map +1 -0
- package/dist/adapters/lib/index.d.ts +6 -0
- package/dist/adapters/lib/index.d.ts.map +1 -0
- package/dist/adapters/lib/index.js +4 -0
- package/dist/adapters/lib/index.js.map +1 -0
- package/dist/adapters/mcp/handler.d.ts +112 -0
- package/dist/adapters/mcp/handler.d.ts.map +1 -0
- package/dist/adapters/mcp/handler.js +128 -0
- package/dist/adapters/mcp/handler.js.map +1 -0
- package/dist/adapters/mcp/index.d.ts +6 -0
- package/dist/adapters/mcp/index.d.ts.map +1 -0
- package/dist/adapters/mcp/index.js +32 -0
- package/dist/adapters/mcp/index.js.map +1 -0
- package/dist/core/graph.d.ts +50 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +110 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pagerank.d.ts +30 -0
- package/dist/core/pagerank.d.ts.map +1 -0
- package/dist/core/pagerank.js +88 -0
- package/dist/core/pagerank.js.map +1 -0
- package/dist/core/select.d.ts +60 -0
- package/dist/core/select.d.ts.map +1 -0
- package/dist/core/select.js +121 -0
- package/dist/core/select.js.map +1 -0
- package/dist/index/builder.d.ts +13 -0
- package/dist/index/builder.d.ts.map +1 -0
- package/dist/index/builder.js +186 -0
- package/dist/index/builder.js.map +1 -0
- package/dist/index/walker.d.ts +15 -0
- package/dist/index/walker.d.ts.map +1 -0
- package/dist/index/walker.js +103 -0
- package/dist/index/walker.js.map +1 -0
- package/dist/parsers/parser.d.ts +35 -0
- package/dist/parsers/parser.d.ts.map +1 -0
- package/dist/parsers/parser.js +8 -0
- package/dist/parsers/parser.js.map +1 -0
- package/dist/parsers/py.d.ts +3 -0
- package/dist/parsers/py.d.ts.map +1 -0
- package/dist/parsers/py.js +169 -0
- package/dist/parsers/py.js.map +1 -0
- package/dist/parsers/ts.d.ts +3 -0
- package/dist/parsers/ts.d.ts.map +1 -0
- package/dist/parsers/ts.js +240 -0
- package/dist/parsers/ts.js.map +1 -0
- package/dist/seeds/embedding.d.ts +27 -0
- package/dist/seeds/embedding.d.ts.map +1 -0
- package/dist/seeds/embedding.js +90 -0
- package/dist/seeds/embedding.js.map +1 -0
- package/dist/seeds/keyword.d.ts +22 -0
- package/dist/seeds/keyword.d.ts.map +1 -0
- package/dist/seeds/keyword.js +106 -0
- package/dist/seeds/keyword.js.map +1 -0
- package/dist/seeds/transformers-embedder.d.ts +21 -0
- package/dist/seeds/transformers-embedder.d.ts.map +1 -0
- package/dist/seeds/transformers-embedder.js +26 -0
- package/dist/seeds/transformers-embedder.js.map +1 -0
- package/dist/select/pack.d.ts +48 -0
- package/dist/select/pack.d.ts.map +1 -0
- package/dist/select/pack.js +135 -0
- package/dist/select/pack.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const STOPWORDS = new Set([
|
|
2
|
+
'a', 'an', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'do', 'does',
|
|
3
|
+
'for', 'from', 'has', 'have', 'he', 'her', 'his', 'i', 'if', 'in', 'is', 'it',
|
|
4
|
+
'its', 'me', 'my', 'no', 'not', 'of', 'on', 'or', 'our', 'she', 'so', 'some',
|
|
5
|
+
'than', 'that', 'the', 'their', 'them', 'then', 'there', 'they', 'this', 'to',
|
|
6
|
+
'us', 'was', 'we', 'were', 'when', 'where', 'which', 'who', 'will', 'with',
|
|
7
|
+
'you', 'your',
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* Lower-cased, split-on-non-alphanum, broken on case boundaries.
|
|
11
|
+
* Drops stopwords and 1-char fragments.
|
|
12
|
+
*/
|
|
13
|
+
export function tokenizeTask(task) {
|
|
14
|
+
const out = new Set();
|
|
15
|
+
const pieces = task.split(/[^A-Za-z0-9]+/).filter(Boolean);
|
|
16
|
+
for (const piece of pieces) {
|
|
17
|
+
for (const sub of splitOnCase(piece)) {
|
|
18
|
+
const lower = sub.toLowerCase();
|
|
19
|
+
if (lower.length < 2)
|
|
20
|
+
continue;
|
|
21
|
+
if (STOPWORDS.has(lower))
|
|
22
|
+
continue;
|
|
23
|
+
out.add(lower);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return [...out];
|
|
27
|
+
}
|
|
28
|
+
function splitOnCase(s) {
|
|
29
|
+
// Split on camelCase boundaries: fooBar → ['foo','Bar']; ABCDef → ['ABC','Def'].
|
|
30
|
+
return s
|
|
31
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
32
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
|
|
33
|
+
.split(/\s+/)
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Score every node by how strongly its symbol name (tokenized) overlaps with
|
|
38
|
+
* the task tokens, weighted by inverse document frequency (rarer names matter
|
|
39
|
+
* more). Returns the top-k as a Map<nodeId, score>.
|
|
40
|
+
*
|
|
41
|
+
* score(node) = Σ_{token ∈ task ∩ name} IDF(token) · match_weight
|
|
42
|
+
*
|
|
43
|
+
* where match_weight = 1.0 for exact whole-name match, 0.5 for partial
|
|
44
|
+
* sub-token match.
|
|
45
|
+
*/
|
|
46
|
+
export function scoreSeeds(graph, task, options) {
|
|
47
|
+
if (options.k <= 0)
|
|
48
|
+
throw new Error('k must be positive');
|
|
49
|
+
const tokens = tokenizeTask(task);
|
|
50
|
+
if (tokens.length === 0)
|
|
51
|
+
return new Map();
|
|
52
|
+
// 1. Build the name-token index.
|
|
53
|
+
const nodes = graph.nodes();
|
|
54
|
+
const nameTokensByNode = new Map();
|
|
55
|
+
const documentFreq = new Map();
|
|
56
|
+
for (const id of nodes) {
|
|
57
|
+
const data = graph.getNode(id);
|
|
58
|
+
if (!data)
|
|
59
|
+
continue;
|
|
60
|
+
const name = data.name ?? id.split(':').slice(1).join(':');
|
|
61
|
+
const nameTokens = tokenizeTask(name);
|
|
62
|
+
nameTokensByNode.set(id, nameTokens);
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
for (const t of nameTokens) {
|
|
65
|
+
if (seen.has(t))
|
|
66
|
+
continue;
|
|
67
|
+
seen.add(t);
|
|
68
|
+
documentFreq.set(t, (documentFreq.get(t) ?? 0) + 1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const N = nodes.length || 1;
|
|
72
|
+
const idf = (t) => {
|
|
73
|
+
const df = documentFreq.get(t) ?? 0;
|
|
74
|
+
if (df === 0)
|
|
75
|
+
return 0;
|
|
76
|
+
return Math.log(1 + N / df);
|
|
77
|
+
};
|
|
78
|
+
// 2. Score each node against the task tokens.
|
|
79
|
+
const scored = [];
|
|
80
|
+
for (const [id, nameTokens] of nameTokensByNode) {
|
|
81
|
+
if (nameTokens.length === 0)
|
|
82
|
+
continue;
|
|
83
|
+
const nameSet = new Set(nameTokens);
|
|
84
|
+
let score = 0;
|
|
85
|
+
for (const t of tokens) {
|
|
86
|
+
if (nameSet.has(t)) {
|
|
87
|
+
// exact sub-token match
|
|
88
|
+
score += idf(t) * (nameTokens.length === 1 && nameTokens[0] === t ? 1.0 : 0.6);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// partial substring match (e.g. task 'session' vs name 'sess')
|
|
92
|
+
for (const nt of nameSet) {
|
|
93
|
+
if (nt.length >= 4 && (nt.includes(t) || t.includes(nt))) {
|
|
94
|
+
score += idf(t) * 0.25;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (score > 0)
|
|
101
|
+
scored.push([id, score]);
|
|
102
|
+
}
|
|
103
|
+
scored.sort((a, b) => b[1] - a[1]);
|
|
104
|
+
return new Map(scored.slice(0, options.k));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=keyword.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../src/seeds/keyword.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Embedder } from './embedding.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lazy-loading transformer.js embedder.
|
|
4
|
+
*
|
|
5
|
+
* The model is downloaded on first use and cached in
|
|
6
|
+
* ~/.cache/huggingface (or platform equivalent). Default model is
|
|
7
|
+
* Xenova/all-MiniLM-L6-v2 — 384 dims, ~22 MB, fast on CPU.
|
|
8
|
+
*
|
|
9
|
+
* We don't import @xenova/transformers at the top of the file because:
|
|
10
|
+
* 1. It's an optional dependency (CLI flag, opt-in).
|
|
11
|
+
* 2. It pulls in onnxruntime which is heavyweight and slow to load.
|
|
12
|
+
* 3. Tests use the fake embedder and should never trigger this.
|
|
13
|
+
*/
|
|
14
|
+
export interface TransformersOptions {
|
|
15
|
+
/** Hugging Face model id. Default 'Xenova/all-MiniLM-L6-v2'. */
|
|
16
|
+
model?: string;
|
|
17
|
+
/** Pipeline quantization. Default true for smaller download. */
|
|
18
|
+
quantized?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function createTransformersEmbedder(options?: TransformersOptions): Embedder;
|
|
21
|
+
//# sourceMappingURL=transformers-embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.d.ts","sourceRoot":"","sources":["../../src/seeds/transformers-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,mBAAwB,GAAG,QAAQ,CAwBtF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function createTransformersEmbedder(options = {}) {
|
|
2
|
+
const modelId = options.model ?? 'Xenova/all-MiniLM-L6-v2';
|
|
3
|
+
const quantized = options.quantized ?? true;
|
|
4
|
+
let pipelinePromise = null;
|
|
5
|
+
return {
|
|
6
|
+
async embed(texts) {
|
|
7
|
+
if (!pipelinePromise) {
|
|
8
|
+
pipelinePromise = loadPipeline(modelId, quantized);
|
|
9
|
+
}
|
|
10
|
+
const pipe = (await pipelinePromise);
|
|
11
|
+
const out = await pipe(texts, { pooling: 'mean', normalize: true });
|
|
12
|
+
// out.data is a flat Float32Array of shape [batch, dim]; split it back.
|
|
13
|
+
const [batch, dim] = out.dims;
|
|
14
|
+
const result = [];
|
|
15
|
+
for (let i = 0; i < batch; i++) {
|
|
16
|
+
result.push(out.data.slice(i * dim, (i + 1) * dim));
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function loadPipeline(modelId, quantized) {
|
|
23
|
+
const t = (await import('@xenova/transformers'));
|
|
24
|
+
return t.pipeline('feature-extraction', modelId, { quantized });
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=transformers-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.js","sourceRoot":"","sources":["../../src/seeds/transformers-embedder.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,0BAA0B,CAAC,UAA+B,EAAE;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,IAAI,eAAe,GAA4B,IAAI,CAAC;IAEpD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,KAAe;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,eAAe,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,eAAe,CAGiB,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,wEAAwE;YACxE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YAC9B,MAAM,MAAM,GAAmB,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,SAAkB;IAC7D,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAE9C,CAAC;IACF,OAAO,CAAC,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type Embedder } from '../seeds/embedding.js';
|
|
2
|
+
export interface PackOptions {
|
|
3
|
+
task: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
budget: number;
|
|
6
|
+
/** Top-k seeds derived from the task. Default 8. */
|
|
7
|
+
seeds?: number;
|
|
8
|
+
/** PageRank damping factor. Default 0.85. */
|
|
9
|
+
alpha?: number;
|
|
10
|
+
/** Walk include patterns. */
|
|
11
|
+
include?: string[];
|
|
12
|
+
/** Walk exclude patterns. */
|
|
13
|
+
exclude?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Optional embedder for hybrid (semantic) seed scoring.
|
|
16
|
+
* If omitted, pure keyword/IDF seeding is used.
|
|
17
|
+
*/
|
|
18
|
+
embedder?: Embedder;
|
|
19
|
+
/**
|
|
20
|
+
* 0 = keyword-only (default if no embedder), 1 = embedding-only.
|
|
21
|
+
* Honored only when `embedder` is provided. Default 0.5.
|
|
22
|
+
*/
|
|
23
|
+
embedWeight?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface FileRange {
|
|
26
|
+
start: number;
|
|
27
|
+
end: number;
|
|
28
|
+
}
|
|
29
|
+
export interface PackedFile {
|
|
30
|
+
path: string;
|
|
31
|
+
ranges: FileRange[];
|
|
32
|
+
score: number;
|
|
33
|
+
tokens: number;
|
|
34
|
+
reasons: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface PackResult {
|
|
37
|
+
files: PackedFile[];
|
|
38
|
+
tokens: number;
|
|
39
|
+
graph: {
|
|
40
|
+
selected: number;
|
|
41
|
+
frontier: number;
|
|
42
|
+
cutCost: number;
|
|
43
|
+
totalSymbols: number;
|
|
44
|
+
};
|
|
45
|
+
explain: string;
|
|
46
|
+
}
|
|
47
|
+
export declare function pack(options: PackOptions): Promise<PackResult>;
|
|
48
|
+
//# sourceMappingURL=pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8FpE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { greedySelect, personalizedPageRank } from '../core/index.js';
|
|
2
|
+
import { indexRepo } from '../index/builder.js';
|
|
3
|
+
import { scoreSeeds } from '../seeds/keyword.js';
|
|
4
|
+
import { scoreSeedsHybrid } from '../seeds/embedding.js';
|
|
5
|
+
export async function pack(options) {
|
|
6
|
+
const { task, repo, budget, seeds = 8, alpha = 0.85, include, exclude, embedder, embedWeight = 0.5, } = options;
|
|
7
|
+
if (budget <= 0)
|
|
8
|
+
throw new Error('budget must be positive');
|
|
9
|
+
const walkOpts = { include, exclude };
|
|
10
|
+
const { graph, stats } = indexRepo(repo, walkOpts);
|
|
11
|
+
if (graph.order() === 0) {
|
|
12
|
+
return emptyResult('No supported source files found.', stats.symbols);
|
|
13
|
+
}
|
|
14
|
+
const seedMap = embedder
|
|
15
|
+
? await scoreSeedsHybrid(graph, task, { k: seeds, embedder, embedWeight })
|
|
16
|
+
: scoreSeeds(graph, task, { k: seeds });
|
|
17
|
+
if (seedMap.size === 0) {
|
|
18
|
+
return emptyResult(`No symbols matched the task “${task}”.`, stats.symbols);
|
|
19
|
+
}
|
|
20
|
+
// Drop seeds (lowest-scored first) until the cumulative token cost fits the
|
|
21
|
+
// budget — otherwise greedySelect would refuse the seed set outright.
|
|
22
|
+
const seedsByScore = [...seedMap.entries()].sort((a, b) => b[1] - a[1]);
|
|
23
|
+
const fittedSeeds = new Map();
|
|
24
|
+
let seedTokens = 0;
|
|
25
|
+
for (const [id, score] of seedsByScore) {
|
|
26
|
+
const n = graph.getNode(id);
|
|
27
|
+
if (!n)
|
|
28
|
+
continue;
|
|
29
|
+
if (seedTokens + n.tokens > budget)
|
|
30
|
+
continue;
|
|
31
|
+
fittedSeeds.set(id, score);
|
|
32
|
+
seedTokens += n.tokens;
|
|
33
|
+
}
|
|
34
|
+
if (fittedSeeds.size === 0) {
|
|
35
|
+
return emptyResult(`All matching symbols exceed the budget of ${budget} tokens. Try increasing --budget.`, stats.symbols);
|
|
36
|
+
}
|
|
37
|
+
const ranks = personalizedPageRank(graph, { seeds: fittedSeeds, alpha });
|
|
38
|
+
const selection = greedySelect(graph, {
|
|
39
|
+
seeds: new Set(fittedSeeds.keys()),
|
|
40
|
+
ranks,
|
|
41
|
+
budget,
|
|
42
|
+
});
|
|
43
|
+
const byFile = new Map();
|
|
44
|
+
for (const entry of selection.entries) {
|
|
45
|
+
const data = graph.getNode(entry.id);
|
|
46
|
+
if (!data)
|
|
47
|
+
continue;
|
|
48
|
+
const file = data.file;
|
|
49
|
+
const acc = byFile.get(file) ?? { ranges: [], score: 0, tokens: 0, reasons: [] };
|
|
50
|
+
if (data.startLine && data.endLine) {
|
|
51
|
+
acc.ranges.push({ start: data.startLine, end: data.endLine });
|
|
52
|
+
}
|
|
53
|
+
acc.score += entry.rank;
|
|
54
|
+
acc.tokens += entry.tokens;
|
|
55
|
+
acc.reasons.push(entry.reason);
|
|
56
|
+
byFile.set(file, acc);
|
|
57
|
+
}
|
|
58
|
+
const files = [];
|
|
59
|
+
for (const [path, acc] of byFile) {
|
|
60
|
+
files.push({
|
|
61
|
+
path,
|
|
62
|
+
ranges: mergeRanges(acc.ranges),
|
|
63
|
+
score: acc.score,
|
|
64
|
+
tokens: acc.tokens,
|
|
65
|
+
reasons: dedupe(acc.reasons),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
files.sort((a, b) => b.score - a.score);
|
|
69
|
+
return {
|
|
70
|
+
files,
|
|
71
|
+
tokens: selection.tokens,
|
|
72
|
+
graph: {
|
|
73
|
+
selected: selection.selected.size,
|
|
74
|
+
frontier: frontierCount(graph, selection.selected),
|
|
75
|
+
cutCost: selection.cutCost,
|
|
76
|
+
totalSymbols: stats.symbols,
|
|
77
|
+
},
|
|
78
|
+
explain: buildExplain(task, fittedSeeds, selection, files, budget, stats.files),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function mergeRanges(ranges) {
|
|
82
|
+
if (ranges.length === 0)
|
|
83
|
+
return [];
|
|
84
|
+
const sorted = [...ranges].sort((a, b) => a.start - b.start);
|
|
85
|
+
const merged = [sorted[0]];
|
|
86
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
87
|
+
const last = merged[merged.length - 1];
|
|
88
|
+
const cur = sorted[i];
|
|
89
|
+
if (cur.start <= last.end + 1) {
|
|
90
|
+
last.end = Math.max(last.end, cur.end);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
merged.push({ ...cur });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return merged;
|
|
97
|
+
}
|
|
98
|
+
function dedupe(strings) {
|
|
99
|
+
return [...new Set(strings)];
|
|
100
|
+
}
|
|
101
|
+
function frontierCount(graph, t) {
|
|
102
|
+
const frontier = new Set();
|
|
103
|
+
for (const id of t) {
|
|
104
|
+
for (const e of graph.outEdges(id)) {
|
|
105
|
+
if (!t.has(e.target))
|
|
106
|
+
frontier.add(e.target);
|
|
107
|
+
}
|
|
108
|
+
for (const e of graph.inEdges(id)) {
|
|
109
|
+
if (!t.has(e.target))
|
|
110
|
+
frontier.add(e.target);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return frontier.size;
|
|
114
|
+
}
|
|
115
|
+
function emptyResult(reason, totalSymbols) {
|
|
116
|
+
return {
|
|
117
|
+
files: [],
|
|
118
|
+
tokens: 0,
|
|
119
|
+
graph: { selected: 0, frontier: 0, cutCost: 0, totalSymbols },
|
|
120
|
+
explain: reason,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function buildExplain(task, seeds, selection, files, budget, fileCount) {
|
|
124
|
+
const lines = [];
|
|
125
|
+
lines.push(`task: "${task}"`);
|
|
126
|
+
lines.push(`indexed ${fileCount} source files`);
|
|
127
|
+
lines.push(`seeded ${seeds.size} symbol${seeds.size === 1 ? '' : 's'}:`);
|
|
128
|
+
for (const [id, score] of [...seeds].slice(0, 5)) {
|
|
129
|
+
lines.push(` · ${id} (seed-score ${score.toFixed(3)})`);
|
|
130
|
+
}
|
|
131
|
+
lines.push(`selected ${selection.selected.size} symbols across ${files.length} files` +
|
|
132
|
+
` (${selection.tokens} / ${budget} tokens, cut cost ${selection.cutCost.toFixed(1)})`);
|
|
133
|
+
return lines.join('\n');
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mincut-context",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Token-minimal context selection for AI coding agents. Builds a symbol graph of your repo and uses personalized PageRank + budget-constrained min-cut to pick the smallest provably-relevant context for any task.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/adapters/lib/index.js",
|
|
7
|
+
"types": "./dist/adapters/lib/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/adapters/lib/index.d.ts",
|
|
11
|
+
"import": "./dist/adapters/lib/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./core": {
|
|
14
|
+
"types": "./dist/core/index.d.ts",
|
|
15
|
+
"import": "./dist/core/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./mcp": {
|
|
18
|
+
"types": "./dist/adapters/mcp/index.d.ts",
|
|
19
|
+
"import": "./dist/adapters/mcp/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"bin": {
|
|
23
|
+
"mcx": "./dist/adapters/cli/bin.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.build.json",
|
|
32
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:coverage": "vitest run --coverage",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"lint": "eslint src tests --max-warnings 0",
|
|
38
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
39
|
+
"prepublishOnly": "npm run typecheck && npm run test && npm run build"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"ai",
|
|
43
|
+
"agent",
|
|
44
|
+
"context",
|
|
45
|
+
"llm",
|
|
46
|
+
"claude",
|
|
47
|
+
"codex",
|
|
48
|
+
"mcp",
|
|
49
|
+
"tree-sitter",
|
|
50
|
+
"pagerank",
|
|
51
|
+
"graph",
|
|
52
|
+
"code-review",
|
|
53
|
+
"rag"
|
|
54
|
+
],
|
|
55
|
+
"author": "Dhrupo Nil",
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "https://github.com/dhrupo/mincut-context.git"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18.17"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
66
|
+
"@xenova/transformers": "^2.17.2",
|
|
67
|
+
"commander": "^12.1.0",
|
|
68
|
+
"graphology": "^0.25.4",
|
|
69
|
+
"graphology-communities-louvain": "^2.0.1",
|
|
70
|
+
"graphology-pagerank": "^1.1.0",
|
|
71
|
+
"ignore": "^6.0.2",
|
|
72
|
+
"ink": "^5.0.1",
|
|
73
|
+
"ink-spinner": "^5.0.0",
|
|
74
|
+
"ink-text-input": "^6.0.0",
|
|
75
|
+
"js-tiktoken": "^1.0.15",
|
|
76
|
+
"react": "^18.3.1",
|
|
77
|
+
"tree-sitter": "^0.21.1",
|
|
78
|
+
"tree-sitter-python": "^0.23.6",
|
|
79
|
+
"tree-sitter-typescript": "^0.23.2",
|
|
80
|
+
"zod": "^3.23.8"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@types/node": "^22.9.0",
|
|
84
|
+
"@types/react": "^18.3.12",
|
|
85
|
+
"@typescript-eslint/eslint-plugin": "^8.15.0",
|
|
86
|
+
"@typescript-eslint/parser": "^8.15.0",
|
|
87
|
+
"@vitest/coverage-v8": "^2.1.5",
|
|
88
|
+
"eslint": "^9.15.0",
|
|
89
|
+
"ink-testing-library": "^4.0.0",
|
|
90
|
+
"prettier": "^3.3.3",
|
|
91
|
+
"typescript": "^5.6.3",
|
|
92
|
+
"vitest": "^2.1.5"
|
|
93
|
+
}
|
|
94
|
+
}
|