Skip to content

Commit 10a1140

Browse files
bennetboas-cii
andauthored
acp: Improve matching logic when adding new entry to agent_servers (#36926)
Release Notes: - N/A --------- Co-authored-by: Antonio Scandurra <[email protected]>
1 parent e96b68b commit 10a1140

File tree

1 file changed

+59
-18
lines changed

1 file changed

+59
-18
lines changed

crates/agent_ui/src/agent_configuration.rs

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod configure_context_server_modal;
33
mod manage_profiles_modal;
44
mod tool_picker;
55

6-
use std::{sync::Arc, time::Duration};
6+
use std::{ops::Range, sync::Arc, time::Duration};
77

88
use agent_servers::{AgentServerCommand, AgentServerSettings, AllAgentServersSettings, Gemini};
99
use agent_settings::AgentSettings;
@@ -1378,8 +1378,9 @@ async fn open_new_agent_servers_entry_in_settings_editor(
13781378

13791379
let settings = cx.global::<SettingsStore>();
13801380

1381+
let mut unique_server_name = None;
13811382
let edits = settings.edits_for_update::<AllAgentServersSettings>(&text, |file| {
1382-
let unique_server_name = (0..u8::MAX)
1383+
let server_name: Option<SharedString> = (0..u8::MAX)
13831384
.map(|i| {
13841385
if i == 0 {
13851386
"your_agent".into()
@@ -1388,7 +1389,8 @@ async fn open_new_agent_servers_entry_in_settings_editor(
13881389
}
13891390
})
13901391
.find(|name| !file.custom.contains_key(name));
1391-
if let Some(server_name) = unique_server_name {
1392+
if let Some(server_name) = server_name {
1393+
unique_server_name = Some(server_name.clone());
13921394
file.custom.insert(
13931395
server_name,
13941396
AgentServerSettings {
@@ -1402,22 +1404,61 @@ async fn open_new_agent_servers_entry_in_settings_editor(
14021404
}
14031405
});
14041406

1405-
if !edits.is_empty() {
1406-
let ranges = edits
1407-
.iter()
1408-
.map(|(range, _)| range.clone())
1409-
.collect::<Vec<_>>();
1410-
1411-
item.edit(edits, cx);
1407+
if edits.is_empty() {
1408+
return;
1409+
}
14121410

1413-
item.change_selections(
1414-
SelectionEffects::scroll(Autoscroll::newest()),
1415-
window,
1416-
cx,
1417-
|selections| {
1418-
selections.select_ranges(ranges);
1419-
},
1420-
);
1411+
let ranges = edits
1412+
.iter()
1413+
.map(|(range, _)| range.clone())
1414+
.collect::<Vec<_>>();
1415+
1416+
item.edit(edits, cx);
1417+
if let Some((unique_server_name, buffer)) =
1418+
unique_server_name.zip(item.buffer().read(cx).as_singleton())
1419+
{
1420+
let snapshot = buffer.read(cx).snapshot();
1421+
if let Some(range) =
1422+
find_text_in_buffer(&unique_server_name, ranges[0].start, &snapshot)
1423+
{
1424+
item.change_selections(
1425+
SelectionEffects::scroll(Autoscroll::newest()),
1426+
window,
1427+
cx,
1428+
|selections| {
1429+
selections.select_ranges(vec![range]);
1430+
},
1431+
);
1432+
}
14211433
}
14221434
})
14231435
}
1436+
1437+
fn find_text_in_buffer(
1438+
text: &str,
1439+
start: usize,
1440+
snapshot: &language::BufferSnapshot,
1441+
) -> Option<Range<usize>> {
1442+
let chars = text.chars().collect::<Vec<char>>();
1443+
1444+
let mut offset = start;
1445+
let mut char_offset = 0;
1446+
for c in snapshot.chars_at(start) {
1447+
if char_offset >= chars.len() {
1448+
break;
1449+
}
1450+
offset += 1;
1451+
1452+
if c == chars[char_offset] {
1453+
char_offset += 1;
1454+
} else {
1455+
char_offset = 0;
1456+
}
1457+
}
1458+
1459+
if char_offset == chars.len() {
1460+
Some(offset.saturating_sub(chars.len())..offset)
1461+
} else {
1462+
None
1463+
}
1464+
}

0 commit comments

Comments
 (0)