Pular para o conteúdo

CLI, utilitários e constantes ​

Assinaturas públicas completas do SDK de bots do Monky, geradas da entrada TypeScript de @monky/bot-sdk. Campos opcionais usam ?; campos readonly não devem ser alterados. Os links de origem incluem regras de validação e detalhes da implementação.

Visão geral do SDK de bots e eventos · Distribuição

askCliChoice ​

Origem e validação

ts
export function askCliChoice<T extends string>(locale: BotLocale, question: string, choices: readonly CliChoice<T>[], initial?: T, io?: CliPromptIO): Promise<T>;

askCliText ​

Origem e validação

ts
export function askCliText(locale: BotLocale, question: string, options?: {
    defaultValue?: string;
    secret?: boolean;
}, io?: CliPromptIO): Promise<string>;

askCliValue ​

Origem e validação

ts
export function askCliValue<T>(locale: BotLocale, question: string, validate: (value: string) => T | Promise<T>, options?: {
    defaultValue?: string;
    secret?: boolean;
}): Promise<T>;

BOT_CAPABILITIES ​

Origem e validação

ts
export const BOT_CAPABILITIES = [
    'commands',
    'read_messages',
    'send_messages',
    'publish_voice',
    'receive_voice',
    'local_execution',
    'sound_download',
    'selectors',
    'miniapps',
    'live_actions',
    'server_storage',
    'device_storage',
] as const;

BOT_LOCALES ​

Origem e validação

ts
export const BOT_LOCALES = ['pt-BR', 'en'] as const;

BOT_STORAGE_LIMITS ​

Origem e validação

ts
export const BOT_STORAGE_LIMITS = {
    /** Base64 inflates an object by a third and the result must still fit one WebSocket message (8 MiB). */
    objectBytes: 4 * MIB,
    keyLength: 200,
    contentTypeLength: 128,
    serverObjects: 10000,
    deviceObjects: 1000,
    serverDefaultBytes: 100 * MIB,
    deviceDefaultBytes: 50 * MIB,
    minQuotaBytes: MIB,
    maxQuotaBytes: 100 * 1024 * MIB,
    /** From this share of the quota on, people are warned that saves will soon stop. */
    nearFullRatio: 0.9,
    listPageSize: 100,
    operationsPerSecond: 20,
    /** Server, account and bot combinations kept on one computer. */
    deviceScopes: 512,
} as const;

BotLocalizedText ​

Origem e validação

ts
export interface BotLocalizedText {
    'pt-BR': string;
    en: string;
}

BotPackageDefinition ​

Origem e validação

ts
export interface BotPackageDefinition {
    cliName: string;
    displayName: string;
    entry: string;
    buildScript: string | null;
    files: string[];
    modes: BotMode[];
    releases?: GitHubReleaseSource;
    updateSource?: BotUpdateSource;
    /** Ports and settings the operator must provide; also part of the host consent. */
    requirements?: BotRequirements;
}

BotPortActivation ​

Origem e validação

ts
export type BotPortActivation = "always" | "on-demand";

BotPortExposure ​

Origem e validação

ts
export type BotPortExposure = "public" | "local";

BotPortProtocol ​

Origem e validação

ts
export type BotPortProtocol = "tcp" | "udp";

BotPortRequirement ​

Origem e validação

ts
export interface BotPortRequirement {
    id: string;
    description: BotLocalizedText;
    protocol: BotPortProtocol;
    portEnv: string;
    defaultPort: number;
    hostEnv?: string;
    /** Environment variable holding the public http(s) origin, e.g. behind a reverse proxy. */
    publicUrlEnv?: string;
    exposure: BotPortExposure;
    when: BotPortActivation;
    modes: BotMode[];
}

BotRequirements ​

Origem e validação

ts
export interface BotRequirements {
    /** Bot-specific host access shown in the operator consent, e.g. external services it contacts. */
    notice?: BotLocalizedText;
    ports: BotPortRequirement[];
    settings: BotSettingRequirement[];
}

BotSettingRequirement ​

Origem e validação

ts
export interface BotSettingRequirement {
    env: string;
    description: BotLocalizedText;
    required: boolean;
    secret: boolean;
    modes: BotMode[];
}

BotUpdateSource ​

Origem e validação

ts
export type BotUpdateSource = HttpsUpdateSource | FileUpdateSource;

BuildBotOptions ​

Origem e validação

ts
export interface BuildBotOptions {
    root?: string;
    out?: string;
    version?: string;
    skipBuild?: boolean;
}

buildBotPackage ​

Origem e validação

ts
export function buildBotPackage(options?: BuildBotOptions): BuiltBotPackage;

BuiltBotPackage ​

Origem e validação

ts
export interface BuiltBotPackage {
    file: string;
    name: string;
    version: string;
    cliName: string;
    protocolVersion: number;
    packageCount: number;
}

CliChoice ​

Origem e validação

ts
export interface CliChoice<T extends string> {
    value: T;
    label: string;
}

CliPromptCancelled ​

Origem e validação

ts
export class CliPromptCancelled extends CliError {
    constructor();
}

CliPromptIO ​

Origem e validação

ts
export interface CliPromptIO {
    input: Readable & {
        isTTY?: boolean;
        isRaw?: boolean;
        setRawMode?: (raw: boolean) => void;
    };
    output: Writable & {
        isTTY?: boolean;
        columns?: number;
    };
}

downloadManagedToolAsset ​

Origem e validação

ts
export function downloadManagedToolAsset(asset: ManagedToolAsset, destination: string, signal: AbortSignal, callbacks?: ManagedToolDownloadCallbacks): Promise<void>;

FileUpdateSource ​

Origem e validação

ts
export interface FileUpdateSource {
    type: 'file';
    path: string;
}

findManagedNodeAsset ​

Origem e validação

ts
export function findManagedNodeAsset(platform: NodeJS.Platform, arch: string, signal: AbortSignal): Promise<ManagedToolAsset>;

findManagedToolAsset ​

Origem e validação

ts
export function findManagedToolAsset(repository: ManagedToolRepository, name: string, signal: AbortSignal): Promise<ManagedToolAsset>;

GitHubReleaseSource ​

Origem e validação

ts
export interface GitHubReleaseSource {
    url: string;
    repository: string;
    assetName: string;
    tokenEnv: string;
}

handleReachabilityProbe ​

Origem e validação

