Implement workspace-scoped conversation storage with legacy migration based on host workspace metadata, active host workspace state protection, and frontend/backend conversation list scoping. Add proactive recent-conversation prompt support with a configurable personal-space limit, frozen per conversation metadata, empty-conversation filtering, and a dedicated prompt template. Add conversation_search and conversation_review tools with readable formatted results, workspace-only access, current-conversation exclusion, multi-keyword search, list mode, message/tool counts, read/save review modes, long-review fallback to .agents/review, and frontend detail renderers. Move internal workspace artifacts under .agents, update upload/skills/compact/review paths, show .agents internal directories in prompt file trees, and adjust versioning ignores. Add create_skill and a Skills tool category, move read_skill into that category, validate and archive skill folders, support host global skills and Docker/API private skills, and sync private skills into .agents/skills and prompts. Update memory stamping with conversation/time source metadata and include frontend icon/status/display updates plus tests for workspace conversation storage and skills management.
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)
|