Przejdź do głównej zawartości

Settings Commands

Settings API obejmuje:

  • User Preferences - preferencje użytkownika (drafting, workflow, assistant)
  • Clinic Settings - dane kliniki, godziny pracy
  • Security - weryfikacja hasła do sekcji admin
  • MCP Diagnostics - Vista Connect status, AI config
  • Privacy & GDPR - polityki retencji danych

// get_user_preferences_session
// Pobiera preferencje powiązane z aktualną sesją
const prefs = await safeInvoke<SettingsUserPreferences | null>(
'get_user_preferences_session',
withSessionPayload()
);
// update_user_preferences_session
// Aktualizuje preferencje dla bieżącej sesji
await safeInvoke(
'update_user_preferences_session',
withSessionPayload({ prefs: preferences })
);
FieldTypeOptions
note_styleenum'soap' | 'narrative'
ai_precision_levelenum'minimal' | 'balanced' | 'complete'
history_depthenum'brief' | 'standard' | 'full'
tone_of_voiceenum'clinical' | 'professional' | 'friendly' | 'neutral'
content_formatenum'paragraph' | 'bullets'
FieldTypeOptions
practice_modeenum'solo' | 'team'
workday_styleenum'planned' | 'dynamic' | 'balanced'
docs_styleenum'detailed' | 'quick' | 'keypoints'
tech_profileenum'innovator' | 'practical' | 'conservative'
FieldTypeDescription
tts_enabledbooleanText-to-speech
tasks_panel_modeenum'manual' | 'auto' | 'off'
auto_generate_tasksbooleanAuto-generacja zadań
sequenceDiagram
participant UI as PreferencesSettings
participant API as safeInvoke
participant BE as Backend
Note over UI: Mount
UI->>API: get_user_preferences_session
API->>BE: withSessionPayload()
BE-->>API: prefs | null
alt prefs is null
UI->>UI: createNormalizedPreferences()
UI->>UI: recordRoamEvent('load:defaults')
else prefs exists
UI->>UI: createNormalizedPreferences(prefs)
UI->>UI: recordRoamEvent('load:success')
end
Note over UI: User edits
UI->>UI: Calculate changedKeys
UI->>API: update_user_preferences_session
API->>BE: { prefs }
BE-->>UI: success
UI->>UI: recordRoamEvent('save:success')
// Walidacja i konwersja
validatePartialUserPreferences(prefs) // Zod validation
toSnakeCaseDeep(payload) // camelCase → snake_case
// Batch updates
batchUpdateUserPreferences(prefs)
batchUpdateUserPreferencesSession(prefs)
// Onboarding helpers
completeOnboarding(prefs)
skipOnboarding()

CommandDescriptionType
get_clinic_infoPełne dane kliniki (w tym operating_hours)query
update_clinic_infoZapisuje pełne dane klinikiwrite
get_clinic_settingsMapa klucz-wartość ustawieńquery
update_clinic_settingsAktualizuje wiele ustawień narazwrite
get_clinic_settingPojedyncze ustawienie po kluczuquery
// Pełne dane kliniki
ClinicSettingsService.getClinicInfo(sessionId?)
ClinicSettingsService.updateClinicInfo(clinicInfo, updatedBy, sessionId?)
// Mapa ustawień
ClinicSettingsService.getSettings(sessionId?)
ClinicSettingsService.updateSettings(settings, updatedBy, sessionId?)
// Pojedyncze ustawienie
ClinicSettingsService.getSetting(settingKey, sessionId?)
ClinicSettingsService.updateSetting(settingKey, value, updatedBy, sessionId?)
// Operating hours (FE helpers)
ClinicSettingsService.getOperatingHours()
ClinicSettingsService.updateOperatingHours(hours)
interface ClinicInfo {
name: string;
address: string;
phone?: string;
email?: string;
operating_hours: Record<DayOfWeek, {
isOpen: boolean;
open: string; // "09:00"
close: string; // "17:00"
}>;
}
// validateClinicInfo checks:
- name: required, non-empty
- address: required, isValidAddress()
- phone: if present → normalizePhoneNumber() + validateE164()

Weryfikacja hasła przed dostępem do sekcji admin (Database Management).

DatabaseManagement.tsx
const isValid = await safeInvoke<boolean>('verify_user_password', {
email: user.email,
password,
});
if (isValid) {
setIsAuthenticated(true);
setIsOpen(true); // Otwórz sekcję DB
} else {
setPasswordError(t('invalidPassword'));
}

CommandDescription
diagnostics_ai_configKonfiguracja flowów AI
get_vista_connect_statusStatus Vista Connect runtime
diagnostics_ai_curlGeneruje curl template do testów
// Wykrywa konfigurację AI flows
const res = await safeInvoke<any>('diagnostics_ai_config');
const flows = Array.isArray(res?.flows) ? res.flows : [];
const chat = flows.find((f) => f?.flow === 'AI_CHAT');
setIsResponsesPrimary(!!chat?.primary_is_responses);
interface VistaConnectStatus {
version: string;
localTools: number;
clients: string[];
externalServers: MCPServer[];
}
const status = await safeInvoke<VistaConnectStatus>(
'get_vista_connect_status',
withSessionPayload({})
);
// Derived state
vistaStatusSummary // "v1.2.3 | 5 tools | 2 clients"
connectedExternal // liczba zewnętrznych MCP serwerów
// Kopiuje curl template do clipboard
const cmd = await safeInvoke<string>('diagnostics_ai_curl', {
kind: 'responses_web_search',
});
await navigator.clipboard.writeText(cmd);

interface DataRetentionPolicy {
audioRecordings: number; // dni
clinicalNotes: number; // dni
}
// Aktualizacja polityki retencji
DataRetentionService.updateRetentionPolicy(policy: Partial<DataRetentionPolicy>)
// → safeInvoke('update_retention_policy', { policy })
// Wykonanie polityki (cleanup)
DataRetentionService.applyRetentionPolicy()
// → safeInvoke<RetentionReport>('apply_retention_policy', { policy })
// Anonimizacja pacjenta (zamiast hard delete)
DataRetentionService.anonymizePatientData(patientId)
// → safeInvoke('anonymize_patient_data', { patientId })
// Status retencji użytkownika
DataRetentionService.getUserDataRetentionStatus(userId)
PrivacySettings.tsx
const saveChanges = async () => {
await DataRetentionService.updateRetentionPolicy({
audioRecordings: audioDays,
clinicalNotes: transcriptDays,
});
};
CommandDescription
update_retention_policyAktualizuje politykę retencji
apply_retention_policyWykonuje cleanup starych danych
anonymize_patient_dataAnonimizuje dane pacjenta

SettingsTabsView
├── PreferencesSettings # User preferences
├── ClinicSettings # Clinic info & hours
├── StaffWorkingHours # Staff schedules
├── DatabaseManagement # Admin (requires password)
├── MCPSettings # Vista Connect
└── PrivacySettings # GDPR, retention