mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-25 07:09:40 +00:00
* fix(exec): resume agent turn for native chat exec approvals (issue #93918) Extend the inline approval-pending path that PR #85239 added for webchat to every bundled chat channel that ships an `approval-handler.runtime` adapter (Telegram, Discord, Slack, Signal, WhatsApp, iMessage, Matrix, Google Chat, QQ Bot, plus webchat). When the originating turn can be approved in the same chat, the gateway resolves the approval in place and the agent waits inline for the command output instead of terminating the run on the "approval-pending" tool result. Before this fix, native chat approvals landed in the fire-and-forget `sendExecApprovalFollowup` path. The followup either failed silently against the agent dispatch and fell through to a direct delivery to the operator, or never reached the agent at all; either way the model never saw an "Exec running / Exec finished / Exec denied" event. The operator had to send a follow-up message to recover the turn, and a new approval was minted because the original run had already ended. The change: - Introduces `NATIVE_APPROVAL_CHANNELS` and `isNativeApprovalChannel` in `src/utils/message-channel-constants.ts`, listing the channels that ship a native chat approval client. `webchat` is included so the single-channel check inside `shouldAwaitGatewayApprovalInline` can move from "this one id" to "any native approval client". - Replaces the `INTERNAL_MESSAGE_CHANNEL` equality check in `shouldAwaitGatewayApprovalInline` with `isNativeApprovalChannel`, preserving the `approvalFollowupMode` opt-out and the existing `unavailableReason === null` gate. - Adds unit tests asserting inline resolution and inline denial for every native approval channel, plus a regression test that non-native channels (e.g. feishu) and explicit `approvalFollowupMode` settings still take the fire-and-forget path. - Adds a `NATIVE_APPROVAL_CHANNELS` test in `src/utils/message-channel.test.ts` to lock the membership and the negative cases. Refs https://github.com/openclaw/openclaw/issues/93918 * fix(lint): restore InternalMessageChannel type export lost during rebase Rebase on upstream/main dropped the InternalMessageChannel type alias from message-channel-constants.ts, breaking the plugin-sdk boundary .dts check ('has no exported member named InternalMessageChannel'). message-channel.ts was also re-importing the type only to re-export it, triggering the oxlint no-unused-vars rule. - Re-add 'export type InternalMessageChannel = typeof INTERNAL_MESSAGE_CHANNEL' in message-channel-constants.ts so the public re-export is valid. - Drop the redundant 'type InternalMessageChannel' from the local import in message-channel.ts; the value-side import is what the file body actually needs. * test(exec): align native approval routing expectations