openclaw - ✅(Solved) Fix [Bug]: Control UI exec approvals fail in multi-channel setups because exec.approval.resolve is sent without channel/sourceChannel [2 pull requests, 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#54855Fetched 2026-04-08 01:35:12
View on GitHub
Comments
0
Participants
1
Timeline
6
Reactions
0
Author
Participants
Timeline (top)
cross-referenced ×2labeled ×2referenced ×2

Control UI exec approvals fail in multi-channel setups; clicking Allow does not approve the command, and gateway logs require an explicit channel.

Root Cause

Control UI exec approvals fail in multi-channel setups; clicking Allow does not approve the command, and gateway logs require an explicit channel.

Fix Action

Fix / Workaround

Affected users/systems/channels: Control UI users with multiple enabled channels Severity: High Frequency: Reproduced consistently while both feishu and openclaw-weixin were enabled Consequence: Exec approvals from Control UI fail, forcing manual terminal workarounds or temporary channel disabling

Temporary workaround: disable one channel (for example openclaw-weixin), which restores approvals. This is not acceptable for setups that need multiple channels active.

PR fix notes

PR #54926: fix: include channel in Control UI exec approval resolve for multi-channel setups

Description (problem / solution / changelog)

Fixes #54855

Problem

Control UI sends exec.approval.resolve with only {id, decision} — no channel field. In multi-channel setups, the gateway rejects this with 'Channel is required'.

Fix

  1. Added optional channel field to ExecApprovalResolveParamsSchema
  2. Control UI now sends channel: 'control' in approval resolve requests
  3. Gateway passes resolvedChannel in the broadcast

Impact

Exec approvals from Control UI now work correctly in multi-channel setups.

Changed files

  • src/gateway/protocol/schema/exec-approvals.ts (modified, +1/-0)
  • src/gateway/server-methods/exec-approval.ts (modified, +10/-2)
  • ui/src/ui/app.ts (modified, +1/-0)

PR #54941: fix(ui): include sourceChannel in exec.approval.resolve from Control UI to fix multi-channel setups

Description (problem / solution / changelog)

Summary

In multi-channel setups (e.g. feishu + openclaw-weixin), clicking Allow in the Control UI exec approval dialog fails silently with unknown or expired approval id. The gateway logs show:

Channel is required when multiple channels are configured: feishu, openclaw-weixin

Root Cause

The Control UI was sending exec.approval.resolve with only { id, decision } — no channel context. The gateway needs channel info to route the resolution when multiple channels are configured.

The approval request (exec.approval.requested) already carries turnSourceChannel in request.request, but the UI neither captured nor forwarded it.

Additionally, ExecApprovalResolveParamsSchema had additionalProperties: false with only id and decision — any extra field would have been rejected.

Changes

  • src/gateway/protocol/schema/exec-approvals.ts — add optional sourceChannel field to ExecApprovalResolveParamsSchema
  • ui/src/ui/controllers/exec-approval.ts — add sourceChannel? to ExecApprovalRequest type; parse turnSourceChannel from the incoming exec.approval.requested payload
  • ui/src/ui/app.ts — forward sourceChannel in the exec.approval.resolve call when present
  • src/gateway/server-methods/exec-approval.ts — update the server-side cast to accept the optional sourceChannel field

Workaround (before this fix)

Temporarily disable one channel so only a single channel is active.

Fixes #54855


AI Assistance

  • AI-assisted (Claude Sonnet 4.6 via OpenClaw)
  • Lightly tested — pnpm check (lint, format, type checks, boundary checks) passed; targeted unit tests added/verified
  • Full pnpm build && pnpm test not run (CI will validate)
  • Code reviewed and understood by human author
  • Codex review not run locally; CI Codex review will apply

Changed files

  • apps/macos/Sources/OpenClawProtocol/GatewayModels.swift (modified, +5/-1)
  • apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift (modified, +5/-1)
  • src/gateway/protocol/schema/exec-approvals.ts (modified, +1/-0)
  • src/gateway/server-methods/exec-approval.ts (modified, +1/-1)
  • src/tasks/task-executor.test.ts (modified, +5/-1)
  • ui/src/ui/app.ts (modified, +1/-0)
  • ui/src/ui/controllers/exec-approval.ts (modified, +3/-0)

Code Example

Gateway log:

Channel is required when multiple channels are configured: feishu, openclaw-weixin
User-visible symptom:

unknown or expired approval id
Built Control UI bundle shows approval resolution logic equivalent to:

await this.client.request("exec.approval.resolve", {
id: active.id,
decision,
});
RAW_BUFFERClick to expand / collapse

Bug type

Behavior bug (incorrect output/state without crash)

Summary

Control UI exec approvals fail in multi-channel setups; clicking Allow does not approve the command, and gateway logs require an explicit channel.

Steps to reproduce

Enable both feishu and openclaw-weixin on OpenClaw 2026.3.24. Open Control UI. Trigger any command that requires exec approval. Click Allow in the approval dialog. Observe the command does not continue and gateway logs show: Channel is required when multiple channels are configured: feishu, openclaw-weixin

Expected behavior

Exec approvals from Control UI should succeed even when multiple channels are enabled.

Actual behavior

The approval dialog appears and Allow is clicked, but the command does not continue. The failure later surfaces as: unknown or expired approval id

Gateway logs show: Channel is required when multiple channels are configured: feishu, openclaw-weixin

Local Control UI bundle inspection also shows exec.approval.resolve is sent with only { id, decision }, without channel / sourceChannel.

OpenClaw version

2026.3.24

Operating system

Ubuntu 24.04

Install method

npm global

Model

gpt-5.4

Provider / routing chain

openclaw -> local gateway -> local OpenAI-compatible provider(s)

Additional provider/model setup details

The issue is not model-specific. It reproduces on the Control UI exec approval path and correlates with multiple enabled channels (feishu + openclaw-weixin).

Logs, screenshots, and evidence

Gateway log:

Channel is required when multiple channels are configured: feishu, openclaw-weixin
User-visible symptom:

unknown or expired approval id
Built Control UI bundle shows approval resolution logic equivalent to:

await this.client.request("exec.approval.resolve", {
id: active.id,
decision,
});

Impact and severity

Affected users/systems/channels: Control UI users with multiple enabled channels Severity: High Frequency: Reproduced consistently while both feishu and openclaw-weixin were enabled Consequence: Exec approvals from Control UI fail, forcing manual terminal workarounds or temporary channel disabling

Additional information

Temporary workaround: disable one channel (for example openclaw-weixin), which restores approvals. This is not acceptable for setups that need multiple channels active.

Suspected fix direction:

preserve channel / sourceChannel from exec.approval.requested include it when calling exec.approval.resolve

extent analysis

Fix Plan

To resolve the issue, we need to modify the approval resolution logic to include the channel/sourceChannel when calling exec.approval.resolve.

  • Update the exec.approval.resolve request to include the channel/sourceChannel.
  • Preserve the channel/sourceChannel from exec.approval.requested and store it for later use.

Example code changes:

// Store the channel/sourceChannel when exec.approval.requested is received
const approvalRequestedHandler = async (data) => {
  // ...
  active.channel = data.channel;
  active.sourceChannel = data.sourceChannel;
  // ...
};

// Include the channel/sourceChannel when calling exec.approval.resolve
const resolveApproval = async (id, decision) => {
  await this.client.request("exec.approval.resolve", {
    id: id,
    decision: decision,
    channel: active.channel,
    sourceChannel: active.sourceChannel,
  });
};

Verification

To verify the fix, enable both feishu and openclaw-weixin channels, trigger a command that requires exec approval, and click Allow in the approval dialog. The command should now continue, and the gateway logs should no longer show the "Channel is required" error.

Extra Tips

  • Ensure that the exec.approval.requested event includes the channel/sourceChannel in its payload.
  • Test the fix with different channel combinations to ensure it works consistently.
  • Consider adding logging or monitoring to detect and report any future issues with exec approvals.

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…

FAQ

Expected behavior

Exec approvals from Control UI should succeed even when multiple channels are enabled.

Still need to ship something?

×6

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

Back to top recommendations

TRENDING