@reqlan/analytical 0.5.4 → 0.6.1

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 (77) hide show
  1. package/README.md +22 -3
  2. package/out/analysis/git-dates-analyser.js +41 -12
  3. package/out/analysis/git-dates-analyser.js.map +1 -1
  4. package/out/core/analytical-store.d.ts +9 -2
  5. package/out/core/analytical-store.js +7 -5
  6. package/out/core/analytical-store.js.map +1 -1
  7. package/out/core/application-memory.d.ts +17 -2
  8. package/out/core/application-memory.js +23 -5
  9. package/out/core/application-memory.js.map +1 -1
  10. package/out/core/base-discovery.d.ts +40 -0
  11. package/out/core/base-discovery.js +166 -0
  12. package/out/core/base-discovery.js.map +1 -0
  13. package/out/core/context-model.d.ts +17 -0
  14. package/out/core/context-model.js.map +1 -1
  15. package/out/core/create-base.d.ts +11 -0
  16. package/out/core/create-base.js +33 -0
  17. package/out/core/create-base.js.map +1 -0
  18. package/out/core/rqignore.d.ts +25 -0
  19. package/out/core/rqignore.js +149 -0
  20. package/out/core/rqignore.js.map +1 -0
  21. package/out/core/types.d.ts +5 -1
  22. package/out/core/types.js.map +1 -1
  23. package/out/create-runtime.d.ts +29 -4
  24. package/out/create-runtime.js +47 -8
  25. package/out/create-runtime.js.map +1 -1
  26. package/out/export/html-export-assets.d.ts +2 -2
  27. package/out/export/html-export-assets.js +259 -239
  28. package/out/export/html-export-assets.js.map +1 -1
  29. package/out/graph/physics-core.d.ts +141 -0
  30. package/out/graph/physics-core.js +237 -0
  31. package/out/graph/physics-core.js.map +1 -0
  32. package/out/headless-index-service.d.ts +6 -23
  33. package/out/headless-index-service.js +5 -171
  34. package/out/headless-index-service.js.map +1 -1
  35. package/out/index-store/base-registry.d.ts +57 -0
  36. package/out/index-store/base-registry.js +192 -0
  37. package/out/index-store/base-registry.js.map +1 -0
  38. package/out/index-store/index-diagnostics-store.d.ts +72 -0
  39. package/out/index-store/index-diagnostics-store.js +238 -0
  40. package/out/index-store/index-diagnostics-store.js.map +1 -0
  41. package/out/index-store/index-file-error.d.ts +16 -0
  42. package/out/index-store/index-file-error.js +27 -0
  43. package/out/index-store/index-file-error.js.map +1 -0
  44. package/out/index-store/index-parse-issues.d.ts +9 -0
  45. package/out/index-store/index-parse-issues.js +62 -0
  46. package/out/index-store/index-parse-issues.js.map +1 -0
  47. package/out/index-store/index-status.d.ts +20 -0
  48. package/out/index-store/index-status.js +2 -0
  49. package/out/index-store/index-status.js.map +1 -0
  50. package/out/index-store/overview-coverage.d.ts +23 -0
  51. package/out/index-store/overview-coverage.js +254 -0
  52. package/out/index-store/overview-coverage.js.map +1 -0
  53. package/out/index-store/schema.d.ts +1 -1
  54. package/out/index-store/schema.js +4 -1
  55. package/out/index-store/schema.js.map +1 -1
  56. package/out/index-store/sqlite-store.d.ts +31 -2
  57. package/out/index-store/sqlite-store.js +152 -13
  58. package/out/index-store/sqlite-store.js.map +1 -1
  59. package/out/index-store/webview-table-queries.d.ts +65 -1
  60. package/out/index-store/webview-table-queries.js +188 -26
  61. package/out/index-store/webview-table-queries.js.map +1 -1
  62. package/out/index-store/workspace-index-file.d.ts +27 -0
  63. package/out/index-store/workspace-index-file.js +98 -0
  64. package/out/index-store/workspace-index-file.js.map +1 -0
  65. package/out/index-store/workspace-index-sync.d.ts +53 -0
  66. package/out/index-store/workspace-index-sync.js +164 -0
  67. package/out/index-store/workspace-index-sync.js.map +1 -0
  68. package/out/index-store/workspace-index.d.ts +80 -0
  69. package/out/index-store/workspace-index.js +525 -0
  70. package/out/index-store/workspace-index.js.map +1 -0
  71. package/out/index-store/workspace-mtime.d.ts +14 -0
  72. package/out/index-store/workspace-mtime.js +56 -0
  73. package/out/index-store/workspace-mtime.js.map +1 -0
  74. package/out/index.d.ts +25 -6
  75. package/out/index.js +12 -3
  76. package/out/index.js.map +1 -1
  77. package/package.json +7 -2
