/* eslint-disable */ /** * This file was automatically generated by json-schema-to-typescript. * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, * and run json-schema-to-typescript to regenerate this file. */ export interface ClawdbotConfig { $schema?: string; meta?: { lastTouchedVersion?: string; lastTouchedAt?: string; }; env?: { shellEnv?: { enabled?: boolean; timeoutMs?: number; }; vars?: { [k: string]: string; }; [k: string]: string; }; wizard?: { lastRunAt?: string; lastRunVersion?: string; lastRunCommit?: string; lastRunCommand?: string; lastRunMode?: "local" | "remote"; }; diagnostics?: { enabled?: boolean; flags?: string[]; otel?: { enabled?: boolean; endpoint?: string; protocol?: "http/protobuf" | "grpc"; headers?: { [k: string]: string; }; serviceName?: string; traces?: boolean; metrics?: boolean; logs?: boolean; sampleRate?: number; flushIntervalMs?: number; }; cacheTrace?: { enabled?: boolean; filePath?: string; includeMessages?: boolean; includePrompt?: boolean; includeSystem?: boolean; }; }; logging?: { level?: "silent" | "fatal" | "error" | "warn" | "info" | "debug" | "trace"; file?: string; consoleLevel?: "silent" | "fatal" | "error" | "warn" | "info" | "debug" | "trace"; consoleStyle?: "pretty" | "compact" | "json"; redactSensitive?: "off" | "tools"; redactPatterns?: string[]; }; update?: { channel?: "stable" | "beta" | "dev"; checkOnStart?: boolean; }; browser?: { enabled?: boolean; evaluateEnabled?: boolean; cdpUrl?: string; remoteCdpTimeoutMs?: number; remoteCdpHandshakeTimeoutMs?: number; color?: string; executablePath?: string; headless?: boolean; noSandbox?: boolean; attachOnly?: boolean; defaultProfile?: string; snapshotDefaults?: { mode?: "efficient"; }; profiles?: { [k: string]: { cdpPort?: number; cdpUrl?: string; driver?: "clawd" | "extension"; color: string; }; }; }; ui?: { seamColor?: string; assistant?: { name?: string; avatar?: string; }; }; auth?: { profiles?: { [k: string]: { provider: string; mode: "api_key" | "oauth" | "token"; email?: string; }; }; order?: { [k: string]: string[]; }; cooldowns?: { billingBackoffHours?: number; billingBackoffHoursByProvider?: { [k: string]: number; }; billingMaxHours?: number; failureWindowHours?: number; }; }; models?: { mode?: "merge" | "replace"; providers?: { [k: string]: { baseUrl: string; apiKey?: string; auth?: "api-key" | "aws-sdk" | "oauth" | "token"; api?: | "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai" | "github-copilot" | "bedrock-converse-stream"; headers?: { [k: string]: string; }; authHeader?: boolean; models: { id: string; name: string; api?: | "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai" | "github-copilot" | "bedrock-converse-stream"; reasoning?: boolean; input?: ("text" | "image")[]; cost?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number; }; contextWindow?: number; maxTokens?: number; headers?: { [k: string]: string; }; compat?: { supportsStore?: boolean; supportsDeveloperRole?: boolean; supportsReasoningEffort?: boolean; maxTokensField?: "max_completion_tokens" | "max_tokens"; }; }[]; }; }; bedrockDiscovery?: { enabled?: boolean; region?: string; providerFilter?: string[]; refreshInterval?: number; defaultContextWindow?: number; defaultMaxTokens?: number; }; }; nodeHost?: { browserProxy?: { enabled?: boolean; allowProfiles?: string[]; }; }; agents?: { defaults?: { model?: { primary?: string; fallbacks?: string[]; }; imageModel?: { primary?: string; fallbacks?: string[]; }; models?: { [k: string]: { alias?: string; params?: { [k: string]: unknown; }; }; }; workspace?: string; repoRoot?: string; skipBootstrap?: boolean; bootstrapMaxChars?: number; userTimezone?: string; timeFormat?: "auto" | "12" | "24"; envelopeTimezone?: string; envelopeTimestamp?: "on" | "off"; envelopeElapsed?: "on" | "off"; contextTokens?: number; cliBackends?: { [k: string]: { command: string; args?: string[]; output?: "json" | "text" | "jsonl"; resumeOutput?: "json" | "text" | "jsonl"; input?: "arg" | "stdin"; maxPromptArgChars?: number; env?: { [k: string]: string; }; clearEnv?: string[]; modelArg?: string; modelAliases?: { [k: string]: string; }; sessionArg?: string; sessionArgs?: string[]; resumeArgs?: string[]; sessionMode?: "always" | "existing" | "none"; sessionIdFields?: string[]; systemPromptArg?: string; systemPromptMode?: "append" | "replace"; systemPromptWhen?: "first" | "always" | "never"; imageArg?: string; imageMode?: "repeat" | "list"; serialize?: boolean; }; }; memorySearch?: { enabled?: boolean; sources?: ("memory" | "sessions")[]; experimental?: { sessionMemory?: boolean; }; provider?: "openai" | "local" | "gemini"; remote?: { baseUrl?: string; apiKey?: string; headers?: { [k: string]: string; }; batch?: { enabled?: boolean; wait?: boolean; concurrency?: number; pollIntervalMs?: number; timeoutMinutes?: number; }; }; fallback?: "openai" | "gemini" | "local" | "none"; model?: string; local?: { modelPath?: string; modelCacheDir?: string; }; store?: { driver?: "sqlite"; path?: string; vector?: { enabled?: boolean; extensionPath?: string; }; }; chunking?: { tokens?: number; overlap?: number; }; sync?: { onSessionStart?: boolean; onSearch?: boolean; watch?: boolean; watchDebounceMs?: number; intervalMinutes?: number; sessions?: { deltaBytes?: number; deltaMessages?: number; }; }; query?: { maxResults?: number; minScore?: number; hybrid?: { enabled?: boolean; vectorWeight?: number; textWeight?: number; candidateMultiplier?: number; }; }; cache?: { enabled?: boolean; maxEntries?: number; }; }; contextPruning?: { mode?: "off" | "cache-ttl"; ttl?: string; keepLastAssistants?: number; softTrimRatio?: number; hardClearRatio?: number; minPrunableToolChars?: number; tools?: { allow?: string[]; deny?: string[]; }; softTrim?: { maxChars?: number; headChars?: number; tailChars?: number; }; hardClear?: { enabled?: boolean; placeholder?: string; }; }; compaction?: { mode?: "default" | "safeguard"; reserveTokensFloor?: number; maxHistoryShare?: number; memoryFlush?: { enabled?: boolean; softThresholdTokens?: number; prompt?: string; systemPrompt?: string; }; }; thinkingDefault?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"; verboseDefault?: "off" | "on" | "full"; elevatedDefault?: "off" | "on" | "ask" | "full"; blockStreamingDefault?: "off" | "on"; blockStreamingBreak?: "text_end" | "message_end"; blockStreamingChunk?: { minChars?: number; maxChars?: number; breakPreference?: "paragraph" | "newline" | "sentence"; }; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; humanDelay?: { mode?: "off" | "natural" | "custom"; minMs?: number; maxMs?: number; }; timeoutSeconds?: number; mediaMaxMb?: number; typingIntervalSeconds?: number; typingMode?: "never" | "instant" | "thinking" | "message"; heartbeat?: { every?: string; activeHours?: { start?: string; end?: string; timezone?: string; }; model?: string; session?: string; includeReasoning?: boolean; target?: string; to?: string; prompt?: string; ackMaxChars?: number; }; maxConcurrent?: number; subagents?: { maxConcurrent?: number; archiveAfterMinutes?: number; model?: | string | { primary?: string; fallbacks?: string[]; }; }; sandbox?: { mode?: "off" | "non-main" | "all"; workspaceAccess?: "none" | "ro" | "rw"; sessionToolsVisibility?: "spawned" | "all"; scope?: "session" | "agent" | "shared"; perSession?: boolean; workspaceRoot?: string; docker?: { image?: string; containerPrefix?: string; workdir?: string; readOnlyRoot?: boolean; tmpfs?: string[]; network?: string; user?: string; capDrop?: string[]; env?: { [k: string]: string; }; setupCommand?: string; pidsLimit?: number; memory?: string | number; memorySwap?: string | number; cpus?: number; ulimits?: { [k: string]: | string | number | { soft?: number; hard?: number; }; }; seccompProfile?: string; apparmorProfile?: string; dns?: string[]; extraHosts?: string[]; binds?: string[]; }; browser?: { enabled?: boolean; image?: string; containerPrefix?: string; cdpPort?: number; vncPort?: number; noVncPort?: number; headless?: boolean; enableNoVnc?: boolean; allowHostControl?: boolean; autoStart?: boolean; autoStartTimeoutMs?: number; }; prune?: { idleHours?: number; maxAgeDays?: number; }; }; }; list?: { id: string; default?: boolean; name?: string; workspace?: string; agentDir?: string; model?: | string | { primary?: string; fallbacks?: string[]; }; memorySearch?: { enabled?: boolean; sources?: ("memory" | "sessions")[]; experimental?: { sessionMemory?: boolean; }; provider?: "openai" | "local" | "gemini"; remote?: { baseUrl?: string; apiKey?: string; headers?: { [k: string]: string; }; batch?: { enabled?: boolean; wait?: boolean; concurrency?: number; pollIntervalMs?: number; timeoutMinutes?: number; }; }; fallback?: "openai" | "gemini" | "local" | "none"; model?: string; local?: { modelPath?: string; modelCacheDir?: string; }; store?: { driver?: "sqlite"; path?: string; vector?: { enabled?: boolean; extensionPath?: string; }; }; chunking?: { tokens?: number; overlap?: number; }; sync?: { onSessionStart?: boolean; onSearch?: boolean; watch?: boolean; watchDebounceMs?: number; intervalMinutes?: number; sessions?: { deltaBytes?: number; deltaMessages?: number; }; }; query?: { maxResults?: number; minScore?: number; hybrid?: { enabled?: boolean; vectorWeight?: number; textWeight?: number; candidateMultiplier?: number; }; }; cache?: { enabled?: boolean; maxEntries?: number; }; }; humanDelay?: { mode?: "off" | "natural" | "custom"; minMs?: number; maxMs?: number; }; heartbeat?: { every?: string; activeHours?: { start?: string; end?: string; timezone?: string; }; model?: string; session?: string; includeReasoning?: boolean; target?: string; to?: string; prompt?: string; ackMaxChars?: number; }; identity?: { name?: string; theme?: string; emoji?: string; avatar?: string; }; groupChat?: { mentionPatterns?: string[]; historyLimit?: number; }; subagents?: { allowAgents?: string[]; model?: | string | { primary?: string; fallbacks?: string[]; }; }; sandbox?: { mode?: "off" | "non-main" | "all"; workspaceAccess?: "none" | "ro" | "rw"; sessionToolsVisibility?: "spawned" | "all"; scope?: "session" | "agent" | "shared"; perSession?: boolean; workspaceRoot?: string; docker?: { image?: string; containerPrefix?: string; workdir?: string; readOnlyRoot?: boolean; tmpfs?: string[]; network?: string; user?: string; capDrop?: string[]; env?: { [k: string]: string; }; setupCommand?: string; pidsLimit?: number; memory?: string | number; memorySwap?: string | number; cpus?: number; ulimits?: { [k: string]: | string | number | { soft?: number; hard?: number; }; }; seccompProfile?: string; apparmorProfile?: string; dns?: string[]; extraHosts?: string[]; binds?: string[]; }; browser?: { enabled?: boolean; image?: string; containerPrefix?: string; cdpPort?: number; vncPort?: number; noVncPort?: number; headless?: boolean; enableNoVnc?: boolean; allowHostControl?: boolean; autoStart?: boolean; autoStartTimeoutMs?: number; }; prune?: { idleHours?: number; maxAgeDays?: number; }; }; tools?: { profile?: "minimal" | "coding" | "messaging" | "full"; allow?: string[]; alsoAllow?: string[]; deny?: string[]; byProvider?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; profile?: "minimal" | "coding" | "messaging" | "full"; }; }; elevated?: { enabled?: boolean; allowFrom?: { [k: string]: (string | number)[]; }; }; exec?: { host?: "sandbox" | "gateway" | "node"; security?: "deny" | "allowlist" | "full"; ask?: "off" | "on-miss" | "always"; node?: string; pathPrepend?: string[]; safeBins?: string[]; backgroundMs?: number; timeoutSec?: number; approvalRunningNoticeMs?: number; cleanupMs?: number; notifyOnExit?: boolean; applyPatch?: { enabled?: boolean; allowModels?: string[]; }; }; sandbox?: { tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }[]; }; tools?: { profile?: "minimal" | "coding" | "messaging" | "full"; allow?: string[]; alsoAllow?: string[]; deny?: string[]; byProvider?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; profile?: "minimal" | "coding" | "messaging" | "full"; }; }; web?: { search?: { enabled?: boolean; provider?: "brave" | "perplexity"; apiKey?: string; maxResults?: number; timeoutSeconds?: number; cacheTtlMinutes?: number; perplexity?: { apiKey?: string; baseUrl?: string; model?: string; }; }; fetch?: { enabled?: boolean; maxChars?: number; timeoutSeconds?: number; cacheTtlMinutes?: number; maxRedirects?: number; userAgent?: string; }; }; media?: { models?: { provider?: string; model?: string; capabilities?: ("image" | "audio" | "video")[]; type?: "provider" | "cli"; command?: string; args?: string[]; prompt?: string; maxChars?: number; maxBytes?: number; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; profile?: string; preferredProfile?: string; }[]; concurrency?: number; image?: { enabled?: boolean; scope?: { default?: "allow" | "deny"; rules?: { action: "allow" | "deny"; match?: { channel?: string; chatType?: "direct" | "group" | "channel"; keyPrefix?: string; }; }[]; }; maxBytes?: number; maxChars?: number; prompt?: string; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; attachments?: { mode?: "first" | "all"; maxAttachments?: number; prefer?: "first" | "last" | "path" | "url"; }; models?: { provider?: string; model?: string; capabilities?: ("image" | "audio" | "video")[]; type?: "provider" | "cli"; command?: string; args?: string[]; prompt?: string; maxChars?: number; maxBytes?: number; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; profile?: string; preferredProfile?: string; }[]; }; audio?: { enabled?: boolean; scope?: { default?: "allow" | "deny"; rules?: { action: "allow" | "deny"; match?: { channel?: string; chatType?: "direct" | "group" | "channel"; keyPrefix?: string; }; }[]; }; maxBytes?: number; maxChars?: number; prompt?: string; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; attachments?: { mode?: "first" | "all"; maxAttachments?: number; prefer?: "first" | "last" | "path" | "url"; }; models?: { provider?: string; model?: string; capabilities?: ("image" | "audio" | "video")[]; type?: "provider" | "cli"; command?: string; args?: string[]; prompt?: string; maxChars?: number; maxBytes?: number; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; profile?: string; preferredProfile?: string; }[]; }; video?: { enabled?: boolean; scope?: { default?: "allow" | "deny"; rules?: { action: "allow" | "deny"; match?: { channel?: string; chatType?: "direct" | "group" | "channel"; keyPrefix?: string; }; }[]; }; maxBytes?: number; maxChars?: number; prompt?: string; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; attachments?: { mode?: "first" | "all"; maxAttachments?: number; prefer?: "first" | "last" | "path" | "url"; }; models?: { provider?: string; model?: string; capabilities?: ("image" | "audio" | "video")[]; type?: "provider" | "cli"; command?: string; args?: string[]; prompt?: string; maxChars?: number; maxBytes?: number; timeoutSeconds?: number; language?: string; providerOptions?: { [k: string]: { [k: string]: string | number | boolean; }; }; deepgram?: { detectLanguage?: boolean; punctuate?: boolean; smartFormat?: boolean; }; baseUrl?: string; headers?: { [k: string]: string; }; profile?: string; preferredProfile?: string; }[]; }; }; links?: { enabled?: boolean; scope?: { default?: "allow" | "deny"; rules?: { action: "allow" | "deny"; match?: { channel?: string; chatType?: "direct" | "group" | "channel"; keyPrefix?: string; }; }[]; }; maxLinks?: number; timeoutSeconds?: number; models?: { type?: "cli"; command: string; args?: string[]; timeoutSeconds?: number; }[]; }; message?: { allowCrossContextSend?: boolean; crossContext?: { allowWithinProvider?: boolean; allowAcrossProviders?: boolean; marker?: { enabled?: boolean; prefix?: string; suffix?: string; }; }; broadcast?: { enabled?: boolean; }; }; agentToAgent?: { enabled?: boolean; allow?: string[]; }; elevated?: { enabled?: boolean; allowFrom?: { [k: string]: (string | number)[]; }; }; exec?: { host?: "sandbox" | "gateway" | "node"; security?: "deny" | "allowlist" | "full"; ask?: "off" | "on-miss" | "always"; node?: string; pathPrepend?: string[]; safeBins?: string[]; backgroundMs?: number; timeoutSec?: number; cleanupMs?: number; notifyOnExit?: boolean; applyPatch?: { enabled?: boolean; allowModels?: string[]; }; }; subagents?: { tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; sandbox?: { tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; bindings?: { agentId: string; match: { channel: string; accountId?: string; peer?: { kind: "dm" | "group" | "channel"; id: string; }; guildId?: string; teamId?: string; }; }[]; broadcast?: { strategy?: "parallel" | "sequential"; [k: string]: string[]; }; audio?: { transcription?: { command: string[]; timeoutSeconds?: number; }; }; media?: { preserveFilenames?: boolean; }; messages?: { messagePrefix?: string; responsePrefix?: string; groupChat?: { mentionPatterns?: string[]; historyLimit?: number; }; queue?: { mode?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; byChannel?: { whatsapp?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; telegram?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; discord?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; slack?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; mattermost?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; signal?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; imessage?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; msteams?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; webchat?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; }; debounceMs?: number; debounceMsByChannel?: { [k: string]: number; }; cap?: number; drop?: "old" | "new" | "summarize"; }; inbound?: { debounceMs?: number; byChannel?: { [k: string]: number; }; }; ackReaction?: string; ackReactionScope?: "group-mentions" | "group-all" | "direct" | "all"; removeAckAfterReply?: boolean; tts?: { auto?: "off" | "always" | "inbound" | "tagged"; enabled?: boolean; mode?: "final" | "all"; provider?: "elevenlabs" | "openai" | "edge"; summaryModel?: string; modelOverrides?: { enabled?: boolean; allowText?: boolean; allowProvider?: boolean; allowVoice?: boolean; allowModelId?: boolean; allowVoiceSettings?: boolean; allowNormalization?: boolean; allowSeed?: boolean; }; elevenlabs?: { apiKey?: string; baseUrl?: string; voiceId?: string; modelId?: string; seed?: number; applyTextNormalization?: "auto" | "on" | "off"; languageCode?: string; voiceSettings?: { stability?: number; similarityBoost?: number; style?: number; useSpeakerBoost?: boolean; speed?: number; }; }; openai?: { apiKey?: string; model?: string; voice?: string; }; edge?: { enabled?: boolean; voice?: string; lang?: string; outputFormat?: string; pitch?: string; rate?: string; volume?: string; saveSubtitles?: boolean; proxy?: string; timeoutMs?: number; }; prefsPath?: string; maxTextLength?: number; timeoutMs?: number; }; }; commands: { native: boolean | "auto"; nativeSkills: boolean | "auto"; text?: boolean; bash?: boolean; bashForegroundMs?: number; config?: boolean; debug?: boolean; restart?: boolean; useAccessGroups?: boolean; }; approvals?: { exec?: { enabled?: boolean; mode?: "session" | "targets" | "both"; agentFilter?: string[]; sessionFilter?: string[]; targets?: { channel: string; to: string; accountId?: string; threadId?: string | number; }[]; }; }; session?: { scope?: "per-sender" | "global"; dmScope?: "main" | "per-peer" | "per-channel-peer"; identityLinks?: { [k: string]: string[]; }; resetTriggers?: string[]; idleMinutes?: number; reset?: { mode?: "daily" | "idle"; atHour?: number; idleMinutes?: number; }; resetByType?: { dm?: { mode?: "daily" | "idle"; atHour?: number; idleMinutes?: number; }; group?: { mode?: "daily" | "idle"; atHour?: number; idleMinutes?: number; }; thread?: { mode?: "daily" | "idle"; atHour?: number; idleMinutes?: number; }; }; resetByChannel?: { [k: string]: { mode?: "daily" | "idle"; atHour?: number; idleMinutes?: number; }; }; store?: string; typingIntervalSeconds?: number; typingMode?: "never" | "instant" | "thinking" | "message"; mainKey?: string; sendPolicy?: { default?: "allow" | "deny"; rules?: { action: "allow" | "deny"; match?: { channel?: string; chatType?: "direct" | "group" | "channel"; keyPrefix?: string; }; }[]; }; agentToAgent?: { maxPingPongTurns?: number; }; }; cron?: { enabled?: boolean; store?: string; maxConcurrentRuns?: number; }; hooks?: { enabled?: boolean; path?: string; token?: string; maxBodyBytes?: number; presets?: string[]; transformsDir?: string; mappings?: { id?: string; match?: { path?: string; source?: string; }; action?: "wake" | "agent"; wakeMode?: "now" | "next-heartbeat"; name?: string; sessionKey?: string; messageTemplate?: string; textTemplate?: string; deliver?: boolean; allowUnsafeExternalContent?: boolean; channel?: "last" | "whatsapp" | "telegram" | "discord" | "slack" | "signal" | "imessage" | "msteams"; to?: string; model?: string; thinking?: string; timeoutSeconds?: number; transform?: { module: string; export?: string; }; }[]; gmail?: { account?: string; label?: string; topic?: string; subscription?: string; pushToken?: string; hookUrl?: string; includeBody?: boolean; maxBytes?: number; renewEveryMinutes?: number; allowUnsafeExternalContent?: boolean; serve?: { bind?: string; port?: number; path?: string; }; tailscale?: { mode?: "off" | "serve" | "funnel"; path?: string; target?: string; }; model?: string; thinking?: "off" | "minimal" | "low" | "medium" | "high"; }; internal?: { enabled?: boolean; handlers?: { event: string; module: string; export?: string; }[]; entries?: { [k: string]: { enabled?: boolean; env?: { [k: string]: string; }; }; }; load?: { extraDirs?: string[]; }; installs?: { [k: string]: { source: "npm" | "archive" | "path"; spec?: string; sourcePath?: string; installPath?: string; version?: string; installedAt?: string; hooks?: string[]; }; }; }; }; web?: { enabled?: boolean; heartbeatSeconds?: number; reconnect?: { initialMs?: number; maxMs?: number; factor?: number; jitter?: number; maxAttempts?: number; }; }; channels?: { defaults?: { groupPolicy?: "open" | "disabled" | "allowlist"; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; whatsapp?: { accounts?: { [k: string]: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; configWrites?: boolean; enabled?: boolean; sendReadReceipts?: boolean; messagePrefix?: string; authDir?: string; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; selfChatMode?: boolean; allowFrom?: string[]; groupAllowFrom?: string[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; mediaMaxMb?: number; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; ackReaction?: { emoji?: string; direct: boolean; group: "always" | "mentions" | "never"; }; debounceMs: number; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; }; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; configWrites?: boolean; sendReadReceipts?: boolean; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; messagePrefix?: string; selfChatMode?: boolean; allowFrom?: string[]; groupAllowFrom?: string[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; mediaMaxMb: number; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; actions?: { reactions?: boolean; sendMessage?: boolean; polls?: boolean; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; ackReaction?: { emoji?: string; direct: boolean; group: "always" | "mentions" | "never"; }; debounceMs: number; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; telegram?: { name?: string; capabilities?: | string[] | { inlineButtons?: "off" | "dm" | "group" | "all" | "allowlist"; }; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; customCommands?: { command: unknown; description: unknown; }[]; configWrites?: boolean; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; botToken?: string; tokenFile?: string; replyToMode?: "off" | "first" | "all"; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; skills?: string[]; enabled?: boolean; allowFrom?: (string | number)[]; systemPrompt?: string; topics?: { [k: string]: { requireMention?: boolean; skills?: string[]; enabled?: boolean; allowFrom?: (string | number)[]; systemPrompt?: string; }; }; }; }; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; draftChunk?: { minChars?: number; maxChars?: number; breakPreference?: "paragraph" | "newline" | "sentence"; }; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; streamMode: "off" | "partial" | "block"; mediaMaxMb?: number; timeoutSeconds?: number; retry?: { attempts?: number; minDelayMs?: number; maxDelayMs?: number; jitter?: number; }; network?: { autoSelectFamily?: boolean; }; proxy?: string; webhookUrl?: string; webhookSecret?: string; webhookPath?: string; actions?: { reactions?: boolean; sendMessage?: boolean; deleteMessage?: boolean; }; reactionNotifications?: "off" | "own" | "all"; reactionLevel?: "off" | "ack" | "minimal" | "extensive"; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; linkPreview?: boolean; accounts?: { [k: string]: { name?: string; capabilities?: | string[] | { inlineButtons?: "off" | "dm" | "group" | "all" | "allowlist"; }; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; customCommands?: { command: unknown; description: unknown; }[]; configWrites?: boolean; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; botToken?: string; tokenFile?: string; replyToMode?: "off" | "first" | "all"; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; skills?: string[]; enabled?: boolean; allowFrom?: (string | number)[]; systemPrompt?: string; topics?: { [k: string]: { requireMention?: boolean; skills?: string[]; enabled?: boolean; allowFrom?: (string | number)[]; systemPrompt?: string; }; }; }; }; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; draftChunk?: { minChars?: number; maxChars?: number; breakPreference?: "paragraph" | "newline" | "sentence"; }; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; streamMode: "off" | "partial" | "block"; mediaMaxMb?: number; timeoutSeconds?: number; retry?: { attempts?: number; minDelayMs?: number; maxDelayMs?: number; jitter?: number; }; network?: { autoSelectFamily?: boolean; }; proxy?: string; webhookUrl?: string; webhookSecret?: string; webhookPath?: string; actions?: { reactions?: boolean; sendMessage?: boolean; deleteMessage?: boolean; }; reactionNotifications?: "off" | "own" | "all"; reactionLevel?: "off" | "ack" | "minimal" | "extensive"; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; linkPreview?: boolean; }; }; }; discord?: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; configWrites?: boolean; token?: string; allowBots?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; maxLinesPerMessage?: number; mediaMaxMb?: number; retry?: { attempts?: number; minDelayMs?: number; maxDelayMs?: number; jitter?: number; }; actions?: { reactions?: boolean; stickers?: boolean; emojiUploads?: boolean; stickerUploads?: boolean; polls?: boolean; permissions?: boolean; messages?: boolean; threads?: boolean; pins?: boolean; search?: boolean; memberInfo?: boolean; roleInfo?: boolean; roles?: boolean; channelInfo?: boolean; voiceStatus?: boolean; events?: boolean; moderation?: boolean; channels?: boolean; }; replyToMode?: "off" | "first" | "all"; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupEnabled?: boolean; groupChannels?: (string | number)[]; }; guilds?: { [k: string]: { slug?: string; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; reactionNotifications?: "off" | "own" | "all" | "allowlist"; users?: (string | number)[]; channels?: { [k: string]: { allow?: boolean; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; skills?: string[]; enabled?: boolean; users?: (string | number)[]; systemPrompt?: string; autoThread?: boolean; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; execApprovals?: { enabled?: boolean; approvers?: (string | number)[]; agentFilter?: string[]; sessionFilter?: string[]; }; intents?: { presence?: boolean; guildMembers?: boolean; }; accounts?: { [k: string]: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; configWrites?: boolean; token?: string; allowBots?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; maxLinesPerMessage?: number; mediaMaxMb?: number; retry?: { attempts?: number; minDelayMs?: number; maxDelayMs?: number; jitter?: number; }; actions?: { reactions?: boolean; stickers?: boolean; emojiUploads?: boolean; stickerUploads?: boolean; polls?: boolean; permissions?: boolean; messages?: boolean; threads?: boolean; pins?: boolean; search?: boolean; memberInfo?: boolean; roleInfo?: boolean; roles?: boolean; channelInfo?: boolean; voiceStatus?: boolean; events?: boolean; moderation?: boolean; channels?: boolean; }; replyToMode?: "off" | "first" | "all"; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupEnabled?: boolean; groupChannels?: (string | number)[]; }; guilds?: { [k: string]: { slug?: string; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; reactionNotifications?: "off" | "own" | "all" | "allowlist"; users?: (string | number)[]; channels?: { [k: string]: { allow?: boolean; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; skills?: string[]; enabled?: boolean; users?: (string | number)[]; systemPrompt?: string; autoThread?: boolean; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; execApprovals?: { enabled?: boolean; approvers?: (string | number)[]; agentFilter?: string[]; sessionFilter?: string[]; }; intents?: { presence?: boolean; guildMembers?: boolean; }; }; }; }; googlechat?: { name?: string; capabilities?: string[]; enabled?: boolean; configWrites?: boolean; allowBots?: boolean; requireMention?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; groupAllowFrom?: (string | number)[]; groups?: { [k: string]: { enabled?: boolean; allow?: boolean; requireMention?: boolean; users?: (string | number)[]; systemPrompt?: string; }; }; serviceAccount?: | string | { [k: string]: unknown; }; serviceAccountFile?: string; audienceType?: "app-url" | "project-number"; audience?: string; webhookPath?: string; webhookUrl?: string; botUser?: string; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; replyToMode?: "off" | "first" | "all"; actions?: { reactions?: boolean; }; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; }; typingIndicator?: "none" | "message" | "reaction"; accounts?: { [k: string]: { name?: string; capabilities?: string[]; enabled?: boolean; configWrites?: boolean; allowBots?: boolean; requireMention?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; groupAllowFrom?: (string | number)[]; groups?: { [k: string]: { enabled?: boolean; allow?: boolean; requireMention?: boolean; users?: (string | number)[]; systemPrompt?: string; }; }; serviceAccount?: | string | { [k: string]: unknown; }; serviceAccountFile?: string; audienceType?: "app-url" | "project-number"; audience?: string; webhookPath?: string; webhookUrl?: string; botUser?: string; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; replyToMode?: "off" | "first" | "all"; actions?: { reactions?: boolean; }; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; }; typingIndicator?: "none" | "message" | "reaction"; }; }; defaultAccount?: string; }; slack?: { name?: string; mode: "socket" | "http"; signingSecret?: string; webhookPath: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; configWrites?: boolean; botToken?: string; appToken?: string; userToken?: string; userTokenReadOnly: boolean; allowBots?: boolean; requireMention?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; reactionNotifications?: "off" | "own" | "all" | "allowlist"; reactionAllowlist?: (string | number)[]; replyToMode?: "off" | "first" | "all"; replyToModeByChatType?: { direct?: "off" | "first" | "all"; group?: "off" | "first" | "all"; channel?: "off" | "first" | "all"; }; thread?: { historyScope?: "thread" | "channel"; inheritParent?: boolean; }; actions?: { reactions?: boolean; messages?: boolean; pins?: boolean; search?: boolean; permissions?: boolean; memberInfo?: boolean; channelInfo?: boolean; emojiList?: boolean; }; slashCommand?: { enabled?: boolean; name?: string; sessionPrefix?: string; ephemeral?: boolean; }; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupEnabled?: boolean; groupChannels?: (string | number)[]; replyToMode?: "off" | "first" | "all"; }; channels?: { [k: string]: { enabled?: boolean; allow?: boolean; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; allowBots?: boolean; users?: (string | number)[]; skills?: string[]; systemPrompt?: string; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; accounts?: { [k: string]: { name?: string; mode?: "socket" | "http"; signingSecret?: string; webhookPath?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; commands?: { native?: boolean | "auto"; nativeSkills?: boolean | "auto"; }; configWrites?: boolean; botToken?: string; appToken?: string; userToken?: string; userTokenReadOnly: boolean; allowBots?: boolean; requireMention?: boolean; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; reactionNotifications?: "off" | "own" | "all" | "allowlist"; reactionAllowlist?: (string | number)[]; replyToMode?: "off" | "first" | "all"; replyToModeByChatType?: { direct?: "off" | "first" | "all"; group?: "off" | "first" | "all"; channel?: "off" | "first" | "all"; }; thread?: { historyScope?: "thread" | "channel"; inheritParent?: boolean; }; actions?: { reactions?: boolean; messages?: boolean; pins?: boolean; search?: boolean; permissions?: boolean; memberInfo?: boolean; channelInfo?: boolean; emojiList?: boolean; }; slashCommand?: { enabled?: boolean; name?: string; sessionPrefix?: string; ephemeral?: boolean; }; dm?: { enabled?: boolean; policy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupEnabled?: boolean; groupChannels?: (string | number)[]; replyToMode?: "off" | "first" | "all"; }; channels?: { [k: string]: { enabled?: boolean; allow?: boolean; requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; allowBots?: boolean; users?: (string | number)[]; skills?: string[]; systemPrompt?: string; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; }; }; signal?: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; configWrites?: boolean; account?: string; httpUrl?: string; httpHost?: string; httpPort?: number; cliPath?: string; autoStart?: boolean; startupTimeoutMs?: number; receiveMode?: "on-start" | "manual"; ignoreAttachments?: boolean; ignoreStories?: boolean; sendReadReceipts?: boolean; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; reactionNotifications?: "off" | "own" | "all" | "allowlist"; reactionAllowlist?: (string | number)[]; actions?: { reactions?: boolean; }; reactionLevel?: "off" | "ack" | "minimal" | "extensive"; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; accounts?: { [k: string]: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; configWrites?: boolean; account?: string; httpUrl?: string; httpHost?: string; httpPort?: number; cliPath?: string; autoStart?: boolean; startupTimeoutMs?: number; receiveMode?: "on-start" | "manual"; ignoreAttachments?: boolean; ignoreStories?: boolean; sendReadReceipts?: boolean; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaMaxMb?: number; reactionNotifications?: "off" | "own" | "all" | "allowlist"; reactionAllowlist?: (string | number)[]; actions?: { reactions?: boolean; }; reactionLevel?: "off" | "ack" | "minimal" | "extensive"; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; }; }; imessage?: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; configWrites?: boolean; cliPath?: string; dbPath?: string; remoteHost?: string; service?: "imessage" | "sms" | "auto"; region?: string; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; includeAttachments?: boolean; mediaMaxMb?: number; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; accounts?: { [k: string]: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; enabled?: boolean; configWrites?: boolean; cliPath?: string; dbPath?: string; remoteHost?: string; service?: "imessage" | "sms" | "auto"; region?: string; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; includeAttachments?: boolean; mediaMaxMb?: number; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; }; }; bluebubbles?: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; configWrites?: boolean; enabled?: boolean; serverUrl?: string; password?: string; webhookPath?: string; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; mediaMaxMb?: number; sendReadReceipts?: boolean; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; accounts?: { [k: string]: { name?: string; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; configWrites?: boolean; enabled?: boolean; serverUrl?: string; password?: string; webhookPath?: string; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: (string | number)[]; groupAllowFrom?: (string | number)[]; groupPolicy: "open" | "disabled" | "allowlist"; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; textChunkLimit?: number; chunkMode?: "length" | "newline"; mediaMaxMb?: number; sendReadReceipts?: boolean; blockStreaming?: boolean; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; groups?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; }; }; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; }; actions?: { reactions?: boolean; edit?: boolean; unsend?: boolean; reply?: boolean; sendWithEffect?: boolean; renameGroup?: boolean; setGroupIcon?: boolean; addParticipant?: boolean; removeParticipant?: boolean; leaveGroup?: boolean; sendAttachment?: boolean; }; }; msteams?: { enabled?: boolean; capabilities?: string[]; markdown?: { tables?: "off" | "bullets" | "code"; }; configWrites?: boolean; appId?: string; appPassword?: string; tenantId?: string; webhook?: { port?: number; path?: string; }; dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; allowFrom?: string[]; groupAllowFrom?: string[]; groupPolicy: "open" | "disabled" | "allowlist"; textChunkLimit?: number; chunkMode?: "length" | "newline"; blockStreamingCoalesce?: { minChars?: number; maxChars?: number; idleMs?: number; }; mediaAllowHosts?: string[]; requireMention?: boolean; historyLimit?: number; dmHistoryLimit?: number; dms?: { [k: string]: { historyLimit?: number; }; }; replyStyle?: "thread" | "top-level"; teams?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; replyStyle?: "thread" | "top-level"; channels?: { [k: string]: { requireMention?: boolean; tools?: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; toolsBySender?: { [k: string]: { allow?: string[]; alsoAllow?: string[]; deny?: string[]; }; }; replyStyle?: "thread" | "top-level"; }; }; }; }; mediaMaxMb?: number; sharePointSiteId?: string; heartbeat?: { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; }; }; [k: string]: unknown; }; discovery?: { wideArea?: { enabled?: boolean; }; mdns?: { mode?: "off" | "minimal" | "full"; }; }; canvasHost?: { enabled?: boolean; root?: string; port?: number; liveReload?: boolean; }; talk?: { voiceId?: string; voiceAliases?: { [k: string]: string; }; modelId?: string; outputFormat?: string; apiKey?: string; interruptOnSpeech?: boolean; }; gateway?: { port?: number; mode?: "local" | "remote"; bind?: "auto" | "lan" | "loopback" | "custom" | "tailnet"; controlUi?: { enabled?: boolean; basePath?: string; allowInsecureAuth?: boolean; dangerouslyDisableDeviceAuth?: boolean; }; auth?: { mode?: "token" | "password"; token?: string; password?: string; allowTailscale?: boolean; }; trustedProxies?: string[]; tailscale?: { mode?: "off" | "serve" | "funnel"; resetOnExit?: boolean; }; remote?: { url?: string; transport?: "ssh" | "direct"; token?: string; password?: string; tlsFingerprint?: string; sshTarget?: string; sshIdentity?: string; }; reload?: { mode?: "off" | "restart" | "hot" | "hybrid"; debounceMs?: number; }; tls?: { enabled?: boolean; autoGenerate?: boolean; certPath?: string; keyPath?: string; caPath?: string; }; http?: { endpoints?: { chatCompletions?: { enabled?: boolean; }; responses?: { enabled?: boolean; maxBodyBytes?: number; files?: { allowUrl?: boolean; allowedMimes?: string[]; maxBytes?: number; maxChars?: number; maxRedirects?: number; timeoutMs?: number; pdf?: { maxPages?: number; maxPixels?: number; minTextChars?: number; }; }; images?: { allowUrl?: boolean; allowedMimes?: string[]; maxBytes?: number; maxRedirects?: number; timeoutMs?: number; }; }; }; }; nodes?: { browser?: { mode?: "auto" | "manual" | "off"; node?: string; }; allowCommands?: string[]; denyCommands?: string[]; }; }; skills?: { allowBundled?: string[]; load?: { extraDirs?: string[]; watch?: boolean; watchDebounceMs?: number; }; install?: { preferBrew?: boolean; nodeManager?: "npm" | "pnpm" | "yarn" | "bun"; }; entries?: { [k: string]: { enabled?: boolean; apiKey?: string; env?: { [k: string]: string; }; config?: { [k: string]: unknown; }; }; }; }; plugins?: { enabled?: boolean; allow?: string[]; deny?: string[]; load?: { paths?: string[]; }; slots?: { memory?: string; }; entries?: { [k: string]: { enabled?: boolean; config?: { [k: string]: unknown; }; }; }; installs?: { [k: string]: { source: "npm" | "archive" | "path"; spec?: string; sourcePath?: string; installPath?: string; version?: string; installedAt?: string; }; }; }; }