feat: add tool-level file cache with LRU eviction and mtime invalidation
Introduces FileCache (OrderedDict LRU, st_mtime_ns validation) to avoid redundant disk reads and duplicate content in conversation context. Read tools return a short "[Cached]" message on cache hit instead of resending unchanged file content, saving tokens. Write/edit/delete tools invalidate affected paths; str_replace pre-warms the cache after edits. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any
|
||||
|
||||
from app.models.config import AppConfig
|
||||
from app.tools.base import BaseTool
|
||||
from app.utils.file_cache import FileCache
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from app.services.skills import SkillsManager
|
||||
@@ -89,6 +90,7 @@ def create_default_registry(
|
||||
config: AppConfig,
|
||||
skills_manager: SkillsManager | None = None,
|
||||
skill_runner: object | None = None,
|
||||
file_cache: FileCache | None = None,
|
||||
) -> ToolRegistry:
|
||||
"""Create a ToolRegistry populated with all built-in tools.
|
||||
|
||||
@@ -97,6 +99,7 @@ def create_default_registry(
|
||||
config: Application configuration.
|
||||
skills_manager: Optional skills manager for skill tools.
|
||||
skill_runner: Optional SkillRunner for package skill activation.
|
||||
file_cache: Optional file cache shared across file-reading tools.
|
||||
"""
|
||||
# Read tools
|
||||
from app.tools.filesystem import ListDirTool, ReadFileTool, ReadManyFilesTool
|
||||
@@ -119,8 +122,8 @@ def create_default_registry(
|
||||
registry = ToolRegistry()
|
||||
|
||||
# Read
|
||||
registry.register(ReadFileTool(workspace_root, config))
|
||||
registry.register(ReadManyFilesTool(workspace_root, config))
|
||||
registry.register(ReadFileTool(workspace_root, config, file_cache=file_cache))
|
||||
registry.register(ReadManyFilesTool(workspace_root, config, file_cache=file_cache))
|
||||
registry.register(ListDirTool(workspace_root, config))
|
||||
|
||||
# Search
|
||||
@@ -128,13 +131,13 @@ def create_default_registry(
|
||||
registry.register(FindFilesTool(workspace_root, config))
|
||||
|
||||
# Write
|
||||
registry.register(WriteFileTool(workspace_root, config))
|
||||
registry.register(WriteFileTool(workspace_root, config, file_cache=file_cache))
|
||||
registry.register(MakeDirTool(workspace_root, config))
|
||||
registry.register(DeleteFileTool(workspace_root, config))
|
||||
registry.register(DeleteFileTool(workspace_root, config, file_cache=file_cache))
|
||||
|
||||
# Edit
|
||||
registry.register(StrReplaceTool(workspace_root, config))
|
||||
registry.register(PatchApplyTool(workspace_root, config))
|
||||
registry.register(StrReplaceTool(workspace_root, config, file_cache=file_cache))
|
||||
registry.register(PatchApplyTool(workspace_root, config, file_cache=file_cache))
|
||||
|
||||
# Shell
|
||||
registry.register(RunCommandTool(workspace_root, config))
|
||||
|
||||
Reference in New Issue
Block a user