diff --git a/CHANGELOG.md b/CHANGELOG.md index 94c83f33676..c0493abf789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- Feishu/default account resolution: always honor explicit `channels.feishu.defaultAccount` during outbound account selection (including top-level-credential setups where the preferred id is not present in `accounts`), instead of silently falling back to another account id. (#32253) Thanks @bmendonca3. - Gemini schema sanitization: coerce malformed JSON Schema `properties` values (`null`, arrays, primitives) to `{}` before provider validation, preventing downstream strict-validator crashes on invalid plugin/tool schemas. (#32332) Thanks @webdevtodayjason. - OpenAI/Responses WebSocket tool-call id hygiene: normalize blank/whitespace streamed tool-call ids before persistence, and block empty `function_call_output.call_id` payloads in the WS conversion path to avoid OpenAI 400 errors (`Invalid 'input[n].call_id': empty string`), with regression coverage for both inbound stream normalization and outbound payload guards. - Gateway/Control UI basePath webhook passthrough: let non-read methods under configured `controlUiBasePath` fall through to plugin routes (instead of returning Control UI 405), restoring webhook handlers behind basePath mounts. (#32311) Thanks @ademczuk. diff --git a/extensions/feishu/src/accounts.test.ts b/extensions/feishu/src/accounts.test.ts index f32bfa12e4d..3b83bb9a931 100644 --- a/extensions/feishu/src/accounts.test.ts +++ b/extensions/feishu/src/accounts.test.ts @@ -66,6 +66,26 @@ describe("resolveDefaultFeishuAccountId", () => { }); describe("resolveFeishuAccount", () => { + it("uses top-level credentials with configured default account id even without account map entry", () => { + const cfg = { + channels: { + feishu: { + defaultAccount: "router-d", + appId: "top_level_app", + appSecret: "top_level_secret", + accounts: { + default: { appId: "cli_default", appSecret: "secret_default" }, + }, + }, + }, + }; + + const account = resolveFeishuAccount({ cfg: cfg as never, accountId: undefined }); + expect(account.accountId).toBe("router-d"); + expect(account.configured).toBe(true); + expect(account.appId).toBe("top_level_app"); + }); + it("uses configured default account when accountId is omitted", () => { const cfg = { channels: {