diff --git a/apps/dashboard/src/app/nebula-app/(app)/api/chat.ts b/apps/dashboard/src/app/nebula-app/(app)/api/chat.ts index e828f49333d..7acdb0079da 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/api/chat.ts +++ b/apps/dashboard/src/app/nebula-app/(app)/api/chat.ts @@ -105,6 +105,29 @@ export async function promptNebula(params: { }); break; } + + case "context": { + const data = JSON.parse(event.data) as { + data: string; + request_id: string; + session_id: string; + }; + + const contextData = JSON.parse(data.data) as { + wallet_address: string; + chain_ids: number[]; + }; + + params.handleStream({ + event: "context", + data: contextData, + }); + break; + } + + default: { + console.warn("unhandled event", event); + } } } } @@ -136,6 +159,13 @@ type ChatStreamedResponse = event: "action"; type: "sign_transaction" & (string & {}); data: NebulaTxData; + } + | { + event: "context"; + data: { + wallet_address: string; + chain_ids: number[]; + }; }; type ChatStreamedEvent = @@ -155,4 +185,8 @@ type ChatStreamedEvent = event: "action"; type: "sign_transaction" & (string & {}); data: string; + } + | { + event: "context"; + data: string; }; diff --git a/apps/dashboard/src/app/nebula-app/(app)/components/ChatPageContent.tsx b/apps/dashboard/src/app/nebula-app/(app)/components/ChatPageContent.tsx index 5620e83d1a5..0c48806ba94 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/components/ChatPageContent.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/components/ChatPageContent.tsx @@ -251,6 +251,7 @@ export function ChatPageContent(props: { authToken: props.authToken, setMessages, contextFilters: contextFilters, + setContextFilters, }); } catch (error) { if (abortController.signal.aborted) { @@ -266,7 +267,14 @@ export function ChatPageContent(props: { setEnableAutoScroll(false); } }, - [sessionId, contextFilters, props.authToken, messages.length, initSession], + [ + sessionId, + contextFilters, + props.authToken, + messages.length, + initSession, + setContextFilters, + ], ); const hasDoneAutoPrompt = useRef(false); @@ -450,6 +458,7 @@ export async function handleNebulaPrompt(params: { authToken: string; setMessages: React.Dispatch>; contextFilters: NebulaContext | undefined; + setContextFilters: (v: NebulaContext | undefined) => void; }) { const { abortController, @@ -458,6 +467,7 @@ export async function handleNebulaPrompt(params: { authToken, setMessages, contextFilters, + setContextFilters, } = params; let requestIdForMessage = ""; @@ -548,6 +558,13 @@ export async function handleNebulaPrompt(params: { }); } } + + if (res.event === "context") { + setContextFilters({ + chainIds: res.data.chain_ids.map((x) => x.toString()), + walletAddress: res.data.wallet_address, + }); + } }, context: contextFilters, }); diff --git a/apps/dashboard/src/app/nebula-app/(app)/components/ChatSidebar.tsx b/apps/dashboard/src/app/nebula-app/(app)/components/ChatSidebar.tsx index 5dcc1870df7..805c2863ea5 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/components/ChatSidebar.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/components/ChatSidebar.tsx @@ -123,7 +123,7 @@ export function ChatSidebar(props: {
- +
); diff --git a/apps/dashboard/src/app/nebula-app/(app)/components/FloatingChat/FloatingChatContent.tsx b/apps/dashboard/src/app/nebula-app/(app)/components/FloatingChat/FloatingChatContent.tsx index 1e283a169e4..dfd45f5853c 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/components/FloatingChat/FloatingChatContent.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/components/FloatingChat/FloatingChatContent.tsx @@ -1,7 +1,7 @@ import { ArrowRightIcon, ArrowUpRightIcon } from "lucide-react"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { useCallback, useMemo, useState } from "react"; +import { useCallback, useState } from "react"; import type { ThirdwebClient } from "thirdweb"; import { Button } from "../../../../../@/components/ui/button"; import type { NebulaContext } from "../../api/chat"; @@ -63,14 +63,16 @@ function FloatingChatContentLoggedIn(props: { const [isChatStreaming, setIsChatStreaming] = useState(false); const [enableAutoScroll, setEnableAutoScroll] = useState(false); - const contextFilters: NebulaContext = useMemo(() => { + const [contextFilters, setContextFilters] = useState< + NebulaContext | undefined + >(() => { return { chainIds: props.nebulaParams?.chainIds.map((chainId) => chainId.toString()) || null, walletAddress: props.nebulaParams?.wallet || null, }; - }, [props.nebulaParams]); + }); const initSession = useCallback(async () => { const session = await createSession({ @@ -120,6 +122,7 @@ function FloatingChatContentLoggedIn(props: { authToken: props.authToken, setMessages, contextFilters: contextFilters, + setContextFilters: setContextFilters, }); } catch (error) { if (abortController.signal.aborted) { diff --git a/apps/dashboard/src/components/contract-components/published-contract/markdown-renderer.tsx b/apps/dashboard/src/components/contract-components/published-contract/markdown-renderer.tsx index 835514e6539..a8fb509a9ac 100644 --- a/apps/dashboard/src/components/contract-components/published-contract/markdown-renderer.tsx +++ b/apps/dashboard/src/components/contract-components/published-contract/markdown-renderer.tsx @@ -106,8 +106,10 @@ export const MarkdownRenderer: React.FC<{ ), code: ({ ...props }) => { - if (props?.className) { - if (code?.disableCodeHighlight) { + const codeStr = onlyText(props.children); + + if (props?.className || codeStr.length > 100) { + if (code?.disableCodeHighlight || !props.className) { return (
{/* @ts-expect-error - TODO: fix this */}