initializeServices static method

Future<void> initializeServices({
  1. String? apiKey,
  2. String? baseURL,
  3. String? deviceId,
})

Initialize service bridges.

This is Phase 2 of 2-phase initialization (matches Swift completeServicesInitialization):

  1. Setup HTTP transport (if needed)
  2. Initialize C++ state (rac_state_initialize with apiKey, baseURL, deviceId)
  3. Initialize service bridges (ModelAssignment, Platform)
  4. Model paths base directory (done in RunAnywhere.initializeWithParams)
  5. Device registration (if needed)
  6. Flush telemetry

Call this AFTER Phase 1. Can be called in background.

apiKey API key for production/staging baseURL Backend URL for production/staging deviceId Device identifier

Implementation

static Future<void> initializeServices({
  String? apiKey,
  String? baseURL,
  String? deviceId,
}) async {
  if (!_isInitialized) {
    throw StateError('Must call initialize() before initializeServices()');
  }

  if (_servicesInitialized) {
    _logger.debug('Services already initialized, skipping');
    return;
  }

  _logger.debug('Starting Phase 2 services initialization');

  // Step 1: Get device ID if not provided
  final effectiveDeviceId =
      deviceId ?? DartBridgeDevice.cachedDeviceId ?? 'unknown-device';

  // Step 2: Initialize C++ state with credentials
  // Matches Swift: CppBridge.State.initialize(environment:apiKey:baseURL:deviceId:)
  await DartBridgeState.instance.initialize(
    environment: _environment,
    apiKey: apiKey,
    baseURL: baseURL,
    deviceId: effectiveDeviceId,
  );
  _logger.debug('C++ state initialized');

  // Step 3: Initialize service bridges
  // Matches Swift: CppBridge.initializeServices()

  // Step 3a: Model assignment callbacks
  // Only auto-fetch in staging/production, not development
  final shouldAutoFetch = _environment != SDKEnvironment.development;
  await DartBridgeModelAssignment.register(
    environment: _environment,
    autoFetch: shouldAutoFetch,
  );
  _logger.debug(
      'Model assignment callbacks registered (autoFetch: $shouldAutoFetch)');

  // Step 3b: Platform services (Foundation Models, System TTS)
  await DartBridgePlatformServices.register();
  _logger.debug('Platform services registered');

  // Step 4: Flush telemetry (if any queued events)
  // Matches Swift: CppBridge.Telemetry.flush()
  DartBridgeTelemetry.flush();
  _logger.debug('Telemetry flushed');

  _servicesInitialized = true;
  _logger.info('Phase 2 services initialization complete');
}