{ "source_base_path": "/home/runner/work/EchoHub/EchoHub/docs", "xrefmap": "xrefmap.yml", "files": [ { "type": "Resource", "output": { "resource": { "relative_path": "index.json" } } }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.AppOrchestrator.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.AppOrchestrator.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.AppOrchestrator", "Summary": "
Central orchestrator for the EchoHub TUI client.\nWires UI events to service calls and connection events to UI updates.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Commands.CommandHandler.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Commands.CommandHandler.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Commands.CommandHandler", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Commands.CommandResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Commands.CommandResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Commands.CommandResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Commands.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Commands.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Commands", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.AccountPreset.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.AccountPreset.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config.AccountPreset", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.ClientConfig.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.ClientConfig.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config.ClientConfig", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.ConfigManager.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.ConfigManager.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config.ConfigManager", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.NotificationConfig.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.NotificationConfig.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config.NotificationConfig", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.SavedServer.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.SavedServer.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config.SavedServer", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Config.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Config.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Config", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ApiClient.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.ApiClient.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.ApiClient", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.AsyncRunner.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.AsyncRunner.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.AsyncRunner", "Summary": "Eliminates repeated Task.Run/try/catch/app.Invoke(ShowError) boilerplate.\nRuns async work on a background thread and routes exceptions to the UI.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.AudioPlaybackService.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.AudioPlaybackService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.AudioPlaybackService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.BackupInfo.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.BackupInfo.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.BackupInfo", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ChannelPasswordRequiredException.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.ChannelPasswordRequiredException", "Summary": "Thrown when joining a channel fails because a password is required or incorrect.\nThe UI catches this to prompt the user and retry.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ClientEncryptionService.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.ClientEncryptionService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.ClientEncryptionService", "Summary": "Client-side encryption service. Uses the same AES-256-GCM format as the server\nso messages are encrypted end-to-end between client and server.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ClipboardFiles.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.ClipboardFiles.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.ClipboardFiles", "Summary": "Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in\nExplorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied\nfile directly instead of requiring the user to paste a raw path.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ClipboardImage.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.ClipboardImage.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.ClipboardImage", "Summary": "Reads raw image data from the OS clipboard (e.g. an image copied from a browser, or a\nWin+Shift+S screenshot), which terminals cannot paste as text. Always returns PNG bytes:\nclipboard PNG data is passed through, clipboard bitmaps (CF_DIB) are re-encoded.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.EchoHubConnection.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.EchoHubConnection.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.EchoHubConnection", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.FolderPickResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.FolderPickResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.FolderPickResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.JoinOutcome.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.JoinOutcome.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.JoinOutcome", "Summary": "Result of joining a channel: decrypted history plus, for end-to-end encrypted\nchannels, the key envelope needed to unlock the room content key.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.NativeFolderPicker.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.NativeFolderPicker.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.NativeFolderPicker", "Summary": "Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling\nout, so the TUI doesn't need a GUI toolkit reference. Returns
One file to upload as part of a message. For end-to-end encrypted channels the stream\nis already ciphertext,
Ensures the application's directory is on the system PATH so users\ncan run 'echohub' from any terminal session.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.PickerOutcome.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.PickerOutcome.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.PickerOutcome", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.RoomKeyProtector.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.RoomKeyProtector.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.RoomKeyProtector", "Summary": "Encrypts cached room content keys at rest so the client config never holds them as\nplain base64. Windows uses DPAPI (current-user scope, format prefix "dp1:"). On other\nplatforms the keys are AES-GCM encrypted with a per-user master key file stored next\nto the config with 0600 permissions (prefix "k1:") — without an OS keychain that is\nfile-permission-level protection, not zero-knowledge: anyone who can read both the\nconfig and the key file can recover the room keys. Values with no recognized prefix\nare legacy plain-base64 keys from older clients; they load once and are re-encrypted.\nThe room passphrase itself is never stored in any form.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.RoomKeyStore.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.RoomKeyStore.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.RoomKeyStore", "Summary": "Holds room content keys for end-to-end encrypted channels: in-memory for the\nactive session, persisted per-server in the client config (like saved sessions)\nso users don't retype the passphrase every launch. Keys never leave this machine\nand are encrypted at rest by
Thrown when sending into an end-to-end encrypted channel whose room key isn't cached:\nwithout the key the message would leave the client as plaintext, which must never happen.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.UpdateBackupService.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.UpdateBackupService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.UpdateBackupService", "Summary": "Manages pre-update backups and rollback restoration for the auto-updater.\nBackup location: ~/.echohub/update-backup/
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.UpdateChecker.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.UpdateChecker.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services.UpdateChecker", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Services.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Services", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Themes.Theme.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Themes.Theme.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Themes.Theme", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Themes.ThemeColors.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Themes.ThemeColors.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Themes.ThemeColors", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Themes.ThemeManager.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Themes.ThemeManager.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Themes.ThemeManager", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Themes.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.Themes.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.Themes", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.AttachmentAction.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.AttachmentAction.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.AttachmentAction", "Summary": "An action a click on an attachment line can trigger.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.AttachmentActionSpan", "Summary": "Inclusive column range on a chat line that triggers an attachment action when clicked.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.ChatColors.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.ChatColors.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.ChatColors", "Summary": "Shared color attributes for chat rendering (timestamps, system messages).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.ChatLine.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.ChatLine.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.ChatLine", "Summary": "A single line in the chat, composed of colored segments.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.ChatListSource.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.ChatListSource.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.ChatListSource", "Summary": "Custom list data source for chat messages with per-segment coloring.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.ChatMessageManager.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat.ChatMessageManager", "Summary": "Owns chat message storage, formatting, and mutation.\nFires
A colored text segment within a chat line.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Chat.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Chat.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Chat", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.AudioPlayerDialog", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ChannelPasswordDialog", "Summary": "Prompts for a channel password when joining a protected channel.\nReturns the entered password, or null if the user cancels.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ConnectDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ConnectDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ConnectDialog", "Summary": "A Terminal.Gui dialog for entering server connection and authentication details.\nIncludes a saved servers selector when saved servers are available.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ConnectDialogResult", "Summary": "Result returned from the connect dialog.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.CreateChannelDialog", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.CreateChannelResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ProfileAction.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ProfileAction.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ProfileAction", "Summary": "Action selected by the user in their own profile dialog.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ProfileEditDialog", "Summary": "A Terminal.Gui dialog for editing the user's profile (display name, bio, nickname color).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ProfileEditResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ProfileEditResult", "Summary": "Result returned from the profile edit dialog.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.ProfileViewDialog", "Summary": "Dialog for viewing a user's server profile.\nShows Edit Profile / Set Status buttons when viewing own profile.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.SearchDialog", "Summary": "Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.SearchResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchResultType.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.SearchResultType", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.StatusDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.StatusDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.StatusDialog", "Summary": "A Terminal.Gui dialog for setting the user's status and status message.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.StatusDialogResult.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.StatusDialogResult", "Summary": "Result returned from the status dialog.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs.UpdateConfirmDialog", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Dialogs.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Dialogs", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.DroppedFileParser.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Helpers.DroppedFileParser", "Summary": "Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an\nabsolute path. Terminals differ: some paste the whole path at once, others send it character by\ncharacter; either way this checks whether the current input text resolves to existing file(s).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.EmojiHelper.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Helpers.EmojiHelper", "Summary": "Converts emoji grapheme clusters to text shortcodes for safe TUI rendering.\nTerminal width calculations for emoji are unreliable across different terminals,\nso we replace them with fixed-width ASCII shortcodes for display only.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.HexColorHelper.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Helpers.HexColorHelper.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Helpers.HexColorHelper", "Summary": "Helper to parse hex colors to Terminal.Gui Attributes.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.NickColorHelper.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Helpers.NickColorHelper", "Summary": "Deterministic per-nick colors for users who haven't picked a nickname color.\nThe same nick always maps to the same palette entry (classic IRC client behavior),\nso a busy channel stays scannable without any configuration.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.Helpers.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.Helpers", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.ChannelListSource.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.ListSources.ChannelListSource", "Summary": "Custom list data source for colored channel list rendering.\nActive channel gets a > indicator, unread channels are bright with a count badge.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.SearchListSource.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.ListSources.SearchListSource", "Summary": "List data source for the search dialog with filtering and colored rendering.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.UserListSource.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.ListSources.UserListSource.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.ListSources.UserListSource", "Summary": "Custom list data source for the online users panel with per-user nickname colors.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.ListSources.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.ListSources", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.MainWindow.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.MainWindow.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI.MainWindow", "Summary": "Main Terminal.Gui window for the EchoHub chat client.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.UI.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client.UI", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.yml", "output": { ".html": { "relative_path": "api/client/EchoHub.Client.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Client", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Constants.HubConstants.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Constants.HubConstants.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Constants.HubConstants", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Constants.MessageConventions.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Constants.MessageConventions.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Constants.MessageConventions", "Summary": "Cross-protocol message conventions. Action messages (/me) use the IRC CTCP ACTION\nwire format 0x01 + "ACTION " + text + 0x01 as the stored content, so IRC clients\ninteroperate natively (irssi's /me arrives in exactly this shape) and the TUI renders\n"* nick text". In end-to-end encrypted rooms the marker encrypts along with the text.
Methods the server can invoke on connected clients.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Contracts.IMessageEncryptionService.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Contracts.IMessageEncryptionService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Contracts.IUserService.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Contracts.IUserService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Contracts.IUserService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Contracts.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Contracts.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Contracts", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ApiResponse-1.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ApiResponse-1.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ApiResponseA file attached to a message.
Public crypto metadata for a channel — enough for a client to derive its join\ncredential from a passphrase. Never includes the wrapped room key.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ChannelDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ChannelDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelError.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ChannelError.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ChannelError", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelMetaDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ChannelMetaDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ChannelMetaDto", "Summary": "Human-facing summary of a channel (the /meta command). For encrypted channels the\nserver still knows these figures — count, timestamps, and stored blob sizes — even though it\ncannot read the content itself.
Password re-confirmation for destructive self-service account actions.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.EmbedDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.EmbedDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.EmbedDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.EncryptionKeyResponse.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.EncryptionKeyResponse.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.EncryptionKeyResponse", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ErrorResponse.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ErrorResponse.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ErrorResponse", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ExportedAttachmentDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ExportedAttachmentDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ExportedAttachmentDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ExportedMessageDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ExportedMessageDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ExportedMessageDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.InviteDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.InviteDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.InviteDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.JoinChannelResult.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.JoinChannelResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.JoinChannelResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.KickRequest.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.KickRequest.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.KickRequest", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.LoginRequest.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.LoginRequest.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.LoginRequest", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.LoginResponse.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.LoginResponse.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.LoginResponse", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.MessageDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.MessageDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.MessageDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.MuteRequest.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.MuteRequest.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.MuteRequest", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.PaginatedResponse-1.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.PaginatedResponse-1.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.PaginatedResponsePassphrase change for an encrypted channel: the client proves knowledge of the old\npassphrase (old auth key), then supplies the re-wrapped room key under the new one.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ReplyRefDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.ReplyRefDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.ReplyRefDto", "Summary": "Reference to the message a reply targets.
Everything the server holds about a user, as stored. For end-to-end encrypted rooms the\nmessage content in here is room ciphertext — the server cannot include plaintext it never had.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.UserDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.UserDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserError.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.UserError.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.UserError", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserOperationResult.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.UserOperationResult.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.UserOperationResult", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserPresenceDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.UserPresenceDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.UserPresenceDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserProfileDto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.UserProfileDto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs.UserProfileDto", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.DTOs.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.DTOs", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.Attachment.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.Attachment.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.Attachment", "Summary": "A file attached to a message (image, audio, or any file). A message may carry\nzero or more attachments alongside its text content (Discord-style).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.AttachmentKind.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.AttachmentKind.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.AttachmentKind", "Summary": "The kind of a message attachment. Determines how the client renders it\n(ASCII preview for images, a play affordance for audio, a download line for files).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.Channel.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.Channel.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.Channel", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.ChannelMembership.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.ChannelMembership.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.ChannelMembership", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.InviteCode.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.InviteCode.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.InviteCode", "Summary": "A registration invite code. When the server runs with Server:Registration = "invite",\nnew accounts (REST and IRC alike) require a valid, unexpired, not-fully-used code.
A snapshot of server activity over one reporting window, produced periodically by the\nstats-report background job. Each report is logged as pretty-printed JSON and persisted\nfor historical trend analysis. The window is "since the previous report" (or since startup\nfor the first report of a run).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.User.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.User.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.User", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.UserStatus.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.UserStatus.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models.UserStatus", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Models.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Models", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Security.RoomCrypto.DerivedKeys", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Security.RoomCrypto.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Security.RoomCrypto.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Security.RoomCrypto", "Summary": "Client-side envelope encryption for private (end-to-end encrypted) channels.
\nDesign: at creation the client generates a random 256-bit room content key (RCK)\nthat encrypts all room content. The RCK is stored on the server wrapped\n(AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash\nof a separately derived auth key used as the join gate. The passphrase, the\nkey-encryption key, and the RCK never leave the client, so the server can gate\njoins and count/measure content without being able to read it. Changing the\npassphrase only re-wraps the RCK — history is never re-encrypted.
\nDerivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes;\nfirst 32 bytes are the auth key (sent to the server as lowercase hex),\nlast 32 bytes are the key-encryption key (never sent).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Security.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Security.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Security", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Services.AsciiBannerService.yml", "output": { ".html": { "relative_path": "api/core/EchoHub.Core.Services.AsciiBannerService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Core.Services.AsciiBannerService", "Summary": "Renders short text as a 5-row block-character banner (the /banner command).\nEntirely local — a hand-rolled figlet-style font, no dependencies, no network.\nOutput is plain message content, so it travels (and encrypts) like any other text.
Manages a single IRC client TCP connection.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcCommandHandler.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcCommandHandler", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcGatewayService.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcGatewayService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcMessage.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcMessage.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcMessage", "Summary": "Parsed representation of an IRC protocol line.\nFormat: [:prefix] COMMAND [params...] [:trailing]
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcMessageFormatter", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcNumericReply.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcNumericReply", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcOptions.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcOptions.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcOptions", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcServiceExtensions.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc.IrcServiceExtensions", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.yml", "output": { ".html": { "relative_path": "api/server-irc/EchoHub.Server.Irc.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Irc", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Auth.JwtTokenService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Auth.JwtTokenService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Auth.JwtTokenService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Auth.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Auth.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Auth", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Config.ServerLogsOptions.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Config.ServerLogsOptions.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Config.ServerLogsOptions", "Summary": "Live server-log room settings, bound from the "ServerLogs" config section (env override:\nServerLogs__Enabled etc.). When enabled, a read-only system channel is auto-created\nand log events are streamed to it live — log lines are never stored as messages in the\ndatabase; the rolling Serilog log files remain the only persistence.
Anti-spam thresholds, bound from the "Spam" config section. Defaults are lenient enough\nthat a fast typist never trips them; Mods and above are always exempt.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Config.StatsOptions.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Config.StatsOptions.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Config.StatsOptions", "Summary": "Periodic server-stats report settings, bound from the "Stats" config section (env override:\nStats__Enabled etc.). When enabled, a background job periodically snapshots server\nactivity, logs it as pretty-printed JSON, and persists it to the database.
Admin-configurable upload limits, bound from the Uploads configuration section.\nSizes are expressed in megabytes in configuration; the *Bytes accessors convert them\nfor enforcement. Every default mirrors Uploads section preserves the historical built-in limits.
Invite-code management for invite-gated registration (Admin+ only).\nCodes live in this server's own database — there is no central service.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Controllers.ModerationController.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Controllers.ModerationController.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Controllers.ModerationController", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Controllers.ServerController.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Controllers.ServerController.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Controllers.ServerController", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Controllers.UsersController.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Controllers.UsersController.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Controllers.UsersController", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Controllers.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Controllers.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Controllers", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.EchoHubDbContext.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.EchoHubDbContext.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.EchoHubDbContext", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddAttachmentFileSize", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddChannelIsPublic", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelIsSystem.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelIsSystem.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddChannelIsSystem", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelMembership.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelMembership.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddChannelMembership", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddChannelPasswordHash", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddEncryptionSupport", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddInvitesAndReplies.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddInvitesAndReplies.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddInvitesAndReplies", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddMessageAttachments", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddMessageEmbed", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddModerationRoles.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddModerationRoles.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddModerationRoles", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddServerStatsReports.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddServerStatsReports.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.AddServerStatsReports", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.InitialCreate.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.InitialCreate.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations.InitialCreate", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.Migrations.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data.Migrations", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Data.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Data", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Hubs.ChatHub.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Hubs.ChatHub.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Hubs.ChatHub", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Hubs.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Hubs.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Hubs", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ChannelService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ChannelService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ChannelService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ChatService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ChatService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ChatService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.DirectoryClaimStore.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.DirectoryClaimStore.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.DirectoryClaimStore", "Summary": "Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first\nregistration and the row's stable ServerId. Also surfaces ephemeral registration\nstatus (success/failure code, conflicting hosts) for operator-facing endpoints.
Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.FileCleanupService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.FileCleanupService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.FileCleanupService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.FileStorageService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.FileStorageService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.FileStorageService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.LinkEmbedService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.LinkEmbedService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.LinkEmbedService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.MessageEncryptionService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.MessageEncryptionService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.MessageEncryptionService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.MuteExpirationService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.MuteExpirationService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.MuteExpirationService", "Summary": "Background service that periodically unmutes users whose timed mute has expired.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.PresenceTracker.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.PresenceTracker.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.PresenceTracker", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.RegistrationStatus.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.RegistrationStatus.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.RegistrationStatus", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerDirectoryService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ServerDirectoryService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ServerDirectoryService", "Summary": null }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerLogs.LogBacklogEntry.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ServerLogs.LogBacklogEntry.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ServerLogs.LogBacklogEntry", "Summary": "A backlog entry read from the log file: one timestamped log line plus any continuation\nlines (exception stack traces) that followed it.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerLogs.ServerLogsService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ServerLogs.ServerLogsService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ServerLogs.ServerLogsService", "Summary": "Shared logic for the live log room: room identity, the role gate, and reading the backlog\ntail from the current rolling log file. The file stays the only persistence — log lines\nare never stored as messages.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.ServerLogs.ServerLogsSink", "Summary": "Serilog sink feeding the live log room. Events are queued in a bounded drop-oldest buffer\nand consumed by
Streams queued log events to the live log room as ephemeral messages: SignalR only (the\nIRC gateway never sees them) and no database rows. Ensures the room exists before\nstreaming, recreating it on the fly if it was deleted.
\nThis class must never log from its streaming path — its namespace is excluded by\n
In-memory, per-user spam protection consulted from
Thread-safe, in-memory accumulator for server-activity counters that have no natural\ndatabase timestamp to query after the fact — session connects/disconnects, moderation\nactions, and peak concurrency. The periodic stats-report job snapshots and resets these\nonce per reporting window. Registered as a singleton; every increment is lock-free so it\nis safe to call from hot paths (connect/disconnect).
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.Stats.ServerStatsReportService.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.Stats.ServerStatsReportService.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.Stats.ServerStatsReportService", "Summary": "Background job that periodically snapshots server activity over a window, logs it as\npretty-printed JSON (which also surfaces in the live server-logs room), and persists it to\nthe database for historical trends. Interval and retention are configurable via the "Stats"\nsection; the default cadence is every 6 hours.
\n" }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.Stats.StatsCounters.yml", "output": { ".html": { "relative_path": "api/server/EchoHub.Server.Services.Stats.StatsCounters.html" } }, "version": "", "Uid": null, "IsMRef": true, "Title": "EchoHub.Server.Services.Stats.StatsCounters", "Summary": "Immutable snapshot of the counters held by