install method

Future<void> install({
  1. required SyniPersona persona,
  2. required SyniModelSpec model,
})

Install Syni: download + verify the model, load the engine, bind persona. Emits lifecycle events on installState; throws on failure (after emitting SyniInstallFailed).

Implementation

Future<void> install({
  required SyniPersona persona,
  required SyniModelSpec model,
}) async {
  if (currentState is SyniInstalling) {
    throw StateError('install already in progress');
  }
  try {
    void emit(SyniInstallStage stage, double progress) {
      _state.add(SyniInstalling(stage: stage, progress: progress));
    }

    emit(SyniInstallStage.preflight, 0.0);

    final modelPath = await _installer.ensureModel(model, onProgress: emit);

    emit(SyniInstallStage.materializingPersona, 0.0);
    _persona = persona;
    emit(SyniInstallStage.materializingPersona, 1.0);

    emit(SyniInstallStage.loadingEngine, 0.0);
    await _runtime.initialize();
    await _runtime.loadModel(modelPath);
    final version = await _runtime.getVersion() ?? 'unknown';
    emit(SyniInstallStage.loadingEngine, 1.0);

    _state.add(SyniInstalled(
      personaId: persona.id,
      modelPath: modelPath,
      runtimeVersion: version,
    ));
  } catch (e) {
    _state.add(SyniInstallFailed(reason: e.toString(), cause: e));
    rethrow;
  }
}