package models import ( "encoding/json" "time" ) type User struct { ID string `json:"id"` Email string `json:"email"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type UserSettings struct { UserID string `json:"user_id"` WorkspaceID string `json:"workspace_id"` KanbanViewMode string `json:"kanban_view_mode"` WorkflowFilterID string `json:"workflow_filter_id"` RepositoryIDs []string `json:"repository_ids"` InitialSetupComplete bool `json:"initial_setup_complete"` PreferredShell string `json:"preferred_shell"` DefaultEditorID string `json:"default_editor_id"` EnablePreviewOnClick bool `json:"enable_preview_on_click"` ChatSubmitKey string `json:"chat_submit_key"` // "enter" | "cmd_enter" ReviewAutoMarkOnScroll bool `json:"review_auto_mark_on_scroll"` ShowReleaseNotification bool `json:"show_release_notification"` ReleaseNotesLastSeenVersion string `json:"release_notes_last_seen_version"` LspAutoStartLanguages []string `json:"lsp_auto_start_languages"` LspAutoInstallLanguages []string `json:"lsp_auto_install_languages"` LspServerConfigs map[string]map[string]interface{} `json:"lsp_server_configs"` SavedLayouts []SavedLayout `json:"saved_layouts"` SidebarViews []SidebarView `json:"sidebar_views"` DefaultUtilityAgentID string `json:"default_utility_agent_id"` // Default inference agent for utility agents DefaultUtilityModel string `json:"default_utility_model"` // Default model for utility agents KeyboardShortcuts map[string]interface{} `json:"keyboard_shortcuts"` // User-configured keyboard shortcut overrides TerminalLinkBehavior string `json:"terminal_link_behavior"` // "new_tab" | "browser_panel" TerminalFontFamily string `json:"terminal_font_family"` TerminalFontSize int `json:"terminal_font_size"` ChangesPanelLayout string `json:"changes_panel_layout"` // "flat" | "tree" VoiceMode VoiceModeSettings `json:"voice_mode"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // VoiceModeSettings is the per-user configuration surface for the chat // voice-input feature. Stored as a nested JSON object inside the `users.settings` // blob — adding fields here does not require a schema migration. type VoiceModeSettings struct { // Enabled gates the whole feature. When false, the mic button is hidden // entirely and no voice-related hooks run on the chat input. Defaults to // true for new users; pre-existing user rows that have no `enabled` field // in their stored JSON are also treated as enabled (see store layer). Enabled bool `json:"enabled"` // Engine is the user's preferred transcription engine. // "auto" | "webSpeech" | "whisperWeb" | "whisperServer". Default "auto". Engine string `json:"engine"` // Language is the BCP-47 tag or "auto" to use the browser's language. // Examples: "en-US", "pt-PT", "ja-JP". Default "auto". Language string `json:"language"` // Mode controls how the mic button is activated: "toggle" (click to start/stop) // or "hold" (push-to-talk). Default "toggle". Mode string `json:"mode"` // AutoSend submits the chat message immediately after the transcript is inserted. AutoSend bool `json:"auto_send"` // WhisperWebModel selects the in-browser Whisper model when engine = whisperWeb. // "tiny" | "base" | "small". Default "base". WhisperWebModel string `json:"whisper_web_model"` } // SavedLayout represents a user-saved dockview layout configuration. type SavedLayout struct { ID string `json:"id"` Name string `json:"name"` IsDefault bool `json:"is_default"` Layout json.RawMessage `json:"layout"` CreatedAt string `json:"created_at"` } // SidebarView represents a user-saved sidebar filter/sort/group preset. // The payload is stored and returned as-is; the server does not interpret // clause values beyond passing them through. type SidebarView struct { ID string `json:"id"` Name string `json:"name"` Filters []SidebarViewClause `json:"filters"` Sort SidebarViewSort `json:"sort"` Group string `json:"group"` CollapsedGroups []string `json:"collapsed_groups"` } type SidebarViewClause struct { ID string `json:"id"` Dimension string `json:"dimension"` Op string `json:"op"` Value json.RawMessage `json:"value"` } type SidebarViewSort struct { Key string `json:"key"` Direction string `json:"direction"` }