@chat-lab/ui 0.1.0-beta.29 → 0.1.0-beta.31

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.
Files changed (69) hide show
  1. package/dist/components/Chatkit/index.cjs +25 -24
  2. package/dist/components/Chatkit/index.cjs.map +1 -1
  3. package/dist/components/Chatkit/index.d.ts +2 -2
  4. package/dist/components/Chatkit/index.d.ts.map +1 -1
  5. package/dist/components/Chatkit/index.js +25 -24
  6. package/dist/components/Chatkit/index.js.map +1 -1
  7. package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
  8. package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
  9. package/dist/components/assistant-ui/markdown-text.js.map +1 -1
  10. package/dist/components/assistant-ui/reasoning.cjs +3 -1
  11. package/dist/components/assistant-ui/reasoning.cjs.map +1 -1
  12. package/dist/components/assistant-ui/reasoning.d.ts.map +1 -1
  13. package/dist/components/assistant-ui/reasoning.js +3 -1
  14. package/dist/components/assistant-ui/reasoning.js.map +1 -1
  15. package/dist/components/assistant-ui/thread.cjs +23 -23
  16. package/dist/components/assistant-ui/thread.cjs.map +1 -1
  17. package/dist/components/assistant-ui/thread.d.ts +1 -1
  18. package/dist/components/assistant-ui/thread.d.ts.map +1 -1
  19. package/dist/components/assistant-ui/thread.js +23 -23
  20. package/dist/components/assistant-ui/thread.js.map +1 -1
  21. package/dist/components/assistant-ui/tooltip-icon-button.d.ts +1 -1
  22. package/dist/components/assistant-ui/tooltip-icon-button.d.ts.map +1 -1
  23. package/dist/components/ui/button.d.ts +1 -1
  24. package/dist/components/ui/toast.cjs +1 -1
  25. package/dist/components/ui/toast.cjs.map +1 -1
  26. package/dist/components/ui/toast.d.ts +7 -7
  27. package/dist/components/ui/toast.d.ts.map +1 -1
  28. package/dist/components/ui/toast.js +1 -1
  29. package/dist/components/ui/toast.js.map +1 -1
  30. package/dist/contexts/ChatkitContext.cjs +1 -0
  31. package/dist/contexts/ChatkitContext.cjs.map +1 -1
  32. package/dist/contexts/ChatkitContext.d.ts +2 -0
  33. package/dist/contexts/ChatkitContext.d.ts.map +1 -1
  34. package/dist/contexts/ChatkitContext.js +1 -0
  35. package/dist/contexts/ChatkitContext.js.map +1 -1
  36. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseToPairs.cjs +21 -0
  37. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseToPairs.cjs.map +1 -0
  38. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseToPairs.js +19 -0
  39. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseToPairs.js.map +1 -0
  40. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createToPairs.cjs +33 -0
  41. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createToPairs.cjs.map +1 -0
  42. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createToPairs.js +31 -0
  43. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createToPairs.js.map +1 -0
  44. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToPairs.cjs +21 -0
  45. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToPairs.cjs.map +1 -0
  46. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToPairs.js +19 -0
  47. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToPairs.js.map +1 -0
  48. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toPairs.cjs +35 -0
  49. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toPairs.cjs.map +1 -0
  50. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toPairs.js +33 -0
  51. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toPairs.js.map +1 -0
  52. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/react.cjs +63 -0
  53. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/react.cjs.map +1 -0
  54. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/react.js +61 -0
  55. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/react.js.map +1 -0
  56. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/vanilla.cjs +227 -0
  57. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/vanilla.cjs.map +1 -0
  58. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/vanilla.js +223 -0
  59. package/dist/node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2dztwe4vz7tsjpr3m_@types_react@17.0.2_react@17.0.2/node_modules/valtio/esm/vanilla.js.map +1 -0
  60. package/dist/packages/core/dist/index.cjs +11 -2
  61. package/dist/packages/core/dist/index.cjs.map +1 -1
  62. package/dist/packages/core/dist/index.js +11 -2
  63. package/dist/packages/core/dist/index.js.map +1 -1
  64. package/dist/utils/download.cjs +2 -1
  65. package/dist/utils/download.cjs.map +1 -1
  66. package/dist/utils/download.d.ts.map +1 -1
  67. package/dist/utils/download.js +2 -1
  68. package/dist/utils/download.js.map +1 -1
  69. package/package.json +8 -3
