重构: 巨函数拆分 + 清理历史标记注释 + custom_prompt/停止按钮/tunnel 改进

This commit is contained in:
lxy
2026-07-31 21:36:12 +08:00
parent 365af554da
commit bd9031d35d
73 changed files with 1421 additions and 1064 deletions
+17 -17
View File
@@ -23,12 +23,12 @@ pub fn run(conn: &Connection) -> Result<()> {
// 迁移步骤链: 顺序执行,跳过已应用的版本(current_version < N 才跑)。
// 新增版本时,在此数组追加一项 (N, migrate_vN) 即可,无需改逻辑。
// V20 = F-260619-01(任务关联灵感 idea_id);V21 = 消息拆分存储 + audit message_id;
// V20 = 任务关联灵感 idea_id;V21 = 消息拆分存储 + audit message_id;
// V22 = 灵感评估历史持久化(idea_evaluations 追加型审计表);
// V23 = knowledges.embedding_status 列(嵌入失败可补偿重试);
// V24 = ideas.related_ids 列(灵感间关联关系持久化打底);
// V25 = idea_evaluations (idea_id, version) 唯一约束(评估版本并发重复兜底);
// V26 = F-260621-02 任务索引缺口补全(priority/assignee,对齐 idx_tasks_status 同类索引)。
// V26 = 任务索引缺口补全(priority/assignee,对齐 idx_tasks_status 同类索引)。
// V27 = TD-260621-05 审批状态统一(ai_tool_executions.status executed→completed,
// 对齐 DTO 契约 audit/mod.rs:53 只列 completed + 前端 i18n auditLog.status 无 executed 键 +
// 治 AuditLog executed 记录显示错位蓝pending标签+raw"executed")。
@@ -290,7 +290,7 @@ fn migrate_v14(conn: &Connection) -> Result<()> {
Ok(())
}
/// V15: 幂等补 tasks.review_rounds 列(review 退回累计轮数,F-260616-04)
/// V15: 幂等补 tasks.review_rounds 列(review 退回累计轮数)
///
/// 任务推进链状态机退回时累加:in_review→in_progress / testing→in_review 各 +1,
/// 由 advance_task(df-nodes::task_advance_node)原子写入。默认 0(从未退回过的任务)。
@@ -343,7 +343,7 @@ fn migrate_v17(conn: &Connection) -> Result<()> {
Ok(())
}
/// V18: 幂等补 ai_providers.model_configs 列(模型能力配置,F-01 阶段1)
/// V18: 幂等补 ai_providers.model_configs 列(模型能力配置)
///
/// 模型 4 维度(模态/能力/价格/智力)+ 路由控制配置 JSON 字符串。TEXT NULL 向后兼容:
/// 老库行默认 NULL,from_row 经 deserialize_model_configs 解析为空 Vec(配合 default_model 过渡)。
@@ -358,7 +358,7 @@ fn migrate_v18(conn: &Connection) -> Result<()> {
Ok(())
}
/// V19: 幂等补 ai_providers.enabled + ai_providers.weight 列(F-260614-04 多 Provider 负载均衡池)
/// V19: 幂等补 ai_providers.enabled + ai_providers.weight 列(多 Provider 负载均衡池)
///
/// - `enabled INTEGER NOT NULL DEFAULT 1`:provider 是否进入负载均衡池。
/// 老库行迁移后默认 1(所有现存 provider 默认启用,单 provider 路径零变化)。
@@ -374,21 +374,21 @@ fn migrate_v19(conn: &Connection) -> Result<()> {
"ALTER TABLE ai_providers ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1",
[],
)?;
tracing::info!("v19: 补建 ai_providers.enabled 列(多 Provider 负载均衡池,F-260614-04)");
tracing::info!("v19: 补建 ai_providers.enabled 列(多 Provider 负载均衡池)");
}
if !column_exists(conn, "ai_providers", "weight") {
conn.execute(
"ALTER TABLE ai_providers ADD COLUMN weight INTEGER NOT NULL DEFAULT 50",
[],
)?;
tracing::info!("v19: 补建 ai_providers.weight 列(多 Provider 负载均衡池,F-260614-04)");
tracing::info!("v19: 补建 ai_providers.weight 列(多 Provider 负载均衡池)");
}
conn.execute("INSERT INTO schema_version (version) VALUES (?)", [19])?;
tracing::info!("迁移 v19 完成");
Ok(())
}
/// V20:幂等补 tasks.idea_id 列(F-260619-01 任务关联灵感,1对1 单向)
/// V20:幂等补 tasks.idea_id 列(任务关联灵感,1对1 单向)
///
/// 任务可关联到一条灵感(任务→灵感单向),复用 projects.idea_id 模式
/// (REFERENCES ideas(id) 外键)。TEXT NULL 向后兼容:老库行默认 NULL,TaskRecord
@@ -401,7 +401,7 @@ fn migrate_v20(conn: &Connection) -> Result<()> {
"ALTER TABLE tasks ADD COLUMN idea_id TEXT REFERENCES ideas(id)",
[],
)?;
tracing::info!("v20: 补建 tasks.idea_id 列(任务关联灵感,F-260619-01)");
tracing::info!("v20: 补建 tasks.idea_id 列(任务关联灵感)");
}
conn.execute("INSERT INTO schema_version (version) VALUES (?)", [20])?;
tracing::info!("迁移 v20 完成");
@@ -433,7 +433,7 @@ fn migrate_v21(conn: &Connection) -> Result<()> {
// 1. 建 ai_messages 表(IF NOT EXISTS 幂等)
conn.execute_batch(V21_SQL)?;
// 2. 幂等补 ai_tool_executions.message_id 列(消息级溯源 audit,F-260619-04)
// 2. 幂等补 ai_tool_executions.message_id 列(消息级溯源 audit)
// 表存在性兜底:run() 正常流程下 V9 已先建该表,但测试/手动调用可能跳过 V9。
// 表不存在时跳过 ALTER(新库会由 V9_SQL 建表带 message_id 列;此处只补老库已有表)。
let tool_exec_table_exists: bool = conn
@@ -564,7 +564,7 @@ fn migrate_v21(conn: &Connection) -> Result<()> {
///
/// 不登记通用列白名单(allowed_columns_for):本表走专用 list_by_idea,
/// 宏生成的 query/update_field 未登记表会被 validate_column_name 保守拒绝
/// (FR-S6),与追加型审计语义一致(历史不改),不开放通用写路径。
/// 与追加型审计语义一致(历史不改),不开放通用写路径。
fn migrate_v22(conn: &Connection) -> Result<()> {
conn.execute_batch(V22_SQL)?;
conn.execute("INSERT INTO schema_version (version) VALUES (?)", [22])?;
@@ -661,7 +661,7 @@ fn migrate_v25(conn: &Connection) -> Result<()> {
Ok(())
}
/// V26:补建 tasks 表 priority/assignee 索引(F-260621-02 索引缺口)
/// V26:补建 tasks 表 priority/assignee 索引(索引缺口)
///
/// list_by_query 已支持 priority/assignee 过滤下推(TaskQuery.priority/assignee),
/// 但缺索引 → 数据量增长后全表扫描。补建索引对齐已有的 idx_tasks_status /
@@ -1219,7 +1219,7 @@ CREATE TABLE IF NOT EXISTS tasks (
priority INTEGER NOT NULL DEFAULT 2,
branch_name TEXT,
assignee TEXT,
-- F-260619-01 任务关联灵感(1对1 单向,复用 projects.idea_id 模式)。老库由 V20 迁移补列。
-- 任务关联灵感(1对1 单向,复用 projects.idea_id 模式)。老库由 V20 迁移补列。
idea_id TEXT REFERENCES ideas(id),
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
@@ -1265,7 +1265,7 @@ CREATE TABLE IF NOT EXISTS node_executions (
-- 索引
CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id);
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
-- V26 补建(F-260621-02 索引缺口):priority/assignee 过滤下推索引,新库一次性建;
-- V26 补建(索引缺口):priority/assignee 过滤下推索引,新库一次性建;
-- 老库由 migrate_v26 CREATE INDEX IF NOT EXISTS 补建,两边索引定义须一致。
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee);
@@ -1395,7 +1395,7 @@ CREATE TABLE IF NOT EXISTS ai_tool_executions (
decided_by TEXT
);
-- F-260619-03 消息拆分存储:每条 ChatMessage 一行的独立表。
-- 消息拆分存储:每条 ChatMessage 一行的独立表。
-- 与 V21 迁移建表 SQL 镜像(V21 用于老库 ALTER,此处给新库直接建最终态)。
-- 改动须两边同步(V21_SQL 见下方)。
CREATE TABLE IF NOT EXISTS ai_messages (
@@ -1451,7 +1451,7 @@ CREATE TABLE IF NOT EXISTS app_settings (
";
// ============================================================
// 单元测试 — V21 迁移幂等安全(新库/老库/坏数据三态,F-260619-03)
// 单元测试 — V21 迁移幂等安全(新库/老库/坏数据三态)
// ============================================================
#[cfg(test)]
@@ -1673,7 +1673,7 @@ mod tests {
}
// ============================================================
// V20 迁移幂等安全(F-260619-01 任务关联灵感)
// V20 迁移幂等安全(任务关联灵感)
// ============================================================
/// 构造最小老库 schema:tasks 表(无 idea_id 列,模拟 V1 建表老形态)+ schema_version。