@suco/su-auggie-mcp 0.1.6 → 0.1.8

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.
@@ -20,11 +20,22 @@ export interface FileIndexResult {
20
20
  error?: FileErrorType;
21
21
  message?: string;
22
22
  }
23
+ /** Discovery statistics */
24
+ export interface DiscoveryStats {
25
+ /** Total files scanned on filesystem */
26
+ scanned: number;
27
+ /** Files skipped because already in index */
28
+ alreadyIndexed: number;
29
+ /** New files found (scanned - alreadyIndexed) */
30
+ newFiles: number;
31
+ }
23
32
  /** Statistics for FileIndexer */
24
33
  export interface FileIndexerStats {
25
- /** Files successfully indexed */
34
+ /** Total files in the codebase (SDK index) */
35
+ total: number;
36
+ /** Files successfully indexed this session */
26
37
  indexed: number;
27
- /** Files skipped (too large, binary, etc.) */
38
+ /** Files skipped this session (too large, binary, etc.) */
28
39
  skipped: number;
29
40
  /** Files in tier 1 retry queue */
30
41
  pendingRetry: number;
@@ -38,6 +49,8 @@ export interface FileIndexerStats {
38
49
  cooldownCycle: number;
39
50
  /** Next cooldown retry time */
40
51
  cooldownNextRetryAt: string | null;
52
+ /** Discovery stats from filesystem scan */
53
+ discovery: DiscoveryStats;
41
54
  }
42
55
  /** Callback for progress updates */
43
56
  export type ProgressCallback = (indexed: number, total: number, message: string) => void;
@@ -71,7 +84,10 @@ export declare class FileIndexer {
71
84
  private cooldownTimer;
72
85
  private cooldownNextRetryAt;
73
86
  private stats;
87
+ private discoveryStats;
74
88
  constructor(context: DirectContext, root: string);
89
+ /** Update discovery statistics (called by Workspace during file discovery) */
90
+ setDiscoveryStats(scanned: number, alreadyIndexed: number): void;
75
91
  /** Get current statistics */
76
92
  getStats(): FileIndexerStats;
77
93
  /** Get batcher metrics */
@@ -101,6 +101,12 @@ export class FileIndexer {
101
101
  recovered: 0,
102
102
  failed: 0,
103
103
  };
104
+ // Discovery statistics
105
+ discoveryStats = {
106
+ scanned: 0,
107
+ alreadyIndexed: 0,
108
+ newFiles: 0,
109
+ };
104
110
  constructor(context, root) {
105
111
  this.context = context;
106
112
  this.root = root;
@@ -108,12 +114,21 @@ export class FileIndexer {
108
114
  this.indexQueue = new PQueue({ concurrency: this.batcher.getConcurrency() });
109
115
  this.loadCooldownQueue();
110
116
  }
117
+ /** Update discovery statistics (called by Workspace during file discovery) */
118
+ setDiscoveryStats(scanned, alreadyIndexed) {
119
+ this.discoveryStats = {
120
+ scanned,
121
+ alreadyIndexed,
122
+ newFiles: scanned - alreadyIndexed,
123
+ };
124
+ }
111
125
  /** Get current statistics */
112
126
  getStats() {
113
127
  const currentCycle = this.cooldownQueue.length > 0
114
128
  ? Math.max(...this.cooldownQueue.map(e => e.cooldownCycle))
115
129
  : 0;
116
130
  return {
131
+ total: this.context.getIndexedPaths().length,
117
132
  indexed: this.stats.indexed,
118
133
  skipped: this.stats.skipped,
119
134
  pendingRetry: this.retryQueue.length,
@@ -122,6 +137,7 @@ export class FileIndexer {
122
137
  failed: this.stats.failed,
123
138
  cooldownCycle: currentCycle,
124
139
  cooldownNextRetryAt: this.cooldownNextRetryAt?.toISOString() ?? null,
140
+ discovery: this.discoveryStats,
125
141
  };
126
142
  }
127
143
  /** Get batcher metrics */
package/dist/types.d.ts CHANGED
@@ -133,15 +133,15 @@ export interface WorkspaceStatus {
133
133
  root: string;
134
134
  /** Current status */
135
135
  status: WorkspaceStatusType;
136
- /** Total files processed (indexed + skipped + failed + pending) */
136
+ /** Total files in SDK index (the codebase) */
137
137
  total: number;
138
- /** Files skipped (too large, binary, unreadable, etc.) */
138
+ /** Files skipped this session (too large, binary, unreadable, etc.) */
139
139
  skipped: number;
140
- /** Files that permanently failed indexing */
140
+ /** Files that permanently failed indexing this session */
141
141
  failed: number;
142
142
  /** Number of pending files (change queue + retry queue) */
143
143
  pending: number;
144
- /** Number of indexed files */
144
+ /** Number of newly indexed files this session */
145
145
  indexed: number;
146
146
  /** Whether file watcher is active */
147
147
  watching: boolean;
@@ -183,6 +183,15 @@ export interface WorkspaceStatus {
183
183
  };
184
184
  /** Drift reconciliation stats (only when persistence enabled) */
185
185
  drift?: DriftStats;
186
+ /** Discovery stats from filesystem scan */
187
+ discovery?: {
188
+ /** Total files scanned on filesystem */
189
+ scanned: number;
190
+ /** Files skipped because already in index */
191
+ alreadyIndexed: number;
192
+ /** New files found (scanned - alreadyIndexed) */
193
+ newFiles: number;
194
+ };
186
195
  }
187
196
  /** Codebase tool input - search mode */
188
197
  export interface CodebaseSearchInput {
@@ -68,8 +68,9 @@ export declare class Workspace {
68
68
  /** Perform initial indexing using FileIndexer */
69
69
  private performInitialIndex;
70
70
  /**
71
- * Generator that discovers files for indexing.
72
- * Yields absolute paths of files that need indexing.
71
+ * Discover files for indexing.
72
+ * Returns array of absolute paths of new files that need indexing.
73
+ * Updates FileIndexer discovery stats.
73
74
  */
74
75
  private discoverFiles;
75
76
  /** Get drift reconciliation statistics */
package/dist/workspace.js CHANGED
@@ -432,12 +432,9 @@ export class Workspace {
432
432
  this.indexingStartTime = new Date();
433
433
  // Reset FileIndexer stats for fresh indexing
434
434
  this.fileIndexer.resetStats();
435
- // Discover files to index
436
- const filesToIndex = [];
437
- for (const absolutePath of this.discoverFiles(indexedSet)) {
438
- filesToIndex.push(absolutePath);
439
- this.progress.discovered++;
440
- }
435
+ // Discover files to index (also updates FileIndexer discovery stats)
436
+ const filesToIndex = this.discoverFiles(indexedSet);
437
+ this.progress.discovered = filesToIndex.length;
441
438
  this.progress.discovering = false;
442
439
  // Hot start - nothing to index
443
440
  if (filesToIndex.length === 0) {
@@ -509,23 +506,33 @@ export class Workspace {
509
506
  }
510
507
  }
511
508
  /**
512
- * Generator that discovers files for indexing.
513
- * Yields absolute paths of files that need indexing.
509
+ * Discover files for indexing.
510
+ * Returns array of absolute paths of new files that need indexing.
511
+ * Updates FileIndexer discovery stats.
514
512
  */
515
- *discoverFiles(indexedSet) {
516
- const walk = function* (dir, root, ignoreFilter) {
513
+ discoverFiles(indexedSet) {
514
+ let scanned = 0;
515
+ let alreadyIndexed = 0;
516
+ const newFiles = [];
517
+ const walk = (dir) => {
517
518
  try {
518
519
  const entries = fs.readdirSync(dir, { withFileTypes: true });
519
520
  for (const entry of entries) {
520
521
  const absolutePath = path.join(dir, entry.name);
521
- const relativePath = path.relative(root, absolutePath);
522
- if (shouldIgnore(ignoreFilter, relativePath))
522
+ const relativePath = path.relative(this.root, absolutePath);
523
+ if (shouldIgnore(this.ignoreFilter, relativePath))
523
524
  continue;
524
525
  if (entry.isDirectory()) {
525
- yield* walk(absolutePath, root, ignoreFilter);
526
+ walk(absolutePath);
526
527
  }
527
528
  else if (entry.isFile()) {
528
- yield absolutePath;
529
+ scanned++;
530
+ if (indexedSet.has(relativePath)) {
531
+ alreadyIndexed++;
532
+ }
533
+ else {
534
+ newFiles.push(absolutePath);
535
+ }
529
536
  }
530
537
  }
531
538
  }
@@ -533,13 +540,10 @@ export class Workspace {
533
540
  // Ignore permission errors
534
541
  }
535
542
  };
536
- for (const absolutePath of walk(this.root, this.root, this.ignoreFilter)) {
537
- const relativePath = path.relative(this.root, absolutePath);
538
- // Skip already indexed files
539
- if (indexedSet.has(relativePath))
540
- continue;
541
- yield absolutePath;
542
- }
543
+ walk(this.root);
544
+ // Report discovery stats to FileIndexer
545
+ this.fileIndexer?.setDiscoveryStats(scanned, alreadyIndexed);
546
+ return newFiles;
543
547
  }
544
548
  /** Get drift reconciliation statistics */
545
549
  getDriftStats() {
@@ -559,8 +563,9 @@ export class Workspace {
559
563
  }
560
564
  /** Get workspace status */
561
565
  getStatus() {
562
- // Get stats from FileIndexer first (needed for pending calculation)
566
+ // Get stats from FileIndexer (single source of truth)
563
567
  const stats = this.fileIndexer?.getStats() ?? {
568
+ total: this.context?.getIndexedPaths().length ?? 0,
564
569
  indexed: 0,
565
570
  skipped: 0,
566
571
  failed: 0,
@@ -569,6 +574,7 @@ export class Workspace {
569
574
  pendingCooldown: 0,
570
575
  cooldownCycle: 0,
571
576
  cooldownNextRetryAt: null,
577
+ discovery: { scanned: 0, alreadyIndexed: 0, newFiles: 0 },
572
578
  };
573
579
  // Pending = discovered - (indexed + skipped + failed from FileIndexer)
574
580
  // This avoids double-counting skipped files as both skipped AND pending
@@ -608,9 +614,8 @@ export class Workspace {
608
614
  };
609
615
  // Calculate pending (change queue + retry queue + cooldown)
610
616
  const pending = this.changeQueue.length + progressPending + stats.pendingRetry + stats.pendingCooldown;
611
- // Calculate total = indexed + skipped + failed + pending
612
- const indexed = stats.indexed;
613
- const total = indexed + stats.skipped + stats.failed + pending;
617
+ // Total = all files in SDK index (FileIndexer is the source of truth)
618
+ const total = stats.total;
614
619
  return {
615
620
  root: this.root,
616
621
  status: this.status,
@@ -618,7 +623,7 @@ export class Workspace {
618
623
  skipped: stats.skipped,
619
624
  failed: stats.failed,
620
625
  pending,
621
- indexed,
626
+ indexed: stats.indexed,
622
627
  watching: this.watcher !== null,
623
628
  lastIndexed: this.lastIndexed?.toISOString() ?? null,
624
629
  error: this.error ?? undefined,
@@ -637,6 +642,7 @@ export class Workspace {
637
642
  batchLimits: metrics.batchLimits,
638
643
  },
639
644
  drift: driftStats.reconciled ? driftStats : undefined,
645
+ discovery: stats.discovery.scanned > 0 ? stats.discovery : undefined,
640
646
  };
641
647
  }
642
648
  /** Get indexed paths */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suco/su-auggie-mcp",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "MCP server exposing Augment Code context engine capabilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",