Skip to content

Generated configuration field reference ​

Generated from runtime source and JSON Schema. Do not edit manually. See Configuration for narrative guidance and examples.

  • Generator: pnpm docs:config
  • Drift check: pnpm check:config-reference

Host top-level fields ​

The authoritative contract is packages/im/runtime/src/host-config-schema.json, consumed by the Runtime at packages/host/gateway/src/config/configuration-projection.ts.

PathTypeRequiredDefaultDescription
httpobjectno—HTTP, Console, REST/RPC/SSE, and Webhook Host.
http.readinessobjectno—Required runtime components for /pub/ready; no external network probes.
http.readiness.databasebooleannotrueRequire an initialized Database Host (not a live database query).
http.readiness.endpointsarray<object>no—Required Endpoint admission slots, selected by exact plugin owner and stable slot name.
http.readiness.endpoints[].ownerstringyes——
http.readiness.endpoints[].namestringyes——
http.readiness.agentsarray<string>no—Required configured Agent bindings; does not verify model credentials or provider reachability.
http.hoststring | nullno—监听地址。
http.portinteger | string | nullno—Listening port: an integer from 1 to 65535, or a ${VAR} environment reference that expands to one (0 lets the system pick a free port). When unset the gateway listens on 8068.
http.tokenstring | nullno—Bootstrap token: signs in to the setup wizard until the first Console owner exists, then stops working (ADR 0049).
http.corsOriginsarray | nullno——
http.trustProxyboolean | integer | array<string> | stringno—Reverse proxies whose X-Forwarded-For / Forwarded header names the client (login rate limit, audit IP, loopback-only sockets): false (default) uses the TCP peer; true trusts every hop; a number trusts that many hops; a list trusts peers matching IPs / CIDRs or loopback, private, linklocal.
http.basestring | nullno—API 路径前缀。
http.tlsfalse | null | objectno——
http.listenersarray<object>no——
http.listeners[].enabledboolean | stringno—是否启用此监听器。
http.listeners[].hoststringno—监听地址。
http.listeners[].portinteger | stringno—Listening port: an integer from 1 to 65535, or a ${VAR} environment reference that expands to one.
http.listeners[].tlsfalse | null | objectno——
consoleobjectno—Console Host features.
console.terminalobjectno—Console terminal (host shell / SSH) for owners holding ops.terminal; off by default.
console.terminal.enabledbooleannofalseRegister the terminal routes.
console.terminal.shellstringno—Local shell; defaults to $SHELL (powershell.exe on Windows).
console.terminal.cwdstringno"."Working directory, relative to the project root.
console.terminal.idleTimeoutintegerno900Seconds without input before the session closes (0 = never).
console.terminal.maxSessionsintegerno4Concurrent sessions across all users.
console.terminal.ssharray<object>no—SSH targets the Console may open.
console.terminal.ssh[].namestringyes—Target id the Console selects (not "local").
console.terminal.ssh[].labelstringno—Display name.
console.terminal.ssh[].hoststringyes—SSH host.
console.terminal.ssh[].portintegerno22SSH port.
console.terminal.ssh[].usernamestringyes—SSH user.
console.terminal.ssh[].privateKeyPathstringno—Private key file (relative to the project root, ~ allowed); exclusive with privateKeyEnv.
console.terminal.ssh[].privateKeyEnvstringno—Environment variable holding the private key.
console.terminal.ssh[].passwordEnvstringno—Environment variable holding the password.
console.terminal.ssh[].passphraseEnvstringno—Environment variable holding the key passphrase.
console.terminal.ssh[].hostFingerprintstringno—Required host key fingerprint (SHA256:…), verified strictly; get it with ssh-keyscan -t ed25519 &lt;host&gt; | ssh-keygen -lf - on a trusted network.
console.terminal.ssh[].insecureAcceptAnyHostKeybooleanno—Accept any host key without verification (unsafe, open to man-in-the-middle); only instead of hostFingerprint. The Console marks the target unsafe.
console.loginAssistobjectno—Login assistance shown in the Console (ADR 0058).
console.loginAssist.captchaHelperUrlstringno—Hosted captcha helper page on its own origin; defaults to https://zhin.js.org/login-assist/tcaptcha.html.
gatewayobjectno—Management gateway (zhin start): instance supervision and dependency transactions.
gateway.readyTimeoutintegerno60Seconds the instance has to report ready after a start, a restart or a dependency transaction before the start counts as failed (the transaction then rolls back). Read again before every start, restart and transaction; no gateway restart needed.
databaseobjectno—Database Host and dialect connection options.
database.dialectstringno—数据库方言。
database.filenamestringno—SQLite 文件路径。
database.modestringno—SQLite 兼容模式字段。
database.hoststringno—数据库主机。
database.portnumber | stringno—网络数据库端口。
database.userstringno—MySQL / PostgreSQL 用户名。
database.usernamestringno—Redis 用户名。
database.passwordstringno—连接密码。
database.databasestring | numberno—MySQL / PostgreSQL 数据库名,或 Redis 数据库索引。
database.uristringno—MySQL 连接 URI(可能含凭据)。
database.connectionStringstringno—PostgreSQL 连接串(可能含凭据)。
database.urlstringno—MongoDB / Redis 连接 URL(可能含凭据)。
database.dbNamestringno—MongoDB 数据库名。
database.poolobject | nullno——
database.pool.minnumber | string | nullno—最少连接数。
database.pool.maxnumber | string | nullno—最多连接数。
database.pool.acquireTimeoutMillisnumber | string | nullno—获取连接超时毫秒。
database.pool.idleTimeoutMillisnumber | string | nullno—空闲连接超时毫秒。
database.socketobjectno——
database.socket.hoststringno—Redis 主机。
database.socket.portnumber | stringno—Redis 端口。
database.socket.pathstringno—Unix socket 路径。
database.socket.connectTimeoutnumber | stringno—连接超时毫秒。
database.socket.tlsboolean | stringno—启用 TLS。
database.socket.keepAlivenumber | stringno—TCP keep-alive 毫秒。
database.socket.noDelayboolean | stringno—TCP noDelay。
database.sslboolean | string | objectno——
database.charsetstringno—MySQL 字符集。
database.timezonestringno—MySQL 时区。
database.connectTimeoutnumber | stringno—MySQL 连接超时毫秒。
database.connectionTimeoutMillisnumber | stringno—PostgreSQL 连接超时毫秒。
database.query_timeoutnumber | stringno—PostgreSQL 查询超时毫秒。
database.statement_timeoutnumber | stringno—PostgreSQL statement 超时毫秒。
database.application_namestringno—PostgreSQL 应用名称。
database.maxPoolSizenumber | stringno—MongoDB 最大连接池大小。
database.minPoolSizenumber | stringno—MongoDB 最小连接池大小。
database.serverSelectionTimeoutMSnumber | stringno—MongoDB server 选择超时毫秒。
database.connectTimeoutMSnumber | stringno—MongoDB 连接超时毫秒。
database.socketTimeoutMSnumber | stringno—MongoDB socket 超时毫秒。
database.authSourcestringno—MongoDB 认证数据库。
database.replicaSetstringno—MongoDB 副本集。
database.authobjectno——
database.auth.usernamestringno—MongoDB 用户名。
database.auth.passwordstringno—MongoDB 密码。
database.disableOfflineQueueboolean | stringno—Redis 禁止离线队列。
database.pingIntervalnumber | stringno—Redis 心跳间隔毫秒。
database.consoleobjectno—PostgreSQL / MySQL:Console SQL 控制台使用的受限账号(ADR 0059;zhin db console-role 创建)。未配置时原始 SQL 关闭。
database.console.userstringno—受限账号用户名,通常写 ${ZHIN_DB_CONSOLE_USER}。
database.console.passwordstringno—受限账号密码,写 ${ZHIN_DB_CONSOLE_PASSWORD},值只放 .env。
aiobjectno—Providers, Agents, sessions, memory, tools, and execution security.
ai.venuesarray<object>no—Shared multi-Bot IM rooms (ADR 0048 §3.2).
ai.venues[].idstringyes——
ai.venues[].labelstringno——
ai.venues[].conversationobjectyes——
ai.venues[].conversation.platformstringyes——
ai.venues[].conversation.sceneTypestring: "private", "group", "channel"no——
ai.venues[].conversation.sceneIdstringyes——
ai.venues[].conversation.threadIdstringno——
ai.venues[].membersarray<object>yes——
ai.venues[].members[].agentstringyes——
ai.venues[].members[].botEndpointstringyes——
ai.venues[].members[].aliasesarray<string>no——
ai.venues[].entrystringno——
ai.venues[].visibilitystring: "visible", "summary", "backstage"no——
ai.externalPeersarray<object>no—Declared third-party Bot accounts (ADR 0043/0048).
ai.externalPeers[].platformstringyes——
ai.externalPeers[].userIdstringyes——
ai.externalPeers[].labelstringno——
ai.agentobjectno—Agent execution, queueing, tool, and model policies.
ai.agent.mailboxobjectno—IM inbox policy of the agent Mailbox (ADR 0048 H3; renamed from inboundQueue, which now fails startup).
ai.agent.mailbox.groupModestring: "supersede", "fifo"no—supersede (default): a sender's new message replaces their own unanswered turn; fifo: every message waits in arrival order. Other members' messages always queue.
ai.agent.mailbox.ttlMsintegerno180000A queued turn that waited longer than this is dropped with a short notice. 0 disables expiry.
ai.agent.mailbox.maxQueuedTurnsintegerno5Turns allowed to wait behind the running turn of one conversation; further messages get a short busy reply.
ai.agent.mailbox.mergeobjectno—Group merge window (ADR 0038): mentions from several members within a short window get one combined reply. Private chats, the master, commands, stop words and messages with media, quotes or forwards never merge.
ai.agent.mailbox.merge.enabledbooleannotrueTurn the group merge window on (group chats only). Set false to answer every member one by one as before.
ai.agent.mailbox.merge.quietMsintegerno1500The window is answered once no new message joined it for this long.
ai.agent.mailbox.merge.maxWaitMsintegerno6000The window is answered at the latest this long after its first message.
ai.agent.mailbox.merge.maxSendersintegerno5Senders one merged reply covers; further senders wait for the next window.
ai.agent.mailbox.liveobjectno—Danmaku mode (ADR 0038): live-stream adapters that declare liveDanmaku collect danmaku in a window and reply once, with read-only tools and no approval cards.
ai.agent.mailbox.live.modestring: "pick-one", "summary"no"pick-one"pick-one answers one danmaku of the window; summary answers the window as a whole once.
ai.agent.mailbox.live.windowMsintegerno10000How long a danmaku window collects messages from its first danmaku.
ai.agent.mailbox.live.minIntervalMsintegerno15000Minimum time between two danmaku replies in one live room.
ai.agent.mailbox.coalesceWindowMsnumber | stringno——
ai.agent.execSecuritystring: "deny", "allowlist", "full"no—Shell command security boundary.
ai.agent.execPresetstring: "readonly", "network", "development", "custom"no—Command allowlist preset used outside full mode.
ai.agent.networkobjectno—Network access for IM turns (web_fetch / web_search and networked commands). Off by default; enabled allows HTTPS egress, optionally limited to allowedDomains. When enabled is unset, execPreset: network still enables it for compatibility.
ai.agent.network.enabledbooleannofalseAllow HTTPS egress for IM turns.
ai.agent.network.allowedDomainsarray<string>no—When non-empty, only these domains (and their subdomains) are reachable.
ai.agent.masterShellstring: "off", "isolated"no"off"Shell access for the master in IM private chats. off: no bash in IM turns. isolated: master DMs run bash inside a Docker container (workspace writable, no network, development allowlist, approval for anything else); fails closed when Docker is unavailable.
ai.agent.masterShellApprovalModestring: "ask", "auto", "inherit"no"ask"How approval-gated calls are approved in the master's IM private chat when masterShell is isolated. ask: show the master an approval prompt; auto: automatic reviewer (a reviewer rejection is escalated to the master); inherit: use execApprovalMode.
ai.agent.toolBudgetobjectno—Interactive runtime turns and their synchronous children have no fixed step or total wall-clock cap. They share configured token quotas. Step/time caps and continuation settings apply to bounded and legacy executions.
ai.agent.toolBudget.extendByintegerno10Steps added per extension when progressing; 0 disables.
ai.agent.toolBudget.progressWindowintegerno5Progress must have happened within this many recent steps.
ai.agent.toolBudget.maxTotalIterationsintegerno40Hard step cap per turn segment.
ai.agent.toolBudget.maxSubagentTotalIterationsintegerno30Hard step cap for an in-turn sub-agent.
ai.agent.toolBudget.maxWallClockMsintegerno600000Wall-clock cap for the whole turn in ms; 0 disables.
ai.agent.toolBudget.maxTotalTokensintegerno0Token cap for the whole turn; 0 disables.
ai.agent.toolBudget.failureStreakLimitintegerno3Consecutive tool failures that stop extensions.
ai.agent.toolBudget.repeatLimitintegerno2Consecutive identical repeated calls that stop extensions.
ai.agent.toolBudget.autoContinuestring: "off", "master_dm", "on"no"master_dm"Auto-continue a progressing turn that hit its budget: off, only in the master's private chat, or always. Continuations reuse the same turn (same policy and approvals).
ai.agent.toolBudget.maxContinuationsintegerno2Maximum automatic continuations per turn.
ai.agent.toolBudget.progressUpdatesstring: "off", "private", "all"no"private"off disables progress. Continuous interactive turns report in their current conversation; private/all select scope for bounded turns.
ai.agent.toolBudget.progressMinIntervalMsintegerno45000Minimum time between progress updates in ms.
ai.agent.toolBudget.progressMaxUpdatesintegerno30 disables progress. Positive values cap bounded turns only; continuous interactive turns use the configured interval without a count cap.
ai.agent.injectionGuardobjectno—Prompt-injection defences. After lower-trust content (tool results, web pages, files, sub-agent reports, background messages) enters a turn, high-risk actions (shell, messaging other conversations, config changes, scheduling) need approval; replies are checked for system-prompt, secret and other-session memory leaks.
ai.agent.injectionGuard.confirmHighRiskstring: "external_content", "off"no"external_content"external_content: high-risk actions after external content always ask for approval (denied in unattended turns). off: disabled.
ai.agent.injectionGuard.outboundCheckstring: "redact", "off"no"redact"redact: mask leaked system-prompt lines, secrets and other sessions' memory in replies and outbound tool messages. off: disabled.
ai.agent.injectionGuard.trustedOutputToolsarray<string>no[]Tools whose results do not count as external content.
ai.agent.toolHardGateobjectno—Dangerous-tool hard gate (ADR 0036). Always on and independent of execApprovalMode: tools that manage members, publish content, move money or change the bot's identity (a core list, plus tools that declare risk: dangerous), and any call that writes the host's own configuration, dependencies or git hooks (zhin.config., .env, package.json, lockfiles, node_modules/, .git/, …) never run without a fresh human approval or a Console-approved card, even under bypass. A denial fails closed and is not retried in the same turn. Settings can only make it stricter.
ai.agent.toolHardGate.dangerousToolsarray<string>no[]Extra tools to treat as dangerous (local or qualified names). Cannot mark a core dangerous tool safe.
ai.agent.toolHardGate.allowFundsbooleannofalseAllow funds tools (red packets, transfers, payments). Off by default; when on they still need approval.
ai.agent.toolHardGate.approvalTimeoutMsintegerno300000How long a dangerous call waits for approval before it is denied (ms).
ai.agent.toolHardGate.maxPendingPerSceneintegerno3Approval cards one group (scene) may have pending at once (ADR 0038). Beyond it a dangerous call is denied without a new card; asking again for an already pending card does not count.
ai.agent.toolHardGate.imApprovalobjectno—IM approval channel for the hard gate (#1013). Off by default. When on, each new approval card is also sent to allowlisted approvers, who settle it with approve &lt;id&gt; / deny &lt;id&gt; in a private chat (or the dedicated approver group). It shares the Console approval queue: whichever answers first wins. Messages in business groups never settle a card; there is no session-wide or permanent approval.
ai.agent.toolHardGate.imApproval.enabledbooleannofalseTurn the IM approval channel on.
ai.agent.toolHardGate.imApproval.approverIdsarray<string> | objectno[]Approver platform user ids: a flat list applies to every platform; an object maps a platform (adapter name) to its user ids. Anyone not listed cannot settle a card over IM.
ai.agent.toolHardGate.imApproval.deliverystring: "dm", "approver_group"no"dm"dm sends each card to every approver privately; approver_group posts it to approverGroupId, which must not be the conversation that triggered the call.
ai.agent.toolHardGate.imApproval.approverGroupIdstringno—Dedicated approver group id, required for delivery: approver_group. Without it the IM channel stays unavailable and only the Console can approve.
ai.agent.reactionsobjectno—Emoji-reaction pacing per session. The model may propose a reaction on any turn; the host applies one only if at least cooldownMs passed since the last applied reaction in that session and a random roll passes probability. Counters are kept in memory.
ai.agent.reactions.cooldownMsintegerno600000Minimum gap between two applied reactions in one session (ms).
ai.agent.reactions.probabilitynumberno0.35Chance that an allowed reaction is applied; 0 disables reactions.
ai.agent.usageQuotaobjectno—Per-user and per-group token quotas and a per-group rate limit. All limits are off (0) by default; the owner is exempt by default. Counters are kept in memory.
ai.agent.usageQuota.windowMsintegerno86400000Quota window in ms.
ai.agent.usageQuota.perUserTokensintegerno0Tokens one user may use per window; 0 = unlimited.
ai.agent.usageQuota.perGroupTokensintegerno0Tokens one group may use per window; 0 = unlimited.
ai.agent.usageQuota.perGroupRequestsPerMinuteintegerno0Turns one group may start per minute; 0 = unlimited.
ai.agent.usageQuota.exemptOwnerbooleannotrueThe owner is never limited.
ai.agent.execApprovalModestring: "ask", "bypass", "auto"no—Approval policy for main Agent commands.
ai.agent.approvalobjectno—IM approval options.
ai.agent.approval.adminSelfApprovebooleannofalseLet a zhin admin (held at endpoint level or above) approve, once, in their own private chat, the operations a policy marks admin-approvable (tools tagged admin_approvable such as schedule_add, session memory) when the bot owner cannot answer there. Default false: only the bot owner approves. Never covers sensitive files, shell commands, global/platform memory, human-only or dangerous tools, or groups without an owner.
ai.agent.toolExecutionstring: "parallel", "sequential", "tiered"no—How tool calls in one model step are scheduled.
ai.agent.modelSizeHintstring: "", "small", "medium", "large"no—Optional model-size hint; an empty string clears the hint.
ai.agent.promptCacheRetentionstring: "in_memory", "24h"no—Provider prompt-cache retention policy.
ai.agent.steeringModestring: "one-at-a-time", "all"no—Process steering messages one at a time or drain all pending messages together.
ai.agent.followUpModestring: "one-at-a-time", "all"no—Process follow-up messages one at a time or drain all pending messages together.
ai.agent.outputSchemaboolean | string: "segments" | objectno—Final-output mode: defaults to segments for IM conversations; false for text, true or segments for ordered canonical segments, or a custom JSON Schema object. Detached and non-IM turns do not inherit the IM preset.
ai.agent.scheduleobjectno—Unattended Schedule execution policy.
ai.agent.schedule.securityobjectno—Schedule command security policy.
ai.agent.schedule.security.execPresetstring: "readonly", "network"no—Schedule Jobs may use only the read-only or network preset.
ai.agent.schedule.security.allowedDomainsarray<string>no——
ai.agent.schedule.budgetobjectno——
ai.agent.schedule.budget.maxTokensnumber | stringno——
ai.agent.schedule.budget.maxToolCallsnumber | stringno——
ai.agent.schedule.budget.timeoutMsnumber | stringno——
ai.agent.execAllowlistarray<string>no—allowlist 模式下允许的命令(支持正则字符串,如 "^ls "、"^cat "),与 preset 合并
ai.agent.phaseTraceboolean | stringno—观测主回合阶段日志(或通过 ZHIN_AGENT_PHASE_TRACE=1 开启)
ai.agent.modelHarnessobjectno—按模型 / provider 模式覆盖 model harness
ai.agent.modelHarness.servicesobjectno—Exact runtime Service id; native-model entries override that Service default.
ai.agent.modelHarness.services.<key>.defaultsobjectno——
ai.agent.modelHarness.services.<key>.defaults.maxIterationsnumber | stringno——
ai.agent.modelHarness.services.<key>.defaults.explorationBudgetnumber | stringno—连续只读探索调用达到该次数时注入提示;0 关闭
ai.agent.modelHarness.services.<key>.defaults.explorationGuidanceboolean | stringno—在系统提示中加入"先规划、限定目标文件"的探索纪律
ai.agent.modelHarness.services.<key>.defaults.iterationExtensionnumber | stringno—每次有进展时延长的步数(覆盖 toolBudget.extendBy)
ai.agent.modelHarness.services.<key>.defaults.maxTotalIterationsnumber | stringno—单段回合的硬步数上限(覆盖 toolBudget.maxTotalIterations)
ai.agent.modelHarness.services.<key>.defaults.emptyReplyRetriesnumber | stringno—空回复(无文本且无工具调用)时额外重试次数;默认 0
ai.agent.modelHarness.services.<key>.defaults.requestTimeoutMsnumber | stringno—单次模型请求超时(毫秒);0 关闭
ai.agent.modelHarness.services.<key>.modelsobjectno——
ai.agent.modelHarness.services.<key>.models.<key>.maxIterationsnumber | stringno——
ai.agent.modelHarness.services.<key>.models.<key>.explorationBudgetnumber | stringno—连续只读探索调用达到该次数时注入提示;0 关闭
ai.agent.modelHarness.services.<key>.models.<key>.explorationGuidanceboolean | stringno—在系统提示中加入"先规划、限定目标文件"的探索纪律
ai.agent.modelHarness.services.<key>.models.<key>.iterationExtensionnumber | stringno—每次有进展时延长的步数(覆盖 toolBudget.extendBy)
ai.agent.modelHarness.services.<key>.models.<key>.maxTotalIterationsnumber | stringno—单段回合的硬步数上限(覆盖 toolBudget.maxTotalIterations)
ai.agent.modelHarness.services.<key>.models.<key>.emptyReplyRetriesnumber | stringno—空回复(无文本且无工具调用)时额外重试次数;默认 0
ai.agent.modelHarness.services.<key>.models.<key>.requestTimeoutMsnumber | stringno—单次模型请求超时(毫秒);0 关闭
ai.agent.providerResilienceobjectno—固定模型韧性:重试 / 退避 / 超时(见 ProviderResilienceConfig)
ai.agent.providerResilience.maxRetriesnumber | stringno—Retries per model after the first attempt. Default 2. 0 disables retry.
ai.agent.providerResilience.baseDelayMsnumber | stringno—First backoff delay in ms; doubles each retry. Default 1000.
ai.agent.providerResilience.maxDelayMsnumber | stringno—Upper bound for one backoff delay in ms. Default 10000.
ai.agent.providerResilience.maxRetryAfterMsnumber | stringno—A Retry-After longer than this stops retry. Default 30000.
ai.agent.providerResilience.requestTimeoutMsnumber | stringno—Per-attempt timeout in ms (whole streamed completion). Default 120000. 0 disables.
ai.agent.providerResilience.firstResponseTimeoutMsnumber | stringno—Per-attempt wait in ms for the provider's first response (response headers or the first stream event). Default 30000. 0 disables. A service that does not answer in time is not re-asked on the same model: the attempt fails as no_response.
ai.agent.providerResilience.emptyReplyRetriesnumber | stringno—Extra attempts when the model returns neither text nor tool calls (or a tool call without a name). Default 0: the reply is passed through unchanged. Quirk presets (see model harness) raise this for models known to emit spurious empty replies.
ai.agent.deferredToolsobjectno—工具 schema 按需加载
ai.agent.deferredTools.maxLoadedPerSessionnumber | stringno——
ai.agent.deferredTools.discoverTopKnumber | stringno——
ai.agent.deferredTools.alwaysLoadedToolsarray<string>no—额外常驻工具;在当前场景档(群聊、私聊、主人私聊)的常驻集合基础上追加
ai.agent.deferredTools.alwaysLoadedModestringno—extend(默认)追加到内置常驻集合;replace 完全替换
ai.agent.deferredTools.mcpServersobjectno——
ai.agent.deferredTools.mcpServers.<key>.alwaysLoadedarray<string>no——
ai.agent.personastringno——
ai.agent.maxIterationsnumber | stringno——
ai.agent.timeoutnumber | stringno——
ai.agent.preExecTimeoutnumber | stringno——
ai.agent.maxToolsnumber | stringno——
ai.agent.contextTailMessageLimitnumber | stringno——
ai.agent.rateLimitobjectno——
ai.agent.rateLimit.maxRequestsPerMinutenumber | stringno—每分钟最大请求数(默认 20)
ai.agent.rateLimit.cooldownSecondsnumber | stringno—冷却时间(秒),超限后需等待(默认 10)
ai.agent.toneAwarenessboolean | stringno——
ai.agent.contextTokensnumber | stringno——
ai.agent.maxHistorySharenumber | stringno——
ai.agent.compactionobjectno——
ai.agent.compaction.enabledboolean | stringno——
ai.agent.compaction.autoboolean | stringno——
ai.agent.compaction.keepRecentTokensnumber | stringno——
ai.agent.compaction.minKeepCountnumber | stringno——
ai.agent.compaction.thresholdRationumber | stringno—Share of the model context window (system prompt and tools included) at which auto-compaction runs. Default 0.7 (#730).
ai.agent.disabledToolsarray<string>no——
ai.agent.allowedToolsarray<string>no——
ai.agent.maxSubagentIterationsnumber | stringno——
ai.agent.skillInstructionMaxCharsnumber | stringno——
ai.agent.promptTraceboolean | stringno——
ai.agent.promptTraceVerboseboolean | stringno——
ai.agent.recordRequestBodiesbooleanno——
ai.agent.promptCacheboolean | stringno——
ai.agent.promptCacheKeyPrefixstringno——
ai.agent.gitStatusboolean | stringno—§1 Runtime 注入单行 git 状态摘要(非 git 仓库自动跳过)
ai.agent.contextPathsarray<string>no—追加的上下文文件路径(支持 ~ 与相对路径;默认另加载 ~/.config/zhin/AGENTS.md 等全局路径)
ai.agent.systemPromptMaxCharsnumber | stringno—系统提示词总字符上限;按 retention/order 让出预算,required 内容放不下则失败。
ai.agent.thinkingPreviewboolean | stringno—Activity feedback 展示 LLM 实际 thinking 内容(截断),而非静态 "思考中..."。
ai.agent.thinkingPreviewMaxLengthnumber | stringno—thinkingPreview 展示的最大字符数。
ai.enabledboolean | stringno——
ai.agentsobject | nullno—Agent authority and display metadata. Model selection belongs to runtime Profile purposes.
ai.agents.<key>.mcpServersarray | nullno——
ai.agents.<key>.nicknamestringno—Fallback nickname when the Endpoint does not provide account profile data.
ai.sessionsobject | nullno——
ai.sessions.maxHistorynumber | stringno—最大历史消息数(数据库模式默认200,内存模式默认100)
ai.sessions.expireMsnumber | stringno—会话过期时间(毫秒,数据库模式默认7天,内存模式默认24小时)
ai.sessions.useDatabaseboolean | stringno—是否使用数据库持久化存储(默认 true)
ai.sessions.coldStartMaxMessagesnumber | stringno—无摘要时冷启动最多条数(默认 50)
ai.sessions.coldStartMaxAgeMsnumber | stringno—冷启动时间窗(毫秒,默认 24h)
ai.sessions.sessionIdleArchiveMsnumber | stringno—空闲后自动归档 active 会话(毫秒,默认 7 天;0=关闭)
ai.contextobject | nullno——
ai.context.enabledboolean | stringno—是否启用消息记录(默认 true)
ai.context.maxRecentMessagesnumber | stringno—历史消息条数上限(默认 100);与 historyTokens 取先到者
ai.context.historyTokensnumber | string | objectno—每轮发给模型的历史 token 预算:数字对所有场景生效,也可写 { group, private, masterPrivate };默认群聊 8000、普通私聊 12000、主人私聊 24000;0 = 不按 token 限制
ai.context.historyTokens.groupnumber | stringno—群聊 / 频道(默认 8000)
ai.context.historyTokens.privatenumber | stringno—普通私聊(默认 12000)
ai.context.historyTokens.masterPrivatenumber | stringno—主人私聊(默认 24000)
ai.context.summaryThresholdnumber | stringno—触发总结的消息数量阈值(默认 50)
ai.context.keepAfterSummarynumber | stringno—总结后保留的消息数量(默认 10)
ai.context.maxContextTokensnumber | stringno—上下文最大 token 估算(默认 4000)
ai.context.summaryPromptstringno—自定义总结提示词
ai.multimodalobject | nullno—入站/出站多模态(base64 契约;平台 adapter 负责编解码与发送)
ai.multimodal.enabledboolean | stringno——
ai.multimodal.maxFileBytesnumber | stringno——
ai.multimodal.inboundDirstringno——
ai.multimodal.outboundDirstringno——
ai.multimodal.imageobjectno——
ai.multimodal.image.maxDimensionnumber | stringno——
ai.multimodal.image.preferNativeVisionboolean | stringno——
ai.multimodal.audioobjectno——
ai.multimodal.audio.strategystringno——
ai.multimodal.videoobjectno——
ai.multimodal.video.strategystringno——
ai.multimodal.video.mcpServerstringno——
ai.multimodal.video.maxFramesnumber | stringno——
ai.multimodal.outboundobjectno——
ai.multimodal.outbound.splitMessagesstringno——
ai.multimodal.perceptionobject | nullno—Perception pre-pass: when the turn's model cannot take an image / video / PDF, this media-capable model describes it and the description is injected as untrusted text ([图片描述] …). Unset = off (placeholders as before).
ai.multimodal.perception.kindsarray<string>no—Kinds to describe. Default ['image']; file covers PDFs only.
ai.multimodal.perception.maxCharsnumber | stringno—Description length cap in characters. Default 800.
ai.multimodal.perception.timeoutMsnumber | stringno—Per-attempt timeout in ms. Default 30000.
ai.multimodal.perception.maxItemsPerTurnnumber | stringno—Media described per turn; the rest keep the placeholder. Default 4.
ai.memoryobject | nullno—三层 Markdown 文件记忆(global / platform / session)。 默认启用;设 enabled: false 可关闭注入。
ai.memory.enabledboolean | stringno——
ai.memory.semanticobject | nullno—L4 语义记忆:memory_entries 表 + memory_search/upsert 工具
ai.memory.semantic.enabledboolean | stringno——
ai.memory.semantic.autoConsolidateboolean | stringno——
ai.memory.semantic.recallobject | nullno—Per-turn recall (#734): BM25 top-k entries relevant to the current message are added to the turn context. Default on when semantic memory is enabled; topK 5, maxTokens 400.
ai.memory.semantic.recall.enabledboolean | stringno——
ai.memory.semantic.recall.topKnumber | string | nullno——
ai.memory.semantic.recall.maxTokensnumber | string | nullno——
ai.memory.budgetsobjectno——
ai.memory.budgets.sessionnumber | stringno——
ai.memory.budgets.platformnumber | stringno——
ai.memory.budgets.globalnumber | stringno——
ai.memory.budgets.dailynumber | stringno——
ai.knowledgeobjectno—本地知识库(knowledge_search 工具数据源)。 放置 .md / .txt 文件到 baseDir,Agent 可通过 knowledge_search 工具检索。
ai.knowledge.baseDirstringno—项目根目录内的知识库目录路径。配置该段时必须显式声明。
ai.githubMcpobjectno—PAT for adapter-github auto-registered server-github MCP (overrides env when set).
ai.githubMcp.tokenstringno——
ai.githubMcp.enabledboolean | stringno—为 true 时注册 server-github MCP(PAT,人身份);默认 false,Bot 写操作用 adapter github_* 工具
ai.mcpServersarray | nullno—External MCP servers for the Agent MCP client (global, all bots). Listed servers are exposed to ZhinAgent tool pool when connected.
ai.accessobject | nullno—AI 访问控制(平台 AIGC 合规;Endpoint 可用 aiAccess 覆盖)
ai.access.modestringno—open | closed | whitelist,默认 open
ai.access.usersarray<string>no—允许触发 AI 的 sender.id
ai.access.groupsarray<string>no—允许触发 AI 的 group/channel id
ai.access.denyMessagestringno—私聊拒绝时的回复文案
ai.triggerobject | nullno—AI 触发配置
ai.trigger.enabledboolean | stringno—是否启用(默认 true)
ai.trigger.prefixesarray<string>no—触发前缀列表(默认 ['#', 'AI:'])
ai.trigger.respondToAtboolean | stringno—是否响应 @ 机器人(默认 true)
ai.trigger.respondToPrivateboolean | stringno—是否响应私聊(默认 true)
ai.trigger.keywordsarray<string>no—触发关键词(可选)
ai.trigger.ignorePrefixesarray<string>no—忽略的前缀(命令前缀,避免与命令冲突,默认 ['/', '!', '!'])
ai.trigger.timeoutnumber | stringno—超时时间(毫秒,默认 60000)
ai.trigger.thinkingMessagestringno—思考中提示语(可选,设置后会在处理前发送)
ai.trigger.errorTemplatestringno—入口层错误提示模板,{error} 为错误信息(可选;不配置时用聊天口吻说"刚卡了一下",主人额外看到原因)
ai.trigger.ambientobjectno—群聊旁听:群里没人叫机器人时,由判断模型决定是否接话。被 @、引用和私聊不经过这里,总会交给 Agent(Agent 也可以选择不回复)。
ai.trigger.ambient.conversationsarray<string>no—开启旁听的群,格式 platform:groupId;* 表示所有群。默认为空(关闭)
ai.trigger.ambient.quietMsnumber | stringno—群安静多久后才判断一次(毫秒,默认 4000)
ai.trigger.ambient.cooldownMsnumber | stringno—两次主动插话之间的最短间隔(毫秒,默认 120000);对话进行中不受限制
ai.trigger.ambient.maxPerHournumber | stringno—每个群每小时最多主动插话次数(默认 3);对话进行中不计入
ai.trigger.ambient.conversationWindowMsnumber | stringno—机器人说话后,这段时间内算作对话进行中:群友接它的话只由判断模型决定,不受冷却和每小时次数限制(毫秒,默认 180000)
ai.trigger.ambient.judgeIntervalMsnumber | stringno—没在对话时,同一个群至少隔这么久才判断一次(毫秒,默认 30000),节省判断模型的额度;窗口内的消息顺延到窗口结束再判,不会丢
ai.trigger.ambient.minConfidencenumber | stringno—判断模型置信度门槛 0..1(默认 0.7)
ai.trigger.ambient.modestring: "active", "shadow"no—shadow 只记录判断结果、不回复(默认 active)
ai.trigger.sceneEventsobjectno—Scene awareness: high-priority social events (bot muted/unmuted, join request, member joined/left, notice updated, bot poked) wake one turn on their own without waiting for the next human message; low-priority events (reactions, card/title changes) never wake alone and only appear in the next turn's [Scene events] summary. When the bot cannot speak, only the session profile is updated and the model is not called.
ai.trigger.sceneEvents.conversationsarray<string>no—Groups/channels that social events may wake, as platform:sceneId; * for every group. Defaults to ai.trigger.ambient.conversations (no wake when neither is set)
ai.trigger.sceneEvents.coalesceMsnumber | stringno—Coalesce window per scene in ms, clamped to 3000–5000 (default 4000)
ai.trigger.sceneEvents.minIntervalMsnumber | stringno—Minimum gap between two wakes in one scene in ms (default 15000); early batches are deferred, not dropped
ai.usageobject | nullno—结构化用量存储(SQLite、MySQL、PostgreSQL);独立于日志级别,不保存正文或工具参数。
ai.usage.retentionDaysinteger | stringno30用量明细保留天数,正整数,默认 30 天;按回合结束时间清理,子调用与所属回合一起删除。
ai.auditobject | nullno—决策审计 ai_decision_events(ADR 0036):每次进不进模型、说不说话、调不调工具都记一行,在 Console「机器人状态 → 决策回放」查看与导出;不保存正文、提示词或密钥。
ai.audit.retentionDaysinteger | stringno14决策审计保留天数,正整数,默认 14 天;启动时与之后每小时按事件时间清理过期行。
ai.imageStorageobjectno—Optional public R2 storage for generated images. Bucket access and lifecycle are managed by the operator.
ai.imageStorage.accountIdstringyes——
ai.imageStorage.bucketstringyes——
ai.imageStorage.accessKeyIdstringyes——
ai.imageStorage.secretAccessKeystringyes——
ai.imageStorage.publicBaseUrlstringyes—Public HTTPS base URL; not the S3 upload endpoint.
ai.imageStorage.prefixstringyes—Object directory ending in /; must be covered by the bucket lifecycle.
ai.personalPrincipalsobjectno—Administrator mapping from authenticated Console principal ids to exact IM owners; never inferred from client input.
menuKeywordstring | falseno—Built-in command menu keyword. Defaults to 菜单; false or an empty string disables the menu.
commandSuggestionboolean | objectno—Reply "no such command, did you mean …" instead of handing a near-miss command (private chat, @mention or prefixed message) to the AI. false disables it.
menuStyleobjectno—Command menu appearance when an HTML renderer is available; plain text fallback remains available.
menuStyle.titlestringno—Menu title.
menuStyle.subtitlestringno—Menu subtitle.
menuStyle.accentColorstringno—Six-digit hex accent color; invalid values use the renderer default.
menuStyle.backgroundImagestringno—HTTP(S) image or PNG/JPEG/WebP data URL; unsupported values use the renderer default.
mcpobjectno—Expose Bot tools through an MCP Server.
mcp.enabledboolean | stringno——
mcp.pathstring | nullno——
mcp.tokenstring | nullno——
mcp.allowUnauthenticatedLocalhostboolean | stringno——
a2aobjectno—A2A Agent Card, remote execution, and cross-process Mailbox transport.
a2a.enabledboolean | stringno——
a2a.pathstring | nullno——
a2a.tokenstring | nullno——
a2a.publicUrlstring | nullno——
a2a.mailboxobject | nullno—Cross-process A2A Mailbox transport for signed Mail + Authority + Budget envelopes (ADR 0048 §3.6).
a2a.mailbox.enabledboolean | stringno——
a2a.mailbox.pathstringno—Inbound HTTP route path (defaults to /a2a/mailbox).
a2a.mailbox.secretstringno——
a2a.mailbox.maxBodyBytesnumber | stringno——
a2a.mailbox.peersarray<object>no——
a2a.mailbox.peers[].actorstringyes——
a2a.mailbox.peers[].urlstringyes——
a2a.mailbox.peers[].tokenstringno——
a2a.mailbox.peers[].secretstringno——
a2a.mailbox.peers[].timeoutMsnumber | stringno——
speechobjectno—Speech-to-text and text-to-speech Host.
speech.sttobject | nullno——
speech.stt.enabledboolean | stringno——
speech.stt.providerstringno——
speech.stt.modelstringno——
speech.stt.hoststringno——
speech.stt.apiKeystringno——
speech.ttsobject | nullno——
speech.tts.enabledboolean | stringno——
speech.tts.providerstringno——
speech.tts.voicestringno——
speech.tts.modelstringno——
speech.tts.hoststringno——
speech.tts.apiKeystringno——
speech.tts.ratestringno—edge-tts
speech.tts.pitchstringno——
speech.tts.edgeTtsCommandstringno——
speech.tts.regionstringno—azure
speech.tts.subscriptionKeystringno——
speech.tts.baseUrlstringno—custom OpenAI-compatible
speech.tts.headersobjectno——
speech.tts.speednumber | stringno——
htmlRendererobjectno—HTML and image rendering options backed by Shotium.
htmlRenderer.widthnumberno—Default layout width in CSS pixels.
htmlRenderer.defaultWidthnumberno—Legacy alias of width.
htmlRenderer.viewportobjectno—Default viewport for Shotium rendering.
htmlRenderer.viewport.widthnumberno—Viewport width in CSS pixels.
htmlRenderer.viewport.heightnumberno—Viewport height in CSS pixels.
htmlRenderer.backgroundColorstringno—Fragment background color.
htmlRenderer.defaultBackgroundColorstringno—Legacy alias of backgroundColor.
htmlRenderer.scalenumberno—Device scale factor.
htmlRenderer.typestring: "png", "jpeg", "webp"no—Default raster output format.
htmlRenderer.qualitynumberno—Quality for jpeg/webp output.
htmlRenderer.timeoutnumberno—Navigation timeout in milliseconds.
htmlRenderer.waitUntilstring: "load", "networkidle"no—Navigation wait strategy.
htmlRenderer.fontFamilystringno—Default font-family for fragments.
htmlRenderer.maxImageHeightnumberno—Split overly tall PNGs above this height; 0 disables splitting.
htmlRenderer.sliceCompressionnumberno—Compression level used when splitting PNGs.
htmlRenderer.allowFileAccessbooleanno—Allow local file subresources.
htmlRenderer.takeOverHtmlSegmentsbooleanno—Take over html/markdown rich-segment image rendering.
htmlRenderer.cacheDirstringno—HTTP cache directory; use off to disable.
htmlRenderer.cacheMaxBytesnumberno—Maximum HTTP cache size in bytes.
htmlRenderer.userAgentstringno—Custom user agent string.
htmlRenderer.idleTimeoutMsnumberno—Daemon idle-exit timeout in milliseconds.
htmlRenderer.logStatsbooleanno—Log render timing statistics.
htmlRenderer.modestring: "inprocess", "daemon"no—Whether Shotium runs in-process or as a daemon.
assistantobjectno—Scheduled jobs, event ingress, and failure notifications.
assistant.enabledboolean | stringno—启用统一 JobStore(默认 false,Stable 行为不变)
assistant.defaultsobject | nullno——
assistant.defaults.notifyobject | object | object | object | nullno—未显式指定 notify 时的默认投递目标(M3)
assistant.defaults.notifyOnFailureboolean | stringno—Job 失败时是否通知(默认 false)
assistant.profileobject | nullno——
assistant.profile.enabledboolean | stringno—启用 Profile 覆盖 Bootstrap(默认 false)
assistant.profile.filestring | nullno—相对项目根路径,默认 assistant.profile.yml
assistant.homeobject | nullno——
assistant.home.enabledboolean | stringno——
assistant.home.restUrlstringno—HA REST 基址,如 http://homeassistant.local:8123
assistant.home.restTokenstringno—HA 长期访问令牌
assistant.home.mcpServerstringno—可选:ai.mcpServers 中的名称(REST 为主,MCP 仅校验)
assistant.home.aliasesobject | nullno—中文/友好名 → entity_id
assistant.home.policyobject | nullno——
assistant.home.policy.requireMasterboolean | stringno—仅 master 可调用 home_*(默认 true)
assistant.home.policy.confirmServicesarray | nullno—写操作需 Owner 审批的 HA domain(默认 lock、alarm_control_panel)
assistant.home.policy.allowedServiceDomainsarray | nullno—home_call_service 允许的 domain 白名单(默认 light/climate/scene/cover/script)
assistant.home.watcharray | nullno—要通过 HA WebSocket 订阅状态变化的设备别名列表
assistant.home.debounceMsnumber | string | nullno—同实体状态变化推送的防抖间隔(毫秒,默认 5000)
assistant.eventsobject | nullno——
assistant.events.enabledboolean | stringno—启用 POST /api/assistant/events(需 assistant.enabled)
assistant.events.tokenstringno—可选专用 Bearer;未设时复用 http.token(路由仍在 /api 下受全局鉴权保护)。
assistant.events.allowedSourcesarray<string>no—允许的来源白名单;空数组表示不限制
assistant.events.rateLimitPerMinutenumber | string | nullno—每来源每分钟最大请求数(默认 60)
log_levelstring | numberno—Runtime log level.
pluginobjectno—Root Plugin configuration; replaced by its project schema during composition.
localestring: "zh-CN", "en"no—Language used when no personal preference is set; Simplified Chinese when omitted. Language and time zone are independent.
featuresobjectno—Feature configuration beyond the plugin blocks (ADR 0055): in-chat self-service. Restart to apply.
features.selfServiceobjectno—In-chat feature / 功能 and role / 角色 commands for chat role admins (ADR 0055 / 0056). Off by default. Platform group owners / admins are not zhin roles: grant them admin explicitly.
features.selfService.enabledbooleannofalseRegister the in-chat feature and role commands.

Standalone AI import proposal ​

ai.plan.yml is for explicit review, apply and export. It is not startup configuration and never automatically replaces the runtime graph.

packages/im/ai/provider-plan.schema.json

PathTypeRequiredDefaultDescription
version1yes——
servicesobjectno——
services.<key>.driverstring | objectyes——
services.<key>.labelstringno——
services.<key>.optionsobjectno——
services.<key>.modelsobjectno——
services.<key>.models.<key>.idstringyes——
services.<key>.models.<key>.kindsarray<string: "language", "decision", "image">yes——
services.<key>.models.<key>.protocolstringyes——
services.<key>.models.<key>.inputarray<string: "text", "image", "audio", "video", "file">no——
services.<key>.models.<key>.streamingbooleanno——
services.<key>.models.<key>.toolCallingbooleanno——
services.<key>.models.<key>.thinkingbooleanno——
services.<key>.models.<key>.contextWindowintegerno——
services.<key>.models.<key>.maxOutputTokensintegerno——
accountsobjectno——
accounts.<key>.servicestringyes——
accounts.<key>.labelstringno——
accounts.<key>.authobject | object | objectyes——
profilesobjectno——
profiles.<key>.accountstringyes——
profiles.<key>.modelstringyes——
profiles.<key>.labelstringno——
profiles.<key>.parametersobjectno——
purposesobjectno——
purposes.chatstring | object | nullno——
purposes.summarystring | object | nullno——
purposes.ambientstring | object | nullno——
purposes.imagestring | object | nullno——
purposes.perceptionobject | nullno——
purposes.decisionsobjectno——
purposes.decisions.skillsobject | nullno——
purposes.decisions.toolsobject | nullno——
purposes.decisions.memoryobject | nullno——
purposes.decisions.agentsobject | nullno——
purposes.decisions.approvalobject | nullno——
purposes.decisions.ambientobject | nullno——
purposes.agentsobjectno——
purposes.adaptersobjectno——
purposes.endpointsobjectno——
purposes.scenesobjectno——
removeobjectno——
remove.servicesarray<string>no——
remove.accountsarray<string>no——
remove.profilesarray<string>no——

Plugin instance fields ​

These fields use the Runtime schema reader for trusted plugins’ config: Schema.object(...) declarations or schema.json; isolated plugins must use schema.json. Top-level <name> is the default instanceKey; plugins.<name> only stores the package reference.

bilibili ​

plugins/adapters/bilibili/schema.json

PathTypeRequiredDefaultDescription
bilibili.apiBaseUrlstringno"https://api.bilibili.com"—
bilibili.pollIntervalSecnumberno60Polling interval in seconds, at least 60; adds 0–20% random jitter.
bilibili.sendModestring: "review", "off"no"review"Outbound mode: review (default) queues AI replies as drafts; a master approves each send with the bili-draft send command. off disables outbound messages. Automatic direct replies are not supported.
bilibili.minSendIntervalSecnumberno30Minimum interval between approved sends in seconds (at least 10). Sending too soon is rejected, not queued.
bilibili.notificationsarray<string: "reply", "at">no[]Additional notifications to poll: reply (replies to me) and at (mentions). Requires cookies; video comments, plus dynamic or article comments when dynamics or articles are configured. Disabled by default.
bilibili.notificationScopestring: "whitelist", "all"no"whitelist"Notification scope: whitelist (default) accepts only configured videos, dynamics and articles; all accepts notifications from any video, plus any dynamic or article comment when dynamics or articles are configured.
bilibili.dataDirstringno"data/bilibili"Local data directory. Pending drafts and QR-login credentials are stored under <dataDir>/<endpoint id>/ (relative to the working directory) and survive restarts. Keep it out of the repository.
bilibili.notifyobjectno—Chat conversation to notify when a new draft arrives or the login expires (usually your private chat with the bot). Without it, drafts only appear on the Console Comment review page and in logs.
bilibili.notify.adapterstringyes—Adapter name, such as icqq or telegram.
bilibili.notify.endpointstringyes—Endpoint id of that adapter.
bilibili.notify.kindstring: "private", "group", "channel"no"private"Conversation type.
bilibili.notify.idstring | numberyes—Conversation id: your account for a private chat, or the group id.
bilibili.videosarray<string | number>no—Allowed videos, using BV or av IDs. Only comments on these videos are polled; no site-wide search.
bilibili.dynamicsarray<string>no—Allowed dynamics (posts), as dynamic IDs quoted as strings (the number in t.bilibili.com/<id> or bilibili.com/opus/<id>). Each is resolved to its comment area at startup (image post type=11 / text post type=17); dynamics that cannot be resolved are skipped. No site-wide search.
bilibili.articlesarray<string | number>no—Allowed articles, as cv IDs (cv123 or 123); comment area type=12. No site-wide search.
bilibili.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
bilibili.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
bilibili.endpoints[].idstringyes—Local endpoint name, not a Bilibili account ID.
bilibili.endpoints[].sessdatastringno—SESSDATA cookie, acting as your account. Reference ${BILIBILI_SESSDATA}; never commit it to the repository.
bilibili.endpoints[].biliJctstringno—bili_jct cookie (CSRF token). Reference ${BILIBILI_BILI_JCT}.
bilibili.endpoints[].videosarray<string | number>no—Allowed videos, using BV or av IDs. Only comments on these videos are polled; no site-wide search.
bilibili.endpoints[].dynamicsarray<string>no—Allowed dynamics (posts), as dynamic IDs quoted as strings (the number in t.bilibili.com/<id> or bilibili.com/opus/<id>). Each is resolved to its comment area at startup (image post type=11 / text post type=17); dynamics that cannot be resolved are skipped. No site-wide search.
bilibili.endpoints[].articlesarray<string | number>no—Allowed articles, as cv IDs (cv123 or 123); comment area type=12. No site-wide search.
bilibili.endpoints[].pollIntervalSecnumberno60Polling interval in seconds, at least 60; adds 0–20% random jitter.
bilibili.endpoints[].sendModestring: "review", "off"no"review"Outbound mode: review (default) queues AI replies as drafts; a master approves each send with the bili-draft send command. off disables outbound messages. Automatic direct replies are not supported.
bilibili.endpoints[].minSendIntervalSecnumberno30Minimum interval between approved sends in seconds (at least 10). Sending too soon is rejected, not queued.
bilibili.endpoints[].notificationsarray<string: "reply", "at">no[]Additional notifications to poll: reply (replies to me) and at (mentions). Requires cookies; video comments, plus dynamic or article comments when dynamics or articles are configured. Disabled by default.
bilibili.endpoints[].notificationScopestring: "whitelist", "all"no"whitelist"Notification scope: whitelist (default) accepts only configured videos, dynamics and articles; all accepts notifications from any video, plus any dynamic or article comment when dynamics or articles are configured.
bilibili.endpoints[].dataDirstringno"data/bilibili"Local data directory. Pending drafts and QR-login credentials are stored under <dataDir>/<endpoint id>/ (relative to the working directory) and survive restarts. Keep it out of the repository.
bilibili.endpoints[].notifyobjectno—Chat conversation to notify when a new draft arrives or the login expires (usually your private chat with the bot). Without it, drafts only appear on the Console Comment review page and in logs.
bilibili.endpoints[].notify.adapterstringyes—Adapter name, such as icqq or telegram.
bilibili.endpoints[].notify.endpointstringyes—Endpoint id of that adapter.
bilibili.endpoints[].notify.kindstring: "private", "group", "channel"no"private"Conversation type.
bilibili.endpoints[].notify.idstring | numberyes—Conversation id: your account for a private chat, or the group id.
bilibili.endpoints[].apiBaseUrlstringno"https://api.bilibili.com"—
bilibili.endpoints[].commandPrefixstringno——
bilibili.endpoints[].nicknamestring | nullno—Fallback account nickname
bilibili.endpoints[].profileobjectno—Fallback account profile
bilibili.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
bilibili.endpoints[].profile.ageinteger | nullno——
bilibili.endpoints[].profile.birthdaystring | nullno——
bilibili.endpoints[].profile.signaturestring | nullno——
bilibili.endpoints[].profile.avatarstring | nullno——
bilibili.endpoints[].profile.interestsarray | nullno——
bilibili.endpoints[].profile.biostring | nullno——
bilibili.nicknamestring | nullno—Fallback account nickname
bilibili.profileobjectno—Fallback account profile
bilibili.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
bilibili.profile.ageinteger | nullno——
bilibili.profile.birthdaystring | nullno——
bilibili.profile.signaturestring | nullno——
bilibili.profile.avatarstring | nullno——
bilibili.profile.interestsarray | nullno——
bilibili.profile.biostring | nullno——

bilibili-live ​

plugins/adapters/bilibili-live/schema.json

PathTypeRequiredDefaultDescription
bilibili-live.roomIdstring | numberno—Live room id (short or full); use your own room only.
bilibili-live.sendModestring: "direct", "off"no"direct"Outbound mode: direct (default, needs login) posts the reply as danmaku; off only listens.
bilibili-live.maxLengthnumberno20Maximum characters per danmaku (default 20; higher live levels allow more).
bilibili-live.maxChunksnumberno2Maximum danmaku per reply (default 2); the rest is truncated.
bilibili-live.minSendIntervalSecnumberno5Minimum seconds between two replies, at least 2; a reply sent sooner is rejected, not queued.
bilibili-live.apiBaseUrlstringno"https://api.bilibili.com"—
bilibili-live.liveApiBaseUrlstringno"https://api.live.bilibili.com"—
bilibili-live.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
bilibili-live.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
bilibili-live.endpoints[].idstringyes—Local endpoint name, not a Bilibili account ID.
bilibili-live.endpoints[].sessdatastringno—SESSDATA cookie, acting as your account. Reference ${BILIBILI_SESSDATA}; never commit it. Omit to listen anonymously.
bilibili-live.endpoints[].biliJctstringno—bili_jct cookie (csrf token) needed to send danmaku. Reference ${BILIBILI_BILI_JCT}.
bilibili-live.endpoints[].buvid3stringno—Optional buvid3 cookie; requested from the platform at startup when omitted.
bilibili-live.endpoints[].roomIdstring | numberno—Live room id (short or full); use your own room only.
bilibili-live.endpoints[].sendModestring: "direct", "off"no"direct"Outbound mode: direct (default, needs login) posts the reply as danmaku; off only listens.
bilibili-live.endpoints[].maxLengthnumberno20Maximum characters per danmaku (default 20; higher live levels allow more).
bilibili-live.endpoints[].maxChunksnumberno2Maximum danmaku per reply (default 2); the rest is truncated.
bilibili-live.endpoints[].minSendIntervalSecnumberno5Minimum seconds between two replies, at least 2; a reply sent sooner is rejected, not queued.
bilibili-live.endpoints[].apiBaseUrlstringno"https://api.bilibili.com"—
bilibili-live.endpoints[].liveApiBaseUrlstringno"https://api.live.bilibili.com"—
bilibili-live.endpoints[].commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
bilibili-live.endpoints[].nicknamestring | nullno—Fallback account nickname
bilibili-live.endpoints[].profileobjectno—Fallback account profile
bilibili-live.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
bilibili-live.endpoints[].profile.ageinteger | nullno——
bilibili-live.endpoints[].profile.birthdaystring | nullno——
bilibili-live.endpoints[].profile.signaturestring | nullno——
bilibili-live.endpoints[].profile.avatarstring | nullno——
bilibili-live.endpoints[].profile.interestsarray | nullno——
bilibili-live.endpoints[].profile.biostring | nullno——
bilibili-live.nicknamestring | nullno—Fallback account nickname
bilibili-live.profileobjectno—Fallback account profile
bilibili-live.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
bilibili-live.profile.ageinteger | nullno——
bilibili-live.profile.birthdaystring | nullno——
bilibili-live.profile.signaturestring | nullno——
bilibili-live.profile.avatarstring | nullno——
bilibili-live.profile.interestsarray | nullno——
bilibili-live.profile.biostring | nullno——

dingtalk ​

plugins/adapters/dingtalk/schema.json

PathTypeRequiredDefaultDescription
dingtalk.apiBaseUrlstringno"https://oapi.dingtalk.com"—
dingtalk.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
dingtalk.endpoints[].appKeystringyes—Dingtalk app key
dingtalk.endpoints[].appSecretstringyes—Dingtalk app secret
dingtalk.endpoints[].webhookPathstringno—Dingtalk webhook path
dingtalk.endpoints[].robotCodestringno—Dingtalk robot code
dingtalk.endpoints[].apiBaseUrlstringno——
dingtalk.endpoints[].commandPrefixstringno——
dingtalk.endpoints[].idstringyes—Dingtalk bot name
dingtalk.endpoints[].modestring: "webhook", "stream"no"webhook"—
dingtalk.endpoints[].cardTemplateIdstringno—Stream interactive card template ID
dingtalk.endpoints[].cardButtonCountintegerno2Fixed button count in the card template
dingtalk.endpoints[].streamProxyobjectno—Fault-injection tests only: pin TCP to 127.0.0.1 while preserving the actual WSS TLS identity.
dingtalk.endpoints[].streamProxy.portintegeryes——
dingtalk.endpoints[].streamProxy.serverNamestringyes——
dingtalk.endpoints[].nicknamestring | nullno—Fallback account nickname
dingtalk.endpoints[].profileobjectno—Fallback account profile
dingtalk.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
dingtalk.endpoints[].profile.ageinteger | nullno——
dingtalk.endpoints[].profile.birthdaystring | nullno——
dingtalk.endpoints[].profile.signaturestring | nullno——
dingtalk.endpoints[].profile.avatarstring | nullno——
dingtalk.endpoints[].profile.interestsarray | nullno——
dingtalk.endpoints[].profile.biostring | nullno——
dingtalk.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
dingtalk.modestring: "webhook", "stream"no"webhook"—
dingtalk.cardTemplateIdstringno—Stream interactive card template ID
dingtalk.cardButtonCountintegerno2Fixed button count in the card template
dingtalk.nicknamestring | nullno—Fallback account nickname
dingtalk.profileobjectno—Fallback account profile
dingtalk.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
dingtalk.profile.ageinteger | nullno——
dingtalk.profile.birthdaystring | nullno——
dingtalk.profile.signaturestring | nullno——
dingtalk.profile.avatarstring | nullno——
dingtalk.profile.interestsarray | nullno——
dingtalk.profile.biostring | nullno——

discord ​

plugins/adapters/discord/schema.json

PathTypeRequiredDefaultDescription
discord.connectionstring: "gateway", "interactions"no"gateway"Gateway WebSocket (default). interactions uses httpHostToken POST + Ed25519 verify.
discord.intentsarray<number>no——
discord.enableSlashCommandsbooleannofalse—
discord.globalCommandsbooleannofalse—
discord.defaultActivityobjectno——
discord.defaultActivity.namestringyes——
discord.defaultActivity.typestring: "PLAYING", "STREAMING", "LISTENING", "WATCHING", "COMPETING"yes——
discord.defaultActivity.urlstringno——
discord.slashCommandsarray<object>no——
discord.applicationIdstringno—Required when connection is interactions.
discord.publicKeystringno—Required when connection is interactions (hex Ed25519 public key).
discord.interactionsPathstringno"/discord/interactions"POST path on httpHostToken when connection is interactions.
discord.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id and token are required; other fields override instance defaults.
discord.endpoints[].tokenstringyes—Discord bot token
discord.endpoints[].connectionstring: "gateway", "interactions"no——
discord.endpoints[].intentsarray<number>no——
discord.endpoints[].enableSlashCommandsbooleanno——
discord.endpoints[].globalCommandsbooleanno——
discord.endpoints[].defaultActivityobjectno——
discord.endpoints[].defaultActivity.namestringyes——
discord.endpoints[].defaultActivity.typestring: "PLAYING", "STREAMING", "LISTENING", "WATCHING", "COMPETING"yes——
discord.endpoints[].defaultActivity.urlstringno——
discord.endpoints[].slashCommandsarray<object>no——
discord.endpoints[].applicationIdstringno——
discord.endpoints[].publicKeystringno——
discord.endpoints[].interactionsPathstringno——
discord.endpoints[].commandPrefixstringno——
discord.endpoints[].idstringyes—Discord bot name
discord.endpoints[].gatewayFaultProxyUrlstringno—Isolated acceptance only: loopback Gateway fault proxy; REST unchanged.
discord.endpoints[].restApiProxyobjectno—REST-only fault proxy for Gateway tests: pin discord.com:443 TCP to loopback while preserving SNI and certificate validation, independently of the Gateway proxy.
discord.endpoints[].restApiProxy.portintegeryes——
discord.endpoints[].nicknamestring | nullno—Fallback account nickname
discord.endpoints[].profileobjectno—Fallback account profile
discord.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
discord.endpoints[].profile.ageinteger | nullno——
discord.endpoints[].profile.birthdaystring | nullno——
discord.endpoints[].profile.signaturestring | nullno——
discord.endpoints[].profile.avatarstring | nullno——
discord.endpoints[].profile.interestsarray | nullno——
discord.endpoints[].profile.biostring | nullno——
discord.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
discord.gatewayFaultProxyUrlstringno—Isolated acceptance only: loopback Gateway fault proxy; REST unchanged.
discord.nicknamestring | nullno—Fallback account nickname
discord.profileobjectno—Fallback account profile
discord.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
discord.profile.ageinteger | nullno——
discord.profile.birthdaystring | nullno——
discord.profile.signaturestring | nullno——
discord.profile.avatarstring | nullno——
discord.profile.interestsarray | nullno——
discord.profile.biostring | nullno——

douyin-live ​

plugins/adapters/douyin-live/schema.json

PathTypeRequiredDefaultDescription
douyin-live.sendModestring: "off", "direct"no"off"Outbound mode: off (default) only listens; direct is not implemented yet and returns not_implemented.
douyin-live.maxLengthnumberno50Maximum characters per danmaku (default 50; reserved for future direct sending).
douyin-live.maxChunksnumberno2Maximum danmaku per reply (default 2).
douyin-live.minSendIntervalSecnumberno5Minimum seconds between two replies, at least 2.
douyin-live.signerUrlstringno—Optional external signer (GET ?stub=<X-MS-STUB> returns the signature). The package ships no platform signing script; without it the socket connects unsigned and the platform may refuse.
douyin-live.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
douyin-live.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
douyin-live.endpoints[].idstringyes—Local endpoint name, not a Douyin account ID.
douyin-live.endpoints[].cookiestringno—Full browser cookie string. Reference ${DOUYIN_LIVE_COOKIE}; never commit it. Omit to request a guest ttwid at startup.
douyin-live.endpoints[].roomIdstring | integeryes—Live room web_rid (the number after live.douyin.com/); use your own room only.
douyin-live.endpoints[].sendModestring: "off", "direct"no"off"Outbound mode: off (default) only listens; direct is not implemented yet and returns not_implemented.
douyin-live.endpoints[].maxLengthnumberno50Maximum characters per danmaku (default 50; reserved for future direct sending).
douyin-live.endpoints[].maxChunksnumberno2Maximum danmaku per reply (default 2).
douyin-live.endpoints[].minSendIntervalSecnumberno5Minimum seconds between two replies, at least 2.
douyin-live.endpoints[].signerUrlstringno—Optional external signer (GET ?stub=<X-MS-STUB> returns the signature). The package ships no platform signing script; without it the socket connects unsigned and the platform may refuse.
douyin-live.endpoints[].commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
douyin-live.endpoints[].nicknamestring | nullno—Fallback account nickname
douyin-live.endpoints[].profileobjectno—Fallback account profile
douyin-live.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
douyin-live.endpoints[].profile.ageinteger | nullno——
douyin-live.endpoints[].profile.birthdaystring | nullno——
douyin-live.endpoints[].profile.signaturestring | nullno——
douyin-live.endpoints[].profile.avatarstring | nullno——
douyin-live.endpoints[].profile.interestsarray | nullno——
douyin-live.endpoints[].profile.biostring | nullno——
douyin-live.nicknamestring | nullno—Fallback account nickname
douyin-live.profileobjectno—Fallback account profile
douyin-live.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
douyin-live.profile.ageinteger | nullno——
douyin-live.profile.birthdaystring | nullno——
douyin-live.profile.signaturestring | nullno——
douyin-live.profile.avatarstring | nullno——
douyin-live.profile.interestsarray | nullno——
douyin-live.profile.biostring | nullno——

email ​

plugins/adapters/email/schema.json

PathTypeRequiredDefaultDescription
email.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
email.endpoints[].smtpobjectyes——
email.endpoints[].smtp.hoststringyes——
email.endpoints[].smtp.portnumberyes——
email.endpoints[].smtp.securebooleanyes——
email.endpoints[].smtp.authobjectyes——
email.endpoints[].smtp.auth.userstringyes——
email.endpoints[].smtp.auth.passstringyes——
email.endpoints[].smtp.serverNamestringno—TLS SNI and certificate hostname verification. Preserve the original service hostname when using a proxy; does not change certificate validation policy.
email.endpoints[].imapobjectyes——
email.endpoints[].imap.hoststringyes——
email.endpoints[].imap.portnumberyes——
email.endpoints[].imap.tlsbooleanyes——
email.endpoints[].imap.userstringyes——
email.endpoints[].imap.passwordstringyes——
email.endpoints[].imap.checkIntervalnumberno60000—
email.endpoints[].imap.reconnectIntervalnumberno5000—
email.endpoints[].imap.mailboxstringno"INBOX"—
email.endpoints[].imap.markSeenbooleannotrue—
email.endpoints[].imap.serverNamestringno—TLS SNI and certificate hostname verification. Preserve the original service hostname when using a proxy; does not change certificate validation policy.
email.endpoints[].attachmentsobjectno——
email.endpoints[].attachments.enabledbooleannofalse—
email.endpoints[].attachments.downloadPathstringno——
email.endpoints[].attachments.maxFileSizenumberno——
email.endpoints[].attachments.allowedTypesarray<string>no——
email.endpoints[].commandPrefixstringno——
email.endpoints[].idstringyes—Email bot name
email.endpoints[].nicknamestring | nullno—Fallback account nickname
email.endpoints[].profileobjectno—Fallback account profile
email.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
email.endpoints[].profile.ageinteger | nullno——
email.endpoints[].profile.birthdaystring | nullno——
email.endpoints[].profile.signaturestring | nullno——
email.endpoints[].profile.avatarstring | nullno——
email.endpoints[].profile.interestsarray | nullno——
email.endpoints[].profile.biostring | nullno——
email.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
email.nicknamestring | nullno—Fallback account nickname
email.profileobjectno—Fallback account profile
email.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
email.profile.ageinteger | nullno——
email.profile.birthdaystring | nullno——
email.profile.signaturestring | nullno——
email.profile.avatarstring | nullno——
email.profile.interestsarray | nullno——
email.profile.biostring | nullno——

github ​

plugins/adapters/github/schema.json

PathTypeRequiredDefaultDescription
github.hoststringno—GitHub Enterprise hostname (default github.com)
github.webhook_pathstringno"/github/webhook"—
github.auto_reply_reposarray<string>no—Repos whose Issue/PR comments auto-trigger AI without @bot
github.bot_loginstringno—Override App bot login (default {slug}[bot])
github.workspace_rootstringno—Managed git workspace root
github.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance.
github.endpoints[].app_idstring | numberyes—GitHub App ID
github.endpoints[].private_keystringyes—GitHub App private key (PEM content or file path)
github.endpoints[].webhook_secretstringno—Webhook HMAC secret; enables httpHostToken POST route
github.endpoints[].idstringyes—GitHub App bot name
github.endpoints[].hoststringno—GitHub Enterprise hostname
github.endpoints[].webhook_pathstringno—Webhook route path
github.endpoints[].auto_reply_reposarray<string>no—Repos whose comments auto-trigger AI
github.endpoints[].bot_loginstringno—Override App bot login
github.endpoints[].workspace_rootstringno—Managed git workspace root
github.endpoints[].commandPrefixstringno—Command prefix for this endpoint.
github.endpoints[].nicknamestring | nullno—Fallback account nickname
github.endpoints[].profileobjectno—Fallback account profile
github.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
github.endpoints[].profile.ageinteger | nullno——
github.endpoints[].profile.birthdaystring | nullno——
github.endpoints[].profile.signaturestring | nullno——
github.endpoints[].profile.avatarstring | nullno——
github.endpoints[].profile.interestsarray | nullno——
github.endpoints[].profile.biostring | nullno——
github.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
github.nicknamestring | nullno—Fallback account nickname
github.profileobjectno—Fallback account profile
github.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
github.profile.ageinteger | nullno——
github.profile.birthdaystring | nullno——
github.profile.signaturestring | nullno——
github.profile.avatarstring | nullno——
github.profile.interestsarray | nullno——
github.profile.biostring | nullno——

icqq ​

plugins/adapters/icqq/schema.json

PathTypeRequiredDefaultDescription
icqq.passwordstringno—QQ password (optional); scan a QR code to log in when omitted.
icqq.platformnumber: 1, 2, 3, 4, 5, 6, 7no1Login device platform: 1=Android, 2=aPad, 3=Watch, 4=iMac, 5=iPad, 6=Tim, 7=Custom.
icqq.verstringno—Protocol version, only applicable when the selected platform has multiple versions. Uses the latest when omitted.
icqq.signApiAddrstringno—Signing server URL. When omitted, uses local signing automatically if @icqqjs/qqsign is installed.
icqq.dataDirstringno—Data directory path; defaults to the data directory under the main module.
icqq.autoReconnectbooleannotrueReconnect automatically after disconnecting (default true).
icqq.outboundMediastring: "file", "base64"no"file"Outbound media mode: file uses local file paths (default); base64 uses inline CQ base64:// data.
icqq.ignoreSelfbooleannotrueFilter the bot's own messages in groups and channels (default true).
icqq.resendbooleannofalseAttempt fragmented sending when rate-limited by the platform (default false).
icqq.cacheGroupMemberbooleannotrueCache group member lists (default true). Large numbers of groups (500+) may use approximately 100 MB or more of extra memory.
icqq.autoServerbooleannotrueAutomatically select the optimal server (default true).
icqq.qqntbooleannotrueUse the QQNT protocol (default true).
icqq.ntLoginbooleanno—Use the NT login method.
icqq.logLevelstring: "trace", "debug", "info", "warn", "error", "fatal", "mark", "off"no"warn"Level of the ICQQ SDK's own log lines (default warn). Its per-message lines with the message text (recv from / succeed to send) only appear at debug or below, escaped onto one line.
icqq.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
icqq.endpoints[].idstringyes—QQ uin
icqq.endpoints[].passwordstringno—QQ password for this endpoint.
icqq.endpoints[].platformnumber: 1, 2, 3, 4, 5, 6, 7no—Login device platform: 1=Android, 2=aPad, 3=Watch, 4=iMac, 5=iPad, 6=Tim, 7=Custom.
icqq.endpoints[].verstringno—Protocol version.
icqq.endpoints[].signApiAddrstringno—Signing server URL.
icqq.endpoints[].dataDirstringno—Data directory path.
icqq.endpoints[].autoReconnectbooleanno—Reconnect automatically after disconnecting.
icqq.endpoints[].outboundMediastring: "file", "base64"no—Outbound media mode.
icqq.endpoints[].ignoreSelfbooleanno—Filter the bot's own messages.
icqq.endpoints[].resendbooleanno—Use fragmented sending when rate-limited by the platform.
icqq.endpoints[].cacheGroupMemberbooleanno—Cache group member lists.
icqq.endpoints[].autoServerbooleanno—Automatically select the optimal server.
icqq.endpoints[].qqntbooleanno—Use the QQNT protocol.
icqq.endpoints[].ntLoginbooleanno—Use the NT login method.
icqq.endpoints[].logLevelstring: "trace", "debug", "info", "warn", "error", "fatal", "mark", "off"no—Level of the ICQQ SDK's own log lines.
icqq.endpoints[].commandPrefixstringno—Command prefix for this endpoint.
icqq.endpoints[].notifyobjectno—Send outage/login notices to the master through another adapter instance (adapter/endpoint/kind/id identify the actual conversation).
icqq.endpoints[].notify.adapterstringyes—Adapter type used for the notice, such as qq or icqq.
icqq.endpoints[].notify.endpointstringyes—Endpoint id of that adapter.
icqq.endpoints[].notify.kindstring: "private", "group", "channel"no"private"Conversation kind; defaults to private.
icqq.endpoints[].notify.idstring | numberyes—Master conversation id on that platform (openid for QQ official, QQ number for ICQQ).
icqq.endpoints[].notify.parentobjectno—可选的父频道/群容器
icqq.endpoints[].notify.parent.kindstring: "private", "group", "channel"yes——
icqq.endpoints[].notify.parent.idstring | numberyes——
icqq.endpoints[].nicknamestring | nullno—Fallback account nickname
icqq.endpoints[].profileobjectno—Fallback account profile
icqq.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
icqq.endpoints[].profile.ageinteger | nullno——
icqq.endpoints[].profile.birthdaystring | nullno——
icqq.endpoints[].profile.signaturestring | nullno——
icqq.endpoints[].profile.avatarstring | nullno——
icqq.endpoints[].profile.interestsarray | nullno——
icqq.endpoints[].profile.biostring | nullno——
icqq.commandPrefixstringno""Command prefix, empty by default. Each endpoints[i] can override it.
icqq.notifyobjectno—Send outage/login notices to the master through another adapter instance (adapter/endpoint/kind/id identify the actual conversation).
icqq.notify.adapterstringyes—Adapter type used for the notice, such as qq or icqq.
icqq.notify.endpointstringyes—Endpoint id of that adapter.
icqq.notify.kindstring: "private", "group", "channel"no"private"Conversation kind; defaults to private.
icqq.notify.idstring | numberyes—Master conversation id on that platform (openid for QQ official, QQ number for ICQQ).
icqq.notify.parentobjectno—可选的父频道/群容器
icqq.notify.parent.kindstring: "private", "group", "channel"yes——
icqq.notify.parent.idstring | numberyes——
icqq.nicknamestring | nullno—Fallback account nickname
icqq.profileobjectno—Fallback account profile
icqq.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
icqq.profile.ageinteger | nullno——
icqq.profile.birthdaystring | nullno——
icqq.profile.signaturestring | nullno——
icqq.profile.avatarstring | nullno——
icqq.profile.interestsarray | nullno——
icqq.profile.biostring | nullno——

juejin ​

plugins/adapters/juejin/schema.json

PathTypeRequiredDefaultDescription
juejin.apiBaseUrlstringno"https://api.juejin.cn"—
juejin.pollIntervalSecnumberno60Polling interval in seconds, at least 60; adds 0–20% random jitter.
juejin.sendModestring: "review", "off"no"review"Outbound mode: review (default) queues AI replies as drafts; a master approves each send on the Console page or with juejin-draft send. off disables outbound messages. Automatic direct replies are not supported.
juejin.minSendIntervalSecnumberno30Minimum interval between approved sends in seconds (at least 10). Sending too soon is rejected, not queued.
juejin.dataDirstringno"data/juejin"Local data directory. Pending drafts are stored in <dataDir>/<endpoint id>/drafts.json (mode 600, relative to the working directory) and survive restarts. Keep it out of the repository.
juejin.notifyobjectno—Chat conversation to notify when a new draft arrives or the login expires (usually your private chat with the bot). Without it, drafts only appear on the Console Juejin comment review page and in logs.
juejin.notify.adapterstringyes—Adapter name, such as icqq or telegram.
juejin.notify.endpointstringyes—Endpoint id of that adapter.
juejin.notify.kindstring: "private", "group", "channel"no"private"Conversation type.
juejin.notify.idstring | numberyes—Conversation id: your account for a private chat, or the group id.
juejin.articlesarray<string>no—Allowed articles: article IDs (quoted strings) or https://juejin.cn/post/<id&gt; links. Only these articles are polled; there is no site-wide search. Empty means nothing is polled.
juejin.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
juejin.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
juejin.endpoints[].idstringyes—Local endpoint name, not a Juejin account ID.
juejin.endpoints[].cookiestringno—Full Juejin web login Cookie header (must include sessionid), acting as your account. Reference ${JUEJIN_COOKIE}; never commit it to the repository.
juejin.endpoints[].articlesarray<string>no—Allowed articles: article IDs (quoted strings) or https://juejin.cn/post/<id&gt; links. Only these articles are polled; there is no site-wide search. Empty means nothing is polled.
juejin.endpoints[].pollIntervalSecnumberno60Polling interval in seconds, at least 60; adds 0–20% random jitter.
juejin.endpoints[].sendModestring: "review", "off"no"review"Outbound mode: review (default) queues AI replies as drafts; a master approves each send on the Console page or with juejin-draft send. off disables outbound messages. Automatic direct replies are not supported.
juejin.endpoints[].minSendIntervalSecnumberno30Minimum interval between approved sends in seconds (at least 10). Sending too soon is rejected, not queued.
juejin.endpoints[].dataDirstringno"data/juejin"Local data directory. Pending drafts are stored in <dataDir>/<endpoint id>/drafts.json (mode 600, relative to the working directory) and survive restarts. Keep it out of the repository.
juejin.endpoints[].notifyobjectno—Chat conversation to notify when a new draft arrives or the login expires (usually your private chat with the bot). Without it, drafts only appear on the Console Juejin comment review page and in logs.
juejin.endpoints[].notify.adapterstringyes—Adapter name, such as icqq or telegram.
juejin.endpoints[].notify.endpointstringyes—Endpoint id of that adapter.
juejin.endpoints[].notify.kindstring: "private", "group", "channel"no"private"Conversation type.
juejin.endpoints[].notify.idstring | numberyes—Conversation id: your account for a private chat, or the group id.
juejin.endpoints[].apiBaseUrlstringno"https://api.juejin.cn"—
juejin.endpoints[].commandPrefixstringno——
juejin.endpoints[].nicknamestring | nullno—Fallback account nickname
juejin.endpoints[].profileobjectno—Fallback account profile
juejin.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
juejin.endpoints[].profile.ageinteger | nullno——
juejin.endpoints[].profile.birthdaystring | nullno——
juejin.endpoints[].profile.signaturestring | nullno——
juejin.endpoints[].profile.avatarstring | nullno——
juejin.endpoints[].profile.interestsarray | nullno——
juejin.endpoints[].profile.biostring | nullno——
juejin.nicknamestring | nullno—Fallback account nickname
juejin.profileobjectno—Fallback account profile
juejin.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
juejin.profile.ageinteger | nullno——
juejin.profile.birthdaystring | nullno——
juejin.profile.signaturestring | nullno——
juejin.profile.avatarstring | nullno——
juejin.profile.interestsarray | nullno——
juejin.profile.biostring | nullno——

kook ​

plugins/adapters/kook/schema.json

PathTypeRequiredDefaultDescription
kook.connectionstring: "websocket", "webhook"no"websocket"WebSocket gateway (default). webhook requires httpHostToken, verify_token, and a public HTTPS callback URL.
kook.webhookPathstringno"/kook/webhook"POST path registered via httpHostToken when connection is webhook.
kook.data_dirstringno——
kook.timeoutnumberno10000—
kook.max_retrynumberno3—
kook.ignorestring: "bot", "self"no"bot"—
kook.logLevelstring: "trace", "debug", "info", "warn", "error", "fatal", "mark", "off"no"info"—
kook.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id and token are required; other fields override instance defaults.
kook.endpoints[].tokenstringyes—KOOK bot token
kook.endpoints[].connectionstring: "websocket", "webhook"no——
kook.endpoints[].webhookPathstringno——
kook.endpoints[].verify_tokenstringno—KOOK developer console verify token (required for webhook mode).
kook.endpoints[].encrypt_keystringno—Optional Encrypt Key when message encryption is enabled in KOOK console.
kook.endpoints[].data_dirstringno——
kook.endpoints[].timeoutnumberno——
kook.endpoints[].max_retrynumberno——
kook.endpoints[].ignorestring: "bot", "self"no——
kook.endpoints[].logLevelstring: "trace", "debug", "info", "warn", "error", "fatal", "mark", "off"no——
kook.endpoints[].commandPrefixstringno——
kook.endpoints[].idstringyes—KOOK bot name
kook.endpoints[].streamProxyobjectno—Pin WSS fault-injection tests to loopback while preserving the actual TLS identity.
kook.endpoints[].streamProxy.portintegeryes——
kook.endpoints[].streamProxy.serverNamestringyes——
kook.endpoints[].apiProxyobjectno—Optional fixed loopback TCP route for www.kookapp.cn JSON API only; verified TLS remains enabled.
kook.endpoints[].apiProxy.portintegeryes——
kook.endpoints[].nicknamestring | nullno—Fallback account nickname
kook.endpoints[].profileobjectno—Fallback account profile
kook.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
kook.endpoints[].profile.ageinteger | nullno——
kook.endpoints[].profile.birthdaystring | nullno——
kook.endpoints[].profile.signaturestring | nullno——
kook.endpoints[].profile.avatarstring | nullno——
kook.endpoints[].profile.interestsarray | nullno——
kook.endpoints[].profile.biostring | nullno——
kook.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
kook.nicknamestring | nullno—Fallback account nickname
kook.profileobjectno—Fallback account profile
kook.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
kook.profile.ageinteger | nullno——
kook.profile.birthdaystring | nullno——
kook.profile.signaturestring | nullno——
kook.profile.avatarstring | nullno——
kook.profile.interestsarray | nullno——
kook.profile.biostring | nullno——

lark ​

plugins/adapters/lark/schema.json

PathTypeRequiredDefaultDescription
lark.webhookPathstringno"/lark/webhook"—
lark.apiBaseUrlstringno——
lark.isFeishubooleannotrue—
lark.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
lark.endpoints[].appIdstringyes—Lark app ID
lark.endpoints[].appSecretstringyes—Lark app secret
lark.endpoints[].encryptKeystringno—Lark encrypt key
lark.endpoints[].verificationTokenstringno—Lark verification token
lark.endpoints[].webhookPathstringno——
lark.endpoints[].apiBaseUrlstringno——
lark.endpoints[].isFeishubooleanno——
lark.endpoints[].commandPrefixstringno——
lark.endpoints[].idstringyes—Lark bot name
lark.endpoints[].modestring: "webhook", "websocket"no"webhook"—
lark.endpoints[].streamProxyobjectno—WSS fault-injection tests: pin only TCP to loopback while preserving TLS identity.
lark.endpoints[].streamProxy.portintegeryes——
lark.endpoints[].streamProxy.serverNamestringyes——
lark.endpoints[].webApiProxyobjectno—Disabled by default. Loopback TLS fault proxy for Feishu outbound APIs only; preserves the official Host, SNI and certificate validation. Independent of streamProxy.
lark.endpoints[].webApiProxy.portintegeryes——
lark.endpoints[].streamingbooleanno—Use native streaming cards for progressive replies.
lark.endpoints[].streamingIntervalMsintegerno—Reply stream update interval in milliseconds.
lark.endpoints[].nicknamestring | nullno—Fallback account nickname
lark.endpoints[].profileobjectno—Fallback account profile
lark.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
lark.endpoints[].profile.ageinteger | nullno——
lark.endpoints[].profile.birthdaystring | nullno——
lark.endpoints[].profile.signaturestring | nullno——
lark.endpoints[].profile.avatarstring | nullno——
lark.endpoints[].profile.interestsarray | nullno——
lark.endpoints[].profile.biostring | nullno——
lark.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
lark.modestring: "webhook", "websocket"no"webhook"—
lark.webApiProxyobjectno—Disabled by default. Loopback TLS fault proxy for Feishu outbound APIs only; preserves the official Host, SNI and certificate validation. Independent of streamProxy.
lark.webApiProxy.portintegeryes——
lark.streamingbooleannotrueUse native streaming cards for progressive replies.
lark.streamingIntervalMsintegerno1000Reply stream update interval in milliseconds.
lark.nicknamestring | nullno—Fallback account nickname
lark.profileobjectno—Fallback account profile
lark.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
lark.profile.ageinteger | nullno——
lark.profile.birthdaystring | nullno——
lark.profile.signaturestring | nullno——
lark.profile.avatarstring | nullno——
lark.profile.interestsarray | nullno——
lark.profile.biostring | nullno——

line ​

plugins/adapters/line/schema.json

PathTypeRequiredDefaultDescription
line.webhookPathstringno"/line/webhook"—
line.apiBaseUrlstringno"https://api.line.me"—
line.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
line.endpoints[].channelSecretstringyes—LINE channel secret
line.endpoints[].channelAccessTokenstringyes—LINE channel access token
line.endpoints[].webhookPathstringno——
line.endpoints[].apiBaseUrlstringno——
line.endpoints[].commandPrefixstringno——
line.endpoints[].idstringyes—LINE bot name
line.endpoints[].nicknamestring | nullno—Fallback account nickname
line.endpoints[].profileobjectno—Fallback account profile
line.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
line.endpoints[].profile.ageinteger | nullno——
line.endpoints[].profile.birthdaystring | nullno——
line.endpoints[].profile.signaturestring | nullno——
line.endpoints[].profile.avatarstring | nullno——
line.endpoints[].profile.interestsarray | nullno——
line.endpoints[].profile.biostring | nullno——
line.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
line.nicknamestring | nullno—Fallback account nickname
line.profileobjectno—Fallback account profile
line.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
line.profile.ageinteger | nullno——
line.profile.birthdaystring | nullno——
line.profile.signaturestring | nullno——
line.profile.avatarstring | nullno——
line.profile.interestsarray | nullno——
line.profile.biostring | nullno——

milky ​

plugins/adapters/milky/schema.json

PathTypeRequiredDefaultDescription
milky.connectionstring: "ws", "sse", "webhook", "wss"no"ws"ws (default), sse (EventSource client), webhook or wss (webhook/wss via httpHostToken)
milky.reconnect_intervalnumberno5000—
milky.heartbeat_intervalnumberno30000—
milky.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
milky.endpoints[].connectionstring: "ws", "sse", "webhook", "wss"no——
milky.endpoints[].baseUrlstringyes—Milky HTTP API base URL (required); WS event path is derived as ws(s)😕/host/event
milky.endpoints[].pathstringno—Path for webhook / reverse-wss
milky.endpoints[].access_tokenstringno—Milky access token
milky.endpoints[].reconnect_intervalnumberno——
milky.endpoints[].heartbeat_intervalnumberno——
milky.endpoints[].commandPrefixstringno——
milky.endpoints[].idstringyes—Milky bot name
milky.endpoints[].nicknamestring | nullno—Fallback account nickname
milky.endpoints[].profileobjectno—Fallback account profile
milky.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
milky.endpoints[].profile.ageinteger | nullno——
milky.endpoints[].profile.birthdaystring | nullno——
milky.endpoints[].profile.signaturestring | nullno——
milky.endpoints[].profile.avatarstring | nullno——
milky.endpoints[].profile.interestsarray | nullno——
milky.endpoints[].profile.biostring | nullno——
milky.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
milky.nicknamestring | nullno—Fallback account nickname
milky.profileobjectno—Fallback account profile
milky.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
milky.profile.ageinteger | nullno——
milky.profile.birthdaystring | nullno——
milky.profile.signaturestring | nullno——
milky.profile.avatarstring | nullno——
milky.profile.interestsarray | nullno——
milky.profile.biostring | nullno——

napcat ​

plugins/adapters/napcat/schema.json

PathTypeRequiredDefaultDescription
napcat.connectionstring: "ws", "wss", "http"no"ws"ws (default), wss (reverse WS), or http (POST webhook + HTTP API outbound)
napcat.reconnect_intervalnumberno5000—
napcat.heartbeat_intervalnumberno30000—
napcat.poll_intervalnumberno30000—
napcat.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
napcat.endpoints[].connectionstring: "ws", "wss", "http"no——
napcat.endpoints[].urlstringno—NapCat WebSocket URL (required for connection: ws)
napcat.endpoints[].pathstringno—WS path for reverse-wss
napcat.endpoints[].http_urlstringno—HTTP API base URL (connection: http outbound)
napcat.endpoints[].post_pathstringno—HTTP POST event path (connection: http inbound)
napcat.endpoints[].access_tokenstringno—NapCat access token
napcat.endpoints[].reconnect_intervalnumberno——
napcat.endpoints[].heartbeat_intervalnumberno——
napcat.endpoints[].poll_intervalnumberno——
napcat.endpoints[].commandPrefixstringno——
napcat.endpoints[].idstringyes—NapCat bot name
napcat.endpoints[].nicknamestring | nullno—Fallback account nickname
napcat.endpoints[].profileobjectno—Fallback account profile
napcat.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
napcat.endpoints[].profile.ageinteger | nullno——
napcat.endpoints[].profile.birthdaystring | nullno——
napcat.endpoints[].profile.signaturestring | nullno——
napcat.endpoints[].profile.avatarstring | nullno——
napcat.endpoints[].profile.interestsarray | nullno——
napcat.endpoints[].profile.biostring | nullno——
napcat.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
napcat.nicknamestring | nullno—Fallback account nickname
napcat.profileobjectno—Fallback account profile
napcat.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
napcat.profile.ageinteger | nullno——
napcat.profile.birthdaystring | nullno——
napcat.profile.signaturestring | nullno——
napcat.profile.avatarstring | nullno——
napcat.profile.interestsarray | nullno——
napcat.profile.biostring | nullno——

onebot11 ​

plugins/adapters/onebot11/schema.json

PathTypeRequiredDefaultDescription
onebot11.connectionstring: "ws", "wss"no"ws"connection: ws (forward WS client, default) or wss (reverse WS via httpHostToken)
onebot11.reconnect_intervalnumberno5000—
onebot11.heartbeat_intervalnumberno30000—
onebot11.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
onebot11.endpoints[].connectionstring: "ws", "wss"no——
onebot11.endpoints[].urlstringno—OneBot implementation WebSocket URL (required for connection: ws)
onebot11.endpoints[].pathstringno—WS path for reverse-wss (connection: wss)
onebot11.endpoints[].access_tokenstringno—OneBot access token
onebot11.endpoints[].reconnect_intervalnumberno——
onebot11.endpoints[].heartbeat_intervalnumberno——
onebot11.endpoints[].commandPrefixstringno——
onebot11.endpoints[].idstringyes—OneBot11 bot name
onebot11.endpoints[].nicknamestring | nullno—Fallback account nickname
onebot11.endpoints[].profileobjectno—Fallback account profile
onebot11.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
onebot11.endpoints[].profile.ageinteger | nullno——
onebot11.endpoints[].profile.birthdaystring | nullno——
onebot11.endpoints[].profile.signaturestring | nullno——
onebot11.endpoints[].profile.avatarstring | nullno——
onebot11.endpoints[].profile.interestsarray | nullno——
onebot11.endpoints[].profile.biostring | nullno——
onebot11.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
onebot11.nicknamestring | nullno—Fallback account nickname
onebot11.profileobjectno—Fallback account profile
onebot11.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
onebot11.profile.ageinteger | nullno——
onebot11.profile.birthdaystring | nullno——
onebot11.profile.signaturestring | nullno——
onebot11.profile.avatarstring | nullno——
onebot11.profile.interestsarray | nullno——
onebot11.profile.biostring | nullno——

onebot12 ​

plugins/adapters/onebot12/schema.json

PathTypeRequiredDefaultDescription
onebot12.connectionstring: "ws", "webhook", "wss"no"ws"ws (default), webhook (httpHostToken POST), or wss (reverse WS via httpHostToken)
onebot12.reconnect_intervalnumberno5000—
onebot12.heartbeat_intervalnumberno30000—
onebot12.endpointsarray<object>yes—Each endpoint explicitly selects platform and userId. id is the local account name; other connection fields override instance defaults.
onebot12.endpoints[].connectionstring: "ws", "webhook", "wss"no——
onebot12.endpoints[].urlstringno—OneBot implementation WebSocket URL (required for connection: ws)
onebot12.endpoints[].pathstringno—HTTP/WS path for webhook or reverse-wss
onebot12.endpoints[].api_urlstringno—HTTP action endpoint for webhook outbound (required for connection: webhook send)
onebot12.endpoints[].access_tokenstringno—OneBot access token
onebot12.endpoints[].reconnect_intervalnumberno——
onebot12.endpoints[].heartbeat_intervalnumberno——
onebot12.endpoints[].commandPrefixstringno——
onebot12.endpoints[].idstringyes—OneBot12 bot name
onebot12.endpoints[].platformstringyes—Selected OneBot12 bot platform
onebot12.endpoints[].userIdstringyes—Selected OneBot12 bot user ID
onebot12.endpoints[].nicknamestring | nullno—Fallback account nickname
onebot12.endpoints[].profileobjectno—Fallback account profile
onebot12.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
onebot12.endpoints[].profile.ageinteger | nullno——
onebot12.endpoints[].profile.birthdaystring | nullno——
onebot12.endpoints[].profile.signaturestring | nullno——
onebot12.endpoints[].profile.avatarstring | nullno——
onebot12.endpoints[].profile.interestsarray | nullno——
onebot12.endpoints[].profile.biostring | nullno——
onebot12.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
onebot12.nicknamestring | nullno—Fallback account nickname
onebot12.profileobjectno—Fallback account profile
onebot12.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
onebot12.profile.ageinteger | nullno——
onebot12.profile.birthdaystring | nullno——
onebot12.profile.signaturestring | nullno——
onebot12.profile.avatarstring | nullno——
onebot12.profile.interestsarray | nullno——
onebot12.profile.biostring | nullno——

qq ​

plugins/adapters/qq/schema.json

PathTypeRequiredDefaultDescription
qq.modestring: "websocket", "webhook", "middleware"no"websocket"WebSocket gateway (default). webhook/middleware use httpHostToken POST.
qq.sandboxbooleannofalse—
qq.botKindstring: "public", "private"no"public"Public/private bot type. Both include GROUP_AND_C2C_EVENT; channel messages use PUBLIC_GUILD_MESSAGES or GUILD_MESSAGES respectively. Used to derive intents when they are not explicitly configured.
qq.intentsarray<string>no—WebSocket Identify intents. When omitted, derived from botKind; public includes PUBLIC_GUILD_MESSAGES.
qq.accessTokenUrlstringno——
qq.gatewayUrlstringno——
qq.webhookPathstringno"/qq/webhook"POST path on httpHostToken for webhook/middleware modes.
qq.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id, appid and secret are required; other fields override instance defaults.
qq.endpoints[].appidstringyes—QQ official bot app ID
qq.endpoints[].secretstringyes—QQ official bot secret
qq.endpoints[].modestring: "websocket", "webhook", "middleware"no——
qq.endpoints[].sandboxbooleanno——
qq.endpoints[].botKindstring: "public", "private"no—Override top-level botKind (public/private) when deriving this endpoint's intents.
qq.endpoints[].intentsarray<string>no—Override top-level intents.
qq.endpoints[].accessTokenUrlstringno——
qq.endpoints[].gatewayUrlstringno——
qq.endpoints[].webhookPathstringno——
qq.endpoints[].commandPrefixstringno——
qq.endpoints[].idstringyes—QQ bot name
qq.endpoints[].streamProxyobjectno—Optional fixed loopback TCP fault proxy for WSS only; original gateway TLS identity must match serverName.
qq.endpoints[].streamProxy.portintegeryes——
qq.endpoints[].streamProxy.serverNamestringyes——
qq.endpoints[].notifyobjectno—Send outage/login notices to the master through another adapter instance (adapter/endpoint/kind/id identify the actual conversation).
qq.endpoints[].notify.adapterstringyes—Adapter type used for the notice, such as qq or icqq.
qq.endpoints[].notify.endpointstringyes—Endpoint id of that adapter.
qq.endpoints[].notify.kindstring: "private", "group", "channel"no"private"Conversation kind; defaults to private.
qq.endpoints[].notify.idstring | numberyes—Master conversation id on that platform (openid for QQ official, QQ number for ICQQ).
qq.endpoints[].notify.parentobjectno—可选的父频道/群容器
qq.endpoints[].notify.parent.kindstring: "private", "group", "channel"yes——
qq.endpoints[].notify.parent.idstring | numberyes——
qq.endpoints[].streamingbooleanno—Publish supported replies while generating. Set false to send only complete replies.
qq.endpoints[].streamingIntervalMsnumberno—Minimum delay in milliseconds between reply updates; the first update is immediate.
qq.endpoints[].nicknamestring | nullno—Fallback account nickname
qq.endpoints[].profileobjectno—Fallback account profile
qq.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
qq.endpoints[].profile.ageinteger | nullno——
qq.endpoints[].profile.birthdaystring | nullno——
qq.endpoints[].profile.signaturestring | nullno——
qq.endpoints[].profile.avatarstring | nullno——
qq.endpoints[].profile.interestsarray | nullno——
qq.endpoints[].profile.biostring | nullno——
qq.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
qq.streamProxyobjectno—Optional fixed loopback TCP fault proxy for WSS only; original gateway TLS identity must match serverName.
qq.streamProxy.portintegeryes——
qq.streamProxy.serverNamestringyes——
qq.notifyobjectno—Send outage/login notices to the master through another adapter instance (adapter/endpoint/kind/id identify the actual conversation).
qq.notify.adapterstringyes—Adapter type used for the notice, such as qq or icqq.
qq.notify.endpointstringyes—Endpoint id of that adapter.
qq.notify.kindstring: "private", "group", "channel"no"private"Conversation kind; defaults to private.
qq.notify.idstring | numberyes—Master conversation id on that platform (openid for QQ official, QQ number for ICQQ).
qq.notify.parentobjectno—可选的父频道/群容器
qq.notify.parent.kindstring: "private", "group", "channel"yes——
qq.notify.parent.idstring | numberyes——
qq.streamingbooleannotruePublish supported replies while generating. Set false to send only complete replies.
qq.streamingIntervalMsnumberno500Minimum delay in milliseconds between reply updates; the first update is immediate.
qq.nicknamestring | nullno—Fallback account nickname
qq.profileobjectno—Fallback account profile
qq.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
qq.profile.ageinteger | nullno——
qq.profile.birthdaystring | nullno——
qq.profile.signaturestring | nullno——
qq.profile.avatarstring | nullno——
qq.profile.interestsarray | nullno——
qq.profile.biostring | nullno——

sandbox ​

plugins/adapters/sandbox/schema.json

PathTypeRequiredDefaultDescription
sandbox.streamingbooleannotruePublish supported replies while generating. Set false to send only complete replies.
sandbox.streamingIntervalMsnumberno500Minimum delay in milliseconds between reply updates; the first update is immediate.
sandbox.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
sandbox.endpoints[].ownerstringno—Sandbox owner user ID
sandbox.endpoints[].streamingbooleanno—Publish supported replies while generating. Set false to send only complete replies.
sandbox.endpoints[].streamingIntervalMsnumberno—Minimum delay in milliseconds between reply updates; the first update is immediate.
sandbox.endpoints[].commandPrefixstringno——
sandbox.endpoints[].idstringyes—Sandbox bot name
sandbox.endpoints[].nicknamestring | nullno—Fallback account nickname
sandbox.endpoints[].profileobjectno—Fallback account profile
sandbox.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
sandbox.endpoints[].profile.ageinteger | nullno——
sandbox.endpoints[].profile.birthdaystring | nullno——
sandbox.endpoints[].profile.signaturestring | nullno——
sandbox.endpoints[].profile.avatarstring | nullno——
sandbox.endpoints[].profile.interestsarray | nullno——
sandbox.endpoints[].profile.biostring | nullno——
sandbox.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
sandbox.nicknamestring | nullno—Fallback account nickname
sandbox.profileobjectno—Fallback account profile
sandbox.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
sandbox.profile.ageinteger | nullno——
sandbox.profile.birthdaystring | nullno——
sandbox.profile.signaturestring | nullno——
sandbox.profile.avatarstring | nullno——
sandbox.profile.interestsarray | nullno——
sandbox.profile.biostring | nullno——

satori ​

plugins/adapters/satori/schema.json

PathTypeRequiredDefaultDescription
satori.connectionstring: "ws", "webhook"no"ws"ws (default) or webhook (httpHostToken POST route)
satori.heartbeat_intervalnumberno10000WS PING interval in milliseconds
satori.endpointsarray<object>yes—Multiple accounts: each entry selects an explicit platform and userId. id and baseUrl are required; remaining fields override instance defaults.
satori.endpoints[].baseUrlstringyes—Satori SDK HTTP/WS base URL (e.g. http://127.0.0.1:5140)
satori.endpoints[].connectionstring: "ws", "webhook"no——
satori.endpoints[].tokenstringno—Bearer token for API and WS IDENTIFY
satori.endpoints[].pathstringno—Webhook POST path (connection: webhook)
satori.endpoints[].heartbeat_intervalnumberno——
satori.endpoints[].commandPrefixstringno——
satori.endpoints[].idstringyes—Satori bot name
satori.endpoints[].platformstringyes—Selected Satori login platform
satori.endpoints[].userIdstringyes—Selected Satori login user ID
satori.endpoints[].nicknamestring | nullno—Fallback account nickname
satori.endpoints[].profileobjectno—Fallback account profile
satori.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
satori.endpoints[].profile.ageinteger | nullno——
satori.endpoints[].profile.birthdaystring | nullno——
satori.endpoints[].profile.signaturestring | nullno——
satori.endpoints[].profile.avatarstring | nullno——
satori.endpoints[].profile.interestsarray | nullno——
satori.endpoints[].profile.biostring | nullno——
satori.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
satori.nicknamestring | nullno—Fallback account nickname
satori.profileobjectno—Fallback account profile
satori.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
satori.profile.ageinteger | nullno——
satori.profile.birthdaystring | nullno——
satori.profile.signaturestring | nullno——
satori.profile.avatarstring | nullno——
satori.profile.interestsarray | nullno——
satori.profile.biostring | nullno——

slack ​

plugins/adapters/slack/schema.json

PathTypeRequiredDefaultDescription
slack.socketModebooleannotruePrefer Socket Mode (default). Set false for HTTP Events via httpHostToken.
slack.webhookPathstringno"/slack/events"—
slack.clientPingTimeoutnumberno15000Socket Mode client ping timeout (ms)
slack.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
slack.endpoints[].tokenstringyes—Bot User OAuth Token (xoxb-...)
slack.endpoints[].signingSecretstringno—Required for HTTP Events API (socketMode: false)
slack.endpoints[].appTokenstringno—App-Level Token (xapp-...) for Socket Mode
slack.endpoints[].socketModebooleanno——
slack.endpoints[].webhookPathstringno——
slack.endpoints[].clientPingTimeoutnumberno——
slack.endpoints[].commandPrefixstringno——
slack.endpoints[].idstringyes—Slack bot name
slack.endpoints[].streamProxyobjectno—Socket fault-injection tests: pin WSS TCP to loopback while API requests retain direct standard TLS.
slack.endpoints[].streamProxy.portintegeryes——
slack.endpoints[].streamProxy.serverNamestringyes——
slack.endpoints[].webApiProxyobjectno—Fault proxy for outbound JSON Web APIs only: pin slack.com:443 TCP to loopback while preserving SNI and certificate validation. Independent of the Socket proxy; does not apply to upload hosts.
slack.endpoints[].webApiProxy.portintegeryes——
slack.endpoints[].streamingbooleanno—Use native streaming replies when the target supports them.
slack.endpoints[].streamingIntervalMsintegerno—Reply stream update interval in milliseconds.
slack.endpoints[].nicknamestring | nullno—Fallback account nickname
slack.endpoints[].profileobjectno—Fallback account profile
slack.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
slack.endpoints[].profile.ageinteger | nullno——
slack.endpoints[].profile.birthdaystring | nullno——
slack.endpoints[].profile.signaturestring | nullno——
slack.endpoints[].profile.avatarstring | nullno——
slack.endpoints[].profile.interestsarray | nullno——
slack.endpoints[].profile.biostring | nullno——
slack.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
slack.streamingbooleannotrueUse native streaming replies when the target supports them.
slack.streamingIntervalMsintegerno1000Reply stream update interval in milliseconds.
slack.nicknamestring | nullno—Fallback account nickname
slack.profileobjectno—Fallback account profile
slack.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
slack.profile.ageinteger | nullno——
slack.profile.birthdaystring | nullno——
slack.profile.signaturestring | nullno——
slack.profile.avatarstring | nullno——
slack.profile.interestsarray | nullno——
slack.profile.biostring | nullno——

telegram ​

plugins/adapters/telegram/schema.json

PathTypeRequiredDefaultDescription
telegram.pollingbooleannotrueLong-poll getUpdates (default). Set false for webhook via httpHostToken.
telegram.webhookobjectno—Webhook settings when polling is false.
telegram.webhook.domainstringno——
telegram.webhook.pathstringno"/telegram/webhook"—
telegram.webhook.secretTokenstringno—Verified via X-Telegram-Bot-Api-Secret-Token.
telegram.allowedUpdatesarray<string>no["message","callback_query"]—
telegram.apiBaseUrlstringno"https://api.telegram.org"—
telegram.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
telegram.endpoints[].tokenstringyes—Telegram bot token
telegram.endpoints[].pollingbooleanno——
telegram.endpoints[].webhookobjectno——
telegram.endpoints[].webhook.domainstringno——
telegram.endpoints[].webhook.pathstringno——
telegram.endpoints[].webhook.secretTokenstringno——
telegram.endpoints[].allowedUpdatesarray<string>no——
telegram.endpoints[].apiBaseUrlstringno——
telegram.endpoints[].commandPrefixstringno——
telegram.endpoints[].idstringyes—Telegram bot name
telegram.endpoints[].streamingbooleanno—Publish supported replies while generating. Set false to send only complete replies.
telegram.endpoints[].streamingIntervalMsnumberno—Minimum delay in milliseconds between reply updates; the first update is immediate.
telegram.endpoints[].nicknamestring | nullno—Fallback account nickname
telegram.endpoints[].profileobjectno—Fallback account profile
telegram.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
telegram.endpoints[].profile.ageinteger | nullno——
telegram.endpoints[].profile.birthdaystring | nullno——
telegram.endpoints[].profile.signaturestring | nullno——
telegram.endpoints[].profile.avatarstring | nullno——
telegram.endpoints[].profile.interestsarray | nullno——
telegram.endpoints[].profile.biostring | nullno——
telegram.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
telegram.streamingbooleannotruePublish supported replies while generating. Set false to send only complete replies.
telegram.streamingIntervalMsnumberno500Minimum delay in milliseconds between reply updates; the first update is immediate.
telegram.nicknamestring | nullno—Fallback account nickname
telegram.profileobjectno—Fallback account profile
telegram.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
telegram.profile.ageinteger | nullno——
telegram.profile.birthdaystring | nullno——
telegram.profile.signaturestring | nullno——
telegram.profile.avatarstring | nullno——
telegram.profile.interestsarray | nullno——
telegram.profile.biostring | nullno——

wechat-mp ​

plugins/adapters/wechat-mp/schema.json

PathTypeRequiredDefaultDescription
wechat-mp.pathstringno"/wechat/webhook"—
wechat-mp.encryptbooleannofalse—
wechat-mp.encryptModestring: "plain", "compatible", "secure"no—Default follows encrypt: 'plain' when encrypt=false, 'compatible' when encrypt=true
wechat-mp.replyModestring: "passive", "customer_service"no"passive"—
wechat-mp.passiveReplyTimeoutMsnumberno4500—
wechat-mp.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
wechat-mp.endpoints[].appIdstringyes—WeChat MP app ID
wechat-mp.endpoints[].appSecretstringyes—WeChat MP app secret
wechat-mp.endpoints[].tokenstringyes—WeChat MP callback token
wechat-mp.endpoints[].encodingAESKeystringno—WeChat MP encoding AES key
wechat-mp.endpoints[].pathstringno——
wechat-mp.endpoints[].encryptbooleanno——
wechat-mp.endpoints[].encryptModestring: "plain", "compatible", "secure"no——
wechat-mp.endpoints[].replyModestring: "passive", "customer_service"no——
wechat-mp.endpoints[].passiveReplyTimeoutMsnumberno——
wechat-mp.endpoints[].commandPrefixstringno——
wechat-mp.endpoints[].idstringyes—WeChat MP bot name
wechat-mp.endpoints[].nicknamestring | nullno—Fallback account nickname
wechat-mp.endpoints[].profileobjectno—Fallback account profile
wechat-mp.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
wechat-mp.endpoints[].profile.ageinteger | nullno——
wechat-mp.endpoints[].profile.birthdaystring | nullno——
wechat-mp.endpoints[].profile.signaturestring | nullno——
wechat-mp.endpoints[].profile.avatarstring | nullno——
wechat-mp.endpoints[].profile.interestsarray | nullno——
wechat-mp.endpoints[].profile.biostring | nullno——
wechat-mp.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
wechat-mp.nicknamestring | nullno—Fallback account nickname
wechat-mp.profileobjectno—Fallback account profile
wechat-mp.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
wechat-mp.profile.ageinteger | nullno——
wechat-mp.profile.birthdaystring | nullno——
wechat-mp.profile.signaturestring | nullno——
wechat-mp.profile.avatarstring | nullno——
wechat-mp.profile.interestsarray | nullno——
wechat-mp.profile.biostring | nullno——

wecom ​

plugins/adapters/wecom/schema.json

PathTypeRequiredDefaultDescription
wecom.webhookPathstringno"/wecom/callback"—
wecom.apiBaseUrlstringno"https://qyapi.weixin.qq.com"—
wecom.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
wecom.endpoints[].corpIdstringyes—WeCom corp ID
wecom.endpoints[].agentSecretstringyes—WeCom agent secret
wecom.endpoints[].tokenstringyes—WeCom callback token
wecom.endpoints[].encodingAESKeystringyes—WeCom encoding AES key
wecom.endpoints[].webhookPathstringno——
wecom.endpoints[].apiBaseUrlstringno——
wecom.endpoints[].commandPrefixstringno——
wecom.endpoints[].idstringyes—WeCom bot name
wecom.endpoints[].agentIdstringyes—WeCom application AgentId (not the application secret)
wecom.endpoints[].nicknamestring | nullno—Fallback account nickname
wecom.endpoints[].profileobjectno—Fallback account profile
wecom.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
wecom.endpoints[].profile.ageinteger | nullno——
wecom.endpoints[].profile.birthdaystring | nullno——
wecom.endpoints[].profile.signaturestring | nullno——
wecom.endpoints[].profile.avatarstring | nullno——
wecom.endpoints[].profile.interestsarray | nullno——
wecom.endpoints[].profile.biostring | nullno——
wecom.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
wecom.nicknamestring | nullno—Fallback account nickname
wecom.profileobjectno—Fallback account profile
wecom.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
wecom.profile.ageinteger | nullno——
wecom.profile.birthdaystring | nullno——
wecom.profile.signaturestring | nullno——
wecom.profile.avatarstring | nullno——
wecom.profile.interestsarray | nullno——
wecom.profile.biostring | nullno——

plugins/adapters/weixin-ilink/schema.json

PathTypeRequiredDefaultDescription
weixin-ilink.botAgentstringno——
weixin-ilink.baseUrlstringno"https://ilinkai.weixin.qq.com"—
weixin-ilink.cdnBaseUrlstringno"https://novac2c.cdn.weixin.qq.com/c2c"—
weixin-ilink.longPollTimeoutMsnumberno35000—
weixin-ilink.dataDirstringno"data/weixin-ilink"Endpoint state root for credentials, cursors, context tokens, and media
weixin-ilink.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance. Each entry uses the top-level fields; id is required and other fields override defaults.
weixin-ilink.endpoints[].botTokenstringno—iLink bot token; omit to load endpoint state or start QR login
weixin-ilink.endpoints[].idstringyes—Weixin iLink bot name
weixin-ilink.endpoints[].botAgentstringno——
weixin-ilink.endpoints[].baseUrlstringno——
weixin-ilink.endpoints[].cdnBaseUrlstringno——
weixin-ilink.endpoints[].longPollTimeoutMsnumberno——
weixin-ilink.endpoints[].dataDirstringno—Endpoint state root
weixin-ilink.endpoints[].commandPrefixstringno—Command prefix for this endpoint.
weixin-ilink.endpoints[].nicknamestring | nullno—Fallback account nickname
weixin-ilink.endpoints[].profileobjectno—Fallback account profile
weixin-ilink.endpoints[].profile.genderstring | null: "male", "female", "other", "unknown", nullno——
weixin-ilink.endpoints[].profile.ageinteger | nullno——
weixin-ilink.endpoints[].profile.birthdaystring | nullno——
weixin-ilink.endpoints[].profile.signaturestring | nullno——
weixin-ilink.endpoints[].profile.avatarstring | nullno——
weixin-ilink.endpoints[].profile.interestsarray | nullno——
weixin-ilink.endpoints[].profile.biostring | nullno——
weixin-ilink.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.
weixin-ilink.nicknamestring | nullno—Fallback account nickname
weixin-ilink.profileobjectno—Fallback account profile
weixin-ilink.profile.genderstring | null: "male", "female", "other", "unknown", nullno——
weixin-ilink.profile.ageinteger | nullno——
weixin-ilink.profile.birthdaystring | nullno——
weixin-ilink.profile.signaturestring | nullno——
weixin-ilink.profile.avatarstring | nullno——
weixin-ilink.profile.interestsarray | nullno——
weixin-ilink.profile.biostring | nullno——

process-monitor ​

plugins/features/process-monitor/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
process-monitor.enabledbooleannotrueEnable process monitoring.
process-monitor.notifyOnStartbooleannotrueNotify on first startup.
process-monitor.notifyOnRestartbooleannotrueNotify on normal restart.
process-monitor.notifyOnCrashbooleannotrueNotify after a crash restart.
process-monitor.notifyChannelsarray<object>no[]Notification channel (slice 1 supports webhook only).
process-monitor.notifyChannels[].typestring: "webhook"yes—Only webhook is supported for now.
process-monitor.notifyChannels[].targetstringyes—Webhook URL.

blackjack ​

plugins/games/blackjack/schema.json

This Schema declares no fields.

dice-duel ​

plugins/games/dice-duel/schema.json

This Schema declares no fields.

dungeon-expedition ​

plugins/games/dungeon-expedition/schema.json

This Schema declares no fields.

guess-number ​

plugins/games/guess-number/schema.json

This Schema declares no fields.

hub ​

plugins/games/hub/schema.json

This Schema declares no fields.

idiom-chain ​

plugins/games/idiom-chain/schema.json

This Schema declares no fields.

roulette ​

plugins/games/roulette/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
roulette.chambersintegerno6Number of chambers; one of them holds the live round.
roulette.maxPlayersintegerno6Maximum players in one game.
roulette.turnTimeoutSecondsintegerno60A player who does not pull the trigger within this many seconds loses.
roulette.lobbyTimeoutSecondsintegerno300A lobby that has not started after this many seconds is dissolved.
roulette.muteSecondsintegerno60Seconds the loser is muted in groups that turned on the mute penalty (off in every group by default).

rps ​

plugins/games/rps/schema.json

This Schema declares no fields.

text-adventure ​

plugins/games/text-adventure/schema.json

This Schema declares no fields.

tic-tac-toe ​

plugins/games/tic-tac-toe/schema.json

This Schema declares no fields.

word-riddle ​

plugins/games/word-riddle/schema.json

This Schema declares no fields.

activity-feedback ​

plugins/services/activity-feedback/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
activity-feedback.enabledbooleannotrueEnable activity feedback for this plugin instance.
activity-feedback.defaultsobjectno—Default policy for all platforms and Endpoints.
activity-feedback.defaults.enabledbooleannotrueEnable this policy layer.
activity-feedback.defaults.phasesobjectno—Feedback policy keyed by lifecycle phase.
activity-feedback.defaults.phases.queuedobjectno——
activity-feedback.defaults.phases.queued.privateobjectno——
activity-feedback.defaults.phases.queued.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.queued.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.queued.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.queued.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.queued.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.queued.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.queued.groupobjectno——
activity-feedback.defaults.phases.queued.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.queued.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.queued.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.queued.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.queued.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.queued.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.queued.channelobjectno——
activity-feedback.defaults.phases.queued.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.queued.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.queued.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.queued.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.queued.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.queued.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.activeobjectno——
activity-feedback.defaults.phases.active.privateobjectno——
activity-feedback.defaults.phases.active.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.active.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.active.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.active.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.active.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.active.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.active.groupobjectno——
activity-feedback.defaults.phases.active.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.active.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.active.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.active.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.active.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.active.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.active.channelobjectno——
activity-feedback.defaults.phases.active.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.active.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.active.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.active.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.active.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.active.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.thinkingobjectno——
activity-feedback.defaults.phases.thinking.privateobjectno——
activity-feedback.defaults.phases.thinking.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.thinking.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.thinking.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.thinking.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.thinking.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.thinking.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.thinking.groupobjectno——
activity-feedback.defaults.phases.thinking.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.thinking.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.thinking.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.thinking.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.thinking.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.thinking.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.thinking.channelobjectno——
activity-feedback.defaults.phases.thinking.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.thinking.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.thinking.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.thinking.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.thinking.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.thinking.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_startobjectno——
activity-feedback.defaults.phases.schedule_start.privateobjectno——
activity-feedback.defaults.phases.schedule_start.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_start.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_start.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_start.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_start.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_start.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_start.groupobjectno——
activity-feedback.defaults.phases.schedule_start.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_start.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_start.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_start.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_start.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_start.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_start.channelobjectno——
activity-feedback.defaults.phases.schedule_start.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_start.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_start.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_start.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_start.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_start.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_finishobjectno——
activity-feedback.defaults.phases.schedule_finish.privateobjectno——
activity-feedback.defaults.phases.schedule_finish.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_finish.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_finish.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_finish.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_finish.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_finish.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_finish.groupobjectno——
activity-feedback.defaults.phases.schedule_finish.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_finish.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_finish.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_finish.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_finish.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_finish.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_finish.channelobjectno——
activity-feedback.defaults.phases.schedule_finish.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_finish.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_finish.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_finish.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_finish.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_finish.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_errorobjectno——
activity-feedback.defaults.phases.schedule_error.privateobjectno——
activity-feedback.defaults.phases.schedule_error.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_error.private.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_error.private.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_error.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_error.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_error.private.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_error.groupobjectno——
activity-feedback.defaults.phases.schedule_error.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_error.group.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_error.group.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_error.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_error.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_error.group.platformConfigobjectno—Platform-specific options.
activity-feedback.defaults.phases.schedule_error.channelobjectno——
activity-feedback.defaults.phases.schedule_error.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.defaults.phases.schedule_error.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.defaults.phases.schedule_error.channel.messagestringno—Status text for type=message.
activity-feedback.defaults.phases.schedule_error.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.defaults.phases.schedule_error.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.defaults.phases.schedule_error.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platformsobjectno—Platform overrides keyed by platform name; values use the same shape as defaults.
activity-feedback.platforms.<platform>.enabledbooleannotrueEnable this policy layer.
activity-feedback.platforms.<platform>.phasesobjectno—Feedback policy keyed by lifecycle phase.
activity-feedback.platforms.<platform>.phases.queuedobjectno——
activity-feedback.platforms.<platform>.phases.queued.privateobjectno——
activity-feedback.platforms.<platform>.phases.queued.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.queued.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.queued.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.queued.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.queued.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.queued.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.queued.groupobjectno——
activity-feedback.platforms.<platform>.phases.queued.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.queued.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.queued.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.queued.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.queued.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.queued.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.queued.channelobjectno——
activity-feedback.platforms.<platform>.phases.queued.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.queued.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.queued.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.queued.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.queued.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.queued.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.activeobjectno——
activity-feedback.platforms.<platform>.phases.active.privateobjectno——
activity-feedback.platforms.<platform>.phases.active.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.active.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.active.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.active.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.active.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.active.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.active.groupobjectno——
activity-feedback.platforms.<platform>.phases.active.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.active.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.active.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.active.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.active.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.active.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.active.channelobjectno——
activity-feedback.platforms.<platform>.phases.active.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.active.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.active.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.active.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.active.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.active.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.thinkingobjectno——
activity-feedback.platforms.<platform>.phases.thinking.privateobjectno——
activity-feedback.platforms.<platform>.phases.thinking.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.thinking.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.thinking.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.thinking.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.thinking.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.thinking.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.thinking.groupobjectno——
activity-feedback.platforms.<platform>.phases.thinking.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.thinking.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.thinking.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.thinking.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.thinking.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.thinking.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.thinking.channelobjectno——
activity-feedback.platforms.<platform>.phases.thinking.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.thinking.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.thinking.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.thinking.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.thinking.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.thinking.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_startobjectno——
activity-feedback.platforms.<platform>.phases.schedule_start.privateobjectno——
activity-feedback.platforms.<platform>.phases.schedule_start.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_start.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_start.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_start.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_start.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_start.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_start.groupobjectno——
activity-feedback.platforms.<platform>.phases.schedule_start.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_start.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_start.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_start.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_start.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_start.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_start.channelobjectno——
activity-feedback.platforms.<platform>.phases.schedule_start.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_start.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_start.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_start.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_start.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_start.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_finishobjectno——
activity-feedback.platforms.<platform>.phases.schedule_finish.privateobjectno——
activity-feedback.platforms.<platform>.phases.schedule_finish.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_finish.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_finish.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_finish.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_finish.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_finish.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_finish.groupobjectno——
activity-feedback.platforms.<platform>.phases.schedule_finish.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_finish.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_finish.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_finish.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_finish.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_finish.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_finish.channelobjectno——
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_finish.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_errorobjectno——
activity-feedback.platforms.<platform>.phases.schedule_error.privateobjectno——
activity-feedback.platforms.<platform>.phases.schedule_error.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_error.private.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_error.private.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_error.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_error.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_error.private.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_error.groupobjectno——
activity-feedback.platforms.<platform>.phases.schedule_error.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_error.group.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_error.group.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_error.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_error.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_error.group.platformConfigobjectno—Platform-specific options.
activity-feedback.platforms.<platform>.phases.schedule_error.channelobjectno——
activity-feedback.platforms.<platform>.phases.schedule_error.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.platforms.<platform>.phases.schedule_error.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.platforms.<platform>.phases.schedule_error.channel.messagestringno—Status text for type=message.
activity-feedback.platforms.<platform>.phases.schedule_error.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.platforms.<platform>.phases.schedule_error.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.platforms.<platform>.phases.schedule_error.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpointsobjectno—Endpoint overrides keyed by platform:endpointKey; values use the same shape as defaults.
activity-feedback.endpoints.<platform:endpointKey>.enabledbooleannotrueEnable this policy layer.
activity-feedback.endpoints.<platform:endpointKey>.phasesobjectno—Feedback policy keyed by lifecycle phase.
activity-feedback.endpoints.<platform:endpointKey>.phases.queuedobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.queued.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.activeobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.active.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.active.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinkingobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.thinking.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_startobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_start.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finishobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_finish.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_errorobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.privateobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.private.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.groupobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.group.platformConfigobjectno—Platform-specific options.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channelobjectno——
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.messagestringno—Status text for type=message.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.endpoints.<platform:endpointKey>.phases.schedule_error.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.scheduleobjectno—Schedule-only start, finish, and error feedback.
activity-feedback.schedule.phasesobjectno——
activity-feedback.schedule.phases.startobjectno——
activity-feedback.schedule.phases.start.privateobjectno——
activity-feedback.schedule.phases.start.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.start.private.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.start.private.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.start.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.start.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.start.private.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.start.groupobjectno——
activity-feedback.schedule.phases.start.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.start.group.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.start.group.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.start.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.start.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.start.group.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.start.channelobjectno——
activity-feedback.schedule.phases.start.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.start.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.start.channel.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.start.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.start.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.start.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.finishobjectno——
activity-feedback.schedule.phases.finish.privateobjectno——
activity-feedback.schedule.phases.finish.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.finish.private.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.finish.private.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.finish.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.finish.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.finish.private.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.finish.groupobjectno——
activity-feedback.schedule.phases.finish.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.finish.group.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.finish.group.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.finish.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.finish.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.finish.group.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.finish.channelobjectno——
activity-feedback.schedule.phases.finish.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.finish.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.finish.channel.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.finish.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.finish.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.finish.channel.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.errorobjectno——
activity-feedback.schedule.phases.error.privateobjectno——
activity-feedback.schedule.phases.error.private.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.error.private.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.error.private.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.error.private.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.error.private.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.error.private.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.error.groupobjectno——
activity-feedback.schedule.phases.error.group.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.error.group.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.error.group.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.error.group.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.error.group.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.error.group.platformConfigobjectno—Platform-specific options.
activity-feedback.schedule.phases.error.channelobjectno——
activity-feedback.schedule.phases.error.channel.typestring: "reaction", "message", "typing", "none"no—How the phase is presented.
activity-feedback.schedule.phases.error.channel.emojistringno—Reaction value for type=reaction.
activity-feedback.schedule.phases.error.channel.messagestringno—Status text for type=message.
activity-feedback.schedule.phases.error.channel.autoRemovebooleannotrueRemove the feedback after the phase stops.
activity-feedback.schedule.phases.error.channel.removeDelaynumberno—Delay before removal in milliseconds; negative values are normalized to zero at runtime.
activity-feedback.schedule.phases.error.channel.platformConfigobjectno—Platform-specific options.

typesafe ​

plugins/services/typesafe/schema.json

This Schema declares no fields.

60s ​

plugins/utils/60s/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
60s.apiBasestringno"https://60s.viki.moe"Base URL of the 60s API service.

answers ​

plugins/utils/answers/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; every field can be overridden per adapter / account; conversation fields: dailyStable, quizTimeoutSeconds, enableDrivingQuiz; in-chat self-service: quizTimeoutSeconds, enableDrivingQuiz

PathTypeRequiredDefaultDescription
answers.dailyStablebooleannofalseReturn the same Book of Answers response when the same user asks the same question on the same day.
answers.timezonestringno"Asia/Shanghai"IANA timezone used by dailyStable to determine the day.
answers.quizTimeoutSecondsnumberno120Seconds to wait for a quiz answer; the question expires afterward.
answers.enableDrivingQuizbooleannotrueEnable the original driving-theory quiz, for entertainment and reference only.

bilibili ​

plugins/utils/bilibili/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
bilibili.pollCronstringno"0 * * * * *"Poll schedule (6-field cron, every 60 seconds by default).
bilibili.jitterMsnumberno15000Maximum random delay before each poll, in milliseconds.
bilibili.requestGapMsnumberno1500Gap between dynamic requests within one poll, in milliseconds.
bilibili.maxBackoffMinutesnumberno30Upper bound of exponential backoff after API failures or rate limiting, in minutes.
bilibili.maxPerChannelnumberno20Maximum UP subscriptions per conversation.
bilibili.timeoutnumberno10000HTTP request timeout in milliseconds.
bilibili.livebooleannotruePoll live-stream status.
bilibili.dynamicbooleannotruePoll UP activity.
bilibili.cookiestringno""Optional Bilibili cookie for stricter rate limits. Reference ${BILIBILI_COOKIE}; do not put credentials directly in configuration.

calendar ​

plugins/utils/calendar/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
calendar.provider"none" | "caldav" | "google" | "microsoft"no"none"Calendar backend. Tools report that the calendar is disabled when set to none.
calendar.timezonestringno"Asia/Manila"IANA timezone for interpreting times without offsets and for display.
calendar.work_day_startstringno"09:00"Daily start time used for free-time lookups (HH:MM).
calendar.work_day_endstringno"18:00"Daily end time used for free-time lookups (HH:MM).
calendar.oauth_redirect_base_urlstringno""External base URL for the chat authorization callback (such as https://bot.example.com). Uses the local address of the zhin HTTP Host when empty.
calendar.oauth_callback_pathstringno"/calendar/oauth/callback"Authorization callback route on the zhin HTTP Host. Adjust it when a reverse proxy or tunnel forwards only some paths.
calendar.caldavobjectno——
calendar.caldav.enabledbooleannofalse—
calendar.caldav.calendar_urlstringno""Calendar collection URL.
calendar.caldav.usernamestringno""—
calendar.caldav.passwordstringno""Prefer an environment-variable reference.
calendar.googleobjectno——
calendar.google.enabledbooleannofalse—
calendar.google.client_idstringno""$
calendar.google.client_secretstringno""$
calendar.google.refresh_tokenstringno""${GOOGLE_CALENDAR_REFRESH_TOKEN}; obtain using the calendar authorization flow.
calendar.google.calendar_idstringno"primary"Calendar ID, primary by default; can be set to another calendar ID.
calendar.google.token_filestringno""Optional JSON path that persists the rotated refresh_token (such as data/calendar-google-token.json).
calendar.microsoftobjectno——
calendar.microsoft.enabledbooleannofalse—
calendar.microsoft.client_idstringno""$
calendar.microsoft.client_secretstringno""Optional for public clients. $
calendar.microsoft.refresh_tokenstringno""${MS_GRAPH_REFRESH_TOKEN}; obtain using the calendar authorization flow.
calendar.microsoft.tenantstringno"common"Azure tenant, common by default.
calendar.microsoft.calendar_idstringno""Empty, primary or me selects the default calendar; otherwise a Graph calendar ID.
calendar.microsoft.token_filestringno""Optional JSON path that persists the rotated refresh_token (such as data/calendar-ms-token.json).

code-runner ​

plugins/utils/code-runner/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
code-runner.provider"piston" | "glot"no"piston"Backend protocol: piston (a self-hosted Piston /api/v2/execute) or glot (a glot.io-compatible /api/run).
code-runner.endpointstringno""Backend URL. For piston, the full execute URL (e.g. http://127.0.0.1:2000/api/v2/execute); for glot, the run prefix (e.g. https://glot.io/api/run). Empty means not configured. ${CODE_RUNNER_ENDPOINT} is supported.
code-runner.tokenstringno—Optional backend token; prefer ${CODE_RUNNER_TOKEN}. Sent as the raw Authorization header for piston and as "Authorization: Token <token>" for glot.

content-moderation ​

plugins/utils/content-moderation/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
content-moderation.groupModerationarray<object>no[]Exact scope for automatic advertising/abuse moderation. Disabled when unconfigured. Requires AI, atomic persistent state and adapter group-management support.
content-moderation.groupModeration[].adapterstringyes——
content-moderation.groupModeration[].endpointstringyes——
content-moderation.groupModeration[].accountstringyes——
content-moderation.groupModeration[].groupstringyes——
content-moderation.enabledbooleannotrueEnable moderation.
content-moderation.onErrorstring: "open", "closed"no"open"Default policy when a review source fails: open treats it as passed; closed treats it as critical.
content-moderation.maskCharstringno"*"Text masking character.
content-moderation.replyTemplatestringno—Reply text for the reply action. When omitted, use the message language; explicit text is preserved.
content-moderation.inboundobjectno——
content-moderation.inbound.enabledbooleannotrue—
content-moderation.inbound.bypassarray<string>no["owner","platform:admin"]Senders matching any of these permit expressions skip inbound review (ADR 0056 §5 built-in DSL, the same evaluator as commands and tools). Moderation is a platform function: the default exempts the zhin owner and platform group owners / admins (platform:admin); [] reviews everyone.
content-moderation.inbound.whitelistobjectno——
content-moderation.inbound.whitelist.userIdsarray<string>no[]Messages from these users are not reviewed.
content-moderation.inbound.whitelist.conversationIdsarray<string>no[]Messages in these conversations are not reviewed.
content-moderation.outboundobjectno——
content-moderation.outbound.enabledbooleannotrue—
content-moderation.outbound.bypassbooleannofalseSkip outbound review when true.
content-moderation.actionsobjectno—Severity-to-action mapping (string or array); uses the stricter default mapping when omitted.
content-moderation.actions.passstring: "allow", "log", "reply", "redact", "drop", "recall" | array<string: "allow", "log", "reply", "redact", "drop", "recall">no——
content-moderation.actions.lowstring: "allow", "log", "reply", "redact", "drop", "recall" | array<string: "allow", "log", "reply", "redact", "drop", "recall">no——
content-moderation.actions.mediumstring: "allow", "log", "reply", "redact", "drop", "recall" | array<string: "allow", "log", "reply", "redact", "drop", "recall">no——
content-moderation.actions.highstring: "allow", "log", "reply", "redact", "drop", "recall" | array<string: "allow", "log", "reply", "redact", "drop", "recall">no——
content-moderation.actions.criticalstring: "allow", "log", "reply", "redact", "drop", "recall" | array<string: "allow", "log", "reply", "redact", "drop", "recall">no——
content-moderation.sourcesarray<object>no[]Review sources run in order: local word lists or HTTP review services.
content-moderation.sources[].idstringyes——
content-moderation.sources[].typestring: "local", "http"yes—local is a word list; http is an external review service.
content-moderation.sources[].enabledbooleannotrue—
content-moderation.sources[].onErrorstring: "open", "closed"no—Policy when this source fails; uses the global setting when empty.
content-moderation.sources[].includeBuiltinbooleannotrueInclude the built-in graded blocked-word dictionary.
content-moderation.sources[].wordsarray<string | object>no[]Custom words: strings using defaultSeverity, or { word, severity } objects.
content-moderation.sources[].wordFilesarray<string>no[]Dictionary file; line formats: word, severity:word, or word|severity.
content-moderation.sources[].defaultSeveritystring: "low", "medium", "high", "critical"no"high"Default severity for custom words without an explicit severity.
content-moderation.sources[].severitystring: "low", "medium", "high", "critical"no"high"Legacy alias for defaultSeverity.
content-moderation.sources[].urlstringno—URL of the HTTP review service.
content-moderation.sources[].headersobjectno—Extra headers sent to the review service.
content-moderation.sources[].timeoutMsnumberno5000Timeout of one review request.
content-moderation.sources[].forceUploadbooleannofalseDownload images before uploading them instead of passing the URL.

earthquake ​

plugins/utils/earthquake/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
earthquake.sourcesarray<string: "cenc", "usgs">no["cenc","usgs"]Enabled data sources in priority order. The first source supplies location text when merging the same earthquake; other sources cover a failed source.
earthquake.cencUrlsarray<string>no["https://api.wolfx.jp/cenc_eqlist.json","https://ceic.ac.cn/data/data.json"]CENC catalog URLs, tried in order (primary followed by mirrors). HTTPS only, up to 5 URLs.
earthquake.usgsFeedstring: "significant_hour", "significant_day", "4.5_hour", "4.5_day", "2.5_hour", "2.5_day", "1.0_hour", "1.0_day"no"2.5_day"USGS GeoJSON summary feed name (minimum-magnitude_time-range).
earthquake.pollCronstringno"0 */2 * * * *"Subscription polling schedule (6-field cron: second, minute, hour, day, month, weekday).
earthquake.timezonestringno"Asia/Shanghai"IANA timezone used to display earthquake times.
earthquake.requestTimeoutMsnumberno10000HTTP request timeout in milliseconds.
earthquake.maxRetriesnumberno2Retries for network errors, timeouts, HTTP 429 and 5xx, excluding the initial request.
earthquake.retryBaseDelayMsnumberno1000Initial exponential-backoff delay in milliseconds; doubles for each retry with random jitter.
earthquake.retryMaxDelayMsnumberno30000Maximum backoff or Retry-After wait in milliseconds. Longer server waits abandon this round and cool down the source.
earthquake.defaultMinMagnitudenumberno5Minimum magnitude for subscriptions that do not specify one.
earthquake.queryMinMagnitudenumberno3Minimum magnitude for earthquake queries that do not specify one.
earthquake.queryLimitnumberno5Default number of earthquake query results.
earthquake.maxEventAgeMinutesnumberno60Only notify about earthquakes from the last specified number of minutes, avoiding delayed or replayed old events.
earthquake.pushLimitnumberno3Maximum notification messages per conversation in one rate-limit window.
earthquake.pushWindowMinutesnumberno10Notification rate-limit window in minutes.
earthquake.maxEventsPerMessagenumberno5Maximum earthquakes listed in one notification; the remainder is summarized as a count.
earthquake.maxSubscriptionsnumberno100Maximum subscriptions across this instance, at most one per conversation.

group-suite ​

plugins/utils/group-suite/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; global only (other fields can be overridden per adapter / account): keywordReply, teachAllowRegex, welcomeConversations, ephemeralKeywords; conversation fields: welcomeMessage, basePointsMin, basePointsMax, streakBonus, streakCap, rankSize, teachMaxPerGroup, teachCooldownMs, teachPageSize; in-chat self-service: welcomeMessage, rankSize, teachCooldownMs, teachPageSize

PathTypeRequiredDefaultDescription
group-suite.keywordReplybooleannofalseReply automatically to messages that match the keyword list (global only).
group-suite.basePointsMinnumberno10Lower bound of the random base points for one check-in.
group-suite.basePointsMaxnumberno30Upper bound of the random base points for one check-in.
group-suite.streakBonusnumberno5Extra points per consecutive check-in day.
group-suite.streakCapnumberno50Maximum extra points from a check-in streak.
group-suite.rankSizenumberno10Number of members shown on check-in and activity leaderboards.
group-suite.teachMaxPerGroupnumberno200Maximum question-and-answer rules stored per group.
group-suite.teachCooldownMsnumberno3000Minimum interval between two teach commands from the same member.
group-suite.teachAllowRegexbooleannofalseAllow members to teach regular-expression rules. Off by default: patterns run against every inbound message. Only structurally safe patterns are accepted and they are tried on messages of at most 200 characters.
group-suite.teachPageSizenumberno10Rules shown per page by teach-list.
group-suite.welcomeMessagestringno""Group welcome text. Empty disables; {name}/{id} refer to the joined member.
group-suite.welcomeConversationsarray<object>no—Exact welcome conversations. Omitted welcomes all groups; [] welcomes none. Missing parent/thread requires their absence; no wildcards.
group-suite.welcomeConversations[].endpointobjectyes——
group-suite.welcomeConversations[].endpoint.adapterstringyes——
group-suite.welcomeConversations[].endpoint.idstringyes——
group-suite.welcomeConversations[].kindstring: "group"yes——
group-suite.welcomeConversations[].idstringyes——
group-suite.welcomeConversations[].parentobjectno——
group-suite.welcomeConversations[].parent.kindstring: "private", "group", "channel"yes——
group-suite.welcomeConversations[].parent.idstringyes——
group-suite.welcomeConversations[].threadIdstringno——
group-suite.ephemeralKeywordsbooleannofalseExplicit volatile keywords. With false, automatic replies require Database Host at startup and keyword management requires its persistent state service when invoked.

ledger ​

plugins/utils/ledger/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; global only (other fields can be overridden per adapter / account): timezone, reportTime; conversation fields: reportWhenEmpty

PathTypeRequiredDefaultDescription
ledger.timezonestringno"Asia/Shanghai"IANA timezone used to calculate today, this week (starting Monday), this month and daily-report dates.
ledger.reportTimestringno"22:00"Daily ledger report time (HH:MM in timezone); sent only to users who explicitly subscribed to daily reports.
ledger.reportWhenEmptybooleannofalseSend a daily report even when no transactions were recorded that day.

plugins/utils/link-poster/schema.json

This Schema declares no fields.

lottery ​

plugins/utils/lottery/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
lottery.pickCountnumberno5Numbers in each recommended pick.
lottery.scheduleCronstringno"0 0 18 * * *"6-field cron expression for scheduled recommendations.
lottery.historyLimitnumberno500Maximum past draws read for analysis.
lottery.scheduleEnabledbooleannotrueGenerate and push recommendations on the schedule.
lottery.backtestEnabledbooleannotrueBacktest the model on past draws before recommending.
lottery.backtestWindownumberno50Number of recent draws sampled by the backtest.
lottery.backtestRandomTrialsnumberno64Simulations of the random baseline in a backtest.
lottery.backtestMinHistorynumberno30Skip the backtest with fewer past draws than this.
lottery.backtestAdaptivebooleannotrueTune model weights draw by draw during the backtest.
lottery.weightPersistEnabledbooleannotrueSave model weights to the database after simulation or review.
lottery.weightHoldoutFallbackbooleannotrueUse default weights when the recent holdout performs worse than random.
lottery.gamesarray<string>no["kl8","ssq","dlt","fc3d","pl3","pl5"]Enabled lottery games (KL8, SSQ, DLT, FC3D, PL3, PL5).
lottery.pushTargetsarray<object>no[]Conversations that receive scheduled and draw reports.
lottery.pushTargets[].adapterstringyes——
lottery.pushTargets[].endpointKeystringno——
lottery.pushTargets[].channelTypestringno"private"—
lottery.pushTargets[].channelIdstringyes——
lottery.kl8objectno——
lottery.kl8.pickCountnumberno5Numbers in each KL8 group.
lottery.kl8.recommendGroupsnumberno3Number of KL8 groups per recommendation.
lottery.kl8.groupStrategiesarray<string>no["balanced","hot","cold"]Strategy for each group (balanced, hot, cold).

music ​

plugins/utils/music/schema.json

This Schema declares no fields.

nettools ​

plugins/utils/nettools/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
nettools.cooldownSecondsintegerno10Per-user cooldown in seconds, shared by all nettools commands and tools (0 disables)
nettools.requestTimeoutMsintegerno8000Per-attempt timeout for each external HTTP request, in milliseconds
nettools.maxRetriesintegerno2Retries for transient failures (network errors, timeouts, 429, 5xx) with exponential backoff and jitter
nettools.pingMaxNodesintegerno4Number of check-host.net probe nodes used by ping
nettools.pingPollIntervalMsintegerno2000Wait between ping result polls, in milliseconds
nettools.pingMaxPollsintegerno5Maximum number of ping result polls before reporting partial results
nettools.dohProvidersarray<string: "cloudflare", "alidns", "google">no["cloudflare","alidns","google"]DNS-over-HTTPS providers in fallback order
nettools.priceListLimitintegerno8Number of registrars shown in a domain price comparison

qrcode ​

plugins/utils/qrcode/schema.json

This Schema declares no fields.

reminder ​

plugins/utils/reminder/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
reminder.timezonestringno"UTC"IANA timezone for natural reminder times and display. Absolute ISO times still require an explicit offset.
reminder.maxTasksnumberno20Maximum active personal chat reminders per instance, separate from administrator tasks. Lowering the limit does not delete existing tasks.
reminder.adminMaxTasksnumberno20Maximum active administrator reminders (scheduled, paused or unconfirmed) per instance. Separate from chat tasks; the two quotas are additive.
reminder.maxTasksPerSendernumberno10Maximum tasks per sender in the same conversation.
reminder.batchSizenumberno5Maximum tasks delivered in each scan.
reminder.missedGraceSecondsnumberno15Skip recurring runs delayed beyond this many seconds. Missed runs during downtime are not backfilled.

repeater ​

plugins/utils/repeater/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; every field can be overridden per adapter / account; conversation fields: threshold, cooldown; in-chat self-service: threshold

PathTypeRequiredDefaultDescription
repeater.thresholdnumberno3Minimum distinct users needed to trigger repetition.
repeater.cooldownnumberno30000Cooldown for the same group, in milliseconds.
repeater.maxLengthnumberno200Maximum message length.

rss ​

plugins/utils/rss/schema.json

Layered configuration (ADR 0050 / 0055) — Levels: global, adapter, endpoint, conversation; fields: global only; conversation fields: switch only

PathTypeRequiredDefaultDescription
rss.pollCronstringno"0 */5 * * * *"Polling schedule (6-field cron expression).
rss.maxPerGroupnumberno30Maximum feeds per conversation.
rss.maxItemsnumberno5Maximum articles listed in one notification; the rest are counted.
rss.timeoutnumberno15000Timeout for fetching a feed.
rss.allowPrivateNetworkbooleannofalseAllow feeds on loopback/LAN addresses (for example a self-hosted RSSHub). Refused by default because feed URLs come from chat users.

short-url ​

plugins/utils/short-url/schema.json

This Schema declares no fields.