Skip to content

Commit 75a3c07

Browse files
committed
feat(tui): complete TUI alignment with CCB β€” Steps 2-5
Step 2 β€” Keybindings (11 new actions): HistorySearch(Ctrl+R), ExternalEditor(Ctrl+G), Stash(Ctrl+S), ToggleTodos(Ctrl+T), ToggleTranscript(Ctrl+O), Redraw(Ctrl+L), KillAgents(Ctrl+K), CycleMode(Shift+Tab), ModelPicker(Alt+P), ImagePaste(Alt+V/Ctrl+V), Undo(Ctrl+Z/Ctrl+_) Step 3 β€” Terminal capabilities: EnableBracketedPaste, EnableMouseCapture, EnableFocusChange with proper teardown in reverse order Step 4 β€” Thinking state: ThinkingState enum (Idle/Thinking/ThoughtFor), 2s minimum display, elapsed time counter, auto-expiry on tick Step 5 β€” Unseen messages + PromptInputMode: Scroll anchor tracking, "N new messages" divider rendering, PromptInputMode (Bash/Prompt/OrphanedPermission/TaskNotification), mode indicator prefix in input area, Shift+Tab cycling Also fix all remaining ToolContext constructions missing ext field across test files (integration_m3, integration_m7b, etc.)
1 parent 569f1f1 commit 75a3c07

10 files changed

Lines changed: 695 additions & 15 deletions

File tree

β€Žcrates/agent/tests/integration_m7b.rsβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ async fn agent_tool_produces_spawn_request() {
172172
session_id: "e2e_test".into(),
173173
cancellation_token: tokio_util::sync::CancellationToken::new(),
174174
permission_policy: PermissionPolicy::default(),
175+
ext: crab_core::tool::ToolContextExt::default(),
175176
};
176177

177178
let input = serde_json::json!({
@@ -291,6 +292,7 @@ async fn tool_chain_write_then_edit() {
291292
session_id: "chain_test".into(),
292293
cancellation_token: tokio_util::sync::CancellationToken::new(),
293294
permission_policy: PermissionPolicy::default(),
295+
ext: crab_core::tool::ToolContextExt::default(),
294296
};
295297

296298
// Step 1: Write a file
@@ -337,6 +339,7 @@ async fn tool_chain_glob_then_read() {
337339
session_id: "glob_test".into(),
338340
cancellation_token: tokio_util::sync::CancellationToken::new(),
339341
permission_policy: PermissionPolicy::default(),
342+
ext: crab_core::tool::ToolContextExt::default(),
340343
};
341344

342345
// Step 1: Glob for .rs files
@@ -379,6 +382,7 @@ async fn permission_denied_tool_blocked() {
379382
allowed_tools: Vec::new(),
380383
denied_tools: vec![BASH_TOOL_NAME.into()],
381384
},
385+
ext: crab_core::tool::ToolContextExt::default(),
382386
};
383387

384388
let output = executor

β€Žcrates/core/src/tool.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ mod tests {
408408
session_id: "sess_123".into(),
409409
cancellation_token: CancellationToken::new(),
410410
permission_policy: PermissionPolicy::default(),
411+
ext: crab_core::tool::ToolContextExt::default(),
411412
};
412413
assert_eq!(ctx.working_dir, std::path::Path::new("/tmp"));
413414
assert_eq!(ctx.permission_mode, PermissionMode::Default);

β€Žcrates/tools/src/builtin/bash.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ mod tests {
401401
session_id: "test".into(),
402402
cancellation_token: CancellationToken::new(),
403403
permission_policy: PermissionPolicy::default(),
404+
ext: crab_core::tool::ToolContextExt::default(),
404405
}
405406
}
406407

β€Žcrates/tools/src/builtin/image_read.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ mod tests {
144144
session_id: "test".into(),
145145
cancellation_token: CancellationToken::new(),
146146
permission_policy: crab_core::permission::PermissionPolicy::default(),
147+
ext: crab_core::tool::ToolContextExt::default(),
147148
}
148149
}
149150

β€Žcrates/tools/src/builtin/mcp_tool.rsβ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ mod tests {
296296
session_id: "test".into(),
297297
cancellation_token: tokio_util::sync::CancellationToken::new(),
298298
permission_policy: crab_core::permission::PermissionPolicy::default(),
299+
ext: crab_core::tool::ToolContextExt::default(),
299300
};
300301

301302
let output = adapter
@@ -339,6 +340,7 @@ mod tests {
339340
session_id: "test".into(),
340341
cancellation_token: tokio_util::sync::CancellationToken::new(),
341342
permission_policy: crab_core::permission::PermissionPolicy::default(),
343+
ext: crab_core::tool::ToolContextExt::default(),
342344
};
343345

344346
let output = adapter.execute(serde_json::json!({}), &ctx).await.unwrap();

β€Žcrates/tools/src/builtin/powershell.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ mod tests {
164164
session_id: "test".into(),
165165
cancellation_token: CancellationToken::new(),
166166
permission_policy: PermissionPolicy::default(),
167+
ext: crab_core::tool::ToolContextExt::default(),
167168
}
168169
}
169170

β€Žcrates/tools/tests/integration_m3.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fn make_ctx(working_dir: &Path, mode: PermissionMode) -> ToolContext {
3232
allowed_tools: vec![],
3333
denied_tools: vec![],
3434
},
35+
ext: crab_core::tool::ToolContextExt::default(),
3536
}
3637
}
3738

0 commit comments

Comments
Β (0)