@ff-labs/fff-bun 0.10.4-nightly.dd87489 → 0.10.5-dev.2a477d2

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.
package/README.md CHANGED
@@ -174,8 +174,8 @@ If prebuilt binaries aren't available for your platform:
174
174
 
175
175
  ```bash
176
176
  # Clone the repository
177
- git clone https://github.com/dmtrKovalenko/fff.nvim
178
- cd fff.nvim
177
+ git clone https://github.com/dmtrKovalenko/fff
178
+ cd fff
179
179
 
180
180
  # Build the C library
181
181
  cargo build --release -p fff-c
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Binary resolution utilities for fff
3
+ *
4
+ * Resolves the native library from:
5
+ * 1. Platform-specific npm package (e.g. @ff-labs/fff-bin-darwin-arm64)
6
+ * 2. Local dev build (target/release or target/debug)
7
+ */
8
+ /**
9
+ * Check if the binary exists in any known location
10
+ */
11
+ export declare function binaryExists(): boolean;
12
+ /**
13
+ * Find the native library binary.
14
+ *
15
+ * Resolution order:
16
+ * - Dev workspace: local dev build first, then npm package
17
+ * - Production: npm package first, then dev build
18
+ *
19
+ * @returns Absolute path to the library, or null if not found
20
+ */
21
+ export declare function findBinary(): string | null;
22
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AA0DD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAuB1C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tools for standalone-executable native library embedding.
3
+ *
4
+ * `bun build --compile` only bundles files referenced by statically analyzable
5
+ * imports. Runtime resolution (./download.ts) is invisible to the bundler, so
6
+ * we additionally reference the platform's native lib through a `type: "file"`
7
+ * import. Bun then embeds it and returns a `$bunfs` path inside the compiled
8
+ * binary (and the real on-disk path under `bun run`).
9
+ *
10
+ * Linux libc cannot be detected at build time, so it is supplied via the
11
+ * FFF_LIBC build constant (`bun build --define FFF_LIBC='"musl"'`), defaulting
12
+ * to glibc. macOS/Windows need no define.
13
+ */
14
+ export declare const embeddedLibPath: string | null;
15
+ //# sourceMappingURL=embedded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded.d.ts","sourceRoot":"","sources":["../src/embedded.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwCH,eAAO,MAAM,eAAe,EAAE,MAAM,GAAG,IAAqC,CAAC"}
@@ -0,0 +1,607 @@
1
+ /**
2
+ * The shared public API surface for the fff file finder, implemented identically
3
+ * by `@ff-labs/fff-node` and `@ff-labs/fff-bun`.
4
+ *
5
+ * This file is the single source of truth for every type, helper, and the
6
+ * `FileFinderApi` interface that crosses the package boundary. It is copied
7
+ * verbatim into each package's `src/fff-api.ts` by `make sync-api`.
8
+ *
9
+ * Anything that is not part of the public API (FFI struct layouts, binary
10
+ * loading, platform detection, etc.) stays as per-package internal
11
+ * implementation and must NOT live here.
12
+ *
13
+ * Keep this file self-contained: it must not import from any package-local
14
+ * module, since each package compiles its own copy.
15
+ */
16
+ /**
17
+ * Result type for all operations - follows the Result pattern
18
+ */
19
+ export type Result<T> = {
20
+ ok: true;
21
+ value: T;
22
+ } | {
23
+ ok: false;
24
+ error: string;
25
+ };
26
+ /**
27
+ * Helper to create a successful result
28
+ */
29
+ export declare function ok<T>(value: T): Result<T>;
30
+ /**
31
+ * Helper to create an error result
32
+ */
33
+ export declare function err<T>(error: string): Result<T>;
34
+ /**
35
+ * Initialization options for the file finder
36
+ */
37
+ export interface InitOptions {
38
+ /** Base directory to index (required) */
39
+ basePath: string;
40
+ /** Path to frecency database (optional, omit to skip frecency initialization) */
41
+ frecencyDbPath?: string;
42
+ /** Path to query history database (optional, omit to skip query tracker initialization) */
43
+ historyDbPath?: string;
44
+ /** @deprecated no-op */
45
+ useUnsafeNoLock?: boolean;
46
+ /**
47
+ * Disable mmap cache warmup after the initial scan. When mmap cache is
48
+ * enabled (the default), the first grep search is as fast as subsequent
49
+ * ones at the cost of a longer scan time and higher initial memory usage.
50
+ */
51
+ disableMmapCache?: boolean;
52
+ /**
53
+ * Disable the content index built after the initial scan.
54
+ * Content indexing enables faster content-aware filtering during grep.
55
+ */
56
+ disableContentIndexing?: boolean;
57
+ /**
58
+ * Disable the background file-system watcher. When the watcher is
59
+ * disabled, files are scanned once but not monitored for changes.
60
+ * (default: false)
61
+ */
62
+ disableWatch?: boolean;
63
+ /** enables optimizations for AI agent assistants. Provide as true if running via mcp/agent */
64
+ aiMode?: boolean;
65
+ /**
66
+ * Path to the tracing log file. When set, the shared FFF tracing subscriber
67
+ * is installed on first init and file output is written here. Omit to leave
68
+ * logging uninitialized.
69
+ */
70
+ logFilePath?: string;
71
+ /**
72
+ * Log level for the tracing subscriber: "trace", "debug", "info", "warn",
73
+ * or "error". Defaults to "info". Ignored when `logFilePath` is not set.
74
+ */
75
+ logLevel?: "trace" | "debug" | "info" | "warn" | "error";
76
+ /**
77
+ * Override for the content cache file-count cap. When omitted, the picker
78
+ * auto-sizes the budget from the final scanned file count.
79
+ */
80
+ cacheBudgetMaxFiles?: number;
81
+ /** Override for the content cache byte cap. See `cacheBudgetMaxFiles`. */
82
+ cacheBudgetMaxBytes?: number;
83
+ /** Override for the per-file byte cap in the content cache. */
84
+ cacheBudgetMaxFileSize?: number;
85
+ /**
86
+ * Allow indexing the filesystem root (`/`).
87
+ * Off by default, having fff instance at the large folder will generally require
88
+ * file watcher and indexing which will consume a lot of resources if performed uncontrolled
89
+ **/
90
+ enableFsRootScanning?: boolean;
91
+ /** Allow indexing the user's home directory. Same trade-off as `enableFsRootScanning`. */
92
+ enableHomeDirScanning?: boolean;
93
+ /** Follow symlinks for directories */
94
+ followSymlinks?: boolean;
95
+ }
96
+ /**
97
+ * Search options for fuzzy file search
98
+ */
99
+ export interface SearchOptions {
100
+ /** Maximum threads for parallel search (0 = auto) */
101
+ maxThreads?: number;
102
+ /** Current file path (for deprioritization in results) */
103
+ currentFile?: string;
104
+ /** Combo boost score multiplier (default: 100) */
105
+ comboBoostMultiplier?: number;
106
+ /** Minimum combo count for boost (default: 3) */
107
+ minComboCount?: number;
108
+ /** Page index for pagination (default: 0) */
109
+ pageIndex?: number;
110
+ /** Page size for pagination (default: 100) */
111
+ pageSize?: number;
112
+ }
113
+ /**
114
+ * Options for `glob`, the constraint-only search.
115
+ *
116
+ * The pattern is applied as a single pass SIMD optimized prefiltering
117
+ * without any fuzzy matching involved. Faster and 100% compatible to npm `glob`.
118
+ */
119
+ export interface GlobOptions {
120
+ /** Maximum threads for parallel filtering (0 = auto). */
121
+ maxThreads?: number;
122
+ /** Current file path (for deprioritization in results). */
123
+ currentFile?: string;
124
+ /** Page index for pagination (default: 0). */
125
+ pageIndex?: number;
126
+ /** Page size for pagination (default: 100). */
127
+ pageSize?: number;
128
+ }
129
+ /**
130
+ * A file item in search results
131
+ */
132
+ export interface FileItem {
133
+ /** Path relative to the indexed directory */
134
+ relativePath: string;
135
+ /** File name only */
136
+ fileName: string;
137
+ /** File size in bytes */
138
+ size: number;
139
+ /** Last modified timestamp (Unix seconds) */
140
+ modified: number;
141
+ /** Frecency score based on access patterns */
142
+ accessFrecencyScore: number;
143
+ /** Frecency score based on modification time */
144
+ modificationFrecencyScore: number;
145
+ /** Combined frecency score */
146
+ totalFrecencyScore: number;
147
+ /** Git status: 'clean', 'modified', 'untracked', 'staged_new', etc. */
148
+ gitStatus: string;
149
+ }
150
+ /**
151
+ * Score breakdown for a search result
152
+ */
153
+ export interface Score {
154
+ /** Total combined score */
155
+ total: number;
156
+ /** Base fuzzy match score */
157
+ baseScore: number;
158
+ /** Bonus for filename match */
159
+ filenameBonus: number;
160
+ /** Bonus for special filenames (index.ts, main.rs, etc.) */
161
+ specialFilenameBonus: number;
162
+ /** Boost from frecency */
163
+ frecencyBoost: number;
164
+ /** Penalty for distance in path */
165
+ distancePenalty: number;
166
+ /** Penalty if this is the current file */
167
+ currentFilePenalty: number;
168
+ /** Boost from query history combo matching */
169
+ comboMatchBoost: number;
170
+ /** Whether this was an exact match */
171
+ exactMatch: boolean;
172
+ /** Type of match: 'fuzzy', 'exact', 'prefix', etc. */
173
+ matchType: string;
174
+ }
175
+ /**
176
+ * Location in file (from query like "file.ts:42")
177
+ */
178
+ export type Location = {
179
+ type: "line";
180
+ line: number;
181
+ } | {
182
+ type: "position";
183
+ line: number;
184
+ col: number;
185
+ } | {
186
+ type: "range";
187
+ start: {
188
+ line: number;
189
+ col: number;
190
+ };
191
+ end: {
192
+ line: number;
193
+ col: number;
194
+ };
195
+ };
196
+ /**
197
+ * Search result from fuzzy file search
198
+ */
199
+ export interface SearchResult {
200
+ /** Matched file items */
201
+ items: FileItem[];
202
+ /** Corresponding scores for each item */
203
+ scores: Score[];
204
+ /** Total number of files that matched */
205
+ totalMatched: number;
206
+ /** Total number of indexed files */
207
+ totalFiles: number;
208
+ /** Location parsed from query (e.g., "file.ts:42:10") */
209
+ location?: Location;
210
+ }
211
+ /**
212
+ * A directory item in search results
213
+ */
214
+ export interface DirItem {
215
+ /** Path relative to the indexed directory (e.g., "src/components/") */
216
+ relativePath: string;
217
+ /** Last path segment (e.g., "components/" for "src/components/") */
218
+ dirName: string;
219
+ /** Maximum access frecency score among direct child files */
220
+ maxAccessFrecency: number;
221
+ }
222
+ /**
223
+ * Search options for directory search (subset of SearchOptions)
224
+ */
225
+ export interface DirSearchOptions {
226
+ /** Maximum threads for parallel search (0 = auto) */
227
+ maxThreads?: number;
228
+ /** Current file path (for distance scoring) */
229
+ currentFile?: string;
230
+ /** Page index for pagination (default: 0) */
231
+ pageIndex?: number;
232
+ /** Page size for pagination (default: 100) */
233
+ pageSize?: number;
234
+ }
235
+ /**
236
+ * Search result from fuzzy directory search
237
+ */
238
+ export interface DirSearchResult {
239
+ /** Matched directory items */
240
+ items: DirItem[];
241
+ /** Corresponding scores for each item */
242
+ scores: Score[];
243
+ /** Total number of directories that matched */
244
+ totalMatched: number;
245
+ /** Total number of indexed directories */
246
+ totalDirs: number;
247
+ }
248
+ /**
249
+ * A single item in a mixed (files + directories) search result
250
+ */
251
+ export type MixedItem = {
252
+ type: "file";
253
+ item: FileItem;
254
+ } | {
255
+ type: "directory";
256
+ item: DirItem;
257
+ };
258
+ /**
259
+ * Search result from mixed (files + directories) fuzzy search.
260
+ * Items are interleaved by total score in descending order.
261
+ */
262
+ export interface MixedSearchResult {
263
+ /** Matched items (files and directories interleaved by score) */
264
+ items: MixedItem[];
265
+ /** Corresponding scores for each item */
266
+ scores: Score[];
267
+ /** Total number of items (files + dirs) that matched */
268
+ totalMatched: number;
269
+ /** Total number of indexed files */
270
+ totalFiles: number;
271
+ /** Total number of indexed directories */
272
+ totalDirs: number;
273
+ /** Location parsed from query */
274
+ location?: Location;
275
+ }
276
+ /**
277
+ * Scan progress information
278
+ */
279
+ export interface ScanProgress {
280
+ /** Number of files scanned so far */
281
+ scannedFilesCount: number;
282
+ /** Whether a scan is currently in progress */
283
+ isScanning: boolean;
284
+ /** Whether the background file watcher is ready */
285
+ isWatcherReady: boolean;
286
+ /** Whether the warmup/bigram phase has completed */
287
+ isWarmupComplete: boolean;
288
+ }
289
+ /**
290
+ * Normalized watch event kind.
291
+ * A file removed and recreated in one processed batch is marked as modified.
292
+ *
293
+ * rescan = internal OS buffers were overloaded, some events might be missing.
294
+ * The `path` is going to be a folder needs to be rescanned
295
+ */
296
+ export type WatchEventKind = "created" | "modified" | "removed" | "rescan";
297
+ /** A single filesystem change notification. */
298
+ export interface WatchEvent {
299
+ /** Absolute path of the affected file (base path to rescan if `kind ==rescan`) */
300
+ path: string;
301
+ kind: WatchEventKind;
302
+ }
303
+ /** Options for watch subscriptions. */
304
+ export interface WatchOptions {
305
+ /** Additional glob wildcard patterns to ignore */
306
+ ignore?: string[];
307
+ }
308
+ /**
309
+ * Receives normalized batches of up to 128 events. Each path appears once.
310
+ */
311
+ export type WatchBatchCallback = (events: WatchEvent[]) => void;
312
+ /** Call me to unsubscribe. */
313
+ export type WatchUnsubscribe = () => void;
314
+ /** Database health information */
315
+ export interface DbHealth {
316
+ /** Path to the database */
317
+ path: string;
318
+ /** Size of the database on disk in bytes */
319
+ diskSize: number;
320
+ }
321
+ /**
322
+ * Health check result
323
+ */
324
+ export interface HealthCheck {
325
+ /** Library version */
326
+ version: string;
327
+ /** Git integration status */
328
+ git: {
329
+ /** Whether git2 library is available */
330
+ available: boolean;
331
+ /** Whether a git repository was found */
332
+ repositoryFound: boolean;
333
+ /** Git working directory path */
334
+ workdir?: string;
335
+ /** libgit2 version string */
336
+ libgit2Version: string;
337
+ /** Error message if git detection failed */
338
+ error?: string;
339
+ };
340
+ /** File picker status */
341
+ filePicker: {
342
+ /** Whether the file picker is initialized */
343
+ initialized: boolean;
344
+ /** Base path being indexed */
345
+ basePath?: string;
346
+ /** Whether a scan is in progress */
347
+ isScanning?: boolean;
348
+ /** Number of indexed files */
349
+ indexedFiles?: number;
350
+ /** Error message if there's an issue */
351
+ error?: string;
352
+ };
353
+ /** Frecency database status */
354
+ frecency: {
355
+ /** Whether frecency tracking is initialized */
356
+ initialized: boolean;
357
+ /** Database health information */
358
+ dbHealthcheck?: DbHealth;
359
+ /** Error message if there's an issue */
360
+ error?: string;
361
+ };
362
+ /** Query tracker status */
363
+ queryTracker: {
364
+ /** Whether query tracking is initialized */
365
+ initialized: boolean;
366
+ /** Database health information */
367
+ dbHealthcheck?: DbHealth;
368
+ /** Error message if there's an issue */
369
+ error?: string;
370
+ };
371
+ }
372
+ /**
373
+ * Grep search mode
374
+ */
375
+ export type GrepMode = "plain" | "regex" | "fuzzy";
376
+ /**
377
+ * Opaque pagination cursor for grep results.
378
+ * Pass this to `GrepOptions.cursor` to fetch the next page.
379
+ * Do not construct or modify this — use the `nextCursor` from a previous `GrepResult`.
380
+ */
381
+ export interface GrepCursor {
382
+ /** @internal */
383
+ readonly __brand: "GrepCursor";
384
+ /** @internal */
385
+ readonly _offset: number;
386
+ }
387
+ /**
388
+ * @internal Create a GrepCursor from a raw file offset.
389
+ */
390
+ export declare function createGrepCursor(offset: number): GrepCursor;
391
+ /**
392
+ * Options for live grep (content search)
393
+ *
394
+ * Files are searched sequentially in frecency order (most recently/frequently
395
+ * accessed first). The engine returns a `nextCursor` for fetching the next page.
396
+ */
397
+ export interface GrepOptions {
398
+ /** Maximum file size to search in bytes. Files larger than this are skipped. (default: 10MB) */
399
+ maxFileSize?: number;
400
+ /** Maximum matching lines to collect from a single file (default: 200) */
401
+ maxMatchesPerFile?: number;
402
+ /** Smart case: case-insensitive when the query is all lowercase, case-sensitive otherwise (default: true) */
403
+ smartCase?: boolean;
404
+ /**
405
+ * Pagination cursor from a previous `GrepResult.nextCursor`.
406
+ * Omit (or pass `null`) for the first page.
407
+ */
408
+ cursor?: GrepCursor | null;
409
+ /** Search mode (default: "plain") */
410
+ mode?: GrepMode;
411
+ /**
412
+ * Maximum wall-clock time in milliseconds to spend searching before returning
413
+ * partial results. 0 = unlimited. (default: 0)
414
+ */
415
+ timeBudgetMs?: number;
416
+ /** Number of context lines to include before each match (default: 0) */
417
+ beforeContext?: number;
418
+ /** Number of context lines to include after each match (default: 0) */
419
+ afterContext?: number;
420
+ /** Maximum matches to return in this page across all files (default: 50) */
421
+ pageSize?: number;
422
+ /**
423
+ * When true, classify each match line as a code definition (struct/fn/class/...)
424
+ * and expose it via `GrepMatch.isDefinition`. Let callers re-rank defs first
425
+ * without a TS-side regex port. (default: false)
426
+ */
427
+ classifyDefinitions?: boolean;
428
+ }
429
+ /**
430
+ * A single grep match with file and line information
431
+ */
432
+ export interface GrepMatch {
433
+ /** Path relative to the indexed directory */
434
+ relativePath: string;
435
+ /** File name only */
436
+ fileName: string;
437
+ /** Git status */
438
+ gitStatus: string;
439
+ /** File size in bytes */
440
+ size: number;
441
+ /** Last modified timestamp (Unix seconds) */
442
+ modified: number;
443
+ /** Whether the file is binary */
444
+ isBinary: boolean;
445
+ /** Combined frecency score */
446
+ totalFrecencyScore: number;
447
+ /** Access-based frecency score */
448
+ accessFrecencyScore: number;
449
+ /** Modification-based frecency score */
450
+ modificationFrecencyScore: number;
451
+ /** 1-based line number of the match */
452
+ lineNumber: number;
453
+ /** 0-based byte column of first match start */
454
+ col: number;
455
+ /** Absolute byte offset of the matched line from file start */
456
+ byteOffset: number;
457
+ /** The matched line text (may be truncated) */
458
+ lineContent: string;
459
+ /** Byte offset pairs [start, end] within lineContent for highlighting */
460
+ matchRanges: [number, number][];
461
+ /** Fuzzy match score (only in fuzzy mode) */
462
+ fuzzyScore?: number;
463
+ /** Lines before the match (context). Empty array when context is 0. */
464
+ contextBefore?: string[];
465
+ /** Lines after the match (context). Empty array when context is 0. */
466
+ contextAfter?: string[];
467
+ /** Whether this line is a code definition (only populated when `classifyDefinitions: true`). */
468
+ isDefinition?: boolean;
469
+ }
470
+ /**
471
+ * Result from a grep search
472
+ */
473
+ export interface GrepResult {
474
+ /** Matched items with file and line information. At most `max_matches_per_file`. */
475
+ items: GrepMatch[];
476
+ /** Total number of matches collected (always equal to items.length). */
477
+ totalMatched: number;
478
+ /** Number of files actually opened and searched in this call */
479
+ totalFilesSearched: number;
480
+ /** Total number of indexed files (before any filtering) */
481
+ totalFiles: number;
482
+ /** Number of files eligible for search after filtering out binary files, oversized files, and constraint mismatches */
483
+ filteredFileCount: number;
484
+ /**
485
+ * Cursor for the next page, or `null` if all eligible files have been searched.
486
+ * Pass this as `GrepOptions.cursor` to continue from where this call left off.
487
+ */
488
+ nextCursor: GrepCursor | null;
489
+ /** When regex mode fails to compile the pattern, the engine falls back to literal matching and this field contains the compilation error */
490
+ regexFallbackError?: string;
491
+ }
492
+ /**
493
+ * Options for multi-pattern grep (Aho-Corasick multi-needle search)
494
+ *
495
+ * Searches for lines matching ANY of the provided patterns using
496
+ * SIMD-accelerated Aho-Corasick multi-pattern matching.
497
+ */
498
+ export interface MultiGrepOptions {
499
+ /** Patterns to search for (OR logic — matches lines containing any pattern) */
500
+ patterns: string[];
501
+ /** File constraints like "*.rs" or "/src/" */
502
+ constraints?: string;
503
+ /** Maximum file size to search in bytes (default: 10MB) */
504
+ maxFileSize?: number;
505
+ /** Maximum matching lines to collect from a single file (default: 0 = unlimited) */
506
+ maxMatchesPerFile?: number;
507
+ /** Smart case: case-insensitive when all patterns are lowercase (default: true) */
508
+ smartCase?: boolean;
509
+ /**
510
+ * Pagination cursor from a previous `GrepResult.nextCursor`.
511
+ * Omit (or pass `null`) for the first page.
512
+ */
513
+ cursor?: GrepCursor | null;
514
+ /**
515
+ * Maximum wall-clock time in milliseconds to spend searching before returning
516
+ * partial results. 0 = unlimited. (default: 0)
517
+ */
518
+ timeBudgetMs?: number;
519
+ /** Number of context lines to include before each match (default: 0) */
520
+ beforeContext?: number;
521
+ /** Number of context lines to include after each match (default: 0) */
522
+ afterContext?: number;
523
+ /** Maximum matches to return in this page across all files (default: 50) */
524
+ pageSize?: number;
525
+ /**
526
+ * When true, classify each match line as a code definition (struct/fn/class/...)
527
+ * and expose it via `GrepMatch.isDefinition`. (default: false)
528
+ */
529
+ classifyDefinitions?: boolean;
530
+ }
531
+ /**
532
+ * The shared instance surface implemented by `FileFinder` in both
533
+ * `@ff-labs/fff-node` and `@ff-labs/fff-bun`.
534
+ *
535
+ * Both packages must implement this identically. Only instance members belong
536
+ * here. Static helpers (`create`, `isAvailable`, `ensureLoaded`,
537
+ * `healthCheckStatic`) are package-specific and intentionally excluded.
538
+ */
539
+ export interface FileFinderApi {
540
+ /** Whether the instance has been destroyed. */
541
+ readonly isDestroyed: boolean;
542
+ /** Destroy and free all native resources. */
543
+ destroy(): void;
544
+ /** Fuzzy file search. */
545
+ fileSearch(query: string, options?: SearchOptions): Result<SearchResult>;
546
+ /** Glob-only filtering (no fuzzy matching). */
547
+ glob(pattern: string, options?: GlobOptions): Result<SearchResult>;
548
+ /** Fuzzy directory search. */
549
+ directorySearch(query: string, options?: DirSearchOptions): Result<DirSearchResult>;
550
+ /** Fuzzy search over files and directories interleaved by score. */
551
+ mixedSearch(query: string, options?: SearchOptions): Result<MixedSearchResult>;
552
+ /** Content search (live grep). */
553
+ grep(query: string, options?: GrepOptions): Result<GrepResult>;
554
+ /** Multi-pattern OR content search (Aho-Corasick). */
555
+ multiGrep(options: MultiGrepOptions): Result<GrepResult>;
556
+ /** Trigger an async rescan of the indexed directory. */
557
+ scanFiles(): Result<void>;
558
+ /** Whether a scan is currently in progress. */
559
+ isScanning(): boolean;
560
+ /** The root directory being indexed. */
561
+ getBasePath(): Result<string | null>;
562
+ /** Current scan progress snapshot. */
563
+ getScanProgress(): Result<ScanProgress>;
564
+ /**
565
+ * Wait for the initial file scan to complete.
566
+ *
567
+ * Non-blocking: polls `isScanning` and yields to the event loop between
568
+ * checks, so other async work keeps running while waiting.
569
+ */
570
+ waitForScan(timeoutMs?: number): Promise<Result<boolean>>;
571
+ /**
572
+ * Wait for the initial file scan to complete, blocking the calling thread.
573
+ *
574
+ * Backed by the native `fff_wait_for_scan` call. Prefer `waitForScan` unless
575
+ * you specifically need synchronous blocking behaviour.
576
+ */
577
+ waitForScanBlocking(timeoutMs?: number): Result<boolean>;
578
+ /**
579
+ * Wait until the index is fully ready: the scan has finished and the warmup
580
+ * (content indexing / bigram) phase has completed.
581
+ *
582
+ * Non-blocking: polls `getScanProgress` and yields to the event loop.
583
+ */
584
+ waitForIndexReady(timeoutMs?: number): Promise<Result<boolean>>;
585
+ /** Restart indexing in a new directory. */
586
+ reindex(newPath: string): Result<void>;
587
+ /** Refresh the git status cache. Returns the number of updated files. */
588
+ refreshGitStatus(): Result<number>;
589
+ /** Record that `selectedFilePath` was chosen for `query`. */
590
+ trackQuery(query: string, selectedFilePath: string): Result<boolean>;
591
+ /** Get a historical query by offset (0 = most recent). */
592
+ getHistoricalQuery(offset: number): Result<string | null>;
593
+ /**
594
+ * Subscribe to filesystem changes matching `pattern`.
595
+ *
596
+ * Patterns may be base-relative globs (./ works), exact paths inside the indexed
597
+ * tree, or existing directories. An empty pattern watches the whole tree.
598
+ *
599
+ * Events are debounced and submitted in batches per 100-ms window at most 128 events.
600
+ * Gitignored and other ignored files are never triggering watcher.
601
+ */
602
+ watch(callback: WatchBatchCallback, options?: WatchOptions): Result<WatchUnsubscribe>;
603
+ watch(pattern: string, callback: WatchBatchCallback, options?: WatchOptions): Result<WatchUnsubscribe>;
604
+ /** Health/diagnostics information for this instance. */
605
+ healthCheck(testPath?: string): Result<HealthCheck>;
606
+ }
607
+ //# sourceMappingURL=fff-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fff-api.d.ts","sourceRoot":"","sources":["../src/fff-api.ts"],"names":[],"mappings":"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"}