@@ -18,12 +18,14 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
1818 throttleMs : {
1919 type : 'number' ,
2020 minimum : 0 ,
21- description : 'Optional delay in milliseconds after processing each file (testing/debugging).'
21+ description :
22+ 'Optional delay in milliseconds after processing each file (testing/debugging).'
2223 } ,
2324 delayStartMs : {
2425 type : 'number' ,
2526 minimum : 0 ,
26- description : 'Optional delay before processing begins (useful to keep job in running state briefly).'
27+ description :
28+ 'Optional delay before processing begins (useful to keep job in running state briefly).'
2729 }
2830 } ,
2931 required : [ ]
@@ -56,7 +58,7 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
5658 this . currentJobId = jobId ;
5759
5860 // Create background job
59- this . jobManager . create ( jobId , async ( job ) => {
61+ this . jobManager . create ( jobId , async job => {
6062 return await this . _executeBuild ( params , job ) ;
6163 } ) ;
6264
@@ -81,7 +83,7 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
8183 const roots = [
8284 path . resolve ( info . projectRoot , 'Assets' ) ,
8385 path . resolve ( info . projectRoot , 'Packages' ) ,
84- path . resolve ( info . projectRoot , 'Library/PackageCache' ) ,
86+ path . resolve ( info . projectRoot , 'Library/PackageCache' )
8587 ] ;
8688 const files = [ ] ;
8789 const seen = new Set ( ) ;
@@ -94,14 +96,21 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
9496 logger . info ( `[index][${ job . id } ] LSP initialized for project: ${ info . projectRoot } ` ) ;
9597 } catch ( lspError ) {
9698 logger . error ( `[index][${ job . id } ] LSP initialization failed: ${ lspError . message } ` ) ;
97- throw new Error ( `LSP initialization failed: ${ lspError . message } . Ensure C# LSP is properly configured and OmniSharp is available.` ) ;
99+ throw new Error (
100+ `LSP initialization failed: ${ lspError . message } . Ensure C# LSP is properly configured and OmniSharp is available.`
101+ ) ;
98102 }
99103 }
100104 const lsp = this . lsp ;
101105
102106 // Incremental detection based on size-mtime signature
103- const makeSig = ( abs ) => {
104- try { const st = fs . statSync ( abs ) ; return `${ st . size } -${ Math . floor ( st . mtimeMs ) } ` ; } catch { return '0-0' ; }
107+ const makeSig = abs => {
108+ try {
109+ const st = fs . statSync ( abs ) ;
110+ return `${ st . size } -${ Math . floor ( st . mtimeMs ) } ` ;
111+ } catch {
112+ return '0-0' ;
113+ }
105114 } ;
106115 const wanted = new Map ( files . map ( abs => [ this . toRel ( abs , info . projectRoot ) , makeSig ( abs ) ] ) ) ;
107116 const current = await this . index . getFiles ( ) ;
@@ -118,7 +127,15 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
118127 const kind = this . kindFromLsp ( s . kind ) ;
119128 const name = s . name || '' ;
120129 const start = s . range ?. start || s . selectionRange ?. start || { } ;
121- rows . push ( { path : rel , name, kind, container : container || null , ns : null , line : ( start . line ?? 0 ) + 1 , column : ( start . character ?? 0 ) + 1 } ) ;
130+ rows . push ( {
131+ path : rel ,
132+ name,
133+ kind,
134+ container : container || null ,
135+ ns : null ,
136+ line : ( start . line ?? 0 ) + 1 ,
137+ column : ( start . character ?? 0 ) + 1
138+ } ) ;
122139 if ( Array . isArray ( s . children ) ) for ( const c of s . children ) visit ( c , name || container ) ;
123140 } ;
124141 if ( Array . isArray ( symbols ) ) for ( const s of symbols ) visit ( s , null ) ;
@@ -131,19 +148,27 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
131148 // Update changed files
132149 const absList = changed . map ( rel => path . resolve ( info . projectRoot , rel ) ) ;
133150 const concurrency = Math . max ( 1 , Math . min ( 64 , Number ( params ?. concurrency ?? 8 ) ) ) ;
134- const reportEvery = Math . max ( 1 , Number ( params ?. reportEvery ?? 100 ) ) ;
151+ const reportPercentage = Math . max ( 1 , Math . min ( 100 , Number ( params ?. reportPercentage ?? 10 ) ) ) ;
135152 const startAt = Date . now ( ) ;
136- let i = 0 ; let updated = 0 ; let processed = 0 ;
153+ let i = 0 ;
154+ let updated = 0 ;
155+ let processed = 0 ;
156+ let lastReportedPercentage = 0 ;
137157
138158 // Initialize progress
139159 job . progress . total = absList . length ;
140160 job . progress . processed = 0 ;
141161 job . progress . rate = 0 ;
142162
143- logger . info ( `[index][${ job . id } ] Build started: ${ absList . length } files to process, ${ removed . length } to remove (status: ${ job . status } )` ) ;
163+ logger . info (
164+ `[index][${ job . id } ] Build started: ${ absList . length } files to process, ${ removed . length } to remove (status: ${ job . status } )`
165+ ) ;
144166
145167 // LSP request with small retry/backoff
146- const requestWithRetry = async ( uri , maxRetries = Math . max ( 0 , Math . min ( 5 , Number ( params ?. retry ?? 2 ) ) ) ) => {
168+ const requestWithRetry = async (
169+ uri ,
170+ maxRetries = Math . max ( 0 , Math . min ( 5 , Number ( params ?. retry ?? 2 ) ) )
171+ ) => {
147172 let lastErr = null ;
148173 for ( let attempt = 0 ; attempt <= maxRetries ; attempt ++ ) {
149174 try {
@@ -180,17 +205,26 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
180205 // Log occasionally to avoid spam
181206 logger . warn ( `[index][${ job . id } ] Skipped file due to error: ${ rel } - ${ err . message } ` ) ;
182207 }
183- }
184- finally {
208+ } finally {
185209 processed += 1 ;
186210
187211 // Update job progress
188212 const elapsed = Math . max ( 1 , Date . now ( ) - startAt ) ;
189213 job . progress . processed = processed ;
190- job . progress . rate = parseFloat ( ( processed * 1000 / elapsed ) . toFixed ( 1 ) ) ;
214+ job . progress . rate = parseFloat ( ( ( processed * 1000 ) / elapsed ) . toFixed ( 1 ) ) ;
191215
192- if ( processed % reportEvery === 0 || processed === absList . length ) {
193- logger . info ( `[index][${ job . id } ] progress ${ processed } /${ absList . length } (removed:${ removed . length } ) rate:${ job . progress . rate } f/s (status: ${ job . status } )` ) ;
216+ // Calculate current percentage
217+ const currentPercentage = Math . floor ( ( processed / absList . length ) * 100 ) ;
218+
219+ // Log when percentage increases by reportPercentage (default: 10%)
220+ if (
221+ currentPercentage >= lastReportedPercentage + reportPercentage ||
222+ processed === absList . length
223+ ) {
224+ logger . info (
225+ `[index][${ job . id } ] progress ${ currentPercentage } % (${ processed } /${ absList . length } ) removed:${ removed . length } rate:${ job . progress . rate } f/s`
226+ ) ;
227+ lastReportedPercentage = currentPercentage ;
194228 }
195229
196230 if ( throttleMs > 0 ) {
@@ -216,7 +250,9 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
216250 lastIndexedAt : stats . lastIndexedAt
217251 } ;
218252
219- logger . info ( `[index][${ job . id } ] Build completed successfully: updated=${ result . updatedFiles } , removed=${ result . removedFiles } , total=${ result . totalIndexedSymbols } (status: completed)` ) ;
253+ logger . info (
254+ `[index][${ job . id } ] Build completed successfully: updated=${ result . updatedFiles } , removed=${ result . removedFiles } , total=${ result . totalIndexedSymbols } (status: completed)`
255+ ) ;
220256
221257 return result ;
222258 } catch ( e ) {
@@ -242,7 +278,10 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
242278 if ( ! fs . existsSync ( root ) ) return ;
243279 const st = fs . statSync ( root ) ;
244280 if ( st . isFile ( ) ) {
245- if ( root . endsWith ( '.cs' ) && ! seen . has ( root ) ) { files . push ( root ) ; seen . add ( root ) ; }
281+ if ( root . endsWith ( '.cs' ) && ! seen . has ( root ) ) {
282+ files . push ( root ) ;
283+ seen . add ( root ) ;
284+ }
246285 return ;
247286 }
248287 const entries = fs . readdirSync ( root , { withFileTypes : true } ) ;
@@ -261,13 +300,22 @@ export class CodeIndexBuildToolHandler extends BaseToolHandler {
261300
262301 kindFromLsp ( k ) {
263302 switch ( k ) {
264- case 5 : return 'class' ;
265- case 23 : return 'struct' ;
266- case 11 : return 'interface' ;
267- case 10 : return 'enum' ;
268- case 6 : return 'method' ;
269- case 7 : return 'property' ;
270- case 8 : return 'field' ;
271- case 3 : return 'namespace' ; }
303+ case 5 :
304+ return 'class' ;
305+ case 23 :
306+ return 'struct' ;
307+ case 11 :
308+ return 'interface' ;
309+ case 10 :
310+ return 'enum' ;
311+ case 6 :
312+ return 'method' ;
313+ case 7 :
314+ return 'property' ;
315+ case 8 :
316+ return 'field' ;
317+ case 3 :
318+ return 'namespace' ;
319+ }
272320 }
273321}
0 commit comments