메인 콘텐츠로 건너뛰기

Slack

상태: Slack 앱 통합을 통한 DM + 채널용 프로덕션 준비 완료. 기본 모드는 Socket Mode이며, HTTP 요청 URL도 지원됩니다.

페어링

Slack DM은 기본적으로 페어링 모드를 사용합니다.

슬래시 명령

기본 명령 동작 및 명령 카탈로그.

채널 문제 해결

채널 전반의 진단 및 복구 플레이북.

빠른 설정

1

새 Slack 앱 만들기

Slack 앱 설정에서 Create New App 버튼을 누르세요:
  • from a manifest를 선택하고 앱용 워크스페이스를 선택합니다
  • 아래의 예시 매니페스트를 붙여넣고 계속해서 생성합니다
  • connections:write 권한이 있는 App-Level Token(xapp-...)을 생성합니다
  • 앱을 설치하고 표시되는 Bot Token(xoxb-...)을 복사합니다
2

OpenClaw 구성

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
환경 변수 폴백(기본 계정 전용):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Gateway 시작

openclaw gateway

매니페스트 및 scope 체크리스트

{
  "display_information": {
    "name": "OpenClaw",
    "description": "OpenClaw용 Slack 커넥터"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": true
    },
    "app_home": {
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "OpenClaw에 메시지 보내기",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "app_mentions:read",
        "assistant:write",
        "channels:history",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "pins:read",
        "pins:write",
        "reactions:read",
        "reactions:write",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}

추가 매니페스트 설정

위 기본값을 확장하는 다양한 기능을 노출합니다.
단일 구성 명령 대신 여러 기본 슬래시 명령을 상황에 맞게 사용할 수 있습니다:
  • /status 명령은 예약되어 있으므로 /status 대신 /agentstatus를 사용하세요.
  • 동시에 사용할 수 있는 슬래시 명령은 25개를 초과할 수 없습니다.
기존 features.slash_commands 섹션을 사용 가능한 명령의 일부로 교체하세요:
    "slash_commands": [
      {
        "command": "/new",
        "description": "새 세션 시작",
        "usage_hint": "[model]"
      },
      {
        "command": "/reset",
        "description": "현재 세션 재설정"
      },
      {
        "command": "/compact",
        "description": "세션 컨텍스트 Compact",
        "usage_hint": "[instructions]"
      },
      {
        "command": "/stop",
        "description": "현재 실행 중지"
      },
      {
        "command": "/session",
        "description": "스레드 바인딩 만료 관리",
        "usage_hint": "idle <duration|off> 또는 max-age <duration|off>"
      },
      {
        "command": "/think",
        "description": "사고 수준 설정",
        "usage_hint": "<level>"
      },
      {
        "command": "/verbose",
        "description": "상세 출력 전환",
        "usage_hint": "on|off|full"
      },
      {
        "command": "/fast",
        "description": "빠른 모드 표시 또는 설정",
        "usage_hint": "[status|on|off]"
      },
      {
        "command": "/reasoning",
        "description": "reasoning 표시 여부 전환",
        "usage_hint": "[on|off|stream]"
      },
      {
        "command": "/elevated",
        "description": "elevated 모드 전환",
        "usage_hint": "[on|off|ask|full]"
      },
      {
        "command": "/exec",
        "description": "exec 기본값 표시 또는 설정",
        "usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
      },
      {
        "command": "/model",
        "description": "모델 표시 또는 설정",
        "usage_hint": "[name|#|status]"
      },
      {
        "command": "/models",
        "description": "provider 또는 provider의 모델 목록 표시",
        "usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"
      },
      {
        "command": "/help",
        "description": "짧은 도움말 요약 표시"
      },
      {
        "command": "/commands",
        "description": "생성된 명령 카탈로그 표시"
      },
      {
        "command": "/tools",
        "description": "현재 에이전트가 지금 사용할 수 있는 항목 표시",
        "usage_hint": "[compact|verbose]"
      },
      {
        "command": "/agentstatus",
        "description": "가능한 경우 provider 사용량/할당량을 포함한 런타임 상태 표시"
      },
      {
        "command": "/tasks",
        "description": "현재 세션의 활성/최근 백그라운드 작업 목록 표시"
      },
      {
        "command": "/context",
        "description": "컨텍스트가 어떻게 구성되는지 설명",
        "usage_hint": "[list|detail|json]"
      },
      {
        "command": "/whoami",
        "description": "내 발신자 ID 표시"
      },
      {
        "command": "/skill",
        "description": "이름으로 skill 실행",
        "usage_hint": "<name> [input]"
      },
      {
        "command": "/btw",
        "description": "세션 컨텍스트를 변경하지 않고 부가 질문하기",
        "usage_hint": "<question>"
      },
      {
        "command": "/usage",
        "description": "사용량 푸터 제어 또는 비용 요약 표시",
        "usage_hint": "off|tokens|full|cost"
      }
    ]
발신 메시지가 기본 Slack 앱 ID 대신 활성 에이전트 ID(사용자 지정 사용자 이름 및 아이콘)를 사용하도록 하려면 chat:write.customize bot scope를 추가하세요.이모지 아이콘을 사용하는 경우 Slack은 :emoji_name: 구문을 기대합니다.
channels.slack.userToken을 구성하는 경우 일반적인 읽기 scope는 다음과 같습니다:
  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read (Slack 검색 읽기에 의존하는 경우)

토큰 모델

  • Socket Mode에는 botToken + appToken이 필요합니다.
  • HTTP 모드에는 botToken + signingSecret이 필요합니다.
  • botToken, appToken, signingSecret, userToken은 일반 텍스트 문자열 또는 SecretRef 객체를 허용합니다.
  • 구성 토큰은 환경 변수 폴백보다 우선합니다.
  • SLACK_BOT_TOKEN / SLACK_APP_TOKEN 환경 변수 폴백은 기본 계정에만 적용됩니다.
  • userToken(xoxp-...)은 구성 전용이며(환경 변수 폴백 없음), 기본값은 읽기 전용 동작(userTokenReadOnly: true)입니다.
상태 스냅샷 동작:
  • Slack 계정 검사는 자격 증명별 *Source*Status 필드(botToken, appToken, signingSecret, userToken)를 추적합니다.
  • 상태는 available, configured_unavailable, missing입니다.
  • configured_unavailable은 계정이 SecretRef 또는 다른 비인라인 비밀 소스를 통해 구성되었지만, 현재 명령/런타임 경로가 실제 값을 확인할 수 없음을 의미합니다.
  • HTTP 모드에서는 signingSecretStatus가 포함되며, Socket Mode에서는 필수 쌍이 botTokenStatus + appTokenStatus입니다.
작업/디렉터리 읽기의 경우, 구성되어 있으면 사용자 토큰을 우선 사용할 수 있습니다. 쓰기의 경우 bot 토큰이 계속 우선이며, 사용자 토큰 쓰기는 userTokenReadOnly: false이고 bot 토큰을 사용할 수 없을 때만 허용됩니다.

작업 및 게이트

Slack 작업은 channels.slack.actions.*로 제어됩니다. 현재 Slack 도구에서 사용할 수 있는 작업 그룹:
그룹기본값
messages활성화됨
reactions활성화됨
pins활성화됨
memberInfo활성화됨
emojiList활성화됨
현재 Slack 메시지 작업에는 send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info, emoji-list가 포함됩니다.

접근 제어 및 라우팅

channels.slack.dmPolicy는 DM 접근을 제어합니다(레거시: channels.slack.dm.policy):
  • pairing (기본값)
  • allowlist
  • open (channels.slack.allowFrom"*"가 포함되어 있어야 함, 레거시: channels.slack.dm.allowFrom)
  • disabled
DM 플래그:
  • dm.enabled (기본값 true)
  • channels.slack.allowFrom (권장)
  • dm.allowFrom (레거시)
  • dm.groupEnabled (그룹 DM 기본값 false)
  • dm.groupChannels (선택적 MPIM 허용 목록)
멀티 계정 우선순위:
  • channels.slack.accounts.default.allowFromdefault 계정에만 적용됩니다.
  • 이름이 있는 계정은 자체 allowFrom이 설정되지 않은 경우 channels.slack.allowFrom을 상속합니다.
  • 이름이 있는 계정은 channels.slack.accounts.default.allowFrom을 상속하지 않습니다.
DM의 페어링은 openclaw pairing approve slack <code>를 사용합니다.

스레딩, 세션 및 답장 태그

  • DM은 direct, 채널은 channel, MPIM은 group으로 라우팅됩니다.
  • 기본 session.dmScope=main을 사용하면 Slack DM은 에이전트 메인 세션으로 합쳐집니다.
  • 채널 세션: agent:<agentId>:slack:channel:<channelId>.
  • 해당하는 경우 스레드 답장은 스레드 세션 접미사(:thread:<threadTs>)를 만들 수 있습니다.
  • channels.slack.thread.historyScope 기본값은 thread이며, thread.inheritParent 기본값은 false입니다.
  • channels.slack.thread.initialHistoryLimit은 새 스레드 세션이 시작될 때 가져오는 기존 스레드 메시지 수를 제어합니다(기본값 20, 비활성화하려면 0으로 설정).
  • channels.slack.thread.requireExplicitMention(기본값 false): true인 경우 암시적 스레드 멘션을 억제하여, 봇이 이미 해당 스레드에 참여했더라도 스레드 내부의 명시적 @bot 멘션에만 응답합니다. 이 설정이 없으면 봇이 참여한 스레드의 답장은 requireMention 게이팅을 우회합니다.
답장 스레딩 제어:
  • channels.slack.replyToMode: off|first|all|batched (기본값 off)
  • channels.slack.replyToModeByChatType: direct|group|channel별 설정
  • direct 채팅용 레거시 폴백: channels.slack.dm.replyToMode
수동 답장 태그가 지원됩니다:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
참고: replyToMode="off"는 명시적 [[reply_to_*]] 태그를 포함한 Slack의 모든 답장 스레딩을 비활성화합니다. 이는 "off" 모드에서도 명시적 태그를 계속 존중하는 Telegram과 다릅니다. 이 차이는 플랫폼의 스레딩 모델을 반영합니다. Slack 스레드는 메시지를 채널에서 숨기지만, Telegram 답장은 기본 채팅 흐름에서 계속 표시됩니다.

Ack 반응

ackReaction은 OpenClaw가 수신 메시지를 처리하는 동안 확인 이모지를 보냅니다. 확인 순서:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • 에이전트 ID 이모지 폴백(agents.list[].identity.emoji, 없으면 "👀")
참고:
  • Slack은 shortcode를 기대합니다(예: "eyes").
  • Slack 계정별 또는 전역적으로 반응을 비활성화하려면 ""를 사용하세요.

텍스트 스트리밍

channels.slack.streaming은 실시간 미리보기 동작을 제어합니다:
  • off: 실시간 미리보기 스트리밍을 비활성화합니다.
  • partial (기본값): 미리보기 텍스트를 최신 부분 출력으로 교체합니다.
  • block: 청크 단위 미리보기 업데이트를 추가합니다.
  • progress: 생성 중에는 진행 상태 텍스트를 표시한 다음, 최종 텍스트를 보냅니다.
  • streaming.preview.toolProgress: 초안 미리보기가 활성 상태일 때 도구/진행 업데이트를 동일한 편집 미리보기 메시지로 라우팅합니다(기본값: true). 별도의 도구/진행 메시지를 유지하려면 false로 설정하세요.
channels.slack.streaming.nativeTransportchannels.slack.streaming.modepartial일 때 Slack 기본 텍스트 스트리밍을 제어합니다(기본값: true).
  • 기본 텍스트 스트리밍과 Slack assistant 스레드 상태를 표시하려면 답장 스레드를 사용할 수 있어야 합니다. 스레드 선택은 여전히 replyToMode를 따릅니다.
  • 채널 및 그룹 채팅 루트는 기본 스트리밍을 사용할 수 없을 때 일반 초안 미리보기를 계속 사용할 수 있습니다.
  • 최상위 Slack DM은 기본적으로 스레드 밖에서 유지되므로 스레드 스타일 미리보기가 표시되지 않습니다. 그곳에서 진행 상태를 보이게 하려면 스레드 답장이나 typingReaction을 사용하세요.
  • 미디어 및 비텍스트 페이로드는 일반 전달로 폴백합니다.
  • 미디어/오류 최종 응답은 임시 초안을 플러시하지 않고 보류 중인 미리보기 편집을 취소합니다. 자격이 되는 텍스트/블록 최종 응답은 미리보기를 제자리에서 편집할 수 있을 때만 플러시됩니다.
  • 스트리밍이 답장 중간에 실패하면 OpenClaw는 남은 페이로드에 대해 일반 전달로 폴백합니다.
Slack 기본 텍스트 스트리밍 대신 초안 미리보기를 사용하려면:
{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}
레거시 키:
  • channels.slack.streamMode (replace | status_final | append)는 channels.slack.streaming.mode로 자동 마이그레이션됩니다.
  • boolean channels.slack.streamingchannels.slack.streaming.modechannels.slack.streaming.nativeTransport로 자동 마이그레이션됩니다.
  • 레거시 channels.slack.nativeStreamingchannels.slack.streaming.nativeTransport로 자동 마이그레이션됩니다.

Typing 반응 폴백

typingReaction은 OpenClaw가 답장을 처리하는 동안 수신 Slack 메시지에 임시 반응을 추가한 다음, 실행이 끝나면 제거합니다. 이는 기본 "is typing..." 상태 표시기를 사용하는 스레드 답장 밖에서 특히 유용합니다. 확인 순서:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
참고:
  • Slack은 shortcode를 기대합니다(예: "hourglass_flowing_sand").
  • 이 반응은 best-effort 방식이며, 답장 또는 실패 경로가 완료된 후 자동으로 정리를 시도합니다.

미디어, 청킹 및 전달

Slack 파일 첨부 파일은 Slack에서 호스팅되는 비공개 URL(토큰 인증 요청 흐름)에서 다운로드되며, 가져오기에 성공하고 크기 제한을 충족하면 미디어 저장소에 기록됩니다.런타임 수신 크기 상한은 channels.slack.mediaMaxMb로 재정의하지 않는 한 기본값이 20MB입니다.
  • 텍스트 청크는 channels.slack.textChunkLimit을 사용합니다(기본값 4000)
  • channels.slack.chunkMode="newline"은 문단 우선 분할을 활성화합니다
  • 파일 전송은 Slack 업로드 API를 사용하며 스레드 답장(thread_ts)을 포함할 수 있습니다
  • 발신 미디어 상한은 구성된 경우 channels.slack.mediaMaxMb를 따르며, 그렇지 않으면 채널 전송은 미디어 파이프라인의 MIME 종류 기본값을 사용합니다
선호되는 명시적 대상:
  • DM용 user:<id>
  • 채널용 channel:<id>
Slack DM은 사용자 대상으로 보낼 때 Slack 대화 API를 통해 열립니다.

명령 및 슬래시 동작

슬래시 명령은 Slack에서 단일 구성 명령 또는 여러 기본 명령으로 표시됩니다. 명령 기본값을 변경하려면 channels.slack.slashCommand를 구성하세요:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
/openclaw /help
기본 명령은 Slack 앱의 추가 매니페스트 설정이 필요하며, 대신 channels.slack.commands.native: true 또는 전역 구성의 commands.native: true로 활성화됩니다.
  • Slack의 기본 명령 자동 모드는 off이므로 commands.native: "auto"는 Slack 기본 명령을 활성화하지 않습니다.
/help
기본 인수 메뉴는 선택한 옵션 값을 디스패치하기 전에 확인 모달을 표시하는 적응형 렌더링 전략을 사용합니다:
  • 최대 5개 옵션: 버튼 블록
  • 6-100개 옵션: 정적 선택 메뉴
  • 100개 초과 옵션: interactivity 옵션 핸들러를 사용할 수 있을 때 비동기 옵션 필터링을 사용하는 외부 선택
  • Slack 제한 초과: 인코딩된 옵션 값은 버튼으로 폴백
/think
슬래시 세션은 agent:<agentId>:slack:slash:<userId> 같은 격리된 키를 사용하며, 여전히 CommandTargetSessionKey를 사용해 명령 실행을 대상 대화 세션으로 라우팅합니다.

인터랙티브 답장

Slack은 에이전트가 작성한 인터랙티브 답장 제어를 렌더링할 수 있지만, 이 기능은 기본적으로 비활성화되어 있습니다. 전역적으로 활성화:
{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}
또는 하나의 Slack 계정에만 활성화:
{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}
활성화되면 에이전트는 Slack 전용 답장 지시문을 출력할 수 있습니다:
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
이 지시문은 Slack Block Kit으로 컴파일되며, 클릭 또는 선택은 기존 Slack 상호작용 이벤트 경로를 통해 다시 라우팅됩니다. 참고:
  • 이는 Slack 전용 UI입니다. 다른 채널은 Slack Block Kit 지시문을 자체 버튼 시스템으로 변환하지 않습니다.
  • 인터랙티브 콜백 값은 원시 에이전트 작성 값이 아니라 OpenClaw가 생성한 불투명 토큰입니다.
  • 생성된 인터랙티브 블록이 Slack Block Kit 제한을 초과하면 OpenClaw는 잘못된 블록 페이로드를 보내는 대신 원래 텍스트 답장으로 폴백합니다.

Slack의 Exec 승인

Slack은 Web UI나 터미널로 폴백하는 대신, 인터랙티브 버튼과 상호작용을 갖춘 기본 승인 클라이언트로 동작할 수 있습니다.
  • Exec 승인은 기본 DM/채널 라우팅에 channels.slack.execApprovals.*를 사용합니다.
  • Plugin 승인은 요청이 이미 Slack에 도착했고 승인 ID 종류가 plugin:일 때 동일한 Slack 기본 버튼 표면을 통해 계속 확인될 수 있습니다.
  • 승인자 권한 부여는 여전히 강제됩니다. 승인자로 식별된 사용자만 Slack을 통해 요청을 승인하거나 거부할 수 있습니다.
이는 다른 채널과 동일한 공유 승인 버튼 표면을 사용합니다. Slack 앱 설정에서 interactivity가 활성화되면 승인 프롬프트는 대화에 직접 Block Kit 버튼으로 렌더링됩니다. 이 버튼이 존재하면 기본 승인 UX가 되며, OpenClaw는 도구 결과에서 채팅 승인을 사용할 수 없다고 하거나 수동 승인이 유일한 경로일 때만 수동 /approve 명령을 포함해야 합니다. 구성 경로:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (선택 사항, 가능한 경우 commands.ownerAllowFrom으로 폴백)
  • channels.slack.execApprovals.target (dm | channel | both, 기본값: dm)
  • agentFilter, sessionFilter
Slack은 enabled가 설정되지 않았거나 "auto"이고 최소 하나의 승인자가 확인되면 기본 exec 승인을 자동으로 활성화합니다. Slack을 기본 승인 클라이언트로 명시적으로 비활성화하려면 enabled: false를 설정하세요. 승인자가 확인될 때 기본 승인을 강제로 켜려면 enabled: true를 설정하세요. 명시적인 Slack exec 승인 구성이 없는 기본 동작:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
승인자를 재정의하거나 필터를 추가하거나 원본 채팅 전달을 선택하려는 경우에만 명시적인 Slack 기본 구성이 필요합니다:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
공유 approvals.exec 전달은 별도입니다. exec 승인 프롬프트도 다른 채팅이나 명시적인 대역 외 대상으로 라우팅해야 하는 경우에만 사용하세요. 공유 approvals.plugin 전달도 별도입니다. 요청이 이미 Slack에 도착한 경우 Slack 기본 버튼은 계속 plugin 승인을 처리할 수 있습니다. 동일 채팅 /approve도 이미 명령을 지원하는 Slack 채널 및 DM에서 동작합니다. 전체 승인 전달 모델은 Exec approvals을 참조하세요.

이벤트 및 운영 동작

  • 메시지 편집/삭제/스레드 브로드캐스트는 시스템 이벤트로 매핑됩니다.
  • 반응 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
  • 멤버 참여/나감, 채널 생성/이름 변경, 핀 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
  • channel_id_changedconfigWrites가 활성화되어 있으면 채널 구성 키를 마이그레이션할 수 있습니다.
  • 채널 topic/purpose 메타데이터는 신뢰할 수 없는 컨텍스트로 처리되며 라우팅 컨텍스트에 주입될 수 있습니다.
  • 스레드 시작자와 초기 스레드 히스토리 컨텍스트 시딩은 적용 가능한 경우 구성된 발신자 허용 목록에 따라 필터링됩니다.
  • 블록 작업과 모달 상호작용은 풍부한 페이로드 필드와 함께 구조화된 Slack interaction: ... 시스템 이벤트를 출력합니다:
    • 블록 작업: 선택된 값, 라벨, picker 값, workflow_* 메타데이터
    • 라우팅된 채널 메타데이터와 폼 입력이 포함된 모달 view_submissionview_closed 이벤트

구성 참조 포인터

기본 참조:
  • 구성 참조 - Slack 주요 Slack 필드:
    • 모드/인증: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
    • DM 접근: dm.enabled, dmPolicy, allowFrom (레거시: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
    • 호환성 토글: dangerouslyAllowNameMatching (최후 수단, 필요하지 않으면 끄기)
    • 채널 접근: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
    • 스레딩/히스토리: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • 전달: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
    • 운영/기능: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

문제 해결

다음 순서로 확인하세요:
  • groupPolicy
  • 채널 허용 목록(channels.slack.channels)
  • requireMention
  • 채널별 users 허용 목록
유용한 명령:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
확인할 항목:
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (또는 레거시 channels.slack.dm.policy)
  • 페어링 승인 / 허용 목록 항목
openclaw pairing list slack
Slack 앱 설정에서 bot + app 토큰과 Socket Mode 활성화 여부를 확인하세요.openclaw channels status --probe --jsonbotTokenStatus 또는 appTokenStatus: "configured_unavailable"이 표시되면 Slack 계정은 구성되어 있지만 현재 런타임이 SecretRef 기반 값을 확인할 수 없다는 뜻입니다.
다음을 확인하세요:
  • signing secret
  • webhook path
  • Slack 요청 URL(Events + Interactivity + Slash Commands)
  • HTTP 계정별 고유한 webhookPath
계정 스냅샷에 signingSecretStatus: "configured_unavailable"이 나타나면 HTTP 계정은 구성되어 있지만 현재 런타임이 SecretRef 기반 signing secret을 확인할 수 없다는 뜻입니다.
의도한 구성이 다음 중 무엇인지 확인하세요:
  • Slack에 일치하는 슬래시 명령이 등록된 기본 명령 모드(channels.slack.commands.native: true)
  • 또는 단일 슬래시 명령 모드(channels.slack.slashCommand.enabled: true)
또한 commands.useAccessGroups와 채널/사용자 허용 목록도 확인하세요.

관련 항목