@grafema/util 0.3.0-beta
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/LICENSE +190 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +212 -0
- package/dist/api/GraphAPI.js.map +1 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +290 -0
- package/dist/api/GuaranteeAPI.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +214 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +441 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +199 -0
- package/dist/core/CoverageAnalyzer.js.map +1 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +140 -0
- package/dist/core/FileExplainer.js.map +1 -0
- package/dist/core/FileOverview.d.ts +124 -0
- package/dist/core/FileOverview.d.ts.map +1 -0
- package/dist/core/FileOverview.js +279 -0
- package/dist/core/FileOverview.js.map +1 -0
- package/dist/core/GrafemaUri.d.ts +66 -0
- package/dist/core/GrafemaUri.d.ts.map +1 -0
- package/dist/core/GrafemaUri.js +191 -0
- package/dist/core/GrafemaUri.js.map +1 -0
- package/dist/core/GraphBackend.d.ts +158 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GraphBackend.js.map +1 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +104 -0
- package/dist/core/GraphFreshnessChecker.js.map +1 -0
- package/dist/core/GuaranteeManager.d.ts +254 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +447 -0
- package/dist/core/GuaranteeManager.js.map +1 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +46 -0
- package/dist/core/HashUtils.js.map +1 -0
- package/dist/core/IncrementalReanalyzer.d.ts +33 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +67 -0
- package/dist/core/IncrementalReanalyzer.js.map +1 -0
- package/dist/core/ResourceRegistry.d.ts +17 -0
- package/dist/core/ResourceRegistry.d.ts.map +1 -0
- package/dist/core/ResourceRegistry.js +32 -0
- package/dist/core/ResourceRegistry.js.map +1 -0
- package/dist/core/SemanticId.d.ts +159 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +291 -0
- package/dist/core/SemanticId.js.map +1 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +239 -0
- package/dist/core/VersionManager.js.map +1 -0
- package/dist/core/brandNodeInternal.d.ts +14 -0
- package/dist/core/brandNodeInternal.d.ts.map +1 -0
- package/dist/core/brandNodeInternal.js +4 -0
- package/dist/core/brandNodeInternal.js.map +1 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +118 -0
- package/dist/core/nodes/GuaranteeNode.js.map +1 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +130 -0
- package/dist/core/nodes/IssueNode.js.map +1 -0
- package/dist/core/nodes/NodeKind.d.ts +104 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +166 -0
- package/dist/core/nodes/NodeKind.js.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +133 -0
- package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +300 -0
- package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +44 -0
- package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
- package/dist/diagnostics/categories.d.ts +57 -0
- package/dist/diagnostics/categories.d.ts.map +1 -0
- package/dist/diagnostics/categories.js +71 -0
- package/dist/diagnostics/categories.js.map +1 -0
- package/dist/diagnostics/index.d.ts +17 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +15 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/errors/GrafemaError.d.ts +200 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +209 -0
- package/dist/errors/GrafemaError.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.d.ts +8 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +20 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/onboarding.md +133 -0
- package/dist/knowledge/KnowledgeBase.d.ts +113 -0
- package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeBase.js +420 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.js +160 -0
- package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
- package/dist/knowledge/git-ingest.d.ts +58 -0
- package/dist/knowledge/git-ingest.d.ts.map +1 -0
- package/dist/knowledge/git-ingest.js +301 -0
- package/dist/knowledge/git-ingest.js.map +1 -0
- package/dist/knowledge/git-queries.d.ts +86 -0
- package/dist/knowledge/git-queries.d.ts.map +1 -0
- package/dist/knowledge/git-queries.js +177 -0
- package/dist/knowledge/git-queries.js.map +1 -0
- package/dist/knowledge/index.d.ts +14 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +10 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parser.d.ts +39 -0
- package/dist/knowledge/parser.d.ts.map +1 -0
- package/dist/knowledge/parser.js +292 -0
- package/dist/knowledge/parser.js.map +1 -0
- package/dist/knowledge/types.d.ts +133 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +8 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/logging/Logger.d.ts +98 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +274 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/notation/archetypes.d.ts +36 -0
- package/dist/notation/archetypes.d.ts.map +1 -0
- package/dist/notation/archetypes.js +173 -0
- package/dist/notation/archetypes.js.map +1 -0
- package/dist/notation/fold.d.ts +25 -0
- package/dist/notation/fold.d.ts.map +1 -0
- package/dist/notation/fold.js +598 -0
- package/dist/notation/fold.js.map +1 -0
- package/dist/notation/index.d.ts +18 -0
- package/dist/notation/index.d.ts.map +1 -0
- package/dist/notation/index.js +16 -0
- package/dist/notation/index.js.map +1 -0
- package/dist/notation/lodExtractor.d.ts +32 -0
- package/dist/notation/lodExtractor.d.ts.map +1 -0
- package/dist/notation/lodExtractor.js +149 -0
- package/dist/notation/lodExtractor.js.map +1 -0
- package/dist/notation/nameShortener.d.ts +22 -0
- package/dist/notation/nameShortener.d.ts.map +1 -0
- package/dist/notation/nameShortener.js +24 -0
- package/dist/notation/nameShortener.js.map +1 -0
- package/dist/notation/perspectives.d.ts +11 -0
- package/dist/notation/perspectives.d.ts.map +1 -0
- package/dist/notation/perspectives.js +16 -0
- package/dist/notation/perspectives.js.map +1 -0
- package/dist/notation/renderer.d.ts +31 -0
- package/dist/notation/renderer.d.ts.map +1 -0
- package/dist/notation/renderer.js +315 -0
- package/dist/notation/renderer.js.map +1 -0
- package/dist/notation/traceRenderer.d.ts +39 -0
- package/dist/notation/traceRenderer.d.ts.map +1 -0
- package/dist/notation/traceRenderer.js +358 -0
- package/dist/notation/traceRenderer.js.map +1 -0
- package/dist/notation/types.d.ts +66 -0
- package/dist/notation/types.d.ts.map +1 -0
- package/dist/notation/types.js +10 -0
- package/dist/notation/types.js.map +1 -0
- package/dist/queries/NodeContext.d.ts +81 -0
- package/dist/queries/NodeContext.d.ts.map +1 -0
- package/dist/queries/NodeContext.js +196 -0
- package/dist/queries/NodeContext.js.map +1 -0
- package/dist/queries/findCallsInFunction.d.ts +62 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +169 -0
- package/dist/queries/findCallsInFunction.js.map +1 -0
- package/dist/queries/findContainingFunction.d.ts +57 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +91 -0
- package/dist/queries/findContainingFunction.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +14 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/traceDataflow.d.ts +65 -0
- package/dist/queries/traceDataflow.d.ts.map +1 -0
- package/dist/queries/traceDataflow.js +754 -0
- package/dist/queries/traceDataflow.js.map +1 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +373 -0
- package/dist/queries/traceValues.js.map +1 -0
- package/dist/queries/types.d.ts +166 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +10 -0
- package/dist/queries/types.js.map +1 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +125 -0
- package/dist/schema/GraphSchemaExtractor.js.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +113 -0
- package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +748 -0
- package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +141 -0
- package/dist/storage/backends/typeValidation.js.map +1 -0
- package/dist/utils/findRfdbBinary.d.ts +67 -0
- package/dist/utils/findRfdbBinary.d.ts.map +1 -0
- package/dist/utils/findRfdbBinary.js +261 -0
- package/dist/utils/findRfdbBinary.js.map +1 -0
- package/dist/utils/lazyDownload.d.ts +43 -0
- package/dist/utils/lazyDownload.d.ts.map +1 -0
- package/dist/utils/lazyDownload.js +175 -0
- package/dist/utils/lazyDownload.js.map +1 -0
- package/dist/utils/moduleResolution.d.ts +134 -0
- package/dist/utils/moduleResolution.d.ts.map +1 -0
- package/dist/utils/moduleResolution.js +189 -0
- package/dist/utils/moduleResolution.js.map +1 -0
- package/dist/utils/resolveNodeFile.d.ts +13 -0
- package/dist/utils/resolveNodeFile.d.ts.map +1 -0
- package/dist/utils/resolveNodeFile.js +18 -0
- package/dist/utils/resolveNodeFile.js.map +1 -0
- package/dist/utils/startRfdbServer.d.ts +63 -0
- package/dist/utils/startRfdbServer.d.ts.map +1 -0
- package/dist/utils/startRfdbServer.js +142 -0
- package/dist/utils/startRfdbServer.js.map +1 -0
- package/dist/validation/PathValidator.d.ts +80 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +252 -0
- package/dist/validation/PathValidator.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/src/api/GraphAPI.ts +307 -0
- package/src/api/GuaranteeAPI.ts +402 -0
- package/src/config/ConfigLoader.ts +653 -0
- package/src/config/index.ts +13 -0
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileOverview.ts +397 -0
- package/src/core/GrafemaUri.ts +216 -0
- package/src/core/GraphBackend.ts +266 -0
- package/src/core/GraphFreshnessChecker.ts +145 -0
- package/src/core/GuaranteeManager.ts +684 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +106 -0
- package/src/core/ResourceRegistry.ts +39 -0
- package/src/core/SemanticId.ts +423 -0
- package/src/core/VersionManager.ts +405 -0
- package/src/core/brandNodeInternal.ts +16 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/NodeKind.ts +192 -0
- package/src/diagnostics/DiagnosticCollector.ts +170 -0
- package/src/diagnostics/DiagnosticReporter.ts +395 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/categories.ts +104 -0
- package/src/diagnostics/index.ts +30 -0
- package/src/errors/GrafemaError.ts +297 -0
- package/src/index.ts +261 -0
- package/src/instructions/index.ts +21 -0
- package/src/instructions/onboarding.md +133 -0
- package/src/knowledge/KnowledgeBase.ts +486 -0
- package/src/knowledge/SemanticAddressResolver.ts +191 -0
- package/src/knowledge/git-ingest.ts +402 -0
- package/src/knowledge/git-queries.ts +269 -0
- package/src/knowledge/index.ts +29 -0
- package/src/knowledge/parser.ts +294 -0
- package/src/knowledge/types.ts +146 -0
- package/src/logging/Logger.ts +303 -0
- package/src/notation/archetypes.ts +189 -0
- package/src/notation/fold.ts +696 -0
- package/src/notation/index.ts +27 -0
- package/src/notation/lodExtractor.ts +177 -0
- package/src/notation/nameShortener.ts +24 -0
- package/src/notation/perspectives.ts +18 -0
- package/src/notation/renderer.ts +394 -0
- package/src/notation/traceRenderer.ts +458 -0
- package/src/notation/types.ts +79 -0
- package/src/queries/NodeContext.ts +280 -0
- package/src/queries/findCallsInFunction.ts +249 -0
- package/src/queries/findContainingFunction.ts +124 -0
- package/src/queries/index.ts +44 -0
- package/src/queries/traceDataflow.ts +838 -0
- package/src/queries/traceValues.ts +531 -0
- package/src/queries/types.ts +191 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +895 -0
- package/src/storage/backends/typeValidation.ts +154 -0
- package/src/utils/findRfdbBinary.ts +288 -0
- package/src/utils/lazyDownload.ts +206 -0
- package/src/utils/moduleResolution.ts +271 -0
- package/src/utils/resolveNodeFile.ts +18 -0
- package/src/utils/startRfdbServer.ts +197 -0
- package/src/validation/PathValidator.ts +334 -0
- package/src/version.ts +28 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileOverview - Get a structured overview of all entities in a file.
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Show what a file contains and how its parts relate to each other.
|
|
5
|
+
* Unlike FileExplainer (which lists ALL nodes flat), FileOverview shows only
|
|
6
|
+
* meaningful entities (functions, classes, variables) with their key relationships
|
|
7
|
+
* (calls, extends, assigned-from).
|
|
8
|
+
*
|
|
9
|
+
* Unlike the context command (which shows ONE node's full neighborhood),
|
|
10
|
+
* FileOverview shows ALL entities at file level with curated edges.
|
|
11
|
+
*
|
|
12
|
+
* Use this when:
|
|
13
|
+
* - AI agent needs to understand a file before diving deeper
|
|
14
|
+
* - User wants a table-of-contents of a file with relationships
|
|
15
|
+
* - Quick orientation before using get_context on specific nodes
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const overview = new FileOverview(backend);
|
|
20
|
+
* const result = await overview.getOverview('/abs/path/to/file.js');
|
|
21
|
+
* // result.functions[0].calls -> ["express", "Router"]
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see REG-412
|
|
25
|
+
*/
|
|
26
|
+
import { findCallsInFunction } from '../queries/findCallsInFunction.js';
|
|
27
|
+
/** Node types we display in the file overview */
|
|
28
|
+
const OVERVIEW_NODE_TYPES = new Set([
|
|
29
|
+
'FUNCTION',
|
|
30
|
+
'CLASS',
|
|
31
|
+
'METHOD',
|
|
32
|
+
'VARIABLE',
|
|
33
|
+
'CONSTANT',
|
|
34
|
+
'IMPORT',
|
|
35
|
+
'EXPORT',
|
|
36
|
+
]);
|
|
37
|
+
export class FileOverview {
|
|
38
|
+
graph;
|
|
39
|
+
constructor(graph) {
|
|
40
|
+
this.graph = graph;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get structured overview of a file's entities and relationships.
|
|
44
|
+
*
|
|
45
|
+
* @param filePath - Absolute file path (after realpath resolution)
|
|
46
|
+
* @param options - Optional: { includeEdges: boolean }
|
|
47
|
+
* @returns FileOverviewResult
|
|
48
|
+
*/
|
|
49
|
+
async getOverview(filePath, options = {}) {
|
|
50
|
+
const { includeEdges = true } = options;
|
|
51
|
+
const moduleNode = await this.findModuleNode(filePath);
|
|
52
|
+
if (!moduleNode) {
|
|
53
|
+
return {
|
|
54
|
+
file: filePath,
|
|
55
|
+
status: 'NOT_ANALYZED',
|
|
56
|
+
imports: [],
|
|
57
|
+
exports: [],
|
|
58
|
+
classes: [],
|
|
59
|
+
functions: [],
|
|
60
|
+
variables: [],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const children = await this.getTopLevelEntities(moduleNode.id);
|
|
64
|
+
const imports = [];
|
|
65
|
+
const exports = [];
|
|
66
|
+
const classes = [];
|
|
67
|
+
const functions = [];
|
|
68
|
+
const variables = [];
|
|
69
|
+
for (const child of children) {
|
|
70
|
+
switch (child.type) {
|
|
71
|
+
case 'IMPORT':
|
|
72
|
+
imports.push(this.buildImportInfo(child));
|
|
73
|
+
break;
|
|
74
|
+
case 'EXPORT':
|
|
75
|
+
exports.push(this.buildExportInfo(child));
|
|
76
|
+
break;
|
|
77
|
+
case 'CLASS':
|
|
78
|
+
classes.push(await this.buildClassOverview(child, includeEdges));
|
|
79
|
+
break;
|
|
80
|
+
case 'FUNCTION':
|
|
81
|
+
case 'METHOD':
|
|
82
|
+
functions.push(await this.buildFunctionOverview(child, includeEdges));
|
|
83
|
+
break;
|
|
84
|
+
case 'VARIABLE':
|
|
85
|
+
case 'CONSTANT':
|
|
86
|
+
variables.push(await this.buildVariableOverview(child, includeEdges));
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const byLine = (a, b) => (a.line ?? 0) - (b.line ?? 0);
|
|
91
|
+
classes.sort(byLine);
|
|
92
|
+
functions.sort(byLine);
|
|
93
|
+
variables.sort(byLine);
|
|
94
|
+
return {
|
|
95
|
+
file: filePath,
|
|
96
|
+
status: 'ANALYZED',
|
|
97
|
+
imports,
|
|
98
|
+
exports,
|
|
99
|
+
classes,
|
|
100
|
+
functions,
|
|
101
|
+
variables,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Find the MODULE node for the given file path.
|
|
106
|
+
* Complexity: O(1) - server-side filtered query
|
|
107
|
+
*/
|
|
108
|
+
async findModuleNode(filePath) {
|
|
109
|
+
const filter = { file: filePath, type: 'MODULE' };
|
|
110
|
+
for await (const node of this.graph.queryNodes(filter)) {
|
|
111
|
+
if (node.file === filePath && node.type === 'MODULE') {
|
|
112
|
+
return node;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get direct children of MODULE node that are "interesting" types.
|
|
119
|
+
* Complexity: O(C) where C = total CONTAINS edges from MODULE
|
|
120
|
+
*/
|
|
121
|
+
async getTopLevelEntities(moduleId) {
|
|
122
|
+
const containsEdges = await this.graph.getOutgoingEdges(moduleId, ['CONTAINS']);
|
|
123
|
+
const entities = [];
|
|
124
|
+
for (const edge of containsEdges) {
|
|
125
|
+
const child = await this.graph.getNode(edge.dst);
|
|
126
|
+
if (child && OVERVIEW_NODE_TYPES.has(child.type)) {
|
|
127
|
+
entities.push(child);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return entities;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build ImportInfo from an IMPORT node.
|
|
134
|
+
* Data read directly from node record fields.
|
|
135
|
+
* Complexity: O(1)
|
|
136
|
+
*/
|
|
137
|
+
buildImportInfo(node) {
|
|
138
|
+
const source = node.source ?? (node.name || '');
|
|
139
|
+
const rawSpecifiers = node.specifiers;
|
|
140
|
+
let specifierNames = [];
|
|
141
|
+
if (Array.isArray(rawSpecifiers)) {
|
|
142
|
+
specifierNames = rawSpecifiers.map((s) => s.local || s.imported || 'unknown');
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
id: node.id,
|
|
146
|
+
source,
|
|
147
|
+
specifiers: specifierNames,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Build ExportInfo from an EXPORT node.
|
|
152
|
+
* Data read directly from node record fields.
|
|
153
|
+
* Complexity: O(1)
|
|
154
|
+
*/
|
|
155
|
+
buildExportInfo(node) {
|
|
156
|
+
return {
|
|
157
|
+
id: node.id,
|
|
158
|
+
name: node.exportedName ?? node.name ?? '<anonymous>',
|
|
159
|
+
isDefault: node.isDefault ?? false,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build FunctionOverview from a FUNCTION node.
|
|
164
|
+
* When includeEdges=true, resolves calls via findCallsInFunction.
|
|
165
|
+
* Complexity: Without edges O(1), with edges O(S + C)
|
|
166
|
+
*/
|
|
167
|
+
async buildFunctionOverview(node, includeEdges) {
|
|
168
|
+
const overview = {
|
|
169
|
+
id: node.id,
|
|
170
|
+
name: node.name ?? '<anonymous>',
|
|
171
|
+
line: node.line,
|
|
172
|
+
async: node.async ?? false,
|
|
173
|
+
params: node.params,
|
|
174
|
+
calls: [],
|
|
175
|
+
returnType: node.returnType,
|
|
176
|
+
signature: node.signature,
|
|
177
|
+
};
|
|
178
|
+
if (includeEdges) {
|
|
179
|
+
const callInfos = await findCallsInFunction(this.graph, node.id, { transitive: false });
|
|
180
|
+
const callNames = new Set();
|
|
181
|
+
for (const call of callInfos) {
|
|
182
|
+
if (call.resolved && call.target) {
|
|
183
|
+
callNames.add(call.target.name);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
callNames.add(call.name);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Fallback: when HAS_SCOPE edges are missing (orchestrator doesn't create
|
|
190
|
+
// FUNCTION → HAS_SCOPE), find CALL nodes by file + line range.
|
|
191
|
+
if (callNames.size === 0 && node.file && node.line != null) {
|
|
192
|
+
const endLine = node.endLine ?? node.line + 100000;
|
|
193
|
+
const nodeLine = node.line;
|
|
194
|
+
const filter = { file: node.file, type: 'CALL' };
|
|
195
|
+
for await (const callNode of this.graph.queryNodes(filter)) {
|
|
196
|
+
const callLine = callNode.line;
|
|
197
|
+
if (callLine != null && callLine >= nodeLine && callLine <= endLine) {
|
|
198
|
+
const callsEdges = await this.graph.getOutgoingEdges(callNode.id, ['CALLS']);
|
|
199
|
+
if (callsEdges.length > 0) {
|
|
200
|
+
const target = await this.graph.getNode(callsEdges[0].dst);
|
|
201
|
+
if (target) {
|
|
202
|
+
callNames.add(target.name ?? callNode.name ?? '<unknown>');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
callNames.add(callNode.name ?? '<unknown>');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
overview.calls = Array.from(callNames);
|
|
212
|
+
}
|
|
213
|
+
return overview;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Build ClassOverview from a CLASS node.
|
|
217
|
+
* Fetches EXTENDS edge and methods via CONTAINS.
|
|
218
|
+
* Complexity: Without edges O(M), with edges O(M * (S + C))
|
|
219
|
+
*/
|
|
220
|
+
async buildClassOverview(node, includeEdges) {
|
|
221
|
+
const overview = {
|
|
222
|
+
id: node.id,
|
|
223
|
+
name: node.name ?? '<anonymous>',
|
|
224
|
+
line: node.line,
|
|
225
|
+
exported: node.exported ?? false,
|
|
226
|
+
methods: [],
|
|
227
|
+
};
|
|
228
|
+
// Get superclass
|
|
229
|
+
if (includeEdges) {
|
|
230
|
+
const extendsEdges = await this.graph.getOutgoingEdges(node.id, ['EXTENDS']);
|
|
231
|
+
if (extendsEdges.length > 0) {
|
|
232
|
+
const superNode = await this.graph.getNode(extendsEdges[0].dst);
|
|
233
|
+
overview.extends = superNode?.name ?? node.superClass;
|
|
234
|
+
}
|
|
235
|
+
else if (node.superClass) {
|
|
236
|
+
overview.extends = node.superClass;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (node.superClass) {
|
|
240
|
+
overview.extends = node.superClass;
|
|
241
|
+
}
|
|
242
|
+
// Get methods via CONTAINS or HAS_METHOD edges
|
|
243
|
+
const containsEdges = await this.graph.getOutgoingEdges(node.id, ['CONTAINS', 'HAS_METHOD']);
|
|
244
|
+
for (const edge of containsEdges) {
|
|
245
|
+
const child = await this.graph.getNode(edge.dst);
|
|
246
|
+
if (!child)
|
|
247
|
+
continue;
|
|
248
|
+
if (child.type === 'FUNCTION' || child.type === 'METHOD') {
|
|
249
|
+
const methodOverview = await this.buildFunctionOverview(child, includeEdges);
|
|
250
|
+
overview.methods.push(methodOverview);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
overview.methods.sort((a, b) => (a.line ?? 0) - (b.line ?? 0));
|
|
254
|
+
return overview;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Build VariableOverview from a VARIABLE or CONSTANT node.
|
|
258
|
+
* Complexity: Without edges O(1), with edges O(1)
|
|
259
|
+
*/
|
|
260
|
+
async buildVariableOverview(node, includeEdges) {
|
|
261
|
+
const overview = {
|
|
262
|
+
id: node.id,
|
|
263
|
+
name: node.name ?? '<anonymous>',
|
|
264
|
+
line: node.line,
|
|
265
|
+
kind: node.kind ?? 'const',
|
|
266
|
+
};
|
|
267
|
+
if (includeEdges) {
|
|
268
|
+
const assignedEdges = await this.graph.getOutgoingEdges(node.id, ['ASSIGNED_FROM']);
|
|
269
|
+
if (assignedEdges.length > 0) {
|
|
270
|
+
const sourceNode = await this.graph.getNode(assignedEdges[0].dst);
|
|
271
|
+
if (sourceNode) {
|
|
272
|
+
overview.assignedFrom = sourceNode.name ?? sourceNode.type;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return overview;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=FileOverview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileOverview.js","sourceRoot":"","sources":["../../src/core/FileOverview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GrafemaUri -- conversion between compact semantic IDs and grafema:// URIs.
|
|
3
|
+
*
|
|
4
|
+
* URI format: grafema://{authority}/{file}#{encoded_fragment}
|
|
5
|
+
* Virtual nodes: grafema://{authority}/_/{encoded_full_id}
|
|
6
|
+
* Module nodes: grafema://{authority}/{file}#MODULE
|
|
7
|
+
*
|
|
8
|
+
* Fragment encoding: only > [ ] # need percent-encoding.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Check if a string is a grafema:// URI.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isGrafemaUri(str: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Encode a fragment string for grafema:// URIs.
|
|
16
|
+
* Only 4 chars need percent-encoding: > [ ] #
|
|
17
|
+
*/
|
|
18
|
+
export declare function encodeFragment(raw: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Decode a percent-encoded fragment back to raw string.
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodeFragment(encoded: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Convert a compact semantic ID to a grafema:// URI.
|
|
25
|
+
*
|
|
26
|
+
* @param compactId - Compact format: "file->TYPE->name[in:p,h:x]#N", "MODULE#file", "EXTERNAL_MODULE->x"
|
|
27
|
+
* @param authority - URI authority: "github.com/owner/repo" or "localhost/project"
|
|
28
|
+
* @returns grafema:// URI string
|
|
29
|
+
*/
|
|
30
|
+
export declare function toGrafemaUri(compactId: string, authority: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Parsed grafema:// URI components.
|
|
33
|
+
*/
|
|
34
|
+
export interface ParsedGrafemaUri {
|
|
35
|
+
/** URI authority, e.g. "github.com/owner/repo" */
|
|
36
|
+
authority: string;
|
|
37
|
+
/** File path within the project, or empty for virtual nodes */
|
|
38
|
+
filePath: string;
|
|
39
|
+
/** Decoded symbol part (the fragment, decoded) */
|
|
40
|
+
symbolPart: string;
|
|
41
|
+
/** Reconstructed compact semantic ID */
|
|
42
|
+
semanticId: string;
|
|
43
|
+
/** Whether this is a virtual node (uses _/ path) */
|
|
44
|
+
isVirtual: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a grafema:// URI into components.
|
|
48
|
+
*
|
|
49
|
+
* @returns Parsed components or null if not a valid grafema:// URI
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseGrafemaUri(uri: string): ParsedGrafemaUri | null;
|
|
52
|
+
/**
|
|
53
|
+
* Convert a grafema:// URI to compact semantic ID format.
|
|
54
|
+
* Convenience wrapper around parseGrafemaUri.
|
|
55
|
+
*
|
|
56
|
+
* @returns Compact semantic ID or the input unchanged if not a grafema:// URI
|
|
57
|
+
*/
|
|
58
|
+
export declare function toCompactSemanticId(uri: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Normalize a semantic ID input -- accepts either URI or compact format.
|
|
61
|
+
* If it's a URI, converts to compact. If already compact, returns as-is.
|
|
62
|
+
*
|
|
63
|
+
* Useful in MCP handlers that need to accept both formats.
|
|
64
|
+
*/
|
|
65
|
+
export declare function normalizeSemanticId(input: string): string;
|
|
66
|
+
//# sourceMappingURL=GrafemaUri.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrafemaUri.d.ts","sourceRoot":"","sources":["../../src/core/GrafemaUri.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA4BzE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAkFpE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GrafemaUri -- conversion between compact semantic IDs and grafema:// URIs.
|
|
3
|
+
*
|
|
4
|
+
* URI format: grafema://{authority}/{file}#{encoded_fragment}
|
|
5
|
+
* Virtual nodes: grafema://{authority}/_/{encoded_full_id}
|
|
6
|
+
* Module nodes: grafema://{authority}/{file}#MODULE
|
|
7
|
+
*
|
|
8
|
+
* Fragment encoding: only > [ ] # need percent-encoding.
|
|
9
|
+
*/
|
|
10
|
+
const GRAFEMA_SCHEME = 'grafema://';
|
|
11
|
+
/**
|
|
12
|
+
* Check if a string is a grafema:// URI.
|
|
13
|
+
*/
|
|
14
|
+
export function isGrafemaUri(str) {
|
|
15
|
+
return str.startsWith(GRAFEMA_SCHEME);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Encode a fragment string for grafema:// URIs.
|
|
19
|
+
* Only 4 chars need percent-encoding: > [ ] #
|
|
20
|
+
*/
|
|
21
|
+
export function encodeFragment(raw) {
|
|
22
|
+
let out = '';
|
|
23
|
+
for (let i = 0; i < raw.length; i++) {
|
|
24
|
+
const ch = raw[i];
|
|
25
|
+
switch (ch) {
|
|
26
|
+
case '>':
|
|
27
|
+
out += '%3E';
|
|
28
|
+
break;
|
|
29
|
+
case '[':
|
|
30
|
+
out += '%5B';
|
|
31
|
+
break;
|
|
32
|
+
case ']':
|
|
33
|
+
out += '%5D';
|
|
34
|
+
break;
|
|
35
|
+
case '#':
|
|
36
|
+
out += '%23';
|
|
37
|
+
break;
|
|
38
|
+
default: out += ch;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Decode a percent-encoded fragment back to raw string.
|
|
45
|
+
*/
|
|
46
|
+
export function decodeFragment(encoded) {
|
|
47
|
+
return encoded
|
|
48
|
+
.replaceAll('%3E', '>')
|
|
49
|
+
.replaceAll('%3e', '>')
|
|
50
|
+
.replaceAll('%5B', '[')
|
|
51
|
+
.replaceAll('%5b', '[')
|
|
52
|
+
.replaceAll('%5D', ']')
|
|
53
|
+
.replaceAll('%5d', ']')
|
|
54
|
+
.replaceAll('%23', '#');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Convert a compact semantic ID to a grafema:// URI.
|
|
58
|
+
*
|
|
59
|
+
* @param compactId - Compact format: "file->TYPE->name[in:p,h:x]#N", "MODULE#file", "EXTERNAL_MODULE->x"
|
|
60
|
+
* @param authority - URI authority: "github.com/owner/repo" or "localhost/project"
|
|
61
|
+
* @returns grafema:// URI string
|
|
62
|
+
*/
|
|
63
|
+
export function toGrafemaUri(compactId, authority) {
|
|
64
|
+
// Case 1: MODULE#file
|
|
65
|
+
if (compactId.startsWith('MODULE#')) {
|
|
66
|
+
const file = compactId.slice(7); // len("MODULE#") = 7
|
|
67
|
+
return `${GRAFEMA_SCHEME}${authority}/${file}#MODULE`;
|
|
68
|
+
}
|
|
69
|
+
// Case 2 & 3: Check for file->REST pattern
|
|
70
|
+
const firstArrow = compactId.indexOf('->');
|
|
71
|
+
if (firstArrow !== -1) {
|
|
72
|
+
const beforeArrow = compactId.slice(0, firstArrow);
|
|
73
|
+
// Heuristic: file paths contain '/' or '.'
|
|
74
|
+
const isFilePath = beforeArrow.includes('/') || beforeArrow.includes('.');
|
|
75
|
+
if (isFilePath) {
|
|
76
|
+
// Standard node: file->REST
|
|
77
|
+
const file = beforeArrow;
|
|
78
|
+
const rest = compactId.slice(firstArrow + 2);
|
|
79
|
+
return `${GRAFEMA_SCHEME}${authority}/${file}#${encodeFragment(rest)}`;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Virtual node: encode the whole ID
|
|
83
|
+
return `${GRAFEMA_SCHEME}${authority}/_/${encodeFragment(compactId)}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// No arrow -- virtual node
|
|
87
|
+
return `${GRAFEMA_SCHEME}${authority}/_/${encodeFragment(compactId)}`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse a grafema:// URI into components.
|
|
91
|
+
*
|
|
92
|
+
* @returns Parsed components or null if not a valid grafema:// URI
|
|
93
|
+
*/
|
|
94
|
+
export function parseGrafemaUri(uri) {
|
|
95
|
+
if (!uri.startsWith(GRAFEMA_SCHEME))
|
|
96
|
+
return null;
|
|
97
|
+
const rest = uri.slice(GRAFEMA_SCHEME.length); // "authority/file#fragment"
|
|
98
|
+
// Find the authority: everything up to the first '/' after the host
|
|
99
|
+
// Authority format: "host/project" (e.g., "github.com/owner/repo" or "localhost/project")
|
|
100
|
+
// We need to find where authority ends and file path begins.
|
|
101
|
+
// Convention: authority is "host/path" where host has no '/', so we split on first '/' after host.
|
|
102
|
+
// Actually, authority can be multi-segment (github.com/owner/repo = 3 segments).
|
|
103
|
+
// Strategy: find '#' first (fragment delimiter), then split the path part.
|
|
104
|
+
const hashPos = rest.indexOf('#');
|
|
105
|
+
const slashUnderscoreSlash = rest.indexOf('/_/');
|
|
106
|
+
if (slashUnderscoreSlash !== -1 && (hashPos === -1 || slashUnderscoreSlash < hashPos)) {
|
|
107
|
+
// Virtual node: authority/_/encoded_id
|
|
108
|
+
const authority = rest.slice(0, slashUnderscoreSlash);
|
|
109
|
+
const encodedId = rest.slice(slashUnderscoreSlash + 3); // after "/_/"
|
|
110
|
+
const decodedId = decodeFragment(encodedId);
|
|
111
|
+
// Reconstruct compact ID -- it's just the decoded full ID
|
|
112
|
+
return {
|
|
113
|
+
authority,
|
|
114
|
+
filePath: '',
|
|
115
|
+
symbolPart: decodedId,
|
|
116
|
+
semanticId: decodedId,
|
|
117
|
+
isVirtual: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (hashPos === -1)
|
|
121
|
+
return null; // No fragment = invalid
|
|
122
|
+
const pathPart = rest.slice(0, hashPos); // "authority/file/path"
|
|
123
|
+
const fragment = rest.slice(hashPos + 1); // "TYPE-%3Ename..."
|
|
124
|
+
const decodedFragment = decodeFragment(fragment);
|
|
125
|
+
// Split pathPart into authority and filePath.
|
|
126
|
+
// The authority is the first N segments that represent the host+project.
|
|
127
|
+
// Problem: we don't know where authority ends and file begins.
|
|
128
|
+
// Convention from the plan: authority = "host/project" (e.g., "localhost/grafema")
|
|
129
|
+
// or "github.com/owner/repo" (3 segments).
|
|
130
|
+
// The file path typically starts with src/, lib/, etc.
|
|
131
|
+
//
|
|
132
|
+
// Better approach: find the file path by working backward from the fragment.
|
|
133
|
+
// The fragment's decoded form tells us the type. The module_id for MODULE# format
|
|
134
|
+
// means filePath = pathPart minus authority.
|
|
135
|
+
//
|
|
136
|
+
// Simplest reliable approach: the authority is stored separately or we use a heuristic.
|
|
137
|
+
// For now: authority = first 2 segments for "host/project" format,
|
|
138
|
+
// first 3 segments for known hosts (github.com, gitlab.com, bitbucket.org).
|
|
139
|
+
const segments = pathPart.split('/');
|
|
140
|
+
let authoritySegments;
|
|
141
|
+
const host = segments[0];
|
|
142
|
+
if (host === 'github.com' || host === 'gitlab.com' || host === 'bitbucket.org') {
|
|
143
|
+
authoritySegments = 3; // host/owner/repo
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
authoritySegments = 2; // host/project (localhost/grafema)
|
|
147
|
+
}
|
|
148
|
+
if (segments.length < authoritySegments)
|
|
149
|
+
return null;
|
|
150
|
+
const authority = segments.slice(0, authoritySegments).join('/');
|
|
151
|
+
const filePath = segments.slice(authoritySegments).join('/');
|
|
152
|
+
// Reconstruct compact semantic ID
|
|
153
|
+
let semanticId;
|
|
154
|
+
if (decodedFragment === 'MODULE') {
|
|
155
|
+
semanticId = `MODULE#${filePath}`;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
semanticId = `${filePath}->${decodedFragment}`;
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
authority,
|
|
162
|
+
filePath,
|
|
163
|
+
symbolPart: decodedFragment,
|
|
164
|
+
semanticId,
|
|
165
|
+
isVirtual: false,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Convert a grafema:// URI to compact semantic ID format.
|
|
170
|
+
* Convenience wrapper around parseGrafemaUri.
|
|
171
|
+
*
|
|
172
|
+
* @returns Compact semantic ID or the input unchanged if not a grafema:// URI
|
|
173
|
+
*/
|
|
174
|
+
export function toCompactSemanticId(uri) {
|
|
175
|
+
if (!isGrafemaUri(uri))
|
|
176
|
+
return uri;
|
|
177
|
+
const parsed = parseGrafemaUri(uri);
|
|
178
|
+
if (!parsed)
|
|
179
|
+
return uri;
|
|
180
|
+
return parsed.semanticId;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Normalize a semantic ID input -- accepts either URI or compact format.
|
|
184
|
+
* If it's a URI, converts to compact. If already compact, returns as-is.
|
|
185
|
+
*
|
|
186
|
+
* Useful in MCP handlers that need to accept both formats.
|
|
187
|
+
*/
|
|
188
|
+
export function normalizeSemanticId(input) {
|
|
189
|
+
return toCompactSemanticId(input);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=GrafemaUri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrafemaUri.js","sourceRoot":"","sources":["../../src/core/GrafemaUri.ts"],"names":[],"mappings":"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"}
|