53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
"""Observe shared skill edits before accepting a new model run."""
|
|
|
|
import asyncio
|
|
import time
|
|
|
|
|
|
class SharedSkillRefresh:
|
|
def __init__(self):
|
|
self.lock = asyncio.Lock()
|
|
self.extensions = None
|
|
self.skills = None
|
|
self.checked_at = 0.0
|
|
|
|
@staticmethod
|
|
def extension_stamp():
|
|
from deerflow.config.extensions_config import ExtensionsConfig
|
|
|
|
path = ExtensionsConfig.resolve_config_path()
|
|
if path is None:
|
|
return None
|
|
stat = path.stat()
|
|
return (str(path), stat.st_mtime_ns, stat.st_size)
|
|
|
|
@staticmethod
|
|
def skill_stamp():
|
|
from pathlib import Path
|
|
|
|
from deerflow.skills.storage import get_or_new_skill_storage
|
|
|
|
root = Path(get_or_new_skill_storage().get_skills_root_path())
|
|
stamps = []
|
|
for category in ("public", "custom"):
|
|
for path in (root / category).rglob("*"):
|
|
if path.suffix in {".md", ".py"} and path.is_file():
|
|
stat = path.stat()
|
|
stamps.append((str(path), stat.st_mtime_ns, stat.st_size))
|
|
return tuple(sorted(stamps))
|
|
|
|
async def check(self):
|
|
async with self.lock:
|
|
extension = await asyncio.to_thread(self.extension_stamp)
|
|
skills = self.skills
|
|
if time.monotonic() - self.checked_at >= 5:
|
|
skills = await asyncio.to_thread(self.skill_stamp)
|
|
self.checked_at = time.monotonic()
|
|
if extension != self.extensions or skills != self.skills:
|
|
from deerflow.agents.lead_agent.prompt import refresh_skills_system_prompt_cache_async
|
|
from deerflow.config.extensions_config import reload_extensions_config
|
|
|
|
await asyncio.to_thread(reload_extensions_config)
|
|
await refresh_skills_system_prompt_cache_async()
|
|
self.extensions, self.skills = extension, skills
|