@drewswiredin/backstage-plugin-assistants 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -9,7 +9,7 @@ import { resolveAssistantColor, DEFAULT_AVATAR_COLOR } from './AssistantAvatar.e
|
|
|
9
9
|
import { ThreadPrimitive } from '@assistant-ui/react';
|
|
10
10
|
import { Thread, UserMessage, ThreadWelcome, AssistantMessage, BranchPicker, AssistantActionBar } from '@assistant-ui/react-ui';
|
|
11
11
|
import { MarkdownText } from './MarkdownText.esm.js';
|
|
12
|
-
import { ToolFallback, ThinkingMessage, ReasoningPart } from './parts.esm.js';
|
|
12
|
+
import { ToolFallback, ThinkingMessage, ReasoningPart, MessageError } from './parts.esm.js';
|
|
13
13
|
|
|
14
14
|
const DEFAULT_WELCOME_SUBTITLE = "Ask me about services, APIs, teams, TechDocs, or anything in the catalog.";
|
|
15
15
|
const AvatarColorContext = createContext(void 0);
|
|
@@ -147,6 +147,7 @@ function AssistantMessageWithAvatar() {
|
|
|
147
147
|
return /* @__PURE__ */ jsxs(AssistantMessage.Root, { children: [
|
|
148
148
|
/* @__PURE__ */ jsx(AssistantBotAvatar, {}),
|
|
149
149
|
/* @__PURE__ */ jsx(AssistantMessage.Content, { components: { Reasoning: ReasoningPart } }),
|
|
150
|
+
/* @__PURE__ */ jsx(MessageError, {}),
|
|
150
151
|
/* @__PURE__ */ jsx(BranchPicker, {}),
|
|
151
152
|
/* @__PURE__ */ jsx(AssistantActionBar, {})
|
|
152
153
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationSurface.esm.js","sources":["../../../src/collapsible/surface/ConversationSurface.tsx"],"sourcesContent":["// The prebuilt react-ui `<Thread>` stylesheet is vendored locally under\n// `styles/` and imported once at the top of `CollapsiblePage.tsx`. It is NOT\n// imported here: react-ui's `sideEffects: false` lets bundlers tree-shake a\n// bare CSS import from inside a lazily-loaded component, which left the Thread\n// unstyled.\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n type CSSProperties,\n} from 'react';\nimport type { ProfileInfo } from '@backstage/core-plugin-api';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Avatar as BackstageAvatar } from '@backstage/core-components';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport { Button, Typography } from '@material-ui/core';\nimport { BackstageLogo } from './BackstageLogo';\nimport { DEFAULT_AVATAR_COLOR, resolveAssistantColor } from './AssistantAvatar';\nimport { ThreadPrimitive } from '@assistant-ui/react';\nimport {\n AssistantActionBar,\n AssistantMessage,\n BranchPicker,\n Thread,\n ThreadWelcome,\n UserMessage,\n} from '@assistant-ui/react-ui';\nimport { MarkdownText } from './MarkdownText';\nimport { ReasoningPart, ThinkingMessage, ToolFallback } from './parts';\n\nconst DEFAULT_WELCOME_SUBTITLE =\n 'Ask me about services, APIs, teams, TechDocs, or anything in the catalog.';\n\n// The active assistant's avatar color. ConversationSurface provides it; the\n// message components (passed to <Thread> by reference, so they can't take props)\n// read it from context. Falls back to DEFAULT_AVATAR_COLOR.\nconst AvatarColorContext = createContext<string | undefined>(undefined);\n\nconst useStyles = makeStyles(theme => ({\n threadHost: {\n flex: 1,\n minHeight: 0,\n '& .aui-thread-root': {\n // Wide conversation pane to maximize room for diagrams / visual artifacts.\n // (The composer is narrowed independently via the footer max-width below.)\n '--aui-thread-max-width': '90%',\n '--aui-background':\n theme.palette.type === 'dark' ? '0 0% 18%' : '0 0% 100%',\n '--aui-foreground':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 10% 3.9%',\n '--aui-muted':\n theme.palette.type === 'dark' ? '0 0% 24%' : '240 4.8% 95.9%',\n '--aui-muted-foreground':\n theme.palette.type === 'dark' ? '0 0% 70%' : '240 3.8% 46.1%',\n '--aui-accent':\n theme.palette.type === 'dark' ? '0 0% 24%' : '240 4.8% 95.9%',\n '--aui-accent-foreground':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 5.9% 10%',\n '--aui-border':\n theme.palette.type === 'dark' ? '0 0% 40%' : '240 5.9% 90%',\n '--aui-input':\n theme.palette.type === 'dark' ? '0 0% 40%' : '240 5.9% 90%',\n '--aui-ring':\n theme.palette.type === 'dark' ? '207 90% 68%' : '210 90% 45%',\n '--aui-primary':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 5.9% 10%',\n '--aui-primary-foreground':\n theme.palette.type === 'dark' ? '240 5.9% 10%' : '0 0% 98%',\n },\n // Active composer border tinted to the agent color (set as --aui-composer-focus\n // on the host below); falls back to the theme primary if unset.\n '& .aui-composer-root:focus-within': {\n borderColor: 'var(--aui-composer-focus)',\n boxShadow: '0 0 0 1px var(--aui-composer-focus)',\n },\n '& .aui-assistant-message-content': {\n maxWidth: '100%',\n width: '100%',\n },\n // The composer is narrower than the conversation: cap the footer (which holds\n // the composer and is centered in the viewport) below the 90% thread width.\n // Bottom padding is left at the react-ui stock value (1rem) — overriding it\n // larger left a too-tall solid footer band beneath the composer.\n '& .aui-thread-viewport-footer': {\n maxWidth: '48rem',\n },\n },\n botAvatar: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n // Transparent so the tinted logo floats (overrides react-ui's aui-avatar-root).\n backgroundColor: 'transparent',\n // Bumped to ~match the user avatar (which has an encircling disc); the\n // floating logo looked small by comparison.\n width: 32,\n height: 32,\n },\n botLogo: {\n height: '100%',\n width: 'auto',\n },\n userMessageWithAvatar: {\n display: 'flex',\n width: '100%',\n maxWidth: 'var(--aui-thread-max-width)',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: theme.spacing(0.5),\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n userMessageBody: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'flex-end',\n gap: theme.spacing(1),\n '& .aui-user-message-content': {\n maxWidth: '100%',\n },\n },\n userAvatar: {\n width: theme.spacing(5),\n height: theme.spacing(5),\n marginTop: theme.spacing(0.25),\n flexShrink: 0,\n },\n welcomeRoot: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(2),\n maxWidth: '28rem',\n textAlign: 'center',\n },\n welcomeLogo: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 56,\n height: 56,\n },\n welcomeLogoIcon: {\n width: 30,\n height: 'auto',\n },\n welcomeGreeting: {\n fontWeight: 500,\n color: theme.palette.text.primary,\n },\n welcomeSubtitle: {\n color: theme.palette.text.secondary,\n },\n suggestions: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n suggestionButton: {\n textTransform: 'none',\n borderRadius: 999,\n },\n}));\n\n/** A circular MUI-styled bot avatar (no host asset dependency). */\nfunction AssistantBotAvatar() {\n const classes = useStyles();\n const color = useContext(AvatarColorContext) ?? DEFAULT_AVATAR_COLOR;\n\n return (\n <span\n className={`aui-avatar-root ${classes.botAvatar}`}\n style={{ color, backgroundColor: 'transparent' }}\n aria-label=\"Backstage assistant\"\n role=\"img\"\n >\n <BackstageLogo className={classes.botLogo} />\n </span>\n );\n}\n\nfunction AssistantMessageWithAvatar() {\n return (\n <AssistantMessage.Root>\n <AssistantBotAvatar />\n <AssistantMessage.Content components={{ Reasoning: ReasoningPart }} />\n <BranchPicker />\n <AssistantActionBar />\n </AssistantMessage.Root>\n );\n}\n\n/** Read the signed-in user's profile (display name, picture) once. */\nfunction useProfile() {\n const identityApi = useApi(identityApiRef);\n const [profile, setProfile] = useState<ProfileInfo>();\n\n useEffect(() => {\n let mounted = true;\n\n identityApi.getProfileInfo().then(value => {\n if (mounted) {\n setProfile(value);\n }\n });\n\n return () => {\n mounted = false;\n };\n }, [identityApi]);\n\n return profile;\n}\n\nfunction UserChatAvatar() {\n const classes = useStyles();\n const profile = useProfile();\n\n return (\n <BackstageAvatar\n classes={{ avatar: classes.userAvatar }}\n displayName={profile?.displayName ?? profile?.email ?? 'You'}\n picture={profile?.picture}\n />\n );\n}\n\nfunction UserMessageWithAvatar() {\n const classes = useStyles();\n\n return (\n <UserMessage.Root className={classes.userMessageWithAvatar}>\n <UserMessage.Attachments />\n <div className={classes.userMessageBody}>\n <UserMessage.Content />\n <UserChatAvatar />\n </div>\n </UserMessage.Root>\n );\n}\n\n/**\n * Props for {@link ConversationSurface}.\n *\n * @public\n */\nexport interface ConversationSurfaceProps {\n /** Placeholder text for the composer input (from the assistant's ui config). */\n composerPlaceholder?: string;\n /** Starter prompts shown as clickable chips on the empty thread. */\n suggestions?: Array<{ title: string; prompt: string }>;\n /** Overrides for the default empty-thread greeting. */\n welcome?: { title?: string; subtitle?: string };\n /** The active assistant's avatar tint (hex); defaults to Backstage teal. */\n assistantColor?: string;\n /** Host layout escape hatch (applied alongside the themed thread host). */\n className?: string;\n}\n\n/**\n * The react-ui `<Thread>` rendered with Implementation 1's custom message\n * components: a bot-avatar assistant message, an avatar'd user message,\n * Markdown (with streaming-safe Mermaid), a tool-call fallback, a thinking /\n * error empty-state, and a personalized empty-thread welcome with optional\n * starter-prompt chips.\n *\n * This is a \"bring your own runtime\" surface — it expects an\n * `AssistantRuntimeProvider` higher in the tree.\n *\n * @public\n */\nexport function ConversationSurface(props: ConversationSurfaceProps) {\n const { composerPlaceholder, suggestions, welcome, assistantColor, className } =\n props;\n const classes = useStyles();\n const theme = useTheme();\n // One mode-appropriate shade for every place the agent color appears here\n // (chat bot avatar via context, welcome logo, composer focus border).\n const resolvedColor = resolveAssistantColor(assistantColor, theme.palette.type);\n\n function EmptyThreadWelcome() {\n const profile = useProfile();\n const firstName = profile?.displayName?.split(' ')[0] ?? 'there';\n\n const title = welcome?.title ?? `Hi ${firstName}, welcome to Backstage`;\n const subtitle = welcome?.subtitle ?? DEFAULT_WELCOME_SUBTITLE;\n\n return (\n <ThreadWelcome.Root>\n <ThreadWelcome.Center>\n <div className={classes.welcomeRoot}>\n <span\n className={classes.welcomeLogo}\n style={{ color: resolvedColor }}\n aria-hidden=\"true\"\n >\n <BackstageLogo className={classes.welcomeLogoIcon} />\n </span>\n <Typography variant=\"h5\" className={classes.welcomeGreeting}>\n {title}\n </Typography>\n <Typography variant=\"body2\" className={classes.welcomeSubtitle}>\n {subtitle}\n </Typography>\n {suggestions && suggestions.length > 0 && (\n <div className={classes.suggestions}>\n {suggestions.map(suggestion => (\n <ThreadPrimitive.Suggestion\n key={suggestion.prompt}\n prompt={suggestion.prompt}\n send\n asChild\n >\n <Button\n variant=\"outlined\"\n size=\"small\"\n className={classes.suggestionButton}\n >\n {suggestion.title}\n </Button>\n </ThreadPrimitive.Suggestion>\n ))}\n </div>\n )}\n </div>\n </ThreadWelcome.Center>\n </ThreadWelcome.Root>\n );\n }\n\n return (\n <AvatarColorContext.Provider value={resolvedColor}>\n <div\n className={`${classes.threadHost} ${className ?? ''}`}\n style={\n {\n '--aui-composer-focus': resolvedColor,\n } as CSSProperties\n }\n >\n <Thread\n strings={\n composerPlaceholder\n ? { composer: { input: { placeholder: composerPlaceholder } } }\n : undefined\n }\n components={{\n AssistantMessage: AssistantMessageWithAvatar,\n ThreadWelcome: EmptyThreadWelcome,\n UserMessage: UserMessageWithAvatar,\n }}\n assistantMessage={{\n components: {\n Text: MarkdownText,\n Empty: ThinkingMessage,\n ToolFallback,\n },\n }}\n />\n </div>\n </AvatarColorContext.Provider>\n );\n}\n"],"names":["BackstageAvatar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConversationSurface.esm.js","sources":["../../../src/collapsible/surface/ConversationSurface.tsx"],"sourcesContent":["// The prebuilt react-ui `<Thread>` stylesheet is vendored locally under\n// `styles/` and imported once at the top of `CollapsiblePage.tsx`. It is NOT\n// imported here: react-ui's `sideEffects: false` lets bundlers tree-shake a\n// bare CSS import from inside a lazily-loaded component, which left the Thread\n// unstyled.\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n type CSSProperties,\n} from 'react';\nimport type { ProfileInfo } from '@backstage/core-plugin-api';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Avatar as BackstageAvatar } from '@backstage/core-components';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport { Button, Typography } from '@material-ui/core';\nimport { BackstageLogo } from './BackstageLogo';\nimport { DEFAULT_AVATAR_COLOR, resolveAssistantColor } from './AssistantAvatar';\nimport { ThreadPrimitive } from '@assistant-ui/react';\nimport {\n AssistantActionBar,\n AssistantMessage,\n BranchPicker,\n Thread,\n ThreadWelcome,\n UserMessage,\n} from '@assistant-ui/react-ui';\nimport { MarkdownText } from './MarkdownText';\nimport {\n MessageError,\n ReasoningPart,\n ThinkingMessage,\n ToolFallback,\n} from './parts';\n\nconst DEFAULT_WELCOME_SUBTITLE =\n 'Ask me about services, APIs, teams, TechDocs, or anything in the catalog.';\n\n// The active assistant's avatar color. ConversationSurface provides it; the\n// message components (passed to <Thread> by reference, so they can't take props)\n// read it from context. Falls back to DEFAULT_AVATAR_COLOR.\nconst AvatarColorContext = createContext<string | undefined>(undefined);\n\nconst useStyles = makeStyles(theme => ({\n threadHost: {\n flex: 1,\n minHeight: 0,\n '& .aui-thread-root': {\n // Wide conversation pane to maximize room for diagrams / visual artifacts.\n // (The composer is narrowed independently via the footer max-width below.)\n '--aui-thread-max-width': '90%',\n '--aui-background':\n theme.palette.type === 'dark' ? '0 0% 18%' : '0 0% 100%',\n '--aui-foreground':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 10% 3.9%',\n '--aui-muted':\n theme.palette.type === 'dark' ? '0 0% 24%' : '240 4.8% 95.9%',\n '--aui-muted-foreground':\n theme.palette.type === 'dark' ? '0 0% 70%' : '240 3.8% 46.1%',\n '--aui-accent':\n theme.palette.type === 'dark' ? '0 0% 24%' : '240 4.8% 95.9%',\n '--aui-accent-foreground':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 5.9% 10%',\n '--aui-border':\n theme.palette.type === 'dark' ? '0 0% 40%' : '240 5.9% 90%',\n '--aui-input':\n theme.palette.type === 'dark' ? '0 0% 40%' : '240 5.9% 90%',\n '--aui-ring':\n theme.palette.type === 'dark' ? '207 90% 68%' : '210 90% 45%',\n '--aui-primary':\n theme.palette.type === 'dark' ? '0 0% 98%' : '240 5.9% 10%',\n '--aui-primary-foreground':\n theme.palette.type === 'dark' ? '240 5.9% 10%' : '0 0% 98%',\n },\n // Active composer border tinted to the agent color (set as --aui-composer-focus\n // on the host below); falls back to the theme primary if unset.\n '& .aui-composer-root:focus-within': {\n borderColor: 'var(--aui-composer-focus)',\n boxShadow: '0 0 0 1px var(--aui-composer-focus)',\n },\n '& .aui-assistant-message-content': {\n maxWidth: '100%',\n width: '100%',\n },\n // The composer is narrower than the conversation: cap the footer (which holds\n // the composer and is centered in the viewport) below the 90% thread width.\n // Bottom padding is left at the react-ui stock value (1rem) — overriding it\n // larger left a too-tall solid footer band beneath the composer.\n '& .aui-thread-viewport-footer': {\n maxWidth: '48rem',\n },\n },\n botAvatar: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n // Transparent so the tinted logo floats (overrides react-ui's aui-avatar-root).\n backgroundColor: 'transparent',\n // Bumped to ~match the user avatar (which has an encircling disc); the\n // floating logo looked small by comparison.\n width: 32,\n height: 32,\n },\n botLogo: {\n height: '100%',\n width: 'auto',\n },\n userMessageWithAvatar: {\n display: 'flex',\n width: '100%',\n maxWidth: 'var(--aui-thread-max-width)',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: theme.spacing(0.5),\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n userMessageBody: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'flex-end',\n gap: theme.spacing(1),\n '& .aui-user-message-content': {\n maxWidth: '100%',\n },\n },\n userAvatar: {\n width: theme.spacing(5),\n height: theme.spacing(5),\n marginTop: theme.spacing(0.25),\n flexShrink: 0,\n },\n welcomeRoot: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(2),\n maxWidth: '28rem',\n textAlign: 'center',\n },\n welcomeLogo: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 56,\n height: 56,\n },\n welcomeLogoIcon: {\n width: 30,\n height: 'auto',\n },\n welcomeGreeting: {\n fontWeight: 500,\n color: theme.palette.text.primary,\n },\n welcomeSubtitle: {\n color: theme.palette.text.secondary,\n },\n suggestions: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n suggestionButton: {\n textTransform: 'none',\n borderRadius: 999,\n },\n}));\n\n/** A circular MUI-styled bot avatar (no host asset dependency). */\nfunction AssistantBotAvatar() {\n const classes = useStyles();\n const color = useContext(AvatarColorContext) ?? DEFAULT_AVATAR_COLOR;\n\n return (\n <span\n className={`aui-avatar-root ${classes.botAvatar}`}\n style={{ color, backgroundColor: 'transparent' }}\n aria-label=\"Backstage assistant\"\n role=\"img\"\n >\n <BackstageLogo className={classes.botLogo} />\n </span>\n );\n}\n\nfunction AssistantMessageWithAvatar() {\n return (\n <AssistantMessage.Root>\n <AssistantBotAvatar />\n <AssistantMessage.Content components={{ Reasoning: ReasoningPart }} />\n <MessageError />\n <BranchPicker />\n <AssistantActionBar />\n </AssistantMessage.Root>\n );\n}\n\n/** Read the signed-in user's profile (display name, picture) once. */\nfunction useProfile() {\n const identityApi = useApi(identityApiRef);\n const [profile, setProfile] = useState<ProfileInfo>();\n\n useEffect(() => {\n let mounted = true;\n\n identityApi.getProfileInfo().then(value => {\n if (mounted) {\n setProfile(value);\n }\n });\n\n return () => {\n mounted = false;\n };\n }, [identityApi]);\n\n return profile;\n}\n\nfunction UserChatAvatar() {\n const classes = useStyles();\n const profile = useProfile();\n\n return (\n <BackstageAvatar\n classes={{ avatar: classes.userAvatar }}\n displayName={profile?.displayName ?? profile?.email ?? 'You'}\n picture={profile?.picture}\n />\n );\n}\n\nfunction UserMessageWithAvatar() {\n const classes = useStyles();\n\n return (\n <UserMessage.Root className={classes.userMessageWithAvatar}>\n <UserMessage.Attachments />\n <div className={classes.userMessageBody}>\n <UserMessage.Content />\n <UserChatAvatar />\n </div>\n </UserMessage.Root>\n );\n}\n\n/**\n * Props for {@link ConversationSurface}.\n *\n * @public\n */\nexport interface ConversationSurfaceProps {\n /** Placeholder text for the composer input (from the assistant's ui config). */\n composerPlaceholder?: string;\n /** Starter prompts shown as clickable chips on the empty thread. */\n suggestions?: Array<{ title: string; prompt: string }>;\n /** Overrides for the default empty-thread greeting. */\n welcome?: { title?: string; subtitle?: string };\n /** The active assistant's avatar tint (hex); defaults to Backstage teal. */\n assistantColor?: string;\n /** Host layout escape hatch (applied alongside the themed thread host). */\n className?: string;\n}\n\n/**\n * The react-ui `<Thread>` rendered with Implementation 1's custom message\n * components: a bot-avatar assistant message, an avatar'd user message,\n * Markdown (with streaming-safe Mermaid), a tool-call fallback, a thinking /\n * error empty-state, and a personalized empty-thread welcome with optional\n * starter-prompt chips.\n *\n * This is a \"bring your own runtime\" surface — it expects an\n * `AssistantRuntimeProvider` higher in the tree.\n *\n * @public\n */\nexport function ConversationSurface(props: ConversationSurfaceProps) {\n const { composerPlaceholder, suggestions, welcome, assistantColor, className } =\n props;\n const classes = useStyles();\n const theme = useTheme();\n // One mode-appropriate shade for every place the agent color appears here\n // (chat bot avatar via context, welcome logo, composer focus border).\n const resolvedColor = resolveAssistantColor(assistantColor, theme.palette.type);\n\n function EmptyThreadWelcome() {\n const profile = useProfile();\n const firstName = profile?.displayName?.split(' ')[0] ?? 'there';\n\n const title = welcome?.title ?? `Hi ${firstName}, welcome to Backstage`;\n const subtitle = welcome?.subtitle ?? DEFAULT_WELCOME_SUBTITLE;\n\n return (\n <ThreadWelcome.Root>\n <ThreadWelcome.Center>\n <div className={classes.welcomeRoot}>\n <span\n className={classes.welcomeLogo}\n style={{ color: resolvedColor }}\n aria-hidden=\"true\"\n >\n <BackstageLogo className={classes.welcomeLogoIcon} />\n </span>\n <Typography variant=\"h5\" className={classes.welcomeGreeting}>\n {title}\n </Typography>\n <Typography variant=\"body2\" className={classes.welcomeSubtitle}>\n {subtitle}\n </Typography>\n {suggestions && suggestions.length > 0 && (\n <div className={classes.suggestions}>\n {suggestions.map(suggestion => (\n <ThreadPrimitive.Suggestion\n key={suggestion.prompt}\n prompt={suggestion.prompt}\n send\n asChild\n >\n <Button\n variant=\"outlined\"\n size=\"small\"\n className={classes.suggestionButton}\n >\n {suggestion.title}\n </Button>\n </ThreadPrimitive.Suggestion>\n ))}\n </div>\n )}\n </div>\n </ThreadWelcome.Center>\n </ThreadWelcome.Root>\n );\n }\n\n return (\n <AvatarColorContext.Provider value={resolvedColor}>\n <div\n className={`${classes.threadHost} ${className ?? ''}`}\n style={\n {\n '--aui-composer-focus': resolvedColor,\n } as CSSProperties\n }\n >\n <Thread\n strings={\n composerPlaceholder\n ? { composer: { input: { placeholder: composerPlaceholder } } }\n : undefined\n }\n components={{\n AssistantMessage: AssistantMessageWithAvatar,\n ThreadWelcome: EmptyThreadWelcome,\n UserMessage: UserMessageWithAvatar,\n }}\n assistantMessage={{\n components: {\n Text: MarkdownText,\n Empty: ThinkingMessage,\n ToolFallback,\n },\n }}\n />\n </div>\n </AvatarColorContext.Provider>\n );\n}\n"],"names":["BackstageAvatar"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';
|
|
|
7
7
|
import ExpandLessIcon from '@material-ui/icons/ExpandLess';
|
|
8
8
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
9
9
|
import HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';
|
|
10
|
+
import { useAuiState } from '@assistant-ui/react';
|
|
10
11
|
|
|
11
12
|
const useStyles = makeStyles((theme) => ({
|
|
12
13
|
thinkingMessage: {
|
|
@@ -210,14 +211,37 @@ function ThinkingMessage({ status }) {
|
|
|
210
211
|
/* @__PURE__ */ jsx(Typography, { variant: "body2", component: "span", children: "Reasoning\u2026" })
|
|
211
212
|
] });
|
|
212
213
|
}
|
|
213
|
-
if (status.type === "complete" || status.type === "incomplete") {
|
|
214
|
-
return /* @__PURE__ */ jsxs(Box, { className: classes.errorMessage, "aria-live": "polite", children: [
|
|
215
|
-
/* @__PURE__ */ jsx(ErrorOutlineIcon, { fontSize: "small" }),
|
|
216
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body2", component: "span", children: "Something went wrong. Please try again." })
|
|
217
|
-
] });
|
|
218
|
-
}
|
|
219
214
|
return null;
|
|
220
215
|
}
|
|
216
|
+
function errorToText(error) {
|
|
217
|
+
if (typeof error === "string") {
|
|
218
|
+
return error;
|
|
219
|
+
}
|
|
220
|
+
if (error && typeof error === "object" && "message" in error) {
|
|
221
|
+
const message = error.message;
|
|
222
|
+
if (typeof message === "string") {
|
|
223
|
+
return message;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
return JSON.stringify(error);
|
|
228
|
+
} catch {
|
|
229
|
+
return String(error);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function MessageError() {
|
|
233
|
+
const classes = useStyles();
|
|
234
|
+
const error = useAuiState(
|
|
235
|
+
(s) => s.message.status?.type === "incomplete" && s.message.status.reason === "error" ? errorToText(s.message.status.error ?? "An error occurred") : void 0
|
|
236
|
+
);
|
|
237
|
+
if (!error) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return /* @__PURE__ */ jsxs(Box, { className: classes.errorMessage, role: "alert", children: [
|
|
241
|
+
/* @__PURE__ */ jsx(ErrorOutlineIcon, { fontSize: "small" }),
|
|
242
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", component: "span", children: error })
|
|
243
|
+
] });
|
|
244
|
+
}
|
|
221
245
|
function ReasoningPart({ text, status }) {
|
|
222
246
|
const classes = useStyles();
|
|
223
247
|
const [open, setOpen] = useState(false);
|
|
@@ -239,5 +263,5 @@ function ReasoningPart({ text, status }) {
|
|
|
239
263
|
] });
|
|
240
264
|
}
|
|
241
265
|
|
|
242
|
-
export { ReasoningPart, ThinkingMessage, ToolFallback, formatPayload, getToolStatus };
|
|
266
|
+
export { MessageError, ReasoningPart, ThinkingMessage, ToolFallback, formatPayload, getToolStatus };
|
|
243
267
|
//# sourceMappingURL=parts.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parts.esm.js","sources":["../../../src/collapsible/surface/parts.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { makeStyles, useTheme, type Theme } from '@material-ui/core/styles';\nimport { Box, CircularProgress, Collapse, Typography } from '@material-ui/core';\nimport CheckCircleOutlineIcon from '@material-ui/icons/CheckCircleOutline';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport type {\n EmptyMessagePartProps,\n ReasoningMessagePartProps,\n ToolCallMessagePartProps,\n} from '@assistant-ui/react';\n\nconst useStyles = makeStyles(theme => ({\n thinkingMessage: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.palette.text.secondary,\n },\n errorMessage: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(1, 1.5),\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(244,67,54,0.1)'\n : 'rgba(244,67,54,0.06)',\n color: theme.palette.error.main,\n },\n reasoningToggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(0.25, 0.75),\n border: 'none',\n borderRadius: theme.shape.borderRadius,\n background: 'none',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n reasoningText: {\n margin: theme.spacing(0.5, 0, 0.5, 2.5),\n padding: theme.spacing(1, 1.5),\n borderLeft: `2px solid ${theme.palette.divider}`,\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily as string,\n fontSize: theme.typography.caption.fontSize,\n lineHeight: 1.55,\n whiteSpace: 'pre-wrap',\n },\n toolToggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(0.25, 0.75),\n border: 'none',\n borderRadius: theme.shape.borderRadius,\n background: 'none',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n toolBody: {\n margin: theme.spacing(0.5, 0, 0.5, 2.5),\n padding: theme.spacing(1, 1.5),\n borderLeft: `2px solid ${theme.palette.divider}`,\n },\n payloadTitle: {\n marginBottom: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n payloadBlock: {\n margin: 0,\n padding: theme.spacing(1),\n overflow: 'auto',\n maxHeight: theme.spacing(30),\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n },\n}));\n\n/** Format a byte count to a human-readable string. */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Serialize a tool input/output payload for display. */\nexport function formatPayload(value: unknown) {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n/** Check whether a tool result signals an error (backend marks with `_error`). */\nfunction isErrorResult(result: unknown): boolean {\n if (!result || typeof result !== 'object') return false;\n if ('_error' in (result as Record<string, unknown>)) return true;\n if (Array.isArray(result)) {\n return result.some(\n item =>\n item &&\n typeof item === 'object' &&\n typeof (item as { text?: unknown }).text === 'string' &&\n ((item as { text: string }).text.startsWith('Error') ||\n (item as { text: string }).text.includes('Failed')),\n );\n }\n return false;\n}\n\n/** Map a tool-call status to a human label + status icon. */\nexport function getToolStatus(status: ToolCallMessagePartProps['status'], theme: Theme, result?: unknown) {\n switch (status?.type) {\n case 'complete':\n if (isErrorResult(result)) {\n return {\n label: 'Error',\n icon: <ErrorOutlineIcon fontSize=\"small\" htmlColor={theme.palette.warning?.main ?? '#ff9800'} />,\n };\n }\n return {\n label: 'Complete',\n icon: <CheckCircleOutlineIcon fontSize=\"small\" htmlColor={theme.palette.success?.main ?? '#4caf50'} />,\n };\n case 'incomplete':\n return {\n label: 'Incomplete',\n icon: <ErrorOutlineIcon fontSize=\"small\" htmlColor={theme.palette.error.main} />,\n };\n case 'running':\n return { label: 'Running', icon: <CircularProgress size={16} color=\"inherit\" /> };\n default:\n return {\n label: 'Pending',\n icon: <HourglassEmptyIcon fontSize=\"small\" htmlColor={theme.palette.warning?.main ?? '#ff9800'} />,\n };\n }\n}\n\n/**\n * Default renderer for tool calls that don't have a bespoke UI. Shows a compact\n * toggle with the tool's status, expanding to reveal the input args and result.\n */\nexport function ToolFallback({\n toolName,\n args,\n result,\n status,\n}: ToolCallMessagePartProps) {\n const classes = useStyles();\n const theme = useTheme();\n const [open, setOpen] = useState(false);\n const { icon } = getToolStatus(status, theme, result);\n const hasArgs = args !== undefined && args !== null;\n const hasResult = result !== undefined && result !== null;\n\n return (\n <div>\n <button\n type=\"button\"\n className={classes.toolToggle}\n onClick={() => setOpen(v => !v)}\n >\n {icon}\n <span>{toolName}</span>\n {hasResult && !open && (\n <span>({formatBytes(formatPayload(result).length)})</span>\n )}\n {open ? (\n <ExpandLessIcon style={{ fontSize: 14 }} />\n ) : (\n <ExpandMoreIcon style={{ fontSize: 14 }} />\n )}\n </button>\n\n <Collapse in={open} unmountOnExit>\n <div className={classes.toolBody}>\n {hasArgs && (\n <Box mb={hasResult ? 1 : 0}>\n <Typography\n variant=\"caption\"\n component=\"div\"\n className={classes.payloadTitle}\n >\n Input\n </Typography>\n <pre className={classes.payloadBlock}>{formatPayload(args)}</pre>\n </Box>\n )}\n {hasResult && (\n <Box>\n <Typography\n variant=\"caption\"\n component=\"div\"\n className={classes.payloadTitle}\n >\n Output\n </Typography>\n <pre className={classes.payloadBlock}>{formatPayload(result)}</pre>\n </Box>\n )}\n </div>\n </Collapse>\n </div>\n );\n}\n\n/**\n * Rendered in place of an empty assistant message: a \"Reasoning…\" spinner while\n * the model is thinking, or an error notice if the message completed with no\n * content (typically a stream/API failure).\n */\nexport function ThinkingMessage({ status }: EmptyMessagePartProps) {\n const classes = useStyles();\n\n if (status.type === 'running') {\n return (\n <Box className={classes.thinkingMessage} aria-live=\"polite\">\n <CircularProgress size={14} thickness={5} />\n <Typography variant=\"body2\" component=\"span\">\n Reasoning…\n </Typography>\n </Box>\n );\n }\n\n // Message completed with no content — likely a stream/API error\n if (status.type === 'complete' || status.type === 'incomplete') {\n return (\n <Box className={classes.errorMessage} aria-live=\"polite\">\n <ErrorOutlineIcon fontSize=\"small\" />\n <Typography variant=\"body2\" component=\"span\">\n Something went wrong. Please try again.\n </Typography>\n </Box>\n );\n }\n\n return null;\n}\n\n/** Collapsible renderer for an assistant message's reasoning (thinking) part. */\nexport function ReasoningPart({ text, status }: ReasoningMessagePartProps) {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n\n return (\n <div aria-live=\"polite\">\n <button\n type=\"button\"\n className={classes.reasoningToggle}\n onClick={() => setOpen(v => !v)}\n >\n {status.type === 'running' ? (\n <CircularProgress size={12} thickness={5} />\n ) : (\n <span style={{ fontSize: 12 }}>💭</span>\n )}\n <span>Reasoning</span>\n {text &&\n (open ? (\n <ExpandLessIcon style={{ fontSize: 14 }} />\n ) : (\n <ExpandMoreIcon style={{ fontSize: 14 }} />\n ))}\n </button>\n\n {text && (\n <Collapse in={open} unmountOnExit>\n <pre className={classes.reasoningText}>{text}</pre>\n </Collapse>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parts.esm.js","sources":["../../../src/collapsible/surface/parts.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { makeStyles, useTheme, type Theme } from '@material-ui/core/styles';\nimport { Box, CircularProgress, Collapse, Typography } from '@material-ui/core';\nimport CheckCircleOutlineIcon from '@material-ui/icons/CheckCircleOutline';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport { useAuiState } from '@assistant-ui/react';\nimport type {\n EmptyMessagePartProps,\n ReasoningMessagePartProps,\n ToolCallMessagePartProps,\n} from '@assistant-ui/react';\n\nconst useStyles = makeStyles(theme => ({\n thinkingMessage: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.palette.text.secondary,\n },\n errorMessage: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(1, 1.5),\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(244,67,54,0.1)'\n : 'rgba(244,67,54,0.06)',\n color: theme.palette.error.main,\n },\n reasoningToggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(0.25, 0.75),\n border: 'none',\n borderRadius: theme.shape.borderRadius,\n background: 'none',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n reasoningText: {\n margin: theme.spacing(0.5, 0, 0.5, 2.5),\n padding: theme.spacing(1, 1.5),\n borderLeft: `2px solid ${theme.palette.divider}`,\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily as string,\n fontSize: theme.typography.caption.fontSize,\n lineHeight: 1.55,\n whiteSpace: 'pre-wrap',\n },\n toolToggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n margin: theme.spacing(0.5, 0),\n padding: theme.spacing(0.25, 0.75),\n border: 'none',\n borderRadius: theme.shape.borderRadius,\n background: 'none',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n toolBody: {\n margin: theme.spacing(0.5, 0, 0.5, 2.5),\n padding: theme.spacing(1, 1.5),\n borderLeft: `2px solid ${theme.palette.divider}`,\n },\n payloadTitle: {\n marginBottom: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n payloadBlock: {\n margin: 0,\n padding: theme.spacing(1),\n overflow: 'auto',\n maxHeight: theme.spacing(30),\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n },\n}));\n\n/** Format a byte count to a human-readable string. */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Serialize a tool input/output payload for display. */\nexport function formatPayload(value: unknown) {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n/** Check whether a tool result signals an error (backend marks with `_error`). */\nfunction isErrorResult(result: unknown): boolean {\n if (!result || typeof result !== 'object') return false;\n if ('_error' in (result as Record<string, unknown>)) return true;\n if (Array.isArray(result)) {\n return result.some(\n item =>\n item &&\n typeof item === 'object' &&\n typeof (item as { text?: unknown }).text === 'string' &&\n ((item as { text: string }).text.startsWith('Error') ||\n (item as { text: string }).text.includes('Failed')),\n );\n }\n return false;\n}\n\n/** Map a tool-call status to a human label + status icon. */\nexport function getToolStatus(status: ToolCallMessagePartProps['status'], theme: Theme, result?: unknown) {\n switch (status?.type) {\n case 'complete':\n if (isErrorResult(result)) {\n return {\n label: 'Error',\n icon: <ErrorOutlineIcon fontSize=\"small\" htmlColor={theme.palette.warning?.main ?? '#ff9800'} />,\n };\n }\n return {\n label: 'Complete',\n icon: <CheckCircleOutlineIcon fontSize=\"small\" htmlColor={theme.palette.success?.main ?? '#4caf50'} />,\n };\n case 'incomplete':\n return {\n label: 'Incomplete',\n icon: <ErrorOutlineIcon fontSize=\"small\" htmlColor={theme.palette.error.main} />,\n };\n case 'running':\n return { label: 'Running', icon: <CircularProgress size={16} color=\"inherit\" /> };\n default:\n return {\n label: 'Pending',\n icon: <HourglassEmptyIcon fontSize=\"small\" htmlColor={theme.palette.warning?.main ?? '#ff9800'} />,\n };\n }\n}\n\n/**\n * Default renderer for tool calls that don't have a bespoke UI. Shows a compact\n * toggle with the tool's status, expanding to reveal the input args and result.\n */\nexport function ToolFallback({\n toolName,\n args,\n result,\n status,\n}: ToolCallMessagePartProps) {\n const classes = useStyles();\n const theme = useTheme();\n const [open, setOpen] = useState(false);\n const { icon } = getToolStatus(status, theme, result);\n const hasArgs = args !== undefined && args !== null;\n const hasResult = result !== undefined && result !== null;\n\n return (\n <div>\n <button\n type=\"button\"\n className={classes.toolToggle}\n onClick={() => setOpen(v => !v)}\n >\n {icon}\n <span>{toolName}</span>\n {hasResult && !open && (\n <span>({formatBytes(formatPayload(result).length)})</span>\n )}\n {open ? (\n <ExpandLessIcon style={{ fontSize: 14 }} />\n ) : (\n <ExpandMoreIcon style={{ fontSize: 14 }} />\n )}\n </button>\n\n <Collapse in={open} unmountOnExit>\n <div className={classes.toolBody}>\n {hasArgs && (\n <Box mb={hasResult ? 1 : 0}>\n <Typography\n variant=\"caption\"\n component=\"div\"\n className={classes.payloadTitle}\n >\n Input\n </Typography>\n <pre className={classes.payloadBlock}>{formatPayload(args)}</pre>\n </Box>\n )}\n {hasResult && (\n <Box>\n <Typography\n variant=\"caption\"\n component=\"div\"\n className={classes.payloadTitle}\n >\n Output\n </Typography>\n <pre className={classes.payloadBlock}>{formatPayload(result)}</pre>\n </Box>\n )}\n </div>\n </Collapse>\n </div>\n );\n}\n\n/**\n * Rendered in place of an empty assistant message: a \"Reasoning…\" spinner while\n * the model is thinking. A failed turn is surfaced by {@link MessageError} at the\n * message level (which covers both empty and mid-stream failures), so there is\n * no placeholder for a non-running empty message here.\n */\nexport function ThinkingMessage({ status }: EmptyMessagePartProps) {\n const classes = useStyles();\n\n if (status.type === 'running') {\n return (\n <Box className={classes.thinkingMessage} aria-live=\"polite\">\n <CircularProgress size={14} thickness={5} />\n <Typography variant=\"body2\" component=\"span\">\n Reasoning…\n </Typography>\n </Box>\n );\n }\n\n return null;\n}\n\n/** Coerce an assistant-message error value into readable text. */\nfunction errorToText(error: unknown): string {\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === 'string') {\n return message;\n }\n }\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\n/**\n * Reads the real failure reason off the current assistant message's status (set\n * by the runtime when a turn errors — e.g. the model rejecting an over-long\n * prompt) and renders it. Returns nothing for a healthy message.\n *\n * Surfacing it at the message level — rather than only in the empty-message\n * placeholder — means it shows whether the turn failed before any tokens\n * streamed OR mid-stream after partial output. Mirrors assistant-ui's internal\n * `useMessageError` via the public `useAuiState` selector.\n */\nexport function MessageError() {\n const classes = useStyles();\n const error = useAuiState(s =>\n s.message.status?.type === 'incomplete' && s.message.status.reason === 'error'\n ? errorToText(s.message.status.error ?? 'An error occurred')\n : undefined,\n );\n\n if (!error) {\n return null;\n }\n\n return (\n <Box className={classes.errorMessage} role=\"alert\">\n <ErrorOutlineIcon fontSize=\"small\" />\n <Typography variant=\"body2\" component=\"span\">\n {error}\n </Typography>\n </Box>\n );\n}\n\n/** Collapsible renderer for an assistant message's reasoning (thinking) part. */\nexport function ReasoningPart({ text, status }: ReasoningMessagePartProps) {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n\n return (\n <div aria-live=\"polite\">\n <button\n type=\"button\"\n className={classes.reasoningToggle}\n onClick={() => setOpen(v => !v)}\n >\n {status.type === 'running' ? (\n <CircularProgress size={12} thickness={5} />\n ) : (\n <span style={{ fontSize: 12 }}>💭</span>\n )}\n <span>Reasoning</span>\n {text &&\n (open ? (\n <ExpandLessIcon style={{ fontSize: 14 }} />\n ) : (\n <ExpandMoreIcon style={{ fontSize: 14 }} />\n ))}\n </button>\n\n {text && (\n <Collapse in={open} unmountOnExit>\n <pre className={classes.reasoningText}>{text}</pre>\n </Collapse>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|