@@ -0,0 +1,62 @@
1
+ import { errorCauseMessage } from '../core/index-error.js';
2
+ export function collectParseIssues(document) {
3
+ const issues = [];
4
+ for (const error of document.parseResult.parserErrors) {
5
+ const position = parserErrorPosition(error);
6
+ issues.push({
7
+ line: position.line,
8
+ column: position.column,
9
+ message: error.message,
10
+ phase: 'parse'
11
+ });
12
+ }
13
+ for (const error of document.parseResult.lexerErrors) {
14
+ issues.push({
15
+ line: Math.max(0, (error.line ?? 1) - 1),
16
+ column: Math.max(0, (error.column ?? 1) - 1),
17
+ message: error.message,
18
+ phase: 'parse'
19
+ });
20
+ }
21
+ return issues;
22
+ }
23
+ export function fileIssue(message, phase, line = 0, column = 0, ideaNames) {
24
+ return { line, column, message, phase, ideaNames };
25
+ }
26
+ export function fileIssueFromError(phase, error, fallbackMessage, line = 0, column = 0, ideaNames) {
27
+ const cause = errorCauseMessage(error);
28
+ return {
29
+ line,
30
+ column,
31
+ message: fallbackMessage,
32
+ phase,
33
+ ideaNames,
34
+ cause
35
+ };
36
+ }
37
+ export function unnamedIdeaIssues(ideas) {
38
+ return ideas
39
+ .filter(idea => !idea.name?.trim())
40
+ .map(idea => fileIssue('Idea without a name cannot be indexed', 'persist', idea.lineStart, 0));
41
+ }
42
+ export function validIdeas(ideas) {
43
+ return ideas.filter(idea => idea.name?.trim());
44
+ }
45
+ function parserErrorPosition(error) {
46
+ const token = error.token;
47
+ if (token && !Number.isNaN(token.startOffset) && token.startLine !== undefined) {
48
+ return {
49
+ line: Math.max(0, token.startLine - 1),
50
+ column: Math.max(0, (token.startColumn ?? 1) - 1)
51
+ };
52
+ }
53
+ const previousToken = error.previousToken;
54
+ if (previousToken && !Number.isNaN(previousToken.startOffset) && previousToken.endLine !== undefined) {
55
+ return {
56
+ line: Math.max(0, previousToken.endLine - 1),
57
+ column: Math.max(0, (previousToken.endColumn ?? 1) - 1)
58
+ };
59
+ }
60
+ return { line: 0, column: 0 };
61
+ }
62
+ //# sourceMappingURL=index-parse-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-parse-issues.js","sourceRoot":"","sources":["../../src/index-store/index-parse-issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { DocumentUpdate, IndexState, WorkspaceFileChange } from '../core/analytical-store.js';
2
+ import type { FileIndexIssueView, IndexErrorDetail } from '../core/index-error.js';
3
+ export interface IndexSyncProgress {
4
+ processed: number;
5
+ total: number;
6
+ /** Workspace-relative path of the file currently being indexed, when known. */
7
+ currentFile?: string;
8
+ }
9
+ export interface IndexStatusSnapshot {
10
+ state: IndexState;
11
+ ready: boolean;
12
+ ideaCount: number;
13
+ edgeCount: number;
14
+ fileIssueCount: number;
15
+ lastError?: IndexErrorDetail;
16
+ fileIssues: FileIndexIssueView[];
17
+ syncProgress?: IndexSyncProgress;
18
+ recentDocumentUpdates: DocumentUpdate[];
19
+ recentWorkspaceChanges: WorkspaceFileChange[];
20
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-status.js","sourceRoot":"","sources":["../../src/index-store/index-status.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { SqliteIndexStore } from './sqlite-store.js';
2
+ export interface OverviewCoverageScores {
3
+ ideaCount: number;
4
+ rqFileCount: number;
5
+ eligibleNonRqFileCount: number;
6
+ referencedEligibleFileCount: number;
7
+ /** 0–100; null when there are no eligible non-.rq files. */
8
+ fileCoveragePct: number | null;
9
+ distinctFileReferenceCount: number;
10
+ totalLoc: number;
11
+ /** Ideas per 1000 LOC; null when LOC is 0. */
12
+ ideasPerKLoc: number | null;
13
+ /** True when LOC counting hit size caps (totals are lower bounds). */
14
+ locTruncated: boolean;
15
+ calculatedAt: number;
16
+ }
17
+ export interface ComputeOverviewCoverageOptions {
18
+ baseRoot: string;
19
+ store: SqliteIndexStore;
20
+ /** Optional abort check — return true to stop early. */
21
+ shouldCancel?: () => boolean;
22
+ }
23
+ export declare function computeOverviewCoverageScores(options: ComputeOverviewCoverageOptions): Promise<OverviewCoverageScores>;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Lazy coverage metrics for Ideas Summary Overview.
3
+ *
4
+ * rq:["../../../reqlan rq/extension/module/ideas_summary/webview.rq".overview_coverage_scores]
5
+ */
6
+ import { open, readdir, readFile, stat } from 'node:fs/promises';
7
+ import { join, relative, resolve, sep } from 'node:path';
8
+ import { isSecretRqPath } from '../export/secret-rq.js';
9
+ import { resolveReferencedFilePath } from '../core/file-reference-resolve.js';
10
+ import { isIgnoredPath, loadRqIgnore } from '../core/rqignore.js';
11
+ import { toWorkspaceRelativePath } from '../core/workspace-paths.js';
12
+ const LOC_FILE_BYTE_CAP = 2 * 1024 * 1024;
13
+ const LOC_TOTAL_BYTE_CAP = 64 * 1024 * 1024;
14
+ const WALK_YIELD_EVERY = 64;
15
+ const LOC_YIELD_EVERY = 16;
16
+ function toPosixRelative(baseRoot, absPath) {
17
+ const rel = relative(resolve(baseRoot), resolve(absPath));
18
+ if (!rel || rel === '.') {
19
+ return '';
20
+ }
21
+ return rel.split(sep).join('/');
22
+ }
23
+ function normalizeRelPath(path) {
24
+ return path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
25
+ }
26
+ function yieldEventLoop() {
27
+ return new Promise(resolveYield => setImmediate(resolveYield));
28
+ }
29
+ async function walkEligibleFiles(baseRoot, filter, shouldCancel) {
30
+ const rqFiles = [];
31
+ const eligibleNonRqFiles = [];
32
+ let visited = 0;
33
+ async function walk(directory) {
34
+ if (shouldCancel?.()) {
35
+ return;
36
+ }
37
+ let entries;
38
+ try {
39
+ entries = await readdir(directory, { withFileTypes: true });
40
+ }
41
+ catch {
42
+ return;
43
+ }
44
+ for (const entry of entries) {
45
+ if (shouldCancel?.()) {
46
+ return;
47
+ }
48
+ visited += 1;
49
+ if (visited % WALK_YIELD_EVERY === 0) {
50
+ await yieldEventLoop();
51
+ }
52
+ const fullPath = join(directory, entry.name);
53
+ if (entry.isDirectory()) {
54
+ if (isIgnoredPath(filter, baseRoot, fullPath, true)) {
55
+ continue;
56
+ }
57
+ await walk(fullPath);
58
+ continue;
59
+ }
60
+ if (!entry.isFile() || isIgnoredPath(filter, baseRoot, fullPath, false)) {
61
+ continue;
62
+ }
63
+ const rel = toPosixRelative(baseRoot, fullPath);
64
+ if (!rel) {
65
+ continue;
66
+ }
67
+ if (entry.name.endsWith('.rq')) {
68
+ if (!isSecretRqPath(entry.name)) {
69
+ rqFiles.push(rel);
70
+ }
71
+ continue;
72
+ }
73
+ eligibleNonRqFiles.push(rel);
74
+ }
75
+ }
76
+ await walk(resolve(baseRoot));
77
+ return { rqFiles, eligibleNonRqFiles };
78
+ }
79
+ async function listResolvedFileReferences(store, baseRoot) {
80
+ const rows = await store.listFileReferenceTargets();
81
+ const resolved = new Set();
82
+ for (const row of rows) {
83
+ const target = row.targetFile.trim();
84
+ if (!target) {
85
+ continue;
86
+ }
87
+ const joined = resolveReferencedFilePath(target, row.sourceId);
88
+ const relativePath = toWorkspaceRelativePath(joined, baseRoot);
89
+ const normalized = normalizeRelPath(relativePath);
90
+ if (!normalized || normalized.includes('://') || normalized.startsWith('../')) {
91
+ continue;
92
+ }
93
+ resolved.add(normalized);
94
+ }
95
+ return resolved;
96
+ }
97
+ function countCoveredEligibleFiles(eligible, referenced) {
98
+ if (eligible.length === 0 || referenced.size === 0) {
99
+ return 0;
100
+ }
101
+ const eligibleSet = new Set(eligible);
102
+ const covered = new Set();
103
+ for (const path of eligible) {
104
+ if (referenced.has(path)) {
105
+ covered.add(path);
106
+ }
107
+ }
108
+ for (const ref of referenced) {
109
+ if (eligibleSet.has(ref)) {
110
+ continue;
111
+ }
112
+ const prefix = `${ref}/`;
113
+ for (const path of eligible) {
114
+ if (path.startsWith(prefix)) {
115
+ covered.add(path);
116
+ }
117
+ }
118
+ }
119
+ return covered.size;
120
+ }
121
+ async function looksBinary(absPath) {
122
+ try {
123
+ const handle = await open(absPath, 'r');
124
+ try {
125
+ const buffer = Buffer.alloc(4096);
126
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
127
+ for (let i = 0; i < bytesRead; i += 1) {
128
+ if (buffer[i] === 0) {
129
+ return true;
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ finally {
135
+ await handle.close();
136
+ }
137
+ }
138
+ catch {
139
+ return true;
140
+ }
141
+ }
142
+ function countLines(text) {
143
+ if (!text) {
144
+ return 0;
145
+ }
146
+ let lines = 1;
147
+ for (let i = 0; i < text.length; i += 1) {
148
+ if (text.charCodeAt(i) === 10) {
149
+ lines += 1;
150
+ }
151
+ }
152
+ if (text.endsWith('\n')) {
153
+ lines -= 1;
154
+ }
155
+ return Math.max(lines, 0);
156
+ }
157
+ async function countEligibleLoc(baseRoot, eligibleRelPaths, shouldCancel) {
158
+ let totalLoc = 0;
159
+ let bytesRead = 0;
160
+ let locTruncated = false;
161
+ let processed = 0;
162
+ for (const rel of eligibleRelPaths) {
163
+ if (shouldCancel?.()) {
164
+ break;
165
+ }
166
+ processed += 1;
167
+ if (processed % LOC_YIELD_EVERY === 0) {
168
+ await yieldEventLoop();
169
+ }
170
+ if (bytesRead >= LOC_TOTAL_BYTE_CAP) {
171
+ locTruncated = true;
172
+ break;
173
+ }
174
+ const absPath = resolve(baseRoot, rel);
175
+ let size = 0;
176
+ try {
177
+ size = (await stat(absPath)).size;
178
+ }
179
+ catch {
180
+ continue;
181
+ }
182
+ if (size <= 0) {
183
+ continue;
184
+ }
185
+ if (size > LOC_FILE_BYTE_CAP) {
186
+ locTruncated = true;
187
+ continue;
188
+ }
189
+ if (bytesRead + size > LOC_TOTAL_BYTE_CAP) {
190
+ locTruncated = true;
191
+ break;
192
+ }
193
+ if (await looksBinary(absPath)) {
194
+ continue;
195
+ }
196
+ try {
197
+ const text = await readFile(absPath, 'utf8');
198
+ bytesRead += size;
199
+ totalLoc += countLines(text);
200
+ }
201
+ catch {
202
+ // Unreadable / invalid utf8 — skip.
203
+ }
204
+ }
205
+ return { totalLoc, locTruncated };
206
+ }
207
+ export async function computeOverviewCoverageScores(options) {
208
+ const { baseRoot, store, shouldCancel } = options;
209
+ const filter = loadRqIgnore(baseRoot);
210
+ const [{ ideaCount }, walk, referenced] = await Promise.all([
211
+ store.counts().then(counts => ({ ideaCount: counts.ideas })),
212
+ walkEligibleFiles(baseRoot, filter, shouldCancel),
213
+ listResolvedFileReferences(store, baseRoot)
214
+ ]);
215
+ if (shouldCancel?.()) {
216
+ return emptyScores(ideaCount);
217
+ }
218
+ const referencedEligibleFileCount = countCoveredEligibleFiles(walk.eligibleNonRqFiles, referenced);
219
+ const eligibleNonRqFileCount = walk.eligibleNonRqFiles.length;
220
+ const fileCoveragePct = eligibleNonRqFileCount === 0
221
+ ? null
222
+ : Math.round((referencedEligibleFileCount / eligibleNonRqFileCount) * 1000) / 10;
223
+ const { totalLoc, locTruncated } = await countEligibleLoc(baseRoot, walk.eligibleNonRqFiles, shouldCancel);
224
+ const ideasPerKLoc = totalLoc <= 0
225
+ ? null
226
+ : Math.round((ideaCount / totalLoc) * 1000 * 100) / 100;
227
+ return {
228
+ ideaCount,
229
+ rqFileCount: walk.rqFiles.length,
230
+ eligibleNonRqFileCount,
231
+ referencedEligibleFileCount,
232
+ fileCoveragePct,
233
+ distinctFileReferenceCount: referenced.size,
234
+ totalLoc,
235
+ ideasPerKLoc,
236
+ locTruncated,
237
+ calculatedAt: Date.now()
238
+ };
239
+ }
240
+ function emptyScores(ideaCount) {
241
+ return {
242
+ ideaCount,
243
+ rqFileCount: 0,
244
+ eligibleNonRqFileCount: 0,
245
+ referencedEligibleFileCount: 0,
246
+ fileCoveragePct: null,
247
+ distinctFileReferenceCount: 0,
248
+ totalLoc: 0,
249
+ ideasPerKLoc: null,
250
+ locTruncated: false,
251
+ calculatedAt: Date.now()
252
+ };
253
+ }
254
+ //# sourceMappingURL=overview-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview-coverage.js","sourceRoot":"","sources":["../../src/index-store/overview-coverage.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SQLite schema for the workspace idea graph index.
3
3
  */
4
- export declare const SCHEMA_VERSION = 2;
4
+ export declare const SCHEMA_VERSION = 3;
5
5
  /** Initial schema — always safe to re-run (IF NOT EXISTS). */
6
6
  export declare const BASE_MIGRATIONS: string[];
7
7
  /** Versioned migrations applied once when upgrading from an older schema_version. */
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SQLite schema for the workspace idea graph index.
3
3
  */
4
- export const SCHEMA_VERSION = 2;
4
+ export const SCHEMA_VERSION = 3;
5
5
  /** Initial schema — always safe to re-run (IF NOT EXISTS). */
6
6
  export const BASE_MIGRATIONS = [
7
7
  `CREATE TABLE IF NOT EXISTS meta (
@@ -47,6 +47,9 @@ export const VERSION_MIGRATIONS = {
47
47
  `ALTER TABLE edges ADD COLUMN source_line INTEGER`,
48
48
  `ALTER TABLE edges ADD COLUMN snippet TEXT`,
49
49
  `ALTER TABLE edges ADD COLUMN is_resolved INTEGER NOT NULL DEFAULT 1`
50
+ ],
51
+ 3: [
52
+ `ALTER TABLE documents ADD COLUMN mtime_ms REAL`
50
53
  ]
51
54
  };
52
55
  /** @deprecated Use BASE_MIGRATIONS — kept for tests referencing MIGRATIONS. */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/index-store/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAa;IACrC;;;MAGE;IACF;;;;;;;;;;;;MAYE;IACF,8DAA8D;IAC9D,0DAA0D;IAC1D;;;;;;;;MAQE;IACF,iEAAiE;IACjE,iEAAiE;IACjE,wEAAwE;IACxE;;;;MAIE;CACL,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IACxD,CAAC,EAAE;QACC,kDAAkD;QAClD,2CAA2C;QAC3C,qEAAqE;KACxE;CACJ,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/index-store/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAa;IACrC;;;MAGE;IACF;;;;;;;;;;;;MAYE;IACF,8DAA8D;IAC9D,0DAA0D;IAC1D;;;;;;;;MAQE;IACF,iEAAiE;IACjE,iEAAiE;IACjE,wEAAwE;IACxE;;;;MAIE;CACL,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IACxD,CAAC,EAAE;QACC,kDAAkD;QAClD,2CAA2C;QAC3C,qEAAqE;KACxE;IACD,CAAC,EAAE;QACC,gDAAgD;KACnD;CACJ,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { EdgeRecord, IdeaRecord, IdeaReferenceChip, IdeaSummary, IdeaWithRange, IdeasetKind, IdeasetMemberRow, IdeasetTableRow, IdeaTableRow, ReferenceListRow, ReferenceTableRow, AncestorChainResult } from '../core/types.js';
2
- import type { IdeasTableQuery, IdeasetsTableQuery, ReferencesTableQuery } from './webview-table-queries.js';
2
+ import type { AttributesTableQuery, AttributeTableRow, IdeasTableQuery, IdeasetsTableQuery, ReferencesTableQuery } from './webview-table-queries.js';
3
+ import type { GitIdeaTimelineEvent } from './webview-table-queries.js';
3
4
  import { type GraphViewQuery } from './webview-graph-queries.js';
4
5
  export declare class SqliteIndexStore {
5
6
  private readonly db;
@@ -10,8 +11,13 @@ export declare class SqliteIndexStore {
10
11
  closeWithoutPersist(): void;
11
12
  static deleteDatabaseFile(dbPath: string): Promise<void>;
12
13
  getDocumentHash(fileUri: string): Promise<string | undefined>;
13
- upsertDocument(fileUri: string, contentHash: string, ideas: IdeaRecord[], edges: EdgeRecord[]): Promise<void>;
14
+ getDocumentMtimeMs(fileUri: string): Promise<number | undefined>;
15
+ updateDocumentMtime(fileUri: string, mtimeMs: number): Promise<void>;
16
+ listDocumentMtimes(): Promise<Map<string, number | undefined>>;
17
+ upsertDocument(fileUri: string, contentHash: string, ideas: IdeaRecord[], edges: EdgeRecord[], mtimeMs?: number): Promise<void>;
14
18
  removeDocument(fileUri: string): Promise<void>;
19
+ /** Delete many document rows (and their ideas/edges) in one transaction. */
20
+ removeDocuments(fileUris: string[]): Promise<void>;
15
21
  clearAll(): Promise<void>;
16
22
  listAllIdeas(): Promise<IdeaSummary[]>;
17
23
  getIdea(id: string): Promise<IdeaSummary | undefined>;
@@ -35,6 +41,11 @@ export declare class SqliteIndexStore {
35
41
  getIdeasByIds(ids: readonly string[]): Promise<IdeaSummary[]>;
36
42
  getEdgesReferencingFile(filePath: string): Promise<EdgeRecord[]>;
37
43
  getAllEdges(): Promise<EdgeRecord[]>;
44
+ /** Outbound file_reference targets for coverage metrics (source id + authored path). */
45
+ listFileReferenceTargets(): Promise<Array<{
46
+ sourceId: string;
47
+ targetFile: string;
48
+ }>>;
38
49
  getAllIdeasRaw(): Promise<IdeaRecord[]>;
39
50
  updateGitDates(id: string, createdAt?: string, modifiedAt?: string): Promise<void>;
40
51
  counts(): Promise<{
@@ -61,6 +72,24 @@ export declare class SqliteIndexStore {
61
72
  listIdeasetMembers(ideasetId: string, kind: IdeasetKind, fileUri: string): Promise<IdeasetMemberRow[]>;
62
73
  countReferences(query?: ReferencesTableQuery): Promise<number>;
63
74
  listReferencesPage(query: ReferencesTableQuery): Promise<ReferenceTableRow[]>;
75
+ /**
76
+ * Aggregate attribute keys for the Ideas Summary attributes tab.
77
+ * per ["../../../../reqlan rq/extension/module/ideas_summary/webview.rq".attributes_tab]
78
+ */
79
+ countAttributes(query: AttributesTableQuery): Promise<number>;
80
+ listAttributesPage(query: AttributesTableQuery): Promise<AttributeTableRow[]>;
81
+ private queryAttributesPage;
82
+ /**
83
+ * Idea ids that still need git date backfill for the Timeline tab.
84
+ * per ["../../../../reqlan rq/extension/module/ideas_summary/webview.rq".timeline_page]
85
+ */
86
+ listIdeaIdsMissingGitDates(limit?: number): Promise<string[]>;
87
+ /**
88
+ * Recent idea evolution events from indexed git dates for the Timeline tab.
89
+ * Emits separate created / modified entries when both timestamps exist and differ.
90
+ * per ["../../../../reqlan rq/extension/module/ideas_summary/webview.rq".timeline_page]
91
+ */
92
+ listRecentGitIdeaEvents(limit?: number): Promise<GitIdeaTimelineEvent[]>;
64
93
  private toSummary;
65
94
  private migrate;
66
95
  }