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 basic/cli/src/plugin-runtime/console/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.portnumber | string | nullno—监听端口。
http.tokenstring | nullno—HTTP Host 访问令牌。
http.tokensarray | nullno——
http.corsOriginsarray | nullno——
http.basestring | nullno—API 路径前缀。
http.tlsfalse | null | objectno——
http.listenersarray<object>no——
http.listeners[].enabledboolean | stringno—是否启用此监听器。
http.listeners[].hoststringno—监听地址。
http.listeners[].portnumber | stringno—监听端口。
http.listeners[].tlsfalse | null | objectno——
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 心跳间隔毫秒。
aiobjectno—Providers, Agents, sessions, memory, tools, and execution security.
ai.decisionsobjectno—Optional structured-decision service. Missing tasks are off; use shadow before active.
ai.decisions.providerstringyes—Exact enabled DecisionProvider Plugin owner, such as root/typesafe.
ai.decisions.skillsobjectno——
ai.decisions.skills.modestring: "off", "shadow", "active"yes——
ai.decisions.skills.timeoutMsintegerno——
ai.decisions.skills.minConfidencenumberno——
ai.decisions.skills.topKintegerno——
ai.decisions.skills.maxCandidatesintegerno——
ai.decisions.skills.maxSelectionsintegerno——
ai.decisions.toolsobjectno——
ai.decisions.tools.modestring: "off", "shadow", "active"yes——
ai.decisions.tools.timeoutMsintegerno——
ai.decisions.tools.minConfidencenumberno——
ai.decisions.tools.topKintegerno——
ai.decisions.tools.maxCandidatesintegerno——
ai.decisions.tools.maxSelectionsintegerno——
ai.decisions.memoryobjectno——
ai.decisions.memory.modestring: "off", "shadow", "active"yes——
ai.decisions.memory.timeoutMsintegerno——
ai.decisions.memory.minConfidencenumberno——
ai.decisions.memory.topKintegerno——
ai.decisions.memory.maxCandidatesintegerno——
ai.decisions.memory.maxSelectionsintegerno——
ai.decisions.agentsobjectno——
ai.decisions.agents.modestring: "off", "shadow", "active"yes——
ai.decisions.agents.timeoutMsintegerno——
ai.decisions.agents.minConfidencenumberno——
ai.decisions.agents.topKintegerno——
ai.decisions.agents.maxCandidatesintegerno——
ai.decisions.agents.maxSelectionsintegerno——
ai.decisions.approvalobjectno——
ai.decisions.approval.modestring: "off", "shadow", "active"yes——
ai.decisions.approval.timeoutMsintegerno——
ai.decisions.approval.minConfidencenumberno——
ai.decisions.approval.topKintegerno——
ai.decisions.approval.maxCandidatesintegerno——
ai.decisions.approval.maxSelectionsintegerno——
ai.decisions.ambientobjectno—Unprompted group engagement (ai.trigger.ambient). active: the provider decides whether to speak up and the ambient judge models are the fallback; shadow: logged only.
ai.decisions.ambient.modestring: "off", "shadow", "active"yes——
ai.decisions.ambient.timeoutMsintegerno——
ai.decisions.ambient.minConfidencenumberno——
ai.decisions.ambient.topKintegerno——
ai.decisions.ambient.maxCandidatesintegerno——
ai.decisions.ambient.maxSelectionsintegerno——
ai.workroomobjectno—Process-owned Workroom control-plane policy; Projects remain in the persistent Catalog.
ai.workroom.trustedPackPublishersarray<string>no—Authenticated Console principal ids allowed to publish shared Capability Packs.
ai.workroom.disclosureobjectno—Explicit P12 model processor contracts for Workroom disclosure bootstrap.
ai.workroom.disclosure.tenantIdstringno——
ai.workroom.disclosure.modelProvidersobjectno——
ai.workroom.disclosure.modelProviders.<key>.endpointstringyes——
ai.workroom.disclosure.modelProviders.<key>.ownerstringno——
ai.workroom.disclosure.modelProviders.<key>.trustDomainstringno——
ai.workroom.disclosure.modelProviders.<key>.processingRegionsarray<string>yes——
ai.workroom.disclosure.modelProviders.<key>.maxConfidentialitystring: "public", "project_internal", "confidential", "restricted"yes——
ai.workroom.disclosure.modelProviders.<key>.externalbooleanyes——
ai.workroom.disclosure.modelProviders.<key>.noTrainingbooleanyes——
ai.workroom.disclosure.modelProviders.<key>.loggingModestring: "disabled", "metadata_only", "full"yes——
ai.workroom.disclosure.modelProviders.<key>.maximumRetentionSecondsintegeryes——
ai.workroom.disclosure.modelProviders.<key>.allowsRedisclosurebooleanyes——
ai.workroom.disclosure.modelProviders.<key>.supportsDeletionbooleanyes——
ai.agentobjectno—Agent execution, queueing, tool, and model policies.
ai.agent.inboundQueueobjectno—Inbound turn queue policy.
ai.agent.inboundQueue.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.inboundQueue.ttlMsintegerno180000A queued turn that waited longer than this is dropped with a short notice. 0 disables expiry.
ai.agent.inboundQueue.maxQueuedTurnsintegerno5Turns allowed to wait behind the running turn of one conversation; further messages get a short busy reply.
ai.agent.inboundQueue.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.inboundQueue.merge.enabledbooleannotrueTurn the group merge window on (group chats only). Set false to answer every member one by one as before.
ai.agent.inboundQueue.merge.quietMsintegerno1500The window is answered once no new message joined it for this long.
ai.agent.inboundQueue.merge.maxWaitMsintegerno6000The window is answered at the latest this long after its first message.
ai.agent.inboundQueue.merge.maxSendersintegerno5Senders one merged reply covers; further senders wait for the next window.
ai.agent.inboundQueue.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.toolBudgetobjectno—Progress-aware tool-call budget. maxIterations is a soft budget extended while the turn makes progress; hard caps always apply.
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"Brief natural-language progress updates during long turns: off, private chats only, or all chats (groups opt in).
ai.agent.toolBudget.progressMinIntervalMsintegerno45000Minimum time between progress updates in ms.
ai.agent.toolBudget.progressMaxUpdatesintegerno3Maximum progress updates per turn; 0 disables.
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.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.subagentTurnModestring: "off", "sync"no"off"Sub-agents in IM turns. off: no spawn_task. sync: spawn_task runs a sub-agent inside the current turn with at most the parent's permissions (never wider; no bash unless the parent could run it) and approvals routed to the same conversation.
ai.agent.execApprovalModestring: "ask", "bypass", "auto"no—Approval policy for main Agent commands.
ai.agent.subagentExecApprovalModestring: "ask", "bypass", "auto"no—Approval policy for sub-Agent commands.
ai.agent.workerExecApprovalModestring: "ask", "bypass", "auto"no—Approval policy for worker commands.
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.modelsobjectno—模型级覆盖:支持 "gpt-4o" 或 "openai:gpt-4o"
ai.agent.modelHarness.models.<key>.maxIterationsnumber | stringno——
ai.agent.modelHarness.models.<key>.explorationBudgetnumber | stringno—连续只读探索调用达到该次数时注入提示;0 关闭
ai.agent.modelHarness.models.<key>.explorationGuidanceboolean | stringno—在系统提示中加入"先规划、限定目标文件"的探索纪律
ai.agent.modelHarness.models.<key>.iterationExtensionnumber | stringno—每次有进展时延长的步数(覆盖 toolBudget.extendBy)
ai.agent.modelHarness.models.<key>.maxTotalIterationsnumber | stringno—单段回合的硬步数上限(覆盖 toolBudget.maxTotalIterations)
ai.agent.modelHarness.models.<key>.emptyReplyRetriesnumber | stringno—空回复(无文本且无工具调用)时额外重试次数;默认 0
ai.agent.modelHarness.models.<key>.requestTimeoutMsnumber | stringno—单次模型请求超时(毫秒);0 关闭
ai.agent.modelHarness.providerPatternsobjectno—provider 模式覆盖(支持 * 通配符)
ai.agent.modelHarness.providerPatterns.<key>.maxIterationsnumber | stringno——
ai.agent.modelHarness.providerPatterns.<key>.explorationBudgetnumber | stringno—连续只读探索调用达到该次数时注入提示;0 关闭
ai.agent.modelHarness.providerPatterns.<key>.explorationGuidanceboolean | stringno—在系统提示中加入"先规划、限定目标文件"的探索纪律
ai.agent.modelHarness.providerPatterns.<key>.iterationExtensionnumber | stringno—每次有进展时延长的步数(覆盖 toolBudget.extendBy)
ai.agent.modelHarness.providerPatterns.<key>.maxTotalIterationsnumber | stringno—单段回合的硬步数上限(覆盖 toolBudget.maxTotalIterations)
ai.agent.modelHarness.providerPatterns.<key>.emptyReplyRetriesnumber | stringno—空回复(无文本且无工具调用)时额外重试次数;默认 0
ai.agent.modelHarness.providerPatterns.<key>.requestTimeoutMsnumber | stringno—单次模型请求超时(毫秒);0 关闭
ai.agent.providerResilienceobjectno—Provider 韧性:重试 / 退避 / 超时 / fallback(见 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 skips retry and goes to fallback. Default 30000.
ai.agent.providerResilience.requestTimeoutMsnumber | stringno—Per-attempt timeout in ms (whole streamed completion). Default 180000. 0 disables.
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.providerResilience.fallbackboolean | stringno—Try the next entry of modelCandidates after retries are exhausted. Default true.
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.workerBaseToolsarray<string>no—Deferred Worker 基础工具
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.maxParallelSubagentsnumber | stringno——
ai.agent.subagentAutoContinueboolean | stringno——
ai.agent.subagentDirectImDeliveryboolean | stringno——
ai.agent.maxSubagentIterationsnumber | stringno——
ai.agent.subagentToolsarray<string>no——
ai.agent.subagentTurnWaitMsnumber | 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.deferredAutoContinueboolean | stringno——
ai.agent.deferredAutoContinueMaxDepthnumber | stringno——
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.providersobject | nullno—命名 provider 实例
ai.providers.<key>.sdkstringno——
ai.providers.<key>.apiKeystringno——
ai.providers.<key>.authSchemestringno—Authorization 头方案。不写时用各 SDK 默认(OpenAI 系 Bearer,Anthropic x-api-key,Google x-goog-api-key); 设为 '' 时 Authorization: &lt;key&gt;;设为 'Bearer' / 'Token' 等时 Authorization: &lt;scheme&gt; &lt;key&gt;(结尾空格可有可无)。
ai.providers.<key>.baseUrlstringno——
ai.providers.<key>.defaultModelstringno——
ai.providers.<key>.modelsarray<string>no——
ai.providers.<key>.timeoutnumber | stringno—单次请求超时(ms),覆盖 ai.providerResilience.requestTimeoutMs;模型 harness 的 requestTimeoutMs 优先。0 关闭。
ai.providers.<key>.maxRetriesnumber | stringno—每个模型的重试次数,覆盖 ai.providerResilience.maxRetries。
ai.providers.<key>.firstChunkTimeoutMsnumber | stringno—流式请求首个 chunk 超时(ms,含等待响应头),默认关闭;超时按 timeout 重试 / 切换备用模型。
ai.providers.<key>.chunkTimeoutMsnumber | stringno—流式请求两个 chunk 之间的静默超时(ms),默认关闭。
ai.providers.<key>.headersobjectno——
ai.providers.<key>.contextWindownumber | stringno—上下文窗口大小(token 数),各 Provider 映射到自身参数
ai.providers.<key>.maxOutputTokensnumber | stringno—每次请求的输出 token 上限,默认 8192;Gemini/Claude 的思考 token 也计入
ai.providers.<key>.thinkingLevelstringno—思考深度:off | low | medium | high;不填用 provider 默认;providerOptions 里的思考设置优先
ai.providers.<key>.capabilitiesobjectno—Provider 能力声明
ai.providers.<key>.capabilities.inputarray<string>no—Explicit model input modalities. Absence is text-only (fail closed), except Gemini chat models on sdk: google (see defaultModelInput).
ai.providers.<key>.capabilities.streamingboolean | stringno——
ai.providers.<key>.capabilities.toolCallingboolean | stringno——
ai.providers.<key>.capabilities.thinkingboolean | stringno——
ai.providers.<key>.inputarray<string>no—Explicit model input modalities. Prefer this over inferred provider identity.
ai.providers.<key>.providerOptionsobjectno—Extra AI SDK providerOptions, merged into every request of this provider, keyed by SDK provider id. For Gemini: { google: { safetySettings: [...], thinkingConfig: { thinkingLevel: 'low' } } }. See ai.google.dev safety settings.
ai.providers.<key>.contextCacheobjectno—Gemini context caching (sdk: google): { mode: 'explicit', ttlSeconds }. Default implicit.
ai.providers.<key>.contextCache.modestringno—implicit (default) leaves requests untouched. explicit creates cachedContents.
ai.providers.<key>.contextCache.ttlSecondsnumber | stringno—Lifetime of each created cache. Default 600.
ai.providers.<key>.contextCache.minPrefixCharsnumber | stringno—Prefixes shorter than this (characters of JSON) are not worth a cache. Default 8000 (~2k tokens).
ai.providers.<key>.imageGenerationobjectno—文生图默认(zhipu / cloudflare 等支持 generateImage 的 driver)
ai.providers.<key>.imageGeneration.watermarkEnabledboolean | stringno—智谱 API watermark_enabled;默认 true
ai.providers.<key>.imageGeneration.defaultModelstringno——
ai.providers.<key>.imageGeneration.defaultSizestringno—智谱:如 1024x1024、1280x1280
ai.providers.<key>.imageGeneration.numStepsnumber | stringno—Cloudflare Flux:推理步数,默认 4
ai.providers.<key>.imageGeneration.qualitystringno—OpenAI GPT Image:low | medium | high | auto
ai.providers.<key>.imageGeneration.aspectRatiostringno—Gemini:如 1:1、16:9
ai.providers.<key>.imageGeneration.imageSizestringno—Gemini:如 1K、2K、4K
ai.providers.<key>.imageGeneration.promptSuffixstringno—追加到 agent/用户 prompt 末尾的风格约束(如写实摄影)。 需要动漫风时不要配置,或在工具 prompt 里写明即可。
ai.providers.<key>.hoststringno——
ai.providers.<key>.num_ctxnumber | stringno——
ai.agentsobject | nullno—per-agent 绑定(协作角色如 researcher 亦用 agents.<role>);IM 入站总是交给 zhin
ai.agents.<key>.providerstringno——
ai.agents.<key>.modelstringno——
ai.agents.<key>.mcpServersarray | nullno——
ai.agents.<key>.nicknamestringno—Agent 昵称(LLM 自称 + IM 协作展示,ADR 0024)。
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)
ai.context.summaryThresholdnumber | stringno—触发总结的消息数量阈值(默认 50)
ai.context.keepAfterSummarynumber | stringno—总结后保留的消息数量(默认 10)
ai.context.maxContextTokensnumber | stringno—上下文最大 token 估算(默认 4000)
ai.context.summaryPromptstringno—自定义总结提示词
ai.imageGenerationobject | nullno—文生图全局默认(可被 providers.&lt;alias&gt;.imageGeneration 覆盖)。 智谱:watermarkEnabled: false 需先在智谱开放平台签署去水印免责声明。
ai.imageGeneration.watermarkEnabledboolean | stringno—智谱 API watermark_enabled;默认 true
ai.imageGeneration.defaultModelstringno——
ai.imageGeneration.defaultSizestringno—智谱:如 1024x1024、1280x1280
ai.imageGeneration.numStepsnumber | stringno—Cloudflare Flux:推理步数,默认 4
ai.imageGeneration.qualitystringno—OpenAI GPT Image:low | medium | high | auto
ai.imageGeneration.aspectRatiostringno—Gemini:如 1:1、16:9
ai.imageGeneration.imageSizestringno—Gemini:如 1K、2K、4K
ai.imageGeneration.promptSuffixstringno—追加到 agent/用户 prompt 末尾的风格约束(如写实摄影)。 需要动漫风时不要配置,或在工具 prompt 里写明即可。
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.providerstringno—ai.providers alias of the perception model.
ai.multimodal.perception.modelstringno——
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.multimodal.perception.fallbacksarray<object>no—主识图模型失败、空回答或不支持该媒体时,按顺序尝试;不改变主对话模型。
ai.multimodal.perception.fallbacks[].providerstringyes——
ai.multimodal.perception.fallbacks[].modelstringyes——
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.judgestring | arrayno—判断模型 providerAlias/model;也可以写成列表,前一个失败或限流时按顺序换下一个(免费额度通常按模型分别计算)。默认用主 Agent 的模型。ai.decisions.ambient 为 active 时由决策服务先判断,这里的模型作为兜底
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.
menuKeywordstring | falseno—Built-in command menu keyword. Defaults to 菜单; false or an empty string disables the menu.
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 Workroom callbacks.
a2a.enabledboolean | stringno——
a2a.pathstring | nullno——
a2a.tokenstring | nullno——
a2a.publicUrlstring | nullno——
a2a.workroomCallbacksobject | nullno——
a2a.workroomCallbacks.enabledboolean | stringno——
a2a.workroomCallbacks.pathstringno—Must remain outside the ordinary /a2a/{agent}/* route tree.
a2a.workroomCallbacks.maxBodyBytesnumber | stringno——
a2a.workroomCallbacks.maxSequenceGapnumber | stringno——
a2a.workroomCallbacks.bindingsarray<object>no——
a2a.workroomCallbacks.bindings[].endpointIdstringno——
a2a.workroomCallbacks.bindings[].tenantIdstringno——
a2a.workroomCallbacks.bindings[].cardDigeststringno——
a2a.workroomCallbacks.bindings[].authBindingIdstringno——
a2a.workroomCallbacks.bindings[].trustDomainstringno——
a2a.workroomCallbacks.bindings[].extensionDigeststringno——
a2a.workroomCallbacks.bindings[].credentialIdstringno——
a2a.workroomCallbacks.bindings[].credentialobject | objectno——
a2a.workroomCallbacks.bindings[].enabledboolean | stringno——
a2a.workroomCallbacks.bindings[].expiresAtnumber | stringno——
a2a.workroomRemoteExecutorsobject | nullno—Transport endpoints only. Project/Workroom topology remains in the persistent Catalog.
a2a.workroomRemoteExecutors.enabledboolean | stringno——
a2a.workroomRemoteExecutors.maxResponseBytesnumber | stringno——
a2a.workroomRemoteExecutors.bindingsarray<object>no——
a2a.workroomRemoteExecutors.bindings[].endpointIdstringno——
a2a.workroomRemoteExecutors.bindings[].cardDigeststringno——
a2a.workroomRemoteExecutors.bindings[].authBindingIdstringno——
a2a.workroomRemoteExecutors.bindings[].dispatchUrlstringno——
a2a.workroomRemoteExecutors.bindings[].pollUrlstringno——
a2a.workroomRemoteExecutors.bindings[].credentialobject | objectno——
a2a.workroomRemoteExecutors.bindings[].authorityobjectno——
a2a.workroomRemoteExecutors.bindings[].authority.workroomExtension"https://zhin.dev/extensions/workroom-executor/v1" | stringno——
a2a.workroomRemoteExecutors.bindings[].authority.idempotentDispatchboolean | stringno——
a2a.workroomRemoteExecutors.bindings[].authority.typedCompletionEnvelopeboolean | stringno——
a2a.workroomRemoteExecutors.bindings[].authority.workspaceProvidersarray<string>no——
a2a.workroomRemoteExecutors.bindings[].enabledboolean | 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.
htmlRenderer.aiTextAsImageboolean | objectno—Optional plain-text to image conversion before send.
assistantobjectno—Scheduled jobs, event ingress, and failure notifications.
assistant.enabledboolean | stringno—启用统一 JobStore(默认 false,Stable 行为不变)
assistant.queueobject | nullno—Schedule execution queue(重试 / 并发 / 死信)
assistant.queue.maxConcurrencynumber | string | nullno—Schedule execution 并发上限
assistant.queue.maxRetriesnumber | string | nullno——
assistant.queue.defaultTimeoutMsnumber | string | nullno——
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.

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 only. Disabled by default.
bilibili.notificationScopestring: "whitelist", "all"no"whitelist"Notification scope: whitelist (default) accepts only configured videos; all accepts notifications from any video.
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.masterstring | numberno—Framework masters (Bilibili uid). endpoints[i].master can override this value.
bilibili.trustedarray<string | number>no—Framework trusted users (Bilibili uid).
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[].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 only. Disabled by default.
bilibili.endpoints[].notificationScopestring: "whitelist", "all"no"whitelist"Notification scope: whitelist (default) accepts only configured videos; all accepts notifications from any video.
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[].masterstring | numberno—Framework masters for this endpoint (Bilibili uid).
bilibili.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
bilibili.endpoints[].commandPrefixstringno——

dingtalk ​

plugins/adapters/dingtalk/schema.json

PathTypeRequiredDefaultDescription
dingtalk.apiBaseUrlstringno"https://oapi.dingtalk.com"—
dingtalk.masterstring | numberno—Framework masters (DingTalk userid; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
dingtalk.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (DingTalk userid), overriding the top-level master list.
dingtalk.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.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

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.masterstring | numberno—Framework masters (Discord user snowflake; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
discord.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
discord.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id and token are required; other fields override instance defaults.
discord.endpoints[].masterstring | numberno—Framework masters for this endpoint (Discord user snowflake), overriding the top-level master list.
discord.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.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.

email ​

plugins/adapters/email/schema.json

PathTypeRequiredDefaultDescription
email.masterstring | numberno—Framework masters (email address; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
email.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (email address), overriding the top-level master list.
email.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (GitHub user login or id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
github.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
github.endpointsarray<object>yes—Multiple accounts: mount multiple endpoints in one plugin instance.
github.endpoints[].masterstring | numberno—Framework masters for this endpoint (GitHub user login or id), overriding the top-level master list.
github.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

icqq ​

plugins/adapters/icqq/schema.json

PathTypeRequiredDefaultDescription
icqq.masterstring | numberyes—Framework master QQ uin list for approval and AI/tool permissions. endpoints[i].master can override this value.
icqq.trustedarray<string | number>no—Framework trusted QQ uin list, below master authority.
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.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[].masterstring | numberno—Master QQ uin list for this endpoint, overriding the top-level master list.
icqq.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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[].commandPrefixstringno—Command prefix for this endpoint.
icqq.commandPrefixstringno""Command prefix, empty by default. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (KOOK user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
kook.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
kook.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id and token are required; other fields override instance defaults.
kook.endpoints[].masterstring | numberno—Framework masters for this endpoint (KOOK user id), overriding the top-level master list.
kook.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

lark ​

plugins/adapters/lark/schema.json

PathTypeRequiredDefaultDescription
lark.webhookPathstringno"/lark/webhook"—
lark.apiBaseUrlstringno——
lark.isFeishubooleannotrue—
lark.masterstring | numberno—Framework masters (Lark/Feishu open_id or user_id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
lark.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (Lark/Feishu open_id or user_id), overriding the top-level master list.
lark.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.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——

line ​

plugins/adapters/line/schema.json

PathTypeRequiredDefaultDescription
line.webhookPathstringno"/line/webhook"—
line.apiBaseUrlstringno"https://api.line.me"—
line.masterstring | numberno—Framework masters (LINE user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
line.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (LINE user id), overriding the top-level master list.
line.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (QQ uin; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
milky.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (QQ uin), overriding the top-level master list.
milky.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (QQ uin; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
napcat.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (QQ uin), overriding the top-level master list.
napcat.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (platform user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
onebot11.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (platform user id), overriding the top-level master list.
onebot11.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (platform user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
onebot12.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
onebot12.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.
onebot12.endpoints[].masterstring | numberno—Framework masters for this endpoint (platform user id), overriding the top-level master list.
onebot12.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (openid) for endpoint management and AI/tool permissions. endpoints[i].master can override this value.
qq.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (openid), overriding the top-level master list.
qq.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.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——

sandbox ​

plugins/adapters/sandbox/schema.json

PathTypeRequiredDefaultDescription
sandbox.masterstring | numberno—Framework masters (sandbox client id, distinct from endpoints[].owner; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
sandbox.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (sandbox client id, distinct from endpoints[].owner), overriding the top-level master list.
sandbox.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
sandbox.endpoints[].ownerstringno—Sandbox owner user ID
sandbox.endpoints[].commandPrefixstringno——
sandbox.endpoints[].idstringyes—Sandbox bot name
sandbox.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (platform user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
satori.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
satori.endpointsarray<object>yes—Multiple accounts: each entry defines an endpoint. id and baseUrl are required; other fields override instance defaults.
satori.endpoints[].masterstring | numberno—Framework masters for this endpoint (platform user id), overriding the top-level master list.
satori.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (Slack user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
slack.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (Slack user id), overriding the top-level master list.
slack.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (Telegram user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
telegram.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (Telegram user id), overriding the top-level master list.
telegram.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (WeChat OpenID; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
wechat-mp.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (WeChat OpenID), overriding the top-level master list.
wechat-mp.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

wecom ​

plugins/adapters/wecom/schema.json

PathTypeRequiredDefaultDescription
wecom.webhookPathstringno"/wecom/callback"—
wecom.apiBaseUrlstringno"https://qyapi.weixin.qq.com"—
wecom.masterstring | numberno—Framework masters (WeCom userid; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
wecom.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (WeCom userid), overriding the top-level master list.
wecom.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

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.masterstring | numberno—Framework masters (Weixin user id; AI/tool permissions and endpoint management). endpoints[i].master can override this value.
weixin-ilink.trustedarray<string | number>no—Framework trusted users, below master authority. endpoints[i].trusted can add users.
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[].masterstring | numberno—Framework masters for this endpoint (Weixin user id), overriding the top-level master list.
weixin-ilink.endpoints[].trustedarray<string | number>no—Trusted users for this endpoint.
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.commandPrefixstringno""Command prefix. The default empty string allows unprefixed commands; '/' requires a leading slash. Each endpoints[i] can override it.

process-monitor ​

plugins/features/process-monitor/schema.json

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——
process-monitor.notifyChannels[].targetstringyes——

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

PathTypeRequiredDefaultDescription
roulette.chambersintegerno6弹巢数量,其中一发是实弹
roulette.maxPlayersintegerno6单局最多玩家数
roulette.turnTimeoutSecondsintegerno60轮到的玩家超过这个秒数不开枪,判负
roulette.lobbyTimeoutSecondsintegerno300开局后超过这个秒数仍未开始,自动解散
roulette.muteSecondsintegerno60开启禁言惩罚的群里,输家被禁言的秒数(每个群默认关闭)

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

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

PathTypeRequiredDefaultDescription
typesafe.enabledbooleannotrueEnable this decision provider.
typesafe.apiKeystringno—TypeSafe API key; reference TYPESAFE_API_KEY from the environment.
typesafe.modelstringno"jev-latest"Model name; pin a model version for calibrated policies.
typesafe.baseUrlstringno"https://api.typesafe.ai"API root URL without query, credentials or fragment.
typesafe.timeoutMsintegerno10000Total budget including all requests and retry delays.
typesafe.maxRetriesintegerno2Maximum SDK retries after the first attempt.

60s ​

plugins/utils/60s/schema.json

PathTypeRequiredDefaultDescription
60s.apiBasestringno"https://60s.viki.moe"60s API base URL

answers ​

plugins/utils/answers/schema.json

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

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

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"—
calendar.work_day_endstringno"18:00"—
calendar.oauth_redirect_base_urlstringno""聊天授权回调的外部基础地址(如 https://bot.example.com);留空时使用 zhin HTTP Host 的本机地址
calendar.oauth_callback_pathstringno"/calendar/oauth/callback"聊天授权回调路由,挂在 zhin HTTP Host 上;反向代理/隧道只转发部分路径时可调整
calendar.caldavobjectno——
calendar.caldav.enabledbooleannofalse—
calendar.caldav.calendar_urlstringno""Calendar collection URL.
calendar.caldav.usernamestringno""—
calendar.caldav.passwordstringno""—
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""可选:持久化轮换后的 refresh_token 的 JSON 路径(如 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""可选:持久化轮换后的 refresh_token 的 JSON 路径(如 data/calendar-ms-token.json)

code-runner ​

plugins/utils/code-runner/schema.json

This Schema declares no fields.

content-moderation ​

plugins/utils/content-moderation/schema.json

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.mastersarray<string>no[]Additional user IDs treated as masters, merged with endpoint masters as a fallback.
content-moderation.inboundobjectno——
content-moderation.inbound.enabledbooleannotrue—
content-moderation.inbound.bypassMastersbooleannotrueSkip inbound review for masters.
content-moderation.inbound.whitelistobjectno——
content-moderation.inbound.whitelist.userIdsarray<string>no[]—
content-moderation.inbound.whitelist.conversationIdsarray<string>no[]—
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[]—
content-moderation.sources[].idstringyes——
content-moderation.sources[].typestring: "local", "http"yes——
content-moderation.sources[].enabledbooleannotrue—
content-moderation.sources[].onErrorstring: "open", "closed"no——
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——
content-moderation.sources[].headersobjectno——
content-moderation.sources[].timeoutMsnumberno5000—
content-moderation.sources[].forceUploadbooleannofalseDownload images before uploading them instead of passing the URL.

earthquake ​

plugins/utils/earthquake/schema.json

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

PathTypeRequiredDefaultDescription
group-suite.keywordReplybooleannofalse—
group-suite.basePointsMinnumberno10—
group-suite.basePointsMaxnumberno30—
group-suite.streakBonusnumberno5—
group-suite.streakCapnumberno50—
group-suite.rankSizenumberno10—
group-suite.teachMaxPerGroupnumberno200—
group-suite.teachCooldownMsnumberno3000—
group-suite.teachAllowRegexbooleannotrue—
group-suite.teachPageSizenumberno10—
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

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

PathTypeRequiredDefaultDescription
lottery.pickCountnumberno5—
lottery.scheduleCronstringno"0 0 18 * * *"—
lottery.historyLimitnumberno500—
lottery.scheduleEnabledbooleannotrue—
lottery.backtestEnabledbooleannotrue—
lottery.backtestWindownumberno50—
lottery.backtestRandomTrialsnumberno64—
lottery.backtestMinHistorynumberno30—
lottery.backtestAdaptivebooleannotrue—
lottery.weightPersistEnabledbooleannotrue—
lottery.weightHoldoutFallbackbooleannotrue—
lottery.gamesarray<string>no["kl8","ssq","dlt","fc3d","pl3","pl5"]—
lottery.pushTargetsarray<object>no[]OutboundHost push destinations for cron/publish reports
lottery.pushTargets[].adapterstringyes——
lottery.pushTargets[].endpointIdstringno——
lottery.pushTargets[].channelTypestringno"private"—
lottery.pushTargets[].channelIdstringyes——
lottery.kl8objectno——
lottery.kl8.pickCountnumberno5—
lottery.kl8.recommendGroupsnumberno3—
lottery.kl8.groupStrategiesarray<string>no["balanced","hot","cold"]—

music ​

plugins/utils/music/schema.json

This Schema declares no fields.

nettools ​

plugins/utils/nettools/schema.json

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

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

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

PathTypeRequiredDefaultDescription
rss.pollCronstringno"0 */5 * * * *"Polling schedule (6-field cron expression).
rss.maxPerGroupnumberno30—
rss.maxItemsnumberno5—
rss.timeoutnumberno15000—

short-url ​

plugins/utils/short-url/schema.json

This Schema declares no fields.