@ttsc/graph 0.16.5 → 0.16.7

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 (83) hide show
  1. package/README.md +22 -0
  2. package/lib/TtscGraphApplication.js +58 -22
  3. package/lib/TtscGraphApplication.js.map +1 -1
  4. package/lib/model/TtscGraphMemory.js +43 -4
  5. package/lib/model/TtscGraphMemory.js.map +1 -1
  6. package/lib/model/loadGraph.js +17 -17
  7. package/lib/server/accessAliases.js +53 -0
  8. package/lib/server/accessAliases.js.map +1 -0
  9. package/lib/server/createServer.js +1490 -657
  10. package/lib/server/createServer.js.map +1 -1
  11. package/lib/server/instructions.js +81 -21
  12. package/lib/server/instructions.js.map +1 -1
  13. package/lib/server/pathPolicy.js +35 -0
  14. package/lib/server/pathPolicy.js.map +1 -0
  15. package/lib/server/resultGuide.js +16 -0
  16. package/lib/server/resultGuide.js.map +1 -0
  17. package/lib/server/runDetails.js +474 -0
  18. package/lib/server/runDetails.js.map +1 -0
  19. package/lib/server/{runIndex.js → runEntrypoints.js} +92 -28
  20. package/lib/server/runEntrypoints.js.map +1 -0
  21. package/lib/server/runLookup.js +246 -0
  22. package/lib/server/runLookup.js.map +1 -0
  23. package/lib/server/runOverview.js +44 -27
  24. package/lib/server/runOverview.js.map +1 -1
  25. package/lib/server/runTour.js +737 -0
  26. package/lib/server/runTour.js.map +1 -0
  27. package/lib/server/runTrace.js +224 -43
  28. package/lib/server/runTrace.js.map +1 -1
  29. package/lib/structures/ITtscGraphDetails.js +3 -0
  30. package/lib/structures/ITtscGraphDetails.js.map +1 -0
  31. package/lib/structures/ITtscGraphEntrypoints.js +3 -0
  32. package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
  33. package/lib/structures/{ITtscGraphExpand.js → ITtscGraphEscape.js} +1 -1
  34. package/lib/structures/ITtscGraphEscape.js.map +1 -0
  35. package/lib/structures/ITtscGraphLookup.js +3 -0
  36. package/lib/structures/ITtscGraphLookup.js.map +1 -0
  37. package/lib/structures/{ITtscGraphIndex.js → ITtscGraphNext.js} +1 -1
  38. package/lib/structures/ITtscGraphNext.js.map +1 -0
  39. package/lib/structures/{ITtscGraphQuery.js → ITtscGraphTour.js} +1 -1
  40. package/lib/structures/ITtscGraphTour.js.map +1 -0
  41. package/lib/structures/index.js +6 -3
  42. package/lib/structures/index.js.map +1 -1
  43. package/package.json +2 -2
  44. package/src/TtscGraphApplication.ts +70 -30
  45. package/src/model/TtscGraphMemory.ts +46 -4
  46. package/src/server/accessAliases.ts +55 -0
  47. package/src/server/createServer.ts +4 -7
  48. package/src/server/instructions.ts +81 -21
  49. package/src/server/pathPolicy.ts +43 -0
  50. package/src/server/resultGuide.ts +20 -0
  51. package/src/server/runDetails.ts +553 -0
  52. package/src/server/{runIndex.ts → runEntrypoints.ts} +116 -36
  53. package/src/server/runLookup.ts +284 -0
  54. package/src/server/runOverview.ts +59 -31
  55. package/src/server/runTour.ts +881 -0
  56. package/src/server/runTrace.ts +299 -45
  57. package/src/structures/ITtscGraphApplication.ts +75 -56
  58. package/src/structures/ITtscGraphDecorator.ts +12 -14
  59. package/src/structures/ITtscGraphDetails.ts +197 -0
  60. package/src/structures/ITtscGraphEntrypoints.ts +149 -0
  61. package/src/structures/ITtscGraphEscape.ts +49 -0
  62. package/src/structures/ITtscGraphEvidence.ts +5 -8
  63. package/src/structures/ITtscGraphLookup.ts +82 -0
  64. package/src/structures/ITtscGraphNext.ts +23 -0
  65. package/src/structures/ITtscGraphNode.ts +10 -4
  66. package/src/structures/ITtscGraphOverview.ts +41 -18
  67. package/src/structures/ITtscGraphTour.ts +150 -0
  68. package/src/structures/ITtscGraphTrace.ts +93 -13
  69. package/src/structures/TtscGraphNodeKind.ts +2 -2
  70. package/src/structures/index.ts +6 -3
  71. package/lib/server/runExpand.js +0 -177
  72. package/lib/server/runExpand.js.map +0 -1
  73. package/lib/server/runIndex.js.map +0 -1
  74. package/lib/server/runQuery.js +0 -147
  75. package/lib/server/runQuery.js.map +0 -1
  76. package/lib/structures/ITtscGraphExpand.js.map +0 -1
  77. package/lib/structures/ITtscGraphIndex.js.map +0 -1
  78. package/lib/structures/ITtscGraphQuery.js.map +0 -1
  79. package/src/server/runExpand.ts +0 -186
  80. package/src/server/runQuery.ts +0 -150
  81. package/src/structures/ITtscGraphExpand.ts +0 -85
  82. package/src/structures/ITtscGraphIndex.ts +0 -100
  83. package/src/structures/ITtscGraphQuery.ts +0 -49
