edhindex 1.0.0 → 1.0.2

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 (199) hide show
  1. package/README.md +228 -0
  2. package/dist/cli/commands/config_cmd.d.ts +2 -0
  3. package/dist/cli/commands/config_cmd.d.ts.map +1 -0
  4. package/dist/cli/commands/config_cmd.js +53 -0
  5. package/dist/cli/commands/config_cmd.js.map +1 -0
  6. package/dist/cli/commands/doctor_cmd.d.ts +2 -0
  7. package/dist/cli/commands/doctor_cmd.d.ts.map +1 -0
  8. package/dist/cli/commands/doctor_cmd.js +32 -0
  9. package/dist/cli/commands/doctor_cmd.js.map +1 -0
  10. package/dist/cli/commands/graph.d.ts +2 -0
  11. package/dist/cli/commands/graph.d.ts.map +1 -0
  12. package/dist/cli/commands/graph.js +26 -0
  13. package/dist/cli/commands/graph.js.map +1 -0
  14. package/dist/cli/commands/index_cmd.d.ts +2 -0
  15. package/dist/cli/commands/index_cmd.d.ts.map +1 -0
  16. package/dist/cli/commands/index_cmd.js +110 -0
  17. package/dist/cli/commands/index_cmd.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +2 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +53 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/knowledge-graph.d.ts +8 -0
  23. package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
  24. package/dist/cli/commands/knowledge-graph.js +76 -0
  25. package/dist/cli/commands/knowledge-graph.js.map +1 -0
  26. package/dist/cli/commands/models.d.ts +2 -0
  27. package/dist/cli/commands/models.d.ts.map +1 -0
  28. package/dist/cli/commands/models.js +17 -0
  29. package/dist/cli/commands/models.js.map +1 -0
  30. package/dist/cli/commands/reset.d.ts +2 -0
  31. package/dist/cli/commands/reset.d.ts.map +1 -0
  32. package/dist/cli/commands/reset.js +35 -0
  33. package/dist/cli/commands/reset.js.map +1 -0
  34. package/dist/cli/commands/search.d.ts +2 -0
  35. package/dist/cli/commands/search.d.ts.map +1 -0
  36. package/dist/cli/commands/search.js +40 -0
  37. package/dist/cli/commands/search.js.map +1 -0
  38. package/dist/cli/commands/start.d.ts +2 -0
  39. package/dist/cli/commands/start.d.ts.map +1 -0
  40. package/dist/cli/commands/start.js +265 -0
  41. package/dist/cli/commands/start.js.map +1 -0
  42. package/dist/cli/commands/status.d.ts +2 -0
  43. package/dist/cli/commands/status.d.ts.map +1 -0
  44. package/dist/cli/commands/status.js +47 -0
  45. package/dist/cli/commands/status.js.map +1 -0
  46. package/dist/cli/index.d.ts +3 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +121 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/config/index.d.ts +28 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +65 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/doctor/index.d.ts +8 -0
  55. package/dist/doctor/index.d.ts.map +1 -0
  56. package/dist/doctor/index.js +117 -0
  57. package/dist/doctor/index.js.map +1 -0
  58. package/dist/embeddings/provider.d.ts +9 -0
  59. package/dist/embeddings/provider.d.ts.map +1 -0
  60. package/dist/embeddings/provider.js +2 -0
  61. package/dist/embeddings/provider.js.map +1 -0
  62. package/dist/embeddings/transformers.d.ts +26 -0
  63. package/dist/embeddings/transformers.d.ts.map +1 -0
  64. package/dist/embeddings/transformers.js +120 -0
  65. package/dist/embeddings/transformers.js.map +1 -0
  66. package/dist/graph/build.d.ts +13 -0
  67. package/dist/graph/build.d.ts.map +1 -0
  68. package/dist/graph/build.js +33 -0
  69. package/dist/graph/build.js.map +1 -0
  70. package/dist/graph/builder.d.ts +24 -0
  71. package/dist/graph/builder.d.ts.map +1 -0
  72. package/dist/graph/builder.js +231 -0
  73. package/dist/graph/builder.js.map +1 -0
  74. package/dist/graph/render.d.ts +3 -0
  75. package/dist/graph/render.d.ts.map +1 -0
  76. package/dist/graph/render.js +60 -0
  77. package/dist/graph/render.js.map +1 -0
  78. package/dist/graph/serve.d.ts +6 -0
  79. package/dist/graph/serve.d.ts.map +1 -0
  80. package/dist/graph/serve.js +389 -0
  81. package/dist/graph/serve.js.map +1 -0
  82. package/dist/graph/service.d.ts +29 -0
  83. package/dist/graph/service.d.ts.map +1 -0
  84. package/dist/graph/service.js +73 -0
  85. package/dist/graph/service.js.map +1 -0
  86. package/dist/graph/storage.d.ts +33 -0
  87. package/dist/graph/storage.d.ts.map +1 -0
  88. package/dist/graph/storage.js +164 -0
  89. package/dist/graph/storage.js.map +1 -0
  90. package/dist/graph/svg.d.ts +27 -0
  91. package/dist/graph/svg.d.ts.map +1 -0
  92. package/dist/graph/svg.js +212 -0
  93. package/dist/graph/svg.js.map +1 -0
  94. package/dist/graph/types.d.ts +34 -0
  95. package/dist/graph/types.d.ts.map +1 -0
  96. package/dist/graph/types.js +9 -0
  97. package/dist/graph/types.js.map +1 -0
  98. package/dist/indexer/chunker.d.ts +18 -0
  99. package/dist/indexer/chunker.d.ts.map +1 -0
  100. package/dist/indexer/chunker.js +139 -0
  101. package/dist/indexer/chunker.js.map +1 -0
  102. package/dist/indexer/file-utils.d.ts +17 -0
  103. package/dist/indexer/file-utils.d.ts.map +1 -0
  104. package/dist/indexer/file-utils.js +123 -0
  105. package/dist/indexer/file-utils.js.map +1 -0
  106. package/dist/indexer/ignore.d.ts +5 -0
  107. package/dist/indexer/ignore.d.ts.map +1 -0
  108. package/dist/indexer/ignore.js +96 -0
  109. package/dist/indexer/ignore.js.map +1 -0
  110. package/dist/indexer/incremental.d.ts +16 -0
  111. package/dist/indexer/incremental.d.ts.map +1 -0
  112. package/dist/indexer/incremental.js +55 -0
  113. package/dist/indexer/incremental.js.map +1 -0
  114. package/dist/indexer/indexer.d.ts +36 -0
  115. package/dist/indexer/indexer.d.ts.map +1 -0
  116. package/dist/indexer/indexer.js +121 -0
  117. package/dist/indexer/indexer.js.map +1 -0
  118. package/dist/indexer/parser.d.ts +30 -0
  119. package/dist/indexer/parser.d.ts.map +1 -0
  120. package/dist/indexer/parser.js +225 -0
  121. package/dist/indexer/parser.js.map +1 -0
  122. package/dist/logging.d.ts +15 -0
  123. package/dist/logging.d.ts.map +1 -0
  124. package/dist/logging.js +42 -0
  125. package/dist/logging.js.map +1 -0
  126. package/dist/mcp/server.d.ts +4 -0
  127. package/dist/mcp/server.d.ts.map +1 -0
  128. package/dist/mcp/server.js +226 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/dist/mcp-config.d.ts +4 -0
  131. package/dist/mcp-config.d.ts.map +1 -0
  132. package/dist/mcp-config.js +175 -0
  133. package/dist/mcp-config.js.map +1 -0
  134. package/dist/progress.d.ts +12 -0
  135. package/dist/progress.d.ts.map +1 -0
  136. package/dist/progress.js +16 -0
  137. package/dist/progress.js.map +1 -0
  138. package/dist/retrieval/bm25.d.ts +6 -0
  139. package/dist/retrieval/bm25.d.ts.map +1 -0
  140. package/dist/retrieval/bm25.js +20 -0
  141. package/dist/retrieval/bm25.js.map +1 -0
  142. package/dist/retrieval/reranker.d.ts +11 -0
  143. package/dist/retrieval/reranker.d.ts.map +1 -0
  144. package/dist/retrieval/reranker.js +46 -0
  145. package/dist/retrieval/reranker.js.map +1 -0
  146. package/dist/retrieval/search.d.ts +35 -0
  147. package/dist/retrieval/search.d.ts.map +1 -0
  148. package/dist/retrieval/search.js +95 -0
  149. package/dist/retrieval/search.js.map +1 -0
  150. package/dist/security.d.ts +5 -0
  151. package/dist/security.d.ts.map +1 -0
  152. package/dist/security.js +42 -0
  153. package/dist/security.js.map +1 -0
  154. package/dist/storage/fts.d.ts +30 -0
  155. package/dist/storage/fts.d.ts.map +1 -0
  156. package/dist/storage/fts.js +107 -0
  157. package/dist/storage/fts.js.map +1 -0
  158. package/dist/storage/metadata.d.ts +46 -0
  159. package/dist/storage/metadata.d.ts.map +1 -0
  160. package/dist/storage/metadata.js +133 -0
  161. package/dist/storage/metadata.js.map +1 -0
  162. package/dist/vector/lancedb.d.ts +25 -0
  163. package/dist/vector/lancedb.d.ts.map +1 -0
  164. package/dist/vector/lancedb.js +93 -0
  165. package/dist/vector/lancedb.js.map +1 -0
  166. package/dist/vector/store.d.ts +16 -0
  167. package/dist/vector/store.d.ts.map +1 -0
  168. package/dist/vector/store.js +2 -0
  169. package/dist/vector/store.js.map +1 -0
  170. package/dist/version.d.ts +12 -0
  171. package/dist/version.d.ts.map +1 -0
  172. package/dist/version.js +46 -0
  173. package/dist/version.js.map +1 -0
  174. package/dist/watcher/index.d.ts +15 -0
  175. package/dist/watcher/index.d.ts.map +1 -0
  176. package/dist/watcher/index.js +65 -0
  177. package/dist/watcher/index.js.map +1 -0
  178. package/package.json +35 -4
  179. package/src/cli/commands/graph.ts +30 -0
  180. package/src/cli/commands/init.ts +41 -3
  181. package/src/cli/commands/knowledge-graph.ts +85 -0
  182. package/src/cli/commands/reset.ts +40 -0
  183. package/src/cli/commands/start.ts +54 -21
  184. package/src/cli/index.ts +33 -0
  185. package/src/config/index.ts +13 -0
  186. package/src/graph/build.ts +45 -0
  187. package/src/graph/builder.ts +243 -0
  188. package/src/graph/render.ts +67 -0
  189. package/src/graph/serve.ts +399 -0
  190. package/src/graph/service.ts +84 -0
  191. package/src/graph/storage.ts +181 -0
  192. package/src/graph/svg.ts +241 -0
  193. package/src/graph/types.ts +68 -0
  194. package/src/mcp/server.ts +212 -85
  195. package/src/mcp-config.ts +185 -0
  196. package/src/storage/metadata.ts +9 -1
  197. package/.edhindexignore +0 -66
  198. package/BUILD_BRIEF.md +0 -228
  199. package/tsconfig.json +0 -21
