@reqlan/analytical 0.9.1 → 0.10.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 (179) hide show
  1. package/README.md +13 -2
  2. package/README.template.md +1 -1
  3. package/out/core/barrel-page.d.ts +2 -1
  4. package/out/core/barrel-page.js +18 -83
  5. package/out/core/barrel-page.js.map +1 -1
  6. package/out/core/base-discovery.d.ts +6 -0
  7. package/out/core/base-discovery.js +47 -2
  8. package/out/core/base-discovery.js.map +1 -1
  9. package/out/core/create-base.js +10 -14
  10. package/out/core/create-base.js.map +1 -1
  11. package/out/core/file-reference-resolve.js +3 -1
  12. package/out/core/file-reference-resolve.js.map +1 -1
  13. package/out/core/index-error.d.ts +3 -3
  14. package/out/core/index-error.js.map +1 -1
  15. package/out/core/index-state-types.d.ts +47 -0
  16. package/out/core/index-state-types.js +11 -0
  17. package/out/core/index-state-types.js.map +1 -0
  18. package/out/core/path-relative.d.ts +15 -0
  19. package/out/core/path-relative.js +84 -0
  20. package/out/core/path-relative.js.map +1 -0
  21. package/out/core/rqignore.js +62 -62
  22. package/out/core/rqignore.js.map +1 -1
  23. package/out/core/types.d.ts +4 -3
  24. package/out/core/types.js +4 -1
  25. package/out/core/types.js.map +1 -1
  26. package/out/core/workspace-paths.d.ts +1 -2
  27. package/out/core/workspace-paths.js +6 -46
  28. package/out/core/workspace-paths.js.map +1 -1
  29. package/out/export/build-export-snapshot.js +1 -1
  30. package/out/export/build-export-snapshot.js.map +1 -1
  31. package/out/export/export-utils.d.ts +5 -0
  32. package/out/export/export-utils.js +38 -0
  33. package/out/export/export-utils.js.map +1 -0
  34. package/out/export/write-csv-export.js +1 -1
  35. package/out/export/write-csv-export.js.map +1 -1
  36. package/out/export/write-markdown-export.js +1 -1
  37. package/out/export/write-markdown-export.js.map +1 -1
  38. package/out/index-store/base-registry.d.ts +2 -3
  39. package/out/index-store/base-registry.js +8 -4
  40. package/out/index-store/base-registry.js.map +1 -1
  41. package/out/index-store/fuzzy-search-hit.d.ts +10 -0
  42. package/out/index-store/fuzzy-search-hit.js +2 -0
  43. package/out/index-store/fuzzy-search-hit.js.map +1 -0
  44. package/out/index-store/index-diagnostics-store.d.ts +4 -0
  45. package/out/index-store/index-diagnostics-store.js +44 -88
  46. package/out/index-store/index-diagnostics-store.js.map +1 -1
  47. package/out/index-store/index-file-error.d.ts +1 -1
  48. package/out/index-store/index-parse-issues.d.ts +4 -3
  49. package/out/index-store/index-parse-issues.js +0 -38
  50. package/out/index-store/index-parse-issues.js.map +1 -1
  51. package/out/index-store/index-status.d.ts +1 -1
  52. package/out/index-store/sqlite-store.d.ts +6 -2
  53. package/out/index-store/sqlite-store.js +70 -613
  54. package/out/index-store/sqlite-store.js.map +1 -1
  55. package/out/index-store/webview-graph-queries.d.ts +5 -0
  56. package/out/index-store/webview-graph-queries.js.map +1 -1
  57. package/out/index-store/workspace-index-file.d.ts +3 -14
  58. package/out/index-store/workspace-index-file.js +1 -114
  59. package/out/index-store/workspace-index-file.js.map +1 -1
  60. package/out/index-store/workspace-index-sync.d.ts +4 -17
  61. package/out/index-store/workspace-index-sync.js +29 -11
  62. package/out/index-store/workspace-index-sync.js.map +1 -1
  63. package/out/index-store/workspace-index.d.ts +36 -9
  64. package/out/index-store/workspace-index.js +223 -120
  65. package/out/index-store/workspace-index.js.map +1 -1
  66. package/out/index.d.ts +16 -43
  67. package/out/index.js +9 -25
  68. package/out/index.js.map +1 -1
  69. package/out/native/generated.d.ts +102 -0
  70. package/out/native/generated.js +4 -0
  71. package/out/native/generated.js.map +1 -0
  72. package/out/native/index.d.ts +17 -0
  73. package/out/native/index.js +12 -0
  74. package/out/native/index.js.map +1 -0
  75. package/out/native/load-native.d.ts +50 -0
  76. package/out/native/load-native.js +152 -0
  77. package/out/native/load-native.js.map +1 -0
  78. package/out/{analysis-api.d.ts → native/native-analysis-api.d.ts} +19 -19
  79. package/out/native/native-analysis-api.js +212 -0
  80. package/out/native/native-analysis-api.js.map +1 -0
  81. package/out/native/native-index-store.d.ts +5 -0
  82. package/out/native/native-index-store.js +6 -0
  83. package/out/native/native-index-store.js.map +1 -0
  84. package/out/native/native-sql-db.d.ts +135 -0
  85. package/out/native/native-sql-db.js +217 -0
  86. package/out/native/native-sql-db.js.map +1 -0
  87. package/out/native/native-workspace-index.d.ts +164 -0
  88. package/out/native/native-workspace-index.js +283 -0
  89. package/out/native/native-workspace-index.js.map +1 -0
  90. package/out/native/open-analysis-api.d.ts +16 -0
  91. package/out/native/open-analysis-api.js +21 -0
  92. package/out/native/open-analysis-api.js.map +1 -0
  93. package/out/native/parse-source.d.ts +24 -0
  94. package/out/native/parse-source.js +26 -0
  95. package/out/native/parse-source.js.map +1 -0
  96. package/package.json +18 -30
  97. package/out/analysis/analyser-registry.d.ts +0 -21
  98. package/out/analysis/analyser-registry.js +0 -33
  99. package/out/analysis/analyser-registry.js.map +0 -1
  100. package/out/analysis/completion-tracking-analyser.d.ts +0 -3
  101. package/out/analysis/completion-tracking-analyser.js +0 -37
  102. package/out/analysis/completion-tracking-analyser.js.map +0 -1
  103. package/out/analysis/contextual-search.d.ts +0 -26
  104. package/out/analysis/contextual-search.js +0 -94
  105. package/out/analysis/contextual-search.js.map +0 -1
  106. package/out/analysis/deprecation-impact-analyser.d.ts +0 -3
  107. package/out/analysis/deprecation-impact-analyser.js +0 -21
  108. package/out/analysis/deprecation-impact-analyser.js.map +0 -1
  109. package/out/analysis/file-related-analyser.d.ts +0 -5
  110. package/out/analysis/file-related-analyser.js +0 -41
  111. package/out/analysis/file-related-analyser.js.map +0 -1
  112. package/out/analysis/fuzzy-search-analyser.d.ts +0 -17
  113. package/out/analysis/fuzzy-search-analyser.js +0 -25
  114. package/out/analysis/fuzzy-search-analyser.js.map +0 -1
  115. package/out/analysis/fuzzy-search-worker-client.d.ts +0 -39
  116. package/out/analysis/fuzzy-search-worker-client.js +0 -178
  117. package/out/analysis/fuzzy-search-worker-client.js.map +0 -1
  118. package/out/analysis/fuzzy-search-worker.d.ts +0 -32
  119. package/out/analysis/fuzzy-search-worker.js +0 -81
  120. package/out/analysis/fuzzy-search-worker.js.map +0 -1
  121. package/out/analysis/fuzzy-search.d.ts +0 -62
  122. package/out/analysis/fuzzy-search.js +0 -471
  123. package/out/analysis/fuzzy-search.js.map +0 -1
  124. package/out/analysis/git-dates-analyser.d.ts +0 -12
  125. package/out/analysis/git-dates-analyser.js +0 -96
  126. package/out/analysis/git-dates-analyser.js.map +0 -1
  127. package/out/analysis/list-ideas-analyser.d.ts +0 -3
  128. package/out/analysis/list-ideas-analyser.js +0 -7
  129. package/out/analysis/list-ideas-analyser.js.map +0 -1
  130. package/out/analysis/local-graph-analyser.d.ts +0 -6
  131. package/out/analysis/local-graph-analyser.js +0 -42
  132. package/out/analysis/local-graph-analyser.js.map +0 -1
  133. package/out/analysis/semantic-search-analyser.d.ts +0 -8
  134. package/out/analysis/semantic-search-analyser.js +0 -51
  135. package/out/analysis/semantic-search-analyser.js.map +0 -1
  136. package/out/analysis-api.js +0 -199
  137. package/out/analysis-api.js.map +0 -1
  138. package/out/core/analytical-store.d.ts +0 -85
  139. package/out/core/analytical-store.js +0 -143
  140. package/out/core/analytical-store.js.map +0 -1
  141. package/out/core/context-model.d.ts +0 -204
  142. package/out/core/context-model.js +0 -36
  143. package/out/core/context-model.js.map +0 -1
  144. package/out/core/context-signals.d.ts +0 -154
  145. package/out/core/context-signals.js +0 -406
  146. package/out/core/context-signals.js.map +0 -1
  147. package/out/create-runtime.d.ts +0 -47
  148. package/out/create-runtime.js +0 -79
  149. package/out/create-runtime.js.map +0 -1
  150. package/out/export/export-html.d.ts +0 -4
  151. package/out/export/export-html.js +0 -12
  152. package/out/export/export-html.js.map +0 -1
  153. package/out/export/html-export-assets.d.ts +0 -3
  154. package/out/export/html-export-assets.js +0 -2294
  155. package/out/export/html-export-assets.js.map +0 -1
  156. package/out/export/html-export-template.d.ts +0 -18
  157. package/out/export/html-export-template.js +0 -1154
  158. package/out/export/html-export-template.js.map +0 -1
  159. package/out/export/html-export-utils.d.ts +0 -86
  160. package/out/export/html-export-utils.js +0 -485
  161. package/out/export/html-export-utils.js.map +0 -1
  162. package/out/export/write-html-export.d.ts +0 -2
  163. package/out/export/write-html-export.js +0 -181
  164. package/out/export/write-html-export.js.map +0 -1
  165. package/out/graph/physics-core-source.d.ts +0 -5
  166. package/out/graph/physics-core-source.js +0 -8
  167. package/out/graph/physics-core-source.js.map +0 -1
  168. package/out/graph/physics-core.d.ts +0 -141
  169. package/out/graph/physics-core.js +0 -237
  170. package/out/graph/physics-core.js.map +0 -1
  171. package/out/index-store/file-treatment.d.ts +0 -40
  172. package/out/index-store/file-treatment.js +0 -144
  173. package/out/index-store/file-treatment.js.map +0 -1
  174. package/out/index-store/idea-extractor.d.ts +0 -11
  175. package/out/index-store/idea-extractor.js +0 -351
  176. package/out/index-store/idea-extractor.js.map +0 -1
  177. package/out/index-store/overview-coverage.d.ts +0 -23
  178. package/out/index-store/overview-coverage.js +0 -254
  179. package/out/index-store/overview-coverage.js.map +0 -1
