


























@@ -391,7 +391,7 @@ describe("normalizeCompatibilityConfigValues", () => {
391391expect(res.changes).toStrictEqual([]);
392392});
393393394-it("moves WhatsApp access defaults into accounts.default for named accounts", () => {
394+it("preserves inherited WhatsApp access policy when seeding accounts.default", () => {
395395const res = normalizeCompatibilityConfigValues({
396396channels: {
397397whatsapp: {
@@ -420,10 +420,145 @@ describe("normalizeCompatibilityConfigValues", () => {
420420groupPolicy: "open",
421421groupAllowFrom: [],
422422});
423+expect(res.config.channels?.whatsapp?.accounts?.work).toEqual({
424+enabled: true,
425+authDir: "/tmp/wa-work",
426+dmPolicy: "allowlist",
427+allowFrom: ["+15550001111"],
428+groupPolicy: "open",
429+groupAllowFrom: [],
430+});
423431expect(res.changes).toContain(
424432"Moved channels.whatsapp single-account top-level values into channels.whatsapp.accounts.default.",
425433);
426434});
435+436+it.each(["discord", "slack", "telegram", "signal", "imessage", "irc"])(
437+"preserves inherited %s access policy when seeding accounts.default",
438+(channelId) => {
439+const res = normalizeCompatibilityConfigValues({
440+channels: {
441+[channelId]: {
442+dmPolicy: "allowlist",
443+allowFrom: ["sender-1"],
444+groupPolicy: "allowlist",
445+groupAllowFrom: ["group-sender-1"],
446+accounts: {
447+work: {
448+enabled: true,
449+},
450+},
451+},
452+},
453+} as unknown as OpenClawConfig);
454+const channel = (res.config.channels as Record<string, { accounts?: Record<string, unknown> }>)?.[
455+channelId
456+];
457+458+expect(channel?.accounts?.default).toEqual({
459+dmPolicy: "allowlist",
460+allowFrom: ["sender-1"],
461+groupPolicy: "allowlist",
462+groupAllowFrom: ["group-sender-1"],
463+});
464+expect(channel?.accounts?.work).toEqual({
465+enabled: true,
466+dmPolicy: "allowlist",
467+allowFrom: ["sender-1"],
468+groupPolicy: "allowlist",
469+groupAllowFrom: ["group-sender-1"],
470+});
471+},
472+);
473+474+it("keeps named-account access policy overrides when seeding accounts.default", () => {
475+const res = normalizeCompatibilityConfigValues({
476+channels: {
477+discord: {
478+dmPolicy: "allowlist",
479+allowFrom: ["top-dm"],
480+groupPolicy: "allowlist",
481+groupAllowFrom: ["top-group"],
482+accounts: {
483+work: {
484+token: "work-token",
485+allowFrom: ["work-dm"],
486+groupPolicy: "disabled",
487+},
488+},
489+},
490+},
491+} as unknown as OpenClawConfig);
492+493+expect(res.config.channels?.discord?.accounts?.work).toEqual({
494+token: "work-token",
495+dmPolicy: "allowlist",
496+allowFrom: ["work-dm"],
497+groupPolicy: "disabled",
498+groupAllowFrom: ["top-group"],
499+});
500+});
501+502+it("preserves inherited Mattermost access policy when seeding accounts.default", () => {
503+const res = normalizeCompatibilityConfigValues({
504+channels: {
505+mattermost: {
506+dmPolicy: "open",
507+groupPolicy: "open",
508+allowFrom: ["*"],
509+groupAllowFrom: ["*"],
510+accounts: {
511+tony: {
512+name: "Tony",
513+enabled: true,
514+botToken: "tony-token",
515+groups: {
516+tboek5jq9fremk5ecmd6n7f5nw: { requireMention: false },
517+},
518+},
519+research: {
520+name: "Research",
521+enabled: true,
522+botToken: "research-token",
523+},
524+},
525+},
526+},
527+});
528+529+expect(res.config.channels?.mattermost?.dmPolicy).toBeUndefined();
530+expect(res.config.channels?.mattermost?.allowFrom).toBeUndefined();
531+expect(res.config.channels?.mattermost?.groupPolicy).toBeUndefined();
532+expect(res.config.channels?.mattermost?.groupAllowFrom).toBeUndefined();
533+expect(res.config.channels?.mattermost?.accounts?.default).toEqual({
534+dmPolicy: "open",
535+groupPolicy: "open",
536+allowFrom: ["*"],
537+groupAllowFrom: ["*"],
538+});
539+expect(res.config.channels?.mattermost?.accounts?.tony).toEqual({
540+name: "Tony",
541+enabled: true,
542+botToken: "tony-token",
543+dmPolicy: "open",
544+groupPolicy: "open",
545+allowFrom: ["*"],
546+groupAllowFrom: ["*"],
547+groups: {
548+tboek5jq9fremk5ecmd6n7f5nw: { requireMention: false },
549+},
550+});
551+expect(res.config.channels?.mattermost?.accounts?.research).toEqual({
552+name: "Research",
553+enabled: true,
554+botToken: "research-token",
555+dmPolicy: "open",
556+groupPolicy: "open",
557+allowFrom: ["*"],
558+groupAllowFrom: ["*"],
559+});
560+});
561+427562it("migrates browser ssrfPolicy allowPrivateNetwork to dangerouslyAllowPrivateNetwork", () => {
428563const res = normalizeCompatibilityConfigValues({
429564browser: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。