@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.
- package/README.md +22 -0
- package/lib/TtscGraphApplication.js +58 -22
- package/lib/TtscGraphApplication.js.map +1 -1
- package/lib/model/TtscGraphMemory.js +43 -4
- package/lib/model/TtscGraphMemory.js.map +1 -1
- package/lib/model/loadGraph.js +17 -17
- package/lib/server/accessAliases.js +53 -0
- package/lib/server/accessAliases.js.map +1 -0
- package/lib/server/createServer.js +1490 -657
- package/lib/server/createServer.js.map +1 -1
- package/lib/server/instructions.js +81 -21
- package/lib/server/instructions.js.map +1 -1
- package/lib/server/pathPolicy.js +35 -0
- package/lib/server/pathPolicy.js.map +1 -0
- package/lib/server/resultGuide.js +16 -0
- package/lib/server/resultGuide.js.map +1 -0
- package/lib/server/runDetails.js +474 -0
- package/lib/server/runDetails.js.map +1 -0
- package/lib/server/{runIndex.js → runEntrypoints.js} +92 -28
- package/lib/server/runEntrypoints.js.map +1 -0
- package/lib/server/runLookup.js +246 -0
- package/lib/server/runLookup.js.map +1 -0
- package/lib/server/runOverview.js +44 -27
- package/lib/server/runOverview.js.map +1 -1
- package/lib/server/runTour.js +737 -0
- package/lib/server/runTour.js.map +1 -0
- package/lib/server/runTrace.js +224 -43
- package/lib/server/runTrace.js.map +1 -1
- package/lib/structures/ITtscGraphDetails.js +3 -0
- package/lib/structures/ITtscGraphDetails.js.map +1 -0
- package/lib/structures/ITtscGraphEntrypoints.js +3 -0
- package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
- package/lib/structures/{ITtscGraphExpand.js → ITtscGraphEscape.js} +1 -1
- package/lib/structures/ITtscGraphEscape.js.map +1 -0
- package/lib/structures/ITtscGraphLookup.js +3 -0
- package/lib/structures/ITtscGraphLookup.js.map +1 -0
- package/lib/structures/{ITtscGraphIndex.js → ITtscGraphNext.js} +1 -1
- package/lib/structures/ITtscGraphNext.js.map +1 -0
- package/lib/structures/{ITtscGraphQuery.js → ITtscGraphTour.js} +1 -1
- package/lib/structures/ITtscGraphTour.js.map +1 -0
- package/lib/structures/index.js +6 -3
- package/lib/structures/index.js.map +1 -1
- package/package.json +2 -2
- package/src/TtscGraphApplication.ts +70 -30
- package/src/model/TtscGraphMemory.ts +46 -4
- package/src/server/accessAliases.ts +55 -0
- package/src/server/createServer.ts +4 -7
- package/src/server/instructions.ts +81 -21
- package/src/server/pathPolicy.ts +43 -0
- package/src/server/resultGuide.ts +20 -0
- package/src/server/runDetails.ts +553 -0
- package/src/server/{runIndex.ts → runEntrypoints.ts} +116 -36
- package/src/server/runLookup.ts +284 -0
- package/src/server/runOverview.ts +59 -31
- package/src/server/runTour.ts +881 -0
- package/src/server/runTrace.ts +299 -45
- package/src/structures/ITtscGraphApplication.ts +75 -56
- package/src/structures/ITtscGraphDecorator.ts +12 -14
- package/src/structures/ITtscGraphDetails.ts +197 -0
- package/src/structures/ITtscGraphEntrypoints.ts +149 -0
- package/src/structures/ITtscGraphEscape.ts +49 -0
- package/src/structures/ITtscGraphEvidence.ts +5 -8
- package/src/structures/ITtscGraphLookup.ts +82 -0
- package/src/structures/ITtscGraphNext.ts +23 -0
- package/src/structures/ITtscGraphNode.ts +10 -4
- package/src/structures/ITtscGraphOverview.ts +41 -18
- package/src/structures/ITtscGraphTour.ts +150 -0
- package/src/structures/ITtscGraphTrace.ts +93 -13
- package/src/structures/TtscGraphNodeKind.ts +2 -2
- package/src/structures/index.ts +6 -3
- package/lib/server/runExpand.js +0 -177
- package/lib/server/runExpand.js.map +0 -1
- package/lib/server/runIndex.js.map +0 -1
- package/lib/server/runQuery.js +0 -147
- package/lib/server/runQuery.js.map +0 -1
- package/lib/structures/ITtscGraphExpand.js.map +0 -1
- package/lib/structures/ITtscGraphIndex.js.map +0 -1
- package/lib/structures/ITtscGraphQuery.js.map +0 -1
- package/src/server/runExpand.ts +0 -186
- package/src/server/runQuery.ts +0 -150
- package/src/structures/ITtscGraphExpand.ts +0 -85
- package/src/structures/ITtscGraphIndex.ts +0 -100
- package/src/structures/ITtscGraphQuery.ts +0 -49
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oEAAoE;AACpE,iEAG4C;AAC5C,kDAA0B;AAE1B,kEAAgF;AAGhF,iDAA8C;AAE9C;;;;;;;;;;;;;GAaG;AACH,sBACE,KAAsB,EACtB,OAAe;IAEf,MAAM,UAAU;;gBACd,OAAO;mBACP,IAAI,2CAAoB,CAAC,KAAK,CAAC
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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
|