openclaw - 💡(How to fix) Fix Health check shows Feishu as OFF/not configured when using multi-account format [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#72930Fetched 2026-04-28 06:30:07
View on GitHub
Comments
0
Participants
1
Timeline
0
Reactions
0
Author
Participants

Root Cause

I traced through the source code and identified the issue chain:

Fix Action

Workaround

This is a display-only bug. Feishu works correctly despite the health check showing OFF.

Code Example

{
  "channels": {
    "feishu": {
      "enabled": true,
      "defaultAccount": "main-bot",
      "accounts": {
        "main-bot": {
          "appId": "cli_xxx",
          "appSecret": "...",
          "connectionMode": "websocket"
        },
        "marketing-agent": {
          "appId": "cli_yyy",
          "appSecret": "...",
          "connectionMode": "websocket"
        }
      }
    }
  }
}

---

Health
┌─────────────────┬───────────┬────────────────────────┐
ItemStatusDetail├─────────────────┼───────────┼────────────────────────┤
DiscordOKok (@初号机:default)TelegramOKok (@FZMainBot:default)FeishuOFF       │ not configured         │
│ openclaw-weixin │ OK        │ configured             │
└─────────────────┴───────────┴────────────────────────┘

---

account = params.plugin.config.resolveAccount(params.cfg, params.accountId);

---

isConfigured: (account) => account.configured

---

const feishuCfg = cfg.channels?.feishu;
const resolvedCredentials = inspectFeishuCredentials(feishuCfg);

---

const configured = typeof baseSummary.configured === "boolean" ? baseSummary.configured : null;
if (configured === false) {
    lines.push(`${label}: not configured`);
RAW_BUFFERClick to expand / collapse

Bug Description

openclaw status --deep shows Feishu channel as OFF · not configured even when Feishu is fully configured and working (sending/receiving messages via WebSocket).

Environment

  • OpenClaw: 2026.4.24
  • OS: macOS 15.4 (arm64, M4 Pro)
  • Node: v24.15.0
  • Channel: Feishu (WebSocket mode)

Configuration Format

{
  "channels": {
    "feishu": {
      "enabled": true,
      "defaultAccount": "main-bot",
      "accounts": {
        "main-bot": {
          "appId": "cli_xxx",
          "appSecret": "...",
          "connectionMode": "websocket"
        },
        "marketing-agent": {
          "appId": "cli_yyy",
          "appSecret": "...",
          "connectionMode": "websocket"
        }
      }
    }
  }
}

Note: credentials are under accounts.*.appId/appSecret, NOT at channels.feishu.appId top-level.

Health Output

Health
┌─────────────────┬───────────┬────────────────────────┐
│ Item            │ Status    │ Detail                 │
├─────────────────┼───────────┼────────────────────────┤
│ Discord         │ OK        │ ok (@初号机:default)    │
│ Telegram        │ OK        │ ok (@FZMainBot:default) │
│ Feishu          │ OFF       │ not configured         │
│ openclaw-weixin │ OK        │ configured             │
└─────────────────┴───────────┴────────────────────────┘

Feishu is fully functional despite showing OFF.

Root Cause Analysis

I traced through the source code and identified the issue chain:

1. Gateway Health RPC (health-DpiT_nOq.js)

resolveHealthAccountContext() calls:

account = params.plugin.config.resolveAccount(params.cfg, params.accountId);

For Feishu, resolveAccountresolveFeishuAccountbuildResolvedFeishuAccount which correctly merges account-level credentials via mergeFeishuAccountConfig() and sets configured: Boolean(baseCreds).

Then isConfigured(account) is called, which for Feishu is:

isConfigured: (account) => account.configured

This should return true since mergeFeishuAccountConfig correctly merges accounts["main-bot"].appId into the resolved account.

2. Status Lines (channel-BrSg_Wfu.js)

The resolveStatusLines function does:

const feishuCfg = cfg.channels?.feishu;
const resolvedCredentials = inspectFeishuCredentials(feishuCfg);

inspectFeishuCredentials only checks top-level feishuCfg.appId and feishuCfg.appSecret. When using multi-account format, these are undefined at the top level, so resolvedCredentials is null, and the probe never runs.

3. Health Formatting (health-format-Cu0AxhMs.js)

const configured = typeof baseSummary.configured === "boolean" ? baseSummary.configured : null;
if (configured === false) {
    lines.push(`${label}: not configured`);

If the Gateway returns configured: false for the Feishu channel, it displays "not configured".

Expected Behavior

Health check should correctly detect Feishu as configured when credentials are stored in the accounts sub-object format.

Possible Fix

  1. In resolveStatusLines, use resolveFeishuAccount or iterate over accounts to find credentials instead of only checking top-level inspectFeishuCredentials(feishuCfg)
  2. Ensure resolveHealthAccountContext properly resolves multi-account configurations

Workaround

This is a display-only bug. Feishu works correctly despite the health check showing OFF.

extent analysis

TL;DR

The Feishu channel status shows as "not configured" due to the health check only inspecting top-level credentials, which are undefined in multi-account configurations.

Guidance

  • Review the resolveStatusLines function to ensure it correctly handles multi-account configurations by iterating over accounts to find credentials.
  • Verify that resolveHealthAccountContext properly resolves multi-account configurations.
  • Consider modifying inspectFeishuCredentials to check for credentials in the accounts sub-object format.
  • Test the health check with a single-account configuration to confirm the issue is specific to multi-account setups.

Example

const feishuCfg = cfg.channels?.feishu;
const resolvedCredentials = feishuCfg.accounts && Object.values(feishuCfg.accounts).find(account => account.appId && account.appSecret);

Notes

The issue appears to be a display-only bug, and Feishu functionality is not affected. However, fixing the health check will provide a more accurate status representation.

Recommendation

Apply a workaround by modifying the resolveStatusLines function to correctly handle multi-account configurations, as the issue is display-only and does not affect Feishu functionality.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING