Hmbown/CodeWhale · error

selected Fleet ' ' operator provider ' ' is unavailable

Error message

selected Fleet '{}' operator provider '{}' is unavailable: {}

What it means

Thrown when the selected Fleet's operator route names a provider that `resolve_provider_pin_identity` cannot resolve in the current configuration. The fleet expects a provider that is not configured (no matching provider entry/credentials), so the operator route cannot be pinned. Provider and model ids are sanitized via `SafeLabel` before inclusion in the message.

Solutions

  1. Add or restore the named provider (and its credentials) to the active config.
  2. Edit the fleet's operator route to reference an existing provider id.
  3. Run /fleet and re-select a fleet whose operator provider matches your config.
  4. Check for provider-id typos or renamed ids after a config migration.
Defensive patterns

Strategy: validation

Validate before calling

// verify the operator provider exists in config before selecting the fleet
let provider_ok = config.providers.iter().any(|p| p.id == fleet.operator.provider);

Prevention

When it happens

Trigger: A turn starts with a selected Fleet whose `operator.provider` id has no matching provider in the active config, or whose identity resolution fails (e.g. missing API key entry for that provider).

Common situations: Renaming or removing a provider in config while a fleet still pins the old id; switching machines/config profiles without the provider's credentials; a provider id typo in the fleet definition.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/1d3a9570d4297946. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/lib.rs:8334

    })?;
    let Some(operator) = fleet.operator.as_ref() else {
        return Ok(false);
    };
    let provider_id = operator.provider.trim();
    let model_id = operator.model.trim();
    if provider_id.is_empty() || model_id.is_empty() {
        bail!(
            "selected Fleet '{}' has an incomplete operator route; provider and model must both be non-empty",
            fleet_name
        );
    }
    let safe_provider_id = crate::safe_label::SafeLabel::identifier(provider_id);
    let safe_model_id = crate::safe_label::SafeLabel::catalog_model(model_id);

    let identity = config
        .resolve_provider_pin_identity(provider_id)
        .map_err(|error| {
            anyhow!(
                "selected Fleet '{}' operator provider '{}' is unavailable: {}",
                fleet_name,
                safe_provider_id,
                crate::safe_label::safe_error_text(&error)
            )
        })?;
    let resolved =
        crate::route_runtime::resolve_runtime_route_for_identity(config, &identity, Some(model_id))
            .map_err(|error| {
                anyhow!(
                    "selected Fleet '{}' operator route {}/{} is invalid: {}",
                    fleet_name,
                    safe_provider_id,
                    safe_model_id,
                    crate::safe_label::safe_error_text(&error)
                )
            })?;
    let mut selected_config = *resolved.config;

View on GitHub (pinned to 73e0f67d83)