Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e2e2134
feat: add full-text session search to project view
Mar 13, 2026
3cb95d6
fix: address code review findings for session search
Mar 13, 2026
f732b22
fix: address review pass 2 - spawn_blocking, path validation, stale r…
Mar 13, 2026
a31ff9e
fix: address review pass 3 - input validation and error fallback
Mar 13, 2026
ca3282b
fix: address review pass 4 - a11y, project switch, page reset, API en…
Mar 13, 2026
5a25655
fix: address review pass 5 - a11y, state reset, cross-platform valida…
Mar 13, 2026
2eafdc2
fix: address review pass 6 - result cap, canonical path, skip stale s…
Mar 13, 2026
11db48e
fix: address review pass 7 - canonical validation, truncate after sort
Mar 13, 2026
9b4d22f
fix: address review pass 8 - TOCTOU, pagination clamp, blank query pa…
Mar 13, 2026
9e60ba3
fix: wrap search status in aria-live region for screen readers
Mar 13, 2026
8575f75
feat: add accordion search results with highlighted matching snippets
Mar 13, 2026
de5724f
fix: accordion accessibility and symlink hardening
Mar 13, 2026
5a16c37
fix: Unicode-safe highlighting, deduplicate click paths
Mar 13, 2026
3070670
fix: preserve original casing in search snippets
Mar 13, 2026
f4fda21
fix: prevent search view flicker during query transitions
Mar 13, 2026
a0c3796
fix: use debouncedQuery for search-active state to prevent blank-out
Mar 13, 2026
7215007
fix: require minimum 2-char query to avoid expensive single-char scans
Mar 13, 2026
571bf76
fix: match frontend 2-char minimum with backend to prevent blank grid
Mar 13, 2026
8f5fdbe
feat: add open session and copy resume command buttons to accordion h…
Mar 13, 2026
a2db8eb
fix: debounce-aware search mode toggle and async clipboard write
Mar 13, 2026
46d52d8
fix: skip bad session files gracefully instead of aborting search
Mar 13, 2026
3f19b57
fix: prevent blank flash when clearing search or switching projects
Mar 13, 2026
f2a21b0
fix: update search placeholder to reflect project scope
Mar 13, 2026
3a0e40b
fix: normalize search query once and reuse for search and highlighting
Mar 13, 2026
5a9b73c
fix: use non-absolute result count wording for search results
Mar 13, 2026
15c1fda
style: apply cargo fmt formatting
Mar 13, 2026
0ef6d23
feat: add search operators (AND, OR, NOT, exact phrase)
Mar 13, 2026
5464dd5
fix: treat AND as explicit operator instead of literal search term
Mar 13, 2026
b3e38f9
feat: add global cross-project session search to projects view
Mar 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
style: apply cargo fmt formatting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • Loading branch information
Jose Monteiro and claude committed Mar 13, 2026
commit 15c1fda15715fba481755283b4af65fad94eefec
12 changes: 10 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 8 additions & 9 deletions src-tauri/src/commands/claude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -589,8 +589,7 @@ fn extract_matching_snippets(jsonl_path: &PathBuf, query_lower: &str) -> Vec<Str
if let Some(content) = message.content {
// Find matches by comparing chars case-insensitively
// to preserve original casing in snippets
let chars_orig: Vec<(usize, char)> =
content.char_indices().collect();
let chars_orig: Vec<(usize, char)> = content.char_indices().collect();
let query_chars: Vec<char> = query_lower.chars().collect();
let mut ci = 0;
while ci + query_chars.len() <= chars_orig.len() {
Expand All @@ -600,9 +599,7 @@ fn extract_matching_snippets(jsonl_path: &PathBuf, query_lower: &str) -> Vec<Str
let matched = chars_orig[ci..ci + query_chars.len()]
.iter()
.zip(&query_chars)
.all(|((_, c), q)| {
c.to_lowercase().eq(q.to_lowercase())
});
.all(|((_, c), q)| c.to_lowercase().eq(q.to_lowercase()));
if matched {
// Context window in chars
let ctx_start_ci = ci.saturating_sub(CONTEXT_CHARS);
Expand Down Expand Up @@ -671,9 +668,7 @@ pub async fn search_project_sessions(
let project_dir = projects_dir.join(&project_id);

// Verify resolved path stays under the projects root
let canonical_projects_dir = projects_dir
.canonicalize()
.map_err(|e| e.to_string())?;
let canonical_projects_dir = projects_dir.canonicalize().map_err(|e| e.to_string())?;
let canonical_project_dir = project_dir
.canonicalize()
.map_err(|_| format!("Project directory not found: {}", project_id))?;
Expand Down Expand Up @@ -708,7 +703,11 @@ pub async fn search_project_sessions(
let file_type = match entry.file_type() {
Ok(ft) => ft,
Err(e) => {
log::warn!("Skipping entry with unreadable type {:?}: {}", entry.path(), e);
log::warn!(
"Skipping entry with unreadable type {:?}: {}",
entry.path(),
e
);
continue;
}
};
Expand Down
6 changes: 3 additions & 3 deletions src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ use commands::claude::{
clear_checkpoint_manager, continue_claude_code, create_checkpoint, create_project,
execute_claude_code, find_claude_md_files, fork_from_checkpoint, get_checkpoint_diff,
get_checkpoint_settings, get_checkpoint_state_stats, get_claude_session_output,
get_claude_settings, get_home_directory, get_hooks_config, get_project_sessions, search_project_sessions,
get_claude_settings, get_home_directory, get_hooks_config, get_project_sessions,
get_recently_modified_files, get_session_timeline, get_system_prompt, list_checkpoints,
list_directory_contents, list_projects, list_running_claude_sessions, load_session_history,
open_new_session, read_claude_md_file, restore_checkpoint, resume_claude_code,
save_claude_md_file, save_claude_settings, save_system_prompt, search_files,
track_checkpoint_message, track_session_messages, update_checkpoint_settings,
update_hooks_config, validate_hook_command, ClaudeProcessState,
search_project_sessions, track_checkpoint_message, track_session_messages,
update_checkpoint_settings, update_hooks_config, validate_hook_command, ClaudeProcessState,
};
use commands::mcp::{
mcp_add, mcp_add_from_claude_desktop, mcp_add_json, mcp_get, mcp_get_server_status, mcp_list,
Expand Down
5 changes: 4 additions & 1 deletion src-tauri/src/web_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,10 @@ pub async fn create_web_server(port: u16) -> Result<(), Box<dyn std::error::Erro
// API routes (REST API equivalent of Tauri commands)
.route("/api/projects", get(get_projects))
.route("/api/projects/{project_id}/sessions", get(get_sessions))
.route("/api/projects/{project_id}/sessions/search", get(search_sessions))
.route(
"/api/projects/{project_id}/sessions/search",
get(search_sessions),
)
.route("/api/agents", get(get_agents))
.route("/api/usage", get(get_usage))
// Settings and configuration
Expand Down