diff --git a/src/features/localization/renderer/locales/en/settings.json b/src/features/localization/renderer/locales/en/settings.json
index e9b1876b..2e8e2e23 100644
--- a/src/features/localization/renderer/locales/en/settings.json
+++ b/src/features/localization/renderer/locales/en/settings.json
@@ -55,16 +55,24 @@
"emptyRecommended": "No recommended models found.",
"emptyRecommendedFree": "No recommended free models found.",
"freeOnly": "Free only",
- "launchableDescription": "Routes you can test or use in the team picker: local config, free built-in models, and current default.",
- "launchableTitle": "Launchable OpenCode models",
+ "launchableDescription": "Known routes from OpenCode config, free built-in models, and the current default. Local routes need a successful test before they are ready for team launches.",
+ "launchableTitle": "OpenCode model routes",
"loadingRoutes": "Loading OpenCode model routes...",
"noRoutesMatch": "No OpenCode model routes match \"{{query}}\".",
- "noneReported": "No launchable OpenCode model routes were reported yet. Configure a local route in OpenCode or use the Providers tab to inspect catalog providers.",
+ "noneReported": "No OpenCode model routes were reported yet. Configure a local route in OpenCode or use the Providers tab to inspect catalog providers.",
"recommendedOnly": "Recommended only",
"searchPlaceholder": "Search models",
"selectProjectBeforeTesting": "Select a project context before testing models.",
"selectProjectBeforeTestingDefaults": "Select a project context before testing or saving OpenCode defaults.",
- "useInTeamPicker": "Use in team picker"
+ "testInProgress": "Model test is already running.",
+ "useInTeamPicker": "Save for team picker",
+ "validationContextRequired": "Select a validation context above to enable Test and Set default. Saving for team picker only stores the route for new teams.",
+ "actionsUnavailable": "Actions are temporarily unavailable.",
+ "defaultSaveInProgress": "OpenCode default is being saved.",
+ "routeUnavailableAuth": "This provider requires authentication before this model can be used.",
+ "routeUnavailableFailed": "This model route failed its last execution test.",
+ "routeUnavailableGeneric": "This model route cannot be used right now.",
+ "routeUnavailableUnknown": "This model is the current OpenCode default, but it is not available in the live catalog yet."
},
"providers": {
"catalog": "OpenCode provider catalog",
@@ -99,10 +107,11 @@
"searchPlaceholder": "Search model routes"
},
"badges": {
- "usedInTeamPicker": "Used in team picker",
+ "usedInTeamPicker": "Saved for team picker",
"free": "free",
"local": "local",
"configured": "configured",
+ "knownRoute": "known route",
"connected": "connected",
"verified": "verified",
"needsTest": "needs test",
diff --git a/src/features/localization/renderer/locales/ru/settings.json b/src/features/localization/renderer/locales/ru/settings.json
index 6e346b9f..7412d935 100644
--- a/src/features/localization/renderer/locales/ru/settings.json
+++ b/src/features/localization/renderer/locales/ru/settings.json
@@ -55,16 +55,24 @@
"emptyRecommended": "Recommended models не найдены.",
"emptyRecommendedFree": "Recommended free models не найдены.",
"freeOnly": "Только free",
- "launchableDescription": "Routes, которые можно тестировать или использовать в team picker: local config, free built-in models и текущий default.",
- "launchableTitle": "Launchable OpenCode models",
+ "launchableDescription": "Известные routes из OpenCode config, free built-in models и текущий default. Local routes нужно проверить тестом перед запуском команд.",
+ "launchableTitle": "Маршруты моделей OpenCode",
"loadingRoutes": "Загрузка OpenCode model routes...",
"noRoutesMatch": "OpenCode model routes не найдены по запросу \"{{query}}\".",
- "noneReported": "Launchable OpenCode model routes пока не получены. Настройте local route в OpenCode или используйте вкладку Providers для просмотра catalog providers.",
+ "noneReported": "OpenCode model routes пока не получены. Настройте local route в OpenCode или используйте вкладку Providers для просмотра catalog providers.",
"recommendedOnly": "Только recommended",
"searchPlaceholder": "Поиск моделей",
"selectProjectBeforeTesting": "Выберите project context перед тестированием моделей.",
"selectProjectBeforeTestingDefaults": "Выберите project context перед тестированием или сохранением OpenCode defaults.",
- "useInTeamPicker": "Использовать в team picker"
+ "testInProgress": "Тест модели уже выполняется.",
+ "useInTeamPicker": "Сохранить для team picker",
+ "validationContextRequired": "Выберите validation context выше, чтобы включить Test и Set default. Сохранение для team picker только запоминает route для новых команд.",
+ "actionsUnavailable": "Действия временно недоступны.",
+ "defaultSaveInProgress": "OpenCode default сохраняется.",
+ "routeUnavailableAuth": "Этому provider нужна авторизация перед использованием модели.",
+ "routeUnavailableFailed": "Этот model route не прошёл последний execution test.",
+ "routeUnavailableGeneric": "Этот model route сейчас нельзя использовать.",
+ "routeUnavailableUnknown": "Эта модель выбрана текущим OpenCode default, но её пока нет в live catalog."
},
"providers": {
"catalog": "OpenCode provider catalog",
@@ -99,10 +107,11 @@
"searchPlaceholder": "Поиск маршрутов моделей"
},
"badges": {
- "usedInTeamPicker": "Используется в выборе команды",
+ "usedInTeamPicker": "Сохранено для team picker",
"free": "free",
"local": "local",
"configured": "настроено",
+ "knownRoute": "известный route",
"connected": "подключено",
"verified": "проверено",
"needsTest": "нужен тест",
diff --git a/src/features/localization/renderer/resources.d.ts b/src/features/localization/renderer/resources.d.ts
index d3655fe9..2184f0c1 100644
--- a/src/features/localization/renderer/resources.d.ts
+++ b/src/features/localization/renderer/resources.d.ts
@@ -2852,10 +2852,11 @@ export default interface Resources {
default: 'default';
failed: 'failed';
free: 'free';
+ knownRoute: 'known route';
local: 'local';
needsTest: 'needs test';
unknown: 'unknown';
- usedInTeamPicker: 'Used in team picker';
+ usedInTeamPicker: 'Saved for team picker';
verified: 'verified';
};
compatibleEndpoint: {
@@ -2889,22 +2890,30 @@ export default interface Resources {
searchPlaceholder: 'Search model routes';
};
models: {
+ actionsUnavailable: 'Actions are temporarily unavailable.';
alreadyDefault: 'This is already the selected OpenCode default.';
+ defaultSaveInProgress: 'OpenCode default is being saved.';
empty: 'No models found.';
emptyFree: 'No free models found.';
emptyRecommended: 'No recommended models found.';
emptyRecommendedFree: 'No recommended free models found.';
freeOnly: 'Free only';
- launchableDescription: 'Routes you can test or use in the team picker: local config, free built-in models, and current default.';
- launchableTitle: 'Launchable OpenCode models';
+ launchableDescription: 'Known routes from OpenCode config, free built-in models, and the current default. Local routes need a successful test before they are ready for team launches.';
+ launchableTitle: 'OpenCode model routes';
loadingRoutes: 'Loading OpenCode model routes...';
noRoutesMatch: 'No OpenCode model routes match "{{query}}".';
- noneReported: 'No launchable OpenCode model routes were reported yet. Configure a local route in OpenCode or use the Providers tab to inspect catalog providers.';
+ noneReported: 'No OpenCode model routes were reported yet. Configure a local route in OpenCode or use the Providers tab to inspect catalog providers.';
recommendedOnly: 'Recommended only';
+ routeUnavailableAuth: 'This provider requires authentication before this model can be used.';
+ routeUnavailableFailed: 'This model route failed its last execution test.';
+ routeUnavailableGeneric: 'This model route cannot be used right now.';
+ routeUnavailableUnknown: 'This model is the current OpenCode default, but it is not available in the live catalog yet.';
searchPlaceholder: 'Search models';
selectProjectBeforeTesting: 'Select a project context before testing models.';
selectProjectBeforeTestingDefaults: 'Select a project context before testing or saving OpenCode defaults.';
- useInTeamPicker: 'Use in team picker';
+ testInProgress: 'Model test is already running.';
+ useInTeamPicker: 'Save for team picker';
+ validationContextRequired: 'Select a validation context above to enable Test and Set default. Saving for team picker only stores the route for new teams.';
};
providers: {
catalog: 'OpenCode provider catalog';
diff --git a/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx b/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx
index 7c475646..fddc58c8 100644
--- a/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx
+++ b/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx
@@ -14,6 +14,12 @@ import {
SelectValue,
} from '@renderer/components/ui/select';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@renderer/components/ui/tabs';
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from '@renderer/components/ui/tooltip';
import { cn } from '@renderer/lib/utils';
import {
compareOpenCodeTeamModelRecommendations,
@@ -212,6 +218,33 @@ function isDefaultForScope(
return scopedDefault === model.modelId;
}
+const DisabledActionTooltip = ({
+ reason,
+ children,
+}: {
+ readonly reason: string | undefined;
+ readonly children: JSX.Element;
+}): JSX.Element => {
+ if (!reason) {
+ return children;
+ }
+
+ return (
+