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
