diff --git a/CHANGELOG.md b/CHANGELOG.md index 38ab71353fd..9820d785fb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,7 +76,6 @@ Docs: https://docs.openclaw.ai - Auth/failover: persist selected fallback overrides before retrying, shorten `auth_permanent` lockouts, and refresh websocket/shared-auth sessions only when real auth changes occur so retries and secret rotations behave predictably. (#60404, #60323, #60387) Thanks @extrasmall0 and @mappel-nv. - CLI/Commander: preserve Commander-computed exit codes for argument and help-error paths, and cover the user-argv parse mode in the regression tests so invalid CLI invocations no longer report success when exits are intercepted. (#60923) Thanks @Linux2010. - CLI/skills JSON: route `skills list --json`, `skills info --json`, and `skills check --json` output to stdout instead of stderr so machine-readable consumers receive JSON on the expected stream again. (#60914; fixes #57599; landed from contributor PR #57611 by @Aftabbs) Thanks @Aftabbs. -<<<<<<< HEAD - Config/All Settings: keep the raw config view intact when sensitive fields are blank instead of corrupting or dropping the rendered snapshot. (#28214) Thanks @solodmd. - Control UI/avatar: honor `ui.assistant.avatar` when serving `/avatar/:agentId` so Appearance UI avatar paths stop falling back to initials placeholders. (#60778) Thanks @hannasdev. - Control UI/chat: add a per-session thinking-level picker in the chat header and mobile chat settings, and keep the browser bundle on UI-local thinking/session-key helpers so Safari no longer crashes on Node-only imports before rendering chat controls. diff --git a/extensions/matrix/src/exec-approval-resolver.ts b/extensions/matrix/src/exec-approval-resolver.ts index f02a304e301..cf065211fda 100644 --- a/extensions/matrix/src/exec-approval-resolver.ts +++ b/extensions/matrix/src/exec-approval-resolver.ts @@ -1,36 +1,9 @@ import type { ExecApprovalReplyDecision } from "openclaw/plugin-sdk/approval-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { isApprovalNotFoundError } from "openclaw/plugin-sdk/error-runtime"; import { createOperatorApprovalsGatewayClient } from "openclaw/plugin-sdk/gateway-runtime"; -const INVALID_REQUEST = "INVALID_REQUEST"; -const APPROVAL_NOT_FOUND = "APPROVAL_NOT_FOUND"; - -function readErrorCode(value: unknown): string | null { - return typeof value === "string" && value.trim() ? value : null; -} - -function readApprovalNotFoundDetailsReason(value: unknown): string | null { - if (!value || typeof value !== "object" || Array.isArray(value)) { - return null; - } - const reason = (value as { reason?: unknown }).reason; - return typeof reason === "string" && reason.trim() ? reason : null; -} - -export function isApprovalNotFoundError(err: unknown): boolean { - if (!(err instanceof Error)) { - return false; - } - const gatewayCode = readErrorCode((err as { gatewayCode?: unknown }).gatewayCode); - if (gatewayCode === APPROVAL_NOT_FOUND) { - return true; - } - const detailsReason = readApprovalNotFoundDetailsReason((err as { details?: unknown }).details); - if (gatewayCode === INVALID_REQUEST && detailsReason === APPROVAL_NOT_FOUND) { - return true; - } - return /unknown or expired approval id/i.test(err.message); -} +export { isApprovalNotFoundError }; export async function resolveMatrixExecApproval(params: { cfg: OpenClawConfig;