Refactor conversation persistence into workspace-scoped storage with host workspace legacy migration, current workspace filtering, and active host workspace state protection. Add proactive recent-conversation prompt injection with personal-space controls, configurable item count, empty-conversation filtering, and frozen per-conversation prompt metadata to keep request caches stable. Introduce conversation_search and conversation_review tools for current-workspace history: multi-keyword search, list mode, current conversation exclusion, message/tool counts, formatted model output, read/save review modes, long-review fallback, and .agents/review storage. Move internal workspace artifacts under .agents, including uploads, skills, compact results, and reviews; update prompt file-tree visibility, compression output, upload paths, and hidden versioning exclusions. Add create_skill workflow and a Skills tool category, move read_skill into Skills, validate/归档 skill folders, support host global skills and Docker/API private skills, and sync private skills into .agents/skills and skill prompts. Update frontend tool icons, statuses, and expanded renderers for conversation recall and skills workflows; add workspace conversation and skills-manager tests.
37 lines
1009 B
Python
37 lines
1009 B
Python
"""宿主机工作区切换调试日志(JSON Lines)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
import threading
|
||
from datetime import datetime
|
||
from pathlib import Path
|
||
from typing import Any
|
||
|
||
from config import LOGS_DIR
|
||
|
||
_LOG_FILE = Path(LOGS_DIR).expanduser().resolve() / "host_workspace_debug.log"
|
||
_LOCK = threading.Lock()
|
||
|
||
|
||
def write_host_workspace_debug(event: str, **payload: Any) -> None:
|
||
"""写入一条宿主机工作区调试日志。"""
|
||
try:
|
||
record = {
|
||
"ts": datetime.now().isoformat(),
|
||
"event": event,
|
||
**payload,
|
||
}
|
||
line = json.dumps(record, ensure_ascii=False, default=str)
|
||
with _LOCK:
|
||
_LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||
with _LOG_FILE.open("a", encoding="utf-8") as fp:
|
||
fp.write(line + "\n")
|
||
except Exception:
|
||
# 调试日志不应影响主流程
|
||
return
|
||
|
||
|
||
def get_host_workspace_debug_log_path() -> str:
|
||
return str(_LOG_FILE)
|