MindOS_CLI/mindcli/_vendor/tools/_user_config.py
lidf 69dd868e2f init: MindOS CLI 本地执行体(从 mindOSv2/mindos-cli 独立)
- 独立 pyproject.toml(pip install -e .)
- vendor_hermes.sh 已改为显式路径模式(不再依赖相对目录)
- 包含 hermes vendor 快照
2026-04-28 13:12:54 +08:00

60 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
用户配置存取per-userId基于 wiki 物理目录)
所有连接器凭据通过 user_config_read / user_config_write 进行读写,
存储路径:{MINDOS_WIKI_DIR}/{userId}/.config/{connector}.json
设计原则:
- 与 wiki/{userId}/ 物理目录隔离模式一致
- .config/ 前缀防止 Agent 的 search_files 扫到凭据
- 一个用户一个目录,导出/删除用户数据只需操作 wiki/{userId}/
"""
import json
import logging
import os
from pathlib import Path
from typing import Any, Dict
logger = logging.getLogger(__name__)
def _wiki_root() -> Path:
"""返回知识花园根目录"""
return Path(os.getenv("MINDOS_WIKI_DIR", os.path.expanduser("~/.hermes/wiki")))
def user_config_path(user_id: str, connector: str) -> Path:
"""返回 wiki/{userId}/.config/{connector}.json 的路径"""
return _wiki_root() / user_id / ".config" / f"{connector}.json"
def user_config_read(user_id: str, connector: str) -> Dict[str, Any]:
"""读取指定用户的连接器配置,不存在返回空 dict"""
p = user_config_path(user_id, connector)
try:
if p.exists():
return json.loads(p.read_text(encoding="utf-8"))
except Exception as e:
logger.warning("[UserConfig] read failed %s/%s: %s", user_id[:8], connector, e)
return {}
def user_config_write(user_id: str, connector: str, data: Dict[str, Any]) -> None:
"""写入指定用户的连接器配置,自动创建目录"""
p = user_config_path(user_id, connector)
try:
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
except Exception as e:
logger.warning("[UserConfig] write failed %s/%s: %s", user_id[:8], connector, e)
def user_config_delete(user_id: str, connector: str) -> None:
"""删除指定用户的连接器配置"""
p = user_config_path(user_id, connector)
try:
p.unlink(missing_ok=True)
except Exception as e:
logger.warning("[UserConfig] delete failed %s/%s: %s", user_id[:8], connector, e)