fix(release): cut v2026.4.12-2 #855
Annotations
10 errors and 1 warning
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L56
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /SETUP INSTRUCTIONS|HOW TO CONNECT|COM…/
- Expected:
/SETUP INSTRUCTIONS|HOW TO CONNECT|COMPLETE SETUP/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(
|
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L49
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /Project/
- Expected:
/Project/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(error));
})
.finally(() => {
if (!cancelled) {
|
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L34
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /Start QR Linking/
- Expected:
/Start QR Linking/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(error));
})
.finally(() => {
if (!ca
|
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L29
AssertionError: expected 'import { useCallback, useEffect, useM…' to contain 'Link a Device'
- Expected
+ Received
- Link a Device
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
+ import {
+ BotIcon,
+ ExternalLinkIcon,
+ LoaderIcon,
+ MessageSquareMoreIcon,
+ QrCodeIcon,
+ RefreshCcwIcon,
+ Settings2Icon,
+ SmartphoneIcon,
+ Trash2Icon,
+ } from "lucide-react";
+ import { Badge } from "@/components/ui/badge";
+ import { Button } from "@/components/ui/button";
+ import { Input } from "@/components/ui/input";
+ import {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+ } from "@/components/ui/sheet";
+ import { cn } from "@/lib/utils";
+ import type {
+ OpenClawMessagingChannel,
+ SidecarClient,
+ } from "@/lib/sidecar/client";
+ import { MESSAGING_CHANNEL_DESCRIPTIONS } from "./messaging-channel-descriptions";
+
+ interface MessagingConnectionsPanelProps {
+ client: SidecarClient | null;
+ }
+
+ type ChannelId = "telegram" | "whatsapp";
+ type PanelMode = "unavailable" | "default";
+
+ const CHANNEL_META = {
+ telegram: {
+ icon: BotIcon,
+ label: "Telegram",
+ },
+ whatsapp: {
+ icon: SmartphoneIcon,
+ label: "WhatsApp",
+ },
+ } satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
+
+ export function MessagingConnectionsPanel({
+ client,
+ }: MessagingConnectionsPanelProps) {
+ const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
+ const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
+ const [telegramBotToken, setTelegramBotToken] = useState("");
+ const [whatsAppLog, setWhatsAppLog] = useState("");
+ const [feedback, setFeedback] = useState<string | null>(null);
+ const [errorMessage, setErrorMessage] = useState<string | null>(null);
+ const [panelMode, setPanelMode] = useState<PanelMode>("default");
+ const [isLoading, setIsLoading] = useState(false);
+ const [isRefreshing, setIsRefreshing] = useState(false);
+ const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
+ const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
+ const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
+ const whatsAppAbortRef = useRef<AbortController | null>(null);
+
+ const channelById = useMemo(
+ () =>
+ Object.fromEntries(
+ channels.map((channel) => [channel.channelId, channel]),
+ ) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
+ [channels],
+ );
+
+ const loadChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ const nextChannels = await client.listOpenClawMessagingChannels();
+ setChannels(nextChannels);
+ setPanelMode("default");
+ }, [client]);
+
+ const refreshChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ setIsRefreshing(true);
+ try {
+ await loadChannels();
+ setErrorMessage(null);
+ } catch (error) {
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.",
+ );
+ } else {
+ setErrorMessage(getErrorMessage(error));
+ }
+ } finally {
+ setIsRefreshing(false);
+ }
+ }, [client, loadChannels]);
+
+ useEffect(() => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ let cancelled = false;
+ setIsLoading(true);
+ setErrorMessage(null);
+
+ void loadChannels()
+ .catch((error: unknown) => {
+ if (cancelled) {
+ return;
+ }
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the curren
|
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L21
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /Start QR Linking/
- Expected:
/Start QR Linking/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(error));
})
.finally(() => {
if (!ca
|
|
test/ui/whatsapp-setup-expanded-instructions.test.ts#L16
AssertionError: expected 'import { useCallback, useEffect, useM…' to contain 'HOW TO CONNECT'
- Expected
+ Received
- HOW TO CONNECT
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
+ import {
+ BotIcon,
+ ExternalLinkIcon,
+ LoaderIcon,
+ MessageSquareMoreIcon,
+ QrCodeIcon,
+ RefreshCcwIcon,
+ Settings2Icon,
+ SmartphoneIcon,
+ Trash2Icon,
+ } from "lucide-react";
+ import { Badge } from "@/components/ui/badge";
+ import { Button } from "@/components/ui/button";
+ import { Input } from "@/components/ui/input";
+ import {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+ } from "@/components/ui/sheet";
+ import { cn } from "@/lib/utils";
+ import type {
+ OpenClawMessagingChannel,
+ SidecarClient,
+ } from "@/lib/sidecar/client";
+ import { MESSAGING_CHANNEL_DESCRIPTIONS } from "./messaging-channel-descriptions";
+
+ interface MessagingConnectionsPanelProps {
+ client: SidecarClient | null;
+ }
+
+ type ChannelId = "telegram" | "whatsapp";
+ type PanelMode = "unavailable" | "default";
+
+ const CHANNEL_META = {
+ telegram: {
+ icon: BotIcon,
+ label: "Telegram",
+ },
+ whatsapp: {
+ icon: SmartphoneIcon,
+ label: "WhatsApp",
+ },
+ } satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
+
+ export function MessagingConnectionsPanel({
+ client,
+ }: MessagingConnectionsPanelProps) {
+ const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
+ const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
+ const [telegramBotToken, setTelegramBotToken] = useState("");
+ const [whatsAppLog, setWhatsAppLog] = useState("");
+ const [feedback, setFeedback] = useState<string | null>(null);
+ const [errorMessage, setErrorMessage] = useState<string | null>(null);
+ const [panelMode, setPanelMode] = useState<PanelMode>("default");
+ const [isLoading, setIsLoading] = useState(false);
+ const [isRefreshing, setIsRefreshing] = useState(false);
+ const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
+ const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
+ const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
+ const whatsAppAbortRef = useRef<AbortController | null>(null);
+
+ const channelById = useMemo(
+ () =>
+ Object.fromEntries(
+ channels.map((channel) => [channel.channelId, channel]),
+ ) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
+ [channels],
+ );
+
+ const loadChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ const nextChannels = await client.listOpenClawMessagingChannels();
+ setChannels(nextChannels);
+ setPanelMode("default");
+ }, [client]);
+
+ const refreshChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ setIsRefreshing(true);
+ try {
+ await loadChannels();
+ setErrorMessage(null);
+ } catch (error) {
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.",
+ );
+ } else {
+ setErrorMessage(getErrorMessage(error));
+ }
+ } finally {
+ setIsRefreshing(false);
+ }
+ }, [client, loadChannels]);
+
+ useEffect(() => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ let cancelled = false;
+ setIsLoading(true);
+ setErrorMessage(null);
+
+ void loadChannels()
+ .catch((error: unknown) => {
+ if (cancelled) {
+ return;
+ }
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the curr
|
|
test/ui/whatsapp-pending-guidance.test.ts#L48
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /type.*===.*connection\.type|filter.*t…/
- Expected:
/type.*===.*connection\.type|filter.*type/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(error));
|
|
test/ui/whatsapp-pending-guidance.test.ts#L36
AssertionError: expected 'import { useCallback, useEffect, useM…' to match /Connected/
- Expected:
/Connected/
+ Received:
"import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";
import {
BotIcon,
ExternalLinkIcon,
LoaderIcon,
MessageSquareMoreIcon,
QrCodeIcon,
RefreshCcwIcon,
Settings2Icon,
SmartphoneIcon,
Trash2Icon,
} from \"lucide-react\";
import { Badge } from \"@/components/ui/badge\";
import { Button } from \"@/components/ui/button\";
import { Input } from \"@/components/ui/input\";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from \"@/components/ui/sheet\";
import { cn } from \"@/lib/utils\";
import type {
OpenClawMessagingChannel,
SidecarClient,
} from \"@/lib/sidecar/client\";
import { MESSAGING_CHANNEL_DESCRIPTIONS } from \"./messaging-channel-descriptions\";
interface MessagingConnectionsPanelProps {
client: SidecarClient | null;
}
type ChannelId = \"telegram\" | \"whatsapp\";
type PanelMode = \"unavailable\" | \"default\";
const CHANNEL_META = {
telegram: {
icon: BotIcon,
label: \"Telegram\",
},
whatsapp: {
icon: SmartphoneIcon,
label: \"WhatsApp\",
},
} satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
export function MessagingConnectionsPanel({
client,
}: MessagingConnectionsPanelProps) {
const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
const [telegramBotToken, setTelegramBotToken] = useState(\"\");
const [whatsAppLog, setWhatsAppLog] = useState(\"\");
const [feedback, setFeedback] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [panelMode, setPanelMode] = useState<PanelMode>(\"default\");
const [isLoading, setIsLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
const whatsAppAbortRef = useRef<AbortController | null>(null);
const channelById = useMemo(
() =>
Object.fromEntries(
channels.map((channel) => [channel.channelId, channel]),
) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
[channels],
);
const loadChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
const nextChannels = await client.listOpenClawMessagingChannels();
setChannels(nextChannels);
setPanelMode(\"default\");
}, [client]);
const refreshChannels = useCallback(async () => {
if (!client) {
setChannels([]);
return;
}
setIsRefreshing(true);
try {
await loadChannels();
setErrorMessage(null);
} catch (error) {
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
} else {
setErrorMessage(getErrorMessage(error));
}
} finally {
setIsRefreshing(false);
}
}, [client, loadChannels]);
useEffect(() => {
if (!client) {
setChannels([]);
return;
}
let cancelled = false;
setIsLoading(true);
setErrorMessage(null);
void loadChannels()
.catch((error: unknown) => {
if (cancelled) {
return;
}
if (isMissingOpenClawRouteError(error)) {
setPanelMode(\"unavailable\");
setChannels([]);
setErrorMessage(
\"OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.\",
);
return;
}
setErrorMessage(getErrorMessage(error));
})
.finally(() => {
if (!cancelled) {
|
|
test/ui/whatsapp-pending-guidance.test.ts#L26
AssertionError: expected 'import { useCallback, useEffect, useM…' to contain 'Complete Setup'
- Expected
+ Received
- Complete Setup
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
+ import {
+ BotIcon,
+ ExternalLinkIcon,
+ LoaderIcon,
+ MessageSquareMoreIcon,
+ QrCodeIcon,
+ RefreshCcwIcon,
+ Settings2Icon,
+ SmartphoneIcon,
+ Trash2Icon,
+ } from "lucide-react";
+ import { Badge } from "@/components/ui/badge";
+ import { Button } from "@/components/ui/button";
+ import { Input } from "@/components/ui/input";
+ import {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+ } from "@/components/ui/sheet";
+ import { cn } from "@/lib/utils";
+ import type {
+ OpenClawMessagingChannel,
+ SidecarClient,
+ } from "@/lib/sidecar/client";
+ import { MESSAGING_CHANNEL_DESCRIPTIONS } from "./messaging-channel-descriptions";
+
+ interface MessagingConnectionsPanelProps {
+ client: SidecarClient | null;
+ }
+
+ type ChannelId = "telegram" | "whatsapp";
+ type PanelMode = "unavailable" | "default";
+
+ const CHANNEL_META = {
+ telegram: {
+ icon: BotIcon,
+ label: "Telegram",
+ },
+ whatsapp: {
+ icon: SmartphoneIcon,
+ label: "WhatsApp",
+ },
+ } satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
+
+ export function MessagingConnectionsPanel({
+ client,
+ }: MessagingConnectionsPanelProps) {
+ const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
+ const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
+ const [telegramBotToken, setTelegramBotToken] = useState("");
+ const [whatsAppLog, setWhatsAppLog] = useState("");
+ const [feedback, setFeedback] = useState<string | null>(null);
+ const [errorMessage, setErrorMessage] = useState<string | null>(null);
+ const [panelMode, setPanelMode] = useState<PanelMode>("default");
+ const [isLoading, setIsLoading] = useState(false);
+ const [isRefreshing, setIsRefreshing] = useState(false);
+ const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
+ const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
+ const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
+ const whatsAppAbortRef = useRef<AbortController | null>(null);
+
+ const channelById = useMemo(
+ () =>
+ Object.fromEntries(
+ channels.map((channel) => [channel.channelId, channel]),
+ ) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
+ [channels],
+ );
+
+ const loadChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ const nextChannels = await client.listOpenClawMessagingChannels();
+ setChannels(nextChannels);
+ setPanelMode("default");
+ }, [client]);
+
+ const refreshChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ setIsRefreshing(true);
+ try {
+ await loadChannels();
+ setErrorMessage(null);
+ } catch (error) {
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.",
+ );
+ } else {
+ setErrorMessage(getErrorMessage(error));
+ }
+ } finally {
+ setIsRefreshing(false);
+ }
+ }, [client, loadChannels]);
+
+ useEffect(() => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ let cancelled = false;
+ setIsLoading(true);
+ setErrorMessage(null);
+
+ void loadChannels()
+ .catch((error: unknown) => {
+ if (cancelled) {
+ return;
+ }
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the curr
|
|
test/ui/whatsapp-pending-guidance.test.ts#L16
AssertionError: expected 'import { useCallback, useEffect, useM…' to contain 'scan QR to link'
- Expected
+ Received
- scan QR to link
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
+ import {
+ BotIcon,
+ ExternalLinkIcon,
+ LoaderIcon,
+ MessageSquareMoreIcon,
+ QrCodeIcon,
+ RefreshCcwIcon,
+ Settings2Icon,
+ SmartphoneIcon,
+ Trash2Icon,
+ } from "lucide-react";
+ import { Badge } from "@/components/ui/badge";
+ import { Button } from "@/components/ui/button";
+ import { Input } from "@/components/ui/input";
+ import {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+ } from "@/components/ui/sheet";
+ import { cn } from "@/lib/utils";
+ import type {
+ OpenClawMessagingChannel,
+ SidecarClient,
+ } from "@/lib/sidecar/client";
+ import { MESSAGING_CHANNEL_DESCRIPTIONS } from "./messaging-channel-descriptions";
+
+ interface MessagingConnectionsPanelProps {
+ client: SidecarClient | null;
+ }
+
+ type ChannelId = "telegram" | "whatsapp";
+ type PanelMode = "unavailable" | "default";
+
+ const CHANNEL_META = {
+ telegram: {
+ icon: BotIcon,
+ label: "Telegram",
+ },
+ whatsapp: {
+ icon: SmartphoneIcon,
+ label: "WhatsApp",
+ },
+ } satisfies Record<ChannelId, { icon: typeof BotIcon; label: string }>;
+
+ export function MessagingConnectionsPanel({
+ client,
+ }: MessagingConnectionsPanelProps) {
+ const [channels, setChannels] = useState<OpenClawMessagingChannel[]>([]);
+ const [sheetChannelId, setSheetChannelId] = useState<ChannelId | null>(null);
+ const [telegramBotToken, setTelegramBotToken] = useState("");
+ const [whatsAppLog, setWhatsAppLog] = useState("");
+ const [feedback, setFeedback] = useState<string | null>(null);
+ const [errorMessage, setErrorMessage] = useState<string | null>(null);
+ const [panelMode, setPanelMode] = useState<PanelMode>("default");
+ const [isLoading, setIsLoading] = useState(false);
+ const [isRefreshing, setIsRefreshing] = useState(false);
+ const [isSubmittingTelegram, setIsSubmittingTelegram] = useState(false);
+ const [isRemovingChannel, setIsRemovingChannel] = useState<ChannelId | null>(null);
+ const [isStartingWhatsAppLink, setIsStartingWhatsAppLink] = useState(false);
+ const whatsAppAbortRef = useRef<AbortController | null>(null);
+
+ const channelById = useMemo(
+ () =>
+ Object.fromEntries(
+ channels.map((channel) => [channel.channelId, channel]),
+ ) as Partial<Record<ChannelId, OpenClawMessagingChannel>>,
+ [channels],
+ );
+
+ const loadChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ const nextChannels = await client.listOpenClawMessagingChannels();
+ setChannels(nextChannels);
+ setPanelMode("default");
+ }, [client]);
+
+ const refreshChannels = useCallback(async () => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ setIsRefreshing(true);
+ try {
+ await loadChannels();
+ setErrorMessage(null);
+ } catch (error) {
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the current sidecar. Restart the dev sidecar, then refresh.",
+ );
+ } else {
+ setErrorMessage(getErrorMessage(error));
+ }
+ } finally {
+ setIsRefreshing(false);
+ }
+ }, [client, loadChannels]);
+
+ useEffect(() => {
+ if (!client) {
+ setChannels([]);
+ return;
+ }
+
+ let cancelled = false;
+ setIsLoading(true);
+ setErrorMessage(null);
+
+ void loadChannels()
+ .catch((error: unknown) => {
+ if (cancelled) {
+ return;
+ }
+ if (isMissingOpenClawRouteError(error)) {
+ setPanelMode("unavailable");
+ setChannels([]);
+ setErrorMessage(
+ "OpenClaw messaging routes are unavailable in the cu
|
|
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-node@v4, pnpm/action-setup@v2. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
|
The logs for this run have expired and are no longer available.
Loading