use crate::app::agent::config::Config;
use crate::app::agent::memory::MemoryCategory;
use anyhow::Result;
use super::super::super::session::{collect_modified_files, create_cli_session};
use super::super::super::setup::CliSetup;
use super::super::super::stats::build_session_title;
use super::super::super::transcript::{TranscriptEntry, TranscriptRole};
use super::super::super::tui::CliTui;
use super::flow::SubmitOutcome;
#[allow(clippy::too_many_arguments)]
pub(crate) async fn handle_pending_clear(
config: &Config,
setup: &CliSetup,
user_input: &str,
tui: &mut CliTui,
transcript: &mut Vec<TranscriptEntry>,
session_history: &mut Vec<crate::session::ui_types::ChatMessage>,
session_id: &mut String,
session_title_refreshed: &mut bool,
cursor_idx: usize,
busy: bool,
awaiting_clear_confirm: &mut bool,
stats: &mut super::super::super::stats::CliStats,
workspace: &str,
modified_files: &mut Vec<String>,
files_collapsed: &mut bool,
draft: &str,
scroll_back: u16,
show_menu: bool,
) -> Result<SubmitOutcome> {
*awaiting_clear_confirm = false;
if matches!(user_input.to_lowercase().as_str(), "y" | "yes") {
session_history.clear();
*session_id = create_cli_session(
&std::env::current_dir().unwrap_or_else(|_| config.workspace_dir.clone()),
None,
)
.await;
*session_title_refreshed = false;
let mut cleared = 0;
for category in [MemoryCategory::Conversation, MemoryCategory::Daily] {
let entries = setup.mem.list(Some(&category), None).await.unwrap_or_default();
for entry in entries {
if setup.mem.forget(&entry.key).await.unwrap_or(false) {
cleared += 1;
}
}
}
if cleared > 0 {
transcript.push(TranscriptEntry::new(
TranscriptRole::System,
format!("会话已清除 ({cleared} 条记忆条目已移除)"),
));
} else {
transcript.push(TranscriptEntry::new(TranscriptRole::System, "Conversation cleared"));
}
} else {
transcript.push(TranscriptEntry::new(TranscriptRole::System, "Cancelled"));
}
*modified_files = collect_modified_files(&config.workspace_dir);
let session_title = build_session_title(stats, &setup.provider_name, &setup.model_name);
tui.draw(
transcript,
"",
cursor_idx,
busy,
*awaiting_clear_confirm,
&setup.provider_name,
&setup.model_name,
stats,
workspace,
draft,
&session_title,
modified_files,
*files_collapsed,
scroll_back,
show_menu,
)?;
Ok(SubmitOutcome::Continue)
}
#[allow(clippy::too_many_arguments)]
pub(crate) fn handle_inline_command(
user_input: &str,
tui: &mut CliTui,
transcript: &mut Vec<TranscriptEntry>,
cursor_idx: usize,
busy: bool,
awaiting_clear_confirm: &mut bool,
stats: &mut super::super::super::stats::CliStats,
workspace: &str,
modified_files: &[String],
files_collapsed: &mut bool,
draft: &str,
scroll_back: u16,
show_menu: bool,
provider_name: &str,
model_name: &str,
) -> Result<Option<SubmitOutcome>> {
match user_input {
"/quit" | "/exit" => return Ok(Some(SubmitOutcome::Exit)),
"/help" => {
transcript.push(TranscriptEntry::new(
TranscriptRole::System,
"命令:\n /help 显示此帮助消息\n /files 切换文件面板\n /clear /new 清除会话历史\n /quit /exit 退出交互式模式",
));
}
"/files" => {
*files_collapsed = !*files_collapsed;
}
"/clear" | "/new" => {
*awaiting_clear_confirm = true;
transcript.push(TranscriptEntry::new(
TranscriptRole::System,
"确认清除当前会话和会话内存(核心记忆将保留)?",
));
transcript.push(TranscriptEntry::new(TranscriptRole::System, "确认请输入 y/yes"));
}
_ => return Ok(None),
}
let session_title = build_session_title(stats, provider_name, model_name);
tui.draw(
transcript,
"",
cursor_idx,
busy,
*awaiting_clear_confirm,
provider_name,
model_name,
stats,
workspace,
draft,
&session_title,
modified_files,
*files_collapsed,
scroll_back,
show_menu,
)?;
Ok(Some(SubmitOutcome::Continue))
}