@@ -6,6 +6,8 @@ import { logger } from '../logger';
66import type { DeepSeekMessage , DeepSeekRequest , DeepSeekTool , DeepSeekUsage } from '../types' ;
77import { REPLAY_MARKER_MIME , parseFirstReplayMarker } from './replay' ;
88import type { ConversationSegment } from './segment' ;
9+ import { ACTIVATE_TOOL_PREFIX } from './tools/consts' ;
10+ import type { ActivatePreflightInspection } from './tools/preflight' ;
911import { IMAGE_DESCRIPTION_UNAVAILABLE } from './vision/consts' ;
1012import type { VisionResolutionStats as VisionPipelineStats } from './vision/index' ;
1113
@@ -223,6 +225,57 @@ export function createCacheDiagnosticsRecorder(): CacheDiagnosticsRecorder {
223225 return new DefaultCacheDiagnosticsRecorder ( ) ;
224226}
225227
228+ export function logToolFlowDiagnostics ( {
229+ tools,
230+ messagesFiltered,
231+ preflight,
232+ activatePreflight,
233+ nextRound,
234+ initialResponseNotice,
235+ } : {
236+ tools : readonly vscode . LanguageModelChatTool [ ] | undefined ;
237+ messagesFiltered : boolean ;
238+ preflight : 'skipped' | 'handled' | 'ready' | 'round-limit' ;
239+ activatePreflight ?: ActivatePreflightInspection ;
240+ nextRound ?: number ;
241+ initialResponseNotice ?: boolean ;
242+ } ) : void {
243+ if ( ! getDebugLoggingEnabled ( ) ) {
244+ return ;
245+ }
246+
247+ const activateToolCount =
248+ tools ?. reduce (
249+ ( count , tool ) => count + ( tool . name . startsWith ( ACTIVATE_TOOL_PREFIX ) ? 1 : 0 ) ,
250+ 0 ,
251+ ) ?? 0 ;
252+ if ( preflight === 'skipped' && ! messagesFiltered && activateToolCount === 0 ) {
253+ return ;
254+ }
255+
256+ let message =
257+ `[tool-flow] preflight=${ preflight } ` +
258+ ` tools=${ tools ?. length ?? 0 } ` +
259+ ` activateTools=${ activateToolCount } ` ;
260+ if ( messagesFiltered ) {
261+ message += ` messagesFiltered=true` ;
262+ }
263+ if ( activatePreflight ) {
264+ message +=
265+ ` preflightRounds=${ activatePreflight . rounds } ` +
266+ ` calledActivators=${ activatePreflight . calledActivatorNames . length } ` +
267+ ` remainingActivators=${ activatePreflight . remainingActivatorNames . length } ` ;
268+ }
269+ if ( nextRound !== undefined ) {
270+ message += ` nextRound=${ nextRound } ` ;
271+ }
272+ if ( initialResponseNotice ) {
273+ message += ` initialResponseNotice=true` ;
274+ }
275+
276+ logger . info ( message ) ;
277+ }
278+
226279interface VisionMessageStats {
227280 inputImageParts : number ;
228281 inputImageMessages : number ;
@@ -288,7 +341,6 @@ class DefaultCacheDiagnosticsRecorder implements CacheDiagnosticsRecorder {
288341 ` thinking=${ options . isThinkingModel } ` +
289342 ` thinkingEffort=${ options . thinkingEffort } ` +
290343 ` maxTokens=${ options . maxTokens ?? 'api-default' } ` +
291- ` replayMarker=message-local` +
292344 ` inputMessages=${ options . inputMessages . length } ` +
293345 ` deepseekMessages=${ options . request . messages . length } ` ,
294346 ) ;
@@ -298,10 +350,15 @@ class DefaultCacheDiagnosticsRecorder implements CacheDiagnosticsRecorder {
298350 }
299351 const vscodeMessageTrace = formatVscodeMessageTrace ( options . inputMessages ) ;
300352 if ( vscodeMessageTrace ) {
301- logger . info ( `[cache-trace #${ requestId } ] vscodeMsgs ${ vscodeMessageTrace } ` ) ;
353+ logger . debug ( `[cache-trace #${ requestId } ] vscodeMsgs ${ vscodeMessageTrace } ` ) ;
302354 }
303355 for ( const detailLine of formatCacheTraceDetailLines ( cacheTrace ) ) {
304- logger . info ( `[cache-trace #${ requestId } ] ${ detailLine } ` ) ;
356+ const message = `[cache-trace #${ requestId } ] ${ detailLine } ` ;
357+ if ( detailLine . startsWith ( 'contentMarkers ' ) ) {
358+ logger . debug ( message ) ;
359+ } else {
360+ logger . info ( message ) ;
361+ }
305362 }
306363 const visionTrace = formatVisionTrace ( visionResolution , options . visionStats ) ;
307364 if ( visionTrace ) {
0 commit comments