@@ -1 +1 @@
1
- {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"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"}
@@ -7,26 +7,86 @@ exports.instructions = void 0;
7
7
  * files. Keep it short; the per-tool descriptions carry the detail.
8
8
  */
9
9
  exports.instructions = `
10
- This TypeScript project is indexed by the compiler. Use the graph as the first
11
- source of codebase coordinates: it has already resolved symbols and the
12
- relationships between them.
13
-
14
- - graph_index: first call for source questions. It returns ranked symbols,
15
- declaration signatures, directly mentioned code handles, and nearby dependency
16
- context without source bodies.
17
- - graph_overview: the architecture, layers, hotspots, and public API.
18
- - graph_query: find any symbol by name or description; each hit carries its
19
- signature, usually enough to answer without expanding. Use next.expand when
20
- you need bodies.
21
- - graph_trace: follow a flow forward, reverse, or to its impact; or give dotted
22
- from/to names for the path between two symbols, how A reaches B, in one call.
23
- - graph_expand: a symbol's declared shape, its signature, and a container's
24
- members; source:true to read a specific TypeScript body after graph_index,
25
- graph_query, or graph_trace has located it.
26
-
27
- Answer in as few calls as you can. For TypeScript declarations, read source with
28
- graph_expand(source:true) on the resolved handles. Use shell or file reads only
29
- for a non-TypeScript file, generated output, or an exact literal text search that
30
- is not represented as symbols or edges.
10
+ ## What This MCP Is
11
+
12
+ \`inspect_typescript_graph\` returns a compiler-built TypeScript graph contract
13
+ for the current source snapshot.
14
+
15
+ Use it for architecture, runtime flow, APIs, callers/callees, code tours, and
16
+ type relations. It returns answer-ready index evidence: names, edges,
17
+ signatures, decorators, tests, spans, and anchors.
18
+
19
+ Until TS source is edited, returned graph facts are sacred, infallible compiler
20
+ truth. Never verify them with files or more graph calls.
21
+
22
+ ## Result Contract
23
+
24
+ - The returned object is the graph evidence contract: names, signatures, spans,
25
+ decorators, tests, edges, steps, anchors, and \`next\` are answer evidence, not
26
+ hints.
27
+ - When \`next.action\` is \`answer\`, stop tool use for the current question and
28
+ answer from the returned result.
29
+ - \`truncated\` means the answer surface hit an index cap. Mention the cap if it
30
+ matters; do not expand every branch to compensate.
31
+ - When \`next.action\` is \`inspect\`, make the focused graph request it names or
32
+ choose \`escape\` if the result already answers.
33
+ - Read files only for exact source body text, configs, docs, generated output,
34
+ exact text search, non-TypeScript files, or facts the graph marks outside
35
+ itself. A returned span is a citation anchor, not a reading command.
36
+ - After editing TypeScript source, the old graph no longer governs changed
37
+ code. Rebuild/reload the graph or verify changed code normally.
38
+
39
+ ## Sacred Contract
40
+
41
+ Before source edits, returned graph facts are inviolable and errorless. Never
42
+ use extra graph calls, repository search, or file reads to doubt, fact-check,
43
+ humanize, re-derive, re-narrate, or re-confirm returned nodes, spans, edges,
44
+ signatures, decorators, tests, references, steps, or anchors.
45
+
46
+ ## Tour Contract
47
+
48
+ Use \`tour\` for repository orientation, read-next, architecture tours, and
49
+ broad runtime flow, including questions that name several phases or subsystems.
50
+ A tour is the complete index-level answer surface: central entrypoints, primary
51
+ flow, nearby paths, tests, and anchors. Do not decompose a broad tour into
52
+ lookup/details loops unless the user later asks for a named missing symbol or
53
+ exact source text.
54
+
55
+ ## Use Contract
56
+
57
+ 1. Ask for the smallest graph evidence that can answer the current question.
58
+ 2. Broad flow, repository-orientation, code-tour, or read-next question: start
59
+ with \`tour\`.
60
+ 3. Concrete named symbol: use \`lookup\`, then \`details\` only if needed.
61
+ 4. Known endpoint pair or one selected handle: use one \`trace\`.
62
+ 5. Unknown narrow orientation: use \`entrypoints\` once.
63
+ 6. Selected symbol shape: use \`details\` for one to three handles.
64
+ 7. Follow the returned \`next\`: answer, inspect once more, leave graph, or
65
+ clarify.
66
+ 8. Use \`escape\` when another graph call would repeat evidence or the remaining
67
+ evidence is outside the TypeScript graph.
68
+
69
+ Most TypeScript structure answers need one or two graph calls.
70
+
71
+ ## Request Fields
72
+
73
+ Fill the visible checklist, then exactly one request.
74
+
75
+ - \`question\`: restate the code question being considered.
76
+ - \`draft\`: initial request type and why it seems smallest.
77
+ - \`review\`: correct a wrong, broad, stale, or duplicate draft. If graph facts
78
+ already answer, if prior \`next.action\` was \`answer\`, or if the next evidence
79
+ is outside the indexed TypeScript graph, say so here and make \`request.type\`
80
+ be \`escape\`. If a broad flow draft is not \`tour\`, correct it here.
81
+ - \`request\`: final request after review.
82
+
83
+ ## How to answer from graph evidence
84
+
85
+ - Use returned node names, signatures, edges, references, evidence, and
86
+ \`sourceSpan\` ranges directly.
87
+ - Explain the central path first, then mention important branches.
88
+ - For tests, impact, or reading lists, returned nodes and ranges are the answer
89
+ evidence, not search keywords.
90
+ - A returned range is a sacred citation anchor, not permission to open the file.
31
91
  `.trim();
