refactor(status): pakai context::tokens dan context::window

Status bar sekarang memakai penghitungan token yang sama persis dengan
compaction (bukan heuristik /4 terpisah), dan selalu menampilkan angka
context window nyata alih-alih '?' saat model role tidak override
context_window secara eksplisit — konsisten dengan fallback yang
sudah dipakai compaction sendiri.
This commit is contained in:
asepharyana
2026-07-16 07:56:11 +07:00
parent 96084f7462
commit 85d16ebe97
+6 -14
View File
@@ -56,33 +56,25 @@ pub fn draw_status_bar(frame: &mut Frame, area: Rect, state: &crate::app::state:
];
// ── Right segment: metadata ───────────────────────────────────────────
let right_str = if let Some(ref rt) = state.session_runtime {
let max_tokens = state.app_config.model_roles.values()
.find(|role| role.provider == state.settings.provider && role.model == state.settings.model)
.and_then(|role| role.context_window);
let max_tokens = crate::app::runtime::context::window::resolve(&state.app_config, &state.settings);
let total_chars: usize = rt.messages.iter()
let right_str = if let Some(ref rt) = state.session_runtime {
let current_tokens: usize = rt.messages.iter()
.filter_map(|m| m.content.as_deref())
.map(str::len)
.map(crate::app::runtime::context::tokens::count_tokens)
.sum();
let current_tokens = total_chars / 4;
let mut parts = Vec::new();
if rt.usage.last_tokens_in > 0 || rt.usage.last_tokens_out > 0 {
parts.push(format!("{}{}", rt.usage.last_tokens_in, rt.usage.last_tokens_out));
}
let max_str = max_tokens.map_or_else(|| "?".to_string(), |v| v.to_string());
parts.push(format!("{current_tokens}/{max_str}"));
parts.push(format!("{current_tokens}/{max_tokens}"));
parts.push(state.settings.provider.clone());
parts.push(state.settings.model.clone());
format!(" {} ", parts.join(" · "))
} else {
let max_tokens = state.app_config.model_roles.values()
.find(|role| role.provider == state.settings.provider && role.model == state.settings.model)
.and_then(|role| role.context_window);
let max_str = max_tokens.map_or_else(|| "?".to_string(), |v| v.to_string());
format!(" 0/{} · {} · {} ", max_str, state.settings.provider, state.settings.model)
format!(" 0/{} · {} · {} ", max_tokens, state.settings.provider, state.settings.model)
};
// ── Combine everything ────────────────────────────────────────────────