diff --git a/packages/remote-control-server/web/src/components/EventStream.tsx b/packages/remote-control-server/web/src/components/EventStream.tsx index bf6f4e559..8aca84884 100644 --- a/packages/remote-control-server/web/src/components/EventStream.tsx +++ b/packages/remote-control-server/web/src/components/EventStream.tsx @@ -444,7 +444,7 @@ function AskUserPanel({ const handleSubmit = () => { const mapped: Record = {}; for (const [qIdx, val] of Object.entries(answers)) { - const q = questions[parseInt(qIdx)]; + const q = questions[parseInt(qIdx, 10)]; if (!q) continue; if (typeof val === "number") { mapped[qIdx] = q.options?.[val]?.label || String(val); diff --git a/packages/remote-control-server/web/src/components/PermissionViews.tsx b/packages/remote-control-server/web/src/components/PermissionViews.tsx index df702c631..3a70a30bc 100644 --- a/packages/remote-control-server/web/src/components/PermissionViews.tsx +++ b/packages/remote-control-server/web/src/components/PermissionViews.tsx @@ -97,7 +97,7 @@ export function AskUserPanelView({ const handleSubmit = () => { const mapped: Record = {}; for (const [qIdx, val] of Object.entries(answers)) { - const q = questions[parseInt(qIdx)]; + const q = questions[parseInt(qIdx, 10)]; if (!q) continue; if (typeof val === "number") mapped[qIdx] = q.options?.[val]?.label || String(val); else if (Array.isArray(val)) mapped[qIdx] = val.map((i) => q.options?.[i]?.label || String(i)); diff --git a/packages/remote-control-server/web/src/lib/rcs-chat-adapter.ts b/packages/remote-control-server/web/src/lib/rcs-chat-adapter.ts index b4a36cb99..335374828 100644 --- a/packages/remote-control-server/web/src/lib/rcs-chat-adapter.ts +++ b/packages/remote-control-server/web/src/lib/rcs-chat-adapter.ts @@ -1,4 +1,5 @@ import type { SetStateAction } from "react"; +import { v4 as uuidv4 } from "uuid"; import { apiFetchSession, apiFetchSessionHistory, @@ -421,7 +422,7 @@ export class RCSChatAdapter { // Send to backend await apiSendEvent(this.sessionId, { type: "user", - uuid: crypto.randomUUID(), + uuid: uuidv4(), content: text, message: { content: text }, }); diff --git a/packages/remote-control-server/web/src/lib/rcs-transport.ts b/packages/remote-control-server/web/src/lib/rcs-transport.ts index 777662257..fc40c37ab 100644 --- a/packages/remote-control-server/web/src/lib/rcs-transport.ts +++ b/packages/remote-control-server/web/src/lib/rcs-transport.ts @@ -1,4 +1,5 @@ import type { ChatTransport, UIMessage, UIMessageChunk } from "ai"; +import { v4 as uuidv4 } from "uuid"; import { getUuid } from "../api/client"; import type { SessionEvent, EventPayload } from "../types"; @@ -112,7 +113,7 @@ export class RCSTransport implements ChatTransport { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ type: "user", - uuid: crypto.randomUUID(), + uuid: uuidv4(), content: text, message: { content: text }, }), diff --git a/packages/remote-control-server/web/src/lib/utils.ts b/packages/remote-control-server/web/src/lib/utils.ts index 13b2d9fdb..834093ec9 100644 --- a/packages/remote-control-server/web/src/lib/utils.ts +++ b/packages/remote-control-server/web/src/lib/utils.ts @@ -1,5 +1,6 @@ import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; +import { v4 as uuidv4 } from "uuid"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); @@ -42,10 +43,7 @@ export function truncate(str: string | null | undefined, max: number): string { } export function generateMessageUuid(): string { - if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { - return crypto.randomUUID(); - } - return `msg_${Date.now()}_${Math.random().toString(16).slice(2)}`; + return uuidv4(); } export function extractEventText(payload: Record | null | undefined): string {