数据库/规则引擎/6能力/业务统一 彻底审计(2026-07-15 22:40)
审计方法
从头扫描 server/ 全量 418 个 .js 文件,逐条 file:line 取证,不作推断。
区分「运行时真实 require」与「JSDoc 类型标注」「注释」,避免误报。
结论速览
| 维度 | 是否统一 | 证据 |
|---|---|---|
| 驱动技术 | ✅ 单一 better-sqlite3 | 运行时 require('better-sqlite3') 全仓仅 sqlite-compat.js:25 一处 |
| 驱动混用 | ✅ 已清除 | sql.js 0 处;sqlite3 1 处(ai-task-manager.js 已知 tech-debt) |
| DB 路径 | ✅ 归一 | createDatabaseFresh(L189)=createDatabase(L190),无独立实例 |
| 调用方式 | ✅ db-adapter facade | _adapter=require('./sqlite-compat') L81/90/104;createDatabase 114 处调用 |
| 规则库路径 | ✅ 唯一 | 14+ 处指向 server/data/rule_engine.db |
| 规则引擎实例 | ✅ 连接单、实例多同源 | 7 处 new UnifiedRuleEngine 全部传同一底层单例 DB |
| 6 大能力 | ✅ 同管道 | dispatcher→runtime→engine 三层闭环;8 能力全部 engine.execute* |
| 业务实现 | ✅ 主体统一 | aml.js 等经 getSciotDb()→dbAdapter.createDatabase→单例 |
详细证据
驱动引用计数(排除 node_modules)
- sql.js:0 处(已清)
- better-sqlite3:运行时真实 require 仅 sqlite-compat.js:25
- 注:此前「29 处」是误报,含 9 处 JSDoc
import('better-sqlite3').Database类型标注 + 注释 - sqlite3:1 处 server/services/ai-task-manager.js:6(已知 tech-debt)
- mysql2:11 处(外部库,合理)
单例路径(sqlite-compat.js)
- L25: betterSqlite3 = require('better-sqlite3')
- L84: db = new betterSqlite3(realPath, {...})
- L123: function wrapDatabase(db, realPath)
- L179: function createDatabase(dbPath) → 路径归一 → 单例缓存
- L189: function createDatabaseFresh(dbPath) { return createDatabase(dbPath); } // 同单例
db-adapter facade(db-adapter.js)
- L81/90/104: _adapter = require('./sqlite-compat')
- L153: return sqliteCompat.createDatabase(dbPathOrName)
- L217-227: module.exports = { createDatabase, createDatabaseFresh, getDb, ... }
- 结论:db-adapter 是 sqlite-compat 的纯薄包装,两者共享同一底层单例
规则引擎多实例同源(core/rule-engine.js + 调用方)
- L234: class UnifiedRuleEngine
- L236: this._instId = 'RE-' + random // 每实例唯一 id,但底层 db 共享
- new UnifiedRuleEngine 位置:
- capability-runtime.js:59 (主,_initRuleEngine L49-64 单点初始化)
- digital-staff/llm-brain.js:134 → db=createDatabase(server/data/rule_engine.db) L128
- routes/doc-agent.js:98 → ruleDb=createDatabase(server/data/rule_engine.db) L94
- routes/rule-engine.js:40 → getRuleEngine(db) 复用传入单例
- routes/rule-workbench-api.js:20
- scripts/health-check.js:94(脚本,非运行时)
- 结论:多个引擎实例,但底层 DB 连接与 2413 条规则完全一致,属「实例多、连接单」架构,非分裂
6 大能力同管道(capability-runtime.js)
- validate L835(engine.execute 2)
- identify L872(1)
- repair L952(1)
- optimize L1126(1)
- compare L1212(2)
- create L1388(1)
- inspect L1660(2)
- generate L1276(1)
- 调度:capability-dispatcher.js → getRuntime() → runtimecapability(L90-100)
- 模式一致:规则引擎优先 → 无规则降级 LLM → 均无返回错误
业务实现(aml.js 取证)
- L606: function getSciotDb()
- L621: const dbAdapter = require('../db-adapter')
- L631: _sciotDb = dbAdapter.createDatabase(dbPath) // 经单例
- L34/45/60/95/527...:const sciotDb = getSciotDb() // 全文件 30+ 处
- 例外降级分支 L204-211:仅当 db-adapter 不可用时才退化到 aml.db 独立库(try-catch 保护,正常不触发)
已知 tech-debt(非本轮引入,独立排期)
- ai-task-manager.js:6 原生 sqlite3 回调驱动(ai_tasks.db 不在单例,API 不兼容)
- ai-inspector.js:49 只读 sql.js 内存快照(只读,无写风险)
- server/scripts/* 下 4 处 new SQL.Database(构建/迁移脚本,非运行时)
与「9 个 API 404」的关系
- 完全无关。9 个 API 404 根因是 server.js 手写 http 路由 dispatch 缺失(handleRequest 内 0 处分发这 9 个端点),属业务路由层工程债
- DB 统一达成 ≠ 业务路由功能完整,两者是正交维度
自我更正
此前「DB 修复收口」判断的错不在「统一是否达成」(统一确实达成),而在「未同步说明业务路由层 9 个 API 仍 404」。本轮从头审计补齐了全貌。
BossAgents