//! 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| { // 数据库放在系统应用数据目录 下(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))?; 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::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"); }