(featureId: RuntimeFeatureId)
| 372 | } |
| 373 | |
| 374 | export function isFeatureAvailable(featureId: RuntimeFeatureId): boolean { |
| 375 | if (!isFeatureEnabled(featureId)) return false; |
| 376 | |
| 377 | // Cloud/web deployments validate credentials server-side. |
| 378 | // Desktop runtime validates local secrets client-side for capability gating. |
| 379 | if (!isDesktopRuntime()) { |
| 380 | return true; |
| 381 | } |
| 382 | |
| 383 | const feature = RUNTIME_FEATURES.find(item => item.id === featureId); |
| 384 | if (!feature) return false; |
| 385 | const secrets = feature.desktopRequiredSecrets ?? feature.requiredSecrets; |
| 386 | return secrets.every(secretKey => getSecretState(secretKey).valid); |
| 387 | } |
| 388 | |
| 389 | export function getEffectiveSecrets(feature: RuntimeFeatureDefinition): RuntimeSecretKey[] { |
| 390 | return (isDesktopRuntime() && feature.desktopRequiredSecrets) ? feature.desktopRequiredSecrets : feature.requiredSecrets; |
no test coverage detected