# 开发指南 > 中文文档 | [English](../en/DEVELOPMENT.md) ## 架构 ``` host(零构建,node:crypto / node:http) ├── index.js # Cordis 插件入口:gateway 生命周期、tapIndex 注入(randomUUID + authenticated LAN trust)、安全事件与登录审计接线、首次部署初始密码 ├── lib/gateway.js # 认证网关:HTTP/WS 拦截与转发、认证状态机、防爆破三层、防重放、basePath 路由/跳转/转发剥离、登录审计事件、静态资产免认证 ├── lib/gateway-otp.js # OTP 路由 handler(/otp/setup|enable|verify-setup|verify|verify-backup|disable,自 gateway.js 拆分) ├── lib/forward.js # HTTP/WS 转发管道(Host/Origin 回环改写、upgrade 双向管道、lanAddresses) ├── lib/upstream-auth.js # dsh ≥ 0.1.2 上游浏览器认证桥接(经 credentials 服务读密钥、为回环一跳铸同构 cookie;含 record 晚到快速重试/后台轮询与轮换重铸) ├── lib/auth.js # 会话表与 Cookie:内存 256-bit token、onboarding/OTP 状态标记、改密吊销 ├── lib/audit-log.js # 审计日志文件 sink(JSONL,$DSH_HOME/auth-gateway/log/audit.log,按天轮转、保留 90 天) ├── lib/page-shell.js # 页面脚手架共享件(基础 CSS、HTML 骨架、script 头:ERRORS + post) ├── lib/errors.js # 页面错误文案总字典(中英双语,errorsFor 按页选取 + 覆盖) ├── lib/locale.js # 页面语言解析(dsh 偏好 > Accept-Language > zh) ├── lib/store.js # 密码存储(scrypt 异步哈希,$DSH_HOME/auth-gateway/password.json) ├── lib/otp-store.js # OTP 存储(secret + 备份码哈希 + lastCounter 水印) ├── lib/otp-crypto.js # OTP 密钥加解密(AES-256-GCM,主密钥来自环境变量或 key 文件) ├── lib/totp.js # TOTP(RFC 6238/4226):base32、生成/验证、防重放、otpauth URI、备份码 ├── lib/qr-svg.js # 零依赖 QR SVG 生成(Reed-Solomon、掩码评估) ├── lib/otp-page.js # OTP 设置/验证页面(自包含 HTML) ├── lib/login-page.js # 登录/设置/改密页面 ├── lib/onboarding-page.js # 引导页(设置个人密码 + 可选 OTP 绑定) ├── lib/policy.js # 密码强度策略 ├── lib/version.js # 自身版本/仓库读取(package.json)+ SemVer 子集比较 ├── lib/update-check.js # 新版本检查(唯一的对外请求,TTL 缓存 + 绝不抛错) └── lib/config.js # Standard Schema 配置校验(含 basePath 子路径前缀) client(可选,源码构建) ├── client/src/index.jsx # 面板容器:全部 state/handler、api 工厂、slot 注册(settings.section) ├── client/src/locales.js # 中英文字典(自有命名空间) ├── client/src/styles.js # dsh 设计 token 与共享样式对象 ├── client/src/ui.jsx # Button / Pill / StatusBanner 原语 ├── client/src/*-card.jsx # 展示卡片(OTP/改密/会话/Cookie Secure/关于):只吃 props,无 state 无请求 ├── client/src/otp-setup-dialog.jsx # OTP 绑定弹窗(扫码 / 验证 / 一次性备份码) ├── client/src/cookie-secure.js # Cookie Secure 状态推导(纯函数,单测) ├── client/src/update-notice.js # 更新提示推导(纯函数,单测) └── client/build.mjs # esbuild 构建 → client/index.js(dsh 经 exports["./client"] 服务) scripts / tests ├── scripts/deploy.sh # 部署流水线:语法检查 → 全量测试 → 同步到 DSH 安装目录 → 安装后验证(--restart 可选重启) ├── scripts/e2e.mjs # Playwright 端到端(真实 dsh web:登录/2FA/改密全流程) ├── scripts/screenshots.mjs # README 界面截图(docs/assets/*.png) ├── scripts/verify.sh # curl 门禁验证(401/302/WS 拒绝/锁定) ├── scripts/reset.mjs # dsh-auth-gateway-reset:仅删 password.json(双语输出) ├── scripts/uninstall.mjs # dsh-auth-gateway-uninstall:删整个 auth-gateway/(双语输出) └── tests/ # gateway / config / policy / otp / locale / basepath / patch-ports / plugin-contract / client-contract / audit-log ``` 设计要点: - **零运行时依赖**:host 全部使用 Node 内置模块;client 构建产物仅 external 引用 dsh 运行时提供的模块。其中 `@deepseek-ai/dsh-client-ui-slots` 与 `@deepseek-ai/dsh-client-ui-primitives`(`Menu` 等官方 UI 原语,面板的下拉框用它而非原生 `