@reqlan/analytical 0.5.4 → 0.6.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 (77) hide show
  1. package/README.md +13 -2
  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 @@
1
+ {"version":3,"file":"workspace-index-sync.js","sourceRoot":"","sources":["../../src/index-store/workspace-index-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { AnalyticalStore } from '../core/analytical-store.js';
2
+ import { type IndexDiagnosticsOverview, type IndexFileTimingRow, type IndexSyncRunSummary, type IndexTimingTrigger } from './index-diagnostics-store.js';
3
+ import type { IndexStatusSnapshot } from './index-status.js';
4
+ import { SqliteIndexStore } from './sqlite-store.js';
5
+ import { type IdleCheckResult } from './workspace-index-sync.js';
6
+ export type { IndexStatusSnapshot, IndexSyncProgress } from './index-status.js';
7
+ export type { IdleCheckResult } from './workspace-index-sync.js';
8
+ export declare class WorkspaceIndex {
9
+ private readonly analytical;
10
+ private readonly storagePath;
11
+ private readonly workspaceRoot;
12
+ private sqlite?;
13
+ private diagnostics?;
14
+ private readonly services;
15
+ private syncQueue;
16
+ private syncInFlight?;
17
+ private syncProgress?;
18
+ private syncCancelRequested;
19
+ private nextTimingTrigger;
20
+ private readonly catalogListeners;
21
+ private readonly statusListeners;
22
+ private rqFilePaths;
23
+ private rqIgnore;
24
+ constructor(analytical: AnalyticalStore, storagePath: string, workspaceRoot: string);
25
+ subscribeCatalogUpdates(listener: () => void): () => void;
26
+ subscribeStatusUpdates(listener: () => void): () => void;
27
+ get state(): import("../core/analytical-store.js").IndexState;
28
+ get isReady(): boolean;
29
+ get indexStore(): SqliteIndexStore;
30
+ getStatusSnapshot(relativePath?: (uri: string) => string): IndexStatusSnapshot;
31
+ /** Open the SQLite store (does not sync). Idempotent when already open. */
32
+ open(): Promise<void>;
33
+ /**
34
+ * Bring this index to ready: open if needed, then soft-sync.
35
+ * No-op when already ready; joins an in-flight sync.
36
+ */
37
+ ensureReady(filePaths?: string[]): Promise<boolean>;
38
+ /** Open then soft-sync all `.rq` files under the workspace root. */
39
+ activate(): Promise<void>;
40
+ deactivate(): Promise<void>;
41
+ syncWorkspace(filePaths?: string[], trigger?: IndexTimingTrigger): Promise<boolean>;
42
+ /** Request cancellation of an in-flight soft sync; already-indexed rows are kept. */
43
+ cancelSync(): void;
44
+ /**
45
+ * Cheap staleness pass: one SQLite mtime map, index only dirty paths, batch-drop deleted docs.
46
+ * No sync state / progress UI when nothing is stale.
47
+ */
48
+ checkStaleFiles(filePaths: string[]): Promise<IdleCheckResult>;
49
+ clearAndRebuildIndex(filePaths?: string[]): Promise<boolean>;
50
+ indexFilePath(filePath: string): Promise<void>;
51
+ getIndexDiagnosticsOverview(): Promise<IndexDiagnosticsOverview | undefined>;
52
+ listIndexDiagnosticRuns(limit?: number): Promise<IndexSyncRunSummary[]>;
53
+ listIndexDiagnosticFileTimings(runId: number, options?: {
54
+ limit?: number;
55
+ order?: 'duration_desc' | 'duration_asc' | 'path';
56
+ }): Promise<IndexFileTimingRow[]>;
57
+ getIndexDiagnosticRun(runId: number): Promise<IndexSyncRunSummary | undefined>;
58
+ removeDocument(indexedUri: string): Promise<void>;
59
+ /**
60
+ * Explicit old→new index migrate so renamed .rq files do not leave duplicate idea rows.
61
+ */
62
+ migrateRenamedFile(oldIndexedUri: string, newFilePath: string | undefined): Promise<void>;
63
+ enqueueIndex(filePath: string, change: 'created' | 'changed'): void;
64
+ enqueueDelete(filePathOrIndexedUri: string): void;
65
+ relativePath(fileUri: string): string;
66
+ resolveFileUri(pathInput: string): string;
67
+ listRqFiles(pathPrefix?: string): string[];
68
+ toIndexedUri(filePathOrUri: string): string;
69
+ private runSyncWorkspace;
70
+ private indexFileDeps;
71
+ private removeDocuments;
72
+ private waitForReadyOrError;
73
+ private collectRqFiles;
74
+ private walkDirectory;
75
+ private parseDocument;
76
+ private notifyCatalogUpdated;
77
+ private notifyStatusUpdated;
78
+ }
79
+ /** Alias kept for CLI/MCP call sites and existing imports. */
80
+ export { WorkspaceIndex as HeadlessIndexService };
@@ -0,0 +1,525 @@
1
+ /**
2
+ * Host-agnostic workspace ideas index: parse → extract → SQLite.
3
+ * VS Code / CLI / MCP supply file lists and path display; this owns indexing.
4
+ *
5
+ * Public methods are the semantic surface; sync/file/mtime details live in:
6
+ * - workspace-index-sync.ts
7
+ * - workspace-index-file.ts
8
+ * - workspace-mtime.ts
9
+ *
10
+ * rq:["../../../reqlan rq/indexer/indexer.rq".index]
11
+ * rq:["../../../reqlan rq/indexer/indexer.rq".ownership]
12
+ * rq:["../../../reqlan rq/indexer/indexer.rq".nonblocking_index]
13
+ * rq:["../../../reqlan rq/extension/features-graph-analysers.rq".index_ideas]
14
+ * rq:["../../../reqlan rq/extension/features-graph-analysers.rq".indexing_incrementality]
15
+ * rq:["../../../reqlan rq/extension/features-graph-analysers.rq".indexing_trigger_auto]
16
+ * rq:["../../../reqlan rq/extension/features-graph-analysers.rq".indexing_trigger_open]
17
+ * rq:["../../../reqlan rq/extension/features-index-diagnostics.rq".index_diagnostics_metrics]
18
+ * rq:["../../../reqlan rq/indexer/indexer.rq".index_diagnostics_timing]
19
+ */
20
+ import { URI } from 'langium';
21
+ import { NodeFileSystem } from 'langium/node';
22
+ import { createReqlanServices } from '@reqlan/language';
23
+ import { readFile, readdir } from 'node:fs/promises';
24
+ import { join, relative } from 'node:path';
25
+ import { IDEAS_INDEX_FILENAME, INDEX_DIAGNOSTICS_FILENAME } from '../core/application-memory.js';
26
+ import { toFileIndexIssueView, toIndexErrorDetail } from '../core/index-error.js';
27
+ import { isIgnoredPath, loadRqIgnore } from '../core/rqignore.js';
28
+ import { resolveWorkspaceFileUri, toWorkspaceRelativePath } from '../core/workspace-paths.js';
29
+ import { isSecretRqPath } from '../export/secret-rq.js';
30
+ import { IndexDiagnosticsStore } from './index-diagnostics-store.js';
31
+ import { recordCaughtFileIssue } from './index-file-error.js';
32
+ import { SqliteIndexStore } from './sqlite-store.js';
33
+ import { indexOneFile } from './workspace-index-file.js';
34
+ import { checkStaleFiles as runStaleCheck, runSoftSync } from './workspace-index-sync.js';
35
+ export class WorkspaceIndex {
36
+ constructor(analytical, storagePath, workspaceRoot) {
37
+ this.analytical = analytical;
38
+ this.storagePath = storagePath;
39
+ this.workspaceRoot = workspaceRoot;
40
+ this.services = createReqlanServices({ ...NodeFileSystem });
41
+ this.syncQueue = Promise.resolve();
42
+ this.syncCancelRequested = false;
43
+ this.nextTimingTrigger = 'soft_sync';
44
+ this.catalogListeners = new Set();
45
+ this.statusListeners = new Set();
46
+ this.rqFilePaths = [];
47
+ this.rqIgnore = loadRqIgnore(workspaceRoot);
48
+ }
49
+ subscribeCatalogUpdates(listener) {
50
+ this.catalogListeners.add(listener);
51
+ return () => {
52
+ this.catalogListeners.delete(listener);
53
+ };
54
+ }
55
+ subscribeStatusUpdates(listener) {
56
+ this.statusListeners.add(listener);
57
+ return () => {
58
+ this.statusListeners.delete(listener);
59
+ };
60
+ }
61
+ get state() {
62
+ return this.analytical.getState().indexState;
63
+ }
64
+ get isReady() {
65
+ return this.analytical.getState().indexState === 'ready';
66
+ }
67
+ get indexStore() {
68
+ if (!this.sqlite) {
69
+ throw new Error('Index store is not open');
70
+ }
71
+ return this.sqlite;
72
+ }
73
+ getStatusSnapshot(relativePath = uri => this.relativePath(uri)) {
74
+ const storeState = this.analytical.getState();
75
+ return {
76
+ state: storeState.indexState,
77
+ ready: storeState.indexState === 'ready',
78
+ ideaCount: storeState.ideaCount,
79
+ edgeCount: storeState.edgeCount,
80
+ fileIssueCount: storeState.fileIndexIssues.length,
81
+ lastError: storeState.lastError
82
+ ? toIndexErrorDetail(storeState.lastError, relativePath)
83
+ : undefined,
84
+ fileIssues: storeState.fileIndexIssues.map(issue => toFileIndexIssueView(issue, relativePath)),
85
+ syncProgress: this.syncProgress,
86
+ recentDocumentUpdates: [...storeState.documentUpdates].reverse().slice(0, 10),
87
+ recentWorkspaceChanges: [...storeState.workspaceChanges].reverse().slice(0, 10)
88
+ };
89
+ }
90
+ /** Open the SQLite store (does not sync). Idempotent when already open. */
91
+ async open() {
92
+ if (this.sqlite) {
93
+ const state = this.state;
94
+ if (state === 'idle' || state === 'ready' || state === 'syncing' || state === 'opening') {
95
+ return;
96
+ }
97
+ }
98
+ const { canDispatchIndex, dispatchIndex, recordIndexError } = this.analytical.getState();
99
+ if (!canDispatchIndex('activate')) {
100
+ if (this.sqlite && (this.state === 'idle' || this.state === 'ready' || this.state === 'syncing')) {
101
+ return;
102
+ }
103
+ recordIndexError(`Cannot open idea index from state ${this.state}`, undefined, { phase: 'open' });
104
+ this.notifyStatusUpdated();
105
+ throw new Error(`Cannot open idea index from state ${this.state}`);
106
+ }
107
+ dispatchIndex('activate');
108
+ try {
109
+ const dbPath = join(this.storagePath, IDEAS_INDEX_FILENAME);
110
+ this.sqlite = await SqliteIndexStore.open(dbPath);
111
+ try {
112
+ const diagnosticsPath = join(this.storagePath, INDEX_DIAGNOSTICS_FILENAME);
113
+ this.diagnostics = await IndexDiagnosticsStore.open(diagnosticsPath);
114
+ }
115
+ catch {
116
+ this.diagnostics = undefined;
117
+ }
118
+ dispatchIndex('opened');
119
+ this.notifyStatusUpdated();
120
+ }
121
+ catch (error) {
122
+ dispatchIndex('fail');
123
+ recordIndexError('Failed to open idea index', error, { phase: 'open' });
124
+ this.notifyStatusUpdated();
125
+ throw error;
126
+ }
127
+ }
128
+ /**
129
+ * Bring this index to ready: open if needed, then soft-sync.
130
+ * No-op when already ready; joins an in-flight sync.
131
+ */
132
+ async ensureReady(filePaths) {
133
+ if (this.isReady) {
134
+ return true;
135
+ }
136
+ if (this.syncInFlight) {
137
+ return this.syncInFlight;
138
+ }
139
+ if (!this.sqlite) {
140
+ try {
141
+ await this.open();
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ }
147
+ if (this.isReady) {
148
+ return true;
149
+ }
150
+ return this.syncWorkspace(filePaths);
151
+ }
152
+ /** Open then soft-sync all `.rq` files under the workspace root. */
153
+ async activate() {
154
+ await this.open();
155
+ const ok = await this.syncWorkspace();
156
+ if (!ok) {
157
+ const lastError = this.analytical.getState().lastError;
158
+ throw lastError?.cause instanceof Error
159
+ ? lastError.cause
160
+ : new Error(lastError?.message ?? 'Workspace sync failed');
161
+ }
162
+ }
163
+ async deactivate() {
164
+ const analytical = this.analytical.getState();
165
+ if (analytical.canDispatchIndex('deactivate')) {
166
+ analytical.dispatchIndex('deactivate');
167
+ }
168
+ await this.sqlite?.close();
169
+ this.sqlite = undefined;
170
+ await this.diagnostics?.close();
171
+ this.diagnostics = undefined;
172
+ if (this.analytical.getState().canDispatchIndex('closed')) {
173
+ this.analytical.getState().dispatchIndex('closed');
174
+ }
175
+ this.notifyStatusUpdated();
176
+ }
177
+ async syncWorkspace(filePaths, trigger) {
178
+ if (trigger) {
179
+ this.nextTimingTrigger = trigger;
180
+ }
181
+ if (this.syncInFlight) {
182
+ return this.syncInFlight;
183
+ }
184
+ this.syncCancelRequested = false;
185
+ this.syncInFlight = this.runSyncWorkspace(filePaths).finally(() => {
186
+ this.syncInFlight = undefined;
187
+ this.syncCancelRequested = false;
188
+ this.nextTimingTrigger = 'soft_sync';
189
+ });
190
+ return this.syncInFlight;
191
+ }
192
+ /** Request cancellation of an in-flight soft sync; already-indexed rows are kept. */
193
+ cancelSync() {
194
+ if (!this.syncInFlight) {
195
+ return;
196
+ }
197
+ this.syncCancelRequested = true;
198
+ }
199
+ /**
200
+ * Cheap staleness pass: one SQLite mtime map, index only dirty paths, batch-drop deleted docs.
201
+ * No sync state / progress UI when nothing is stale.
202
+ */
203
+ async checkStaleFiles(filePaths) {
204
+ if (!this.sqlite) {
205
+ return { checked: 0, indexed: 0, removed: 0 };
206
+ }
207
+ return runStaleCheck({
208
+ sqlite: this.sqlite,
209
+ toIndexedUri: path => this.toIndexedUri(path),
210
+ removeDocuments: uris => this.removeDocuments(uris),
211
+ syncWorkspace: paths => this.syncWorkspace(paths, 'stale'),
212
+ syncInFlight: Boolean(this.syncInFlight)
213
+ }, filePaths);
214
+ }
215
+ async clearAndRebuildIndex(filePaths) {
216
+ if (this.syncInFlight) {
217
+ this.syncCancelRequested = true;
218
+ await this.syncInFlight;
219
+ }
220
+ const dbPath = join(this.storagePath, IDEAS_INDEX_FILENAME);
221
+ const analytical = this.analytical.getState();
222
+ if (this.sqlite) {
223
+ this.sqlite.closeWithoutPersist();
224
+ this.sqlite = undefined;
225
+ }
226
+ await SqliteIndexStore.deleteDatabaseFile(dbPath);
227
+ try {
228
+ this.sqlite = await SqliteIndexStore.open(dbPath);
229
+ }
230
+ catch (error) {
231
+ analytical.dispatchIndex('fail');
232
+ analytical.recordIndexError('Failed to reopen idea index after reset', error, { phase: 'open' });
233
+ this.notifyStatusUpdated();
234
+ return false;
235
+ }
236
+ analytical.clearFileIndexIssues();
237
+ analytical.clearLastError();
238
+ analytical.setIndexReady({ ideaCount: 0, edgeCount: 0 });
239
+ this.analytical.setState({
240
+ documentUpdates: [],
241
+ workspaceChanges: []
242
+ });
243
+ this.notifyCatalogUpdated();
244
+ this.notifyStatusUpdated();
245
+ this.nextTimingTrigger = 'rebuild';
246
+ return this.syncWorkspace(filePaths);
247
+ }
248
+ async indexFilePath(filePath) {
249
+ if (!this.sqlite) {
250
+ return;
251
+ }
252
+ const startedAt = new Date().toISOString();
253
+ const wallStarted = performance.now();
254
+ const result = await indexOneFile(this.indexFileDeps(), filePath);
255
+ if (!this.diagnostics) {
256
+ return;
257
+ }
258
+ try {
259
+ await this.diagnostics.recordSyncRun({
260
+ trigger: 'enqueue',
261
+ startedAt,
262
+ finishedAt: new Date().toISOString(),
263
+ durationMs: performance.now() - wallStarted,
264
+ totalFiles: 1,
265
+ skippedMtime: 0,
266
+ indexedFiles: 1,
267
+ errorFiles: result.outcome === 'error' ? 1 : 0,
268
+ cancelled: false,
269
+ sumFileDurationMs: result.durationMs,
270
+ avgPathDepth: result.pathDepth,
271
+ files: [{
272
+ fileUri: result.fileUri,
273
+ durationMs: result.durationMs,
274
+ outcome: result.outcome,
275
+ pathDepth: result.pathDepth
276
+ }]
277
+ });
278
+ }
279
+ catch {
280
+ // ignore diagnostics failures
281
+ }
282
+ }
283
+ async getIndexDiagnosticsOverview() {
284
+ return this.diagnostics?.getOverview();
285
+ }
286
+ async listIndexDiagnosticRuns(limit = 20) {
287
+ if (!this.diagnostics) {
288
+ return [];
289
+ }
290
+ return this.diagnostics.listRecentRuns(limit);
291
+ }
292
+ async listIndexDiagnosticFileTimings(runId, options) {
293
+ if (!this.diagnostics) {
294
+ return [];
295
+ }
296
+ return this.diagnostics.listFileTimings(runId, options);
297
+ }
298
+ async getIndexDiagnosticRun(runId) {
299
+ return this.diagnostics?.getRun(runId);
300
+ }
301
+ async removeDocument(indexedUri) {
302
+ await this.removeDocuments([indexedUri]);
303
+ }
304
+ /**
305
+ * Explicit old→new index migrate so renamed .rq files do not leave duplicate idea rows.
306
+ */
307
+ async migrateRenamedFile(oldIndexedUri, newFilePath) {
308
+ this.analytical.getState().recordWorkspaceChange(oldIndexedUri, 'deleted');
309
+ if (newFilePath) {
310
+ this.analytical.getState().recordWorkspaceChange(this.toIndexedUri(newFilePath), 'created');
311
+ }
312
+ this.syncQueue = this.syncQueue.then(async () => {
313
+ if (!this.sqlite) {
314
+ return;
315
+ }
316
+ await this.sqlite.removeDocument(oldIndexedUri);
317
+ this.analytical.getState().clearFileIndexIssuesForFile(oldIndexedUri);
318
+ if (newFilePath?.endsWith('.rq')) {
319
+ await this.indexFilePath(newFilePath);
320
+ }
321
+ const counts = await this.sqlite.counts();
322
+ this.analytical.getState().setIndexReady({ ideaCount: counts.ideas, edgeCount: counts.edges });
323
+ this.notifyCatalogUpdated();
324
+ this.notifyStatusUpdated();
325
+ });
326
+ await this.syncQueue;
327
+ }
328
+ enqueueIndex(filePath, change) {
329
+ const indexedUri = this.toIndexedUri(filePath);
330
+ this.analytical.getState().recordWorkspaceChange(indexedUri, change);
331
+ this.syncQueue = this.syncQueue.then(async () => {
332
+ if (this.syncInFlight) {
333
+ await this.syncInFlight;
334
+ }
335
+ const analytical = this.analytical.getState();
336
+ if (!analytical.canDispatchIndex('sync')) {
337
+ return;
338
+ }
339
+ analytical.dispatchIndex('sync');
340
+ this.notifyStatusUpdated();
341
+ try {
342
+ await this.indexFilePath(filePath);
343
+ if (this.sqlite) {
344
+ const counts = await this.sqlite.counts();
345
+ analytical.setIndexReady({ ideaCount: counts.ideas, edgeCount: counts.edges });
346
+ }
347
+ analytical.dispatchIndex('synced');
348
+ }
349
+ catch (error) {
350
+ recordCaughtFileIssue(analytical.recordFileIndexIssues, indexedUri, error, `Failed to index ${this.relativePath(indexedUri)}`);
351
+ analytical.dispatchIndex('synced');
352
+ }
353
+ finally {
354
+ this.notifyStatusUpdated();
355
+ }
356
+ });
357
+ }
358
+ enqueueDelete(filePathOrIndexedUri) {
359
+ const indexedUri = this.toIndexedUri(filePathOrIndexedUri);
360
+ this.analytical.getState().recordWorkspaceChange(indexedUri, 'deleted');
361
+ this.syncQueue = this.syncQueue.then(async () => {
362
+ await this.removeDocument(indexedUri);
363
+ });
364
+ }
365
+ relativePath(fileUri) {
366
+ if (!this.workspaceRoot) {
367
+ return fileUri;
368
+ }
369
+ if (!fileUri.startsWith('file://') && !fileUri.startsWith('/') && !/^[A-Za-z]:/.test(fileUri)) {
370
+ return fileUri;
371
+ }
372
+ try {
373
+ const filePath = fileUri.startsWith('file://') ? URI.parse(fileUri).fsPath : fileUri;
374
+ return relative(this.workspaceRoot, filePath).replace(/\\/g, '/');
375
+ }
376
+ catch {
377
+ return fileUri;
378
+ }
379
+ }
380
+ resolveFileUri(pathInput) {
381
+ return resolveWorkspaceFileUri(pathInput, this.workspaceRoot || undefined);
382
+ }
383
+ listRqFiles(pathPrefix = '') {
384
+ return [...this.rqFilePaths]
385
+ .map(filePath => relative(this.workspaceRoot, filePath))
386
+ .filter(relativePath => !pathPrefix || relativePath.includes(pathPrefix))
387
+ .sort((left, right) => left.localeCompare(right));
388
+ }
389
+ toIndexedUri(filePathOrUri) {
390
+ if (!this.workspaceRoot) {
391
+ return filePathOrUri.startsWith('file://')
392
+ ? URI.parse(filePathOrUri).fsPath
393
+ : filePathOrUri;
394
+ }
395
+ const filePath = filePathOrUri.startsWith('file://')
396
+ ? URI.parse(filePathOrUri).fsPath
397
+ : filePathOrUri;
398
+ return toWorkspaceRelativePath(filePath, this.workspaceRoot);
399
+ }
400
+ async runSyncWorkspace(filePaths) {
401
+ if (!this.sqlite) {
402
+ return false;
403
+ }
404
+ return runSoftSync({
405
+ sqlite: this.sqlite,
406
+ analytical: this.analytical,
407
+ toIndexedUri: path => this.toIndexedUri(path),
408
+ relativePath: uri => this.relativePath(uri),
409
+ indexFileDeps: this.indexFileDeps(),
410
+ collectRqFiles: () => this.collectRqFiles(),
411
+ setRqFilePaths: paths => {
412
+ this.rqFilePaths = [...paths];
413
+ },
414
+ isReady: () => this.isReady,
415
+ getCancelRequested: () => this.syncCancelRequested,
416
+ setSyncProgress: progress => {
417
+ this.syncProgress = progress;
418
+ },
419
+ notifyStatusUpdated: () => this.notifyStatusUpdated(),
420
+ notifyCatalogUpdated: () => this.notifyCatalogUpdated(),
421
+ waitForReadyOrError: () => this.waitForReadyOrError(),
422
+ diagnostics: this.diagnostics,
423
+ timingTrigger: this.nextTimingTrigger
424
+ }, filePaths);
425
+ }
426
+ indexFileDeps() {
427
+ if (!this.sqlite) {
428
+ throw new Error('Index store is not open');
429
+ }
430
+ return {
431
+ sqlite: this.sqlite,
432
+ analytical: this.analytical,
433
+ workspaceRoot: this.workspaceRoot,
434
+ toIndexedUri: (filePath) => this.toIndexedUri(filePath),
435
+ parseDocument: (filePath) => this.parseDocument(filePath),
436
+ notifyCatalogUpdated: () => this.notifyCatalogUpdated()
437
+ };
438
+ }
439
+ async removeDocuments(indexedUris) {
440
+ if (!this.sqlite || indexedUris.length === 0) {
441
+ return;
442
+ }
443
+ const analytical = this.analytical.getState();
444
+ await this.sqlite.removeDocuments(indexedUris);
445
+ for (const indexedUri of indexedUris) {
446
+ analytical.clearFileIndexIssuesForFile(indexedUri);
447
+ }
448
+ const counts = await this.sqlite.counts();
449
+ analytical.setIndexReady({ ideaCount: counts.ideas, edgeCount: counts.edges });
450
+ this.notifyCatalogUpdated();
451
+ this.notifyStatusUpdated();
452
+ }
453
+ async waitForReadyOrError(timeoutMs = 120000) {
454
+ const started = Date.now();
455
+ while (Date.now() - started < timeoutMs) {
456
+ const state = this.analytical.getState().indexState;
457
+ if (state === 'ready') {
458
+ return true;
459
+ }
460
+ if (state === 'error') {
461
+ return false;
462
+ }
463
+ await delay(100);
464
+ }
465
+ return this.isReady;
466
+ }
467
+ async collectRqFiles() {
468
+ // Reload so edits to `.reqlan/.rqignore` apply on the next sync/walk.
469
+ this.rqIgnore = loadRqIgnore(this.workspaceRoot);
470
+ const results = [];
471
+ if (this.workspaceRoot) {
472
+ await this.walkDirectory(this.workspaceRoot, results);
473
+ }
474
+ this.rqFilePaths = results;
475
+ return results;
476
+ }
477
+ async walkDirectory(directory, results) {
478
+ let entries;
479
+ try {
480
+ entries = await readdir(directory, { withFileTypes: true });
481
+ }
482
+ catch {
483
+ return;
484
+ }
485
+ for (const entry of entries) {
486
+ const fullPath = join(directory, entry.name);
487
+ if (entry.isDirectory()) {
488
+ if (isIgnoredPath(this.rqIgnore, this.workspaceRoot, fullPath, true)) {
489
+ continue;
490
+ }
491
+ await this.walkDirectory(fullPath, results);
492
+ continue;
493
+ }
494
+ if (entry.isFile()
495
+ && entry.name.endsWith('.rq')
496
+ && !isSecretRqPath(entry.name)
497
+ && !isIgnoredPath(this.rqIgnore, this.workspaceRoot, fullPath, false)) {
498
+ results.push(fullPath);
499
+ }
500
+ }
501
+ }
502
+ async parseDocument(filePath) {
503
+ const text = await readFile(filePath, 'utf8');
504
+ const langiumUri = URI.file(filePath);
505
+ const document = this.services.shared.workspace.LangiumDocumentFactory.fromString(text, langiumUri);
506
+ await this.services.shared.workspace.DocumentBuilder.build([document], { validation: false });
507
+ return document;
508
+ }
509
+ notifyCatalogUpdated() {
510
+ for (const listener of this.catalogListeners) {
511
+ listener();
512
+ }
513
+ }
514
+ notifyStatusUpdated() {
515
+ for (const listener of this.statusListeners) {
516
+ listener();
517
+ }
518
+ }
519
+ }
520
+ /** Alias kept for CLI/MCP call sites and existing imports. */
521
+ export { WorkspaceIndex as HeadlessIndexService };
522
+ function delay(ms) {
523
+ return new Promise(resolve => setTimeout(resolve, ms));
524
+ }
525
+ //# sourceMappingURL=workspace-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-index.js","sourceRoot":"","sources":["../../src/index-store/workspace-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,GAAG,EAAwB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuB,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACH,qBAAqB,EAKxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACH,eAAe,IAAI,aAAa,EAChC,WAAW,EAEd,MAAM,2BAA2B,CAAC;AAKnC,MAAM,OAAO,cAAc;IAcvB,YACqB,UAA2B,EAC3B,WAAmB,EACnB,aAAqB;QAFrB,eAAU,GAAV,UAAU,CAAiB;QAC3B,gBAAW,GAAX,WAAW,CAAQ;QACnB,kBAAa,GAAb,aAAa,CAAQ;QAdzB,aAAQ,GAAG,oBAAoB,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;QAChE,cAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAG9B,wBAAmB,GAAG,KAAK,CAAC;QAC5B,sBAAiB,GAAuB,WAAW,CAAC;QAC3C,qBAAgB,GAAG,IAAI,GAAG,EAAc,CAAC;QACzC,oBAAe,GAAG,IAAI,GAAG,EAAc,CAAC;QACjD,gBAAW,GAAa,EAAE,CAAC;QAQ/B,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,uBAAuB,CAAC,QAAoB;QACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC;IACN,CAAC;IAED,sBAAsB,CAAC,QAAoB;QACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC;IACN,CAAC;IAED,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC;IACjD,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC;IAC7D,CAAC;IAED,IAAI,UAAU;QACV,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,iBAAiB,CAAC,eAAwC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QACnF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9C,OAAO;YACH,KAAK,EAAE,UAAU,CAAC,UAAU;YAC5B,KAAK,EAAE,UAAU,CAAC,UAAU,KAAK,OAAO;YACxC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,cAAc,EAAE,UAAU,CAAC,eAAe,CAAC,MAAM;YACjD,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC3B,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC;gBACxD,CAAC,CAAC,SAAS;YACf,UAAU,EAAE,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC9F,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,qBAAqB,EAAE,CAAC,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7E,sBAAsB,EAAE,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SAClF,CAAC;IACN,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,IAAI;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtF,OAAO;YACX,CAAC;QACL,CAAC;QACD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACzF,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC/F,OAAO;YACX,CAAC;YACD,gBAAgB,CAAC,qCAAqC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAClG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC;gBACD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;gBAC3E,IAAI,CAAC,WAAW,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACL,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YACjC,CAAC;YACD,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,aAAa,CAAC,MAAM,CAAC,CAAC;YACtB,gBAAgB,CAAC,2BAA2B,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,SAAoB;QAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;YACvD,MAAM,SAAS,EAAE,KAAK,YAAY,KAAK;gBACnC,CAAC,CAAC,SAAS,CAAC,KAAK;gBACjB,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,OAAO,IAAI,uBAAuB,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAoB,EAAE,OAA4B;QAClE,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9D,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,qFAAqF;IACrF,UAAU;QACN,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,SAAmB;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,aAAa,CAChB;YACI,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7C,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACnD,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;YAC1D,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;SAC3C,EACD,SAAS,CACZ,CAAC;IACN,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAoB;QAC3C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,MAAM,IAAI,CAAC,YAAY,CAAC;QAC5B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACjC,UAAU,CAAC,gBAAgB,CAAC,yCAAyC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAClC,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5B,UAAU,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrB,eAAe,EAAE,EAAE;YACnB,gBAAgB,EAAE,EAAE;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;gBACjC,OAAO,EAAE,SAAS;gBAClB,SAAS;gBACT,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW;gBAC3C,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,SAAS,EAAE,KAAK;gBAChB,iBAAiB,EAAE,MAAM,CAAC,UAAU;gBACpC,YAAY,EAAE,MAAM,CAAC,SAAS;gBAC9B,KAAK,EAAE,CAAC;wBACJ,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC9B,CAAC;aACL,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACL,8BAA8B;QAClC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,2BAA2B;QAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,KAAK,GAAG,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,8BAA8B,CAChC,KAAa,EACb,OAA+E;QAE/E,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACrC,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,aAAqB,EAAE,WAA+B;QAC3E,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC3E,IAAI,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;YACtE,IAAI,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,MAA6B;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,YAAY,CAAC;YAC5B,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,OAAO;YACX,CAAC;YACD,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC1C,UAAU,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnF,CAAC;gBACD,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,qBAAqB,CACjB,UAAU,CAAC,qBAAqB,EAChC,UAAU,EACV,KAAK,EACL,mBAAmB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CACrD,CAAC;gBACF,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;oBAAS,CAAC;gBACP,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC/B,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,aAAa,CAAC,oBAA4B;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,YAAY,CAAC,OAAe;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5F,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACrF,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,OAAO,CAAC;QACnB,CAAC;IACL,CAAC;IAED,cAAc,CAAC,SAAiB;QAC5B,OAAO,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC;IAC/E,CAAC;IAED,WAAW,CAAC,UAAU,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;aACvB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;aACvD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;aACxE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,YAAY,CAAC,aAAqB;QAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM;gBACjC,CAAC,CAAC,aAAa,CAAC;QACxB,CAAC;QACD,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM;YACjC,CAAC,CAAC,aAAa,CAAC;QACpB,OAAO,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAoB;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,WAAW,CACd;YACI,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7C,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAC3C,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;YACnC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE;YAC3C,cAAc,EAAE,KAAK,CAAC,EAAE;gBACpB,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO;YAC3B,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB;YAClD,eAAe,EAAE,QAAQ,CAAC,EAAE;gBACxB,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;YACjC,CAAC;YACD,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACrD,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YACvD,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACrD,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,iBAAiB;SACxC,EACD,SAAS,CACZ,CAAC;IACN,CAAC;IAEO,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC/D,aAAa,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;YACjE,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;SAC1D,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAqB;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACnC,UAAU,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,UAAU,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAS,GAAG,MAAO;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC;YACpD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,cAAc;QACxB,sEAAsE;QACtE,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAiB;QAC5D,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;oBACnE,SAAS;gBACb,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5C,SAAS;YACb,CAAC;YACD,IACI,KAAK,CAAC,MAAM,EAAE;mBACX,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;mBAC1B,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;mBAC3B,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,EACvE,CAAC;gBACC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB;QACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,oBAAoB;QACxB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,QAAQ,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IAEO,mBAAmB;QACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,QAAQ,EAAE,CAAC;QACf,CAAC;IACL,CAAC;CACJ;AAED,8DAA8D;AAC9D,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,CAAC;AAElD,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface StaleFileDiff {
2
+ /** Absolute (or host) paths that need parse+persist. */
3
+ dirtyPaths: string[];
4
+ /** Indexed URIs present on disk for this pass. */
5
+ presentUris: Set<string>;
6
+ /** Indexed URIs in the store that were not among the provided paths. */
7
+ removedUris: string[];
8
+ }
9
+ /**
10
+ * Compare filesystem mtimes to a preloaded documents mtime map (one SQLite read).
11
+ */
12
+ export declare function diffStaleFiles(filePaths: string[], toIndexedUri: (filePath: string) => string, storedMtimes: Map<string, number | undefined>): Promise<StaleFileDiff>;
13
+ /** True when the file's mtime matches the preloaded store map entry. */
14
+ export declare function isUnchangedByMtime(filePath: string, indexedUri: string, storedMtimes: Map<string, number | undefined>): Promise<boolean>;