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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -0
  3. package/dist/adapters/cli/bin.d.ts +3 -0
  4. package/dist/adapters/cli/bin.d.ts.map +1 -0
  5. package/dist/adapters/cli/bin.js +119 -0
  6. package/dist/adapters/cli/bin.js.map +1 -0
  7. package/dist/adapters/cli/render.d.ts +10 -0
  8. package/dist/adapters/cli/render.d.ts.map +1 -0
  9. package/dist/adapters/cli/render.js +65 -0
  10. package/dist/adapters/cli/render.js.map +1 -0
  11. package/dist/adapters/cli/tui.d.ts +9 -0
  12. package/dist/adapters/cli/tui.d.ts.map +1 -0
  13. package/dist/adapters/cli/tui.js +57 -0
  14. package/dist/adapters/cli/tui.js.map +1 -0
  15. package/dist/adapters/lib/index.d.ts +6 -0
  16. package/dist/adapters/lib/index.d.ts.map +1 -0
  17. package/dist/adapters/lib/index.js +4 -0
  18. package/dist/adapters/lib/index.js.map +1 -0
  19. package/dist/adapters/mcp/handler.d.ts +112 -0
  20. package/dist/adapters/mcp/handler.d.ts.map +1 -0
  21. package/dist/adapters/mcp/handler.js +128 -0
  22. package/dist/adapters/mcp/handler.js.map +1 -0
  23. package/dist/adapters/mcp/index.d.ts +6 -0
  24. package/dist/adapters/mcp/index.d.ts.map +1 -0
  25. package/dist/adapters/mcp/index.js +32 -0
  26. package/dist/adapters/mcp/index.js.map +1 -0
  27. package/dist/core/graph.d.ts +50 -0
  28. package/dist/core/graph.d.ts.map +1 -0
  29. package/dist/core/graph.js +110 -0
  30. package/dist/core/graph.js.map +1 -0
  31. package/dist/core/index.d.ts +7 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +4 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/pagerank.d.ts +30 -0
  36. package/dist/core/pagerank.d.ts.map +1 -0
  37. package/dist/core/pagerank.js +88 -0
  38. package/dist/core/pagerank.js.map +1 -0
  39. package/dist/core/select.d.ts +60 -0
  40. package/dist/core/select.d.ts.map +1 -0
  41. package/dist/core/select.js +121 -0
  42. package/dist/core/select.js.map +1 -0
  43. package/dist/index/builder.d.ts +13 -0
  44. package/dist/index/builder.d.ts.map +1 -0
  45. package/dist/index/builder.js +186 -0
  46. package/dist/index/builder.js.map +1 -0
  47. package/dist/index/walker.d.ts +15 -0
  48. package/dist/index/walker.d.ts.map +1 -0
  49. package/dist/index/walker.js +103 -0
  50. package/dist/index/walker.js.map +1 -0
  51. package/dist/parsers/parser.d.ts +35 -0
  52. package/dist/parsers/parser.d.ts.map +1 -0
  53. package/dist/parsers/parser.js +8 -0
  54. package/dist/parsers/parser.js.map +1 -0
  55. package/dist/parsers/py.d.ts +3 -0
  56. package/dist/parsers/py.d.ts.map +1 -0
  57. package/dist/parsers/py.js +169 -0
  58. package/dist/parsers/py.js.map +1 -0
  59. package/dist/parsers/ts.d.ts +3 -0
  60. package/dist/parsers/ts.d.ts.map +1 -0
  61. package/dist/parsers/ts.js +240 -0
  62. package/dist/parsers/ts.js.map +1 -0
  63. package/dist/seeds/embedding.d.ts +27 -0
  64. package/dist/seeds/embedding.d.ts.map +1 -0
  65. package/dist/seeds/embedding.js +90 -0
  66. package/dist/seeds/embedding.js.map +1 -0
  67. package/dist/seeds/keyword.d.ts +22 -0
  68. package/dist/seeds/keyword.d.ts.map +1 -0
  69. package/dist/seeds/keyword.js +106 -0
  70. package/dist/seeds/keyword.js.map +1 -0
  71. package/dist/seeds/transformers-embedder.d.ts +21 -0
  72. package/dist/seeds/transformers-embedder.d.ts.map +1 -0
  73. package/dist/seeds/transformers-embedder.js +26 -0
  74. package/dist/seeds/transformers-embedder.js.map +1 -0
  75. package/dist/select/pack.d.ts +48 -0
  76. package/dist/select/pack.d.ts.map +1 -0
  77. package/dist/select/pack.js +135 -0
  78. package/dist/select/pack.js.map +1 -0
  79. package/package.json +94 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * MCP tool handler — pure functions, no JSON-RPC transport.
