Skip to content

Commit e8b456f

Browse files
committed
fix(tui): trust curated subscription catalog
1 parent a69a480 commit e8b456f

2 files changed

Lines changed: 26 additions & 12 deletions

File tree

crates/jcode-tui/src/tui/app/inline_interactive.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ impl App {
562562
&self,
563563
routes: &mut Vec<crate::provider::ModelRoute>,
564564
require_credentials: bool,
565+
require_remote_advertisement: bool,
565566
) {
566567
if require_credentials && !crate::subscription_catalog::has_credentials() {
567568
return;
@@ -582,9 +583,11 @@ impl App {
582583
.filter(|model| {
583584
tier.allows(model.min_tier)
584585
&& !existing.contains(model.id)
585-
&& self.remote_available_entries.iter().any(|available| {
586-
crate::subscription_catalog::canonical_model_id(available) == Some(model.id)
587-
})
586+
&& (!require_remote_advertisement
587+
|| self.remote_available_entries.iter().any(|available| {
588+
crate::subscription_catalog::canonical_model_id(available)
589+
== Some(model.id)
590+
}))
588591
})
589592
{
590593
routes.push(crate::provider::ModelRoute {
@@ -613,10 +616,8 @@ impl App {
613616
name.eq_ignore_ascii_case(crate::subscription_catalog::JCODE_PROVIDER_DISPLAY_NAME)
614617
});
615618
if provider_is_jcode_subscription {
616-
*routes = crate::provider::remote_model_routes_fallback(
617-
Some(crate::subscription_catalog::JCODE_PROVIDER_DISPLAY_NAME),
618-
&self.remote_available_entries,
619-
);
619+
routes.clear();
620+
self.append_jcode_subscription_routes(routes, false, false);
620621
return;
621622
}
622623
let poisoned_by_jcode_subscription = !routes.is_empty()
@@ -634,7 +635,7 @@ impl App {
634635
self.remote_provider_name.as_deref(),
635636
&self.remote_available_entries,
636637
);
637-
self.append_jcode_subscription_routes(routes, false);
638+
self.append_jcode_subscription_routes(routes, false, true);
638639
return;
639640
}
640641
let mut methods_by_model: std::collections::HashMap<&str, HashSet<&str>> =
@@ -694,7 +695,10 @@ impl App {
694695
// Detailed provider hydration describes ordinary configured routes. A
695696
// signed-in Jcode subscriber still needs the managed route for each
696697
// entitled curated model alongside those Anthropic/OpenAI/etc. rows.
697-
self.append_jcode_subscription_routes(routes, true);
698+
// The curated client catalog is versioned with the backend and is the
699+
// authority for managed subscription entitlements. Do not hide newly
700+
// launched subscription models behind a stale remote names snapshot.
701+
self.append_jcode_subscription_routes(routes, true, false);
698702
}
699703

700704
fn hydrate_remote_model_catalog_snapshot(

crates/jcode-tui/src/tui/app/tests/remote_startup_input_02/part_01.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ fn test_remote_jcode_subscription_catalog_is_not_augmented_with_local_auth_route
413413
}
414414
crate::auth::AuthStatus::invalidate_cache();
415415

416-
assert_eq!(app.remote_model_options.len(), 3);
416+
assert_eq!(app.remote_model_options.len(), 7);
417417
assert!(app.remote_model_options.iter().all(|route| {
418418
route.provider == crate::subscription_catalog::JCODE_PROVIDER_DISPLAY_NAME
419419
&& route.api_method == crate::subscription_catalog::JCODE_ROUTE_API_METHOD
@@ -596,16 +596,20 @@ fn test_remote_hydrated_catalog_adds_entitled_jcode_subscription_routes() {
596596
&& route.api_method == crate::subscription_catalog::JCODE_ROUTE_API_METHOD
597597
})
598598
.collect::<Vec<_>>();
599-
assert_eq!(jcode_routes.len(), 3);
599+
assert_eq!(jcode_routes.len(), 7);
600600
assert_eq!(
601601
jcode_routes
602602
.iter()
603603
.map(|route| route.model.as_str())
604604
.collect::<std::collections::BTreeSet<_>>(),
605605
std::collections::BTreeSet::from([
606606
"claude-opus-4-8",
607+
"claude-sonnet-4-6",
608+
"deepseek-v3.2",
609+
"devstral-2-123b",
607610
"gpt-5.5",
608611
"gpt-5.6-sol",
612+
"qwen3-coder-next",
609613
])
610614
);
611615
assert!(app.remote_model_options.iter().any(|route| {
@@ -622,7 +626,13 @@ fn test_remote_hydrated_catalog_adds_entitled_jcode_subscription_routes() {
622626
route.provider != crate::subscription_catalog::JCODE_PROVIDER_DISPLAY_NAME
623627
|| matches!(
624628
route.model.as_str(),
625-
"claude-opus-4-8" | "gpt-5.5" | "gpt-5.6-sol"
629+
"claude-opus-4-8"
630+
| "claude-sonnet-4-6"
631+
| "deepseek-v3.2"
632+
| "devstral-2-123b"
633+
| "gpt-5.5"
634+
| "gpt-5.6-sol"
635+
| "qwen3-coder-next"
626636
)
627637
}));
628638
});

0 commit comments

Comments
 (0)