"use client"; import type { CSSProperties, ReactNode } from "react"; import { ActionIcon, Box, Center, Group, Stack, Text, ThemeIcon, Tooltip } from "@mantine/core"; import { IconArrowsMaximize, IconRobot } from "@tabler/icons-react"; import { useAui, useAuiState } from "@assistant-ui/react"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "@homarr/widgets"; import { useRequiredBoard } from "@homarr/boards/context"; import classes from "./assistant-panel.module.css"; import { AssistantConversationSurface } from "./assistant-panel"; import { getPendingAssistantAction } from "./assistant-pending-action"; import { useAssistantPreferences, useHomarrAssistant } from "./assistant-context"; import { AssistantComposerSurfaceProvider } from "./assistant-runtime-provider"; export const AssistantBoardWidget = (props: WidgetComponentProps<"assistant">) => { const assistant = useHomarrAssistant(); if (!assistant.enabled) { return ; } return ( ); }; const EnabledAssistantBoardWidget = ({ width, height, isEditMode }: WidgetComponentProps<"assistant">) => { const board = useRequiredBoard(); const assistant = useHomarrAssistant(); const preferences = useAssistantPreferences(); const aui = useAui(); const messages = useAuiState((state) => state.thread.messages); const isLoading = useAuiState((state) => state.thread.isLoading); const latestAssistantMessage = messages.findLast((message) => message.role === "assistant"); const pendingAction = getPendingAssistantAction(latestAssistantMessage); const selectModel = (modelId: string) => { preferences.setModelId(modelId); const threadListItem = aui.threadListItem(); if (!threadListItem.getState().remoteId) return; threadListItem.updateCustom({ ...threadListItem.getState().custom, modelId }); }; if (width < 300 || height < 280) { return ; } return ( ); }; const CompactAssistantWidget = ({ onOpen }: { onOpen: () => void }) => { const t = useI18n(); return ( {t("widget.assistant.compact.title")} {t("widget.assistant.compact.description")} ); }; interface AssistantWidgetStateProps { icon: typeof IconRobot; title: string; description: string; color?: string; children?: ReactNode; } const AssistantWidgetState = ({ icon: Icon, title, description, color = "red", children, }: AssistantWidgetStateProps) => (
{title} {description} {children}
); const UnavailableAssistantWidget = ({ description }: { description: string | null }) => { const t = useI18n(); return ( ); };