3
+ * The stdio server in index.ts is a thin wrapper around this.
4
+ *
5
+ * Tools exposed:
6
+ * - pack_context(task, repo, budget?, seeds?, include?, exclude?)
7
+ * → packs minimal context and returns JSON of files/ranges/explain
8
+ * - explain_selection()
9
+ * → returns the rationale for the most recent pack call
10
+ * - expand_node(node, depth?)
11
+ * → returns the graph neighborhood of a symbol id
12
+ * - list_tools() (used in tests / for introspection)
13
+ */
14
+ export interface McpCall {
15
+ name: string;
16
+ arguments: Record<string, unknown>;
17
+ }
18
+ export interface McpResponse {
19
+ content: Array<{
20
+ type: 'text';
21
+ text: string;
22
+ }>;
23
+ isError?: boolean;
24
+ }
25
+ export declare const TOOLS: ({
26
+ name: string;
27
+ description: string;
28
+ inputSchema: {
29
+ type: string;
30
+ properties: {
31
+ task: {
32
+ type: string;
33
+ description: string;
34
+ };
35
+ repo: {
36
+ type: string;
37
+ description: string;
38
+ };
39
+ budget: {
40
+ type: string;
41
+ description: string;
42
+ default: number;
43
+ };
44
+ seeds: {
45
+ type: string;
46
+ description: string;
47
+ default: number;
48
+ };
49
+ include: {
50
+ type: string;
51
+ items: {
52
+ type: string;
53
+ };
54
+ description: string;
55
+ };
56
+ exclude: {
57
+ type: string;
58
+ items: {
59
+ type: string;
60
+ };
61
+ description: string;
62
+ };
63
+ node?: undefined;
64
+ depth?: undefined;
65
+ };
66
+ required: string[];
67
+ };
68
+ } | {
69
+ name: string;
70
+ description: string;
71
+ inputSchema: {
72
+ type: string;
73
+ properties: {
74
+ task?: undefined;
75
+ repo?: undefined;
76
+ budget?: undefined;
77
+ seeds?: undefined;
78
+ include?: undefined;
79
+ exclude?: undefined;
80
+ node?: undefined;
81
+ depth?: undefined;
82
+ };
83
+ required?: undefined;
84
+ };
85
+ } | {
86
+ name: string;
87
+ description: string;
88
+ inputSchema: {
89
+ type: string;
90
+ properties: {
91
+ node: {
92
+ type: string;
93
+ description: string;
94
+ };
95
+ depth: {
96
+ type: string;
97
+ default: number;
98
+ };
99
+ task?: undefined;
100
+ repo?: undefined;
101
+ budget?: undefined;
102
+ seeds?: undefined;
103
+ include?: undefined;
104
+ exclude?: undefined;
105
+ };
106
+ required: string[];
107
+ };
108
+ })[];
109
+ export declare function handleMcpCall(call: McpCall): Promise<McpResponse>;
110
+ /** For tests — clear the session cache between cases. */
111
+ export declare function _resetSession(): void;
112
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/mcp/handler.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAUD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+CjB,CAAC;AAEF,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBvE;AAoDD,yDAAyD;AACzD,wBAAgB,aAAa,IAAI,IAAI,CAIpC"}
@@ -0,0 +1,128 @@
1
+ import { pack } from '../../select/pack.js';
2
+ import { indexRepo } from '../../index/builder.js';
3
+ const session = {};
4
+ export const TOOLS = [
5
+ {
6
+ name: 'pack_context',
7
+ description: 'Pack a token-minimal, structurally-relevant context window for the given coding task. ' +
8
+ 'Builds a symbol graph of the repo, runs personalized PageRank from task-derived seeds, ' +
9
+ 'and selects the minimum-cut subgraph that fits the token budget.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ properties: {
13
+ task: { type: 'string', description: 'Natural-language task description.' },
14
+ repo: { type: 'string', description: 'Absolute path to the repo root.' },
15
+ budget: { type: 'number', description: 'Token budget. Default 4000.', default: 4000 },
16
+ seeds: { type: 'number', description: 'Top-k seed symbols. Default 8.', default: 8 },
17
+ include: {
18
+ type: 'array',
19
+ items: { type: 'string' },
20
+ description: "Glob-prefix includes, e.g. ['src/auth/**'].",
21
+ },
22
+ exclude: {
23
+ type: 'array',
24
+ items: { type: 'string' },
25
+ description: 'Extra ignore patterns appended to .gitignore.',
26
+ },
27
+ },
28
+ required: ['task', 'repo'],
29
+ },
30
+ },
31
+ {
32
+ name: 'explain_selection',
33
+ description: 'Return the rationale string for the most recent pack_context call.',
34
+ inputSchema: { type: 'object', properties: {} },
35
+ },
36
+ {
37
+ name: 'expand_node',
38
+ description: 'Return the graph neighborhood (in+out neighbors) of a symbol id from the most ' +
39
+ 'recent pack_context call. Useful when the agent decides it needs more around a node.',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ node: { type: 'string', description: 'Symbol id, e.g. "src/auth/login.ts:login".' },
44
+ depth: { type: 'number', default: 1 },
45
+ },
46
+ required: ['node'],
47
+ },
48
+ },
49
+ ];
50
+ export async function handleMcpCall(call) {
51
+ try {
52
+ switch (call.name) {
53
+ case 'list_tools':
54
+ return ok({ tools: TOOLS });
55
+ case 'pack_context':
56
+ return await handlePack(call.arguments);
57
+ case 'explain_selection':
58
+ if (!session.lastResult)
59
+ return error('no prior pack_context call in this session');
60
+ return ok({
61
+ explain: session.lastResult.explain,
62
+ files: session.lastResult.files.map((f) => f.path),
63
+ });
64
+ case 'expand_node':
65
+ return handleExpand(call.arguments);
66
+ default:
67
+ return error(`unknown tool: ${call.name}`);
68
+ }
69
+ }
70
+ catch (e) {
71
+ return error(e.message);
72
+ }
73
+ }
74
+ async function handlePack(args) {
75
+ const task = stringArg(args, 'task');
76
+ const repo = stringArg(args, 'repo');
77
+ if (!task || !repo)
78
+ return error('task and repo are required');
79
+ const budget = args.budget ?? 4000;
80
+ const seeds = args.seeds ?? 8;
81
+ const include = args.include;
82
+ const exclude = args.exclude;
83
+ const result = await pack({ task, repo, budget, seeds, include, exclude });
84
+ session.lastResult = result;
85
+ session.lastRepo = repo;
86
+ // Re-index so expand_node can use a fresh graph.
87
+ session.lastGraph = indexRepo(repo, { include, exclude }).graph;
88
+ return ok(result);
89
+ }
90
+ function handleExpand(args) {
91
+ if (!session.lastGraph)
92
+ return error('call pack_context first');
93
+ const node = stringArg(args, 'node');
94
+ if (!node)
95
+ return error('node is required');
96
+ const graph = session.lastGraph;
97
+ if (!graph.hasNode(node))
98
+ return error(`unknown node: ${node}`);
99
+ const data = graph.getNode(node);
100
+ const out = [...graph.outEdges(node)].map((e) => ({
101
+ target: e.target,
102
+ kind: e.data.kind,
103
+ weight: e.data.weight,
104
+ }));
105
+ const incoming = [...graph.inEdges(node)].map((e) => ({
106
+ source: e.target,
107
+ kind: e.data.kind,
108
+ weight: e.data.weight,
109
+ }));
110
+ return ok({ node, data, neighbors: [...out.map((o) => o.target), ...incoming.map((i) => i.source)], out, incoming });
111
+ }
112
+ function stringArg(args, key) {
113
+ const v = args[key];
114
+ return typeof v === 'string' && v.length > 0 ? v : null;
115
+ }
116
+ function ok(payload) {
117
+ return { content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }] };
118
+ }
119
+ function error(msg) {
120
+ return { content: [{ type: 'text', text: `error: ${msg}` }], isError: true };
121
+ }
122
+ /** For tests — clear the session cache between cases. */
123
+ export function _resetSession() {
124
+ session.lastResult = undefined;
125
+ session.lastRepo = undefined;
126
+ session.lastGraph = undefined;
127
+ }
128
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/adapters/mcp/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Thin stdio JSON-RPC wrapper around the pure handler in ./handler.ts.
3
+ * All business logic lives in the handler — this file only does transport.
4
+ */
5
+ export declare function runMcpServer(): Promise<void>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/mcp/index.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BlD"}
@@ -0,0 +1,32 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { handleMcpCall, TOOLS } from './handler.js';
5
+ /**
6
+ * Thin stdio JSON-RPC wrapper around the pure handler in ./handler.ts.
7
+ * All business logic lives in the handler — this file only does transport.
8
+ */
9
+ export async function runMcpServer() {
10
+ const server = new Server({ name: 'mincut-context', version: '1.0.0' }, { capabilities: { tools: {} } });
11
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
12
+ tools: TOOLS.map((t) => ({
13
+ name: t.name,
14
+ description: t.description,
15
+ inputSchema: t.inputSchema,
16
+ })),
17
+ }));
18
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
19
+ const result = await handleMcpCall({
20
+ name: request.params.name,
21
+ arguments: request.params.arguments ?? {},
22
+ });
23
+ // The MCP SDK's request handler return type includes a richer
24
+ // task-tracking shape we don't need here; runtime payload is identical.
25
+ return result;
26
+ });
27
+ const transport = new StdioServerTransport();
28
+ await server.connect(transport);
29
+ // Keep the process alive — the transport handles graceful shutdown on EOF.
30
+ process.stderr.write('mincut-context MCP server running on stdio\n');
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;KACJ,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;YACzB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE;SAC1C,CAAC,CAAC;QACH,8DAA8D;QAC9D,wEAAwE;QACxE,OAAO,MAA0F,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,50 @@
1
+ export type NodeKind = 'function' | 'method' | 'class' | 'interface' | 'type' | 'variable' | 'export' | 'file';
2
+ export type EdgeKind = 'call' | 'import' | 'reference' | 'extends' | 'implements' | 'contains';
3
+ export interface NodeData {
4
+ tokens: number;
5
+ file: string;
6
+ kind: NodeKind;
7
+ name?: string;
8
+ startLine?: number;
9
+ endLine?: number;
10
+ }
11
+ export interface EdgeData {
12
+ weight: number;
13
+ kind: EdgeKind;
14
+ }
15
+ export interface OutEdge {
16
+ target: string;
17
+ data: EdgeData;
18
+ }
19
+ export declare class SymbolGraph {
20
+ private readonly nodeData;
21
+ private readonly outAdj;
22
+ private readonly inAdj;
23
+ private edgeCount;
24
+ addNode(id: string, data: NodeData): void;
25
+ hasNode(id: string): boolean;
26
+ getNode(id: string): NodeData | undefined;
27
+ nodes(): string[];
28
+ order(): number;
29
+ size(): number;
30
+ addEdge(source: string, target: string, data: EdgeData): void;
31
+ hasEdge(source: string, target: string): boolean;
32
+ getEdge(source: string, target: string): EdgeData | undefined;
33
+ outNeighbors(id: string): string[];
34
+ inNeighbors(id: string): string[];
35
+ neighbors(id: string): string[];
36
+ outEdges(id: string): IterableIterator<OutEdge>;
37
+ inEdges(id: string): IterableIterator<OutEdge>;
38
+ /**
39
+ * Boundary cut cost: sum of edge weights crossing T → V\T (directed).
40
+ *
41
+ * This is the objective we minimize in the budget-constrained selection.
42
+ * Lower = the selected region T is more self-contained.
43
+ */
44
+ cutCost(t: ReadonlySet<string>): number;
45
+ /**
46
+ * Sum of token costs over a node set. Used by the budget-constrained selector.
47
+ */
48
+ tokensOf(t: Iterable<string>): number;
49
+ }
50
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/core/graph.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,QAAQ,GACR,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;IAClE,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IASzC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIzC,KAAK,IAAI,MAAM,EAAE;IAIjB,KAAK,IAAI,MAAM;IAIf,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAe7D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI7D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAIlC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAIjC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAM9B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAQ/C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAQ/C;;;;;OAKG;IACH,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM;IAavC;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM;CAOtC"}
@@ -0,0 +1,110 @@
1
+ export class SymbolGraph {
2
+ nodeData = new Map();
3
+ outAdj = new Map();
4
+ inAdj = new Map();
5
+ edgeCount = 0;
6
+ addNode(id, data) {
7
+ if (this.nodeData.has(id)) {
8
+ throw new Error(`duplicate node: ${id}`);
9
+ }
10
+ this.nodeData.set(id, data);
11
+ this.outAdj.set(id, new Map());
12
+ this.inAdj.set(id, new Map());
13
+ }
14
+ hasNode(id) {
15
+ return this.nodeData.has(id);
16
+ }
17
+ getNode(id) {
18
+ return this.nodeData.get(id);
19
+ }
20
+ nodes() {
21
+ return [...this.nodeData.keys()];
22
+ }
23
+ order() {
24
+ return this.nodeData.size;
25
+ }
26
+ size() {
27
+ return this.edgeCount;
28
+ }
29
+ addEdge(source, target, data) {
30
+ if (!this.nodeData.has(source))
31
+ throw new Error(`missing source node: ${source}`);
32
+ if (!this.nodeData.has(target))
33
+ throw new Error(`missing target node: ${target}`);
34
+ const out = this.outAdj.get(source);
35
+ const existing = out.get(target);
36
+ if (existing) {
37
+ existing.weight += data.weight;
38
+ return;
39
+ }
40
+ out.set(target, { ...data });
41
+ this.inAdj.get(target).set(source, out.get(target));
42
+ this.edgeCount += 1;
43
+ }
44
+ hasEdge(source, target) {
45
+ return this.outAdj.get(source)?.has(target) ?? false;
46
+ }
47
+ getEdge(source, target) {
48
+ return this.outAdj.get(source)?.get(target);
49
+ }
50
+ outNeighbors(id) {
51
+ return [...(this.outAdj.get(id)?.keys() ?? [])];
52
+ }
53
+ inNeighbors(id) {
54
+ return [...(this.inAdj.get(id)?.keys() ?? [])];
55
+ }
56
+ neighbors(id) {
57
+ const set = new Set(this.outNeighbors(id));
58
+ for (const n of this.inNeighbors(id))
59
+ set.add(n);
60
+ return [...set];
61
+ }
62
+ *outEdges(id) {
63
+ const adj = this.outAdj.get(id);
64
+ if (!adj)
65
+ return;
66
+ for (const [target, data] of adj) {
67
+ yield { target, data };
68
+ }
69
+ }
70
+ *inEdges(id) {
71
+ const adj = this.inAdj.get(id);
72
+ if (!adj)
73
+ return;
74
+ for (const [source, data] of adj) {
75
+ yield { target: source, data };
76
+ }
77
+ }
78
+ /**
79
+ * Boundary cut cost: sum of edge weights crossing T → V\T (directed).
80
+ *
81
+ * This is the objective we minimize in the budget-constrained selection.
82
+ * Lower = the selected region T is more self-contained.
83
+ */
84
+ cutCost(t) {
85
+ if (t.size === 0 || t.size === this.nodeData.size)
86
+ return 0;
87
+ let cost = 0;
88
+ for (const source of t) {
89
+ const adj = this.outAdj.get(source);
90
+ if (!adj)
91
+ continue;
92
+ for (const [target, data] of adj) {
93
+ if (!t.has(target))
94
+ cost += data.weight;
95
+ }
96
+ }
97
+ return cost;
98
+ }
99
+ /**
100
+ * Sum of token costs over a node set. Used by the budget-constrained selector.
101
+ */
102
+ tokensOf(t) {
103
+ let sum = 0;
104
+ for (const id of t) {
105
+ sum += this.nodeData.get(id)?.tokens ?? 0;
106
+ }
107
+ return sum;
108
+ }
109
+ }
110
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/core/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { SymbolGraph } from './graph.js';
2
+ export type { NodeData, EdgeData, NodeKind, EdgeKind, OutEdge } from './graph.js';
3
+ export { personalizedPageRank } from './pagerank.js';
4
+ export type { PageRankOptions } from './pagerank.js';
5
+ export { greedySelect } from './select.js';
6
+ export type { SelectOptions, SelectionEntry, SelectionResult } from './select.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { SymbolGraph } from './graph.js';
2
+ export { personalizedPageRank } from './pagerank.js';
3
+ export { greedySelect } from './select.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { SymbolGraph } from './graph.js';
2
+ export interface PageRankOptions {
3
+ /**
4
+ * Personalization vector: node id → mass. Values do not need to sum to 1;
5
+ * they will be normalized. Must be non-empty.
6
+ */
7
+ seeds: ReadonlyMap<string, number>;
8
+ /** Damping factor. Standard PageRank uses 0.85. */
9
+ alpha?: number;
10
+ /** Maximum power-iteration steps before forced halt. */
11
+ maxIterations?: number;
12
+ /** L1 convergence threshold across one iteration. */
13
+ tolerance?: number;
14
+ }
15
+ /**
16
+ * Personalized PageRank via power iteration.
17
+ *
18
+ * r ← α · M · r + (1 − α) · p
19
+ *
20
+ * where M is the column-stochastic transition matrix derived from edge weights,
21
+ * p is the personalization vector, and dangling nodes redistribute their mass
22
+ * back through p (so the chain is ergodic and convergence is guaranteed).
23
+ *
24
+ * Why personalized? The restart vector p is concentrated on the task's seed
25
+ * nodes — symbols matched by the user's query — so rank mass pools around the
26
+ * region of the graph that's structurally relevant to the task instead of
27
+ * spreading uniformly. This is what makes the algorithm task-aware.
28
+ */
29
+ export declare function personalizedPageRank(graph: SymbolGraph, options: PageRankOptions): Map<string, number>;
30
+ //# sourceMappingURL=pagerank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagerank.d.ts","sourceRoot":"","sources":["../../src/core/pagerank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,eAAe,GACvB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA4ErB"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Personalized PageRank via power iteration.
3
+ *
4
+ * r ← α · M · r + (1 − α) · p
5
+ *
6
+ * where M is the column-stochastic transition matrix derived from edge weights,
7
+ * p is the personalization vector, and dangling nodes redistribute their mass
8
+ * back through p (so the chain is ergodic and convergence is guaranteed).
9
+ *
10
+ * Why personalized? The restart vector p is concentrated on the task's seed
11
+ * nodes — symbols matched by the user's query — so rank mass pools around the
12
+ * region of the graph that's structurally relevant to the task instead of
13
+ * spreading uniformly. This is what makes the algorithm task-aware.
14
+ */
15
+ export function personalizedPageRank(graph, options) {
16
+ const { seeds, alpha = 0.85, maxIterations = 100, tolerance = 1e-8 } = options;
17
+ if (seeds.size === 0) {
18
+ throw new Error('personalizedPageRank requires at least one seed');
19
+ }
20
+ for (const id of seeds.keys()) {
21
+ if (!graph.hasNode(id)) {
22
+ throw new Error(`seed node not in graph: ${id}`);
23
+ }
24
+ }
25
+ const nodes = graph.nodes();
26
+ const n = nodes.length;
27
+ if (n === 0)
28
+ return new Map();
29
+ // Build normalized personalization vector p.
30
+ let totalSeed = 0;
31
+ for (const w of seeds.values())
32
+ totalSeed += w;
33
+ if (totalSeed <= 0)
34
+ throw new Error('seed weights must sum to a positive number');
35
+ const p = new Map();
36
+ for (const [id, w] of seeds)
37
+ p.set(id, w / totalSeed);
38
+ // Precompute outgoing weight sums per node (for column normalization).
39
+ const outWeight = new Map();
40
+ for (const id of nodes) {
41
+ let sum = 0;
42
+ for (const e of graph.outEdges(id))
43
+ sum += e.data.weight;
44
+ outWeight.set(id, sum);
45
+ }
46
+ // Initialize r ← p extended over all nodes (0 for non-seeds).
47
+ let r = new Map();
48
+ for (const id of nodes)
49
+ r.set(id, p.get(id) ?? 0);
50
+ for (let iter = 0; iter < maxIterations; iter++) {
51
+ const next = new Map();
52
+ // 1. Sum mass coming from dangling nodes (no outgoing edges).
53
+ let danglingMass = 0;
54
+ for (const id of nodes) {
55
+ if ((outWeight.get(id) ?? 0) === 0) {
56
+ danglingMass += r.get(id) ?? 0;
57
+ }
58
+ }
59
+ // 2. Initialize next ← (1 − α) · p plus dangling redistribution through p.
60
+ for (const id of nodes) {
61
+ const personalization = p.get(id) ?? 0;
62
+ next.set(id, (1 - alpha) * personalization + alpha * danglingMass * personalization);
63
+ }
64
+ // 3. Propagate α · M · r across outgoing edges.
65
+ for (const id of nodes) {
66
+ const out = outWeight.get(id) ?? 0;
67
+ if (out === 0)
68
+ continue;
69
+ const ri = r.get(id) ?? 0;
70
+ if (ri === 0)
71
+ continue;
72
+ for (const edge of graph.outEdges(id)) {
73
+ const share = alpha * ri * (edge.data.weight / out);
74
+ next.set(edge.target, (next.get(edge.target) ?? 0) + share);
75
+ }
76
+ }
77
+ // 4. Convergence check (L1 distance).
78
+ let delta = 0;
79
+ for (const id of nodes) {
80
+ delta += Math.abs((next.get(id) ?? 0) - (r.get(id) ?? 0));
81
+ }
82
+ r = next;
83
+ if (delta < tolerance)
84
+ break;
85
+ }
86
+ return r;
87
+ }
88
+ //# sourceMappingURL=pagerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagerank.js","sourceRoot":"","sources":["../../src/core/pagerank.ts"],"names":[],"mappings":"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"}