@reqlan/analytical 0.4.0

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 (97) hide show
  1. package/out/analysis/analyser-registry.d.ts +21 -0
  2. package/out/analysis/analyser-registry.js +33 -0
  3. package/out/analysis/analyser-registry.js.map +1 -0
  4. package/out/analysis/completion-tracking-analyser.d.ts +3 -0
  5. package/out/analysis/completion-tracking-analyser.js +37 -0
  6. package/out/analysis/completion-tracking-analyser.js.map +1 -0
  7. package/out/analysis/deprecation-impact-analyser.d.ts +3 -0
  8. package/out/analysis/deprecation-impact-analyser.js +21 -0
  9. package/out/analysis/deprecation-impact-analyser.js.map +1 -0
  10. package/out/analysis/file-related-analyser.d.ts +5 -0
  11. package/out/analysis/file-related-analyser.js +41 -0
  12. package/out/analysis/file-related-analyser.js.map +1 -0
  13. package/out/analysis/git-dates-analyser.d.ts +9 -0
  14. package/out/analysis/git-dates-analyser.js +39 -0
  15. package/out/analysis/git-dates-analyser.js.map +1 -0
  16. package/out/analysis/list-ideas-analyser.d.ts +3 -0
  17. package/out/analysis/list-ideas-analyser.js +7 -0
  18. package/out/analysis/list-ideas-analyser.js.map +1 -0
  19. package/out/analysis/local-graph-analyser.d.ts +6 -0
  20. package/out/analysis/local-graph-analyser.js +42 -0
  21. package/out/analysis/local-graph-analyser.js.map +1 -0
  22. package/out/analysis/semantic-search-analyser.d.ts +8 -0
  23. package/out/analysis/semantic-search-analyser.js +51 -0
  24. package/out/analysis/semantic-search-analyser.js.map +1 -0
  25. package/out/analysis-api.d.ts +31 -0
  26. package/out/analysis-api.js +136 -0
  27. package/out/analysis-api.js.map +1 -0
  28. package/out/core/analytical-store.d.ts +78 -0
  29. package/out/core/analytical-store.js +141 -0
  30. package/out/core/analytical-store.js.map +1 -0
  31. package/out/core/context-model.d.ts +187 -0
  32. package/out/core/context-model.js +36 -0
  33. package/out/core/context-model.js.map +1 -0
  34. package/out/core/context-signals.d.ts +149 -0
  35. package/out/core/context-signals.js +397 -0
  36. package/out/core/context-signals.js.map +1 -0
  37. package/out/core/file-path-match.d.ts +7 -0
  38. package/out/core/file-path-match.js +39 -0
  39. package/out/core/file-path-match.js.map +1 -0
  40. package/out/core/file-reference-resolve.d.ts +8 -0
  41. package/out/core/file-reference-resolve.js +28 -0
  42. package/out/core/file-reference-resolve.js.map +1 -0
  43. package/out/core/idea-references.d.ts +13 -0
  44. package/out/core/idea-references.js +25 -0
  45. package/out/core/idea-references.js.map +1 -0
  46. package/out/core/index-error.d.ts +23 -0
  47. package/out/core/index-error.js +33 -0
  48. package/out/core/index-error.js.map +1 -0
  49. package/out/core/types.d.ts +172 -0
  50. package/out/core/types.js +48 -0
  51. package/out/core/types.js.map +1 -0
  52. package/out/core/workspace-paths.d.ts +4 -0
  53. package/out/core/workspace-paths.js +92 -0
  54. package/out/core/workspace-paths.js.map +1 -0
  55. package/out/create-runtime.d.ts +21 -0
  56. package/out/create-runtime.js +39 -0
  57. package/out/create-runtime.js.map +1 -0
  58. package/out/export/build-export-snapshot.d.ts +3 -0
  59. package/out/export/build-export-snapshot.js +573 -0
  60. package/out/export/build-export-snapshot.js.map +1 -0
  61. package/out/export/html-export-assets.d.ts +3 -0
  62. package/out/export/html-export-assets.js +1066 -0
  63. package/out/export/html-export-assets.js.map +1 -0
  64. package/out/export/html-export-template.d.ts +17 -0
  65. package/out/export/html-export-template.js +930 -0
  66. package/out/export/html-export-template.js.map +1 -0
  67. package/out/export/html-export-utils.d.ts +45 -0
  68. package/out/export/html-export-utils.js +262 -0
  69. package/out/export/html-export-utils.js.map +1 -0
  70. package/out/export/types.d.ts +187 -0
  71. package/out/export/types.js +2 -0
  72. package/out/export/types.js.map +1 -0
  73. package/out/export/write-html-export.d.ts +2 -0
  74. package/out/export/write-html-export.js +143 -0
  75. package/out/export/write-html-export.js.map +1 -0
  76. package/out/headless-index-service.d.ts +23 -0
  77. package/out/headless-index-service.js +171 -0
  78. package/out/headless-index-service.js.map +1 -0
  79. package/out/index-store/idea-extractor.d.ts +6 -0
  80. package/out/index-store/idea-extractor.js +271 -0
  81. package/out/index-store/idea-extractor.js.map +1 -0
  82. package/out/index-store/schema.d.ts +10 -0
  83. package/out/index-store/schema.js +54 -0
  84. package/out/index-store/schema.js.map +1 -0
  85. package/out/index-store/sqlite-store.d.ts +66 -0
  86. package/out/index-store/sqlite-store.js +964 -0
  87. package/out/index-store/sqlite-store.js.map +1 -0
  88. package/out/index-store/webview-graph-queries.d.ts +62 -0
  89. package/out/index-store/webview-graph-queries.js +256 -0
  90. package/out/index-store/webview-graph-queries.js.map +1 -0
  91. package/out/index-store/webview-table-queries.d.ts +57 -0
  92. package/out/index-store/webview-table-queries.js +199 -0
  93. package/out/index-store/webview-table-queries.js.map +1 -0
  94. package/out/index.d.ts +40 -0
  95. package/out/index.js +27 -0
  96. package/out/index.js.map +1 -0
  97. package/package.json +52 -0
