| 1 | /// #5038: a pinned model surfaces capability badges from the shared Fleet |
| 2 | /// resolver; members inheriting the session route omit the field, and an |
| 3 | /// unknown pinned model degrades to honest absence, never fabricated facts. |
| 4 | #[test] |
| 5 | fn detail_shows_capability_badges_for_pinned_models_only() { |
| 6 | fn detail_text(member: &AgentProfile) -> String { |
| 7 | member_detail_lines_with_session(member, None, &[]) |
| 8 | .iter() |
| 9 | .map(|line| { |
| 10 | line.spans |
| 11 | .iter() |
| 12 | .map(|span| span.content.clone().into_owned()) |
| 13 | .collect::<String>() |
| 14 | }) |
| 15 | .collect::<Vec<_>>() |
| 16 | .join("\n") |
| 17 | } |
| 18 | |
| 19 | // Pinned known model (glm-5.2, no provider): registry facts. |
| 20 | let view = view_with_overrides(); |
| 21 | let reviewer = view.members.iter().find(|m| m.id == "reviewer").unwrap(); |
| 22 | let text = detail_text(reviewer); |
| 23 | assert!(text.contains("Capabilities"), "{text}"); |
| 24 | assert!(text.contains("1M ctx"), "{text}"); |
| 25 | assert!(text.contains("(registry)"), "{text}"); |
| 26 | |
| 27 | // Inheriting member: no pinned model, no capabilities field. |
| 28 | let scout = FleetRoster::built_ins_only().get("scout").unwrap().clone(); |
| 29 | assert!(!detail_text(&scout).contains("Capabilities")); |
| 30 | |
| 31 | // Unknown pinned model: the field is omitted rather than guessed. |
| 32 | let mut unknown = reviewer.clone(); |
| 33 | unknown.profile.model = Some("totally-made-up-model-xyz".to_string()); |
| 34 | let text = detail_text(&unknown); |
| 35 | assert!(!text.contains("Capabilities"), "{text}"); |
| 36 | assert!( |
| 37 | text.contains("model totally-made-up-model-xyz (pinned)"), |
| 38 | "{text}" |
| 39 | ); |
| 40 | } |
| 41 | |
| 42 | /// #5038: the pinned operator row names its session model's capabilities. |
| 43 | #[test] |
| 44 | fn operator_detail_surfaces_session_model_capabilities() { |
| 45 | let text = operator_detail_lines(&operator()) |
| 46 | .iter() |
| 47 | .map(|line| { |
| 48 | line.spans |
| 49 | .iter() |
| 50 | .map(|span| span.content.clone().into_owned()) |
| 51 | .collect::<String>() |
| 52 | }) |
| 53 | .collect::<Vec<_>>() |
| 54 | .join("\n"); |
| 55 | assert!(text.contains("Capabilities"), "{text}"); |
| 56 | assert!(text.contains("1M ctx"), "{text}"); |
| 57 | assert!(text.contains("tools"), "{text}"); |
| 58 | assert!( |
| 59 | text.contains("catalog"), |
| 60 | "operator should use provider-scoped catalog facts: {text}" |
| 61 | ); |
| 62 | } |
| 63 |