- df-ai: context 历史中毒三档自愈 sanitize_messages(AC3)+anthropic_compat tool_use_id None 跳过(AC1/AC2)+删 router/stream 死码
- df-core: events 加 select_type+decisions 多选审批契约(F-260615-01)
- df-execute: shell run_command 工具复用(F-260615-05)
- df-nodes: human_node 多选校验+2 端到端测(F-01)+取消跳 set_failed(B-03b-R1/R2/R8)
- df-workflow: executor/dag/state cancel 闭环(B-06/07/03a/b)+provider approve options(R-PD-5)
- df-storage: find_path_conflict 抽公共(R-PD-11)+COLS 常量断言
- df-ideas: 删 IdeaPromoter/PromotionPolicy 死码(R-PD-14)
- src-tauri/commands/ai: secret keyring 迁移(FR-S1/R-PD-4)+GeneratingGuard RAII+disarm(B-09/26)+newConversation 软复位(B-10)+stream 心跳/stop select/空回复判错(B-02/04/05/15)+run_command(F-05)+mask audit(AR-3)
- src-tauri/commands/{project,task,workflow,mod,lib,state}: task detail IPC(F-02)+approve decisions+task list 联动(B-29)
- Cargo.lock+Cargo.toml 依赖同步
113 lines
4.9 KiB
Rust
113 lines
4.9 KiB
Rust
//! DevFlow Tauri 入口 — 初始化 AppState 并注册全部 IPC 命令
|
||
|
||
mod commands;
|
||
mod state;
|
||
|
||
use tauri::Manager;
|
||
|
||
use state::AppState;
|
||
|
||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||
pub fn run() {
|
||
tauri::Builder::default()
|
||
.plugin(tauri_plugin_opener::init())
|
||
.plugin(tauri_plugin_dialog::init())
|
||
.plugin(tauri_plugin_window_state::Builder::default().build())
|
||
.setup(|app| {
|
||
// 数据库放在系统应用数据目录 <app_data_dir> 下(dev/release 拆分):
|
||
// Dev 模式 devflow-dev.db(可随意改动/清空),Build 模式 devflow.db(长期保留真实运行数据)
|
||
let db_name = if cfg!(debug_assertions) { "devflow-dev.db" } else { "devflow.db" };
|
||
let data_dir = app.path().app_data_dir()?;
|
||
std::fs::create_dir_all(&data_dir)?;
|
||
let db_path = data_dir.join(db_name);
|
||
|
||
// 初始化全局状态(打开数据库 + 执行迁移)
|
||
let app_state = tauri::async_runtime::block_on(AppState::init(&db_path))?;
|
||
// FR-S1:启动一次性迁移 DB 明文 api_key → OS keyring(失败保留明文下次重试,非阻断)
|
||
if let Err(e) = tauri::async_runtime::block_on(
|
||
commands::ai::secret::migrate_secrets_to_keyring(&app_state.ai_providers),
|
||
) {
|
||
tracing::warn!("[FR-S1] 启动密钥迁移失败(非阻断): {}", e);
|
||
}
|
||
app.manage(app_state);
|
||
Ok(())
|
||
})
|
||
.invoke_handler(tauri::generate_handler![
|
||
// 项目
|
||
commands::project::list_projects,
|
||
commands::project::create_project,
|
||
commands::project::import_project,
|
||
commands::project::get_project,
|
||
commands::project::update_project,
|
||
commands::project::delete_project,
|
||
commands::project::list_deleted_projects,
|
||
commands::project::restore_project,
|
||
commands::project::purge_project,
|
||
commands::project::scan_project_stack,
|
||
commands::project::check_path_binding,
|
||
commands::project::relocate_project_path,
|
||
commands::project::check_path_exists,
|
||
commands::project::scan_project_with_ai,
|
||
// 任务
|
||
commands::task::list_tasks,
|
||
commands::task::create_task,
|
||
commands::task::update_task,
|
||
commands::task::delete_task,
|
||
commands::task::get_task_by_id,
|
||
// 灵感
|
||
commands::idea::list_ideas,
|
||
commands::idea::create_idea,
|
||
commands::idea::update_idea,
|
||
commands::idea::delete_idea,
|
||
commands::idea::evaluate_idea,
|
||
commands::idea::promote_idea,
|
||
// 工作流
|
||
commands::workflow::run_workflow,
|
||
commands::workflow::list_workflow_executions,
|
||
commands::workflow::get_workflow_execution,
|
||
commands::workflow::approve_human_approval,
|
||
commands::workflow::cancel_workflow_node,
|
||
// AI 聊天
|
||
commands::ai::ai_chat_send,
|
||
commands::ai::ai_chat_stop,
|
||
commands::ai::ai_approve,
|
||
commands::ai::ai_pending_tool_calls,
|
||
commands::ai::ai_chat_clear,
|
||
commands::ai::ai_list_providers,
|
||
commands::ai::ai_save_provider,
|
||
commands::ai::ai_set_provider,
|
||
commands::ai::ai_delete_provider,
|
||
// AI 对话管理
|
||
commands::ai::ai_conversation_create,
|
||
commands::ai::ai_conversation_list,
|
||
commands::ai::ai_conversation_switch,
|
||
commands::ai::ai_conversation_delete,
|
||
commands::ai::ai_conversation_rename,
|
||
commands::ai::ai_conversation_archive,
|
||
commands::ai::ai_list_skills,
|
||
commands::ai::ai_set_concurrency_config,
|
||
// 知识库
|
||
commands::knowledge::knowledge_list,
|
||
commands::knowledge::knowledge_get,
|
||
commands::knowledge::knowledge_search,
|
||
commands::knowledge::knowledge_create,
|
||
commands::knowledge::knowledge_update_status,
|
||
commands::knowledge::knowledge_record_reuse,
|
||
commands::knowledge::knowledge_list_candidates,
|
||
commands::knowledge::knowledge_archive,
|
||
commands::knowledge::knowledge_get_config,
|
||
commands::knowledge::knowledge_save_config,
|
||
commands::knowledge::knowledge_extract_now,
|
||
commands::knowledge::knowledge_get_detail,
|
||
commands::knowledge::knowledge_update,
|
||
commands::knowledge::knowledge_events,
|
||
// 通用应用设置 KV(前端 localStorage 迁移目标)
|
||
commands::settings::settings_get,
|
||
commands::settings::settings_set,
|
||
commands::settings::settings_get_all,
|
||
commands::settings::settings_delete,
|
||
])
|
||
.run(tauri::generate_context!())
|
||
.expect("error while running tauri application");
|
||
}
|