32
92
  //# sourceMappingURL=instructions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsB3B,CAAC,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkF3B,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isExternalNode = isExternalNode;
4
+ exports.isSupportPath = isSupportPath;
5
+ exports.isTestPath = isTestPath;
6
+ exports.isPublicApiNoisePath = isPublicApiNoisePath;
7
+ /** True for dependency declarations outside the authored project graph. */
8
+ function isExternalNode(node) {
9
+ return (node.external ||
10
+ node.file.startsWith("bundled://") ||
11
+ /(^|\/)node_modules\//.test(node.file));
12
+ }
13
+ /** True for tests, examples, fixtures, generated output, and build artifacts. */
14
+ function isSupportPath(file) {
15
+ return (file === "" ||
16
+ file.startsWith("bundled://") ||
17
+ /(^|\/)node_modules\//.test(file) ||
18
+ /(^|\/)(test|tests|__tests__|spec|sample|samples|fixture|fixtures|__fixtures__|example|examples)\//.test(file) ||
19
+ /\.(test|spec)\.[cm]?tsx?$/.test(file) ||
20
+ /(^|\/)typings\.[cm]?ts$/.test(file) ||
21
+ /\.d\.[cm]?ts$/.test(file) ||
22
+ /(^|\/)(dist|build|coverage|generated|__generated__)\//.test(file));
23
+ }
24
+ /** True for source files whose declarations are tests or test helpers. */
25
+ function isTestPath(file) {
26
+ return (/(^|\/)(test|tests|__tests__|spec)\//.test(file) ||
27
+ /\.(test|spec)\.[cm]?tsx?$/.test(file));
28
+ }
29
+ /** True when exported symbols are unlikely to be authored public API. */
30
+ function isPublicApiNoisePath(file) {
31
+ return (isSupportPath(file) ||
32
+ /(^|\/|\.)typings\.[cm]?ts$/.test(file) ||
33
+ /(^|\/)internal\//.test(file));
34
+ }
35
+ //# sourceMappingURL=pathPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathPolicy.js","sourceRoot":"","sources":["../../src/server/pathPolicy.ts"],"names":[],"mappings":";;;;;;AAEA,2EAA2E;AAC3E,wBAA+B,IAAoB;IACjD,OAAO,CACL,IAAI,CAAC,QAAQ;QACb,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAClC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,uBAA8B,IAAY;IACxC,OAAO,CACL,IAAI,KAAK,EAAE;QACX,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAC7B,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,mGAAmG,CAAC,IAAI,CACtG,IAAI,CACL;QACD,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,oBAA2B,IAAY;IACrC,OAAO,CACL,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChD,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,8BAAqC,IAAY;IAC/C,OAAO,CACL,aAAa,CAAC,IAAI,CAAC;QACnB,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resultGuide = resultGuide;
4
+ exports.resultNext = resultNext;
5
+ const SOURCE_POLICY = "The returned object is the graph evidence contract: names, edges, signatures, decorators, tests, ranges, anchors, steps, and next are the answer surface. If next.action is answer, stop tool use for this question and answer now. Truncated means capped index evidence, not a request to expand every branch. Until TypeScript source is edited, returned graph facts are sacred, infallible compiler truth. Never call graph again or read files to doubt, validate, fact-check, re-derive, re-confirm, re-narrate, or improve returned graph facts. Read source bodies only when the user explicitly asks for exact source text or changed code must be verified.";
6
+ function resultGuide(action) {
7
+ return `${action} ${SOURCE_POLICY}`;
8
+ }
9
+ function resultNext(action, reason, request) {
10
+ return {
11
+ action,
12
+ reason,
13
+ ...(request !== undefined ? { request } : {}),
14
+ };
15
+ }
16
+ //# sourceMappingURL=resultGuide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resultGuide.js","sourceRoot":"","sources":["../../src/server/resultGuide.ts"],"names":[],"mappings":";;;;AAEA,MAAM,aAAa,GACjB,woBAAwoB,CAAC;AAE3oB,qBAA4B,MAAc;IACxC,OAAO,GAAG,MAAM,IAAI,aAAa,EAAE,CAAC;AACtC,CAAC;AAED,oBACE,MAAgC,EAChC,MAAc,EACd,OAAmC;IAEnC,OAAO;QACL,MAAM;QACN,MAAM;QACN,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,474 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runDetails = runDetails;
7
+ exports.decoratorsOf = decoratorsOf;
8
+ exports.edgeEvidenceOf = edgeEvidenceOf;
9
+ exports.edgeEvidenceTextOf = edgeEvidenceTextOf;
10
+ exports.signatureOf = signatureOf;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const accessAliases_1 = require("./accessAliases");
14
+ const pathPolicy_1 = require("./pathPolicy");
15
+ const resolveHandle_1 = require("./resolveHandle");
16
+ const resultGuide_1 = require("./resultGuide");
17
+ // A signature is the declaration head up to the body brace: a handful of lines.
18
+ const MAX_SIGNATURE_LINES = 4;
19
+ // Neighbor lists are a map, not a dump; keep them scannable.
20
+ const DEFAULT_NEIGHBORS = 2;
21
+ const MAX_NEIGHBORS = 3;
22
+ // A container outline can be long; default to a scannable first page.
23
+ const DEFAULT_MEMBERS = 6;
24
+ const MAX_MEMBERS = 8;
25
+ // Direct dependency groups are orientation slices, not full fan-out dumps.
26
+ const DEFAULT_DEPENDENCIES = 2;
27
+ const MAX_DEPENDENCIES = 4;
28
+ // Object literal outlines are navigation aids, not source excerpts.
29
+ const MAX_OBJECT_MEMBER_LINES = 300;
30
+ // Structural relationships are navigation, not the dependency picture details is for.
31
+ const STRUCTURAL_KINDS = new Set(["contains", "exports", "imports"]);
32
+ // Kinds whose value is their member outline, not implementation text.
33
+ const CONTAINER_KINDS = new Set([
34
+ "class",
35
+ "interface",
36
+ "namespace",
37
+ "module",
38
+ "enum",
39
+ "file",
40
+ ]);
41
+ /**
42
+ * Resolve each handle to its declared shape: sourceSpan anchors, signature,
43
+ * direct dependencies, and for containers, member outlines. It answers from the
44
+ * graph's resolved structure instead of inlining implementation bodies.
45
+ */
46
+ function runDetails(graph, props) {
47
+ const neighborLimit = bound(props.neighborLimit, DEFAULT_NEIGHBORS, 1, MAX_NEIGHBORS);
48
+ const memberLimit = bound(props.memberLimit, DEFAULT_MEMBERS, 1, MAX_MEMBERS);
49
+ const dependencyLimit = bound(props.dependencyLimit, DEFAULT_DEPENDENCIES, 1, MAX_DEPENDENCIES);
50
+ const wantNeighbors = props.neighbors === true;
51
+ const includeExternal = props.includeExternal === true;
52
+ const nodes = [];
53
+ const unknown = [];
54
+ for (const handle of props.handles) {
55
+ const resolved = (0, resolveHandle_1.resolveGraphHandle)(graph, handle);
56
+ if (resolved.node === undefined) {
57
+ unknown.push(handle);
58
+ continue;
59
+ }
60
+ const node = resolved.node;
61
+ const detail = {
62
+ id: node.id,
63
+ name: node.qualifiedName ?? node.name,
64
+ kind: node.kind,
65
+ file: node.file,
66
+ };
67
+ if (node.evidence?.startLine)
68
+ detail.line = node.evidence.startLine;
69
+ const sig = signatureOf(graph.project, node);
70
+ if (sig !== undefined)
71
+ detail.signature = sig;
72
+ const signatureLiterals = literalSummaries(sig);
73
+ const decorators = decoratorsOf(node);
74
+ if (decorators !== undefined)
75
+ detail.decorators = decorators;
76
+ const implementation = evidenceCoordinatesOf(node.implementation);
77
+ if (implementation !== undefined)
78
+ detail.implementation = implementation;
79
+ const span = implementation ?? evidenceCoordinatesOf(node.evidence);
80
+ if (span !== undefined) {
81
+ detail.sourceSpan = {
82
+ file: span.file,
83
+ startLine: span.startLine,
84
+ endLine: span.endLine,
85
+ };
86
+ }
87
+ const calls = dependencyRefs(graph, node, executionKinds, dependencyLimit, includeExternal);
88
+ if (calls.length > 0)
89
+ detail.calls = calls;
90
+ const types = dependencyRefs(graph, node, typeKinds, dependencyLimit, includeExternal);
91
+ if (types.length > 0)
92
+ detail.types = types;
93
+ const implementedBy = incomingDependencyRefs(graph, node, implementationKinds, dependencyLimit, includeExternal);
94
+ if (implementedBy.length > 0)
95
+ detail.implementedBy = implementedBy;
96
+ if (CONTAINER_KINDS.has(node.kind)) {
97
+ const list = members(graph, node, memberLimit);
98
+ if (list.length > 0)
99
+ detail.members = list;
100
+ }
101
+ if (node.kind === "variable" && detail.sourceSpan !== undefined) {
102
+ const list = objectLiteralMembers(graph.project, detail.sourceSpan, memberLimit);
103
+ if (list.length > 0)
104
+ detail.members = list;
105
+ }
106
+ if (signatureLiterals.length > 0)
107
+ detail.literals = signatureLiterals.slice(0, 6);
108
+ if (wantNeighbors) {
109
+ detail.dependsOn = refs(graph, graph.outgoing(node.id), "to", neighborLimit, includeExternal);
110
+ detail.dependedOnBy = refs(graph, graph.incoming(node.id), "from", neighborLimit, includeExternal);
111
+ }
112
+ nodes.push(detail);
113
+ }
114
+ return {
115
+ type: "details",
116
+ nodes,
117
+ next: (0, resultGuide_1.resultNext)("answer", "Selected signatures, members, dependencies, implementation candidates, and ranges are enough for a shape or reading-anchor answer."),
118
+ guide: (0, resultGuide_1.resultGuide)("Use signatures, members, calls, types, implementedBy, literals, and sourceSpan anchors as selected symbol facts."),
119
+ unknown,
120
+ };
121
+ }
122
+ /** The members a container owns (via `contains`), each with its own signature. */
123
+ function members(graph, node, limit) {
124
+ const out = [];
125
+ for (const edge of graph.outgoing(node.id)) {
126
+ if (edge.kind !== "contains")
127
+ continue;
128
+ const member = graph.node(edge.to);
129
+ if (member === undefined)
130
+ continue;
131
+ const m = {
132
+ name: member.qualifiedName ?? member.name,
133
+ kind: member.kind,
134
+ };
135
+ if (member.evidence?.startLine)
136
+ m.line = member.evidence.startLine;
137
+ const sig = signatureOf(graph.project, member);
138
+ if (sig !== undefined)
139
+ m.signature = sig;
140
+ const decorators = decoratorsOf(member);
141
+ if (decorators !== undefined)
142
+ m.decorators = decorators;
143
+ out.push(m);
144
+ if (out.length >= limit)
145
+ break;
146
+ }
147
+ return out;
148
+ }
149
+ function objectLiteralMembers(project, span, limit) {
150
+ if (span.endLine === undefined)
151
+ return [];
152
+ if (span.endLine - span.startLine > MAX_OBJECT_MEMBER_LINES)
153
+ return [];
154
+ const lines = fileLines(project, span.file);
155
+ if (lines === undefined)
156
+ return [];
157
+ const start = Math.max(0, span.startLine - 1);
158
+ const end = Math.min(lines.length - 1, span.endLine - 1);
159
+ const members = [];
160
+ let depth = 0;
161
+ let entered = false;
162
+ for (let i = start; i <= end; i++) {
163
+ const raw = lines[i] ?? "";
164
+ const text = stripStrings(raw);
165
+ const before = depth;
166
+ if (entered && before === 1) {
167
+ const member = objectMemberOf(raw, i + 1);
168
+ if (member !== undefined) {
169
+ members.push(member);
170
+ if (members.length >= limit)
171
+ break;
172
+ }
173
+ }
174
+ for (const char of text) {
175
+ if (char === "{") {
176
+ depth++;
177
+ entered = true;
178
+ }
179
+ else if (char === "}") {
180
+ depth = Math.max(0, depth - 1);
181
+ }
182
+ }
183
+ }
184
+ return members;
185
+ }
186
+ function objectMemberOf(line, lineNumber) {
187
+ const text = line.trim();
188
+ if (text === "" ||
189
+ text.startsWith("//") ||
190
+ text.startsWith("/*") ||
191
+ text.startsWith("*")) {
192
+ return undefined;
193
+ }
194
+ const property = /^(['"]?)([A-Za-z_$][\w$-]*)\1\s*\??\s*:/.exec(text);
195
+ if (property !== null) {
196
+ return {
197
+ name: property[2],
198
+ kind: "property",
199
+ line: lineNumber,
200
+ signature: signatureLine(text),
201
+ };
202
+ }
203
+ const method = /^(?:async\s+)?(?:get\s+|set\s+)?([A-Za-z_$][\w$-]*)\s*\(/.exec(text);
204
+ if (method !== null) {
205
+ return {
206
+ name: method[1],
207
+ kind: "method",
208
+ line: lineNumber,
209
+ signature: signatureLine(text),
210
+ };
211
+ }
212
+ return undefined;
213
+ }
214
+ function signatureLine(text) {
215
+ return text.replace(/\s+/g, " ").replace(/,$/, "");
216
+ }
217
+ function stripStrings(line) {
218
+ return line.replace(/\/\/.*$/, "").replace(/(['"`])(?:\\.|(?!\1).)*\1/g, "");
219
+ }
220
+ /** Map dependency edges to references on their far endpoint, dropping structure. */
221
+ function refs(graph, edges, end, limit, includeExternal) {
222
+ const ranked = [];
223
+ for (const edge of edges) {
224
+ if (STRUCTURAL_KINDS.has(edge.kind))
225
+ continue;
226
+ const other = graph.node(end === "to" ? edge.to : edge.from);
227
+ if (other === undefined)
228
+ continue;
229
+ if (!includeExternal && (0, pathPolicy_1.isExternalNode)(other))
230
+ continue;
231
+ const ref = {
232
+ id: other.id,
233
+ name: other.qualifiedName ?? other.name,
234
+ kind: other.kind,
235
+ file: other.file,
236
+ relation: edge.kind,
237
+ };
238
+ if (other.evidence?.startLine)
239
+ ref.line = other.evidence.startLine;
240
+ const evidence = edgeEvidenceOf(edge);
241
+ if (evidence !== undefined)
242
+ ref.evidence = evidence;
243
+ const aliases = (0, accessAliases_1.accessAliasesFor)(other, edgeEvidenceTextOf(edge));
244
+ if (aliases !== undefined)
245
+ ref.aliases = aliases;
246
+ ranked.push({ ref, rank: refRank(ref, edge) });
247
+ }
248
+ ranked.sort((a, b) => a.rank - b.rank);
249
+ const out = [];
250
+ for (const item of ranked) {
251
+ out.push(item.ref);
252
+ if (out.length >= limit)
253
+ break;
254
+ }
255
+ return out;
256
+ }
257
+ const executionKinds = new Set([
258
+ "calls",
259
+ "instantiates",
260
+ "accesses",
261
+ "renders",
262
+ ]);
263
+ const typeKinds = new Set(["type_ref", "extends", "implements", "overrides"]);
264
+ const implementationKinds = new Set(["implements", "overrides"]);
265
+ function dependencyRefs(graph, node, kinds, limit, includeExternal) {
266
+ const ranked = [];
267
+ for (const edge of graph.outgoing(node.id)) {
268
+ if (!kinds.has(edge.kind))
269
+ continue;
270
+ const other = graph.node(edge.to);
271
+ if (other === undefined || other.kind === "file")
272
+ continue;
273
+ if (!includeExternal && (0, pathPolicy_1.isExternalNode)(other))
274
+ continue;
275
+ const name = other.qualifiedName ?? other.name;
276
+ const ref = {
277
+ id: other.id,
278
+ name,
279
+ kind: other.kind,
280
+ file: other.file,
281
+ relation: edge.kind,
282
+ };
283
+ if (other.evidence?.startLine)
284
+ ref.line = other.evidence.startLine;
285
+ const evidence = edgeEvidenceOf(edge);
286
+ if (evidence !== undefined)
287
+ ref.evidence = evidence;
288
+ const aliases = (0, accessAliases_1.accessAliasesFor)(other, edgeEvidenceTextOf(edge));
289
+ if (aliases !== undefined)
290
+ ref.aliases = aliases;
291
+ ranked.push({
292
+ ref,
293
+ rank: refRank(ref, edge),
294
+ });
295
+ }
296
+ ranked.sort((a, b) => a.rank - b.rank);
297
+ const out = [];
298
+ const seen = new Set();
299
+ for (const item of ranked) {
300
+ const key = `${item.ref.relation}:${item.ref.id}`;
301
+ if (seen.has(key))
302
+ continue;
303
+ seen.add(key);
304
+ out.push(item.ref);
305
+ if (out.length >= limit)
306
+ break;
307
+ }
308
+ return out;
309
+ }
310
+ function incomingDependencyRefs(graph, node, kinds, limit, includeExternal) {
311
+ const ranked = [];
312
+ for (const edge of graph.incoming(node.id)) {
313
+ if (!kinds.has(edge.kind))
314
+ continue;
315
+ const other = graph.node(edge.from);
316
+ if (other === undefined || other.kind === "file")
317
+ continue;
318
+ if (!includeExternal && (0, pathPolicy_1.isExternalNode)(other))
319
+ continue;
320
+ const ref = {
321
+ id: other.id,
322
+ name: other.qualifiedName ?? other.name,
323
+ kind: other.kind,
324
+ file: other.file,
325
+ relation: edge.kind,
326
+ };
327
+ if (other.evidence?.startLine)
328
+ ref.line = other.evidence.startLine;
329
+ const evidence = edgeEvidenceOf(edge);
330
+ if (evidence !== undefined)
331
+ ref.evidence = evidence;
332
+ const aliases = (0, accessAliases_1.accessAliasesFor)(other, edgeEvidenceTextOf(edge));
333
+ if (aliases !== undefined)
334
+ ref.aliases = aliases;
335
+ ranked.push({
336
+ ref,
337
+ rank: refRank(ref, edge),
338
+ });
339
+ }
340
+ ranked.sort((a, b) => a.rank - b.rank);
341
+ const out = [];
342
+ const seen = new Set();
343
+ for (const item of ranked) {
344
+ const key = `${item.ref.relation}:${item.ref.id}`;
345
+ if (seen.has(key))
346
+ continue;
347
+ seen.add(key);
348
+ out.push(item.ref);
349
+ if (out.length >= limit)
350
+ break;
351
+ }
352
+ return out;
353
+ }
354
+ function literalSummaries(text) {
355
+ if (text === undefined)
356
+ return [];
357
+ const out = [];
358
+ for (const match of text.matchAll(/(["'`])((?:\\.|(?!\1).){1,80})\1/g)) {
359
+ const value = cleanLiteral(match[2]);
360
+ if (value !== undefined && !out.includes(value))
361
+ out.push(value);
362
+ if (out.length >= 20)
363
+ break;
364
+ }
365
+ return out;
366
+ }
367
+ function cleanLiteral(value) {
368
+ const text = value?.replace(/\s+/g, " ").trim();
369
+ if (text === undefined ||
370
+ text === "" ||
371
+ text.length > 40 ||
372
+ /^[{}()[\],.:;]+$/.test(text)) {
373
+ return undefined;
374
+ }
375
+ return text;
376
+ }
377
+ function bound(value, fallback, min, max) {
378
+ const n = value === undefined || !Number.isFinite(value) ? fallback : value;
379
+ return Math.max(min, Math.min(max, Math.floor(n)));
380
+ }
381
+ function refRank(ref, edge) {
382
+ return (edgeKindRank(edge.kind) * 100000 +
383
+ evidenceRank(edge) +
384
+ (ref.file.startsWith("bundled://") ? 20000 : 0));
385
+ }
386
+ function evidenceRank(edge) {
387
+ const line = edge.evidence?.startLine ?? 9999;
388
+ const col = edge.evidence?.startCol ?? 999;
389
+ return line * 100 + col;
390
+ }
391
+ function edgeKindRank(kind) {
392
+ switch (kind) {
393
+ case "calls":
394
+ return 0;
395
+ case "instantiates":
396
+ return 1;
397
+ case "accesses":
398
+ case "renders":
399
+ return 2;
400
+ case "tests":
401
+ return 3;
402
+ case "overrides":
403
+ case "decorates":
404
+ return 4;
405
+ case "extends":
406
+ case "implements":
407
+ return 5;
408
+ case "type_ref":
409
+ return 6;
410
+ default:
411
+ return 10;
412
+ }
413
+ }
414
+ /** Decorator facts already captured on a node, omitted when absent. */
415
+ function decoratorsOf(node) {
416
+ return node.decorators !== undefined && node.decorators.length > 0
417
+ ? node.decorators
418
+ : undefined;
419
+ }
420
+ /** Relationship evidence as public coordinates, omitted when absent. */
421
+ function edgeEvidenceOf(edge) {
422
+ return evidenceCoordinatesOf(edge.evidence);
423
+ }
424
+ function evidenceCoordinatesOf(evidence) {
425
+ if (evidence === undefined)
426
+ return undefined;
427
+ return {
428
+ file: evidence.file,
429
+ startLine: evidence.startLine,
430
+ ...(evidence.startCol !== undefined ? { startCol: evidence.startCol } : {}),
431
+ ...(evidence.endLine !== undefined ? { endLine: evidence.endLine } : {}),
432
+ ...(evidence.endCol !== undefined ? { endCol: evidence.endCol } : {}),
433
+ };
434
+ }
435
+ /** Source text is an internal alias hint, not part of the MCP evidence object. */
436
+ function edgeEvidenceTextOf(edge) {
437
+ const text = edge.evidence?.text;
438
+ return typeof text === "string" && text.length > 0 ? text : undefined;
439
+ }
440
+ /** Read a file's lines once, or undefined when it cannot be read. */
441
+ function fileLines(project, file) {
442
+ if (file === "")
443
+ return undefined;
444
+ try {
445
+ return node_fs_1.default.readFileSync(node_path_1.default.join(project, file), "utf8").split(/\r?\n/);
446
+ }
447
+ catch {
448
+ return undefined;
449
+ }
450
+ }
451
+ /**
452
+ * The declaration signature: the head of the declaration up to and including
453
+ * the line that opens its body (`{`), or the single declaration line when there
454
+ * is no brace, capped so a wrapped signature cannot run away.
455
+ */
456
+ function signatureOf(project, node) {
457
+ const evidence = node.evidence;
458
+ const lines = evidence === undefined ? undefined : fileLines(project, evidence.file);
459
+ if (lines === undefined || evidence === undefined)
460
+ return undefined;
461
+ const start = Math.max(0, evidence.startLine - 1);
462
+ const out = [];
463
+ for (let i = start; i < lines.length && out.length < MAX_SIGNATURE_LINES; i++) {
464
+ const line = lines[i];
465
+ if (line === undefined)
466
+ break;
467
+ out.push(line);
468
+ if (line.includes("{") || line.trimEnd().endsWith(";"))
469
+ break;
470
+ }
471
+ const text = out.join("\n").trim();
472
+ return text === "" ? undefined : text;
473
+ }
474
+ //# sourceMappingURL=runDetails.js.map