@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,397 @@
1
+ /**
2
+ * Context signals and focus synthesis for context-scope v2.
3
+ * per ["../../../../reqlan rq/extension/module/context-scope-v2.rq"]
4
+ */
5
+ export function emptyContextSignals() {
6
+ return {};
7
+ }
8
+ export function emptyContextSynthesis() {
9
+ return {
10
+ stability: 0.5,
11
+ confidence: 0.3,
12
+ aiRisk: 'medium',
13
+ coverage: 'unknown',
14
+ story: 'Insufficient evidence',
15
+ stories: ['Insufficient evidence']
16
+ };
17
+ }
18
+ function parseIsoDate(value) {
19
+ if (!value) {
20
+ return undefined;
21
+ }
22
+ const date = new Date(value);
23
+ return Number.isNaN(date.getTime()) ? undefined : date;
24
+ }
25
+ function wholeDaysBetween(later, earlier) {
26
+ const ms = later.getTime() - earlier.getTime();
27
+ return Math.max(0, Math.floor(ms / (24 * 60 * 60 * 1000)));
28
+ }
29
+ export function buildFocusSignals(input) {
30
+ if (!input.focusIdeaId) {
31
+ return emptyContextSignals();
32
+ }
33
+ const now = input.now ?? new Date();
34
+ const created = parseIsoDate(input.createdAt);
35
+ const modified = parseIsoDate(input.modifiedAt);
36
+ const ageDays = created ? wholeDaysBetween(now, created) : undefined;
37
+ const timeSinceTouchedDays = modified
38
+ ? wholeDaysBetween(now, modified)
39
+ : created
40
+ ? wholeDaysBetween(now, created)
41
+ : undefined;
42
+ const dependentCount = Math.max(0, input.inboundCount - input.parentCount);
43
+ const highFanout = input.inboundCount >= 8 || input.outboundCount >= 12;
44
+ const unresolvedRefs = input.unresolvedCount > 0;
45
+ const recentlyTouched = timeSinceTouchedDays !== undefined ? timeSinceTouchedDays <= 14 : false;
46
+ const flags = [];
47
+ if (highFanout) {
48
+ flags.push('high_fanout');
49
+ }
50
+ if (unresolvedRefs) {
51
+ flags.push('unresolved_refs');
52
+ }
53
+ if (recentlyTouched) {
54
+ flags.push('recently_touched');
55
+ }
56
+ return {
57
+ focusIdeaId: input.focusIdeaId,
58
+ relationship: {
59
+ parentCount: input.parentCount,
60
+ childCount: input.outboundCount,
61
+ inboundCount: input.inboundCount,
62
+ outboundCount: input.outboundCount,
63
+ dependentCount
64
+ },
65
+ developmentHistory: {
66
+ createdAt: input.createdAt,
67
+ createdBy: input.createdBy,
68
+ modifiedAt: input.modifiedAt,
69
+ modifiedBy: input.modifiedBy,
70
+ ageDays,
71
+ timeSinceTouchedDays,
72
+ commitCount: input.commitCount,
73
+ changeRate: input.changeRate,
74
+ relativeChangeRate: input.relativeChangeRate,
75
+ relativeChangeLabel: input.relativeChangeLabel,
76
+ authors: input.authors
77
+ },
78
+ lifecycle: {
79
+ createdAt: input.createdAt,
80
+ lastEditedAt: input.modifiedAt,
81
+ status: input.status
82
+ },
83
+ risk: {
84
+ highFanout,
85
+ unresolvedRefs,
86
+ recentlyTouched,
87
+ flags
88
+ },
89
+ quality: {
90
+ unresolvedCount: input.unresolvedCount,
91
+ hasStatus: Boolean(input.status)
92
+ }
93
+ };
94
+ }
95
+ function clamp01(value) {
96
+ return Math.min(1, Math.max(0, value));
97
+ }
98
+ export function synthesizeFocusContext(signals) {
99
+ if (!signals.focusIdeaId) {
100
+ return emptyContextSynthesis();
101
+ }
102
+ const rel = signals.relationship;
103
+ const hist = signals.developmentHistory;
104
+ const risk = signals.risk;
105
+ const quality = signals.quality;
106
+ const ageFactor = hist?.ageDays === undefined ? 0.5 : clamp01(Math.min(hist.ageDays, 365) / 365);
107
+ const quietFactor = hist?.timeSinceTouchedDays === undefined
108
+ ? 0.5
109
+ : clamp01(Math.min(hist.timeSinceTouchedDays, 180) / 180);
110
+ const fanoutPenalty = clamp01(((rel?.inboundCount ?? 0) + (rel?.outboundCount ?? 0)) / 30);
111
+ const unresolvedPenalty = (quality?.unresolvedCount ?? 0) > 0 ? 0.2 : 0;
112
+ const stability = clamp01(0.35 * ageFactor + 0.45 * quietFactor + 0.2 * (1 - fanoutPenalty) - unresolvedPenalty);
113
+ let confidence = 0.25;
114
+ if (quality?.hasStatus) {
115
+ confidence += 0.2;
116
+ }
117
+ if (hist?.createdAt || hist?.modifiedAt) {
118
+ confidence += 0.2;
119
+ }
120
+ if ((rel?.inboundCount ?? 0) + (rel?.outboundCount ?? 0) > 0) {
121
+ confidence += 0.2;
122
+ }
123
+ if ((quality?.unresolvedCount ?? 0) === 0) {
124
+ confidence += 0.15;
125
+ }
126
+ confidence = clamp01(confidence);
127
+ let aiRisk = 'low';
128
+ if (stability < 0.45 || (risk?.highFanout && risk.recentlyTouched)) {
129
+ aiRisk = 'high';
130
+ }
131
+ else if (stability < 0.7 || risk?.highFanout || risk?.unresolvedRefs) {
132
+ aiRisk = 'medium';
133
+ }
134
+ const coverage = (rel?.outboundCount ?? 0) === 0 && (rel?.inboundCount ?? 0) === 0
135
+ ? 'unknown'
136
+ : (quality?.unresolvedCount ?? 0) > 0
137
+ ? 'partial'
138
+ : 'partial';
139
+ const stories = [];
140
+ if (stability >= 0.75) {
141
+ stories.push('Very stable');
142
+ }
143
+ else if (stability >= 0.5) {
144
+ stories.push('Moderately stable');
145
+ }
146
+ else {
147
+ stories.push('Likely unstable');
148
+ }
149
+ if (hist?.timeSinceTouchedDays !== undefined) {
150
+ if (hist.timeSinceTouchedDays === 0) {
151
+ stories.push('Touched today');
152
+ }
153
+ else if (hist.timeSinceTouchedDays <= 14) {
154
+ stories.push(`Edited ${hist.timeSinceTouchedDays}d ago`);
155
+ }
156
+ else {
157
+ stories.push(`Quiet for ${hist.timeSinceTouchedDays}d`);
158
+ }
159
+ }
160
+ if (hist?.relativeChangeLabel === 'very_hot') {
161
+ stories.push('Very high churn versus peers');
162
+ }
163
+ else if (hist?.relativeChangeLabel === 'hot') {
164
+ stories.push('Above-peer churn');
165
+ }
166
+ else if (hist?.relativeChangeLabel === 'cold') {
167
+ stories.push('Below-peer churn');
168
+ }
169
+ if (risk?.highFanout) {
170
+ stories.push('High dependency fanout');
171
+ }
172
+ if (risk?.unresolvedRefs) {
173
+ stories.push('Unresolved references');
174
+ }
175
+ return {
176
+ stability,
177
+ confidence,
178
+ aiRisk,
179
+ coverage,
180
+ story: stories.join(' · '),
181
+ stories
182
+ };
183
+ }
184
+ export function formatSynthesisMarkdown(synthesis) {
185
+ const pct = (value) => `${Math.round(value * 100)}%`;
186
+ return [
187
+ '## Synthesis',
188
+ `- Stability: ${pct(synthesis.stability)}`,
189
+ `- Confidence: ${pct(synthesis.confidence)}`,
190
+ `- AI risk: ${synthesis.aiRisk}`,
191
+ `- Coverage: ${synthesis.coverage}`,
192
+ `- ${synthesis.story}`
193
+ ].join('\n');
194
+ }
195
+ export function buildContextFingerprint(input) {
196
+ const coverageScore = input.coverage === 'complete' ? 1 : input.coverage === 'partial' ? 0.55 : 0.15;
197
+ const commitScore = clamp01((input.gitCommitCount ?? 0) / 6);
198
+ const authorScore = clamp01((input.gitAuthorCount ?? 0) / 3);
199
+ const dirtyScore = clamp01((input.gitChangeCount ?? 0) / 8);
200
+ const gitRichness = clamp01(0.55 * commitScore + 0.25 * authorScore + 0.2 * dirtyScore);
201
+ return {
202
+ files: clamp01(input.fileCount / 12),
203
+ requirements: clamp01(input.ideaCount / 12),
204
+ history: clamp01(input.historyCount / 12),
205
+ architecture: input.hasArchitectureHint ? 0.7 : 0.2,
206
+ git: gitRichness,
207
+ diagnostics: clamp01(1 - input.anomalyCount / 5),
208
+ coverage: coverageScore
209
+ };
210
+ }
211
+ /** Overview of why context fingerprint / health bars matter for developers. */
212
+ export const CONTEXT_FINGERPRINT_HELP = [
213
+ 'Fingerprint answers: “what kinds of evidence is AI / Copilot actually getting from this session?”',
214
+ 'Bars fill as you enable lenses, open related files, pin ideas, and connect requirements in the graph — thin bars mean the assistant is guessing from a narrow slice.',
215
+ 'Use this before copying context or asking for a change: expand the empty axes that matter for the task (e.g. git history when judging ownership or recency, requirements when editing policy).'
216
+ ].join(' ');
217
+ /** Per-axis semantic help for scope-pane tooltips and the fingerprint info panel. */
218
+ export const CONTEXT_FINGERPRINT_AXIS_HELP = {
219
+ files: 'Files: how much implementation surface is in composed context. Comes from enabled lenses — the active editor, other open tabs, recent navigation/edits, and git-changed paths. Low means the assistant mostly sees the current file; raise it by opening related code or enabling those lenses before you ask for a cross-file change.',
220
+ requirements: 'Requirements: how much of the idea graph is in play. Ideas arrive from the focused .rq block, linked requirements on the current file, pins in the context tray, and nearby graph hops. Care when this is thin: the model may invent behaviour that is not grounded in written intent.',
221
+ history: 'History: session trail of where you have been and typed. Navigation history and edit history (not git log) tell the assistant what you were just working on. Useful for “continue what I was doing”; empty if you jumped straight to a file with no prior trail.',
222
+ architecture: 'Architecture: whether focus has structural graph anchors — parents or outbound requirement refs. High means the idea sits in a known hierarchy/dependency shape; low means isolated intent with little surrounding design for the assistant to respect.',
223
+ git: 'Git: development history around the focus — recent commits, authors, and branch. Helps the assistant judge ownership, recency, and who last touched this area. Dirty working-tree paths are a secondary caution signal. Empty when no focus history is available or the git lens is off.',
224
+ diagnostics: 'Diagnostics: health of the focused context — unresolved refs and other anomalies. High means clean; dropping means broken links or index issues that will poison AI answers until you fix or filter them.',
225
+ coverage: 'Coverage: whether relationships around the focus are known enough to reason about impact. Unknown/thin means few inbound/outbound edges; partial means some graph evidence exists. Care before large refactors when this is thin.'
226
+ };
227
+ export function fingerprintAxisTooltip(key, value) {
228
+ const pct = Math.round(clamp01(value) * 100);
229
+ const fill = pct >= 70 ? 'Well filled' : pct >= 35 ? 'Partially filled' : 'Thin — expand this dimension if the task needs it';
230
+ return `${CONTEXT_FINGERPRINT_AXIS_HELP[key]} (${fill}: ${pct}%).`;
231
+ }
232
+ export function buildAiReadiness(signals, synthesis) {
233
+ const checks = [
234
+ { label: 'Requirements', ok: Boolean(signals.focusIdeaId) },
235
+ {
236
+ label: 'Relationships',
237
+ ok: ((signals.relationship?.inboundCount ?? 0) +
238
+ (signals.relationship?.outboundCount ?? 0)) > 0
239
+ },
240
+ {
241
+ label: 'History',
242
+ ok: Boolean(signals.developmentHistory?.createdAt || signals.developmentHistory?.modifiedAt)
243
+ },
244
+ {
245
+ label: 'Quality',
246
+ ok: (signals.quality?.unresolvedCount ?? 0) === 0
247
+ },
248
+ { label: 'Risk', ok: synthesis.aiRisk !== 'high' }
249
+ ];
250
+ const okCount = checks.filter(check => check.ok).length;
251
+ const score = clamp01(okCount / checks.length);
252
+ return {
253
+ score,
254
+ ready: score >= 0.6 && synthesis.aiRisk !== 'high',
255
+ checks,
256
+ risk: synthesis.aiRisk
257
+ };
258
+ }
259
+ export function formatFingerprintMarkdown(axes) {
260
+ const bar = (value) => {
261
+ const filled = Math.round(value * 10);
262
+ return `${'█'.repeat(filled)}${'░'.repeat(10 - filled)}`;
263
+ };
264
+ return [
265
+ '## Context fingerprint',
266
+ `- Files ${bar(axes.files)}`,
267
+ `- Requirements ${bar(axes.requirements)}`,
268
+ `- History ${bar(axes.history)}`,
269
+ `- Architecture ${bar(axes.architecture)}`,
270
+ `- Git ${bar(axes.git)}`,
271
+ `- Diagnostics ${bar(axes.diagnostics)}`,
272
+ `- Coverage ${bar(axes.coverage)}`
273
+ ].join('\n');
274
+ }
275
+ export function formatAiReadinessMarkdown(readiness) {
276
+ const pct = `${Math.round(readiness.score * 100)}%`;
277
+ return [
278
+ '## AI readiness',
279
+ `- Score: ${pct} (${readiness.ready ? 'ready' : 'not ready'})`,
280
+ `- Risk: ${readiness.risk}`,
281
+ ...readiness.checks.map(check => `- ${check.ok ? '✓' : '✕'} ${check.label}`)
282
+ ].join('\n');
283
+ }
284
+ export function hotspotBandFromRisk(risk) {
285
+ return risk;
286
+ }
287
+ export function hotspotBorderWidth(band) {
288
+ switch (band) {
289
+ case 'high':
290
+ return 5;
291
+ case 'medium':
292
+ return 3;
293
+ case 'low':
294
+ return 2;
295
+ default:
296
+ return 2;
297
+ }
298
+ }
299
+ export function hotspotBorderColor(band) {
300
+ switch (band) {
301
+ case 'high':
302
+ return '#f14c4c';
303
+ case 'medium':
304
+ return '#cca700';
305
+ case 'low':
306
+ return '#89d185';
307
+ default:
308
+ return '#3c3c3c';
309
+ }
310
+ }
311
+ /** Opacity for impact-radius fade: selected = 1, 1 hop = 0.75, 2 hops = 0.45, farther = 0.2. */
312
+ export function impactOpacityForHopDistance(distance) {
313
+ if (distance === undefined) {
314
+ return 0.2;
315
+ }
316
+ if (distance <= 0) {
317
+ return 1;
318
+ }
319
+ if (distance === 1) {
320
+ return 0.75;
321
+ }
322
+ if (distance === 2) {
323
+ return 0.45;
324
+ }
325
+ return 0.2;
326
+ }
327
+ /** BFS hop distances from a center over undirected edges. */
328
+ export function hopDistancesFromCenter(centerId, edges) {
329
+ const adjacency = new Map();
330
+ for (const edge of edges) {
331
+ if (!adjacency.has(edge.sourceId)) {
332
+ adjacency.set(edge.sourceId, new Set());
333
+ }
334
+ if (!adjacency.has(edge.targetId)) {
335
+ adjacency.set(edge.targetId, new Set());
336
+ }
337
+ adjacency.get(edge.sourceId).add(edge.targetId);
338
+ adjacency.get(edge.targetId).add(edge.sourceId);
339
+ }
340
+ const distances = new Map();
341
+ const queue = [centerId];
342
+ distances.set(centerId, 0);
343
+ while (queue.length > 0) {
344
+ const current = queue.shift();
345
+ const nextDist = (distances.get(current) ?? 0) + 1;
346
+ for (const neighbour of adjacency.get(current) ?? []) {
347
+ if (!distances.has(neighbour)) {
348
+ distances.set(neighbour, nextDist);
349
+ queue.push(neighbour);
350
+ }
351
+ }
352
+ }
353
+ return distances;
354
+ }
355
+ /** Thin requirement-card cue from ref counts (Ideas Summary rows). */
356
+ export function requirementCardCue(inboundCount, outboundCount) {
357
+ const fanout = inboundCount + outboundCount;
358
+ const stability = clamp01(1 - fanout / 24);
359
+ const label = stability >= 0.75
360
+ ? 'Stable'
361
+ : stability >= 0.45
362
+ ? 'Active'
363
+ : 'High churn risk';
364
+ return { stability, label };
365
+ }
366
+ /** Timeline milestones for the ribbon widget. */
367
+ export function timelineMilestones(signals, now = new Date()) {
368
+ const milestones = [];
369
+ const created = parseIsoDate(signals.developmentHistory?.createdAt);
370
+ const modified = parseIsoDate(signals.developmentHistory?.modifiedAt);
371
+ if (created) {
372
+ milestones.push({ id: 'created', label: 'Created', at: created });
373
+ }
374
+ if (modified) {
375
+ milestones.push({ id: 'modified', label: 'Last edit', at: modified });
376
+ }
377
+ milestones.push({ id: 'now', label: 'Now', at: now });
378
+ return milestones.sort((a, b) => a.at.getTime() - b.at.getTime());
379
+ }
380
+ /** Two-point churn intensity 0–1 for the thin heat bar. */
381
+ export function thinChurnIntensity(signals) {
382
+ const days = signals.developmentHistory?.timeSinceTouchedDays;
383
+ if (days === undefined) {
384
+ return 0.15;
385
+ }
386
+ if (days <= 3) {
387
+ return 0.95;
388
+ }
389
+ if (days <= 14) {
390
+ return 0.65;
391
+ }
392
+ if (days <= 60) {
393
+ return 0.35;
394
+ }
395
+ return 0.1;
396
+ }
397
+ //# sourceMappingURL=context-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-signals.js","sourceRoot":"","sources":["../../src/core/context-signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Match indexed file paths against reqlan file_reference targets (files or folders).
3
+ */
4
+ export type FileReferenceMatchKind = 'file' | 'folder';
5
+ export declare function normalizePath(path: string): string;
6
+ export declare function parentDirectories(fileUri: string): string[];
7
+ export declare function matchFileReferenceTarget(targetFile: string, fileUri: string, fileName: string): FileReferenceMatchKind | undefined;
@@ -0,0 +1,39 @@
1
+ export function normalizePath(path) {
2
+ return path.replace(/\\/g, '/').replace(/\/+/g, '/').replace(/^\.\//, '');
3
+ }
4
+ export function parentDirectories(fileUri) {
5
+ const normalized = normalizePath(fileUri);
6
+ const parts = normalized.split('/');
7
+ const dirs = [];
8
+ for (let index = 0; index < parts.length - 1; index++) {
9
+ dirs.push(parts.slice(0, index + 1).join('/'));
10
+ }
11
+ return dirs;
12
+ }
13
+ export function matchFileReferenceTarget(targetFile, fileUri, fileName) {
14
+ const target = normalizePath(targetFile).replace(/\/$/, '');
15
+ const file = normalizePath(fileUri);
16
+ if (!target) {
17
+ return undefined;
18
+ }
19
+ if (target === file || target.endsWith(`/${fileName}`) || file.endsWith(`/${target}`)) {
20
+ return 'file';
21
+ }
22
+ if (fileName && target.endsWith(`/${fileName}`)) {
23
+ return 'file';
24
+ }
25
+ const targetLooksLikeFolder = !target.includes('.') || targetFile.endsWith('/');
26
+ if (targetLooksLikeFolder && (file === target || file.startsWith(`${target}/`))) {
27
+ return 'folder';
28
+ }
29
+ for (const directory of parentDirectories(file)) {
30
+ if (directory === target || directory.endsWith(`/${target}`)) {
31
+ return 'folder';
32
+ }
33
+ }
34
+ if (file.includes(target) || target.includes(file)) {
35
+ return 'file';
36
+ }
37
+ return undefined;
38
+ }
39
+ //# sourceMappingURL=file-path-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-path-match.js","sourceRoot":"","sources":["../../src/core/file-path-match.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACpC,UAAkB,EAClB,OAAe,EACf,QAAgB;IAEhB,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;QACpF,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,qBAAqB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,qBAAqB,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;YAC3D,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * File references are authored relative to the file that defines them, not the
3
+ * workspace root, so `targetFile` alone cannot be opened reliably (e.g. a
4
+ * `../../foo.ts` reference would otherwise be resolved against the workspace
5
+ * root). Resolve it against the defining file's folder so open actions receive
6
+ * a workspace-relative path.
7
+ */
8
+ export declare function resolveReferencedFilePath(targetFile: string, sourceId: string): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Resolve authored file-reference paths against the defining idea's file.
3
+ * Shared by graph slices and reference-list rows so open actions match the editor.
4
+ */
5
+ import { posix } from 'node:path';
6
+ function definingFilePath(sourceId) {
7
+ const separator = sourceId.lastIndexOf('#');
8
+ return separator >= 0 ? sourceId.slice(0, separator) : sourceId;
9
+ }
10
+ /**
11
+ * File references are authored relative to the file that defines them, not the
12
+ * workspace root, so `targetFile` alone cannot be opened reliably (e.g. a
13
+ * `../../foo.ts` reference would otherwise be resolved against the workspace
14
+ * root). Resolve it against the defining file's folder so open actions receive
15
+ * a workspace-relative path.
16
+ */
17
+ export function resolveReferencedFilePath(targetFile, sourceId) {
18
+ const target = targetFile.replace(/\\/g, '/');
19
+ if (target.includes('://') || posix.isAbsolute(target)) {
20
+ return targetFile;
21
+ }
22
+ const definingFile = definingFilePath(sourceId).replace(/\\/g, '/');
23
+ if (!definingFile || definingFile.includes('://') || posix.isAbsolute(definingFile)) {
24
+ return targetFile;
25
+ }
26
+ return posix.join(posix.dirname(definingFile), target);
27
+ }
28
+ //# sourceMappingURL=file-reference-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-reference-resolve.js","sourceRoot":"","sources":["../../src/core/file-reference-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,SAAS,gBAAgB,CAAC,QAAgB;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClF,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { IdeaSummary } from './types.js';
2
+ export interface IdeaReferenceStore {
3
+ listReferencesForIdea(ideaId: string): Promise<Array<{
4
+ direction: 'inbound' | 'outbound';
5
+ sourceIdeaId?: string;
6
+ targetIdeaId?: string;
7
+ }>>;
8
+ getIdea(id: string): Promise<IdeaSummary | undefined>;
9
+ }
10
+ export declare function resolveBidirectionalIdeaReferences(store: IdeaReferenceStore, ideaId: string): Promise<{
11
+ inbound: IdeaSummary[];
12
+ outbound: IdeaSummary[];
13
+ }>;
@@ -0,0 +1,25 @@
1
+ export async function resolveBidirectionalIdeaReferences(store, ideaId) {
2
+ const rows = await store.listReferencesForIdea(ideaId);
3
+ const inbound = [];
4
+ const outbound = [];
5
+ const seenInbound = new Set();
6
+ const seenOutbound = new Set();
7
+ for (const row of rows) {
8
+ if (row.direction === 'inbound' && row.sourceIdeaId && !seenInbound.has(row.sourceIdeaId)) {
9
+ seenInbound.add(row.sourceIdeaId);
10
+ const idea = await store.getIdea(row.sourceIdeaId);
11
+ if (idea) {
12
+ inbound.push(idea);
13
+ }
14
+ }
15
+ if (row.direction === 'outbound' && row.targetIdeaId && !seenOutbound.has(row.targetIdeaId)) {
16
+ seenOutbound.add(row.targetIdeaId);
17
+ const idea = await store.getIdea(row.targetIdeaId);
18
+ if (idea) {
19
+ outbound.push(idea);
20
+ }
21
+ }
22
+ }
23
+ return { inbound, outbound };
24
+ }
25
+ //# sourceMappingURL=idea-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea-references.js","sourceRoot":"","sources":["../../src/core/idea-references.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACpD,KAAyB,EACzB,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACxF,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1F,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { IndexError } from './analytical-store.js';
2
+ export type { IndexErrorPhase } from './analytical-store.js';
3
+ export interface IndexErrorDetail {
4
+ summary: string;
5
+ file?: string;
6
+ ideas?: string[];
7
+ phase?: string;
8
+ cause?: string;
9
+ }
10
+ export declare function errorCauseMessage(cause: unknown): string | undefined;
11
+ export interface FileIndexIssueView {
12
+ file: string;
13
+ fileUri: string;
14
+ line: number;
15
+ column: number;
16
+ message: string;
17
+ phase: string;
18
+ location: string;
19
+ ideaNames?: string[];
20
+ cause?: string;
21
+ }
22
+ export declare function toFileIndexIssueView(issue: import('./analytical-store.js').FileIndexIssue, relativePath?: (fileUri: string) => string): FileIndexIssueView;
23
+ export declare function toIndexErrorDetail(error: IndexError, relativePath?: (fileUri: string) => string): IndexErrorDetail;
@@ -0,0 +1,33 @@
1
+ export function errorCauseMessage(cause) {
2
+ if (cause instanceof Error) {
3
+ return cause.message;
4
+ }
5
+ if (typeof cause === 'string' && cause) {
6
+ return cause;
7
+ }
8
+ return undefined;
9
+ }
10
+ export function toFileIndexIssueView(issue, relativePath = uri => uri) {
11
+ const file = relativePath(issue.fileUri);
12
+ return {
13
+ file,
14
+ fileUri: issue.fileUri,
15
+ line: issue.line,
16
+ column: issue.column,
17
+ message: issue.message,
18
+ phase: issue.phase,
19
+ location: `${file}:${issue.line + 1}:${issue.column + 1}`,
20
+ ideaNames: issue.ideaNames?.length ? issue.ideaNames : undefined,
21
+ cause: issue.cause
22
+ };
23
+ }
24
+ export function toIndexErrorDetail(error, relativePath = uri => uri) {
25
+ return {
26
+ summary: error.message,
27
+ file: error.fileUri ? relativePath(error.fileUri) : undefined,
28
+ ideas: error.ideaNames?.length ? error.ideaNames : undefined,
29
+ phase: error.phase,
30
+ cause: errorCauseMessage(error.cause)
31
+ };
32
+ }
33
+ //# sourceMappingURL=index-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-error.js","sourceRoot":"","sources":["../../src/core/index-error.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAcD,MAAM,UAAU,oBAAoB,CAChC,KAAqD,EACrD,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAChE,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,KAAiB,EACjB,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7D,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;KACxC,CAAC;AACN,CAAC"}