@@ -1,406 +0,0 @@
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 one or more centers over undirected edges (min distance). */
328
- export function hopDistancesFromCenters(centerIds, 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 = [];
342
- for (const centerId of centerIds) {
343
- if (!distances.has(centerId)) {
344
- distances.set(centerId, 0);
345
- queue.push(centerId);
346
- }
347
- }
348
- while (queue.length > 0) {
349
- const current = queue.shift();
350
- const nextDist = (distances.get(current) ?? 0) + 1;
351
- for (const neighbour of adjacency.get(current) ?? []) {
352
- if (!distances.has(neighbour)) {
353
- distances.set(neighbour, nextDist);
354
- queue.push(neighbour);
355
- }
356
- }
357
- }
358
- return distances;
359
- }
360
- /** BFS hop distances from a center over undirected edges. */
361
- export function hopDistancesFromCenter(centerId, edges) {
362
- return hopDistancesFromCenters([centerId], edges);
363
- }
364
- /** Thin requirement-card cue from ref counts (Ideas Summary rows). */
365
- export function requirementCardCue(inboundCount, outboundCount) {
366
- const fanout = inboundCount + outboundCount;
367
- const stability = clamp01(1 - fanout / 24);
368
- const label = stability >= 0.75
369
- ? 'Stable'
370
- : stability >= 0.45
371
- ? 'Active'
372
- : 'High churn risk';
373
- return { stability, label };
374
- }
375
- /** Timeline milestones for the ribbon widget. */
376
- export function timelineMilestones(signals, now = new Date()) {
377
- const milestones = [];
378
- const created = parseIsoDate(signals.developmentHistory?.createdAt);
379
- const modified = parseIsoDate(signals.developmentHistory?.modifiedAt);
380
- if (created) {
381
- milestones.push({ id: 'created', label: 'Created', at: created });
382
- }
383
- if (modified) {
384
- milestones.push({ id: 'modified', label: 'Last edit', at: modified });
385
- }
386
- milestones.push({ id: 'now', label: 'Now', at: now });
387
- return milestones.sort((a, b) => a.at.getTime() - b.at.getTime());
388
- }
389
- /** Two-point churn intensity 0–1 for the thin heat bar. */
390
- export function thinChurnIntensity(signals) {
391
- const days = signals.developmentHistory?.timeSinceTouchedDays;
392
- if (days === undefined) {
393
- return 0.15;
394
- }
395
- if (days <= 3) {
396
- return 0.95;
397
- }
398
- if (days <= 14) {
399
- return 0.65;
400
- }
401
- if (days <= 60) {
402
- return 0.35;
403
- }
404
- return 0.1;
405
- }
406
- //# sourceMappingURL=context-signals.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-signals.js","sourceRoot":"","sources":["../../src/core/context-signals.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- import { type AnalyticalStore } from './core/analytical-store.js';
2
- import { type BaseDescriptor } from './core/base-discovery.js';
3
- import { AnalyserRegistry } from './analysis/analyser-registry.js';
4
- import { WorkspaceIndex } from './index-store/workspace-index.js';
5
- export interface AnalysisRuntimeOptions {
6
- /**
7
- * Search root for base discovery (VS Code workspace folder / CLI resolved root).
8
- * Bases are directories under this root that own `.reqlan`.
9
- */
10
- workspaceRoot: string;
11
- /** Override application-memory directory for the selected base; default is `<base>/.reqlan`. */
12
- storagePath?: string;
13
- /**
14
- * Prefer this cwd when choosing among multiple bases (nearest containing base).
15
- * Defaults to `workspaceRoot`.
16
- */
17
- cwd?: string;
18
- /**
19
- * When set, skip discovery and use this absolute path as the single base root
20
- * (must own `.reqlan`, or `storagePath` override).
21
- */
22
- baseRoot?: string;
23
- }
24
- export interface AnalysisRuntime {
25
- store: AnalyticalStore;
26
- index: WorkspaceIndex;
27
- analysers: AnalyserRegistry;
28
- /** Selected base root (may differ from discovery search root). */
29
- workspaceRoot: string;
30
- /** All bases discovered under the search root (empty when forced via storagePath alone). */
31
- bases: BaseDescriptor[];
32
- /** Selected base descriptor when discovery found one. */
33
- base?: BaseDescriptor;
34
- makeContext: () => {
35
- store: WorkspaceIndex['indexStore'];
36
- analytical: AnalyticalStore;
37
- workspaceRoot: string;
38
- };
39
- }
40
- /**
41
- * Create a headless analysis runtime bound to one base.
42
- * Discovers `.reqlan`-marked bases under `workspaceRoot` and selects the nearest to `cwd`.
43
- * Throws when no base exists and no `storagePath` / `baseRoot` override is provided.
44
- */
45
- export declare function createAnalysisRuntime(options: AnalysisRuntimeOptions): AnalysisRuntime;
46
- export declare function activateAnalysisRuntime(runtime: AnalysisRuntime): Promise<void>;
47
- export declare function deactivateAnalysisRuntime(runtime: AnalysisRuntime): Promise<void>;
@@ -1,79 +0,0 @@
1
- import { createAnalyticalStore } from './core/analytical-store.js';
2
- import { resolveApplicationMemoryPath } from './core/application-memory.js';
3
- import { discoverBases, selectDefaultBase } from './core/base-discovery.js';
4
- import { AnalyserRegistry } from './analysis/analyser-registry.js';
5
- import { listAllIdeasAnalyser } from './analysis/list-ideas-analyser.js';
6
- import { fileRelatedAnalyser } from './analysis/file-related-analyser.js';
7
- import { deprecationImpactAnalyser } from './analysis/deprecation-impact-analyser.js';
8
- import { gitDatesAnalyser } from './analysis/git-dates-analyser.js';
9
- import { completionTrackingAnalyser } from './analysis/completion-tracking-analyser.js';
10
- import { localGraphAnalyser } from './analysis/local-graph-analyser.js';
11
- import { semanticSearchAnalyser } from './analysis/semantic-search-analyser.js';
12
- import { fuzzySearchAnalyser } from './analysis/fuzzy-search-analyser.js';
13
- import { WorkspaceIndex } from './index-store/workspace-index.js';
14
- function registerDefaultAnalysers(analysers) {
15
- analysers.register(listAllIdeasAnalyser);
16
- analysers.register(fileRelatedAnalyser);
17
- analysers.register(deprecationImpactAnalyser);
18
- analysers.register(gitDatesAnalyser);
19
- analysers.register(completionTrackingAnalyser);
20
- analysers.register(localGraphAnalyser);
21
- analysers.register(semanticSearchAnalyser);
22
- analysers.register(fuzzySearchAnalyser);
23
- }
24
- /**
25
- * Create a headless analysis runtime bound to one base.
26
- * Discovers `.reqlan`-marked bases under `workspaceRoot` and selects the nearest to `cwd`.
27
- * Throws when no base exists and no `storagePath` / `baseRoot` override is provided.
28
- */
29
- export function createAnalysisRuntime(options) {
30
- const searchRoot = options.workspaceRoot;
31
- const cwd = options.cwd ?? searchRoot;
32
- let baseRoot;
33
- let bases = [];
34
- let base;
35
- if (options.baseRoot) {
36
- baseRoot = options.baseRoot;
37
- bases = discoverBases([searchRoot]);
38
- base = bases.find(b => b.root === baseRoot);
39
- }
40
- else if (options.storagePath?.trim()) {
41
- // Explicit store override: treat workspaceRoot as the base root.
42
- baseRoot = searchRoot;
43
- }
44
- else {
45
- bases = discoverBases([searchRoot]);
46
- base = selectDefaultBase(bases, cwd);
47
- if (!base) {
48
- throw new Error(`No reqlan base found under ${searchRoot}. Create a .reqlan folder at the project root to initialize a base.`);
49
- }
50
- baseRoot = base.root;
51
- }
52
- const store = createAnalyticalStore();
53
- const storagePath = resolveApplicationMemoryPath(baseRoot, options.storagePath);
54
- const index = new WorkspaceIndex(store, storagePath, baseRoot);
55
- const analysers = new AnalyserRegistry();
56
- registerDefaultAnalysers(analysers);
57
- const makeContext = () => ({
58
- store: index.indexStore,
59
- analytical: store,
60
- workspaceRoot: baseRoot
61
- });
62
- return {
63
- store,
64
- index,
65
- analysers,
66
- workspaceRoot: baseRoot,
67
- bases,
68
- base,
69
- makeContext
70
- };
71
- }
72
- export async function activateAnalysisRuntime(runtime) {
73
- await runtime.index.activate();
74
- }
75
- export async function deactivateAnalysisRuntime(runtime) {
76
- await runtime.index.deactivate();
77
- runtime.store.getState().reset();
78
- }
79
- //# sourceMappingURL=create-runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-runtime.js","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { SqliteIndexStore } from '../index-store/sqlite-store.js';
2
- import type { ExportProgressCallback, ExportRequest, ExportResult } from './types.js';
3
- /** Build a snapshot and write the multi-file HTML export site. */
4
- export declare function exportHtml(store: SqliteIndexStore, request: ExportRequest, onProgress?: ExportProgressCallback): Promise<ExportResult>;
@@ -1,12 +0,0 @@
1
- import { buildExportSnapshot } from './build-export-snapshot.js';
2
- import { writeHtmlExport } from './write-html-export.js';
3
- /** Build a snapshot and write the multi-file HTML export site. */
4
- export async function exportHtml(store, request, onProgress) {
5
- onProgress?.({
6
- phase: 'snapshot',
7
- message: 'Building export snapshot…',
8
- });
9
- const snapshot = await buildExportSnapshot(store, request, onProgress);
10
- return writeHtmlExport(snapshot, request, onProgress);
11
- }
12
- //# sourceMappingURL=export-html.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export-html.js","sourceRoot":"","sources":["../../src/export/export-html.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,KAAuB,EACvB,OAAsB,EACtB,UAAmC;IAEnC,UAAU,EAAE,CAAC;QACT,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,2BAA2B;KACvC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACvE,OAAO,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,3 +0,0 @@
1
- export declare const SHARED_STYLES = "\n:root {\n color-scheme: dark;\n --bg: #14100e;\n --bg-elev: #1f1815;\n --bg-soft: #1f1815;\n --bg-raised: #2a211d;\n --fg: #ebe4de;\n --muted: #a89488;\n --faint: #6e5f56;\n --line: #3d2f28;\n --accent: #07a0e5;\n --accent-strong: #0bbefb;\n --accent-dim: #0371c1;\n --rust: #b85c38;\n --rust-muted: #8a4530;\n --good: #4ade80;\n --warn: #fbbf24;\n --bad: #fb7185;\n font-family: Inter, system-ui, sans-serif;\n}\n* { box-sizing: border-box; }\nhtml {\n /* Keep fragment targets below the sticky .topbar (nav + padding \u2248 4.5\u20135rem). */\n scroll-padding-top: 5.5rem;\n}\nbody {\n margin: 0;\n background: var(--bg);\n color: var(--fg);\n line-height: 1.55;\n}\na { color: var(--accent-strong); text-decoration: none; }\na:hover { color: var(--accent); }\nmain.layout {\n max-width: 1360px; margin: 0 auto; padding: 1.5rem;\n display: flex; flex-direction: column; gap: 1.5rem;\n}\n.topbar {\n position: sticky; top: 0; z-index: 10;\n background: var(--bg-elev); border-bottom: 1px solid var(--line); margin: 0 -1.5rem;\n padding: 0.9rem 1.5rem;\n}\n.topbar-inner, .hero, .split, .grid, .detail-grid { display: grid; gap: 1.5rem; }\n.topbar-inner { grid-template-columns: 1.3fr auto; align-items: center; }\n.nav { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; }\n.nav a {\n padding: 0.45rem 0.75rem; border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); border: 1px solid var(--line);\n}\n.nav a:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }\n.nav a.active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-raised));\n color: var(--fg); border-color: var(--rust);\n}\n.nav a.brand-link {\n background: transparent;\n border-color: transparent;\n color: var(--fg);\n font-weight: 650;\n letter-spacing: 0.02em;\n padding-left: 0.15rem;\n padding-right: 0.9rem;\n}\n.nav a.brand-link:hover {\n color: var(--accent);\n border-color: transparent;\n background: transparent;\n}\n.hero { grid-template-columns: 2fr 1fr; }\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 140px), 1fr));\n gap: 1.5rem;\n row-gap: 1.5rem;\n column-gap: 1.5rem;\n}\n.split, .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));\n gap: 1.5rem;\n}\n.panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result {\n background: var(--bg-raised);\n border: 1px solid var(--line);\n border-radius: 10px;\n}\n.panel, .card, .table-shell, .graph-shell, .print-card, .search-result { padding: 1rem 1.1rem; }\n.metric { padding: 0; overflow: hidden; }\n.metric-link, .metric > span, .metric > strong {\n display: flex; flex-direction: column; gap: 0.35rem; padding: 1rem; color: inherit;\n}\n.metric-link:hover { background: color-mix(in srgb, var(--accent) 10%, var(--bg-raised)); }\n.metric-label, .subtle, .eyebrow, .breadcrumbs { color: var(--muted); }\n.metric-value { font-size: 1.75rem; color: var(--accent-strong); }\n.eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.75rem; color: var(--rust); }\n.page-header { display: grid; gap: 0.55rem; }\n.page-header h1 { margin: 0; }\n.page-header .eyebrow { margin: 0; }\n.page-header .subtle { margin: 0; }\n.toolbar {\n display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; justify-content: space-between;\n margin-bottom: 0.9rem;\n}\n.toolbar .actions, .pill-row, .breadcrumbs { display: flex; gap: 0.75rem; row-gap: 0.85rem; flex-wrap: wrap; align-items: center; }\n.chip, .pill {\n display: inline-flex; align-items: center; gap: 0.35rem;\n padding: 0.28rem 0.6rem; border-radius: 8px;\n border: 1px solid var(--line); background: var(--bg); color: var(--muted);\n}\na.pill:hover { color: var(--accent-strong); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.graph-controls-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n align-items: center;\n margin-bottom: 0.9rem;\n padding: 0.8rem;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-shell > .pill-row { margin-bottom: 0.9rem; }\n.graph-filter {\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd {\n position: relative;\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.55rem;\n width: 100%;\n min-height: 2.35rem;\n padding: 0.4rem 0.75rem;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg-soft);\n color: var(--fg);\n font: inherit;\n cursor: pointer;\n text-align: left;\n}\n.scd.is-open .scd-trigger,\n.scd-trigger:hover {\n border-color: var(--accent-dim);\n}\n.scd.has-selection .scd-trigger {\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.scd.is-searching .scd-trigger {\n border-color: var(--line);\n}\n.scd.is-loading .scd-trigger {\n opacity: 0.72;\n}\n.scd-trigger-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-chevron {\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n opacity: 0.7;\n flex: 0 0 auto;\n}\n.scd.is-open .scd-chevron { transform: rotate(180deg); }\n.scd-panel {\n position: absolute;\n z-index: 50;\n top: calc(100% + 0.35rem);\n left: 0;\n right: auto;\n width: max(100%, 15rem);\n max-width: min(20rem, 80vw);\n max-height: 18rem;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg-elev);\n box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35);\n overflow: hidden;\n}\n/* Author display:flex overrides the UA [hidden] rule; keep closed panels invisible. */\n.scd-panel[hidden] {\n display: none;\n}\n.scd-search-row {\n display: flex;\n gap: 0.45rem;\n padding: 0.65rem;\n border-bottom: 1px solid var(--line);\n opacity: 0.72;\n}\n.scd-search-row.is-active { opacity: 1; }\n.scd-search {\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.55rem;\n border: 1px solid transparent;\n border-radius: 6px;\n background: color-mix(in srgb, var(--bg) 88%, transparent);\n color: var(--muted);\n font: inherit;\n}\n.scd.is-searching .scd-search,\n.scd-search:focus {\n border-color: var(--accent-dim);\n background: var(--bg);\n color: var(--fg);\n outline: none;\n}\n.scd-clear {\n border: none;\n background: transparent;\n color: var(--accent-strong);\n font: inherit;\n cursor: pointer;\n}\n.scd-list {\n overflow: auto;\n padding: 0.25rem 0 0.55rem;\n}\n.scd-group-label {\n padding: 0.55rem 0.85rem 0.25rem;\n font-size: 0.72rem;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--muted);\n}\n.scd-option {\n display: flex;\n align-items: center;\n gap: 0.55rem;\n padding: 0.45rem 0.85rem;\n cursor: pointer;\n color: var(--fg);\n}\n.scd-option:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }\n.scd-option input { margin: 0; }\n.scd-option-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-option-count {\n flex: 0 0 auto;\n font-variant-numeric: tabular-nums;\n font-size: 0.85em;\n color: var(--muted);\n opacity: 0.65;\n}\n.scd-option.is-special .scd-option-label { font-style: italic; }\n.scd-option.is-not-present .scd-option-label { color: var(--faint); }\n.scd-option.is-empty .scd-option-label { color: var(--accent-strong); }\n.scd-option.is-unspecified .scd-option-label { color: var(--rust-muted); }\n.scd-empty {\n margin: 0;\n padding: 0.85rem;\n color: var(--muted);\n font-size: 0.9rem;\n}\n.rollup-list .rollup-special dt {\n font-style: italic;\n}\n.rollup-list .rollup-not-present dt {\n color: var(--faint);\n}\n.rollup-list .rollup-empty dt {\n color: var(--accent-strong);\n}\n.rollup-list .rollup-unspecified dt {\n color: var(--rust-muted);\n}\n.graph-action {\n border: 1px solid var(--line);\n background: var(--bg-soft);\n color: var(--fg);\n border-radius: 8px;\n padding: 0.7rem 0.9rem;\n cursor: pointer;\n}\n.graph-action:hover { border-color: var(--accent-dim); color: var(--accent-strong); }\n.graph-action.is-active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-soft));\n border-color: var(--rust);\n color: var(--fg);\n}\n.graph-file-treatment {\n display: inline-flex;\n align-items: center;\n}\n.graph-file-treatment .graph-select,\nselect.graph-action {\n border-radius: 8px;\n padding-right: 1.6rem;\n cursor: pointer;\n}\n.visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n.graph-status {\n color: var(--muted);\n font-size: 0.92rem;\n margin-left: auto;\n}\n.searchbar, select, input[type=\"search\"] {\n width: min(100%, 440px); background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 8px; padding: 0.75rem 0.9rem;\n}\n.searchbar:focus, select:focus, input[type=\"search\"]:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\ntable { width: 100%; border-collapse: collapse; }\nth, td {\n padding: 0.75rem 0.65rem; text-align: left; border-bottom: 1px solid var(--line); vertical-align: top;\n}\nth { color: var(--muted); font-size: 0.94rem; }\ntbody tr:hover { background: var(--bg-raised); }\n.table-shell { overflow-x: auto; }\n.scroll-window {\n --scroll-window-max: min(28rem, 50vh);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window {\n max-height: var(--scroll-window-max);\n overflow: auto;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window > table {\n margin: 0;\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window .entity-list,\nbody[data-runtime-mode=\"interactive\"] .scroll-window .rollup-list {\n padding: 0.75rem;\n}\n.sortable-th { padding: 0.45rem 0.4rem; }\n.sort-button {\n display: inline-flex; align-items: center; gap: 0.35rem;\n width: 100%; margin: 0; padding: 0.3rem 0.25rem;\n border: 0; background: transparent; color: inherit;\n font: inherit; text-align: left; cursor: pointer;\n}\n.sort-button:hover { color: var(--fg); }\n.sort-button.sort-active { color: var(--accent-strong); }\n.sort-indicator { color: var(--faint); font-size: 0.8em; min-width: 1em; }\n.sort-button.sort-active .sort-indicator { color: var(--accent-strong); }\n.table-filter-toggle {\n display: inline-flex; align-items: center; justify-content: center;\n width: 2.25rem; height: 2.25rem; padding: 0;\n border: 1px solid var(--line); border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); cursor: pointer;\n}\n.table-filter-toggle:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.table-filter-toggle.is-active {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));\n}\n.table-filter-toggle.has-filters:not(.is-active) {\n color: var(--accent-strong);\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.table-filter-toggle svg { width: 1rem; height: 1rem; display: block; }\n.table-filter-actions {\n display: flex; justify-content: flex-end; gap: 0.55rem;\n margin-bottom: 0.65rem;\n}\n.column-filter-row { display: none; }\n.column-filter-row.is-open { display: table-row; }\n.column-filter-row th {\n padding: 0.35rem 0.4rem 0.75rem; border-bottom: 1px solid var(--line); font-weight: 400;\n}\n.column-filter {\n width: 100%; min-width: 4.5rem; background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 6px; padding: 0.4rem 0.55rem; font-size: 0.85rem;\n}\n.column-filter:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead tr:first-child th {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead .column-filter-row.is-open th {\n position: sticky;\n top: 2.65rem;\n z-index: 1;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\n.entity-list {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 1.5rem;\n}\n.entity-card {\n border: 1px solid var(--line); border-radius: 10px; padding: 0.9rem 1rem; background: var(--bg);\n color: inherit;\n min-width: 0;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.entity-card:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.entity-card h3, .entity-card p { margin: 0; }\n.entity-card p + p, .entity-card strong + p, .entity-card h3 + p { margin-top: 0.35rem; }\n.print-card {\n min-width: 0;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n scroll-margin-top: 5.5rem;\n}\n.print-card > h3 { overflow-wrap: anywhere; }\n.print-attrs {\n display: grid;\n gap: 0.45rem;\n margin: 0.75rem 0 0;\n}\n.print-attrs div {\n display: grid;\n grid-template-columns: minmax(0, 8rem) minmax(0, 1fr);\n gap: 0.65rem;\n border-bottom: 1px solid var(--line);\n padding-bottom: 0.35rem;\n}\n.print-attrs dt {\n margin: 0;\n color: var(--muted);\n font-weight: 600;\n overflow-wrap: anywhere;\n}\n.print-attrs dd {\n margin: 0;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.print-button {\n appearance: none;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));\n color: var(--fg);\n font: inherit;\n font-weight: 600;\n padding: 0.45rem 0.9rem;\n cursor: pointer;\n}\n.print-button:hover {\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n background: color-mix(in srgb, var(--accent) 28%, var(--bg-raised));\n}\n.panel > h2, .table-shell > h2, .graph-shell > h2, .print-card > h3 { margin-top: 0; margin-bottom: 0.75rem; }\n.toolbar h2 { margin: 0; }\n.rollup-list { display: grid; gap: 0.5rem; }\n.rollup-list div {\n display: flex; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--line); padding-bottom: 0.4rem;\n}\n.rollup-list dd { margin: 0; }\n.rollup-list a.rollup-link {\n color: inherit;\n text-decoration: none;\n}\n.rollup-list a.rollup-link:hover {\n color: var(--accent);\n text-decoration: underline;\n}\n.distribution-track {\n height: 0.7rem;\n min-width: 6rem;\n border-radius: 999px;\n background: var(--bg);\n border: 1px solid var(--line);\n overflow: hidden;\n}\n.distribution-fill {\n display: block;\n height: 100%;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--accent-dim), var(--accent-strong));\n min-width: 0;\n}\n.graph-root {\n position: relative;\n min-height: 620px;\n}\n.graph-root.is-booting {\n display: grid;\n place-items: center;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-boot {\n display: grid;\n justify-items: center;\n gap: 0.75rem;\n padding: 1.5rem;\n text-align: center;\n color: var(--muted);\n}\n.graph-boot p { margin: 0; }\n.graph-boot-spinner {\n width: 1.35rem;\n height: 1.35rem;\n border: 2px solid color-mix(in srgb, var(--muted) 35%, transparent);\n border-top-color: var(--accent-strong);\n border-radius: 50%;\n animation: graph-boot-spin 0.7s linear infinite;\n}\n@keyframes graph-boot-spin {\n to { transform: rotate(360deg); }\n}\n.graph-root canvas {\n display: block;\n width: 100%;\n min-height: 620px;\n background: var(--bg);\n border-radius: 10px;\n border: 1px solid var(--line);\n touch-action: none;\n cursor: grab;\n}\n.graph-root canvas.is-panning { cursor: grabbing; }\n.graph-root canvas.is-dragging-node { cursor: pointer; }\n.search-results { display: grid; gap: 0.7rem; margin-top: 1rem; }\n.search-result:hover { border-color: var(--accent-dim); }\n.hidden { display: none !important; }\n.breadcrumbs a { color: var(--muted); }\n.breadcrumbs a:hover { color: var(--accent-strong); }\n.section-link { font-size: 0.92rem; }\n.prose p { line-height: 1.55; }\n.idea-summary { white-space: normal; }\n.idea-ref {\n display: inline;\n padding: 0.05em 0.35em;\n margin: 0 0.05em;\n border-radius: 0.3em;\n border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));\n background: color-mix(in srgb, var(--accent) 14%, var(--bg-raised));\n color: var(--accent-strong);\n font-weight: 600;\n text-decoration: none;\n white-space: normal;\n overflow-wrap: anywhere;\n}\na.idea-ref:hover {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 22%, var(--bg-raised));\n}\n.idea-ref--file {\n border-color: color-mix(in srgb, var(--rust) 40%, var(--line));\n background: color-mix(in srgb, var(--rust) 16%, var(--bg-raised));\n color: #e8a07a;\n}\na.idea-ref--file:hover {\n color: var(--fg);\n border-color: var(--rust);\n}\n.idea-ref--unresolved {\n border-style: dashed;\n border-color: color-mix(in srgb, var(--warn) 45%, var(--line));\n background: color-mix(in srgb, var(--warn) 10%, var(--bg-raised));\n color: var(--warn);\n font-weight: 500;\n}\npre.code-like {\n white-space: pre-wrap; padding: 0.9rem; border-radius: 8px;\n background: var(--bg); border: 1px solid var(--line);\n}\n@media (max-width: 900px) {\n .hero, .topbar-inner { grid-template-columns: 1fr; }\n}\n@media (max-width: 520px) {\n .print-attrs div { grid-template-columns: 1fr; }\n}\n@media print {\n :root { color-scheme: light; }\n body { background: white; color: black; }\n .topbar, .searchbar, .toolbar .actions, .graph-shell .toolbar, .column-filter-row, .table-filter-toggle, .table-filter-actions, .hide-on-print { display: none !important; }\n .sort-button { cursor: default; }\n .panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result, .entity-card {\n background: white; color: black; border-color: #cbd5e1; box-shadow: none;\n }\n .scroll-window {\n max-height: none !important;\n overflow: visible !important;\n border: none !important;\n background: transparent !important;\n }\n .scroll-window thead th {\n position: static !important;\n box-shadow: none !important;\n }\n a { color: black; text-decoration: underline; }\n .print-break-avoid { break-inside: avoid; }\n}\n";
2
- export declare const APP_JS: string;
3
- export declare function buildSearchIndexScript(documents: unknown): string;