install method
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;
}
}