ts
export function handleReachabilityProbe(request: http.IncomingMessage, response: http.ServerResponse, publicKeyHex?: string): boolean;

HttpsUpdateSource ​

Origem e validação

ts
export interface HttpsUpdateSource {
    type: 'https';
    url: string;
    tokenEnv?: string;
}

LIMITS ​

Origem e validação

ts
export const LIMITS = {
    MESSAGE_DELETE_UNDO_SECONDS: 60,
    MAX_MESSAGE_DELETE_UNDO_SECONDS: 86400,
    MAX_MESSAGE_LENGTH: 16000,
    // Game titles come from Steam's own manifests (#675); the cap only guards
    // against a tampered manifest, not against normal names.
    MAX_ACTIVITY_NAME_LENGTH: 128,
    // Steam caches app icons as 32x32 JPEGs, a couple of KB at most. The cap is
    // three orders of magnitude below MAX_AVATAR_SIZE on purpose: this field is
    // never a place to put bulk data, and the server has no maxPayload of its own.
    MAX_ACTIVITY_ICON_LENGTH: 32 * 1024,
    // Custom status (custom-status): a short phrase under the name and a tag
    // small enough to sit beside it, like the BRB tag.
    MAX_CUSTOM_STATUS_TEXT_LENGTH: 128,
    MAX_CUSTOM_STATUS_TAG_LENGTH: 12,
    // "Pedir para ver a partida" (#763): how long the player has to answer, and
    // how long the same person waits before asking the same player again.
    GAME_SHARE_REQUEST_TIMEOUT_MS: 30000,
    GAME_SHARE_REQUEST_COOLDOWN_MS: 60000,
    MAX_AVATAR_SIZE: 5 * 1024 * 1024, // 5 MB
    MAX_USERS_DEFAULT: 20,
    // Sentinel stored in `max_users` when the owner chose not to cap membership
    // (#403). The column is NOT NULL, so "no limit" needs a value rather than
    // NULL; 0 is safe because a server capped at zero members is meaningless.
    MAX_USERS_UNLIMITED: 0,
    // Voice channel user limit. 0 means no limit, which is how every channel
    // starts: servers before `voice-user-limit` capped each room at a hidden 10
    // that nobody could see or change. Two digits fit the sidebar badge.
    VOICE_USER_LIMIT_NONE: 0,
    VOICE_USER_LIMIT_MAX: 99,
    // Inactivity before a member is moved to the AFK channel. The server only
    // accepts the steps listed in AFK_TIMEOUT_OPTIONS_SECONDS.
    AFK_TIMEOUT_DEFAULT_SECONDS: 15 * 60,
    MIN_NICKNAME_LENGTH: 2,
    MAX_NICKNAME_LENGTH: 32,
    MIN_CHANNEL_NAME_LENGTH: 2,
    MAX_CHANNEL_NAME_LENGTH: 50,
    MIN_PORT: 1024,
    MAX_PORT: 65535,
    DEFAULT_PORT: 3000,
    // Lowest Node.js major the server runs on, because mediasoup requires it
    // (#515). The published CLI declares the same floor in its `engines` field,
    // but npm only *warns* on a mismatch, so the runtime has to be able to check
    // it too: PM2 spawns the server with the daemon's Node, which can be older
    // than the one the operator installed (#522).
    MIN_NODE_MAJOR: 22,
    // SFU (Selective Forwarding Unit) media port range (#515). Every transport
    // shares its first port, UDP and TCP, so only that one is ever bound (#824).
    SFU_DEFAULT_MIN_PORT: 40000,
    // Stops one below the coturn relay range (49152-65535), which must never
    // contain the SFU port: the two would race for it once both are enabled.
    SFU_DEFAULT_MAX_PORT: 49151,
    // coturn's listening port and relay range. They live here, and not only in
    // CoturnManager, so the SFU can check its own range against them without
    // depending on the TURN module.
    TURN_LISTENING_PORT: 3478,
    TURN_RELAY_MIN_PORT: 49152,
    TURN_RELAY_MAX_PORT: 65535,
    MAX_HISTORY_MESSAGES_INITIAL: 100,
    RATE_LIMIT_MAX_MESSAGES: 10,
    RATE_LIMIT_WINDOW_MS: 5000,
    /** Tentativas de autenticação por IP antes de o servidor parar de responder (#372). */
    RATE_LIMIT_MAX_AUTH_ATTEMPTS: 8,
    RATE_LIMIT_AUTH_WINDOW_MS: 60000,
    /**
     * Teto de um frame de WebSocket. O maior payload legítimo é um avatar em
     * base64 (MAX_AVATAR_SIZE cresce ~33% na codificação), e o padrão da lib ws
     * são 100 MiB, que qualquer cliente não autenticado podia mandar (#372).
     */
    WS_MAX_PAYLOAD_BYTES: 8 * 1024 * 1024,
    /**
     * Teto do `requestId` de qualquer mensagem. O servidor copia o id do autor
     * para eventos que vão a todos, então um id sem limite multiplicava um frame
     * de 8 MiB pelo número de conectados. Os clientes usam UUIDs (36 a ~80).
     */
    MAX_REQUEST_ID_LENGTH: 128,
    DM_RELAY_MAX_ITEMS: 50,
    DM_RELAY_DATA_MAX_LENGTH: 65536,
    DM_RELAY_FILE_DATA_MAX_LENGTH: 196608,
    DM_RELAY_TOTAL_DATA_MAX_LENGTH: 6 * 1024 * 1024,
    DM_RELAY_RATE_ITEMS_PER_SECOND: 40,
    DM_RELAY_RATE_ITEMS_BURST: 200,
    DM_RELAY_RATE_BYTES_PER_SECOND: 1572864,
    DM_RELAY_RATE_BYTES_BURST: 6 * 1024 * 1024,
    DM_RELAY_FILE_BACKPRESSURE_BYTES: 8 * 1024 * 1024,
    HEARTBEAT_INTERVAL_MS: 5000,
    // Silence after which the server closes a connection, which also takes the
    // person out of the call (#458). Above the 12 s after which the desktop
    // client reconnects by itself, so a network hiccup is the client's to
    // handle, and four missed pings before the server gives up.
    HEARTBEAT_TIMEOUT_MS: 20000,
    RECONNECT_GRACE_MS: 20000,
    // How long a shutdown waits for peers to answer the close frame before their
    // sockets are forcibly destroyed. Without a bound, a single unresponsive peer
    // (sleeping laptop, dropped Wi-Fi) holds the HTTP server open for the ws
    // library's internal 30s close timeout, freezing the host's UI (#333).
    SHUTDOWN_GRACE_MS: 1500,
    // Entries kept in the logger's in-memory ring buffer. It feeds the log view
    // of a hosted server, so it has to be bounded — a server running for days
    // would otherwise grow it without limit.
    LOG_BUFFER_SIZE: 500,
    // Concurrent devices a single identity may hold (#309). Without a cap, an
    // already-online identity could open unlimited connections and bypass
    // maxUsers, since capacity counts people rather than connections.
    MAX_SESSIONS_PER_USER: 3,
    /** Maximum bots a server can have, separate from member cap (#569). */
    MAX_BOTS_DEFAULT: 10,
    /** Bot token length in bytes (displayed as hex = 64 chars). */
    BOT_TOKEN_BYTES: 32,
    /** Max slash commands a single bot may register at once (#569). */
    MAX_COMMANDS_PER_BOT: 50,
    /** Max options (parameters) per slash command (#569). */
    MAX_OPTIONS_PER_COMMAND: 10,
    MAX_BOT_FORM_FIELDS: 10,
    MAX_BOT_FORM_CHOICES: 20,
    MAX_BOT_FORM_LIST_ITEMS: 20,
    MAX_LIVE_ACTION_IMAGES: 5,
    MAX_LIVE_ACTION_IMAGE_DATA_LENGTH: 7000000,
    MAX_BOT_SETTINGS_VALUES_BYTES: 16 * 1024,
    MAX_BOT_SETTINGS_DEFINITION_BYTES: 64 * 1024,
    MAX_BOT_SETTINGS_CATALOG: 1000,
    MAX_BOT_INVOCATIONS_PER_SESSION: 5,
    MAX_BOT_INVOCATIONS: 1000,
    BOT_INTERACTION_TIMEOUT_MS: 5 * 60 * 1000,
    /** Per response, not a limit on the accumulated search results. */
    MAX_BOT_AUTOCOMPLETE_CHOICES: 20,
    MAX_BOT_AUTOCOMPLETE_QUERY_LENGTH: 200,
    MAX_BOT_AUTOCOMPLETE_CURSOR_LENGTH: 512,
    MAX_BOT_AUTOCOMPLETE_REQUESTS: 1000,
    BOT_AUTOCOMPLETE_DEBOUNCE_MS: 700,
    BOT_AUTOCOMPLETE_THROTTLE_MS: 500,
    BOT_AUTOCOMPLETE_TIMEOUT_MS: 15000,
    BOT_AUTOCOMPLETE_CHOICE_TTL_MS: 60000,
    MAX_BOT_AUDIO_PREVIEW_BYTES: 256 * 1024,
    BOT_AUDIO_PREVIEW_MAX_DURATION_MS: 10000,
    BOT_AUDIO_PREVIEW_TIMEOUT_MS: 30000,
    MAX_BOT_AUDIO_PREVIEW_REQUESTS: 100,
    MAX_BOT_AUDIO_PREVIEW_HANDLERS: 4,
    MAX_SOUNDBOARD_FILE_SIZE: 3 * 1024 * 1024,
    RECENT_SOUND_CACHE_DEFAULT_LIMIT: 20,
    RECENT_SOUND_CACHE_MIN_LIMIT: 1,
    RECENT_SOUND_CACHE_MAX_LIMIT: 100,
    RECENT_SOUND_CACHE_MAX_BYTES: 256 * 1024 * 1024,
    RECENT_SOUND_DOWNLOAD_RATE_LIMIT: 10,
    RECENT_SOUND_DOWNLOAD_RATE_WINDOW_MS: 60000,
    RECENT_SOUND_DOWNLOAD_TIMEOUT_MS: 120000,
    BOT_SOUND_DOWNLOAD_TIMEOUT_MS: 120000,
    // Chat attachments (#11). Both size limits are server-configurable; these are
    // only the initial defaults applied when a server is first created.
    MAX_ATTACHMENT_FILE_SIZE_DEFAULT: 50 * 1024 * 1024, // 50 MB per file
    MAX_ATTACHMENT_STORAGE_TOTAL_DEFAULT: 2 * 1024 * 1024 * 1024, // 2 GB total server budget
    MAX_ATTACHMENTS_PER_MESSAGE: 10,
    // FIFO eviction low-watermark: when the total budget is exceeded, prune oldest
    // attachments until usage drops to this fraction of the max (avoids per-upload churn).
    ATTACHMENT_EVICTION_LOW_WATERMARK: 0.9,
    // Short-lived token that authorizes an HTTP POST /attachments upload.
    UPLOAD_TOKEN_TTL_MS: 60000,
} as const;

