// Slack helper module supports config ui hints behavior. import type { ChannelConfigUiHint } from "openclaw/plugin-sdk/channel-core"; export const slackChannelConfigUiHints = { "": { label: "Slack", help: "Slack channel provider configuration for bot/app tokens, streaming behavior, and DM policy controls. Keep token handling and thread behavior explicit to avoid noisy workspace interactions.", }, "dm.policy": { label: "Slack DM Policy", help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"] (legacy: channels.slack.dm.allowFrom).', }, dmPolicy: { label: "Slack DM Policy", help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"].', }, configWrites: { label: "Slack Config Writes", help: "Allow Slack to write config in response to channel events/commands (default: true).", }, mentionPatterns: { label: "Slack Mention Pattern Policy", help: "Scopes configured groupChat mentionPatterns to selected Slack channel IDs. Native Slack @mentions still trigger even when regex patterns are denied.", }, "mentionPatterns.mode": { label: "Slack Mention Pattern Mode", help: '"allow" enables configured regex mention patterns unless denyIn matches; "deny" disables them unless allowIn matches.', }, "mentionPatterns.allowIn": { label: "Slack Mention Pattern Allowlist", help: "Slack channel IDs where configured regex mention patterns are enabled when mode is deny.", }, "mentionPatterns.denyIn": { label: "Slack Mention Pattern Denylist", help: "Slack channel IDs where configured regex mention patterns are disabled. Native @mentions still trigger.", }, "commands.native": { label: "Slack Native Commands", help: 'Override native commands for Slack (bool or "auto").', }, "commands.nativeSkills": { label: "Slack Native Skill Commands", help: 'Override native skill commands for Slack (bool or "auto").', }, allowBots: { label: "Slack Allow Bot Messages", help: "Allow bot-authored messages to trigger Slack replies (default: false).", }, botLoopProtection: { label: "Slack Bot Loop Protection", help: "Sliding-window guard for Slack bot-to-bot loops. Default is enabled whenever allowBots lets bot-authored messages reach dispatch.", }, "botLoopProtection.enabled": { label: "Slack Bot Loop Protection Enabled", help: 'Enable the bot-pair loop guard. Defaults to true when allowBots is true or "mentions", and false when bot messages are ignored.', }, "botLoopProtection.maxEventsPerWindow": { label: "Slack Bot Loop Events per Window", help: "Maximum accepted bot-pair messages within the sliding window before suppression starts. Default: 20.", }, "botLoopProtection.windowSeconds": { label: "Slack Bot Loop Window Seconds", help: "Sliding window length for counting bot-pair messages. Default: 60.", }, "botLoopProtection.cooldownSeconds": { label: "Slack Bot Loop Cooldown Seconds", help: "How long to suppress the bot pair after it exceeds the budget. Default: 60.", }, socketMode: { label: "Slack Socket Mode Transport", help: "Slack Socket Mode transport tuning passed to the Slack SDK. Use only when investigating ping/pong timeout or stale websocket behavior.", }, "socketMode.clientPingTimeout": { label: "Slack Socket Mode Pong Timeout", help: "Milliseconds the Slack SDK waits for a pong after its client ping before treating the websocket as stale (OpenClaw default: 15000). Increase on hosts with event-loop starvation or slow network scheduling.", }, "socketMode.serverPingTimeout": { label: "Slack Socket Mode Server Ping Timeout", help: "Milliseconds the Slack SDK waits for Slack server pings before treating the websocket as stale.", }, "socketMode.pingPongLoggingEnabled": { label: "Slack Socket Mode Ping/Pong Logging", help: "Enable Slack SDK ping/pong transport logs while debugging Socket Mode websocket health.", }, relay: { label: "Slack Relay Mode", help: 'Relay-delivered Slack events. Use with mode="relay" when openclaw-slack-router owns the Slack Socket Mode connection.', }, "relay.url": { label: "Slack Relay URL", help: "Full websocket URL for openclaw-slack-router. Include the route path, for example ws://127.0.0.1:8081/gateway/ws.", }, "relay.authToken": { label: "Slack Relay Auth Token", help: "Bearer token used by this gateway to authenticate its reverse websocket connection to openclaw-slack-router.", }, "relay.gatewayId": { label: "Slack Relay Gateway ID", help: "Destination id that openclaw-slack-router uses when routing user-group mentions to this gateway.", }, botToken: { label: "Slack Bot Token", help: "Slack bot token used for standard chat actions in the configured workspace. Keep this credential scoped and rotate if workspace app permissions change.", }, appToken: { label: "Slack App Token", help: "Slack app-level token used for Socket Mode connections and event transport when enabled. Use least-privilege app scopes and store this token as a secret.", }, userToken: { label: "Slack User Token", help: "Optional Slack user token for workflows requiring user-context API access beyond bot permissions. Use sparingly and audit scopes because this token can carry broader authority.", }, userTokenReadOnly: { label: "Slack User Token Read Only", help: "When true, treat configured Slack user token usage as read-only helper behavior where possible. Keep enabled if you only need supplemental reads without user-context writes.", }, "capabilities.interactiveReplies": { label: "Slack Interactive Replies", help: "Enable agent-authored Slack interactive reply directives (`[[slack_buttons: ...]]`, `[[slack_select: ...]]`). Default: false.", }, execApprovals: { label: "Slack Exec Approvals", help: "Slack-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for this workspace account.", }, "execApprovals.enabled": { label: "Slack Exec Approvals Enabled", help: 'Controls Slack native exec approvals for this account: unset or "auto" enables DM-first native approvals when approvers can be resolved, true forces native approvals on, and false disables them.', }, "execApprovals.approvers": { 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.", }, "execApprovals.agentFilter": { 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.', }, "execApprovals.sessionFilter": { 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.", }, "execApprovals.target": { label: "Slack Exec Approval Target", help: 'Controls where Slack approval prompts are sent: "dm" sends to approver DMs (default), "channel" sends to the originating Slack chat/thread, and "both" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted channels.', }, streaming: { label: "Slack Streaming Mode", help: 'Unified Slack stream preview mode: "off" | "partial" | "block" | "progress". Legacy boolean/streamMode keys are auto-mapped.', }, "streaming.mode": { label: "Slack Streaming Mode", help: 'Canonical Slack preview mode: "off" | "partial" | "block" | "progress".', }, "streaming.chunkMode": { label: "Slack Chunk Mode", help: 'Chunking mode for outbound Slack text delivery: "length" (default) or "newline".', }, "streaming.block.enabled": { label: "Slack Block Streaming Enabled", help: 'Enable chunked block-style Slack preview delivery when channels.slack.streaming.mode="block".', }, "streaming.block.coalesce": { label: "Slack Block Streaming Coalesce", help: "Merge streamed Slack block replies before final delivery.", }, "streaming.nativeTransport": { label: "Slack Native Streaming", help: "Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming.mode is partial (default: true). Native streaming and Slack assistant thread status require a reply thread target; top-level DMs can still use draft post-and-edit preview streaming.", }, "streaming.preview.toolProgress": { label: "Slack Draft Tool Progress", help: "Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active.", }, "streaming.preview.commandText": { label: "Slack Draft Command Text", help: 'Command/exec detail in preview tool-progress lines: "raw" preserves released behavior; "status" shows only the tool label.', }, "streaming.progress.label": { label: "Slack Progress Label", help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', }, "streaming.progress.labels": { label: "Slack Progress Label Pool", help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', }, "streaming.progress.maxLines": { label: "Slack Progress Max Lines", help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", }, "streaming.progress.maxLineChars": { label: "Slack Progress Max Line Chars", help: "Maximum characters per compact progress line before truncation (default: 120). Prose cuts at word boundaries; commands and paths keep useful suffixes.", }, "streaming.progress.render": { label: "Slack Progress Renderer", help: 'Progress draft renderer: "text" uses one portable text body; "rich" renders structured Slack Block Kit fields with the same text fallback.', }, "streaming.progress.nativeTaskCards": { label: "Slack Native Progress Task Cards", help: 'Opt in to Slack native task-card progress updates when channels.slack.streaming.mode="progress" and streaming.nativeTransport is enabled. Default: false.', }, "streaming.progress.toolProgress": { label: "Slack Progress Tool Lines", help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", }, "streaming.progress.commandText": { label: "Slack Progress Command Text", help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', }, "thread.historyScope": { label: "Slack Thread History Scope", help: 'Scope for Slack thread history context ("thread" isolates per thread; "channel" reuses channel history).', }, "thread.inheritParent": { label: "Slack Thread Parent Inheritance", help: "If true, Slack thread sessions inherit the parent channel transcript (default: false).", }, "thread.initialHistoryLimit": { label: "Slack Thread Initial History Limit", help: "Maximum number of existing Slack thread messages to fetch when starting a new thread session (default: 20, set to 0 to disable).", }, "thread.requireExplicitMention": { label: "Slack Thread Require Explicit Mention", help: "If true, require an explicit @mention even inside threads where the bot has participated. Suppresses implicit thread mention behavior so the bot only responds to explicit @bot mentions in threads (default: false).", }, } satisfies Record;