diff --git a/extensions/whatsapp/src/setup-finalize.ts b/extensions/whatsapp/src/setup-finalize.ts index 05314877e9b..f0e3a1b94e1 100644 --- a/extensions/whatsapp/src/setup-finalize.ts +++ b/extensions/whatsapp/src/setup-finalize.ts @@ -10,7 +10,11 @@ import { } from "openclaw/plugin-sdk/setup"; import type { ChannelSetupWizard } from "openclaw/plugin-sdk/setup"; import { formatCliCommand, formatDocsLink } from "openclaw/plugin-sdk/setup-tools"; -import { resolveWhatsAppAccount, resolveWhatsAppAuthDir } from "./accounts.js"; +import { + resolveDefaultWhatsAppAccountId, + resolveWhatsAppAccount, + resolveWhatsAppAuthDir, +} from "./accounts.js"; import { loginWeb } from "./login.js"; import { whatsappSetupAdapter } from "./setup-core.js"; @@ -333,19 +337,20 @@ export async function finalizeWhatsAppSetup(params: { prompter: SetupPrompter; runtime: SetupRuntime; }) { + const accountId = params.accountId.trim() || resolveDefaultWhatsAppAccountId(params.cfg); let next = - params.accountId === DEFAULT_ACCOUNT_ID + accountId === DEFAULT_ACCOUNT_ID ? params.cfg : whatsappSetupAdapter.applyAccountConfig({ cfg: params.cfg, - accountId: params.accountId, + accountId, input: {}, }); - const linked = await detectWhatsAppLinked(next, params.accountId); + const linked = await detectWhatsAppLinked(next, accountId); const { authDir } = resolveWhatsAppAuthDir({ cfg: next, - accountId: params.accountId, + accountId, }); if (!linked) { @@ -365,7 +370,7 @@ export async function finalizeWhatsAppSetup(params: { }); if (wantsLink) { try { - await loginWeb(false, undefined, params.runtime, params.accountId); + await loginWeb(false, undefined, params.runtime, accountId); } catch (error) { params.runtime.error(`WhatsApp login failed: ${String(error)}`); await params.prompter.note( @@ -382,7 +387,7 @@ export async function finalizeWhatsAppSetup(params: { next = await promptWhatsAppDmAccess({ cfg: next, - accountId: params.accountId, + accountId, forceAllowFrom: params.forceAllowFrom, prompter: params.prompter, }); diff --git a/extensions/whatsapp/src/setup-surface.test.ts b/extensions/whatsapp/src/setup-surface.test.ts index 0ea3e6cc9d1..6d23e2142a3 100644 --- a/extensions/whatsapp/src/setup-surface.test.ts +++ b/extensions/whatsapp/src/setup-surface.test.ts @@ -248,6 +248,45 @@ describe("whatsapp setup wizard", () => { ); }); + it("uses configured defaultAccount for omitted-account finalize writes", async () => { + hoisted.pathExists.mockResolvedValue(true); + const harness = createSeparatePhoneHarness({ + selectValues: ["separate", "open"], + }); + + const result = expectFinalizeResult( + await runFinalizeWithHarness({ + harness, + accountId: "", + cfg: { + channels: { + whatsapp: { + defaultAccount: "work", + dmPolicy: "disabled", + allowFrom: ["+15555550123"], + accounts: { + work: { + authDir: "/tmp/work", + }, + }, + }, + }, + }, + }), + ); + + expect(result.cfg.channels?.whatsapp?.dmPolicy).toBe("disabled"); + expect(result.cfg.channels?.whatsapp?.allowFrom).toEqual(["+15555550123"]); + expect(result.cfg.channels?.whatsapp?.accounts?.work?.dmPolicy).toBe("open"); + expect(result.cfg.channels?.whatsapp?.accounts?.work?.allowFrom).toEqual(["*", "+15555550123"]); + expect(harness.note).toHaveBeenCalledWith( + expect.stringContaining( + "`channels.whatsapp.accounts.work.dmPolicy` + `channels.whatsapp.accounts.work.allowFrom`", + ), + "WhatsApp DM access", + ); + }); + it("normalizes allowFrom entries when list mode is selected", async () => { const { result } = await runSeparatePhoneFlow({ selectValues: ["separate", "allowlist", "list"],