@@ -6,6 +6,7 @@ var markdownText = require('./markdown-text.cjs');
6
6
  var collapsible = require('../ui/collapsible.cjs');
7
7
  var utils = require('../../lib/utils.cjs');
8
8
  var SpeakAiLineIcon = require('../../assets/SpeakAiLineIcon.cjs');
9
+ var ChatkitContext = require('../../contexts/ChatkitContext.cjs');
9
10
  var useScrollLock = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/primitives/reasoning/useScrollLock.cjs');
10
11
  var chevronDown = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
11
12
  var useAssistantState = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/context/react/hooks/useAssistantState.cjs');
@@ -18,7 +19,8 @@ const SHIMMER_DURATION = 1000;
18
19
  */
19
20
  const ReasoningRoot = ({ className, children }) => {
20
21
  const collapsibleRef = React.useRef(null);
21
- const [isOpen, setIsOpen] = React.useState(false);
22
+ const { expandReasoning } = ChatkitContext.useChatkitContext();
23
+ const [isOpen, setIsOpen] = React.useState(expandReasoning);
22
24
  const lockScroll = useScrollLock.useScrollLock(collapsibleRef, ANIMATION_DURATION);
23
25
  const handleOpenChange = React.useCallback((open) => {
24
26
  if (!open) {
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning.cjs","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["useRef","useState","useScrollLock","useCallback","_jsx","Collapsible","cn","CollapsibleTrigger","_jsxs","SpeakAiLine","ChevronDownIcon","CollapsibleContent","MarkdownText","useAssistantState","memo"],"mappings":"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"}
1
+ {"version":3,"file":"reasoning.cjs","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\nimport { useChatkitContext } from \"@/contexts/ChatkitContext\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const { expandReasoning }=useChatkitContext()\n const [isOpen, setIsOpen] = useState(expandReasoning);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["useRef","useChatkitContext","useState","useScrollLock","useCallback","_jsx","Collapsible","cn","CollapsibleTrigger","_jsxs","SpeakAiLine","ChevronDownIcon","CollapsibleContent","MarkdownText","useAssistantState","memo"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"names":[],"mappings":"AAwQA,eAAO,MAAM,SAAS;;EAAsB,CAAC;AAG7C,eAAO,MAAM,cAAc,yFAA2B,CAAC"}
1
+ {"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"names":[],"mappings":"AA0QA,eAAO,MAAM,SAAS;;EAAsB,CAAC;AAG7C,eAAO,MAAM,cAAc,yFAA2B,CAAC"}
@@ -4,6 +4,7 @@ import { MarkdownText } from './markdown-text.js';
4
4
  import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '../ui/collapsible.js';
5
5
  import { cn } from '../../lib/utils.js';
6
6
  import SpeakAiLineIcon from '../../assets/SpeakAiLineIcon.js';
7
+ import { useChatkitContext } from '../../contexts/ChatkitContext.js';
7
8
  import { useScrollLock } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/primitives/reasoning/useScrollLock.js';
8
9
  import ChevronDown from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
9
10
  import { useAssistantState } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/context/react/hooks/useAssistantState.js';
@@ -16,7 +17,8 @@ const SHIMMER_DURATION = 1000;
16
17
  */
17
18
  const ReasoningRoot = ({ className, children }) => {
18
19
  const collapsibleRef = useRef(null);
19
- const [isOpen, setIsOpen] = useState(false);
20
+ const { expandReasoning } = useChatkitContext();
21
+ const [isOpen, setIsOpen] = useState(expandReasoning);
20
22
  const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
21
23
  const handleOpenChange = useCallback((open) => {
22
24
  if (!open) {
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning.js","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["_jsx","_jsxs","SpeakAiLine","ChevronDownIcon"],"mappings":"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"}
1
+ {"version":3,"file":"reasoning.js","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\nimport { useChatkitContext } from \"@/contexts/ChatkitContext\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const { expandReasoning }=useChatkitContext()\n const [isOpen, setIsOpen] = useState(expandReasoning);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["_jsx","_jsxs","SpeakAiLine","ChevronDownIcon"],"mappings":"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"}
@@ -65,11 +65,11 @@ const Thread = ({ welcome: welcome$1, recommends }) => {
65
65
  if (welcome$1)
66
66
  return welcome$1;
67
67
  if (recommends)
68
- return (jsxRuntime.jsx(welcome, { recommends: recommends, onSelect: (question) => {
68
+ return (jsxRuntime.jsx(welcome, { recommends: recommends, onSelect: question => {
69
69
  ref.current?.sendMessage({
70
70
  content: [
71
71
  {
72
- type: "text",
72
+ type: 'text',
73
73
  text: question,
74
74
  },
75
75
  ],
@@ -78,22 +78,22 @@ const Thread = ({ welcome: welcome$1, recommends }) => {
78
78
  return undefined;
79
79
  }, [recommends]);
80
80
  const { showHeader } = ChatkitContext.useChatkitContext();
81
- return (jsxRuntime.jsxs("div", { className: "min-w-full h-full flex flex-col", children: [showHeader && (jsxRuntime.jsx(threadHeader, { title: currentThread?.name || "Thread Title" })), jsxRuntime.jsx(index.LazyMotion, { features: featuresAnimation.domAnimation, children: jsxRuntime.jsx(index$1.MotionConfig, { reducedMotion: "user", children: jsxRuntime.jsxs(ThreadRoot.ThreadPrimitiveRoot, { className: "aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background", style: {
82
- ["--thread-max-width"]: "66rem",
81
+ return (jsxRuntime.jsxs("div", { className: "min-w-full h-full flex flex-col", children: [showHeader && (jsxRuntime.jsx(threadHeader, { title: currentThread?.name || 'Thread Title' })), jsxRuntime.jsx(index.LazyMotion, { features: featuresAnimation.domAnimation, children: jsxRuntime.jsx(index$1.MotionConfig, { reducedMotion: "user", children: jsxRuntime.jsxs(ThreadRoot.ThreadPrimitiveRoot, { className: "aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background", style: {
82
+ ['--thread-max-width']: '66rem',
83
83
  }, children: [jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { empty: false, children: jsxRuntime.jsxs(ThreadViewport.ThreadPrimitiveViewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4", children: [jsxRuntime.jsx(ThreadMessages.ThreadPrimitiveMessages, { components: {
84
84
  UserMessage,
85
85
  EditComposer,
86
86
  AssistantMessage,
87
87
  } }), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9 bg-white" }), jsxRuntime.jsx(Composer, {})] }) }), jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { empty: true, children: jsxRuntime.jsxs(ThreadViewport.ThreadPrimitiveViewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center", children: [jsxRuntime.jsx("div", { className: " aui-thread-viewport-spacer min-h-12 grow z-9 bg-white" }), currentThread?.loading ? (jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-1.5 h-[180px]", children: [jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
88
- animation: "bounce 1s ease-in-out infinite",
89
- animationDelay: "0ms",
88
+ animation: 'bounce 1s ease-in-out infinite',
89
+ animationDelay: '0ms',
90
90
  } }), jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
91
- animation: "bounce 1s ease-in-out infinite",
92
- animationDelay: "150ms",
91
+ animation: 'bounce 1s ease-in-out infinite',
92
+ animationDelay: '150ms',
93
93
  } }), jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
94
- animation: "bounce 1s ease-in-out infinite",
95
- animationDelay: "300ms",
96
- } })] })) : (welcomeElement ?? jsxRuntime.jsx(ThreadWelcome, {})), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9 bg-white" }), jsxRuntime.jsx(Composer, {})] }) })] }) }) })] }));
94
+ animation: 'bounce 1s ease-in-out infinite',
95
+ animationDelay: '300ms',
96
+ } })] })) : ((welcomeElement ?? jsxRuntime.jsx(ThreadWelcome, {}))), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9 bg-white" }), jsxRuntime.jsx(Composer, {})] }) })] }) }) })] }));
97
97
  };
98
98
  const ThreadScrollToBottom = () => {
99
99
  return (jsxRuntime.jsx(ThreadScrollToBottom$1.ThreadPrimitiveScrollToBottom, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Scroll to bottom", variant: "outline", className: "aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent", children: jsxRuntime.jsx(arrowDown.default, {}) }) }));
@@ -105,7 +105,7 @@ const NewThread = () => {
105
105
  const id = `thread-${Date.now()}`;
106
106
  ref.current?.addThread({
107
107
  id,
108
- name: "新对话",
108
+ name: '新对话',
109
109
  sending: false,
110
110
  metadata: {},
111
111
  messages: [],
@@ -122,7 +122,7 @@ const ClearThread = () => {
122
122
  };
123
123
  const { currentThread } = useThread();
124
124
  const disabled = currentThread?.messages.length === 0 || currentThread?.loading;
125
- return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: disabled, onClick: handleCreateNewThread, className: utils.cn("flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50", disabled && "opacity-50 pointer-events-none"), children: jsxRuntime.jsx(ClearIcon, { className: "size-[16px]" }) }));
125
+ return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: disabled, onClick: handleCreateNewThread, className: utils.cn('flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50', disabled && 'opacity-50 pointer-events-none'), children: jsxRuntime.jsx(ClearIcon, { className: "size-[16px]" }) }));
126
126
  };
127
127
  const ThreadWelcome = () => {
128
128
  return (jsxRuntime.jsx("div", { className: "aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col", children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-center flex w-full flex-col items-center justify-center", children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]", children: "\u4F60\u597D" }) }) }));
@@ -153,17 +153,17 @@ const AssistantActionBar = () => {
153
153
  const [submittedFeedback, setSubmittedFeedback] = React.useState(undefined);
154
154
  useThread();
155
155
  const downloadContent = useAssistantState.useAssistantState(({ message }) => {
156
- if ((message.role !== "assistant" || message.status?.type !== "running") &&
157
- message.parts.some((c) => c.type === "text" && c.text.length > 0)) {
156
+ if ((message.role !== 'assistant' || message.status?.type !== 'running') &&
157
+ message.parts.some(c => c.type === 'text' && c.text.length > 0)) {
158
158
  return message.parts
159
- .filter((c) => c.type === "text")
160
- .map((c) => c.text)
161
- .join("\n");
159
+ .filter(c => c.type === 'text')
160
+ .map(c => c.text)
161
+ .join('\n');
162
162
  }
163
- return "";
163
+ return '';
164
164
  });
165
- return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
166
- download.saveStringToMarkdown(downloadContent, "message.md");
165
+ return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === 'positive' ? undefined : 'positive'), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === 'positive' ? '#000' : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === 'negative' ? undefined : 'negative'), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === 'negative' ? '#000' : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
166
+ download.saveStringToMarkdown(downloadContent, 'message.md');
167
167
  }, children: jsxRuntime.jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsxRuntime.jsx(ActionBarReload.ActionBarPrimitiveReload, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Refresh", children: jsxRuntime.jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
168
168
  };
169
169
  // const UserActionBar: FC = () => {
@@ -185,10 +185,10 @@ const EditComposer = () => {
185
185
  return (jsxRuntime.jsx("div", { className: "aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4", children: jsxRuntime.jsxs(ComposerRoot.ComposerPrimitiveRoot, { className: "aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted", children: [jsxRuntime.jsx(ComposerInput.ComposerPrimitiveInput, { className: "aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none", autoFocus: true }), jsxRuntime.jsxs("div", { className: "aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end", children: [jsxRuntime.jsx(ComposerCancel.ComposerPrimitiveCancel, { asChild: true, children: jsxRuntime.jsx(button.Button, { variant: "ghost", size: "sm", "aria-label": "Cancel edit", children: "Cancel" }) }), jsxRuntime.jsx(ComposerSend.ComposerPrimitiveSend, { asChild: true, children: jsxRuntime.jsx(button.Button, { size: "sm", "aria-label": "Update message", children: "Update" }) })] })] }) }));
186
186
  };
187
187
  const BranchPicker = ({ className, ...rest }) => {
188
- return (jsxRuntime.jsxs(BranchPickerRoot.BranchPickerPrimitiveRoot, { hideWhenSingleBranch: true, className: utils.cn("aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground", className), ...rest, children: [jsxRuntime.jsx(BranchPickerPrevious.BranchPickerPrimitivePrevious, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Previous", children: jsxRuntime.jsx(chevronLeft.default, {}) }) }), jsxRuntime.jsxs("span", { className: "aui-branch-picker-state font-medium", children: [jsxRuntime.jsx(BranchPickerNumber.BranchPickerPrimitiveNumber, {}), " / ", jsxRuntime.jsx(BranchPickerCount.BranchPickerPrimitiveCount, {})] }), jsxRuntime.jsx(BranchPickerNext.BranchPickerPrimitiveNext, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Next", children: jsxRuntime.jsx(chevronRight.default, {}) }) })] }));
188
+ return (jsxRuntime.jsxs(BranchPickerRoot.BranchPickerPrimitiveRoot, { hideWhenSingleBranch: true, className: utils.cn('aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground', className), ...rest, children: [jsxRuntime.jsx(BranchPickerPrevious.BranchPickerPrimitivePrevious, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Previous", children: jsxRuntime.jsx(chevronLeft.default, {}) }) }), jsxRuntime.jsxs("span", { className: "aui-branch-picker-state font-medium", children: [jsxRuntime.jsx(BranchPickerNumber.BranchPickerPrimitiveNumber, {}), " / ", jsxRuntime.jsx(BranchPickerCount.BranchPickerPrimitiveCount, {})] }), jsxRuntime.jsx(BranchPickerNext.BranchPickerPrimitiveNext, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Next", children: jsxRuntime.jsx(chevronRight.default, {}) }) })] }));
189
189
  };
190
190
  const UserMessage = () => {
191
- return (jsxRuntime.jsx(MessageRoot.MessagePrimitiveRoot, { asChild: true, children: jsxRuntime.jsxs("div", { className: "aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group", "data-role": "user", children: [jsxRuntime.jsx(attachment.UserMessageAttachments, {}), jsxRuntime.jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsxRuntime.jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]", children: jsxRuntime.jsx(MessageParts.MessagePrimitiveParts, {}) }) })] }) }));
191
+ return (jsxRuntime.jsx(MessageRoot.MessagePrimitiveRoot, { asChild: true, children: jsxRuntime.jsxs("div", { className: "aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group", "data-role": "user", children: [jsxRuntime.jsx(attachment.UserMessageAttachments, {}), jsxRuntime.jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsxRuntime.jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]", children: jsxRuntime.jsx(MessageParts.MessagePrimitiveParts, { components: { Text: markdownText.MarkdownText } }) }) })] }) }));
192
192
  };
193
193
 
194
194
  exports.Thread = Thread;
@@ -1 +1 @@
1
- {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n Mic,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center\">\n <div className=\" aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n \n <Composer />\n \n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[32px] w-[32px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0||currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\"flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50\", disabled && \"opacity-50 pointer-events-none\")}\n\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-shrink-0\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n \n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div\n key={idx}\n className=\"flex items-center justify-center\"\n >\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[16px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[16px] text-white\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n {/* <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" /> */}\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","Button","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
1
+ {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n Mic,\n} from 'lucide-react';\nimport { v4 as uuid } from 'uuid';\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from '@assistant-ui/react';\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from 'react';\nimport { LazyMotion, MotionConfig, domAnimation } from 'motion/react';\nimport * as m from 'motion/react-m';\n\nimport { Button } from '@/components/ui/button';\nimport { MarkdownText } from '@/components/assistant-ui/markdown-text';\nimport { ToolFallback } from '@/components/assistant-ui/tool-fallback';\nimport { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from '@/components/assistant-ui/attachment';\nimport { File } from '@/components/assistant-ui/file';\n\nimport { cn } from '@/lib/utils';\nimport { Reasoning, ReasoningGroup } from './reasoning';\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from '@/contexts/ChatkitContext';\nimport ThumbUpIcon from '@/assets/ThumbUpIcon';\nimport ThumbDownIcon from '@/assets/ThumbDownIcon';\nimport CopyIcon from '@/assets/Copy';\nimport RefreshIcon from '@/assets/RefreshIcon';\nimport ThreadHeader from './thread-header';\nimport NewSession from '@/assets/NewSession';\nimport dayjs from 'dayjs';\nimport useThread from '@/hooks/useThread';\nimport Recommend from '../welcome';\nimport { saveStringToMarkdown } from '@/utils/download';\nimport Download from '@/assets/Download';\nimport AbortMessage from '@/assets/AbortMessage';\nimport ClearIcon from '@/assets/ClearIcon';\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={question => {\n ref.current?.sendMessage({\n content: [\n {\n type: 'text',\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || 'Thread Title'} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n ['--thread-max-width' as string]: '66rem',\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center\">\n <div className=\" aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: 'bounce 1s ease-in-out infinite',\n animationDelay: '0ms',\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: 'bounce 1s ease-in-out infinite',\n animationDelay: '150ms',\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: 'bounce 1s ease-in-out infinite',\n animationDelay: '300ms',\n }}\n />\n </div>\n ) : (\n (welcomeElement ?? <ThreadWelcome />)\n )}\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: '新对话',\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[32px] w-[32px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled =\n currentThread?.messages.length === 0 || currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\n 'flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50',\n disabled && 'opacity-50 pointer-events-none',\n )}\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-shrink-0\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[16px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[16px] text-white\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? 'call' : 'calls'}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n 'positive' | 'negative' | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== 'assistant' || message.status?.type !== 'running') &&\n message.parts.some(c => c.type === 'text' && c.text.length > 0)\n ) {\n return message.parts\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join('\\n');\n }\n return '';\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === 'positive' ? undefined : 'positive',\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === 'positive' ? '#000' : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === 'negative' ? undefined : 'negative',\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === 'negative' ? '#000' : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n onClick={() => {\n saveStringToMarkdown(downloadContent, 'message.md');\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n 'aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground',\n className,\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts components={{ Text: MarkdownText }} />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n {/* <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" /> */}\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","Button","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type FC } from "react";
1
+ import { type FC } from 'react';
2
2
  export declare const Thread: FC<{
3
3
  welcome?: React.ReactNode;
4
4
  recommends?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAAqB,KAAK,EAAE,EAA0B,MAAM,OAAO,CAAC;AAoC3E,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CA2FA,CAAC"}
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAAqB,KAAK,EAAE,EAA0B,MAAM,OAAO,CAAC;AAoC3E,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CA0FA,CAAC"}