@ttsc/graph 0.16.4 → 0.16.6

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 (115) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +24 -53
  3. package/lib/TtscGraphApplication.js +59 -0
  4. package/lib/TtscGraphApplication.js.map +1 -0
  5. package/lib/index.js +31 -108
  6. package/lib/index.js.map +1 -1
  7. package/lib/model/TtscGraphMemory.js +185 -0
  8. package/lib/model/TtscGraphMemory.js.map +1 -0
  9. package/lib/model/loadGraph.js +418 -0
  10. package/lib/model/loadGraph.js.map +1 -0
  11. package/lib/reduce.js +101 -0
  12. package/lib/reduce.js.map +1 -0
  13. package/lib/resolveGraphBinary.js +42 -0
  14. package/lib/resolveGraphBinary.js.map +1 -0
  15. package/lib/server/accessAliases.js +53 -0
  16. package/lib/server/accessAliases.js.map +1 -0
  17. package/lib/server/createServer.js +1726 -0
  18. package/lib/server/createServer.js.map +1 -0
  19. package/lib/server/instructions.js +80 -0
  20. package/lib/server/instructions.js.map +1 -0
  21. package/lib/server/resolveHandle.js +25 -0
  22. package/lib/server/resolveHandle.js.map +1 -0
  23. package/lib/server/runDetails.js +413 -0
  24. package/lib/server/runDetails.js.map +1 -0
  25. package/lib/server/runEntrypoints.js +211 -0
  26. package/lib/server/runEntrypoints.js.map +1 -0
  27. package/lib/server/runLookup.js +234 -0
  28. package/lib/server/runLookup.js.map +1 -0
  29. package/lib/server/runOverview.js +160 -0
  30. package/lib/server/runOverview.js.map +1 -0
  31. package/lib/server/runTrace.js +314 -0
  32. package/lib/server/runTrace.js.map +1 -0
  33. package/lib/server/startServer.js +21 -0
  34. package/lib/server/startServer.js.map +1 -0
  35. package/lib/structures/ITtscGraphApplication.js +3 -0
  36. package/lib/structures/ITtscGraphApplication.js.map +1 -0
  37. package/lib/structures/ITtscGraphDecorator.js +3 -0
  38. package/lib/structures/ITtscGraphDecorator.js.map +1 -0
  39. package/lib/structures/ITtscGraphDetails.js +3 -0
  40. package/lib/structures/ITtscGraphDetails.js.map +1 -0
  41. package/lib/structures/ITtscGraphDiagnostic.js +3 -0
  42. package/lib/structures/ITtscGraphDiagnostic.js.map +1 -0
  43. package/lib/structures/ITtscGraphDump.js +3 -0
  44. package/lib/structures/ITtscGraphDump.js.map +1 -0
  45. package/lib/structures/ITtscGraphEdge.js +3 -0
  46. package/lib/structures/ITtscGraphEdge.js.map +1 -0
  47. package/lib/structures/ITtscGraphEntrypoints.js +3 -0
  48. package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
  49. package/lib/structures/ITtscGraphEscape.js +3 -0
  50. package/lib/structures/ITtscGraphEscape.js.map +1 -0
  51. package/lib/structures/ITtscGraphEvidence.js +3 -0
  52. package/lib/structures/ITtscGraphEvidence.js.map +1 -0
  53. package/lib/structures/ITtscGraphLookup.js +3 -0
  54. package/lib/structures/ITtscGraphLookup.js.map +1 -0
  55. package/lib/structures/ITtscGraphNode.js +3 -0
  56. package/lib/structures/ITtscGraphNode.js.map +1 -0
  57. package/lib/structures/ITtscGraphOverview.js +3 -0
  58. package/lib/structures/ITtscGraphOverview.js.map +1 -0
  59. package/lib/structures/ITtscGraphTrace.js +3 -0
  60. package/lib/structures/ITtscGraphTrace.js.map +1 -0
  61. package/lib/structures/TtscGraphEdgeKind.js +3 -0
  62. package/lib/structures/TtscGraphEdgeKind.js.map +1 -0
  63. package/lib/structures/TtscGraphNodeKind.js +3 -0
  64. package/lib/structures/TtscGraphNodeKind.js.map +1 -0
  65. package/lib/structures/TtscGraphNodeModifier.js +3 -0
  66. package/lib/structures/TtscGraphNodeModifier.js.map +1 -0
  67. package/lib/structures/index.js +38 -0
  68. package/lib/structures/index.js.map +1 -0
  69. package/lib/view.js +140 -0
  70. package/lib/view.js.map +1 -0
  71. package/lib/viewer/index.html +123 -0
  72. package/lib/viewer/viewer.js +4610 -0
  73. package/package.json +17 -4
  74. package/src/TtscGraphApplication.ts +64 -0
  75. package/src/index.ts +40 -126
  76. package/src/model/TtscGraphMemory.ts +204 -0
  77. package/src/model/loadGraph.ts +85 -0
  78. package/src/reduce.ts +165 -0
  79. package/src/resolveGraphBinary.ts +40 -0
  80. package/src/server/accessAliases.ts +55 -0
  81. package/src/server/createServer.ts +101 -0
  82. package/src/server/instructions.ts +76 -0
  83. package/src/server/resolveHandle.ts +34 -0
  84. package/src/server/runDetails.ts +469 -0
  85. package/src/server/runEntrypoints.ts +256 -0
  86. package/src/server/runLookup.ts +257 -0
  87. package/src/server/runOverview.ts +166 -0
  88. package/src/server/runTrace.ts +359 -0
  89. package/src/server/startServer.ts +25 -0
  90. package/src/structures/ITtscGraphApplication.ts +116 -0
  91. package/src/structures/ITtscGraphDecorator.ts +31 -0
  92. package/src/structures/ITtscGraphDetails.ts +134 -0
  93. package/src/structures/ITtscGraphDiagnostic.ts +34 -0
  94. package/src/structures/ITtscGraphDump.ts +35 -0
  95. package/src/structures/ITtscGraphEdge.ts +24 -0
  96. package/src/structures/ITtscGraphEntrypoints.ts +118 -0
  97. package/src/structures/ITtscGraphEscape.ts +39 -0
  98. package/src/structures/ITtscGraphEvidence.ts +26 -0
  99. package/src/structures/ITtscGraphLookup.ts +61 -0
  100. package/src/structures/ITtscGraphNode.ts +70 -0
  101. package/src/structures/ITtscGraphOverview.ts +87 -0
  102. package/src/structures/ITtscGraphTrace.ts +140 -0
  103. package/src/structures/TtscGraphEdgeKind.ts +23 -0
  104. package/src/structures/TtscGraphNodeKind.ts +26 -0
  105. package/src/structures/TtscGraphNodeModifier.ts +19 -0
  106. package/src/structures/index.ts +22 -0
  107. package/src/view.ts +155 -0
  108. package/src/viewer/index.html +123 -0
  109. package/src/viewer/main.ts +209 -0
  110. package/lib/bin.d.ts +0 -2
  111. package/lib/diagnostics.d.ts +0 -23
  112. package/lib/diagnostics.js +0 -84
  113. package/lib/diagnostics.js.map +0 -1
  114. package/lib/index.d.ts +0 -29
  115. package/src/diagnostics.ts +0 -93
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runEntrypoints = runEntrypoints;
4
+ const resolveHandle_1 = require("./resolveHandle");
5
+ const runDetails_1 = require("./runDetails");
6
+ const runLookup_1 = require("./runLookup");
7
+ const DEFAULT_LIMIT = 4;
8
+ const MAX_LIMIT = 8;
9
+ const DEFAULT_NEIGHBORS = 0;
10
+ const MAX_NEIGHBORS = 2;
11
+ const MAX_SEEDS = 3;
12
+ const STRUCTURAL_KINDS = new Set(["contains", "exports", "imports"]);
13
+ /**
14
+ * Build the first source-free entrypoints list for a code question. The result
15
+ * gives the model stable handles, declaration signatures, and direct graph
16
+ * context. It is deliberately not a source reader; details adds selected symbol
17
+ * shape and ranges, not implementation text.
18
+ */
19
+ function runEntrypoints(graph, props) {
20
+ const query = props.query.trim();
21
+ const limit = bound(props.limit, DEFAULT_LIMIT, 1, MAX_LIMIT);
22
+ const neighborLimit = bound(props.neighbors, DEFAULT_NEIGHBORS, 0, MAX_NEIGHBORS);
23
+ const lookupResult = (0, runLookup_1.runLookup)(graph, { type: "lookup", query, limit });
24
+ const hits = lookupResult.hits.map((hit) => ({ ...hit }));
25
+ const mentions = directMentions(graph, query).map((handle) => {
26
+ const resolved = (0, resolveHandle_1.resolveGraphHandle)(graph, handle, 6);
27
+ const mention = { handle };
28
+ if (resolved.node !== undefined)
29
+ mention.node = nodeOf(graph, resolved.node);
30
+ if (resolved.candidates !== undefined) {
31
+ mention.candidates = resolved.candidates.map((node) => nodeOf(graph, node));
32
+ }
33
+ return mention;
34
+ });
35
+ const seeds = [];
36
+ const seen = new Set();
37
+ const addSeed = (node) => {
38
+ if (node === undefined || seen.has(node.id))
39
+ return;
40
+ seen.add(node.id);
41
+ seeds.push(node);
42
+ };
43
+ for (const mention of mentions) {
44
+ if (mention.node !== undefined)
45
+ addSeed(graph.node(mention.node.id));
46
+ }
47
+ for (const hit of hits)
48
+ addSeed(graph.node(hit.id));
49
+ let truncated = seeds.length > MAX_SEEDS;
50
+ const neighborhood = [];
51
+ for (const seed of seeds.slice(0, MAX_SEEDS)) {
52
+ const outgoing = refs(graph, graph.outgoing(seed.id), "to", neighborLimit);
53
+ const incoming = refs(graph, graph.incoming(seed.id), "from", neighborLimit);
54
+ if (outgoing.truncated || incoming.truncated)
55
+ truncated = true;
56
+ neighborhood.push({
57
+ ...nodeOf(graph, seed),
58
+ dependsOn: outgoing.items,
59
+ dependedOnBy: incoming.items,
60
+ });
61
+ }
62
+ return {
63
+ type: "entrypoints",
64
+ query,
65
+ hits,
66
+ mentions,
67
+ neighborhood,
68
+ next: {
69
+ details: seeds.slice(0, MAX_SEEDS).map((node) => node.id),
70
+ traceFrom: seeds.slice(0, MAX_SEEDS).map((node) => node.id),
71
+ },
72
+ ...(truncated ? { truncated: true } : {}),
73
+ };
74
+ }
75
+ function nodeOf(graph, node) {
76
+ const out = {
77
+ id: node.id,
78
+ name: node.qualifiedName ?? node.name,
79
+ kind: node.kind,
80
+ file: node.file,
81
+ };
82
+ if (node.evidence?.startLine !== undefined)
83
+ out.line = node.evidence.startLine;
84
+ const signature = (0, runDetails_1.signatureOf)(graph.project, node);
85
+ if (signature !== undefined)
86
+ out.signature = signature;
87
+ const decorators = (0, runDetails_1.decoratorsOf)(node);
88
+ if (decorators !== undefined)
89
+ out.decorators = decorators;
90
+ return out;
91
+ }
92
+ function refOf(node, edge) {
93
+ const out = {
94
+ id: node.id,
95
+ name: node.qualifiedName ?? node.name,
96
+ kind: node.kind,
97
+ file: node.file,
98
+ relation: edge.kind,
99
+ };
100
+ if (node.evidence?.startLine !== undefined)
101
+ out.line = node.evidence.startLine;
102
+ const evidence = (0, runDetails_1.edgeEvidenceOf)(edge);
103
+ if (evidence !== undefined)
104
+ out.evidence = evidence;
105
+ return out;
106
+ }
107
+ function refs(graph, edges, end, limit) {
108
+ const ranked = [];
109
+ const seen = new Set();
110
+ let available = 0;
111
+ for (const edge of edges) {
112
+ if (STRUCTURAL_KINDS.has(edge.kind))
113
+ continue;
114
+ const other = graph.node(end === "to" ? edge.to : edge.from);
115
+ if (other === undefined || other.kind === "file")
116
+ continue;
117
+ const key = `${edge.kind}:${other.id}`;
118
+ if (seen.has(key))
119
+ continue;
120
+ seen.add(key);
121
+ available++;
122
+ const ref = refOf(other, edge);
123
+ ranked.push({ ref, rank: refRank(ref, edge) });
124
+ }
125
+ ranked.sort((a, b) => a.rank - b.rank);
126
+ const items = [];
127
+ for (const item of ranked) {
128
+ if (items.length < limit)
129
+ items.push(item.ref);
130
+ }
131
+ return { items, truncated: available > items.length };
132
+ }
133
+ function refRank(ref, edge) {
134
+ return (edgeKindRank(edge.kind) * 100000 +
135
+ evidenceRank(edge) +
136
+ (ref.file.startsWith("bundled://") ? 20000 : 0));
137
+ }
138
+ function evidenceRank(edge) {
139
+ const line = edge.evidence?.startLine ?? 9999;
140
+ const col = edge.evidence?.startCol ?? 999;
141
+ return line * 100 + col;
142
+ }
143
+ function edgeKindRank(kind) {
144
+ switch (kind) {
145
+ case "calls":
146
+ return 0;
147
+ case "instantiates":
148
+ return 1;
149
+ case "accesses":
150
+ case "renders":
151
+ return 2;
152
+ case "tests":
153
+ return 3;
154
+ case "overrides":
155
+ case "decorates":
156
+ return 4;
157
+ case "extends":
158
+ case "implements":
159
+ return 5;
160
+ case "type_ref":
161
+ return 6;
162
+ default:
163
+ return 10;
164
+ }
165
+ }
166
+ function directMentions(graph, query) {
167
+ const handles = new Set();
168
+ for (const token of query.split(/\s+/)) {
169
+ const handle = normalizeNodeIdToken(token);
170
+ if (handle !== undefined && graph.node(handle) !== undefined) {
171
+ handles.add(handle);
172
+ }
173
+ }
174
+ for (const match of query.matchAll(/`([^`]+)`/g)) {
175
+ const raw = match[1] ?? "";
176
+ const id = normalizeNodeIdToken(raw);
177
+ if (id !== undefined && graph.node(id) !== undefined) {
178
+ handles.add(id);
179
+ continue;
180
+ }
181
+ const handle = normalizeHandle(raw);
182
+ if (handle !== undefined)
183
+ handles.add(handle);
184
+ }
185
+ for (const match of query.matchAll(/\b[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+\b/g)) {
186
+ const handle = normalizeHandle(match[0]);
187
+ if (handle !== undefined)
188
+ handles.add(handle);
189
+ }
190
+ return [...handles];
191
+ }
192
+ function normalizeNodeIdToken(raw) {
193
+ const value = raw
194
+ .trim()
195
+ .replace(/^[`"'([{]+/, "")
196
+ .replace(/[`"',.;:)\]}]+$/, "");
197
+ return /^[^\s#]+#[^\s#]+:(class|interface|type|enum|function|method|variable|property)$/.test(value)
198
+ ? value
199
+ : undefined;
200
+ }
201
+ function normalizeHandle(raw) {
202
+ const value = raw.trim();
203
+ return /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(value)
204
+ ? value
205
+ : undefined;
206
+ }
207
+ function bound(value, fallback, min, max) {
208
+ const n = value === undefined || !Number.isFinite(value) ? fallback : value;
209
+ return Math.max(min, Math.min(max, Math.floor(n)));
210
+ }
211
+ //# sourceMappingURL=runEntrypoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runEntrypoints.js","sourceRoot":"","sources":["../../src/server/runEntrypoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runLookup = runLookup;
4
+ const runDetails_1 = require("./runDetails");
5
+ // One file should not crowd out the rest of the ranking, so cap hits per file.
6
+ const PER_FILE = 3;
7
+ const DEFAULT_LIMIT = 5;
8
+ const MAX_LIMIT = 6;
9
+ /**
10
+ * Rank the graph's symbols against a natural query. Scoring blends exact and
11
+ * dotted-name matches, CamelCase/subword coverage, file-path terms, a prefix
12
+ * bonus, and dependency centrality, then dampens external, generated, and test
13
+ * nodes and caps per file so the result is a diverse, relevant shortlist rather
14
+ * than one file's roster.
15
+ */
16
+ function runLookup(graph, props) {
17
+ const terms = subwords(props.query);
18
+ const codeTerms = exactCodeTerms(props.query);
19
+ const requestedKinds = requestedSymbolKinds(props.query);
20
+ const queryLc = props.query.trim().toLowerCase();
21
+ const wantsInternal = wantsInternalSymbol(queryLc, codeTerms);
22
+ if (terms.length === 0)
23
+ return { type: "lookup", hits: [], next: { details: [], traceFrom: [] } };
24
+ const scored = [];
25
+ for (const node of graph.nodes) {
26
+ if (node.kind === "file")
27
+ continue;
28
+ const score = scoreNode(graph, node, queryLc, terms, codeTerms, requestedKinds, wantsInternal);
29
+ if (score <= 0)
30
+ continue;
31
+ const hit = {
32
+ id: node.id,
33
+ name: node.qualifiedName ?? node.name,
34
+ kind: node.kind,
35
+ file: node.file,
36
+ line: node.evidence?.startLine,
37
+ score: Math.round(score),
38
+ };
39
+ const decorators = (0, runDetails_1.decoratorsOf)(node);
40
+ if (decorators !== undefined)
41
+ hit.decorators = decorators;
42
+ scored.push(hit);
43
+ }
44
+ scored.sort((a, b) => b.score - a.score);
45
+ // Diversity: keep at most PER_FILE hits per file while filling up to the limit.
46
+ const limit = bound(props.limit, DEFAULT_LIMIT, 1, MAX_LIMIT);
47
+ const perFile = new Map();
48
+ const hits = [];
49
+ for (const hit of scored) {
50
+ const used = perFile.get(hit.file) ?? 0;
51
+ if (used >= PER_FILE)
52
+ continue;
53
+ perFile.set(hit.file, used + 1);
54
+ hits.push(hit);
55
+ if (hits.length >= limit)
56
+ break;
57
+ }
58
+ // Attach each kept hit's signature only for the shortlist, so the model can
59
+ // often answer from lookup alone without a details call.
60
+ for (const hit of hits) {
61
+ const node = graph.node(hit.id);
62
+ if (node === undefined)
63
+ continue;
64
+ const sig = (0, runDetails_1.signatureOf)(graph.project, node);
65
+ if (sig !== undefined)
66
+ hit.signature = sig;
67
+ }
68
+ return {
69
+ type: "lookup",
70
+ hits,
71
+ next: {
72
+ details: hits.map((hit) => hit.id),
73
+ traceFrom: hits.map((hit) => hit.id),
74
+ },
75
+ };
76
+ }
77
+ /** Score one node against the query; 0 means no match. */
78
+ function scoreNode(graph, node, queryLc, terms, codeTerms, requestedKinds, wantsInternal) {
79
+ const name = node.name.toLowerCase();
80
+ const qualified = (node.qualifiedName ?? node.name).toLowerCase();
81
+ const nameSubs = subwords(node.name);
82
+ const qualifiedSubs = subwords(node.qualifiedName ?? node.name);
83
+ const pathSubs = subwords(node.file);
84
+ let score = 0;
85
+ if (queryLc === name || queryLc === qualified) {
86
+ score += 100;
87
+ }
88
+ else if (qualified.includes(".") && queryLc.includes(qualified)) {
89
+ score += 85;
90
+ }
91
+ else if (queryLc.includes(".") && qualified.includes(queryLc)) {
92
+ score += 60;
93
+ }
94
+ for (const codeTerm of codeTerms) {
95
+ if (name === codeTerm || qualified === codeTerm) {
96
+ score += 110;
97
+ }
98
+ else if (qualified.endsWith(`.${codeTerm}`)) {
99
+ score += 95;
100
+ }
101
+ else if (codeTerm.includes(".") && qualified.endsWith(codeTerm)) {
102
+ score += 85;
103
+ }
104
+ }
105
+ if (requestedKinds.has(node.kind))
106
+ score += 16;
107
+ let covered = 0;
108
+ for (const term of terms) {
109
+ if (nameSubs.includes(term)) {
110
+ score += 12;
111
+ covered++;
112
+ }
113
+ else if (qualifiedSubs.includes(term)) {
114
+ score += 8;
115
+ covered++;
116
+ }
117
+ else if (name.includes(term)) {
118
+ score += 5;
119
+ covered++;
120
+ }
121
+ else if (pathSubs.includes(term)) {
122
+ score += 3;
123
+ }
124
+ }
125
+ // Every query term landed somewhere in the name: a strong whole-query match.
126
+ if (covered === terms.length)
127
+ score += 10;
128
+ if (name.startsWith(terms[0]))
129
+ score += 4;
130
+ if (score <= 0)
131
+ return 0;
132
+ // Centrality: a symbol the codebase leans on is a likelier target.
133
+ const fan = degree(graph, node.id);
134
+ score += Math.min(8, Math.log2(1 + fan) * 2);
135
+ // Dampen what is rarely the intended target.
136
+ if (node.external)
137
+ score *= 0.5;
138
+ if (node.ignored)
139
+ score *= 0.3;
140
+ if (isTestFile(node.file))
141
+ score *= 0.7;
142
+ if (!wantsInternal && isInternalish(node))
143
+ score *= 0.82;
144
+ return score;
145
+ }
146
+ function wantsInternalSymbol(queryLc, codeTerms) {
147
+ return (/\b(internal|private|implementation|impl)\b/.test(queryLc) ||
148
+ codeTerms.some((term) => term.startsWith("_") || term.includes("internal")));
149
+ }
150
+ function isInternalish(node) {
151
+ const name = node.qualifiedName ?? node.name;
152
+ return (name.startsWith("_") ||
153
+ name.includes("._") ||
154
+ subwords(name).some((word) => word === "internal" || word === "internals"));
155
+ }
156
+ function exactCodeTerms(query) {
157
+ const out = new Set();
158
+ for (const match of query.matchAll(/`([^`]+)`/g)) {
159
+ const normalized = normalizeCodeTerm(match[1] ?? "");
160
+ if (normalized !== undefined)
161
+ out.add(normalized);
162
+ }
163
+ for (const match of query.matchAll(/\b([A-Za-z_$][\w$]*)\s+(method|function|class|interface|type|variable)\b/gi)) {
164
+ const normalized = normalizeCodeTerm(match[1] ?? "");
165
+ if (normalized !== undefined)
166
+ out.add(normalized);
167
+ }
168
+ for (const match of query.matchAll(/\b[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+\b/g)) {
169
+ const normalized = normalizeCodeTerm(match[0]);
170
+ if (normalized !== undefined)
171
+ out.add(normalized);
172
+ }
173
+ return [...out];
174
+ }
175
+ function requestedSymbolKinds(query) {
176
+ const kinds = new Set();
177
+ const lc = query.toLowerCase();
178
+ if (/\bmethods?\b/.test(lc))
179
+ kinds.add("method");
180
+ if (/\bfunctions?\b/.test(lc)) {
181
+ kinds.add("function");
182
+ kinds.add("method");
183
+ kinds.add("variable");
184
+ }
185
+ if (/\bclasses?\b/.test(lc))
186
+ kinds.add("class");
187
+ if (/\binterfaces?\b/.test(lc))
188
+ kinds.add("interface");
189
+ if (/\btypes?\b/.test(lc))
190
+ kinds.add("type");
191
+ if (/\bvariables?\b|\bconst\b|\blet\b/.test(lc))
192
+ kinds.add("variable");
193
+ return kinds;
194
+ }
195
+ function normalizeCodeTerm(raw) {
196
+ const value = raw.trim().toLowerCase();
197
+ return /^[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*$/.test(value) ? value : undefined;
198
+ }
199
+ /** Non-structural in+out degree (code dependency, not nesting). */
200
+ function degree(graph, id) {
201
+ let n = 0;
202
+ for (const edge of graph.outgoing(id))
203
+ if (!isStructural(edge.kind))
204
+ n++;
205
+ for (const edge of graph.incoming(id))
206
+ if (!isStructural(edge.kind))
207
+ n++;
208
+ return n;
209
+ }
210
+ function isStructural(kind) {
211
+ return kind === "contains" || kind === "exports" || kind === "imports";
212
+ }
213
+ function isTestFile(file) {
214
+ return (/(^|\/)(test|tests|__tests__|spec)\//.test(file) ||
215
+ /\.(test|spec)\.[cm]?tsx?$/.test(file));
216
+ }
217
+ function bound(value, fallback, min, max) {
218
+ const n = value === undefined || !Number.isFinite(value) ? fallback : value;
219
+ return Math.max(min, Math.min(max, Math.floor(n)));
220
+ }
221
+ /**
222
+ * Split an identifier or phrase into lowercase subword tokens: CamelCase,
223
+ * snake, dotted, and space boundaries all break, so `getHTTPResponse`,
224
+ * `find_by_id`, and `OrderService.create` tokenize the way a query would.
225
+ */
226
+ function subwords(text) {
227
+ return text
228
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
229
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
230
+ .split(/[^a-zA-Z0-9]+/)
231
+ .filter((w) => w.length > 0)
232
+ .map((w) => w.toLowerCase());
233
+ }
234
+ //# sourceMappingURL=runLookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runLookup.js","sourceRoot":"","sources":["../../src/server/runLookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runOverview = runOverview;
4
+ /** Edges that express nesting/packaging, not code dependency. */
5
+ const STRUCTURAL_KINDS = new Set(["contains", "exports", "imports"]);
6
+ /**
7
+ * Project a compact, source-read-free architecture map: counts by kind, folder
8
+ * layering with export density, the highest-dependency symbols (ranked by real
9
+ * fan-in/out, excluding structural edges so nesting does not masquerade as
10
+ * dependency), and the export surface by file. Output is bounded so a model
11
+ * reads structure cheaply.
12
+ */
13
+ function runOverview(graph, props) {
14
+ const aspect = props.aspect ?? "all";
15
+ const want = (a) => aspect === "all" || aspect === a;
16
+ const byKind = {};
17
+ let files = 0;
18
+ for (const node of graph.nodes) {
19
+ byKind[node.kind] = (byKind[node.kind] ?? 0) + 1;
20
+ if (node.kind === "file")
21
+ files++;
22
+ }
23
+ const result = {
24
+ type: "overview",
25
+ project: graph.project,
26
+ counts: {
27
+ files,
28
+ nodes: graph.nodes.length,
29
+ edges: graph.edges.length,
30
+ byKind,
31
+ },
32
+ };
33
+ if (want("layers"))
34
+ result.layers = layers(graph);
35
+ if (want("hotspots"))
36
+ result.hotspots = hotspots(graph);
37
+ if (want("publicApi"))
38
+ result.publicApi = publicApi(graph);
39
+ return result;
40
+ }
41
+ /** Folder-level layering: how source and its export surface spread by directory. */
42
+ function layers(graph) {
43
+ const byDir = new Map();
44
+ for (const node of graph.nodes) {
45
+ if (node.external || node.kind === "file")
46
+ continue;
47
+ const dir = dirname(node.file);
48
+ let entry = byDir.get(dir);
49
+ if (!entry) {
50
+ entry = { files: new Set(), exported: 0 };
51
+ byDir.set(dir, entry);
52
+ }
53
+ entry.files.add(node.file);
54
+ if (node.exported)
55
+ entry.exported++;
56
+ }
57
+ return [...byDir.entries()]
58
+ .map(([dir, entry]) => ({
59
+ dir,
60
+ files: entry.files.size,
61
+ exported: entry.exported,
62
+ }))
63
+ .sort((a, b) => b.files - a.files)
64
+ .slice(0, 10);
65
+ }
66
+ /**
67
+ * The symbols at the center of the dependency graph, ranked by real fan-in and
68
+ * fan-out. Structural `contains`/`exports`/`imports` edges are excluded so the
69
+ * ranking reflects code dependency, not nesting.
70
+ */
71
+ function hotspots(graph) {
72
+ const real = (id, side) => {
73
+ const edges = side === "in" ? graph.incoming(id) : graph.outgoing(id);
74
+ let n = 0;
75
+ for (const edge of edges)
76
+ if (!STRUCTURAL_KINDS.has(edge.kind))
77
+ n++;
78
+ return n;
79
+ };
80
+ return graph.nodes
81
+ .filter((node) => !node.external && node.kind !== "file")
82
+ .map((node) => ({
83
+ ...nodeOf(node),
84
+ fanIn: real(node.id, "in"),
85
+ fanOut: real(node.id, "out"),
86
+ }))
87
+ .filter((h) => h.fanIn + h.fanOut > 0)
88
+ .sort((a, b) => b.fanIn + b.fanOut - (a.fanIn + a.fanOut))
89
+ .slice(0, 10);
90
+ }
91
+ /** Declaration kinds that make up a meaningful public API surface. */
92
+ const API_KINDS = new Set([
93
+ "class",
94
+ "interface",
95
+ "function",
96
+ "type",
97
+ "enum",
98
+ ]);
99
+ /**
100
+ * The exported API surface: the exported symbols a consumer of the project
101
+ * would use, ranked by how depended-on each is (real fan-in/out, structural
102
+ * edges excluded). Ranking by dependency rather than by which file declares the
103
+ * most exports surfaces the load-bearing types (a DataSource, a
104
+ * SelectQueryBuilder) instead of whichever file bundles the most type aliases;
105
+ * test, typings, and generated files are dropped so they cannot crowd the real
106
+ * surface out.
107
+ */
108
+ function publicApi(graph) {
109
+ const degree = (id) => {
110
+ let n = 0;
111
+ for (const edge of graph.outgoing(id))
112
+ if (!STRUCTURAL_KINDS.has(edge.kind))
113
+ n++;
114
+ for (const edge of graph.incoming(id))
115
+ if (!STRUCTURAL_KINDS.has(edge.kind))
116
+ n++;
117
+ return n;
118
+ };
119
+ return graph
120
+ .exported()
121
+ .filter((node) => API_KINDS.has(node.kind) && !isNoiseFile(node.file))
122
+ .map((node) => ({
123
+ node: nodeOf(node),
124
+ degree: degree(node.id),
125
+ }))
126
+ .sort((a, b) => b.degree - a.degree)
127
+ .slice(0, 15)
128
+ .map((ranked) => ranked.node);
129
+ }
130
+ /**
131
+ * A file whose exports are noise for an architecture overview: a test, a
132
+ * dependency's bundled `.d.ts`/typings, or generated output. The conventions
133
+ * are universal (a `test`/`spec` path, a `typings` file), so excluding them is
134
+ * not framework-specific; it keeps the API surface to authored, used code.
135
+ */
136
+ function isNoiseFile(file) {
137
+ return (/(^|\/)(test|tests|__tests__|spec|sample|samples)\//.test(file) ||
138
+ /\.(test|spec)\.[cm]?tsx?$/.test(file) ||
139
+ /(^|\/|\.)typings\.[cm]?ts$/.test(file) ||
140
+ /\.d\.[cm]?ts$/.test(file));
141
+ }
142
+ /** The parent directory of a project-relative path (`.` at the root). */
143
+ function dirname(file) {
144
+ const slash = file.lastIndexOf("/");
145
+ return slash >= 0 ? file.slice(0, slash) : ".";
146
+ }
147
+ /** Stable symbol coordinate shared by overview facets. */
148
+ function nodeOf(node) {
149
+ const out = {
150
+ id: node.id,
151
+ name: node.qualifiedName ?? node.name,
152
+ kind: node.kind,
153
+ file: node.file,
154
+ };
155
+ if (node.evidence?.startLine !== undefined) {
156
+ out.line = node.evidence.startLine;
157
+ }
158
+ return out;
159
+ }
160
+ //# sourceMappingURL=runOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runOverview.js","sourceRoot":"","sources":["../../src/server/runOverview.ts"],"names":[],"mappings":"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"}