MCPcopy
hub / github.com/codeaashu/claude-code / maybeTimeBasedMicrocompact

Function maybeTimeBasedMicrocompact

src/services/compact/microCompact.ts:446–530  ·  view source on GitHub ↗
(
  messages: Message[],
  querySource: QuerySource | undefined,
)

Source from the content-addressed store, hash-verified

444}
445
446function maybeTimeBasedMicrocompact(
447 messages: Message[],
448 querySource: QuerySource | undefined,
449): MicrocompactResult | null {
450 const trigger = evaluateTimeBasedTrigger(messages, querySource)
451 if (!trigger) {
452 return null
453 }
454 const { gapMinutes, config } = trigger
455
456 const compactableIds = collectCompactableToolIds(messages)
457
458 // Floor at 1: slice(-0) returns the full array (paradoxically keeps
459 // everything), and clearing ALL results leaves the model with zero working
460 // context. Neither degenerate is sensible — always keep at least the last.
461 const keepRecent = Math.max(1, config.keepRecent)
462 const keepSet = new Set(compactableIds.slice(-keepRecent))
463 const clearSet = new Set(compactableIds.filter(id => !keepSet.has(id)))
464
465 if (clearSet.size === 0) {
466 return null
467 }
468
469 let tokensSaved = 0
470 const result: Message[] = messages.map(message => {
471 if (message.type !== 'user' || !Array.isArray(message.message.content)) {
472 return message
473 }
474 let touched = false
475 const newContent = message.message.content.map(block => {
476 if (
477 block.type === 'tool_result' &&
478 clearSet.has(block.tool_use_id) &&
479 block.content !== TIME_BASED_MC_CLEARED_MESSAGE
480 ) {
481 tokensSaved += calculateToolResultTokens(block)
482 touched = true
483 return { ...block, content: TIME_BASED_MC_CLEARED_MESSAGE }
484 }
485 return block
486 })
487 if (!touched) return message
488 return {
489 ...message,
490 message: { ...message.message, content: newContent },
491 }
492 })
493
494 if (tokensSaved === 0) {
495 return null
496 }
497
498 logEvent('tengu_time_based_microcompact', {
499 gapMinutes: Math.round(gapMinutes),
500 gapThresholdMinutes: config.gapThresholdMinutes,
501 toolsCleared: clearSet.size,
502 toolsKept: keepSet.size,
503 keepRecent: config.keepRecent,

Callers 1

microcompactMessagesFunction · 0.85

Calls 11

evaluateTimeBasedTriggerFunction · 0.85
logEventFunction · 0.85
logForDebuggingFunction · 0.85
suppressCompactWarningFunction · 0.85
resetMicrocompactStateFunction · 0.85
featureFunction · 0.85
notifyCacheDeletionFunction · 0.85
maxMethod · 0.80
hasMethod · 0.45

Tested by

no test coverage detected