数据库/规则引擎/6能力/业务统一 彻底审计(2026-07-15 22:40)

数据库/规则引擎/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(非本轮引入,独立排期)

  1. ai-task-manager.js:6 原生 sqlite3 回调驱动(ai_tasks.db 不在单例,API 不兼容)
  2. ai-inspector.js:49 只读 sql.js 内存快照(只读,无写风险)
  3. server/scripts/* 下 4 处 new SQL.Database(构建/迁移脚本,非运行时)

与「9 个 API 404」的关系

  • 完全无关。9 个 API 404 根因是 server.js 手写 http 路由 dispatch 缺失(handleRequest 内 0 处分发这 9 个端点),属业务路由层工程债
  • DB 统一达成 ≠ 业务路由功能完整,两者是正交维度

自我更正

此前「DB 修复收口」判断的错不在「统一是否达成」(统一确实达成),而在「未同步说明业务路由层 9 个 API 仍 404」。本轮从头审计补齐了全貌。

← 返回案例列表
分享:
🤖 Try Now →
🤖
🎁