Skip to content

Commit 5166c47

Browse files
committed
Disambiguate compact Codex session ids
1 parent 7cfd843 commit 5166c47

1 file changed

Lines changed: 91 additions & 3 deletions

File tree

src/ai.rs

Lines changed: 91 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3693,6 +3693,44 @@ fn display_session_id(session_id: &str) -> String {
36933693
truncate_recover_id(session_id)
36943694
}
36953695

3696+
fn display_session_ids(rows: &[ProviderSessionListRow]) -> HashMap<String, String> {
3697+
let mut prefix_counts: HashMap<String, usize> = HashMap::new();
3698+
for row in rows {
3699+
let mut prefix = String::new();
3700+
for (index, ch) in row.id.chars().enumerate() {
3701+
prefix.push(ch);
3702+
if index + 1 >= 8 {
3703+
*prefix_counts.entry(prefix.clone()).or_insert(0) += 1;
3704+
}
3705+
}
3706+
}
3707+
3708+
let mut display = HashMap::with_capacity(rows.len());
3709+
for row in rows {
3710+
if row.id.chars().count() <= 8 {
3711+
display.insert(row.id.clone(), row.id.clone());
3712+
continue;
3713+
}
3714+
3715+
let mut prefix = String::new();
3716+
let mut candidate = row.id.clone();
3717+
for (index, ch) in row.id.chars().enumerate() {
3718+
prefix.push(ch);
3719+
if index + 1 < 8 {
3720+
continue;
3721+
}
3722+
candidate = prefix.clone();
3723+
if prefix_counts.get(&candidate).copied().unwrap_or(0) <= 1 {
3724+
break;
3725+
}
3726+
}
3727+
3728+
display.insert(row.id.clone(), candidate);
3729+
}
3730+
3731+
display
3732+
}
3733+
36963734
fn clean_summary_tail(s: &str) -> String {
36973735
let meaningful_line = s
36983736
.lines()
@@ -5069,6 +5107,7 @@ fn print_provider_session_listing(
50695107
}
50705108
})
50715109
.collect();
5110+
let display_ids = display_session_ids(&rows);
50725111

50735112
if json {
50745113
println!(
@@ -5098,10 +5137,15 @@ fn print_provider_session_listing(
50985137
.max("updated".len());
50995138
let id_width = rows
51005139
.iter()
5101-
.map(|row| display_session_id(&row.id).chars().count())
5140+
.map(|row| {
5141+
display_ids
5142+
.get(&row.id)
5143+
.map(|value| value.chars().count())
5144+
.unwrap_or_else(|| display_session_id(&row.id).chars().count())
5145+
})
51025146
.max()
51035147
.unwrap_or(10)
5104-
.min(8)
5148+
.min(36)
51055149
.max(2);
51065150

51075151
println!(
@@ -5118,7 +5162,10 @@ fn print_provider_session_listing(
51185162
"{:>index_width$} {:<updated_width$} {:<id_width$} {}",
51195163
row.index,
51205164
row.updated_relative,
5121-
display_session_id(&row.id),
5165+
display_ids
5166+
.get(&row.id)
5167+
.map(String::as_str)
5168+
.unwrap_or(row.id.as_str()),
51225169
truncate_str(&row.preview, 90),
51235170
index_width = index_width,
51245171
updated_width = updated_width,
@@ -16206,6 +16253,47 @@ values (?1, ?2, ?3, ?4, ?5, ?6, 0)
1620616253
assert_eq!(display_session_id("short"), "short");
1620716254
}
1620816255

16256+
#[test]
16257+
fn display_session_ids_extend_prefixes_only_when_needed() {
16258+
let rows = vec![
16259+
ProviderSessionListRow {
16260+
index: 1,
16261+
updated_relative: "now".to_string(),
16262+
updated_at: None,
16263+
id: "019d3a66-219d-7a03-a91e-cd3de17ffeca".to_string(),
16264+
preview: "first".to_string(),
16265+
},
16266+
ProviderSessionListRow {
16267+
index: 2,
16268+
updated_relative: "1h".to_string(),
16269+
updated_at: None,
16270+
id: "019d3a66-f3ae-7801-a8d2-7d505d8c8627".to_string(),
16271+
preview: "second".to_string(),
16272+
},
16273+
ProviderSessionListRow {
16274+
index: 3,
16275+
updated_relative: "2h".to_string(),
16276+
updated_at: None,
16277+
id: "019d3b29-d5b9-75c1-b69b-3136abc3d922".to_string(),
16278+
preview: "third".to_string(),
16279+
},
16280+
];
16281+
16282+
let display = display_session_ids(&rows);
16283+
assert_eq!(
16284+
display.get("019d3b29-d5b9-75c1-b69b-3136abc3d922"),
16285+
Some(&"019d3b29".to_string())
16286+
);
16287+
assert_eq!(
16288+
display.get("019d3a66-219d-7a03-a91e-cd3de17ffeca"),
16289+
Some(&"019d3a66-2".to_string())
16290+
);
16291+
assert_eq!(
16292+
display.get("019d3a66-f3ae-7801-a8d2-7d505d8c8627"),
16293+
Some(&"019d3a66-f".to_string())
16294+
);
16295+
}
16296+
1620916297
#[test]
1621016298
fn clean_summary_tail_prefers_last_meaningful_line() {
1621116299
let summary = "Plan:\n- check status\n}\n\nVerification: passed";

0 commit comments

Comments
 (0)