feat: enhance lesson management and review system

- Added LessonAccept and LessonReject actions to manage lesson outcomes.
- Implemented probe for build/test verification before triggering reviews.
- Introduced a mechanism for recording shadow hits and evaluating trials in the ReviewSystem.
- Enhanced lesson structure with additional fields for scope, snippets, and provenances.
- Updated command parsing to include lesson acceptance and rejection commands.
- Improved session state management with staleness sweeps and retrospective creation.
- Enhanced UI to display detailed usage statistics and quality trends.
This commit is contained in:
asepharyana
2026-07-11 21:06:22 +07:00
parent fe82840c03
commit 2ded2d8bf1
9 changed files with 780 additions and 19 deletions
+32 -10
View File
@@ -539,43 +539,65 @@ fn render_overlay(frame: &mut Frame, area: Rect, overlay: crate::app::state::typ
}
crate::app::state::types::Overlay::Usage => {
let block = block.title(" Usage ");
let (tokens_in, tokens_out, api_calls, review_tokens, session_start) = state.session_runtime.as_ref().map(|r| {
let runtime = state.session_runtime.as_ref();
let (tokens_in, tokens_out, api_calls, review_tokens, session_start) = runtime.map(|r| {
(r.usage.tokens_in, r.usage.tokens_out, r.usage.api_calls, r.usage.review_tokens, r.session_start)
}).unwrap_or((0, 0, 0, 0, 0));
let (edit_count, lesson_count, review_count, consec_empty) = runtime.map(|r| {
(r.edit_count, r.lesson_count, r.review_count, r.consecutive_empty_reviews)
}).unwrap_or((0, 0, 0, 0));
let elapsed_ms = chrono::Utc::now().timestamp_millis().saturating_sub(session_start);
let hours = elapsed_ms / 3600000;
let minutes = (elapsed_ms % 3600000) / 60000;
let seconds = (elapsed_ms % 60000) / 1000;
let total_tokens = tokens_in.saturating_add(tokens_out);
let self_learning_total = review_tokens;
let main_tokens = total_tokens.saturating_sub(self_learning_total);
let lines = vec![
Line::from(Span::styled(
"Usage Dashboard",
Style::default().fg(Theme::PRIMARY).add_modifier(Modifier::BOLD),
)),
Line::from(Span::styled("", Style::default())),
Line::from(Span::styled("── Token Usage ──", Style::default().fg(Theme::DIM))),
Line::from(Span::styled(
format!("Tokens in: {}", tokens_in),
format!(" Main agent tokens: {}", main_tokens),
Style::default().fg(Theme::TEXT),
)),
Line::from(Span::styled(
format!("Tokens out: {}", tokens_out),
Style::default().fg(Theme::TEXT),
)),
Line::from(Span::styled(
format!("Total tokens: {}", total_tokens),
format!(" Self-learning tokens: {}", self_learning_total),
Style::default().fg(Theme::INFO),
)),
Line::from(Span::styled(
format!(" Total tokens: {}", total_tokens),
Style::default().fg(Theme::INFO).add_modifier(Modifier::BOLD),
)),
Line::from(Span::styled(
format!(" API calls: {}", api_calls),
Style::default().fg(Theme::TEXT),
)),
Line::from(Span::styled("", Style::default())),
Line::from(Span::styled("── Quality Trends ──", Style::default().fg(Theme::DIM))),
Line::from(Span::styled(
format!("API calls: {}", api_calls),
format!(" Edits this session: {}", edit_count),
Style::default().fg(Theme::TEXT),
)),
Line::from(Span::styled(
format!("Review tokens: {}", review_tokens),
format!(" Reviews completed: {}", review_count),
Style::default().fg(Theme::TEXT),
)),
Line::from(Span::styled(
format!(" Lessons found: {}", lesson_count),
Style::default().fg(Theme::INFO),
)),
Line::from(Span::styled(
format!("Session time: {}h {}m {}s", hours, minutes, seconds),
format!(" Consecutive empty revs: {}", consec_empty),
Style::default().fg(if consec_empty > 3 { Theme::WARNING } else { Theme::DIM }),
)),
Line::from(Span::styled("", Style::default())),
Line::from(Span::styled("── Session ──", Style::default().fg(Theme::DIM))),
Line::from(Span::styled(
format!(" Duration: {}h {}m {}s", hours, minutes, seconds),
Style::default().fg(Theme::DIM),
)),
];