开发者文档
Monorepo 结构、核心启动链路与贡献注意事项
SnowLuma 是 TypeScript + 原生模块混合项目。TypeScript 负责运行时编排、OneBot 实现、协议桥接、SDK 和 WebUI;原生模块负责 Hook、注入和高性能 WebSocket 能力。
Monorepo 结构
pnpm workspace,5 个包:
SnowLuma/
├─ packages/
│ ├─ core/ @snowluma/core 核心:Bridge / OneBot / Hook
│ ├─ websocket/ @snowluma/websocket 本仓内置 WS 实现(依赖原生 addon)
│ ├─ sdk/ @snowluma/sdk 外部消费者用的 TS OneBot 客户端
│ ├─ webui/ webui React + Vite 控制台
│ └─ runtime/ 运行时发行模板(启动脚本 / launcher / package.json)
├─ native/ 平台原生产物(.node / .dll / .so)
├─ dist/ 构建输出
├─ tools/ 辅助脚本(version bump、release 等)
├─ docs/ ADR 等开发文档
└─ package.json核心启动链路
入口在 packages/core/src/index.ts:
loadRuntimeConfig() ← 读 config/runtime.json / env
↓
HookManager(autoLoadOnDiscovery)
↓
BridgeManager
↓
OneBotManager ← 按 UIN 拉起 OneBotInstance
↓
initWebUI(port=webuiPort) ← 仅完整构建启用启动时创建:
HookManager—— 发现 QQ 主进程并注入 native addon;hookAutoLoad: true时每发现一个新 PID 自动注入。BridgeManager—— 把命名管道里的 Hook 消息解码成桥接事件;缓存 rkey / 联系人 / 群成员。OneBotManager—— 按 UIN 创建OneBotInstance;持有MessageStore/MediaStore/NetworkManager。initWebUI—— 完整构建中启动 WebUI,端口默认5099(runtime.json.webuiPort可改)。
Hook 与原生模块
Hook 原生模块通过 process.dlopen() 加载。源码在 dev/nnphook 这个独立仓库。
平台命名约定:
snowluma-win32-x64.node snowluma-win32-x64.dll
snowluma-linux-x64.node snowluma-linux-x64.so
snowluma-linux-arm64.node snowluma-linux-arm64.so加载搜索路径:
native/
dist/native/
packages/runtime/native/原生 addon 暴露:
getAllMainProcess—— 枚举 QQ 主进程。loadModuleManual—— 向目标进程手动映射注入模块。unloadModuleManual—— 卸载已注入模块。
Windows 默认目标进程名 QQ.exe;Linux 是 qq。
OneBot 生命周期
桥接层检测到 QQ 会话启动时:
- 加载
config/onebot_<uin>.json(缺则从全局复制)。 - 构造
OneBotInstance。 - 起 HTTP / WS / 反向 WS / HTTP POST 适配器(按
networks.*配置)。 - 异步预热好友列表、群列表、群成员列表。
- 桥接事件 → OneBot 事件转发。
会话关闭时对应实例释放。
WebSocket 包
@snowluma/websocket 是项目自带的 WebSocket 实现,接口尽量贴近 ws,但带原生加速。
导出:
WebSocket—— 客户端构造器。WebSocketServer—— 服务端构造器。Server——WebSocketServer别名。InternalWebSocket—— 内部连接实现。
依赖平台原生 .node,同样从 native/ 搜索路径加载。
SDK 包
@snowluma/sdk 是面向第三方的 OneBot 客户端,类型完备:
- HTTP / WebSocket / 反向 WS 三种传输。
- 自动重连、事件订阅、ack 关联。
- 与 SnowLuma 核心共享 action 类型,避免漂移。
可以独立 pnpm publish 到 npm,不依赖 SnowLuma 运行时。
开发命令
pnpm install
pnpm dev # core 开发模式
pnpm dev:web # WebUI 开发服务器
pnpm build # 仅 core
pnpm build:webui # 仅 WebUI
pnpm build:sdk # 仅 SDK
pnpm build:all # core + SDK + WebUI
pnpm test # core 测试
pnpm typecheck # 全仓类型检查
pnpm lint # 全仓 lint构建顺序
完整发行版:
pnpm build:all依次执行:
@snowluma/core完整构建@snowluma/sdkwebui
产物统一输出到 dist/。
文档站
文档站在独立仓库 SnowLuma/SnowLumaDocs(本地一般 checkout 到 dev/SnowLumaDocs/,与主仓共存)。
技术栈:Next.js 16 + Fumadocs 16 + Tailwind 4 + MDX。
OneBot API 参考由文档仓的 pnpm openapi:generate 从 packages/core/src/onebot/actions/ 静态扫描产生,落到文档仓的 content/api/openapi.json。Action 增删后重新生成并提交。
贡献注意事项
- 不要绕过 BridgeManager:OneBot 层一律通过
BridgeInterface调用 NTQQ 能力,便于解耦和测试。 - 保持配置可自动生成:新增字段需向后兼容;解析时归一化、写回磁盘。
- 原生模块按平台分发:新加平台时同步
.node与可注入库。 - 优先补测试:核心 OneBot 行为通过
vitest验证,参考packages/core/tests/。 - OpenAPI 自动化:新增
registerAction后运行pnpm openapi:generate(文档仓),避免 API 参考过时。