openclaw/openclaw · error · Error

ClickClack discussions require exactly one enabled discussio

Error message

ClickClack discussions require exactly one enabled discussion account

What it means

Thrown by DiscussionService.open when discussionAccounts(config) returns more than one enabled ClickClack account. The discussion subsystem supports exactly one enabled discussion account at a time to avoid ambiguity in channel binding ownership.

Source

Thrown at extensions/clickclack/src/discussions/service.ts:187

          return { state: "none" };
        }
        this.#finalizePendingBinding(sessionKey, existing);
        await this.#reconcileBinding(sessionKey, existing, resolved.account);
        const current = this.#store.get(sessionKey);
        if (!current) {
          return { state: this.hasEnabledAccount() ? "available" : "none" };
        }
        return discussionInfoForBinding(current, resolved.account);
      }
      return { state: "available" };
    });
  }

  async open(sessionKey: string): Promise<SessionDiscussionInfo> {
    return await this.#withSessionLock(sessionKey, async () => {
      const accounts = discussionAccounts(this.#currentConfig());
      if (accounts.length > 1) {
        throw new Error("ClickClack discussions require exactly one enabled discussion account");
      }
      const account = accounts[0];
      if (!account) {
        return { state: "none" };
      }
      const existing = this.#store.get(sessionKey);
      if (existing) {
        const resolved = await this.#resolveBindingForUse(existing);
        if (resolved.state === "retargeted") {
          this.#revokeAndDeleteBinding(sessionKey, existing);
        } else if (resolved.state === "stale") {
          await this.#releaseStaleBinding(sessionKey, existing);
        } else if (resolved.state === "active") {
          this.#finalizePendingBinding(sessionKey, existing);
          await this.#reconcileBinding(sessionKey, existing, resolved.account);
          const current = this.#store.get(sessionKey);
          if (current) {
            return discussionInfoForBinding(current, resolved.account);

View on GitHub (pinned to 01804a7531)

Solutions

  1. Edit openclaw config to set enabled: true on exactly one ClickClack account that owns discussions.
  2. Disable or remove the extra ClickClaw account entries from config.
  3. Run openclaw configure to interactively select the single discussion account.
  4. Run openclaw doctor --fix to detect and report the multi-account discussion conflict.

Example fix

// before: two accounts enabled
{
  "clickclack": {
    "accounts": [
      { "accountId": "prod", "enabled": true, "discussions": { "enabled": true } },
      { "accountId": "staging", "enabled": true, "discussions": { "enabled": true } }
    ]
  }
}
// after: exactly one discussion account
{
  "clickclack": {
    "accounts": [
      { "accountId": "prod", "enabled": true, "discussions": { "enabled": true } },
      { "accountId": "staging", "enabled": false }
    ]
  }
}
Defensive patterns

Strategy: validation

Validate before calling

import { discussionAccounts } from "./discussions/eligibility.js";

function validateSingleDiscussionAccount(cfg: CoreConfig): void {
  const accounts = discussionAccounts(cfg);
  if (accounts.length > 1) {
    throw new Error(
      `Expected exactly one enabled ClickClack discussion account, found ${accounts.length}: ${accounts.map((a) => a.accountId).join(", ")}`,
    );
  }
}

Prevention

When it happens

Trigger: Calling DiscussionService.open when the ClickClaw config has two or more accounts with discussions enabled (enabled: true). Each account would produce a different binding destination, so the service refuses to pick.

Common situations: Operator adds a second ClickClaw account for testing or migration but forgets to disable the old one; config merge or environment override accidentally enables a second account; multi-account config intended for gateway use but discussions only supports one.

Related errors


AI-assisted analysis of openclaw/openclaw@01804a7531 (2026-08-12). Data as JSON: /api/errors/dd6a0ef290ea93a5. Report an issue: GitHub.