openclaw/openclaw · critical · Error

ClickClack channel not found: ${channel}

Error message

ClickClack channel not found: ${channel}

What it means

Thrown by resolveChannelId when the configured or input channel identifier (name or id) doesn't match any channel returned by client.channels(workspaceId). The channel doesn't exist in the workspace or the bot can't see it.

Source

Thrown at extensions/clickclack/src/resolve.ts:41

/**
 * Resolves a channel name/id from config or target input to a ClickClack
 * channel id.
 */
export async function resolveChannelId(
  client: ClickClackClient,
  workspaceId: string,
  channel: string,
) {
  if (channel.startsWith("chn_")) {
    return channel;
  }
  const channels = await client.channels(workspaceId);
  const found = channels.find(
    (candidate) => candidate.id === channel || candidate.name === channel,
  );
  if (!found) {
    throw new Error(`ClickClack channel not found: ${channel}`);
  }
  return found.id;
}

View on GitHub (pinned to 01804a7531)

Solutions

  1. Verify the channel name/id exists in the target ClickClack workspace.
  2. Use the channel id (prefixed with chn_) directly to avoid name ambiguity.
  3. Ensure the bot is a member of the channel, especially for private channels.
  4. List channels via the ClickClack API to find the correct identifier.

Example fix

// before: channel name that may not resolve
const channelId = await resolveChannelId(client, workspaceId, "general-discussion");
// after: use the stable channel id
const channelId = await resolveChannelId(client, workspaceId, "chn_xyz789abc");
Defensive patterns

Strategy: validation

Validate before calling

import { resolveChannelId } from "./resolve.js";

// Validate before use
const channels = await client.channels(workspaceId);
const configured = config.channel;
const exists = channels.some((c) => c.id === configured || c.name === configured);
if (!exists && !configured.startsWith("chn_")) {
  throw new Error(`Channel "${configured}" not found in workspace ${workspaceId}.`);
}

Try / catch

try {
  const channelId = await resolveChannelId(client, workspaceId, channel);
} catch (error) {
  if (error instanceof Error && error.message.includes("channel not found")) {
    logger.error(`Channel "${channel}" not found in workspace. Available: ${channels.map((c) => c.name).join(", ")}`);
  }
  throw error;
}

Prevention

When it happens

Trigger: Channel resolution is called with a channel name or id that doesn't match any channel in the workspace's channel list. The bot token doesn't have visibility of the channel, or it was deleted.

Common situations: Channel was deleted or renamed; bot wasn't added to the channel; typo in channel name/id in config or target input; channel is private and bot lacks membership; workspace context mismatch.

Related errors


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