@@ -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+
36963734fn 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