docs/diagrams/settings-flow.mmd

sequenceDiagram autonumber participant UI as Dashboard UI participant API as /api/settings participant Store as Store participant Bot as ClankerBot

UI->>UI: overlay edited fields onto source baseline
UI->>API: PUT full settings snapshot + expectedUpdatedAt
API->>Store: replaceSettingsWithVersion(snapshot, expectedUpdatedAt)
Store->>Store: minimizeSettingsIntent + normalizeSettings
alt settings changed since form load
    Store-->>API: conflict + latest settings envelope
    API-->>UI: 409 intent + effective + bindings + _meta
else save succeeds
    Store->>Store: UPDATE settings WHERE updated_at = expectedUpdatedAt
    Store-->>API: saved intent + effective + updatedAt
    API->>Bot: applyRuntimeSettings(saved settings)
    alt runtime apply succeeds
        API-->>UI: 200 settings envelope + saveAppliedToRuntime=true
    else runtime apply fails
        API-->>UI: 200 settings envelope + saveAppliedToRuntime=false + saveApplyError
    end
end

UI->>API: POST /api/settings/refresh
API->>Store: getSettings()
Store-->>API: latest saved effective settings
API->>Bot: applyRuntimeSettings(saved settings)
API-->>UI: 200 ok + activeVoiceSessions