v0.16.0: 后台体验升级——i18n(默认英文)/浅深主题/字号放大/关站维护页/个人设置(头像·语言·主题·密码·MCP Token)/权限管理(菜单+MCP·API)/询盘抽屉翻倍+PHP序列化数据清洗(22.7万行)+去裸JSON

This commit is contained in:
bigcode
2026-11-05 01:46:00 +08:00
parent c3df5d9db1
commit a018019504
47 changed files with 3008 additions and 830 deletions
+16 -1
View File
@@ -10,6 +10,7 @@
*/
import { SQL } from "bun";
import { parseImageSize } from "../src/server/image-size";
import pkg from "../package.json";
/** # 成员变量 数据库连接(与站点同库;单连接足够 MCP 串行调用) **/
const sql = new SQL(process.env.DATABASE_URL || "postgres://dusuniot:dusuniot@127.0.0.1:25432/dusuniot", { max: 2 });
@@ -451,6 +452,20 @@ function send(msg: Record<string, unknown>) {
/** # 类型 已初始化标记(initialize 之前拒绝 tools/* 调用) **/
let initialized = false;
// ---- 访问令牌校验(v0.16.0)----
// 设置环境变量 DUSUN_MCP_TOKEN 后启动即进入令牌模式:值必须命中某后台角色用户的
// users.mcp_token(个人设置页生成),且该角色在 权限管理 里允许 MCP;否则进程退出。
// 未设置环境变量保持旧行为(本地直连受信任环境,不校验),向后兼容。
if (process.env.DUSUN_MCP_TOKEN) {
const { findMcpTokenUser } = await import("../src/server/permissions");
const hit = await findMcpTokenUser(process.env.DUSUN_MCP_TOKEN).catch(() => null);
if (!hit) {
console.error("dusuniot-cms: DUSUN_MCP_TOKEN 无效或该角色未获 MCP 权限,拒绝启动");
process.exit(1);
}
console.error(`dusuniot-cms: token auth ok (${hit})`);
}
/** # 函数 逐行解析 stdin 请求并分发(initialize / tools/list / tools/call / ping) */
for await (const chunk of Bun.stdin.stream()) {
const text = new TextDecoder().decode(chunk);
@@ -472,7 +487,7 @@ for await (const chunk of Bun.stdin.stream()) {
result: {
protocolVersion: "2024-11-05",
capabilities: { tools: {} },
serverInfo: { name: "dusuniot-cms", version: process.env.npm_package_version ?? "0.11.0" },
serverInfo: { name: "dusuniot-cms", version: pkg.version },
},
});
break;