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
ts
export function askCliChoice<T extends string>(locale: BotLocale, question: string, choices: readonly CliChoice<T>[], initial?: T, io?: CliPromptIO): Promise<T>;askCliText
ts
export function askCliText(locale: BotLocale, question: string, options?: {
defaultValue?: string;
secret?: boolean;
}, io?: CliPromptIO): Promise<string>;askCliValue
ts
export function askCliValue<T>(locale: BotLocale, question: string, validate: (value: string) => T | Promise<T>, options?: {
defaultValue?: string;
secret?: boolean;
}): Promise<T>;BOT_CAPABILITIES
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
ts
export const BOT_LOCALES = ['pt-BR', 'en'] as const;BOT_STORAGE_LIMITS
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
ts
export interface BotLocalizedText {
'pt-BR': string;
en: string;
}BotPackageDefinition
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
ts
export type BotPortActivation = "always" | "on-demand";BotPortExposure
ts
export type BotPortExposure = "public" | "local";BotPortProtocol
ts
export type BotPortProtocol = "tcp" | "udp";BotPortRequirement
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
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
ts
export interface BotSettingRequirement {
env: string;
description: BotLocalizedText;
required: boolean;
secret: boolean;
modes: BotMode[];
}BotUpdateSource
ts
export type BotUpdateSource = HttpsUpdateSource | FileUpdateSource;BuildBotOptions
ts
export interface BuildBotOptions {
root?: string;
out?: string;
version?: string;
skipBuild?: boolean;
}buildBotPackage
ts
export function buildBotPackage(options?: BuildBotOptions): BuiltBotPackage;BuiltBotPackage
ts
export interface BuiltBotPackage {
file: string;
name: string;
version: string;
cliName: string;
protocolVersion: number;
packageCount: number;
}CliChoice
ts
export interface CliChoice<T extends string> {
value: T;
label: string;
}CliPromptCancelled
ts
export class CliPromptCancelled extends CliError {
constructor();
}CliPromptIO
ts
export interface CliPromptIO {
input: Readable & {
isTTY?: boolean;
isRaw?: boolean;
setRawMode?: (raw: boolean) => void;
};
output: Writable & {
isTTY?: boolean;
columns?: number;
};
}downloadManagedToolAsset
ts
export function downloadManagedToolAsset(asset: ManagedToolAsset, destination: string, signal: AbortSignal, callbacks?: ManagedToolDownloadCallbacks): Promise<void>;FileUpdateSource
ts
export interface FileUpdateSource {
type: 'file';
path: string;
}findManagedNodeAsset
ts
export function findManagedNodeAsset(platform: NodeJS.Platform, arch: string, signal: AbortSignal): Promise<ManagedToolAsset>;findManagedToolAsset
ts
export function findManagedToolAsset(repository: ManagedToolRepository, name: string, signal: AbortSignal): Promise<ManagedToolAsset>;GitHubReleaseSource
ts
export interface GitHubReleaseSource {
url: string;
repository: string;
assetName: string;
tokenEnv: string;
}handleReachabilityProbe
ts
export function handleReachabilityProbe(request: http.IncomingMessage, response: http.ServerResponse, publicKeyHex?: string): boolean;HttpsUpdateSource
ts
export interface HttpsUpdateSource {
type: 'https';
url: string;
tokenEnv?: string;
}LIMITS
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
ts
export const MANAGED_NODE_VERSION = '24.20.0';MANAGED_TOOL_MAX_DOWNLOAD
ts
export const MANAGED_TOOL_MAX_DOWNLOAD = 350 * 1024 * 1024;managedFfmpegArchiveEntry
ts
export function managedFfmpegArchiveEntry(archiveName: string): string;managedNodeArtifact
ts
export function managedNodeArtifact(platform: NodeJS.Platform, arch: string): {
name: string;
entry: string | null;
};ManagedToolAsset
ts
export interface ManagedToolAsset {
name: string;
url: string;
size: number;
sha256: string;
version: string;
}ManagedToolDownloadCallbacks
ts
export interface ManagedToolDownloadCallbacks {
onProgress?: (progress: ManagedToolDownloadProgress) => void;
onVerify?: () => void;
}ManagedToolDownloadError
ts
export class ManagedToolDownloadError extends Error {
constructor(code: ManagedToolDownloadFailure, parameters?: Record<string, string | number>);
readonly code: ManagedToolDownloadFailure;
readonly parameters: Record<string, string | number>;
}ManagedToolDownloadFailure
ts
export type ManagedToolDownloadFailure = "downloadOrigin" | "downloadRedirects" | "downloadRedirectMissing" | "downloadHttp" | "responseEmpty" | "responseTooLarge" | "releaseInvalid" | "assetInvalid" | "checksumMissing" | "checksumAmbiguous" | "metadataInvalid" | "downloadEmpty" | "downloadTooLarge" | "downloadWriteFailed" | "downloadMismatch" | "archiveUnsupported";ManagedToolDownloadProgress
ts
export interface ManagedToolDownloadProgress {
receivedBytes: number;
totalBytes: number;
done?: boolean;
}ManagedToolRepository
ts
export type ManagedToolRepository = "yt-dlp/yt-dlp" | "yt-dlp/FFmpeg-Builds" | "eugeneware/ffmpeg-static";MessageType
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
ts
export const PROTOCOL_VERSION = 40;ProtocolErrorCode
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
ts
export function runBotCli(packageRoot: string, args?: string[]): Promise<void>;validateBotName
ts
export function validateBotName(value: unknown): string;validateBotPublicHost
ts
export function validateBotPublicHost(value: unknown): string;validateBotServePort
ts
export function validateBotServePort(value: unknown): number;validateBotServerUrl
ts
export function validateBotServerUrl(value: unknown): string;validateBotToken
ts
export function validateBotToken(value: unknown): string;