feat(skills): 工作区技能自动同步
- 根据个性化配置自动同步启用的技能到工作区 - 避免每次请求重复全量拷贝
This commit is contained in:
parent
3a9b5388f9
commit
7dece2e722
@ -8,6 +8,7 @@ from core.web_terminal import WebTerminal
|
|||||||
from modules.gui_file_manager import GuiFileManager
|
from modules.gui_file_manager import GuiFileManager
|
||||||
from modules.upload_security import UploadQuarantineManager, UploadSecurityError
|
from modules.upload_security import UploadQuarantineManager, UploadSecurityError
|
||||||
from modules.personalization_manager import load_personalization_config
|
from modules.personalization_manager import load_personalization_config
|
||||||
|
from modules.skills_manager import sync_workspace_skills
|
||||||
import json
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from modules.usage_tracker import UsageTracker
|
from modules.usage_tracker import UsageTracker
|
||||||
@ -48,6 +49,32 @@ def _make_terminal_key(username: str, workspace_id: Optional[str] = None) -> str
|
|||||||
return f"{username}::{workspace_id}" if workspace_id else username
|
return f"{username}::{workspace_id}" if workspace_id else username
|
||||||
|
|
||||||
|
|
||||||
|
def _ensure_workspace_skills_synced(terminal: WebTerminal, workspace) -> None:
|
||||||
|
"""
|
||||||
|
确保工作区 skills 已按当前个性化配置完成同步。
|
||||||
|
使用终端实例上的路径标记避免每次请求都重复全量拷贝。
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
project_path = str(Path(workspace.project_path).resolve())
|
||||||
|
except Exception:
|
||||||
|
project_path = str(workspace.project_path)
|
||||||
|
|
||||||
|
if getattr(terminal, "_skills_synced_project_path", None) == project_path:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
config = load_personalization_config(workspace.data_dir)
|
||||||
|
enabled_skills = config.get("enabled_skills") if isinstance(config, dict) else None
|
||||||
|
result = sync_workspace_skills(workspace.project_path, enabled_skills)
|
||||||
|
if not result.get("success"):
|
||||||
|
debug_log(f"[Skills] 工作区同步失败: {result.get('error')}")
|
||||||
|
return
|
||||||
|
terminal._skills_synced_project_path = project_path
|
||||||
|
debug_log(f"[Skills] 工作区技能已同步: {project_path} ({result.get('copied', 0)} 项)")
|
||||||
|
except Exception as exc:
|
||||||
|
debug_log(f"[Skills] 工作区同步异常: {exc}")
|
||||||
|
|
||||||
|
|
||||||
def get_user_resources(username: Optional[str] = None, workspace_id: Optional[str] = None) -> Tuple[Optional[WebTerminal], Optional['modules.user_manager.UserWorkspace']]:
|
def get_user_resources(username: Optional[str] = None, workspace_id: Optional[str] = None) -> Tuple[Optional[WebTerminal], Optional['modules.user_manager.UserWorkspace']]:
|
||||||
from modules.user_manager import UserWorkspace
|
from modules.user_manager import UserWorkspace
|
||||||
username = (username or get_current_username())
|
username = (username or get_current_username())
|
||||||
@ -122,6 +149,7 @@ def get_user_resources(username: Optional[str] = None, workspace_id: Optional[st
|
|||||||
terminal.user_role = "admin"
|
terminal.user_role = "admin"
|
||||||
if has_request_context():
|
if has_request_context():
|
||||||
session['workspace_id'] = getattr(workspace, "workspace_id", None)
|
session['workspace_id'] = getattr(workspace, "workspace_id", None)
|
||||||
|
_ensure_workspace_skills_synced(terminal, workspace)
|
||||||
return terminal, workspace
|
return terminal, workspace
|
||||||
|
|
||||||
is_api_user = bool(session.get("is_api_user")) if has_request_context() else False
|
is_api_user = bool(session.get("is_api_user")) if has_request_context() else False
|
||||||
@ -229,6 +257,8 @@ def get_user_resources(username: Optional[str] = None, workspace_id: Optional[st
|
|||||||
continue
|
continue
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
debug_log(f"[admin_policy] 应用失败: {exc}")
|
debug_log(f"[admin_policy] 应用失败: {exc}")
|
||||||
|
|
||||||
|
_ensure_workspace_skills_synced(terminal, workspace)
|
||||||
return terminal, workspace
|
return terminal, workspace
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user