| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /**
- * Session cache clearing utilities.
- * This module is imported at startup by main.tsx, so keep imports minimal.
- */
- import { feature } from 'bun:bundle'
- import {
- clearInvokedSkills,
- setLastEmittedDate,
- } from '../../bootstrap/state.js'
- import { clearCommandsCache } from '../../commands.js'
- import { getSessionStartDate } from '../../constants/common.js'
- import {
- getGitStatus,
- getSystemContext,
- getUserContext,
- setSystemPromptInjection,
- } from '../../context.js'
- import { clearFileSuggestionCaches } from '../../hooks/fileSuggestions.js'
- import { clearAllPendingCallbacks } from '../../hooks/useSwarmPermissionPoller.js'
- import { clearAllDumpState } from '../../services/api/dumpPrompts.js'
- import { resetPromptCacheBreakDetection } from '../../services/api/promptCacheBreakDetection.js'
- import { clearAllSessions } from '../../services/api/sessionIngress.js'
- import { runPostCompactCleanup } from '../../services/compact/postCompactCleanup.js'
- import { resetAllLSPDiagnosticState } from '../../services/lsp/LSPDiagnosticRegistry.js'
- import { clearTrackedMagicDocs } from '../../services/MagicDocs/magicDocs.js'
- import { clearDynamicSkills } from '../../skills/loadSkillsDir.js'
- import { resetSentSkillNames } from '../../utils/attachments.js'
- import { clearCommandPrefixCaches } from '../../utils/bash/commands.js'
- import { resetGetMemoryFilesCache } from '../../utils/claudemd.js'
- import { clearRepositoryCaches } from '../../utils/detectRepository.js'
- import { clearResolveGitDirCache } from '../../utils/git/gitFilesystem.js'
- import { clearStoredImagePaths } from '../../utils/imageStore.js'
- import { clearSessionEnvVars } from '../../utils/sessionEnvVars.js'
- /**
- * Clear all session-related caches.
- * Call this when resuming a session to ensure fresh file/skill discovery.
- * This is a subset of what clearConversation does - it only clears caches
- * without affecting messages, session ID, or triggering hooks.
- *
- * @param preservedAgentIds - Agent IDs whose per-agent state should survive
- * the clear (e.g., background tasks preserved across /clear). When non-empty,
- * agentId-keyed state (invoked skills) is selectively cleared and requestId-keyed
- * state (pending permission callbacks, dump state, cache-break tracking) is left
- * intact since it cannot be safely scoped to the main session.
- */
- export function clearSessionCaches(
- preservedAgentIds: ReadonlySet<string> = new Set(),
- ): void {
- const hasPreserved = preservedAgentIds.size > 0
- // Clear context caches
- getUserContext.cache.clear?.()
- getSystemContext.cache.clear?.()
- getGitStatus.cache.clear?.()
- getSessionStartDate.cache.clear?.()
- // Clear file suggestion caches (for @ mentions)
- clearFileSuggestionCaches()
- // Clear commands/skills cache
- clearCommandsCache()
- // Clear prompt cache break detection state
- if (!hasPreserved) resetPromptCacheBreakDetection()
- // Clear system prompt injection (cache breaker)
- setSystemPromptInjection(null)
- // Clear last emitted date so it's re-detected on next turn
- setLastEmittedDate(null)
- // Run post-compaction cleanup (clears system prompt sections, microcompact tracking,
- // classifier approvals, speculative checks, and — for main-thread compacts — memory
- // files cache with load_reason 'compact').
- runPostCompactCleanup()
- // Reset sent skill names so the skill listing is re-sent after /clear.
- // runPostCompactCleanup intentionally does NOT reset this (post-compact
- // re-injection costs ~4K tokens), but /clear wipes messages entirely so
- // the model needs the full listing again.
- resetSentSkillNames()
- // Override the memory cache reset with 'session_start': clearSessionCaches is called
- // from /clear and --resume/--continue, which are NOT compaction events. Without this,
- // the InstructionsLoaded hook would fire with load_reason 'compact' instead of
- // 'session_start' on the next getMemoryFiles() call.
- resetGetMemoryFilesCache('session_start')
- // Clear stored image paths cache
- clearStoredImagePaths()
- // Clear all session ingress caches (lastUuidMap, sequentialAppendBySession)
- clearAllSessions()
- // Clear swarm permission pending callbacks
- if (!hasPreserved) clearAllPendingCallbacks()
- // Clear tungsten session usage tracking
- if (process.env.USER_TYPE === 'ant') {
- void import('../../tools/TungstenTool/TungstenTool.js').then(
- ({ clearSessionsWithTungstenUsage, resetInitializationState }) => {
- clearSessionsWithTungstenUsage()
- resetInitializationState()
- },
- )
- }
- // Clear attribution caches (file content cache, pending bash states)
- // Dynamic import to preserve dead code elimination for COMMIT_ATTRIBUTION feature flag
- if (feature('COMMIT_ATTRIBUTION')) {
- void import('../../utils/attributionHooks.js').then(
- ({ clearAttributionCaches }) => clearAttributionCaches(),
- )
- }
- // Clear repository detection caches
- clearRepositoryCaches()
- // Clear bash command prefix caches (Haiku-extracted prefixes)
- clearCommandPrefixCaches()
- // Clear dump prompts state
- if (!hasPreserved) clearAllDumpState()
- // Clear invoked skills cache (each entry holds full skill file content)
- clearInvokedSkills(preservedAgentIds)
- // Clear git dir resolution cache
- clearResolveGitDirCache()
- // Clear dynamic skills (loaded from skill directories)
- clearDynamicSkills()
- // Clear LSP diagnostic tracking state
- resetAllLSPDiagnosticState()
- // Clear tracked magic docs
- clearTrackedMagicDocs()
- // Clear session environment variables
- clearSessionEnvVars()
- // Clear WebFetch URL cache (up to 50MB of cached page content)
- void import('../../tools/WebFetchTool/utils.js').then(
- ({ clearWebFetchCache }) => clearWebFetchCache(),
- )
- // Clear ToolSearch description cache (full tool prompts, ~500KB for 50 MCP tools)
- void import('../../tools/ToolSearchTool/ToolSearchTool.js').then(
- ({ clearToolSearchDescriptionCache }) => clearToolSearchDescriptionCache(),
- )
- // Clear agent definitions cache (accumulates per-cwd via EnterWorktreeTool)
- void import('../../tools/AgentTool/loadAgentsDir.js').then(
- ({ clearAgentDefinitionsCache }) => clearAgentDefinitionsCache(),
- )
- // Clear SkillTool prompt cache (accumulates per project root)
- void import('../../tools/SkillTool/prompt.js').then(({ clearPromptCache }) =>
- clearPromptCache(),
- )
- }
|