MANAGED_NODE_VERSION ​

Origem e validação

ts
export const MANAGED_NODE_VERSION = '24.20.0';

MANAGED_TOOL_MAX_DOWNLOAD ​

Origem e validação

ts
export const MANAGED_TOOL_MAX_DOWNLOAD = 350 * 1024 * 1024;

managedFfmpegArchiveEntry ​

Origem e validação

ts
export function managedFfmpegArchiveEntry(archiveName: string): string;

managedNodeArtifact ​

Origem e validação

ts
export function managedNodeArtifact(platform: NodeJS.Platform, arch: string): {
    name: string;
    entry: string | null;
};

ManagedToolAsset ​

Origem e validação

ts
export interface ManagedToolAsset {
    name: string;
    url: string;
    size: number;
    sha256: string;
    version: string;
}

ManagedToolDownloadCallbacks ​

Origem e validação

ts
export interface ManagedToolDownloadCallbacks {
    onProgress?: (progress: ManagedToolDownloadProgress) => void;
    onVerify?: () => void;
}

ManagedToolDownloadError ​

Origem e validação

ts
export class ManagedToolDownloadError extends Error {
    constructor(code: ManagedToolDownloadFailure, parameters?: Record<string, string | number>);
    readonly code: ManagedToolDownloadFailure;
    readonly parameters: Record<string, string | number>;
}

ManagedToolDownloadFailure ​

Origem e validação