@@ -0,0 +1,143 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { APP_JS, SHARED_STYLES, buildSearchIndexScript } from './html-export-assets.js';
4
+ import { renderClusterDetailPage, renderClustersIndexPage, renderCodeFileDetailPage, renderCodeFilesIndexPage, renderFileDetailPage, renderFilesIndexPage, renderGraphPage, renderHomePage, renderIdeaDetailPage, renderIdeasIndexPage, renderAttributesIndexPage, renderPrintClusterPage, renderPrintCodeFilePage, renderPrintFilePage, renderPrintHomePage, renderPrintIdeaPage } from './html-export-template.js';
5
+ import { stringifyJson } from './html-export-utils.js';
6
+ export async function writeHtmlExport(snapshot, request) {
7
+ const outputDir = join(request.outputDir, request.exportName);
8
+ const assetsDir = join(outputDir, 'assets');
9
+ const dataDir = join(outputDir, 'data');
10
+ await mkdir(assetsDir, { recursive: true });
11
+ await mkdir(dataDir, { recursive: true });
12
+ const printFileName = ensureHtmlFileName(request.printEntryFileName);
13
+ const indexFilePath = join(outputDir, snapshot.manifest.home.path);
14
+ const ideasIndexFilePath = join(outputDir, snapshot.manifest.ideasIndex.path);
15
+ const filesIndexFilePath = join(outputDir, snapshot.manifest.filesIndex.path);
16
+ const codeFilesIndexFilePath = join(outputDir, snapshot.manifest.codeFilesIndex.path);
17
+ const clustersIndexFilePath = join(outputDir, snapshot.manifest.clustersIndex.path);
18
+ const attributesIndexFilePath = join(outputDir, snapshot.manifest.attributesIndex.path);
19
+ const printFilePath = join(outputDir, printFileName);
20
+ const requirementsFilePath = request.includeRequirementsPage
21
+ ? join(outputDir, 'requirements.html')
22
+ : undefined;
23
+ const graphFilePath = request.includeGraphPage
24
+ ? join(outputDir, 'graph.html')
25
+ : undefined;
26
+ const dataFilePath = join(dataDir, 'export.json');
27
+ const manifestFilePath = join(outputDir, snapshot.manifest.dataManifest.path);
28
+ await Promise.all([
29
+ mkdir(join(outputDir, 'ideas'), { recursive: true }),
30
+ mkdir(join(outputDir, 'files'), { recursive: true }),
31
+ mkdir(join(outputDir, 'code-files'), { recursive: true }),
32
+ mkdir(join(outputDir, 'clusters'), { recursive: true }),
33
+ mkdir(join(outputDir, 'print/ideas'), { recursive: true }),
34
+ mkdir(join(outputDir, 'print/files'), { recursive: true }),
35
+ mkdir(join(outputDir, 'print/code-files'), { recursive: true }),
36
+ mkdir(join(outputDir, 'print/clusters'), { recursive: true })
37
+ ]);
38
+ const writes = [
39
+ writeFile(join(assetsDir, 'styles.css'), SHARED_STYLES, 'utf8'),
40
+ writeFile(join(assetsDir, 'app.js'), APP_JS, 'utf8'),
41
+ writeFile(join(assetsDir, 'search-index.js'), buildSearchIndexScript(snapshot.searchDocuments), 'utf8'),
42
+ writeFile(dataFilePath, stringifyJson(snapshot), 'utf8'),
43
+ writeFile(join(dataDir, 'graph.json'), stringifyJson(snapshot.graphs.workspace), 'utf8'),
44
+ writeFile(join(dataDir, 'search.json'), stringifyJson(snapshot.searchDocuments), 'utf8'),
45
+ writeFile(manifestFilePath, stringifyJson({
46
+ ...snapshot.manifest,
47
+ pageOptions: snapshot.pageOptions,
48
+ runtimeMode: snapshot.runtimeMode,
49
+ clusterStrategy: snapshot.clusterStrategy
50
+ }), 'utf8')
51
+ ];
52
+ const isPrintMode = snapshot.runtimeMode === 'print';
53
+ writes.push(writeFile(indexFilePath, isPrintMode ? renderPrintHomePage(snapshot) : renderHomePage(snapshot), 'utf8'));
54
+ if (snapshot.pageOptions.includePrintPages) {
55
+ writes.push(writeFile(printFilePath, renderPrintHomePage(snapshot), 'utf8'));
56
+ }
57
+ if (!isPrintMode && requirementsFilePath) {
58
+ writes.push(writeFile(requirementsFilePath, renderIdeasIndexPage(snapshot), 'utf8'));
59
+ }
60
+ if (!isPrintMode && graphFilePath && snapshot.pageOptions.includeGraphPage) {
61
+ writes.push(writeFile(graphFilePath, renderGraphPage(snapshot), 'utf8'));
62
+ }
63
+ if (!isPrintMode) {
64
+ writes.push(writeFile(ideasIndexFilePath, renderIdeasIndexPage(snapshot), 'utf8'));
65
+ if (snapshot.pageOptions.includeFilePages) {
66
+ writes.push(writeFile(filesIndexFilePath, renderFilesIndexPage(snapshot), 'utf8'));
67
+ }
68
+ if (snapshot.pageOptions.includeCodeFilePages) {
69
+ writes.push(writeFile(codeFilesIndexFilePath, renderCodeFilesIndexPage(snapshot), 'utf8'));
70
+ }
71
+ if (snapshot.pageOptions.includeClusterPages) {
72
+ writes.push(writeFile(clustersIndexFilePath, renderClustersIndexPage(snapshot), 'utf8'));
73
+ }
74
+ writes.push(writeFile(attributesIndexFilePath, renderAttributesIndexPage(snapshot), 'utf8'));
75
+ }
76
+ if (!isPrintMode && snapshot.pageOptions.includeIdeaPages) {
77
+ for (const idea of snapshot.ideas) {
78
+ writes.push(writeFile(join(outputDir, idea.page.path), renderIdeaDetailPage(snapshot, idea), 'utf8'));
79
+ }
80
+ }
81
+ if (snapshot.pageOptions.includePrintPages) {
82
+ for (const idea of snapshot.ideas) {
83
+ if (idea.page.printablePath) {
84
+ writes.push(writeFile(join(outputDir, idea.page.printablePath), renderPrintIdeaPage(snapshot, idea), 'utf8'));
85
+ }
86
+ }
87
+ }
88
+ if (!isPrintMode && snapshot.pageOptions.includeFilePages) {
89
+ for (const file of snapshot.files) {
90
+ writes.push(writeFile(join(outputDir, file.page.path), renderFileDetailPage(snapshot, file), 'utf8'));
91
+ }
92
+ }
93
+ if (snapshot.pageOptions.includePrintPages) {
94
+ for (const file of snapshot.files) {
95
+ writes.push(writeFile(join(outputDir, file.printPage.path), renderPrintFilePage(snapshot, file), 'utf8'));
96
+ }
97
+ }
98
+ if (!isPrintMode && snapshot.pageOptions.includeCodeFilePages) {
99
+ for (const file of snapshot.codeFiles) {
100
+ writes.push(writeFile(join(outputDir, file.page.path), renderCodeFileDetailPage(snapshot, file), 'utf8'));
101
+ }
102
+ }
103
+ if (snapshot.pageOptions.includePrintPages && snapshot.pageOptions.includeCodeFilePages) {
104
+ for (const file of snapshot.codeFiles) {
105
+ writes.push(writeFile(join(outputDir, file.printPage.path), renderPrintCodeFilePage(snapshot, file), 'utf8'));
106
+ }
107
+ }
108
+ if (!isPrintMode && snapshot.pageOptions.includeClusterPages) {
109
+ for (const cluster of snapshot.clusters) {
110
+ writes.push(writeFile(join(outputDir, cluster.page.path), renderClusterDetailPage(snapshot, cluster), 'utf8'));
111
+ }
112
+ }
113
+ if (snapshot.pageOptions.includePrintPages && snapshot.pageOptions.includeClusterPages) {
114
+ for (const cluster of snapshot.clusters) {
115
+ if (cluster.page.printablePath) {
116
+ writes.push(writeFile(join(outputDir, cluster.page.printablePath), renderPrintClusterPage(snapshot, cluster), 'utf8'));
117
+ }
118
+ }
119
+ }
120
+ await Promise.all(writes);
121
+ return {
122
+ outputDir,
123
+ indexFilePath,
124
+ printFilePath,
125
+ requirementsFilePath,
126
+ graphFilePath,
127
+ dataFilePath,
128
+ ideasIndexFilePath,
129
+ filesIndexFilePath,
130
+ codeFilesIndexFilePath: snapshot.pageOptions.includeCodeFilePages ? codeFilesIndexFilePath : undefined,
131
+ clustersIndexFilePath,
132
+ attributesIndexFilePath,
133
+ manifestFilePath
134
+ };
135
+ }
136
+ function ensureHtmlFileName(value) {
137
+ const trimmed = value.trim();
138
+ if (trimmed.toLowerCase().endsWith('.html')) {
139
+ return trimmed;
140
+ }
141
+ return `${trimmed}.html`;
142
+ }
143
+ //# sourceMappingURL=write-html-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-html-export.js","sourceRoot":"","sources":["../../src/export/write-html-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AnalyticalStore } from './core/analytical-store.js';
2
+ import { SqliteIndexStore } from './index-store/sqlite-store.js';
3
+ export declare class HeadlessIndexService {
4
+ private readonly analytical;
5
+ private readonly storagePath;
6
+ private readonly workspaceRoot;
7
+ private sqlite?;
8
+ private readonly services;
9
+ constructor(analytical: AnalyticalStore, storagePath: string, workspaceRoot: string);
10
+ get isReady(): boolean;
11
+ get indexStore(): SqliteIndexStore;
12
+ activate(): Promise<void>;
13
+ deactivate(): Promise<void>;
14
+ syncWorkspace(): Promise<void>;
15
+ indexFilePath(filePath: string): Promise<void>;
16
+ relativePath(fileUri: string): string;
17
+ resolveFileUri(pathInput: string): string;
18
+ listRqFiles(pathPrefix?: string): string[];
19
+ private rqFilePaths;
20
+ private collectRqFiles;
21
+ private walkDirectory;
22
+ private parseDocument;
23
+ }
@@ -0,0 +1,171 @@
1
+ import { URI } from 'langium';
2
+ import { NodeFileSystem } from 'langium/node';
3
+ import { createReqlanServices } from '@reqlan/language';
4
+ import { readFile, readdir } from 'node:fs/promises';
5
+ import { join, relative } from 'node:path';
6
+ import { normalizeIndexedDocument, resolveWorkspaceFileUri } from './core/workspace-paths.js';
7
+ import { extractIndexedDocument } from './index-store/idea-extractor.js';
8
+ import { SqliteIndexStore } from './index-store/sqlite-store.js';
9
+ export class HeadlessIndexService {
10
+ constructor(analytical, storagePath, workspaceRoot) {
11
+ this.analytical = analytical;
12
+ this.storagePath = storagePath;
13
+ this.workspaceRoot = workspaceRoot;
14
+ this.services = createReqlanServices({ ...NodeFileSystem });
15
+ this.rqFilePaths = [];
16
+ }
17
+ get isReady() {
18
+ return this.analytical.getState().indexState === 'ready';
19
+ }
20
+ get indexStore() {
21
+ if (!this.sqlite) {
22
+ throw new Error('Index store is not open');
23
+ }
24
+ return this.sqlite;
25
+ }
26
+ async activate() {
27
+ const { dispatchIndex, recordIndexError } = this.analytical.getState();
28
+ dispatchIndex('activate');
29
+ try {
30
+ const dbPath = join(this.storagePath, 'ideas-index.sqlite');
31
+ this.sqlite = await SqliteIndexStore.open(dbPath);
32
+ dispatchIndex('opened');
33
+ await this.syncWorkspace();
34
+ }
35
+ catch (error) {
36
+ dispatchIndex('fail');
37
+ recordIndexError('Failed to open idea index', error);
38
+ throw error;
39
+ }
40
+ }
41
+ async deactivate() {
42
+ const { canDispatchIndex, dispatchIndex } = this.analytical.getState();
43
+ if (canDispatchIndex('deactivate')) {
44
+ dispatchIndex('deactivate');
45
+ }
46
+ await this.sqlite?.close();
47
+ this.sqlite = undefined;
48
+ }
49
+ async syncWorkspace() {
50
+ if (!this.sqlite) {
51
+ return;
52
+ }
53
+ const { dispatchIndex, setIndexReady, recordIndexError } = this.analytical.getState();
54
+ if (!dispatchIndex('sync')) {
55
+ return;
56
+ }
57
+ try {
58
+ const files = await this.collectRqFiles();
59
+ for (const filePath of files) {
60
+ try {
61
+ await this.indexFilePath(filePath);
62
+ }
63
+ catch (error) {
64
+ recordIndexError(`Failed to index ${relative(this.workspaceRoot, filePath)}`, error, {
65
+ fileUri: relative(this.workspaceRoot, filePath).replace(/\\/g, '/'),
66
+ phase: 'sync'
67
+ });
68
+ }
69
+ }
70
+ if (!dispatchIndex('synced')) {
71
+ recordIndexError('Index sync finished but state transition to ready failed', undefined);
72
+ }
73
+ const counts = await this.sqlite.counts();
74
+ setIndexReady({ ideaCount: counts.ideas, edgeCount: counts.edges });
75
+ }
76
+ catch (error) {
77
+ dispatchIndex('fail');
78
+ recordIndexError('Workspace sync failed', error);
79
+ throw error;
80
+ }
81
+ }
82
+ async indexFilePath(filePath) {
83
+ if (!this.sqlite) {
84
+ return;
85
+ }
86
+ const document = await this.parseDocument(filePath);
87
+ if (!document) {
88
+ return;
89
+ }
90
+ const extractedRaw = extractIndexedDocument(document);
91
+ if (!extractedRaw) {
92
+ return;
93
+ }
94
+ const extracted = normalizeIndexedDocument(extractedRaw, this.workspaceRoot);
95
+ const fileUri = extracted.fileUri;
96
+ const existingHash = await this.sqlite.getDocumentHash(fileUri);
97
+ if (existingHash === extracted.contentHash) {
98
+ const storedEdges = await this.sqlite.countEdgesFromFile(fileUri);
99
+ if (storedEdges >= extracted.edges.length) {
100
+ return;
101
+ }
102
+ }
103
+ for (const idea of extracted.ideas) {
104
+ idea.contentHash = extracted.contentHash;
105
+ }
106
+ await this.sqlite.upsertDocument(fileUri, extracted.contentHash, extracted.ideas, extracted.edges);
107
+ this.analytical.getState().recordDocumentUpdate(fileUri, extracted.ideas.length);
108
+ }
109
+ relativePath(fileUri) {
110
+ if (!fileUri.startsWith('file://') && !fileUri.startsWith('/')) {
111
+ return fileUri;
112
+ }
113
+ try {
114
+ const filePath = URI.parse(fileUri).fsPath;
115
+ return relative(this.workspaceRoot, filePath).replace(/\\/g, '/');
116
+ }
117
+ catch {
118
+ return fileUri;
119
+ }
120
+ }
121
+ resolveFileUri(pathInput) {
122
+ return resolveWorkspaceFileUri(pathInput, this.workspaceRoot);
123
+ }
124
+ listRqFiles(pathPrefix = '') {
125
+ return [...this.rqFilePaths]
126
+ .map(filePath => relative(this.workspaceRoot, filePath))
127
+ .filter(relativePath => !pathPrefix || relativePath.includes(pathPrefix))
128
+ .sort((left, right) => left.localeCompare(right));
129
+ }
130
+ async collectRqFiles() {
131
+ const results = [];
132
+ await this.walkDirectory(this.workspaceRoot, results);
133
+ this.rqFilePaths = results;
134
+ return results;
135
+ }
136
+ async walkDirectory(directory, results) {
137
+ let entries;
138
+ try {
139
+ entries = await readdir(directory, { withFileTypes: true });
140
+ }
141
+ catch {
142
+ return;
143
+ }
144
+ for (const entry of entries) {
145
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') {
146
+ continue;
147
+ }
148
+ const fullPath = join(directory, entry.name);
149
+ if (entry.isDirectory()) {
150
+ await this.walkDirectory(fullPath, results);
151
+ continue;
152
+ }
153
+ if (entry.isFile() && entry.name.endsWith('.rq')) {
154
+ results.push(fullPath);
155
+ }
156
+ }
157
+ }
158
+ async parseDocument(filePath) {
159
+ try {
160
+ const text = await readFile(filePath, 'utf8');
161
+ const langiumUri = URI.file(filePath);
162
+ const document = this.services.shared.workspace.LangiumDocumentFactory.fromString(text, langiumUri);
163
+ await this.services.shared.workspace.DocumentBuilder.build([document], { validation: false });
164
+ return document;
165
+ }
166
+ catch {
167
+ return undefined;
168
+ }
169
+ }
170
+ }
171
+ //# sourceMappingURL=headless-index-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-index-service.js","sourceRoot":"","sources":["../src/headless-index-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Extracts ideas, attributes, and graph edges from parsed reqlan documents.
3
+ */
4
+ import { type LangiumDocument } from 'langium';
5
+ import { type IndexedDocument } from '../core/types.js';
6
+ export declare function extractIndexedDocument(document: LangiumDocument): IndexedDocument | undefined;
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Extracts ideas, attributes, and graph edges from parsed reqlan documents.
3
+ */
4
+ import { AstUtils } from 'langium';
5
+ import { findEmbeddedFileReferencesInText, findNamespaceImportByAlias, isAttribute, isBracketReference, isIdea, isIdeaSet, isLocalReference, isMarkdownLink, isModel, isNamespaceImportOnlyReference, isOneLinerIdea, isQualifiedReference, isScalarValue, isWikiLink, namespaceImportBindingName, parseMarkdownLink, summarizeIdeaDeclaration, unquoteReqlanString } from '@reqlan/language';
6
+ import { edgeId, ideaId } from '../core/types.js';
7
+ import { createHash } from 'node:crypto';
8
+ export function extractIndexedDocument(document) {
9
+ const model = document.parseResult.value;
10
+ if (!isModel(model)) {
11
+ return undefined;
12
+ }
13
+ const fileUri = document.uri.toString();
14
+ const text = document.textDocument.getText();
15
+ const contentHash = hashText(text);
16
+ const ideas = [];
17
+ const edges = [];
18
+ for (const element of model.elements) {
19
+ if (isIdea(element)) {
20
+ ideas.push(toIdeaRecord(element, 'block', fileUri, document));
21
+ collectIdeaEdges(element, fileUri, edges);
22
+ }
23
+ else if (isOneLinerIdea(element)) {
24
+ ideas.push(toIdeaRecord(element, 'oneliner', fileUri, document));
25
+ collectIdeaEdges(element, fileUri, edges);
26
+ }
27
+ else if (isIdeaSet(element)) {
28
+ ideas.push(toIdeasetRecord(element, fileUri, document));
29
+ for (const member of element.members) {
30
+ const memberRef = member.ref;
31
+ if (!memberRef) {
32
+ continue;
33
+ }
34
+ const sourceId = ideaId(fileUri, element.name);
35
+ const targetId = ideaId(fileUri, memberRef.name);
36
+ edges.push({
37
+ id: edgeId(sourceId, 'ideaset_member', targetId),
38
+ sourceId,
39
+ targetId,
40
+ kind: 'ideaset_member'
41
+ });
42
+ }
43
+ }
44
+ }
45
+ for (const edge of collectReferenceEdges(model, fileUri)) {
46
+ edges.push(edge);
47
+ }
48
+ for (const edge of collectFileReferenceEdges(text, fileUri, ideas)) {
49
+ edges.push(edge);
50
+ }
51
+ return { fileUri, contentHash, ideas, edges };
52
+ }
53
+ function toIdeaRecord(idea, kind, fileUri, document) {
54
+ const range = idea.$cstNode?.range;
55
+ const attributes = collectAttributes(idea);
56
+ return {
57
+ id: ideaId(fileUri, idea.name),
58
+ name: idea.name,
59
+ kind,
60
+ fileUri,
61
+ lineStart: range?.start.line ?? 0,
62
+ lineEnd: range?.end.line ?? 0,
63
+ summary: summarizeIdeaDeclaration(idea),
64
+ attributesJson: JSON.stringify(attributes),
65
+ contentHash: ''
66
+ };
67
+ }
68
+ function toIdeasetRecord(ideaset, fileUri, _document) {
69
+ const range = ideaset.$cstNode?.range;
70
+ return {
71
+ id: ideaId(fileUri, ideaset.name),
72
+ name: ideaset.name,
73
+ kind: 'ideaset',
74
+ fileUri,
75
+ lineStart: range?.start.line ?? 0,
76
+ lineEnd: range?.end.line ?? 0,
77
+ summary: `Ideaset (${ideaset.name})`,
78
+ attributesJson: '{}',
79
+ contentHash: ''
80
+ };
81
+ }
82
+ function collectAttributes(idea) {
83
+ const attributes = {};
84
+ if (!isIdea(idea)) {
85
+ return attributes;
86
+ }
87
+ for (const element of idea.elements) {
88
+ if (!isAttribute(element)) {
89
+ continue;
90
+ }
91
+ attributes[element.name] = attributeValue(element);
92
+ if (element.negated) {
93
+ attributes[element.name] = false;
94
+ }
95
+ }
96
+ return attributes;
97
+ }
98
+ function attributeValue(attribute) {
99
+ if (!attribute.value) {
100
+ return true;
101
+ }
102
+ if (isScalarValue(attribute.value)) {
103
+ return attribute.value.parts
104
+ .map(part => typeof part === 'string' ? part : '')
105
+ .join('')
106
+ .trim();
107
+ }
108
+ return true;
109
+ }
110
+ function collectIdeaEdges(idea, fileUri, edges) {
111
+ const sourceId = ideaId(fileUri, idea.name);
112
+ for (const node of AstUtils.streamAst(idea)) {
113
+ if (isWikiLink(node) || isBracketReference(node)) {
114
+ const edge = referenceToEdge(sourceId, node.target, fileUri, node);
115
+ if (edge) {
116
+ edges.push(edge);
117
+ }
118
+ }
119
+ if (isMarkdownLink(node)) {
120
+ const target = parseMarkdownLink(node.raw)?.target;
121
+ if (target) {
122
+ edges.push({
123
+ id: edgeId(sourceId, 'file_reference', target),
124
+ sourceId,
125
+ targetFile: target,
126
+ kind: 'file_reference',
127
+ label: target,
128
+ ...edgeMetaFromNode(node),
129
+ isResolved: true
130
+ });
131
+ }
132
+ }
133
+ }
134
+ }
135
+ function collectReferenceEdges(model, fileUri) {
136
+ const edges = [];
137
+ for (const node of AstUtils.streamAst(model)) {
138
+ if (!isWikiLink(node) && !isBracketReference(node)) {
139
+ continue;
140
+ }
141
+ const owningIdea = AstUtils.getContainerOfType(node, (candidate) => isIdea(candidate) || isOneLinerIdea(candidate));
142
+ if (!owningIdea) {
143
+ continue;
144
+ }
145
+ const edge = referenceToEdge(ideaId(fileUri, owningIdea.name), node.target, fileUri, node);
146
+ if (edge) {
147
+ edges.push(edge);
148
+ }
149
+ }
150
+ return edges;
151
+ }
152
+ function edgeMetaFromNode(node) {
153
+ const line = node.$cstNode?.range?.start.line;
154
+ const raw = node.$cstNode?.text ?? '';
155
+ const snippet = raw.replace(/\s+/g, ' ').trim().slice(0, 120);
156
+ return {
157
+ sourceLine: line !== undefined ? line + 1 : undefined,
158
+ snippet: snippet || undefined
159
+ };
160
+ }
161
+ function unresolvedIdeaName(target) {
162
+ if (!('idea' in target) || !target.idea || typeof target.idea !== 'object') {
163
+ return undefined;
164
+ }
165
+ const idea = target.idea;
166
+ if (idea.ref) {
167
+ return undefined;
168
+ }
169
+ return idea.$refText ?? idea.name;
170
+ }
171
+ /**
172
+ * Bare `[alias]` refs to namespace imports target the imported file (same as the editor),
173
+ * not an idea — emit a file_reference edge using the shared namespace-import classifier.
174
+ */
175
+ function namespaceAliasFileEdge(sourceId, target, meta) {
176
+ if (!isLocalReference(target) && !isQualifiedReference(target)) {
177
+ return undefined;
178
+ }
179
+ if (!isNamespaceImportOnlyReference(target)) {
180
+ return undefined;
181
+ }
182
+ const document = AstUtils.getDocument(target);
183
+ const model = document.parseResult.value;
184
+ if (!isModel(model)) {
185
+ return undefined;
186
+ }
187
+ const bindingName = isQualifiedReference(target)
188
+ ? target.qualifier?.$refText
189
+ : namespaceImportBindingName(target);
190
+ if (!bindingName) {
191
+ return undefined;
192
+ }
193
+ const importDecl = isQualifiedReference(target)
194
+ ? target.qualifier?.ref
195
+ : findNamespaceImportByAlias(model.imports, bindingName);
196
+ if (!importDecl?.path) {
197
+ return undefined;
198
+ }
199
+ const targetFile = unquoteReqlanString(importDecl.path);
200
+ return {
201
+ id: edgeId(sourceId, 'file_reference', targetFile),
202
+ sourceId,
203
+ targetFile,
204
+ kind: 'file_reference',
205
+ label: bindingName,
206
+ ...meta,
207
+ isResolved: true
208
+ };
209
+ }
210
+ function referenceToEdge(sourceId, target, fileUri, sourceNode) {
211
+ const meta = sourceNode ? edgeMetaFromNode(sourceNode) : {};
212
+ const ideaRef = 'idea' in target ? target.idea : undefined;
213
+ if (ideaRef && typeof ideaRef === 'object' && 'ref' in ideaRef && ideaRef.ref) {
214
+ const targetFileUri = AstUtils.getDocument(ideaRef.ref).uri.toString();
215
+ const targetId = ideaId(targetFileUri, ideaRef.ref.name);
216
+ return {
217
+ id: edgeId(sourceId, 'references', targetId),
218
+ sourceId,
219
+ targetId,
220
+ kind: 'references',
221
+ label: ideaRef.ref.name,
222
+ ...meta,
223
+ isResolved: true
224
+ };
225
+ }
226
+ const namespaceFile = namespaceAliasFileEdge(sourceId, target, meta);
227
+ if (namespaceFile) {
228
+ return namespaceFile;
229
+ }
230
+ const unresolved = unresolvedIdeaName(target);
231
+ if (unresolved) {
232
+ return {
233
+ id: edgeId(sourceId, 'references', `unresolved:${unresolved}`),
234
+ sourceId,
235
+ kind: 'references',
236
+ label: unresolved,
237
+ ...meta,
238
+ isResolved: false
239
+ };
240
+ }
241
+ if ('file' in target && typeof target.file === 'string') {
242
+ return {
243
+ id: edgeId(sourceId, 'file_reference', target.file),
244
+ sourceId,
245
+ targetFile: target.file,
246
+ kind: 'file_reference',
247
+ label: target.file,
248
+ ...meta,
249
+ isResolved: true
250
+ };
251
+ }
252
+ return undefined;
253
+ }
254
+ function collectFileReferenceEdges(text, fileUri, ideas) {
255
+ const edges = [];
256
+ const sourceId = ideas[0]?.id ?? `${fileUri}#__file__`;
257
+ for (const ref of findEmbeddedFileReferencesInText(text)) {
258
+ edges.push({
259
+ id: edgeId(sourceId, 'file_reference', ref.file),
260
+ sourceId,
261
+ targetFile: ref.file,
262
+ kind: 'file_reference',
263
+ label: ref.file
264
+ });
265
+ }
266
+ return edges;
267
+ }
268
+ function hashText(text) {
269
+ return createHash('sha256').update(text).digest('hex').slice(0, 16);
270
+ }
271
+ //# sourceMappingURL=idea-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea-extractor.js","sourceRoot":"","sources":["../../src/index-store/idea-extractor.ts"],"names":[],"mappings":"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"}