@@ -0,0 +1,231 @@
1
+ import { readdirSync, statSync } from 'node:fs';
2
+ import { join, relative, sep } from 'node:path';
3
+ import { logger } from '../logging.js';
4
+ export class GraphBuilder {
5
+ rootPath;
6
+ meta;
7
+ graph;
8
+ nodeIds = new Set();
9
+ edgeIds = new Set();
10
+ constructor(rootPath, meta, graph) {
11
+ this.rootPath = rootPath;
12
+ this.meta = meta;
13
+ this.graph = graph;
14
+ }
15
+ buildFull() {
16
+ logger.info('Building knowledge graph...');
17
+ this.graph.clear();
18
+ this.nodeIds.clear();
19
+ this.edgeIds.clear();
20
+ this.addWorkspaceNode();
21
+ this.addFolderNodes();
22
+ this.addFileAndSymbolNodes();
23
+ this.addImportExportEdges();
24
+ logger.info(`Graph built: ${this.graph.getNodeCount()} nodes, ${this.graph.getEdgeCount()} edges`);
25
+ }
26
+ updateFile(filePath) {
27
+ const relPath = relative(this.rootPath, filePath);
28
+ // Remove existing nodes/edges for this file
29
+ this.graph.deleteEdgesForFile(relPath);
30
+ this.graph.deleteNodesForFile(relPath);
31
+ // Re-add nodes for this file
32
+ const chunks = this.meta.getChunksForFile(relPath);
33
+ if (chunks.length === 0)
34
+ return;
35
+ const symbolsInFile = new Set(chunks.filter(c => c.symbol).map(c => c.symbol));
36
+ const fileNode = this.makeNode(`file:${relPath}`, relPath, 'file', chunks[0].language, relPath, 0, 0);
37
+ this.addEdge(`contains:file:${relPath}`, `workspace:${this.nodeId('workspace')}`, fileNode.id, 'contains');
38
+ this.graph.upsertNode(fileNode);
39
+ for (const chunk of chunks) {
40
+ if (!chunk.symbol)
41
+ continue;
42
+ const nodeType = this.mapKind(chunk.kind);
43
+ const nid = `sym:${chunk.file}:${chunk.symbol}`;
44
+ const node = this.makeNode(nid, chunk.symbol, nodeType, chunk.language, chunk.file, chunk.start_line, chunk.end_line, { parent: chunk.parent || undefined });
45
+ this.graph.upsertNode(node);
46
+ this.addEdge(`defines:${relPath}:${chunk.symbol}`, fileNode.id, nid, 'defines');
47
+ if (chunk.parent && symbolsInFile.has(chunk.parent)) {
48
+ const parentId = `sym:${chunk.file}:${chunk.parent}`;
49
+ this.addEdge(`contains:sym:${chunk.file}:${chunk.parent}:${chunk.symbol}`, parentId, nid, 'contains');
50
+ }
51
+ }
52
+ this.addImportExportEdgesForFile(relPath, chunks);
53
+ }
54
+ addWorkspaceNode() {
55
+ const wid = this.nodeId('workspace');
56
+ const node = this.makeNode(wid, this.rootPath.split(sep).pop() || 'workspace', 'workspace', '', '', 0, 0);
57
+ this.graph.upsertNode(node);
58
+ }
59
+ addFolderNodes() {
60
+ const walk = (dir) => {
61
+ try {
62
+ const entries = readdirSync(dir);
63
+ for (const entry of entries) {
64
+ if (entry.startsWith('.') || entry === 'node_modules')
65
+ continue;
66
+ const full = join(dir, entry);
67
+ const stat = statSync(full);
68
+ if (stat.isDirectory()) {
69
+ const relPath = relative(this.rootPath, full);
70
+ const fid = this.nodeId(`folder:${relPath}`);
71
+ const node = this.makeNode(fid, entry, 'folder', '', relPath, 0, 0);
72
+ this.graph.upsertNode(node);
73
+ const parentRel = relative(this.rootPath, join(full, '..'));
74
+ const parentId = parentRel === '' ? this.nodeId('workspace') : this.nodeId(`folder:${parentRel}`);
75
+ this.addEdge(`contains:folder:${relPath}`, parentId, fid, 'contains');
76
+ walk(full);
77
+ }
78
+ }
79
+ }
80
+ catch { /* skip unreadable dirs */ }
81
+ };
82
+ walk(this.rootPath);
83
+ }
84
+ addFileAndSymbolNodes() {
85
+ const files = this.meta.getAllFilesWithImports();
86
+ for (const f of files) {
87
+ const fid = this.nodeId(`file:${f.file}`);
88
+ const fileNode = this.makeNode(fid, f.file.split('/').pop() || f.file, 'file', f.language, f.file, 0, 0);
89
+ this.graph.upsertNode(fileNode);
90
+ const parentRel = f.file.includes('/') ? f.file.slice(0, f.file.lastIndexOf('/')) : '';
91
+ const parentId = parentRel ? this.nodeId(`folder:${parentRel}`) : this.nodeId('workspace');
92
+ this.addEdge(`contains:file:${f.file}`, parentId, fid, 'contains');
93
+ const chunks = this.meta.getChunksForFile(f.file);
94
+ const symbolsInFile = new Set();
95
+ for (const chunk of chunks) {
96
+ if (chunk.symbol)
97
+ symbolsInFile.add(chunk.symbol);
98
+ }
99
+ for (const chunk of chunks) {
100
+ if (!chunk.symbol)
101
+ continue;
102
+ const nodeType = this.mapKind(chunk.kind);
103
+ const nid = this.nodeId(`sym:${chunk.file}:${chunk.symbol}`);
104
+ const node = this.makeNode(nid, chunk.symbol, nodeType, chunk.language, chunk.file, chunk.start_line, chunk.end_line, {
105
+ parent: symbolsInFile.has(chunk.parent || '') ? chunk.parent : undefined,
106
+ hash: chunk.hash,
107
+ });
108
+ this.graph.upsertNode(node);
109
+ this.addEdge(`defines:${f.file}:${chunk.symbol}`, fid, nid, 'defines');
110
+ if (chunk.parent && symbolsInFile.has(chunk.parent)) {
111
+ const parentId = this.nodeId(`sym:${chunk.file}:${chunk.parent}`);
112
+ this.addEdge(`contains:${chunk.file}:${chunk.parent}:${chunk.symbol}`, parentId, nid, 'contains');
113
+ }
114
+ }
115
+ }
116
+ }
117
+ addImportExportEdges() {
118
+ const files = this.meta.getAllFilesWithImports();
119
+ const indexedFiles = new Set(files.map(f => f.file));
120
+ for (const f of files) {
121
+ const chunks = this.meta.getChunksForFile(f.file);
122
+ this.addImportExportEdgesForFile(f.file, chunks, indexedFiles);
123
+ }
124
+ }
125
+ addImportExportEdgesForFile(file, chunks, indexedFiles) {
126
+ if (!indexedFiles) {
127
+ indexedFiles = new Set(this.meta.getAllFilesWithImports().map(f => f.file));
128
+ }
129
+ const fid = this.nodeId(`file:${file}`);
130
+ for (const chunk of chunks) {
131
+ // Import edges
132
+ const importModules = this.parseImportPaths(chunk.imports);
133
+ for (const imp of importModules) {
134
+ const resolved = this.resolveImport(file, imp, indexedFiles);
135
+ if (resolved) {
136
+ const tid = this.nodeId(`file:${resolved}`);
137
+ this.addEdge(`imports:${file}:${resolved}`, fid, tid, 'imports');
138
+ }
139
+ }
140
+ // Export edges
141
+ const exportModules = this.parseImportPaths(chunk.exports);
142
+ for (const exp of exportModules) {
143
+ const resolved = this.resolveImport(file, exp, indexedFiles);
144
+ if (resolved) {
145
+ const tid = this.nodeId(`file:${resolved}`);
146
+ this.addEdge(`exports:${file}:${resolved}`, fid, tid, 'exports');
147
+ }
148
+ }
149
+ }
150
+ }
151
+ parseImportPaths(raw) {
152
+ if (!raw)
153
+ return [];
154
+ const results = [];
155
+ for (const line of raw.split('\n')) {
156
+ const t = line.trim();
157
+ let m = t.match(/from\s+['"](\..*?)['"]/);
158
+ if (!m)
159
+ m = t.match(/require\s*\(\s*['"](\..*?)['"]\s*\)/);
160
+ if (!m)
161
+ m = t.match(/import\s+['"](\..*?)['"]/);
162
+ if (m)
163
+ results.push(m[1]);
164
+ }
165
+ return results;
166
+ }
167
+ resolveImport(sourceFile, importPath, indexedFiles) {
168
+ const raw = importPath.replace(/^['"]|['"]$/g, '');
169
+ const dir = sourceFile.includes('/') ? sourceFile.slice(0, sourceFile.lastIndexOf('/')) : '';
170
+ const normalize = (base, rel) => {
171
+ const parts = (base ? base.split('/') : []).concat(rel.split('/'));
172
+ const out = [];
173
+ for (const p of parts) {
174
+ if (p === '.' || p === '')
175
+ continue;
176
+ if (p === '..') {
177
+ out.pop();
178
+ continue;
179
+ }
180
+ out.push(p);
181
+ }
182
+ return out.join('/');
183
+ };
184
+ const full = normalize(dir, raw);
185
+ const candidates = [full];
186
+ for (const jsExt of ['.js', '.jsx']) {
187
+ if (full.endsWith(jsExt))
188
+ candidates.push(full.replace(jsExt, ''), full.replace(jsExt, '.ts'), full.replace(jsExt, '.tsx'));
189
+ }
190
+ for (const c of candidates) {
191
+ if (indexedFiles.has(c))
192
+ return c;
193
+ }
194
+ for (const ext of ['.ts', '.tsx', '.js', '.jsx', '.py', '.go']) {
195
+ if (indexedFiles.has(full + ext))
196
+ return full + ext;
197
+ }
198
+ for (const idx of ['index.ts', 'index.tsx', 'index.js', 'index.jsx', '__init__.py']) {
199
+ if (indexedFiles.has(full + '/' + idx))
200
+ return full + '/' + idx;
201
+ }
202
+ return null;
203
+ }
204
+ mapKind(kind) {
205
+ switch (kind) {
206
+ case 'class': return 'class';
207
+ case 'interface': return 'interface';
208
+ case 'enum': return 'enum';
209
+ case 'function': return 'function';
210
+ case 'method': return 'method';
211
+ case 'variable': return 'variable';
212
+ case 'module': return 'module';
213
+ default: return 'module';
214
+ }
215
+ }
216
+ makeNode(id, label, type, language, file, startLine, endLine, extra) {
217
+ return { id, label, type, language, file, startLine, endLine, metadata: extra || {} };
218
+ }
219
+ addEdge(id, source, target, type) {
220
+ if (this.edgeIds.has(id))
221
+ return;
222
+ this.edgeIds.add(id);
223
+ this.graph.upsertEdge({ id, source, target, type, metadata: {} });
224
+ }
225
+ nodeId(key) {
226
+ const id = `kg:${key}`;
227
+ this.nodeIds.add(id);
228
+ return id;
229
+ }
230
+ }
231
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/graph/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { GraphNode, GraphEdge } from './types.js';
2
+ export declare function renderGraphSVG(nodes: GraphNode[], edges: GraphEdge[], width?: number, height?: number): string;
3
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/graph/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAM,EAAE,MAAM,SAAM,GAAG,MAAM,CAqDxG"}
@@ -0,0 +1,60 @@
1
+ const NODE_COLORS = {
2
+ workspace: '#ffd700', folder: '#8bc34a', file: '#64b5f6',
3
+ module: '#ce93d8', class: '#ff7043', interface: '#4dd0e1',
4
+ enum: '#ffb74d', function: '#81c784', method: '#aed581',
5
+ variable: '#e0e0e0',
6
+ };
7
+ export function renderGraphSVG(nodes, edges, width = 800, height = 600) {
8
+ const maxNodes = 200;
9
+ const visNodes = nodes.slice(0, maxNodes);
10
+ const nodeIds = new Set(visNodes.map(n => n.id));
11
+ const visEdges = edges.filter(e => nodeIds.has(e.source) && nodeIds.has(e.target));
12
+ // Simple circular layout
13
+ const cx = width / 2, cy = height / 2;
14
+ const radius = Math.min(cx, cy) - 60;
15
+ const positioned = visNodes.map((n, i) => {
16
+ const angle = (i / visNodes.length) * Math.PI * 2 - Math.PI / 2;
17
+ return {
18
+ ...n,
19
+ x: cx + radius * Math.cos(angle),
20
+ y: cy + radius * Math.sin(angle),
21
+ r: 4,
22
+ color: NODE_COLORS[n.type] || '#888',
23
+ };
24
+ });
25
+ const nodeMap = new Map(positioned.map(n => [n.id, n]));
26
+ let svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" style="background:#0d1117">
27
+ <defs>
28
+ <filter id="glow"><feGaussianBlur stdDeviation="2" result="blur"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
29
+ </defs>
30
+ <rect width="${width}" height="${height}" fill="#0d1117"/>
31
+ <text x="20" y="28" fill="#8b949e" font-size="13" font-family="sans-serif">EDHIndex Knowledge Graph — ${nodes.length} nodes, ${edges.length} edges</text>`;
32
+ for (const e of visEdges) {
33
+ const s = nodeMap.get(e.source);
34
+ const t = nodeMap.get(e.target);
35
+ if (!s || !t)
36
+ continue;
37
+ const opacity = e.type === 'imports' ? 0.6 : e.type === 'contains' ? 0.2 : 0.35;
38
+ const color = e.type === 'imports' ? '#4dd0e1' : e.type === 'exports' ? '#ffb74d' : '#555';
39
+ svg += `<line x1="${s.x}" y1="${s.y}" x2="${t.x}" y2="${t.y}" stroke="${color}" stroke-width="1" stroke-opacity="${opacity}"/>`;
40
+ }
41
+ for (const n of positioned) {
42
+ svg += `<circle cx="${n.x}" cy="${n.y}" r="${n.r}" fill="${n.color}" opacity="0.9" filter="url(#glow)"><title>${escapeXml(n.label)} (${n.type})\n${n.file}</title></circle>`;
43
+ }
44
+ // Legend
45
+ const types = ['workspace', 'folder', 'file', 'module', 'class', 'interface', 'enum', 'function', 'method'];
46
+ let ly = height - 30 * types.length - 10;
47
+ for (const t of types) {
48
+ const c = NODE_COLORS[t];
49
+ if (!c)
50
+ continue;
51
+ svg += `<circle cx="18" cy="${ly}" r="4" fill="${c}"/><text x="28" y="${ly + 4}" fill="#8b949e" font-size="10" font-family="sans-serif">${t.charAt(0).toUpperCase() + t.slice(1)}</text>`;
52
+ ly += 18;
53
+ }
54
+ svg += '</svg>';
55
+ return svg;
56
+ }
57
+ function escapeXml(s) {
58
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
59
+ }
60
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/graph/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function writeViewerFile(rootPath: string, outputPath: string): string;
2
+ export declare function startGraphServer(rootPath: string, port?: number): Promise<{
3
+ port: number;
4
+ close: () => void;
5
+ }>;
6
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/graph/serve.ts"],"names":[],"mappings":"AAuCA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAKnE;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAmEvH"}