ts
export type ManagedToolDownloadFailure = "downloadOrigin" | "downloadRedirects" | "downloadRedirectMissing" | "downloadHttp" | "responseEmpty" | "responseTooLarge" | "releaseInvalid" | "assetInvalid" | "checksumMissing" | "checksumAmbiguous" | "metadataInvalid" | "downloadEmpty" | "downloadTooLarge" | "downloadWriteFailed" | "downloadMismatch" | "archiveUnsupported";

ManagedToolDownloadProgress ​

Origem e validação

ts
export interface ManagedToolDownloadProgress {
    receivedBytes: number;
    totalBytes: number;
    done?: boolean;
}

ManagedToolRepository ​

Origem e validação

ts
export type ManagedToolRepository = "yt-dlp/yt-dlp" | "yt-dlp/FFmpeg-Builds" | "eugeneware/ffmpeg-static";

MessageType ​

Origem e validação

ts
export enum MessageType {
    COMMUNITY_GET = 'COMMUNITY_GET',
    COMMUNITY_IMAGE_UPLOAD = 'COMMUNITY_IMAGE_UPLOAD',
    COMMUNITY_UPDATE_SETTINGS = 'COMMUNITY_UPDATE_SETTINGS',
    COMMUNITY_SNAPSHOT = 'COMMUNITY_SNAPSHOT',
    COMMUNITY_ACK = 'COMMUNITY_ACK',
    EVENT_SAVE = 'EVENT_SAVE',
    EVENT_GET = 'EVENT_GET',
    EVENT_GET_INTERESTED = 'EVENT_GET_INTERESTED',
    EVENT_INTERESTED_LIST = 'EVENT_INTERESTED_LIST',
    EVENT_SAVED = 'EVENT_SAVED',
    EVENT_CONTROL = 'EVENT_CONTROL',
    EVENT_INTEREST = 'EVENT_INTEREST',
    EVENT_STARTED = 'EVENT_STARTED',
    LIVE_ACTION_CREATE = 'LIVE_ACTION_CREATE',
    LIVE_ACTION_UPDATE = 'LIVE_ACTION_UPDATE',
    LIVE_ACTION_CLOSE = 'LIVE_ACTION_CLOSE',
    LIVE_ACTION_LIST = 'LIVE_ACTION_LIST',
    LIVE_ACTION_LIST_RESULT = 'LIVE_ACTION_LIST_RESULT',
    LIVE_ACTION_SNAPSHOT = 'LIVE_ACTION_SNAPSHOT',
    LIVE_ACTION_SUBMIT = 'LIVE_ACTION_SUBMIT',
    LIVE_ACTION_SUBMITTED = 'LIVE_ACTION_SUBMITTED',
    NATIVE_FORM_CREATE = 'NATIVE_FORM_CREATE',
    NATIVE_FORM_SUBMIT = 'NATIVE_FORM_SUBMIT',
    NATIVE_FORM_CLOSE = 'NATIVE_FORM_CLOSE',
    NATIVE_FORM_RESULTS = 'NATIVE_FORM_RESULTS',
    NATIVE_FORM_SNAPSHOT = 'NATIVE_FORM_SNAPSHOT',
    NATIVE_FORM_RESULTS_RESULT = 'NATIVE_FORM_RESULTS_RESULT',
    FORUM_LIST = 'FORUM_LIST',
    FORUM_LIST_RESULT = 'FORUM_LIST_RESULT',
    FORUM_CREATE_POST = 'FORUM_CREATE_POST',
    FORUM_UPDATE_POST = 'FORUM_UPDATE_POST',
    FORUM_DELETE_POST = 'FORUM_DELETE_POST',
    FORUM_POST_SAVED = 'FORUM_POST_SAVED',
    CHAT_SEARCH = 'CHAT_SEARCH',
    CHAT_SEARCH_RESULTS = 'CHAT_SEARCH_RESULTS',
    SELECTOR_CREATE = 'SELECTOR_CREATE',
    SELECTOR_LIST = 'SELECTOR_LIST',
    SELECTOR_UPDATE = 'SELECTOR_UPDATE',
    SELECTOR_CLOSE = 'SELECTOR_CLOSE',
    SELECTOR_RESPOND = 'SELECTOR_RESPOND',
    SELECTOR_RESPONDED = 'SELECTOR_RESPONDED',
    SELECTOR_FINALIZE = 'SELECTOR_FINALIZE',
    SELECTOR_SNAPSHOT = 'SELECTOR_SNAPSHOT',
    SELECTOR_LIST_RESULT = 'SELECTOR_LIST_RESULT',
    BOT_SCREEN_CREATE = 'BOT_SCREEN_CREATE',
    BOT_SCREEN_UPDATE = 'BOT_SCREEN_UPDATE',
    BOT_SCREEN_CLOSE = 'BOT_SCREEN_CLOSE',
    BOT_SCREEN_END = 'BOT_SCREEN_END',
    BOT_SCREEN_LIST = 'BOT_SCREEN_LIST',
    BOT_SCREEN_SNAPSHOT = 'BOT_SCREEN_SNAPSHOT',
    BOT_SCREEN_LIST_RESULT = 'BOT_SCREEN_LIST_RESULT',
    BOT_SCREEN_ACTION = 'BOT_SCREEN_ACTION',
    BOT_SCREEN_ACTION_EVENT = 'BOT_SCREEN_ACTION_EVENT',
    BOT_SCREEN_REMOVED = 'BOT_SCREEN_REMOVED',
    /** Bot -> server (`server_storage`): objects kept by the bot on the Monky server. */
    BOT_STORAGE_PUT = 'BOT_STORAGE_PUT',
    BOT_STORAGE_SAVED = 'BOT_STORAGE_SAVED',
    BOT_STORAGE_GET = 'BOT_STORAGE_GET',
    BOT_STORAGE_GET_RESULT = 'BOT_STORAGE_GET_RESULT',
    BOT_STORAGE_DELETE = 'BOT_STORAGE_DELETE',
    BOT_STORAGE_DELETED = 'BOT_STORAGE_DELETED',
    BOT_STORAGE_LIST = 'BOT_STORAGE_LIST',
    BOT_STORAGE_LIST_RESULT = 'BOT_STORAGE_LIST_RESULT',
    BOT_STORAGE_USAGE = 'BOT_STORAGE_USAGE',
    BOT_STORAGE_USAGE_RESULT = 'BOT_STORAGE_USAGE_RESULT',
    /** Client -> server (`bot-storage`): usage and grants of one bot's storage. */
    BOT_STORAGE_INFO_GET = 'BOT_STORAGE_INFO_GET',
    /** Client -> server (`bot-storage`, MANAGE_BOTS). */
    BOT_STORAGE_LIMIT_UPDATE = 'BOT_STORAGE_LIMIT_UPDATE',
    /** Client -> server (`bot-storage`, MANAGE_BOTS): deletes everything the bot keeps on the server. */
    BOT_STORAGE_CLEAR = 'BOT_STORAGE_CLEAR',
    BOT_STORAGE_INFO = 'BOT_STORAGE_INFO',
    /** Server -> clients (`bot-storage`): a bot's server storage changed warning level. */
    BOT_STORAGE_LEVEL = 'BOT_STORAGE_LEVEL',
    BOT_VOICE_CONTEXT = 'BOT_VOICE_CONTEXT',
    BOT_VOICE_CONTEXT_RESULT = 'BOT_VOICE_CONTEXT_RESULT',
    BOT_LOCAL_SOURCE_REQUEST = 'BOT_LOCAL_SOURCE_REQUEST',
    BOT_LOCAL_SOURCE_RESULT = 'BOT_LOCAL_SOURCE_RESULT',
    BOT_LOCAL_TASK_REQUEST = 'BOT_LOCAL_TASK_REQUEST',
    BOT_LOCAL_TASK_OFFER = 'BOT_LOCAL_TASK_OFFER',
    BOT_LOCAL_TASK_ACCEPT = 'BOT_LOCAL_TASK_ACCEPT',
    BOT_LOCAL_TASK_CONTROL = 'BOT_LOCAL_TASK_CONTROL',
    BOT_LOCAL_TASK_EVENT = 'BOT_LOCAL_TASK_EVENT',
    BOT_LOCAL_MEDIA_SIGNAL = 'BOT_LOCAL_MEDIA_SIGNAL',
    // Client -> Server
    AUTH_CONNECT = 'AUTH_CONNECT',
    AUTH_CHALLENGE_RESPONSE = 'AUTH_CHALLENGE_RESPONSE',
    CHAT_SEND = 'CHAT_SEND',
    CHAT_REACTION_ADD = 'CHAT_REACTION_ADD',
    CHAT_REACTION_REMOVE = 'CHAT_REACTION_REMOVE',
    CHAT_REACTION_ADDED = 'CHAT_REACTION_ADDED',
    CHAT_REACTION_REMOVED = 'CHAT_REACTION_REMOVED',
    CHAT_LOAD_HISTORY = 'CHAT_LOAD_HISTORY',
    CHAT_MENTIONS_READ = 'CHAT_MENTIONS_READ',
    /** Client -> server: rewrite the content of a message the caller wrote (#504). */
    CHAT_EDIT = 'CHAT_EDIT',
    /** Client -> server: delete a message (own, or anyone's with MANAGE_SERVER) (#504). */
    CHAT_DELETE = 'CHAT_DELETE',
    CHAT_RESTORE = 'CHAT_RESTORE',
    CHAT_REQUEST_UPLOAD_TOKEN = 'CHAT_REQUEST_UPLOAD_TOKEN',
    CHANNEL_CREATE = 'CHANNEL_CREATE',
    CHANNEL_UPDATE = 'CHANNEL_UPDATE',
    CHANNEL_DELETE = 'CHANNEL_DELETE',
    CHANNEL_REORDER = 'CHANNEL_REORDER',
    CATEGORY_CREATE = 'CATEGORY_CREATE',
    CATEGORY_UPDATE = 'CATEGORY_UPDATE',
    CATEGORY_DELETE = 'CATEGORY_DELETE',
    CATEGORY_REORDER = 'CATEGORY_REORDER',
    CATEGORIES_UPDATED = 'CATEGORIES_UPDATED',
    USER_CHANGE_NICKNAME = 'USER_CHANGE_NICKNAME',
    USER_UPDATE_AVATAR = 'USER_UPDATE_AVATAR',
    SERVER_UPDATE_SETTINGS = 'SERVER_UPDATE_SETTINGS',
    ROLE_CREATE = 'ROLE_CREATE',
    ROLE_UPDATE = 'ROLE_UPDATE',
    ROLE_DELETE = 'ROLE_DELETE',
    ROLE_ASSIGN = 'ROLE_ASSIGN',
    ROLE_UNASSIGN = 'ROLE_UNASSIGN',
    VOICE_JOIN = 'VOICE_JOIN',
    VOICE_RECONNECT = 'VOICE_RECONNECT',
    VOICE_RECONNECTED = 'VOICE_RECONNECTED',
    VOICE_LEAVE = 'VOICE_LEAVE',
    VOICE_STATE_UPDATE = 'VOICE_STATE_UPDATE',
    VOICE_AFK = 'VOICE_AFK',
    ADMIN_MUTE_USER = 'ADMIN_MUTE_USER',
    ADMIN_DEAFEN_USER = 'ADMIN_DEAFEN_USER',
    ADMIN_GET_VOICE_RESTRICTIONS = 'ADMIN_GET_VOICE_RESTRICTIONS',
    ADMIN_KICK_VOICE = 'ADMIN_KICK_VOICE',
    ADMIN_MOVE_USER = 'ADMIN_MOVE_USER',
    MEMBER_KICK = 'MEMBER_KICK',
    RTC_SIGNAL = 'RTC_SIGNAL',
    NATIVE_SCREEN_SIGNAL = 'NATIVE_SCREEN_SIGNAL',
    NATIVE_SCREEN_SIGNAL_ACK = 'NATIVE_SCREEN_SIGNAL_ACK',
    SCREEN_VIEWERS_GET = 'SCREEN_VIEWERS_GET',
    SCREEN_VIEWERS_RESULT = 'SCREEN_VIEWERS_RESULT',
    RTC_DIAGNOSTICS_REPORT = 'RTC_DIAGNOSTICS_REPORT',
    PING = 'PING',
    USER_LOGOUT = 'USER_LOGOUT',
    SOUNDBOARD_PLAY = 'SOUNDBOARD_PLAY',
    RECENT_SOUND_RECORD = 'RECENT_SOUND_RECORD',
    RECENT_SOUNDS_LIST = 'RECENT_SOUNDS_LIST',
    RECENT_SOUND_DOWNLOAD = 'RECENT_SOUND_DOWNLOAD',
    DM_RELAY_SEND = 'DM_RELAY_SEND',
    /**
     * Client -> server, when the person who triggered a sound stops it. The audio
     * is broadcast once and then played by each listener on their own, so a stop
     * has to travel the same way or only the sender would fall silent (#499).
     */
    SOUNDBOARD_STOP = 'SOUNDBOARD_STOP',
    /** Client -> server: toggle appear-offline visibility while connected (#561). */
    USER_UPDATE_VISIBILITY = 'USER_UPDATE_VISIBILITY',
    /** Client -> server: publish (or clear, with null) the game being played (#675). */
    USER_UPDATE_ACTIVITY = 'USER_UPDATE_ACTIVITY',
    /** Client -> server: turn the "be right back" status on or off (user-brb). */
    USER_UPDATE_BRB = 'USER_UPDATE_BRB',
    /** Client -> server: set (or clear, with null) the person's custom status (custom-status). */
    USER_UPDATE_CUSTOM_STATUS = 'USER_UPDATE_CUSTOM_STATUS',
    /** Client -> server: ask a player in the same voice channel to share their game window (#763). */
    GAME_SHARE_REQUEST = 'GAME_SHARE_REQUEST',
    /** Server -> requester: the ask reached the player; carries the id the answer will refer to (#763). */
    GAME_SHARE_REQUEST_SENT = 'GAME_SHARE_REQUEST_SENT',
    /** Server -> player: someone asked to watch the game (#763). */
    GAME_SHARE_REQUESTED = 'GAME_SHARE_REQUESTED',
    /** Client -> server: the player's answer (#763). */
    GAME_SHARE_RESPONSE = 'GAME_SHARE_RESPONSE',
    /** Server -> requester: accepted or not; a refusal and a timeout look the same on purpose (#763). */
    GAME_SHARE_ANSWERED = 'GAME_SHARE_ANSWERED',
    /** Server -> player: the ask is over (answered elsewhere, expired, already sharing), close the prompt (#763). */
    GAME_SHARE_CLOSED = 'GAME_SHARE_CLOSED',
    SERVER_GET_INVITE_INFO = 'SERVER_GET_INVITE_INFO',
    // SFU Client <-> Server Messages (#515)
    SFU_GET_ROUTER_RTP_CAPABILITIES = 'SFU_GET_ROUTER_RTP_CAPABILITIES',
    SFU_ROUTER_RTP_CAPABILITIES = 'SFU_ROUTER_RTP_CAPABILITIES',
    SFU_CREATE_WEBRTC_TRANSPORT = 'SFU_CREATE_WEBRTC_TRANSPORT',
    SFU_WEBRTC_TRANSPORT_CREATED = 'SFU_WEBRTC_TRANSPORT_CREATED',
    SFU_CONNECT_WEBRTC_TRANSPORT = 'SFU_CONNECT_WEBRTC_TRANSPORT',
    SFU_WEBRTC_TRANSPORT_CONNECTED = 'SFU_WEBRTC_TRANSPORT_CONNECTED',
    SFU_CLOSE_WEBRTC_TRANSPORT = 'SFU_CLOSE_WEBRTC_TRANSPORT',
    SFU_WEBRTC_TRANSPORT_CLOSED = 'SFU_WEBRTC_TRANSPORT_CLOSED',
    SFU_PRODUCE = 'SFU_PRODUCE',
    SFU_PRODUCED = 'SFU_PRODUCED',
    SFU_CONSUME = 'SFU_CONSUME',
    SFU_CONSUMED = 'SFU_CONSUMED',
    SFU_PRODUCER_CLOSED = 'SFU_PRODUCER_CLOSED',
    SFU_PRODUCER_SET_PAUSED = 'SFU_PRODUCER_SET_PAUSED',
    SFU_CONSUMER_CLOSED = 'SFU_CONSUMER_CLOSED',
    SFU_CONSUMER_SET_PAUSED = 'SFU_CONSUMER_SET_PAUSED',
    SFU_NEW_PRODUCER = 'SFU_NEW_PRODUCER',
    SFU_GET_PRODUCERS = 'SFU_GET_PRODUCERS',
    SFU_PRODUCERS_LIST = 'SFU_PRODUCERS_LIST',
    // Bot & Slash Command Messages (#569)
    /** Admin -> server: create a new bot account. */
    BOT_CREATE = 'BOT_CREATE',
    /** Server -> admin: bot created with its one-time token. */
    BOT_CREATED = 'BOT_CREATED',
    /** Admin -> server: list all bots on this server. */
    BOT_LIST = 'BOT_LIST',
    /** Server -> admin: the bot list. */
    BOT_LIST_RESPONSE = 'BOT_LIST_RESPONSE',
    /** Admin -> server: revoke a bot's token and disconnect it. */
    BOT_REVOKE = 'BOT_REVOKE',
    /** Server -> members and the affected bot: its installation was revoked. */
    BOT_REVOKED = 'BOT_REVOKED',
    BOT_UPDATE_PROFILE = 'BOT_UPDATE_PROFILE',
    BOT_PROFILE_UPDATED = 'BOT_PROFILE_UPDATED',
    BOT_SETTINGS_LIST = 'BOT_SETTINGS_LIST',
    BOT_SETTINGS_LIST_RESPONSE = 'BOT_SETTINGS_LIST_RESPONSE',
    BOT_SETTINGS_GET = 'BOT_SETTINGS_GET',
    BOT_SETTINGS_UPDATE = 'BOT_SETTINGS_UPDATE',
    BOT_SETTINGS_SNAPSHOT = 'BOT_SETTINGS_SNAPSHOT',
    BOT_PERMISSIONS_GET = 'BOT_PERMISSIONS_GET',
    BOT_PERMISSIONS_UPDATE = 'BOT_PERMISSIONS_UPDATE',
    BOT_PERMISSIONS_SNAPSHOT = 'BOT_PERMISSIONS_SNAPSHOT',
    BOT_INSTALL_PREVIEW = 'BOT_INSTALL_PREVIEW',
    BOT_INSTALL_PREVIEW_RESULT = 'BOT_INSTALL_PREVIEW_RESULT',
    /**
     * Bot runtime CLI -> server, before authentication (protocol 37): checks the
     * credential and reaches the bot's declared public ports without opening a
     * bot session, so a running bot is never replaced.
     */
    BOT_DIAGNOSTIC = 'BOT_DIAGNOSTIC',
    BOT_DIAGNOSTIC_RESULT = 'BOT_DIAGNOSTIC_RESULT',
    /** Bot -> server: register slash commands. */
    COMMAND_REGISTER = 'COMMAND_REGISTER',
    /** Server -> bot: commands were registered. */
    COMMAND_REGISTERED = 'COMMAND_REGISTERED',
    /** Client -> server: discover available commands. */
    COMMANDS_LIST = 'COMMANDS_LIST',
    /** Server -> client: available slash commands. */
    COMMANDS_LIST_RESPONSE = 'COMMANDS_LIST_RESPONSE',
    COMMAND_AUTOCOMPLETE = 'COMMAND_AUTOCOMPLETE',
    COMMAND_AUTOCOMPLETE_RESULT = 'COMMAND_AUTOCOMPLETE_RESULT',
    COMMAND_AUTOCOMPLETE_CANCEL = 'COMMAND_AUTOCOMPLETE_CANCEL',
    COMMAND_AUDIO_PREVIEW = 'COMMAND_AUDIO_PREVIEW',
    COMMAND_AUDIO_PREVIEW_RESULT = 'COMMAND_AUDIO_PREVIEW_RESULT',
    COMMAND_AUDIO_PREVIEW_CANCEL = 'COMMAND_AUDIO_PREVIEW_CANCEL',
    /** Client -> server: invoke a slash command. */
    COMMAND_INVOKE = 'COMMAND_INVOKE',
    COMMAND_INVOKED = 'COMMAND_INVOKED',
    COMMAND_PROMPT = 'COMMAND_PROMPT',
    COMMAND_SOUND_DOWNLOAD = 'COMMAND_SOUND_DOWNLOAD',
    COMMAND_SOUND_DOWNLOAD_RESULT = 'COMMAND_SOUND_DOWNLOAD_RESULT',
    COMMAND_SOUND_DOWNLOAD_CANCEL = 'COMMAND_SOUND_DOWNLOAD_CANCEL',
    COMMAND_SUBMIT = 'COMMAND_SUBMIT',
    COMMAND_SUBMITTED = 'COMMAND_SUBMITTED',
    COMMAND_CANCEL = 'COMMAND_CANCEL',
    COMMAND_FINISH = 'COMMAND_FINISH',
    COMMAND_FINISHED = 'COMMAND_FINISHED',
    /** Server -> client (from bot): command response (may be ephemeral). */
    COMMAND_RESPONSE = 'COMMAND_RESPONSE',
    /** Client -> server: install a bot from a manifest URL (#578). */
    BOT_INSTALL = 'BOT_INSTALL',
    /** Server -> client: bot was installed from manifest (#578). */
    BOT_INSTALLED = 'BOT_INSTALLED',
    // Server -> Client
    AUTH_CHALLENGE = 'AUTH_CHALLENGE',
    AUTH_SUCCESS = 'AUTH_SUCCESS',
    AUTH_FAILED = 'AUTH_FAILED',
    SERVER_STATE = 'SERVER_STATE',
    ROLES_LIST = 'ROLES_LIST',
    SERVER_SETTINGS_UPDATED = 'SERVER_SETTINGS_UPDATED',
    SERVER_MONITOR_GET = 'SERVER_MONITOR_GET',
    SERVER_MONITOR_SNAPSHOT = 'SERVER_MONITOR_SNAPSHOT',
    /** Client -> server (`server-audit`): one page of the server audit log. */
    SERVER_AUDIT_GET = 'SERVER_AUDIT_GET',
    SERVER_AUDIT_PAGE = 'SERVER_AUDIT_PAGE',
    /**
     * Server -> client, while coturn is being installed (#438). Purely
     * informational: a client that does not know it simply ignores it.
     */
    TURN_INSTALL_PROGRESS = 'TURN_INSTALL_PROGRESS',
    SERVER_INVITE_INFO = 'SERVER_INVITE_INFO',
    SERVER_SHUTDOWN = 'SERVER_SHUTDOWN',
    USER_JOINED = 'USER_JOINED',
    USER_LEFT = 'USER_LEFT',
    MEMBER_KICKED = 'MEMBER_KICKED',
    USER_UPDATED = 'USER_UPDATED',
    USER_CONNECTION_STATE = 'USER_CONNECTION_STATE',
    CHANNEL_CREATED = 'CHANNEL_CREATED',
    CHANNEL_UPDATED = 'CHANNEL_UPDATED',
    CHANNEL_DELETED = 'CHANNEL_DELETED',
    CHANNELS_REORDERED = 'CHANNELS_REORDERED',
    CHAT_MESSAGE = 'CHAT_MESSAGE',
    CHAT_HISTORY = 'CHAT_HISTORY',
    /** Server -> clients: an existing message was edited or deleted (#504). */
    CHAT_MESSAGE_UPDATED = 'CHAT_MESSAGE_UPDATED',
    CHAT_UPLOAD_TOKEN = 'CHAT_UPLOAD_TOKEN',
    POLL_CREATE = 'POLL_CREATE',
    POLL_VOTE = 'POLL_VOTE',
    POLL_CLOSE = 'POLL_CLOSE',
    POLL_UPDATED = 'POLL_UPDATED',
    /** Client -> server (`poll-voters`): complete voter list of a poll with public votes. */
    POLL_VOTERS = 'POLL_VOTERS',
    POLL_VOTERS_RESULT = 'POLL_VOTERS_RESULT',
    /** Client -> server (`poll-edit`): changes an open poll; answered with POLL_UPDATED. */
    POLL_EDIT = 'POLL_EDIT',
    /** Client -> server (`poll-edit`): the requester's current view of one poll, answered with POLL_UPDATED. */
    POLL_GET = 'POLL_GET',
    VOICE_USER_JOINED = 'VOICE_USER_JOINED',
    VOICE_USER_LEFT = 'VOICE_USER_LEFT',
    VOICE_STATE_CHANGED = 'VOICE_STATE_CHANGED',
    VOICE_RESTRICTIONS_UPDATED = 'VOICE_RESTRICTIONS_UPDATED',
    SOUNDBOARD_PLAYED = 'SOUNDBOARD_PLAYED',
    RECENT_SOUND_ADDED = 'RECENT_SOUND_ADDED',
    RECENT_SOUNDS_RESULT = 'RECENT_SOUNDS_RESULT',
    RECENT_SOUND_DATA = 'RECENT_SOUND_DATA',
    DM_RELAY_ACK = 'DM_RELAY_ACK',
    DM_RELAY_DELIVER = 'DM_RELAY_DELIVER',
    /** Server -> clients in the channel: drop this user's ongoing sound (#499). */
    SOUNDBOARD_STOPPED = 'SOUNDBOARD_STOPPED',
    SERVER_ERROR = 'SERVER_ERROR',
    PONG = 'PONG'
}

