@nithin554/code-crawler 0.1.54 → 0.1.56

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.
@@ -0,0 +1,612 @@
1
+ import { findEntryPoints, findImplementations, findInjections, findReflections, findRoutes, getCallees, getCallers, getDecorators, getSubgraph, nodeToRef, resolveNode, rowToRef, sqlKinds, edgeLine, } from "./queries.js";
2
+ const UNKNOWN_PREFIX = "__unknown__:";
3
+ function parseProps(raw) {
4
+ if (!raw)
5
+ return {};
6
+ try {
7
+ return JSON.parse(raw);
8
+ }
9
+ catch {
10
+ return {};
11
+ }
12
+ }
13
+ /**
14
+ * Every call the resolver could not bind to a node, with the reason it failed.
15
+ *
16
+ * Unresolved calls are the honest boundary of a static index: they show where
17
+ * analysis stops (dynamic dispatch, untyped receivers, missing dependencies)
18
+ * and they are the highest-signal input for improving the parsers.
19
+ */
20
+ export function findUnresolved(store, opts = {}) {
21
+ const limit = Math.max(1, opts.limit ?? 2000);
22
+ const conditions = [
23
+ "e.kind = 'CALLS'",
24
+ "json_extract(e.properties, '$.resolved') = 0",
25
+ ];
26
+ const params = [];
27
+ if (opts.kind) {
28
+ conditions.push("s.kind = ?");
29
+ params.push(opts.kind);
30
+ }
31
+ if (opts.reason) {
32
+ conditions.push("LOWER(COALESCE(json_extract(e.properties, '$.reason'), '')) LIKE ?");
33
+ params.push(`%${opts.reason.toLowerCase()}%`);
34
+ }
35
+ const where = conditions.join(" AND ");
36
+ const reasonRows = store.raw(`SELECT json_extract(e.properties, '$.reason') AS reason, COUNT(*) AS count
37
+ FROM edges e
38
+ JOIN nodes s ON s.id = e.source
39
+ WHERE ${where}
40
+ GROUP BY reason
41
+ ORDER BY count DESC, reason`, ...params);
42
+ const rows = store.raw(`SELECT s.id, s.qualified_name, s.kind, s.file_path, s.properties,
43
+ e.target AS target_id, e.properties AS edge_props
44
+ FROM edges e
45
+ JOIN nodes s ON s.id = e.source
46
+ WHERE ${where}
47
+ ORDER BY s.qualified_name, json_extract(e.properties, '$.line')
48
+ LIMIT ?`, ...params, limit);
49
+ const byReason = reasonRows.map((r) => ({
50
+ reason: r.reason ?? "unresolved",
51
+ count: r.count,
52
+ }));
53
+ const total = byReason.reduce((sum, r) => sum + r.count, 0);
54
+ return {
55
+ total,
56
+ byReason,
57
+ calls: rows.map((r) => {
58
+ const props = parseProps(r.edge_props);
59
+ const line = typeof props.line === "number" ? props.line : undefined;
60
+ return {
61
+ caller: rowToRef(r),
62
+ targetId: r.target_id,
63
+ targetLabel: r.target_id.startsWith(UNKNOWN_PREFIX)
64
+ ? r.target_id.slice(UNKNOWN_PREFIX.length)
65
+ : r.target_id,
66
+ reason: props.reason ?? "unresolved",
67
+ ...(line !== undefined ? { line } : {}),
68
+ edgeKind: "CALLS",
69
+ };
70
+ }),
71
+ scanTruncated: total > rows.length,
72
+ ...(opts.kind ? { callerKind: opts.kind } : {}),
73
+ ...(opts.reason ? { reasonFilter: opts.reason } : {}),
74
+ };
75
+ }
76
+ /**
77
+ * Unresolved call detail for a single node, used to annotate `get_node`.
78
+ * Returns `undefined` when the node has no unresolved edges in either
79
+ * direction so callers can omit the block entirely.
80
+ */
81
+ export function unresolvedForNode(store, nodeId) {
82
+ const outgoingRows = store.raw(`SELECT s.id, s.qualified_name, s.kind, s.file_path, s.properties,
83
+ e.target AS target_id, e.properties AS edge_props
84
+ FROM edges e
85
+ JOIN nodes s ON s.id = e.source
86
+ WHERE e.kind = 'CALLS'
87
+ AND json_extract(e.properties, '$.resolved') = 0
88
+ AND e.source = ?
89
+ ORDER BY json_extract(e.properties, '$.line')`, nodeId);
90
+ const incomingRows = store.raw(`SELECT s.id, s.qualified_name, s.kind, s.file_path, s.properties, e.properties AS edge_props
91
+ FROM edges e
92
+ JOIN nodes s ON s.id = e.source
93
+ WHERE e.kind = 'CALLS'
94
+ AND json_extract(e.properties, '$.resolved') = 0
95
+ AND e.target = ?
96
+ ORDER BY s.qualified_name`, nodeId);
97
+ if (outgoingRows.length === 0 && incomingRows.length === 0)
98
+ return undefined;
99
+ return {
100
+ outgoing: outgoingRows.map((r) => {
101
+ const props = parseProps(r.edge_props);
102
+ const line = typeof props.line === "number" ? props.line : undefined;
103
+ return {
104
+ caller: rowToRef(r),
105
+ targetId: r.target_id,
106
+ targetLabel: r.target_id.startsWith(UNKNOWN_PREFIX)
107
+ ? r.target_id.slice(UNKNOWN_PREFIX.length)
108
+ : r.target_id,
109
+ reason: props.reason ?? "unresolved",
110
+ ...(line !== undefined ? { line } : {}),
111
+ edgeKind: "CALLS",
112
+ };
113
+ }),
114
+ incoming: incomingRows.map((r) => {
115
+ const line = edgeLine(r.edge_props);
116
+ return { caller: rowToRef(r), ...(line !== undefined ? { line } : {}) };
117
+ }),
118
+ };
119
+ }
120
+ function enclosingTypeId(id) {
121
+ const hash = id.lastIndexOf("#");
122
+ return hash > 0 ? id.slice(0, hash) : undefined;
123
+ }
124
+ function memberName(id) {
125
+ const hash = id.lastIndexOf("#");
126
+ return hash > 0 && hash < id.length - 1 ? id.slice(hash + 1) : undefined;
127
+ }
128
+ /**
129
+ * "What breaks if I change this?" — reverse callers, framework entry points,
130
+ * routes and implementations in a single response.
131
+ *
132
+ * A type aggregates the callers of its contained methods, since call edges bind
133
+ * to methods and a class is usually changed through its members.
134
+ */
135
+ export function impactAnalysis(store, symbol, opts = {}) {
136
+ const node = resolveNode(store, symbol);
137
+ if (!node)
138
+ return null;
139
+ const pageLimit = Math.max(1, opts.limit ?? 200);
140
+ // Calls bind to methods, so analysing a type must also cover its members.
141
+ const targets = [node.id];
142
+ if (node.kind !== "method" && node.kind !== "constructor") {
143
+ const memberRows = store.raw(`SELECT n.id
144
+ FROM edges e JOIN nodes n ON n.id = e.target
145
+ WHERE e.source = ? AND e.kind = 'CONTAINS'
146
+ AND n.kind IN ('method', 'constructor')
147
+ LIMIT 1000`, node.id);
148
+ for (const row of memberRows)
149
+ if (row.id !== node.id)
150
+ targets.push(row.id);
151
+ }
152
+ const merged = new Map();
153
+ for (const target of targets) {
154
+ const reverse = getCallers(store, target, {
155
+ transitive: true,
156
+ maxDepth: opts.maxDepth,
157
+ includeDynamic: opts.includeDynamic ?? true,
158
+ limit: pageLimit,
159
+ });
160
+ for (const c of reverse?.callers ?? []) {
161
+ const existing = merged.get(c.caller.id);
162
+ if (existing && existing.depth <= c.depth)
163
+ continue;
164
+ merged.set(c.caller.id, {
165
+ caller: c.caller,
166
+ depth: c.depth,
167
+ ...(c.callSiteLine !== undefined ? { callSiteLine: c.callSiteLine } : {}),
168
+ edgeKind: c.edgeKind,
169
+ });
170
+ }
171
+ }
172
+ const callers = [...merged.values()]
173
+ .sort((a, b) => a.depth - b.depth || a.caller.id.localeCompare(b.caller.id))
174
+ .slice(0, pageLimit);
175
+ // Implementation overrides: for a type, the subclasses; for a method, the
176
+ // same-named member on every subclass so a signature change is visible.
177
+ const implementations = [];
178
+ const typeId = node.kind === "method" || node.kind === "constructor" ? enclosingTypeId(node.id) : node.id;
179
+ if (typeId) {
180
+ const impls = findImplementations(store, typeId, { maxDepth: opts.maxDepth, limit: 500 });
181
+ const name = memberName(node.id);
182
+ for (const impl of impls?.implementations ?? []) {
183
+ const entry = {
184
+ type: impl.type,
185
+ depth: impl.depth,
186
+ via: impl.via,
187
+ };
188
+ if (name && typeId !== node.id) {
189
+ const override = store.getNode(`${impl.type.id}#${name}`) ??
190
+ store.getNodeByQualifiedName(`${impl.type.qualifiedName}#${name}`);
191
+ if (override)
192
+ entry.method = nodeToRef(override);
193
+ }
194
+ implementations.push(entry);
195
+ }
196
+ }
197
+ // Framework entry points that reach this symbol through the call graph.
198
+ const reachable = new Map();
199
+ for (const c of callers) {
200
+ if (!reachable.has(c.caller.id) || (reachable.get(c.caller.id) ?? 0) > c.depth) {
201
+ reachable.set(c.caller.id, c.depth);
202
+ }
203
+ }
204
+ reachable.set(node.id, 0);
205
+ for (const target of targets)
206
+ reachable.set(target, 0);
207
+ const entryPointRows = findEntryPoints(store, { limit: 10000 });
208
+ const entryPoints = entryPointRows
209
+ .filter((e) => reachable.has(e.symbol.id))
210
+ .map((e) => ({
211
+ symbol: e.symbol,
212
+ entryPointKind: e.entryPointKind,
213
+ ...(e.detail ? { detail: e.detail } : {}),
214
+ viaDepth: reachable.get(e.symbol.id) ?? 0,
215
+ }));
216
+ const targetSet = new Set(targets);
217
+ const routeRows = findRoutes(store, { limit: 10000 });
218
+ const routes = routeRows.filter((r) => targetSet.has(r.target.id) || targetSet.has(r.source.id));
219
+ const files = new Set();
220
+ if (node.filePath)
221
+ files.add(node.filePath);
222
+ for (const c of callers)
223
+ if (c.caller.filePath)
224
+ files.add(c.caller.filePath);
225
+ for (const i of implementations)
226
+ if (i.type.filePath)
227
+ files.add(i.type.filePath);
228
+ const directCallers = callers.filter((c) => c.depth === 1).length;
229
+ const risk = entryPoints.length > 0 ? "high" : directCallers > 0 ? "medium" : "low";
230
+ return {
231
+ symbol: nodeToRef(node),
232
+ summary: {
233
+ totalCallers: callers.length,
234
+ directCallers,
235
+ entryPoints: entryPoints.length,
236
+ routes: routes.length,
237
+ implementations: implementations.length,
238
+ affectedFiles: files.size,
239
+ risk,
240
+ },
241
+ callers,
242
+ entryPoints,
243
+ routes,
244
+ implementations,
245
+ affectedFiles: [...files].sort(),
246
+ };
247
+ }
248
+ /**
249
+ * One-shot digest of a symbol: what it is, what it is annotated with, what it
250
+ * contains, who calls it, what it calls, and how frameworks reach it.
251
+ *
252
+ * Intended to replace a chain of five tool calls with one round trip.
253
+ */
254
+ export function explainSymbol(store, symbol, opts = {}) {
255
+ const node = resolveNode(store, symbol);
256
+ if (!node)
257
+ return null;
258
+ const limit = Math.max(1, opts.limit ?? 50);
259
+ const depth = Math.max(1, opts.maxDepth ?? 1);
260
+ const dynamic = opts.includeDynamic ?? true;
261
+ const decorators = getDecorators(store, node.id, { includeMembers: true });
262
+ const decorated = new Map();
263
+ for (const m of decorators?.members ?? [])
264
+ decorated.set(m.symbol.id, m.decorators);
265
+ const memberRows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties, e.properties AS edge_props
266
+ FROM edges e
267
+ JOIN nodes n ON n.id = e.target
268
+ WHERE e.source = ? AND e.kind = 'CONTAINS'
269
+ ORDER BY n.qualified_name
270
+ LIMIT ?`, node.id, limit);
271
+ const propLine = (raw) => {
272
+ const startLine = parseProps(raw).startLine;
273
+ return typeof startLine === "number" ? startLine : undefined;
274
+ };
275
+ const members = memberRows.map((r) => {
276
+ const line = propLine(r.properties) ?? edgeLine(r.edge_props);
277
+ return {
278
+ symbol: rowToRef(r),
279
+ ...(line !== undefined ? { line } : {}),
280
+ decorators: decorated.get(r.id) ?? [],
281
+ };
282
+ });
283
+ const callers = getCallers(store, node.id, {
284
+ transitive: true,
285
+ maxDepth: depth,
286
+ includeDynamic: dynamic,
287
+ limit,
288
+ })?.callers.map((c) => ({
289
+ caller: c.caller,
290
+ depth: c.depth,
291
+ ...(c.callSiteLine !== undefined ? { callSiteLine: c.callSiteLine } : {}),
292
+ edgeKind: c.edgeKind,
293
+ })) ?? [];
294
+ const callees = getCallees(store, node.id, {
295
+ transitive: true,
296
+ maxDepth: depth,
297
+ includeDynamic: dynamic,
298
+ limit,
299
+ })?.callees.map((c) => ({
300
+ caller: c.callee,
301
+ depth: c.depth,
302
+ ...(c.callSiteLine !== undefined ? { callSiteLine: c.callSiteLine } : {}),
303
+ edgeKind: c.edgeKind,
304
+ })) ?? [];
305
+ const implementations = [];
306
+ const typeId = node.kind === "method" || node.kind === "constructor" ? enclosingTypeId(node.id) : node.id;
307
+ if (typeId) {
308
+ const impls = findImplementations(store, typeId, { maxDepth: depth, limit });
309
+ const name = memberName(node.id);
310
+ for (const impl of impls?.implementations ?? []) {
311
+ const entry = { type: impl.type, depth: impl.depth, via: impl.via };
312
+ if (name && typeId !== node.id) {
313
+ const override = store.getNode(`${impl.type.id}#${name}`) ??
314
+ store.getNodeByQualifiedName(`${impl.type.qualifiedName}#${name}`);
315
+ if (override)
316
+ entry.method = nodeToRef(override);
317
+ }
318
+ implementations.push(entry);
319
+ }
320
+ }
321
+ const wiringLimit = 200;
322
+ const routes = findRoutes(store, { symbol: node.id, limit: wiringLimit });
323
+ const injections = findInjections(store, { symbol: node.id, limit: wiringLimit });
324
+ const reflections = findReflections(store, { symbol: node.id, limit: wiringLimit });
325
+ const nodeProps = node.properties;
326
+ const nodeLine = typeof nodeProps.startLine === "number" ? nodeProps.startLine : undefined;
327
+ return {
328
+ symbol: nodeToRef(node),
329
+ ...(nodeLine !== undefined ? { line: nodeLine } : {}),
330
+ ...(nodeProps.entryPoint ? { isEntryPoint: true } : {}),
331
+ decorators: decorators?.decorators ?? [],
332
+ members,
333
+ callers,
334
+ callees,
335
+ implementations,
336
+ routes,
337
+ injections,
338
+ reflections,
339
+ summary: {
340
+ members: members.length,
341
+ callers: callers.length,
342
+ callees: callees.length,
343
+ implementations: implementations.length,
344
+ wiringEdges: routes.length + injections.length + reflections.length,
345
+ },
346
+ };
347
+ }
348
+ /**
349
+ * Find strongly connected components in the call graph with an iterative
350
+ * Tarjan. A component larger than one node means the members are mutually
351
+ * reachable, i.e. a call cycle; a self-edge is direct recursion.
352
+ *
353
+ * Iterative rather than recursive so deep call chains cannot blow the stack.
354
+ */
355
+ export function findCycles(store, opts = {}) {
356
+ const edgeKinds = opts.edgeKinds && opts.edgeKinds.length > 0
357
+ ? opts.edgeKinds
358
+ : opts.includeDynamic
359
+ ? ["CALLS", "DYNAMIC_DISPATCH"]
360
+ : ["CALLS"];
361
+ const minSize = Math.max(1, opts.minSize ?? 2);
362
+ const maxEdges = Math.max(1, opts.maxEdges ?? 200000);
363
+ const limit = Math.max(1, opts.limit ?? 100);
364
+ const rows = store.raw(`SELECT e.source, e.target
365
+ FROM edges e
366
+ JOIN nodes s ON s.id = e.source
367
+ JOIN nodes t ON t.id = e.target
368
+ WHERE e.kind IN (${sqlKinds(edgeKinds)})
369
+ AND s.kind IN ('method', 'constructor')
370
+ AND t.kind IN ('method', 'constructor')
371
+ LIMIT ?`, maxEdges);
372
+ const scanTruncated = rows.length >= maxEdges;
373
+ const adj = new Map();
374
+ const selfLoops = new Set();
375
+ const nodes = new Set();
376
+ for (const r of rows) {
377
+ nodes.add(r.source);
378
+ nodes.add(r.target);
379
+ if (r.source === r.target) {
380
+ selfLoops.add(r.source);
381
+ continue;
382
+ }
383
+ const out = adj.get(r.source);
384
+ if (out)
385
+ out.push(r.target);
386
+ else
387
+ adj.set(r.source, [r.target]);
388
+ }
389
+ // Iterative Tarjan.
390
+ const index = new Map();
391
+ const low = new Map();
392
+ const onStack = new Set();
393
+ const stack = [];
394
+ const components = [];
395
+ let counter = 0;
396
+ for (const root of nodes) {
397
+ if (index.has(root))
398
+ continue;
399
+ const work = [{ node: root, edge: 0 }];
400
+ while (work.length > 0) {
401
+ const frame = work[work.length - 1];
402
+ if (!frame)
403
+ break;
404
+ const { node } = frame;
405
+ if (frame.edge === 0) {
406
+ index.set(node, counter);
407
+ low.set(node, counter);
408
+ counter++;
409
+ stack.push(node);
410
+ onStack.add(node);
411
+ }
412
+ const outgoing = adj.get(node) ?? [];
413
+ let descended = false;
414
+ while (frame.edge < outgoing.length) {
415
+ const next = outgoing[frame.edge];
416
+ frame.edge++;
417
+ if (next === undefined)
418
+ continue;
419
+ if (!index.has(next)) {
420
+ work.push({ node: next, edge: 0 });
421
+ descended = true;
422
+ break;
423
+ }
424
+ if (onStack.has(next)) {
425
+ low.set(node, Math.min(low.get(node) ?? 0, index.get(next) ?? 0));
426
+ }
427
+ }
428
+ if (descended)
429
+ continue;
430
+ // Finished exploring `node`.
431
+ if (low.get(node) === index.get(node)) {
432
+ const component = [];
433
+ for (;;) {
434
+ const popped = stack.pop();
435
+ if (popped === undefined)
436
+ break;
437
+ onStack.delete(popped);
438
+ component.push(popped);
439
+ if (popped === node)
440
+ break;
441
+ }
442
+ components.push(component);
443
+ }
444
+ work.pop();
445
+ const parent = work[work.length - 1];
446
+ if (parent) {
447
+ low.set(parent.node, Math.min(low.get(parent.node) ?? 0, low.get(node) ?? 0));
448
+ }
449
+ }
450
+ }
451
+ const refCache = new Map();
452
+ const refOf = (id) => {
453
+ const cached = refCache.get(id);
454
+ if (cached)
455
+ return cached;
456
+ const found = store.getNode(id);
457
+ if (!found)
458
+ return undefined;
459
+ const ref = nodeToRef(found);
460
+ refCache.set(id, ref);
461
+ return ref;
462
+ };
463
+ const cycles = [];
464
+ for (const component of components) {
465
+ if (component.length < Math.max(2, minSize))
466
+ continue;
467
+ const members = component
468
+ .map(refOf)
469
+ .filter((r) => r !== undefined)
470
+ .sort((a, b) => a.qualifiedName.localeCompare(b.qualifiedName));
471
+ if (members.length < 2)
472
+ continue;
473
+ const labels = new Map(members.map((m) => [m.id, m.qualifiedName]));
474
+ cycles.push({
475
+ size: members.length,
476
+ members,
477
+ sample: cycleSample(adj, component, labels),
478
+ });
479
+ }
480
+ const selfRecursive = [...selfLoops]
481
+ .map(refOf)
482
+ .filter((r) => r !== undefined)
483
+ .slice(0, limit);
484
+ cycles.sort((a, b) => b.size - a.size);
485
+ return {
486
+ cycleCount: cycles.length,
487
+ cycles: cycles.slice(0, limit),
488
+ selfRecursive,
489
+ edgeKinds,
490
+ scannedNodes: nodes.size,
491
+ scannedEdges: rows.length,
492
+ scanTruncated,
493
+ };
494
+ }
495
+ /** Walk a closed path inside one component, preferring alphabetical order. */
496
+ function cycleSample(adj, component, labels) {
497
+ const inComponent = new Set(component);
498
+ const start = [...component].sort()[0];
499
+ if (start === undefined)
500
+ return [];
501
+ const path = [start];
502
+ const seen = new Set([start]);
503
+ let current = start;
504
+ for (let step = 0; step < component.length + 1; step++) {
505
+ const candidates = (adj.get(current) ?? [])
506
+ .filter((n) => inComponent.has(n))
507
+ .sort();
508
+ const next = candidates.find((n) => n === start || !seen.has(n));
509
+ if (next === undefined)
510
+ break;
511
+ path.push(next);
512
+ if (next === start) {
513
+ return path.map((id) => labels.get(id) ?? id);
514
+ }
515
+ seen.add(next);
516
+ current = next;
517
+ }
518
+ return [...path, start].map((id) => labels.get(id) ?? id);
519
+ }
520
+ const EXPORT_EDGE_KINDS = [
521
+ "CALLS",
522
+ "DYNAMIC_DISPATCH",
523
+ "ADVISES",
524
+ "ROUTES",
525
+ "INJECTS",
526
+ "REFLECTS",
527
+ ];
528
+ /**
529
+ * Render a neighborhood (or the whole graph) as Mermaid or Graphviz DOT so an
530
+ * agent can show the user a diagram instead of a list of edges.
531
+ */
532
+ export function exportGraph(store, opts = {}) {
533
+ const format = opts.format ?? "mermaid";
534
+ const direction = opts.direction ?? "LR";
535
+ const limit = Math.max(1, opts.limit ?? 200);
536
+ const edgeKinds = opts.edgeKinds && opts.edgeKinds.length > 0 ? opts.edgeKinds : EXPORT_EDGE_KINDS;
537
+ let nodes;
538
+ let edges;
539
+ let center;
540
+ if (opts.symbol) {
541
+ const sub = getSubgraph(store, opts.symbol, {
542
+ radius: opts.radius ?? 2,
543
+ edgeKinds,
544
+ limit,
545
+ });
546
+ if (!sub.center)
547
+ return null;
548
+ center = sub.center;
549
+ nodes = sub.nodes;
550
+ edges = sub.edges.map((e) => ({ source: e.source, target: e.target, kind: e.kind }));
551
+ }
552
+ else {
553
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties
554
+ FROM nodes n
555
+ WHERE n.kind IN ('class', 'interface', 'method', 'constructor', 'module', 'file', 'aspect')
556
+ ORDER BY n.qualified_name
557
+ LIMIT ?`, limit);
558
+ nodes = rows.map(rowToRef);
559
+ const ids = new Set(nodes.map((n) => n.id));
560
+ const edgeRows = store.raw(`SELECT e.source, e.target, e.kind
561
+ FROM edges e
562
+ WHERE e.kind IN (${sqlKinds(edgeKinds)})
563
+ ORDER BY e.source, e.target
564
+ LIMIT ?`, limit * 10);
565
+ edges = edgeRows.filter((e) => ids.has(e.source) && ids.has(e.target));
566
+ }
567
+ const index = new Map();
568
+ const ordered = [...nodes].sort((a, b) => a.qualifiedName.localeCompare(b.qualifiedName));
569
+ ordered.forEach((n, i) => index.set(n.id, i));
570
+ const seen = new Set();
571
+ const rendered = edges.filter((e) => {
572
+ if (!index.has(e.source) || !index.has(e.target))
573
+ return false;
574
+ const key = `${e.source}\u0000${e.target}\u0000${e.kind}`;
575
+ if (seen.has(key))
576
+ return false;
577
+ seen.add(key);
578
+ return true;
579
+ });
580
+ const label = (n) => `${n.qualifiedName}${n.line ? `:${n.line}` : ""}`;
581
+ const safe = (text) => text.replace(/["\\]/g, "\\$&").replace(/\n/g, " ");
582
+ const lines = [];
583
+ if (format === "mermaid") {
584
+ lines.push(`graph ${direction}`);
585
+ for (const n of ordered) {
586
+ lines.push(` n${index.get(n.id)}["${safe(label(n))}"]`);
587
+ }
588
+ for (const e of rendered) {
589
+ lines.push(` n${index.get(e.source)} -->|${e.kind}| n${index.get(e.target)}`);
590
+ }
591
+ }
592
+ else {
593
+ lines.push("digraph codecrawler {");
594
+ lines.push(` rankdir=${direction};`);
595
+ for (const n of ordered) {
596
+ lines.push(` n${index.get(n.id)} [label="${safe(label(n))}", shape=box];`);
597
+ }
598
+ for (const e of rendered) {
599
+ lines.push(` n${index.get(e.source)} -> n${index.get(e.target)} [label="${e.kind}"];`);
600
+ }
601
+ lines.push("}");
602
+ }
603
+ return {
604
+ format,
605
+ diagram: lines.join("\n"),
606
+ nodeCount: ordered.length,
607
+ edgeCount: rendered.length,
608
+ truncated: nodes.length >= limit,
609
+ ...(center ? { center } : {}),
610
+ };
611
+ }
612
+ //# sourceMappingURL=insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/graph/insights.ts"],"names":[],"mappings":"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"}