diff --git a/CHANGELOG.md b/CHANGELOG.md
index a0d88e88d27..173aea43d5e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,12 @@ Docs: https://docs.openclaw.ai
### Changes
+### Fixes
+
+## 2026.4.1-beta.1
+
+### Changes
+
- Tasks/chat: add `/tasks` as a chat-native background task board for the current session, with recent task details and agent-local fallback counts when no linked tasks are visible. Related #54226. Thanks @vincentkoc.
- Web search/SearXNG: add the bundled SearXNG provider plugin for `web_search` with configurable host support. (#57317) Thanks @cgdusek.
- Amazon Bedrock/Guardrails: add Bedrock Guardrails support to the bundled provider. (#58588) Thanks @MikeORed.
diff --git a/apps/android/app/build.gradle.kts b/apps/android/app/build.gradle.kts
index 360f995f2f4..36e095a0f6b 100644
--- a/apps/android/app/build.gradle.kts
+++ b/apps/android/app/build.gradle.kts
@@ -65,8 +65,8 @@ android {
applicationId = "ai.openclaw.app"
minSdk = 31
targetSdk = 36
- versionCode = 2026040100
- versionName = "2026.4.1"
+ versionCode = 2026040101
+ versionName = "2026.4.1-beta.1"
ndk {
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
diff --git a/apps/ios/Config/Version.xcconfig b/apps/ios/Config/Version.xcconfig
index bf5cb774a68..335a597f3c2 100644
--- a/apps/ios/Config/Version.xcconfig
+++ b/apps/ios/Config/Version.xcconfig
@@ -1,8 +1,8 @@
// Shared iOS version defaults.
// Generated overrides live in build/Version.xcconfig (git-ignored).
-OPENCLAW_GATEWAY_VERSION = 2026.4.1
+OPENCLAW_GATEWAY_VERSION = 2026.4.1-beta.1
OPENCLAW_MARKETING_VERSION = 2026.4.1
-OPENCLAW_BUILD_VERSION = 2026040100
+OPENCLAW_BUILD_VERSION = 2026040101
#include? "../build/Version.xcconfig"
diff --git a/apps/macos/Sources/OpenClaw/Resources/Info.plist b/apps/macos/Sources/OpenClaw/Resources/Info.plist
index a60077a981b..bbf938b5bf4 100644
--- a/apps/macos/Sources/OpenClaw/Resources/Info.plist
+++ b/apps/macos/Sources/OpenClaw/Resources/Info.plist
@@ -15,9 +15,9 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 2026.4.1
+ 2026.4.1-beta.1
CFBundleVersion
- 2026040100
+ 2026040101
CFBundleIconFile
OpenClaw
CFBundleURLTypes
diff --git a/docs/.generated/config-baseline.json b/docs/.generated/config-baseline.json
index c42b45d1abf..749b2cc9fc7 100644
--- a/docs/.generated/config-baseline.json
+++ b/docs/.generated/config-baseline.json
@@ -31521,7 +31521,7 @@
"network"
],
"label": "Slack Exec Approval Approvers",
- "help": "Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to owner IDs inferred from channels.slack.allowFrom, channels.slack.dm.allowFrom, and defaultTo when possible.",
+ "help": "Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to commands.ownerAllowFrom when possible.",
"hasChildren": true
},
{
@@ -32768,6 +32768,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.accounts.*.direct.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.accounts.*.direct.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.accounts.*.direct.*.requireTopic",
"kind": "channel",
@@ -33031,6 +33056,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.accounts.*.direct.*.topics.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.accounts.*.direct.*.topics.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.accounts.*.direct.*.topics.*.groupPolicy",
"kind": "channel",
@@ -33193,6 +33243,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.accounts.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.accounts.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.accounts.*.execApprovals",
"kind": "channel",
@@ -33393,6 +33468,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.accounts.*.groups.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.accounts.*.groups.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.accounts.*.groups.*.groupPolicy",
"kind": "channel",
@@ -33671,6 +33771,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.accounts.*.groups.*.topics.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.accounts.*.groups.*.topics.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.accounts.*.groups.*.topics.*.groupPolicy",
"kind": "channel",
@@ -34805,6 +34930,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.direct.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.direct.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.direct.*.requireTopic",
"kind": "channel",
@@ -35068,6 +35218,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.direct.*.topics.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.direct.*.topics.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.direct.*.topics.*.groupPolicy",
"kind": "channel",
@@ -35236,6 +35411,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.execApprovals",
"kind": "channel",
@@ -35467,6 +35667,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.groups.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.groups.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.groups.*.groupPolicy",
"kind": "channel",
@@ -35745,6 +35970,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "channels.telegram.groups.*.topics.*.errorCooldownMs",
+ "kind": "channel",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "channels.telegram.groups.*.topics.*.errorPolicy",
+ "kind": "channel",
+ "type": "string",
+ "required": false,
+ "enumValues": [
+ "always",
+ "once",
+ "silent"
+ ],
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
{
"path": "channels.telegram.groups.*.topics.*.groupPolicy",
"kind": "channel",
@@ -42753,6 +43003,31 @@
"tags": [],
"hasChildren": false
},
+ {
+ "path": "gateway.webchat",
+ "kind": "core",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": true
+ },
+ {
+ "path": "gateway.webchat.chatHistoryMaxChars",
+ "kind": "core",
+ "type": "integer",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "network",
+ "performance"
+ ],
+ "label": "WebChat History Max Chars",
+ "help": "Max characters per text field in chat.history responses before truncation (default: 12000).",
+ "hasChildren": false
+ },
{
"path": "hooks",
"kind": "core",
@@ -55724,6 +55999,183 @@
"help": "Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection.",
"hasChildren": false
},
+ {
+ "path": "plugins.entries.searxng",
+ "kind": "plugin",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "@openclaw/searxng-plugin",
+ "help": "OpenClaw SearXNG plugin (plugin: searxng)",
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.config",
+ "kind": "plugin",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "@openclaw/searxng-plugin Config",
+ "help": "Plugin-defined config payload for searxng.",
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.config.webSearch",
+ "kind": "plugin",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.config.webSearch.baseUrl",
+ "kind": "plugin",
+ "type": [
+ "object",
+ "string"
+ ],
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced",
+ "url-secret"
+ ],
+ "label": "SearXNG Base URL",
+ "help": "Base URL of your SearXNG instance, such as http://localhost:8080 or https://search.example.com/searxng.",
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.config.webSearch.categories",
+ "kind": "plugin",
+ "type": "string",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "SearXNG Categories",
+ "help": "Optional comma-separated categories such as general, news, or science.",
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.config.webSearch.language",
+ "kind": "plugin",
+ "type": "string",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "SearXNG Language",
+ "help": "Optional language code for results such as en, de, or fr.",
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.enabled",
+ "kind": "plugin",
+ "type": "boolean",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "Enable @openclaw/searxng-plugin",
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.hooks",
+ "kind": "plugin",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "Plugin Hook Policy",
+ "help": "Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin.",
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.hooks.allowPromptInjection",
+ "kind": "plugin",
+ "type": "boolean",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "access"
+ ],
+ "label": "Allow Prompt Injection Hooks",
+ "help": "Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build` and ignore prompt-mutating fields from legacy `before_agent_start`, while preserving legacy `modelOverride` and `providerOverride` behavior.",
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.subagent",
+ "kind": "plugin",
+ "type": "object",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "advanced"
+ ],
+ "label": "Plugin Subagent Policy",
+ "help": "Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection.",
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.subagent.allowedModels",
+ "kind": "plugin",
+ "type": "array",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "access"
+ ],
+ "label": "Plugin Subagent Allowed Models",
+ "help": "Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model.",
+ "hasChildren": true
+ },
+ {
+ "path": "plugins.entries.searxng.subagent.allowedModels.*",
+ "kind": "plugin",
+ "type": "string",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [],
+ "hasChildren": false
+ },
+ {
+ "path": "plugins.entries.searxng.subagent.allowModelOverride",
+ "kind": "plugin",
+ "type": "boolean",
+ "required": false,
+ "deprecated": false,
+ "sensitive": false,
+ "tags": [
+ "access"
+ ],
+ "label": "Allow Plugin Subagent Model Override",
+ "help": "Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection.",
+ "hasChildren": false
+ },
{
"path": "plugins.entries.sglang",
"kind": "plugin",
diff --git a/docs/.generated/config-baseline.jsonl b/docs/.generated/config-baseline.jsonl
index 33ea8f0d31d..d6474b05f61 100644
--- a/docs/.generated/config-baseline.jsonl
+++ b/docs/.generated/config-baseline.jsonl
@@ -1,4 +1,4 @@
-{"generatedBy":"scripts/generate-config-doc-baseline.ts","recordType":"meta","totalPaths":5730}
+{"generatedBy":"scripts/generate-config-doc-baseline.ts","recordType":"meta","totalPaths":5765}
{"recordType":"path","path":"acp","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"ACP","help":"ACP runtime controls for enabling dispatch, selecting backends, constraining allowed agent targets, and tuning streamed turn projection behavior.","hasChildren":true}
{"recordType":"path","path":"acp.allowedAgents","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"ACP Allowed Agents","help":"Allowlist of ACP target agent ids permitted for ACP runtime sessions. Empty means no additional allowlist restriction.","hasChildren":true}
{"recordType":"path","path":"acp.allowedAgents.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -2829,7 +2829,7 @@
{"recordType":"path","path":"channels.slack.execApprovals","kind":"channel","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Slack Exec Approvals","help":"Slack-native exec approval routing and approver authorization. Enable this only when Slack should act as an explicit exec-approval client for the selected workspace account.","hasChildren":true}
{"recordType":"path","path":"channels.slack.execApprovals.agentFilter","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Slack Exec Approval Agent Filter","help":"Optional allowlist of agent IDs eligible for Slack exec approvals, for example `[\"main\", \"ops-agent\"]`. Use this to keep approval prompts scoped to the agents you actually operate from Slack.","hasChildren":true}
{"recordType":"path","path":"channels.slack.execApprovals.agentFilter.*","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
-{"recordType":"path","path":"channels.slack.execApprovals.approvers","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Slack Exec Approval Approvers","help":"Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to owner IDs inferred from channels.slack.allowFrom, channels.slack.dm.allowFrom, and defaultTo when possible.","hasChildren":true}
+{"recordType":"path","path":"channels.slack.execApprovals.approvers","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Slack Exec Approval Approvers","help":"Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to commands.ownerAllowFrom when possible.","hasChildren":true}
{"recordType":"path","path":"channels.slack.execApprovals.approvers.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.slack.execApprovals.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Slack Exec Approvals Enabled","help":"Enable Slack exec approvals for this account. When false or unset, Slack messages/buttons cannot approve exec requests.","hasChildren":false}
{"recordType":"path","path":"channels.slack.execApprovals.sessionFilter","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network","storage"],"label":"Slack Exec Approval Session Filter","help":"Optional session-key filters matched as substring or regex-style patterns before Slack approval routing is used. Use narrow patterns so Slack approvals only appear for intended sessions.","hasChildren":true}
@@ -2936,6 +2936,8 @@
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.autoTopicLabel.prompt","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.dmPolicy","kind":"channel","type":"string","required":false,"enumValues":["pairing","allowlist","open","disabled"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.requireTopic","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.skills.*","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -2962,6 +2964,8 @@
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.direct.*.topics.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -2977,6 +2981,8 @@
{"recordType":"path","path":"channels.telegram.accounts.*.draftChunk.maxChars","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.draftChunk.minChars","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.execApprovals","kind":"channel","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
{"recordType":"path","path":"channels.telegram.accounts.*.execApprovals.agentFilter","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
{"recordType":"path","path":"channels.telegram.accounts.*.execApprovals.agentFilter.*","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -2995,6 +3001,8 @@
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -3022,6 +3030,8 @@
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.accounts.*.groups.*.topics.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -3121,6 +3131,8 @@
{"recordType":"path","path":"channels.telegram.direct.*.autoTopicLabel.prompt","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.dmPolicy","kind":"channel","type":"string","required":false,"enumValues":["pairing","allowlist","open","disabled"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.direct.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.direct.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.requireTopic","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
{"recordType":"path","path":"channels.telegram.direct.*.skills.*","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -3147,6 +3159,8 @@
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.direct.*.topics.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.direct.*.topics.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.direct.*.topics.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -3162,6 +3176,8 @@
{"recordType":"path","path":"channels.telegram.draftChunk.maxChars","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.draftChunk.minChars","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.execApprovals","kind":"channel","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Telegram Exec Approvals","help":"Telegram-native exec approval routing and approver authorization. Enable this only when Telegram should act as an explicit exec-approval client for the selected bot account.","hasChildren":true}
{"recordType":"path","path":"channels.telegram.execApprovals.agentFilter","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["channels","network"],"label":"Telegram Exec Approval Agent Filter","help":"Optional allowlist of agent IDs eligible for Telegram exec approvals, for example `[\"main\", \"ops-agent\"]`. Use this to keep approval prompts scoped to the agents you actually operate from Telegram.","hasChildren":true}
{"recordType":"path","path":"channels.telegram.execApprovals.agentFilter.*","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -3180,6 +3196,8 @@
{"recordType":"path","path":"channels.telegram.groups.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.groups.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.groups.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -3207,6 +3225,8 @@
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.allowFrom.*","kind":"channel","type":["number","string"],"required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.disableAudioPreflight","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.enabled","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.groups.*.topics.*.errorCooldownMs","kind":"channel","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"channels.telegram.groups.*.topics.*.errorPolicy","kind":"channel","type":"string","required":false,"enumValues":["always","once","silent"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.groupPolicy","kind":"channel","type":"string","required":false,"enumValues":["open","disabled","allowlist"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.requireMention","kind":"channel","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"channels.telegram.groups.*.topics.*.skills","kind":"channel","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
@@ -3797,6 +3817,8 @@
{"recordType":"path","path":"gateway.tools.deny.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"gateway.trustedProxies","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["network"],"label":"Gateway Trusted Proxy CIDRs","help":"CIDR/IP allowlist of upstream proxies permitted to provide forwarded client identity headers. Keep this list narrow so untrusted hops cannot impersonate users.","hasChildren":true}
{"recordType":"path","path":"gateway.trustedProxies.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"gateway.webchat","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
+{"recordType":"path","path":"gateway.webchat.chatHistoryMaxChars","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":["network","performance"],"label":"WebChat History Max Chars","help":"Max characters per text field in chat.history responses before truncation (default: 12000).","hasChildren":false}
{"recordType":"path","path":"hooks","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Hooks","help":"Inbound webhook automation surface for mapping external events into wake or agent actions in OpenClaw. Keep this locked down with explicit token/session/agent controls before exposing it beyond trusted networks.","hasChildren":true}
{"recordType":"path","path":"hooks.allowedAgentIds","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Hooks Allowed Agent IDs","help":"Allowlist of agent IDs that hook mappings are allowed to target when selecting execution agents. Use this to constrain automation events to dedicated service agents and reduce blast radius if a hook token is exposed.","hasChildren":true}
{"recordType":"path","path":"hooks.allowedAgentIds.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
@@ -4790,6 +4812,19 @@
{"recordType":"path","path":"plugins.entries.qqbot.subagent.allowedModels","kind":"plugin","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Plugin Subagent Allowed Models","help":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model.","hasChildren":true}
{"recordType":"path","path":"plugins.entries.qqbot.subagent.allowedModels.*","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
{"recordType":"path","path":"plugins.entries.qqbot.subagent.allowModelOverride","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Allow Plugin Subagent Model Override","help":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection.","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"@openclaw/searxng-plugin","help":"OpenClaw SearXNG plugin (plugin: searxng)","hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.config","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"@openclaw/searxng-plugin Config","help":"Plugin-defined config payload for searxng.","hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.config.webSearch","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.config.webSearch.baseUrl","kind":"plugin","type":["object","string"],"required":false,"deprecated":false,"sensitive":false,"tags":["advanced","url-secret"],"label":"SearXNG Base URL","help":"Base URL of your SearXNG instance, such as http://localhost:8080 or https://search.example.com/searxng.","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.config.webSearch.categories","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"SearXNG Categories","help":"Optional comma-separated categories such as general, news, or science.","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.config.webSearch.language","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"SearXNG Language","help":"Optional language code for results such as en, de, or fr.","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.enabled","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Enable @openclaw/searxng-plugin","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.hooks","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Hook Policy","help":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin.","hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.hooks.allowPromptInjection","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Allow Prompt Injection Hooks","help":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build` and ignore prompt-mutating fields from legacy `before_agent_start`, while preserving legacy `modelOverride` and `providerOverride` behavior.","hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.subagent","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Subagent Policy","help":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection.","hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.subagent.allowedModels","kind":"plugin","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Plugin Subagent Allowed Models","help":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model.","hasChildren":true}
+{"recordType":"path","path":"plugins.entries.searxng.subagent.allowedModels.*","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false}
+{"recordType":"path","path":"plugins.entries.searxng.subagent.allowModelOverride","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"Allow Plugin Subagent Model Override","help":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection.","hasChildren":false}
{"recordType":"path","path":"plugins.entries.sglang","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"@openclaw/sglang-provider","help":"OpenClaw SGLang provider plugin (plugin: sglang)","hasChildren":true}
{"recordType":"path","path":"plugins.entries.sglang.config","kind":"plugin","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"@openclaw/sglang-provider Config","help":"Plugin-defined config payload for sglang.","hasChildren":false}
{"recordType":"path","path":"plugins.entries.sglang.enabled","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Enable @openclaw/sglang-provider","hasChildren":false}
diff --git a/docs/.generated/plugin-sdk-api-baseline.json b/docs/.generated/plugin-sdk-api-baseline.json
index ce70f5a6de9..dc7fbf61382 100644
--- a/docs/.generated/plugin-sdk-api-baseline.json
+++ b/docs/.generated/plugin-sdk-api-baseline.json
@@ -1024,7 +1024,7 @@
"exportName": "DiscordConfigSchema",
"kind": "const",
"source": {
- "line": 677,
+ "line": 686,
"path": "src/config/zod-schema.providers-core.ts"
}
},
@@ -1051,7 +1051,7 @@
"exportName": "GoogleChatConfigSchema",
"kind": "const",
"source": {
- "line": 816,
+ "line": 825,
"path": "src/config/zod-schema.providers-core.ts"
}
},
@@ -1069,7 +1069,7 @@
"exportName": "IMessageConfigSchema",
"kind": "const",
"source": {
- "line": 1324,
+ "line": 1333,
"path": "src/config/zod-schema.providers-core.ts"
}
},
@@ -1087,7 +1087,7 @@
"exportName": "MSTeamsConfigSchema",
"kind": "const",
"source": {
- "line": 1506,
+ "line": 1515,
"path": "src/config/zod-schema.providers-core.ts"
}
},
@@ -1114,7 +1114,7 @@
"exportName": "SignalConfigSchema",
"kind": "const",
"source": {
- "line": 1082,
+ "line": 1091,
"path": "src/config/zod-schema.providers-core.ts"
}
},
@@ -1123,16 +1123,16 @@
"exportName": "SlackConfigSchema",
"kind": "const",
"source": {
- "line": 950,
+ "line": 959,
"path": "src/config/zod-schema.providers-core.ts"
}
},
{
- "declaration": "export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; }, z.core.$strict>>>>; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; }, z.core.$strict>>>>; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; accounts: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; }, z.core.$strict>>>>; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; }, z.core.$strict>>>>; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;",
+ "declaration": "export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional