# center_std **Repository Path**: ghosthuge/center_std ## Basic Information - **Project Name**: center_std - **Description**: 基于center与uphost整合后,调整了框架设计,转为作为一个mcp服务,组合到weknora中。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-19 - **Last Updated**: 2026-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gift development — center 「天赋开发」系统的中心机:纯 C++17、无 Qt 的单二进制服务(树莓派 / Linux)。 承担 Android 客户端与 AI 引擎之间的服务总线:TLS 协议网关、AUTH、任务调度、 MCP 工具服务(供 Agent 调用记忆/任务/技能/目标能力)。 ``` Android ──TLSv1.2:10000──▶ center_std ──SSE──▶ 兼容 OpenAI 的 LLM 服务 │ ├─ MCP :8765 (22+ 工具) ├─ task_scheduler (daily/weekly/monthly/once) └─ 长期记忆仓(独立 git,每次写 = 一次 commit,可审计) ``` ## 依赖 全部来自系统包(apt)。明细、版本与**许可**见 [THIRD-PARTY.md](THIRD-PARTY.md)。 ``` libssl-dev · nlohmann-json3-dev · libcpp-httplib-dev · libsqlite3-dev libprotobuf-dev · protobuf-compiler · cmake · g++ (C++17) ``` ```bash sudo apt install -y libssl-dev nlohmann-json3-dev libcpp-httplib-dev libsqlite3-dev \ libprotobuf-dev protobuf-compiler cmake g++ ``` ## 构建 ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc) ctest --test-dir build ``` ## 部署 **所有与本机环境相关的东西都放 `local/`,该目录不入库**(`.gitignore` 里 `/local/*`,只留一个 `.gitkeep` 占位)。仓库里因此没有任何密钥、证书、内网地址。 ```bash mkdir -p local cp config.example.json local/config.json # 填入自己的值 openssl rand -hex 32 # 生成 protocol_psk / mcp_token # 自签 TLS 证书(客户端按 SPKI SHA-256 指纹固定,见 Android 侧 CERT_SPKI_SHA256) openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \ -keyout local/server.key -out local/server.crt \ -subj "/CN=giftdev-center" \ -addext "subjectAltName=IP:<你的服务器IP>,DNS:localhost" chmod 600 local/server.key local/config.json openssl x509 -in local/server.crt -noout -pubkey \ | openssl pkey -pubin -outform der | openssl dgst -sha256 # 客户端要填的指纹 ./run.sh start # start|stop|restart|status|log;默认读 local/config.json ``` `local/` 里建议放的东西(都不入库): | 文件 | 说明 | |---|---| | `config.json` | 主配置:PSK / MCP token / 数据库与数据目录 / 模型通道(`llm_*`)| | `server.crt` / `server.key` | TLS 自签证书与私钥(`chmod 600`) | | 其他 | 任何只属于这台机器的脚本、docker 覆盖文件、备注 | ### 跑起来之后怎么确认 ```bash ./run.sh status # 进程在不在,10000(TLS)/ 8765(MCP)在不在听 ./run.sh log # 当天日志;注意 restart 用 `>` 截断当天日志,重启前先看 ctest --test-dir build # 单测 ``` Android 侧连上后,服务端日志会出现 `客户端接入` → `[Auth] 认证请求 … 结果=通过` → `认证通过,门禁解除`,之后每 20s 一次心跳认证。 ### 最小可跑:**必须先有一个模型通道** 🔴 **没有模型通道时进程不启动**:`llm_enabled=false` 会让 center **直接拒绝启动** (B0 fail-closed,退出码 2)—— WeKnora 备用通道已于 2026-09-27 退场, `llm_enabled=false` 不再意味着"换个通道",而是**一条通道都没有**, 对话 / coach 主动消息 / 任务执行 / 评估 / 对话提炼会全链路一起失效。 判据在代码里:`src/main.cpp` 的 B0 段(`if (!gwCfg.llm_enabled) … return 2;`)。 目标、任务、日程、成就这些靠**本地逻辑 + 事件溯源**的功能本身不依赖模型, 但要跑起来就得先配一条模型通道:`llm_enabled=true` + `llm_base_url` + `llm_api_key_file` + `llm_model`。 ### 接 AI(必配:不配起不来) center 通过 SSE 调**兼容 OpenAI 风格**的模型服务(`llm_base_url`,走 `/chat/completions`), 同时把自己的 MCP 工具(记忆/任务/技能/目标)暴露给外部 Agent 反向调用(实现见 `src/ai/`)。 相关配置:`llm_enabled` / `llm_base_url` / `llm_api_key_file` / `llm_model` (另有 `llm_max_tokens` / `llm_temperature` / `llm_enable_thinking` / `llm_models`)。 🔴 `weknora_base_url` / `_api_key` / `_agent_id` / `_knowledge_base_id` / `_web_search_enabled` / `_skills_dir` 这六个键**已删除**(WeKnora 通道 2026-09-27 退场,代码不再读;见 `config.example.json` 的 `//weknora` 说明)。 ### 数据都在哪 | 内容 | 默认位置 | |---|---| | SQLite、日志 | `${HOME}/bigwork-data/runtime/`(日志按天轮转,保留 7 天) | | 任务 / 日程状态 | `${HOME}/bigwork-data/state/` | | 长期记忆 | 一个**独立 git 仓**(`memory_repo_path`),每次写入 = 一次 commit,可审计 | 换位置改 `data_dir` 等字段,或用环境变量 `GIFTD_DATA_DIR` 整个覆盖。 ## 密钥与安全约定 - **代码里没有任何默认凭据**。`protocol_psk` 缺失时进程**拒绝启动**(fail-closed), 而不是退回到一个内置值 —— 空 PSK 会让 AUTH 形同虚设,而日志里看不出来。 - 环境变量可覆盖配置:`GIFTDEV_PSK`(PSK)、`MCP_TOKEN`、 `GIFTD_DATA_DIR` / `GIFTD_MEMORY_REPO` / `GIFTD_SKILLS_DIR`(路径)。 路径类变量的**统一取法**在 `src/util/env_path.h`。 - 协议:TLV 帧 + AUTH(HMAC-SHA256(PSK, `device:ts`),30s 窗口防重放)+ TLSv1.2 自签名。 - 协议实现见 `src/protocol/protocol.h`;AUTH 校验见 `src/auth/auth_verifier.*`。 ## 目录 ``` src/ logic/ 状态机(按 CMD 分发:ai/auth/session/tasks/goals/schedule/...) service/ task_scheduler / dialogue_rollup / daily_task_engine(每日一件)/ domain_store / tag_induction(周复盘标签归纳)/ plan_engine ai/ SseClient(SSE 流式) + SessionApi(上游 REST) mcp/ MCP :8765 工具实现 util/ env_path(路径) / prompt_store(热更新 md) / logger / data_prefetch device/ 设备管理与控制 tools/ ai_probe.py / probe2.py(本地链路探测,PSK 从本地配置读) ``` ## 测试 ```bash ctest --test-dir build ``` TLS 单测需要证书:默认在 `local/` 找,或用 `CENTER_CERT_DIR` 指定目录。 ## 哪些是自研、哪些是上游 | 部分 | 归属 | |---|---| | **center(本仓)** | 自研:私有协议 / AUTH / 状态机 / 调度 / MCP 工具,MIT | | Android 端([gift-development-android](https://gitee.com/ghosthuge/android-big-work)) | 自研,MIT | | WeKnora(Agent + 知识库) | **上游第三方**:[Tencent/WeKnora](https://github.com/Tencent/WeKnora)(MIT)。我们只用它的一个副本仓,为接 center 做了少量定制,`FORK.md` 里列了改了什么 | | 依赖库(OpenSSL / cpp-httplib / nlohmann-json / SQLite / protobuf / FSRS 等) | 第三方,逐项见 [THIRD-PARTY.md](THIRD-PARTY.md) | 本仓**不含** Android 端代码,也**不含** WeKnora 的代码;WeKnora 是可选的, 可以换成任何兼容 OpenAI 风格的服务。 ## 许可证 [MIT](LICENSE)。第三方依赖与算法出处见 [THIRD-PARTY.md](THIRD-PARTY.md)。