(
config: &BootstrapConfig,
auth_store: &HashMap<String, AuthInfo>,
)
| 2574 | } |
| 2575 | |
| 2576 | fn bootstrap_registry( |
| 2577 | config: &BootstrapConfig, |
| 2578 | auth_store: &HashMap<String, AuthInfo>, |
| 2579 | ) -> ProviderRegistry { |
| 2580 | let mut registry = ProviderRegistry::new(); |
| 2581 | |
| 2582 | let models_dev = load_models_dev_cache(); |
| 2583 | let state = ProviderBootstrapState::init(&models_dev, config, auth_store); |
| 2584 | |
| 2585 | for (provider_id, provider_state) in &state.providers { |
| 2586 | if let Some(provider) = create_concrete_provider(provider_id, provider_state) { |
| 2587 | let provider = wrap_provider_for_state(provider_state, provider); |
| 2588 | let registered_id = provider.id().to_string(); |
| 2589 | registry.register_arc(provider); |
| 2590 | if !provider_state.options.is_empty() { |
| 2591 | registry.merge_config(®istered_id, provider_state.options.clone()); |
| 2592 | } |
| 2593 | tracing::debug!( |
| 2594 | provider = provider_id, |
| 2595 | concrete_provider = registered_id, |
| 2596 | "Registered provider from bootstrap state" |
| 2597 | ); |
| 2598 | } else { |
| 2599 | tracing::debug!( |
| 2600 | provider = provider_id, |
| 2601 | "No concrete provider implementation for bootstrap provider" |
| 2602 | ); |
| 2603 | } |
| 2604 | } |
| 2605 | |
| 2606 | if registry.list().is_empty() { |
| 2607 | tracing::debug!( |
| 2608 | "No providers registered from bootstrap state, falling back to direct env registration" |
| 2609 | ); |
| 2610 | register_fallback_env_providers(&mut registry); |
| 2611 | } |
| 2612 | |
| 2613 | registry |
| 2614 | } |
| 2615 | |
| 2616 | /// Build a `BootstrapConfig` from the raw config fields typically found in |
| 2617 | /// `opencode_config::Config`. This bridges the gap between the config loader |
no test coverage detected