PROTOCOL_VERSION ​

Origem e validação

ts
export const PROTOCOL_VERSION = 40;

ProtocolErrorCode ​

Origem e validação

ts
export enum ProtocolErrorCode {
    AUTH_INVALID_PASSWORD = 'AUTH_INVALID_PASSWORD',
    NICKNAME_ALREADY_EXISTS = 'NICKNAME_ALREADY_EXISTS',
    NICKNAME_INVALID = 'NICKNAME_INVALID',
    CHANNEL_NOT_FOUND = 'CHANNEL_NOT_FOUND',
    CHANNEL_FULL = 'CHANNEL_FULL',
    MESSAGE_TOO_LONG = 'MESSAGE_TOO_LONG',
    RATE_LIMITED = 'RATE_LIMITED',
    /**
     * Tentativas de conexão limitadas por IP (#372). Separado de RATE_LIMITED
     * porque o cliente traduz por código: reusar aquele mostraria "você está
     * enviando mensagens rápido demais" para quem nem entrou no servidor.
     */
    AUTH_RATE_LIMITED = 'AUTH_RATE_LIMITED',
    AVATAR_TOO_LARGE = 'AVATAR_TOO_LARGE',
    AVATAR_INVALID_TYPE = 'AVATAR_INVALID_TYPE',
    ATTACHMENT_TOO_LARGE = 'ATTACHMENT_TOO_LARGE',
    ATTACHMENT_INVALID_TYPE = 'ATTACHMENT_INVALID_TYPE',
    STORAGE_FULL = 'STORAGE_FULL',
    SERVER_FULL = 'SERVER_FULL',
    PROTOCOL_VERSION_UNSUPPORTED = 'PROTOCOL_VERSION_UNSUPPORTED',
    /** The app or the server is too old for this feature: updating one of them makes it work. */
    FEATURE_REQUIRES_UPDATE = 'FEATURE_REQUIRES_UPDATE',
    /**
     * This server does not offer the feature at all (it was started without the service behind it),
     * so updating changes nothing. Sent only to peers that announce `feature-unavailable`; older ones
     * keep the code each route answered before.
     */
    FEATURE_UNAVAILABLE = 'FEATURE_UNAVAILABLE',
    INTERNAL_ERROR = 'INTERNAL_ERROR',
    UNAUTHORIZED = 'UNAUTHORIZED',
    PERMISSION_DENIED = 'PERMISSION_DENIED',
    BAD_REQUEST = 'BAD_REQUEST',
    COMMUNITY_INVALID = 'COMMUNITY_INVALID',
    COMMUNITY_CONFLICT = 'COMMUNITY_CONFLICT',
    FORUM_INVALID = 'FORUM_INVALID',
    MESSAGE_SEARCH_INVALID = 'MESSAGE_SEARCH_INVALID',
    BOT_OFFLINE = 'BOT_OFFLINE',
    DM_RELAY_DISABLED = 'DM_RELAY_DISABLED',
    BOT_COMMAND_NOT_FOUND = 'BOT_COMMAND_NOT_FOUND',
    BOT_INVALID_OPTIONS = 'BOT_INVALID_OPTIONS',
    BOT_INTERACTION_EXPIRED = 'BOT_INTERACTION_EXPIRED',
    BOT_INTERACTION_INVALID = 'BOT_INTERACTION_INVALID',
    BOT_SCREEN_CONFLICT = 'BOT_SCREEN_CONFLICT',
    BOT_SCREEN_NOT_FOUND = 'BOT_SCREEN_NOT_FOUND',
    BOT_COMMAND_BUSY = 'BOT_COMMAND_BUSY',
    BOT_VOICE_REQUIRED = 'BOT_VOICE_REQUIRED',
    BOT_VOICE_CHANNEL_MISMATCH = 'BOT_VOICE_CHANNEL_MISMATCH',
    BOT_INVALID_PROFILE = 'BOT_INVALID_PROFILE',
    BOT_SETTINGS_INVALID = 'BOT_SETTINGS_INVALID',
    BOT_SETTINGS_CONFLICT = 'BOT_SETTINGS_CONFLICT',
    BOT_PERMISSIONS_REQUIRED = 'BOT_PERMISSIONS_REQUIRED',
    BOT_CAPABILITIES_INVALID = 'BOT_CAPABILITIES_INVALID',
    BOT_PERMISSIONS_CONFLICT = 'BOT_PERMISSIONS_CONFLICT',
    BOT_MANIFEST_CHANGED = 'BOT_MANIFEST_CHANGED',
    /**
     * The relay cannot run on the host. Kept apart from BAD_REQUEST so the
     * client can explain what to do instead of showing a generic message (#429).
     */
    TURN_UNAVAILABLE = 'TURN_UNAVAILABLE',
    /**
     * The SFU cannot carry media on this host — typically a media port that is
     * blocked or already taken. Same intent as TURN_UNAVAILABLE: the switch is
     * refused with an actionable reason instead of being accepted and silently
     * degrading to P2P (#515).
     */
    SFU_UNAVAILABLE = 'SFU_UNAVAILABLE',
    VOICE_RECONNECT_EXPIRED = 'VOICE_RECONNECT_EXPIRED',
    /** A join following a move that a later move replaced: the connection stays where the later one put it. */
    VOICE_MOVE_SUPERSEDED = 'VOICE_MOVE_SUPERSEDED'
}

runBotCli ​

Origem e validação

ts
export function runBotCli(packageRoot: string, args?: string[]): Promise<void>;

validateBotName ​

Origem e validação

ts
export function validateBotName(value: unknown): string;

validateBotPublicHost ​

Origem e validação

ts
export function validateBotPublicHost(value: unknown): string;

validateBotServePort ​

Origem e validação

ts
export function validateBotServePort(value: unknown): number;

validateBotServerUrl ​

Origem e validação

ts
export function validateBotServerUrl(value: unknown): string;

validateBotToken ​

Origem e validação

ts
export function validateBotToken(value: unknown): string;