@next-bricks/ai 1.31.9 → 1.31.11
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.
- package/dist/bricks.json +1 -1
- package/dist/chunks/3497.306a84f1.js +2 -0
- package/dist/chunks/{3497.c403648d.js.map → 3497.306a84f1.js.map} +1 -1
- package/dist/chunks/{4145.d0777ce0.js → 4145.0f25e5d6.js} +2 -2
- package/dist/chunks/{4145.d0777ce0.js.map → 4145.0f25e5d6.js.map} +1 -1
- package/dist/chunks/{4837.63e15fd1.js → 4837.ffbfba7c.js} +2 -2
- package/dist/chunks/{4837.63e15fd1.js.map → 4837.ffbfba7c.js.map} +1 -1
- package/dist/chunks/{5582.27b656fa.js → 5582.65b4442f.js} +3 -3
- package/dist/chunks/5582.65b4442f.js.map +1 -0
- package/dist/chunks/{7218.3ff8f8ce.js → 7218.ccf02fc8.js} +2 -2
- package/dist/chunks/{7218.3ff8f8ce.js.map → 7218.ccf02fc8.js.map} +1 -1
- package/dist/chunks/{chat-agent.a12a95e9.js → chat-agent.05449444.js} +2 -2
- package/dist/chunks/{chat-agent.a12a95e9.js.map → chat-agent.05449444.js.map} +1 -1
- package/dist/chunks/{main.42c19250.js → main.97131576.js} +2 -2
- package/dist/chunks/{main.42c19250.js.map → main.97131576.js.map} +1 -1
- package/dist/{index.052014e5.js → index.234205da.js} +2 -2
- package/dist/{index.052014e5.js.map → index.234205da.js.map} +1 -1
- package/package.json +3 -3
- package/dist/chunks/3497.c403648d.js +0 -2
- package/dist/chunks/5582.27b656fa.js.map +0 -1
- /package/dist/chunks/{5582.27b656fa.js.LICENSE.txt → 5582.65b4442f.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/3497.c403648d.js","mappings":"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","sources":["webpack:///./src/chat-view/ChatViewContext.ts","webpack:///./src/chat-view/components/Loading.tsx","webpack:///./src/chat-view/components/MessageItem/Avatar.tsx","webpack:///./src/chat-view/components/MessageItem/GuideItem.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/ProgressText.tsx","webpack:///./src/chat-view/components/MessageItem/MsgItemContext.ts","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/CustomComponent.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/index.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/index.tsx","webpack:///./src/chat-view/components/MessageItem/TableItem.tsx","webpack:///./src/chat-view/components/MessageItem/TextItem.tsx","webpack:///./src/chat-view/components/MessageItem/Toolbar.tsx","webpack:///./src/chat-view/components/MessageItem/Time.tsx","webpack:///./src/chat-view/components/MessageItem/ToolCalls.tsx","webpack:///./src/chat-view/components/MessageItem/index.tsx","webpack:///./src/chat-view/components/QuickAnswerList/index.tsx","webpack:///./src/chat-view/components/StopBtn.tsx","webpack:///./src/chat-view/components/MessageList.tsx","webpack:///./src/chat-view/components/utils/calculateAutoSizeStyle.ts","webpack:///./src/chat-view/components/SearchInput.tsx","webpack:///./src/chat-view/components/SessionList.tsx","webpack:///./src/chat-view/ChatService.ts","webpack:///./src/chat-view/hooks/useChatViewInfo.ts","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/CodeBlock.shadow.css","webpack:///./src/chat-view/components/MessageItem/Markdown/markdown.shadow.css","webpack:///./src/chat-view/components/QuickAnswerList/quickAnswerList.shadow.css","webpack:///./src/chat-view/components/loading.shadow.css","webpack:///./src/chat-view/host-context.css","webpack:///./src/chat-view/index.css","webpack:///./src/chat-view/styles.shadow.css","webpack:///./src/chat-view/host-context.css?1beb","webpack:///./src/chat-view/index.css?7225"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { AgentDetailItem } from \"./components/QuickAnswerList/index.js\";\nimport { ChatBody, SessionItem } from \"./ChatService.js\";\nimport { UseBrickConf } from \"@next-core/types\";\n\nexport type Role = \"guide\" | \"user\" | \"assistant\" | \"tool\";\n\nexport type commandBrickConf = Record<\n string,\n { useBrick: UseBrickConf; showOriginData?: boolean }\n>;\n\nexport interface MessageItemContent {\n type: \"guide\" | \"text\" | \"markdown\" | \"table\" | \"load\";\n text: string;\n examplePrompts?: string[];\n}\n\nexport interface MessageItem {\n role: Role;\n content: MessageItemContent;\n created?: number | string;\n key: string;\n conversationId?: string;\n taskId?: string;\n agentId?: string;\n robotId?: string;\n chatting?: boolean;\n tag?: {\n isLike?: boolean;\n };\n type?: string;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: ToolCallFunction;\n response?: string;\n failed?: boolean;\n}\n\nexport interface ToolCallFunction {\n name: string;\n arguments: string;\n}\n\nexport interface QuickAnswerConfig {\n tip: string;\n list: AgentDetailItem[];\n}\n\nexport interface snippet {\n content: string;\n name: string;\n}\n\ninterface ChatViewContextProps {\n sessionEnd: boolean;\n sessionLoading: boolean;\n activeSessionId?: string;\n sessionList: SessionItem[];\n msgEnd: boolean;\n msgLoading: boolean;\n msgList: MessageItem[];\n loading: boolean;\n chatting: boolean;\n searchStr: string;\n showLike: boolean;\n showShare: boolean;\n readonly: boolean;\n quickAnswerConfig?: QuickAnswerConfig;\n snippetList?: snippet[];\n commandBricks?: commandBrickConf;\n showToolCalls?: boolean;\n toolNames: Map<string, string | null>;\n setAgent: (id: string) => void;\n handleIsLike: (id: string, isLike: boolean) => Promise<boolean>;\n handleChat: (str: string | ChatBody) => void;\n stopChat: () => void;\n checkSession: (id?: string, isInit?: boolean) => void;\n createSession: () => void;\n deleteSession: (ids: string[]) => Promise<boolean>;\n updateSession: (id: string, data: Partial<SessionItem>) => Promise<boolean>;\n setSearchStr: (str: string) => void;\n querySessionHistory: (limit?: number, query?: string) => void;\n}\n\nexport const ChatViewContext = createContext<ChatViewContextProps>(\n {} as ChatViewContextProps\n);\n\nexport const useChatViewContext = (): ChatViewContextProps =>\n useContext(ChatViewContext);\n","import React from \"react\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nexport function MessageListLoading() {\n return <div className=\"message-list-loading-wrapper\"></div>;\n}\n\nexport function ChatItemLoading() {\n return (\n <div className=\"chart-item-loading-wrapper\">\n <div className=\"load\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n </div>\n );\n}\n\nexport function CommonLoading() {\n return (\n <div className=\"common-loading-wrapper\">\n <WrappedIcon icon=\"loading\" lib=\"antd\" spinning />\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { useChatViewContext, type Role } from \"../../ChatViewContext.js\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nexport function Avatar({\n role,\n agentId,\n}: {\n role: Role;\n agentId?: string;\n}): React.ReactNode {\n const isUser = useMemo(() => role === \"user\", [role]);\n const { quickAnswerConfig } = useChatViewContext();\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const matchAgent = useMemo(() => {\n return agentList.find((item) => item.id === agentId);\n }, [agentList, agentId]);\n\n return !isUser && matchAgent ? (\n <WrappedIcon\n className=\"avatar\"\n {...matchAgent.icon}\n style={{\n color: `var(--theme-${matchAgent.icon.color}-color)`,\n background: `var(--theme-${matchAgent.icon.color}-background)`,\n }}\n />\n ) : (\n <div className={`avatar ${isUser ? \"user\" : \"robot\"}`} />\n );\n}\n","import React from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\ninterface GuideItemProps {\n text: string;\n prompts?: string[];\n}\n\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport function GuideItem({ text, prompts }: GuideItemProps) {\n return (\n <div className=\"guide-item\">\n {text}\n <div className=\"prompts-list\">\n {prompts\n ? prompts.map((item, index) => (\n <WrappedLink key={index}>{item}</WrappedLink>\n ))\n : null}\n </div>\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\n\nexport function ProgressText({ text }: { text: string }): React.ReactNode {\n const renderText = useMemo(() => {\n // 文本末尾存在 \\n ```, 会导致在渲染快结束的时候突然有一个换行,在结束的时候,换行被干掉,导致页面闪动的情况\n // 所以在这里计算,如果文本将要关闭,则默认不然 \\n ``` 显示\n const newText = text.replace(/\\n[`]{0,3}$/, \"\");\n return newText;\n }, [text]);\n\n return <div className=\"progress-text\">{renderText}</div>;\n}\n","import { createContext, useContext } from \"react\";\nimport { MessageItem } from \"../../ChatViewContext\";\n\nexport const MsgItemContext = createContext<MessageItem>({} as MessageItem);\n\nexport const useMsgItemContext = (): MessageItem => useContext(MsgItemContext);\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useMsgItemContext } from \"../../MsgItemContext.js\";\nimport { ReactUseMultipleBricks } from \"@next-core/react-runtime\";\nimport { useChatViewContext } from \"../../../../ChatViewContext.js\";\n\ninterface UseDataProps {\n text: string;\n chatting: boolean;\n}\n\nfunction useData({ text, chatting }: UseDataProps) {\n const cahceTextRef = useRef<string>(\"\");\n const [isEnd, setIsEnd] = useState<boolean>(false);\n const [isError, setIsError] = useState<boolean>(false);\n const [parseData, setParseData] = useState<any>();\n\n useEffect(() => {\n if (cahceTextRef.current !== text) {\n cahceTextRef.current = text;\n let data: any;\n try {\n data = JSON.parse(text);\n } catch {\n setIsError(true);\n return;\n }\n setParseData(data);\n }\n }, [text]);\n\n useEffect(() => {\n if (chatting) {\n if (text.match(/\\n[`]{0,3}$/)) {\n setIsEnd(true);\n }\n } else {\n setIsEnd(true);\n }\n }, [text, chatting]);\n\n return {\n parseData,\n isError: isEnd && isError,\n };\n}\n\nexport default function CustomComponent({\n text,\n language,\n}: {\n text: string;\n language: string;\n}) {\n const { commandBricks } = useChatViewContext();\n const { chatting, agentId, robotId, conversationId, taskId } =\n useMsgItemContext();\n\n const { parseData, isError } = useData({\n text,\n chatting: !!chatting,\n });\n\n const commandBrickConf = useMemo(() => {\n const config = commandBricks?.[language];\n if (config) {\n const data = {\n data: parseData,\n agentId,\n robotId,\n conversationId,\n taskId,\n };\n return {\n component: (\n <ReactUseMultipleBricks useBrick={config.useBrick} data={data} />\n ),\n ...config,\n };\n }\n return {\n component: null,\n showOriginData: true,\n };\n }, [\n commandBricks,\n language,\n parseData,\n agentId,\n robotId,\n conversationId,\n taskId,\n ]);\n\n return (\n <div className=\"custom-component-wrapper not-prose\">\n {commandBrickConf?.showOriginData ? (\n <>\n <div className=\"params\">\n <div className=\"params-tip\">【原始命令】: </div>\n <pre>\n <code>{text}</code>\n </pre>\n </div>\n {isError ? (\n <div className=\"error-tip\">【执行失败】</div>\n ) : (\n <>\n <div className=\"result-tip\">【执行结果】:</div>\n <div className=\"custom-component\">\n {commandBrickConf.component}\n </div>\n </>\n )}\n </>\n ) : (\n commandBrickConf.component\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useNodeViewContext } from \"@prosemirror-adapter/react\";\nimport { ProgressText } from \"./ProgressText.js\";\nimport CustomComponent from \"./CustomComponent.js\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport { GeneralIcon, GeneralIconProps } from \"@next-bricks/icons/general-icon\";\nimport { Tooltip, message } from \"antd\";\nimport { useChatViewContext } from \"../../../../ChatViewContext\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst copyIcon: GeneralIconProps = {\n lib: \"antd\",\n icon: \"copy\",\n theme: \"outlined\",\n};\n\nexport const CodeBlock = () => {\n const [language, setLanguage] = useState(\"\");\n const { contentRef, node } = useNodeViewContext();\n const { commandBricks } = useChatViewContext();\n const [messageApi, contextHolder] = message.useMessage();\n\n const handleCopy = async () => {\n const text = node.content.firstChild?.text;\n try {\n if (text) {\n await navigator.clipboard.writeText(text);\n messageApi.success(\"复制成功\");\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"Failed to copy: \", err);\n messageApi.error(\"复制失败\");\n }\n };\n\n const defaultContent = useMemo(\n () => (\n <div className=\"default-container\">\n {contextHolder}\n <pre spellCheck={false}>\n <code ref={contentRef} style={{ position: \"relative\" }}>\n <div className=\"default-toolbar-container\">\n <Tooltip title=\"复制\" color=\"#474747\" arrow={false}>\n <WrappedIcon\n {...(copyIcon as GeneralIconProps)}\n onClick={handleCopy}\n style={{ cursor: \"pointer\" }}\n />\n </Tooltip>\n </div>\n </code>\n </pre>\n </div>\n ),\n [contentRef]\n );\n\n const renderContent = useMemo(() => {\n if (!node.firstChild?.text) return null;\n const text = node.firstChild?.textContent;\n const lang = language || node.attrs?.language;\n if (commandBricks && commandBricks[lang]) {\n return <CustomComponent text={text} language={lang} />;\n }\n switch (lang) {\n case \"easy_cmd_progress\":\n return <ProgressText text={text} />;\n default:\n return defaultContent;\n }\n }, [node, language, defaultContent, commandBricks]);\n\n useEffect(() => {\n if (!language) {\n const {\n attrs: { language },\n } = node;\n if (language) {\n setLanguage(language);\n }\n }\n }, [node, language]);\n\n return renderContent;\n};\n","import React, { useEffect } from \"react\";\nimport {\n defaultValueCtx,\n Editor,\n rootCtx,\n editorViewOptionsCtx,\n} from \"@milkdown/core\";\nimport { EditorView } from \"prosemirror-view\";\nimport { Milkdown, useEditor, MilkdownProvider } from \"@milkdown/react\";\nimport { commonmark, codeBlockSchema } from \"@milkdown/preset-commonmark\";\nimport { nord } from \"@milkdown/theme-nord\";\nimport { gfm } from \"@milkdown/preset-gfm\";\nimport { prism } from \"@milkdown/plugin-prism\";\nimport { $view, replaceAll } from \"@milkdown/utils\";\nimport {\n ProsemirrorAdapterProvider,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { CodeBlock } from \"./CodeBlock/index.js\";\n\nexport function MarkdownItem({ text }: { text: string }) {\n return (\n <div className=\"markdown-item\">\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownDisplay value={text} />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n </div>\n );\n}\n\nexport function MarkdownDisplay({ value }: { value: string }): React.ReactNode {\n const nodeViewFactory = useNodeViewFactory();\n\n const handleClick = (view: EditorView, pos: number) => {\n const found = view.state.tr.doc.nodeAt(pos);\n const mark = found?.marks.find((m) => m.type.name === \"link\");\n if (mark) {\n const href = mark?.attrs.href;\n window.open(href, \"_blank\");\n }\n return true;\n };\n\n const transformOpenAIToCodeBlock = (str: string) => {\n if (/<tool_call>(.+)<\\/tool_call>/.test(str)) {\n return str.replace(\n /<tool_call>(.+?)<\\/tool_call>/g,\n (_, $1) => `\\n\\`\\`\\`easy_cmd_tool_call\\n${$1}\\n\\`\\`\\`\\n`\n );\n }\n return str;\n };\n\n const { get } = useEditor((root) => {\n return Editor.make()\n .config((ctx) => {\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => false,\n handleClickOn: (view: EditorView, pos: number) =>\n handleClick(view, pos),\n }));\n const realValue = transformOpenAIToCodeBlock(value);\n realValue && ctx.set(defaultValueCtx, realValue);\n //拦截link的默认点击事件以支持通过新窗口弹出页面,如果后续有其他的定制化需求可以改用custom widget的方式写link widget\n const observer = new MutationObserver(() => {\n const links = Array.from(root.querySelectorAll(\"a\"));\n links.forEach((link) => {\n link.onclick = () => false;\n });\n });\n observer.observe(root, {\n childList: true,\n subtree: true,\n });\n })\n .config(nord)\n .use(prism)\n .use(gfm)\n .use(commonmark)\n .use(\n $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n if (value !== undefined) {\n const realValue = transformOpenAIToCodeBlock(value);\n get()?.action(replaceAll(realValue));\n }\n }, [get, value]);\n\n return <Milkdown />;\n}\n","import React from \"react\";\n// import { wrapBrick } from \"@next-core/react-element\";\n// import type {\n// EoNextTable,\n// NextTableComponentProps,\n// } from \"@next-bricks/advanced/next-table\";\n\ninterface MarkdownItemProps {\n text: string;\n}\n\n// const WrappedNextTable = wrapBrick<EoNextTable, NextTableComponentProps>(\n// \"eo-next-table\"\n// );\n\nexport function TableItem({ text }: MarkdownItemProps) {\n // const parseContent = useMemo((): NextTableComponentProps => {\n // let content: NextTableComponentProps;\n // try {\n // content = JSON.parse(text);\n // } catch {\n // content = {} as NextTableComponentProps;\n // }\n // return content;\n // }, [text]);\n\n // return (\n // <div className=\"table-item\">\n // <WrappedNextTable pagination={false} {...parseContent} />\n // </div>\n // );\n return <div className=\"table-item\">{text}</div>;\n}\n","import React from \"react\";\n\ninterface TextItem {\n text: string;\n}\n\nexport function TextItem({ text }: TextItem) {\n return <div className=\"text-item\">{text}</div>;\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { copyToClipboard as _copyToClipboard } from \"@next-bricks/basic/data-providers/copy-to-clipboard\";\nimport type { showNotification as _showNotification } from \"@next-bricks/basic/data-providers/show-notification/show-notification\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport { MessageItem, useChatViewContext } from \"../../ChatViewContext\";\nimport { unwrapProvider } from \"@next-core/utils/general\";\nimport classNames from \"classnames\";\nimport { useMsgItemContext } from \"./MsgItemContext\";\nimport { getBasePath } from \"@next-core/runtime\";\n\nconst WrapperIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\nconst copyToClipboard = unwrapProvider<typeof _copyToClipboard>(\n \"basic.copy-to-clipboard\"\n);\nconst showNotification = unwrapProvider<typeof _showNotification>(\n \"basic.show-notification\"\n);\n\nexport function Toolbar({\n role,\n content,\n chatting,\n taskId,\n tag,\n}: MessageItem): React.ReactNode {\n const isAssistant = useMemo(\n () => role === \"assistant\" && content.type !== \"load\",\n [role, content.type]\n );\n const isUser = useMemo(() => role === \"user\", [role]);\n\n const isChattingItem = useMemo(() => chatting, [chatting]);\n const {\n showLike,\n chatting: globalChatting,\n showShare,\n readonly,\n handleIsLike,\n setSearchStr,\n } = useChatViewContext();\n const { agentId, robotId, conversationId } = useMsgItemContext();\n\n const handleCopy = () => {\n copyToClipboard(content.text)\n .then(() => showNotification({ type: \"success\", message: \"复制成功\" }))\n .catch(() => showNotification({ type: \"error\", message: \"复制失败\" }));\n };\n\n const handleRequestion = () => {\n setSearchStr(content.text);\n };\n\n const handleShare = () => {\n copyToClipboard(\n `${location.origin}${getBasePath()}ai-center/share?agentId=${agentId}&robotId=${robotId}&conversationId=${conversationId}`\n )\n .then(() =>\n showNotification({ type: \"success\", message: \"会话链接已复制到剪贴板\" })\n )\n .catch(() =>\n showNotification({ type: \"error\", message: \"会话链接复制失败\" })\n );\n };\n\n const handleLikeOrIsLike = useCallback(\n async (islike: boolean) => {\n const result = await handleIsLike(taskId!, islike);\n showNotification({\n message: `${islike ? \"点赞\" : \"操作\"}${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n },\n [taskId, handleIsLike]\n );\n\n return isAssistant && !isChattingItem ? (\n <div className=\"message-toolbar\">\n {showLike && !readonly && (\n <>\n <WrappedToolTip content=\"点赞\" hoist>\n <WrapperIcon\n className={classNames(\"like\", {\n active: tag?.isLike === true,\n })}\n lib=\"easyops\"\n icon=\"like\"\n onClick={() => handleLikeOrIsLike(true)}\n />\n </WrappedToolTip>\n <WrappedToolTip content=\"还不够好\" hoist>\n <WrapperIcon\n className={classNames(\"unlike\", {\n active: tag?.isLike === false,\n })}\n lib=\"easyops\"\n icon=\"unlike\"\n onClick={() => handleLikeOrIsLike(false)}\n />\n </WrappedToolTip>\n <div className=\"split\" />\n </>\n )}\n <WrappedToolTip content=\"点击复制\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"copy\" onClick={handleCopy} />\n </WrappedToolTip>\n {showShare && (\n <WrappedToolTip content=\"点击分享\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"share-alt\" onClick={handleShare} />\n </WrappedToolTip>\n )}\n </div>\n ) : !readonly && isUser && !globalChatting ? (\n <div className=\"message-toolbar\">\n <WrappedToolTip content=\"点击再次提问\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"edit\" onClick={handleRequestion} />\n </WrappedToolTip>\n </div>\n ) : null;\n}\n","import moment from \"moment\";\nimport React from \"react\";\n\nexport function Time({ time }: { time?: string | number }) {\n return (\n <div className=\"time\">\n {time\n ? typeof time === \"string\"\n ? time\n : moment(time).format(\"YYYY-MM-DD HH:mm:ss\")\n : null}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { Tag, TagProps } from \"@next-bricks/basic/tag\";\nimport type { Button, ButtonProps } from \"@next-bricks/basic/button\";\nimport classNames from \"classnames\";\nimport { JSON_SCHEMA, safeDump } from \"js-yaml\";\nimport { useChatViewContext, type ToolCall } from \"../../ChatViewContext\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedButton = wrapBrick<Button, ButtonProps>(\"eo-button\");\nconst WrappedTag = wrapBrick<Tag, TagProps>(\"eo-tag\");\n\nexport interface ToolCallsProps {\n toolCalls: ToolCall[];\n}\n\ninterface ProcessedToolCall {\n id: string;\n functionName: string;\n processedArguments: ProcessedValue;\n processedResponse?: ProcessedValue;\n args: string;\n response?: string;\n failed?: boolean;\n}\n\ninterface ProcessedValue {\n ok: boolean;\n data?: unknown;\n error?: unknown;\n}\n\ntype ProcessStatus = \"processing\" | \"ok\" | \"failed\";\n\nexport function ToolCalls({ toolCalls }: ToolCallsProps) {\n const [expanded, setExpanded] = useState(false);\n\n const processedToolCalls = useMemo(() => {\n return toolCalls.map<ProcessedToolCall>(\n ({ id, function: func, response }) => {\n let processedArguments: ProcessedValue;\n try {\n const data = JSON.parse(func.arguments);\n processedArguments = {\n ok: true,\n data,\n };\n } catch {\n // Fallback to the original arguments\n processedArguments = {\n ok: true,\n data: func.arguments,\n };\n }\n\n let processedResponse: ProcessedValue | undefined;\n if (typeof response === \"string\") {\n let data: unknown;\n try {\n data = JSON.parse(response);\n processedResponse = {\n ok: true,\n data,\n };\n } catch {\n // Fallback to the original response\n processedResponse = {\n ok: true,\n data: response,\n };\n }\n } else {\n processedResponse = {\n ok: false,\n };\n }\n\n return {\n id,\n functionName: func.name,\n processedArguments,\n processedResponse,\n args: func.arguments,\n response,\n };\n }\n );\n }, [toolCalls]);\n\n const processStatus = useMemo(() => {\n let status: ProcessStatus = \"ok\";\n for (const toolCall of processedToolCalls) {\n if (toolCall.processedResponse === undefined) {\n status = \"processing\";\n break;\n }\n if (toolCall.processedResponse.ok === false) {\n status = \"failed\";\n }\n }\n return status;\n }, [processedToolCalls]);\n\n return (\n <div className=\"tool-calls\">\n {expanded ? (\n <>\n <div className=\"tool-calls-summary\">\n <WrappedButton type=\"ghost\" onClick={() => setExpanded(false)}>\n <span style={{ marginRight: 8 }}>隐藏工具调用过程</span>\n <WrappedIcon\n lib=\"fa\"\n prefix=\"fas\"\n icon=\"chevron-up\"\n className=\"tool-calls-summary-toggle\"\n />\n </WrappedButton>\n </div>\n {processedToolCalls.map((toolCall) => (\n <ToolCallComponent\n id={toolCall.id}\n key={toolCall.id}\n functionName={toolCall.functionName}\n processedArguments={toolCall.processedArguments}\n processedResponse={toolCall.processedResponse}\n args={toolCall.args}\n />\n ))}\n </>\n ) : (\n <div className=\"tool-calls-summary\" onClick={() => setExpanded(true)}>\n <span className={classNames(\"tool-calls-status\", processStatus)}>\n {processStatus === \"processing\" ? (\n <WrappedIcon lib=\"fa\" prefix=\"fas\" icon=\"spinner\" spinning />\n ) : processStatus === \"ok\" ? (\n <WrappedIcon lib=\"fa\" prefix=\"far\" icon=\"circle-check\" />\n ) : (\n <WrappedIcon lib=\"fa\" prefix=\"fas\" icon=\"triangle-exclamation\" />\n )}\n <span>\n {processStatus === \"processing\"\n ? \"工具调用中\"\n : processStatus === \"ok\"\n ? \"工具调用完成\"\n : \"工具调用失败\"}\n </span>\n </span>\n <WrappedIcon\n lib=\"fa\"\n prefix=\"fas\"\n icon=\"chevron-down\"\n className=\"tool-calls-summary-toggle\"\n />\n </div>\n )}\n </div>\n );\n}\n\ninterface ToolCallProps {\n id: string;\n functionName: string;\n processedArguments: ProcessedValue;\n processedResponse?: ProcessedValue;\n args: string;\n response?: string;\n}\n\nfunction ToolCallComponent({\n functionName,\n processedArguments,\n processedResponse,\n args,\n}: ToolCallProps) {\n const { toolNames } = useChatViewContext();\n\n return (\n <div className=\"tool-call\">\n <div className=\"tool-call-function-name\">\n <WrappedIcon lib=\"antd\" theme=\"outlined\" icon=\"function\" />\n {toolNames.get(functionName) ?? functionName}\n </div>\n <WrappedTag outline>Arguments</WrappedTag>\n <div\n className={classNames(\"tool-call-function-arguments\", {\n failed: !processedArguments.ok,\n })}\n >\n <pre>\n <code>\n {processedArguments.ok ? dumpYaml(processedArguments.data) : args}\n </code>\n </pre>\n </div>\n {processedResponse ? (\n <>\n <WrappedTag outline>Response</WrappedTag>\n <div\n className={classNames(\"tool-call-function-response\", {\n failed: !processedResponse.ok,\n })}\n >\n <pre>\n <code>\n {processedResponse.ok\n ? dumpYaml(processedResponse.data)\n : \"Failed\"}\n </code>\n </pre>\n </div>\n </>\n ) : (\n <div className=\"tool-call-wait-response\">…</div>\n )}\n </div>\n );\n}\n\nfunction dumpYaml(value: unknown) {\n return safeDump(value, {\n schema: JSON_SCHEMA,\n skipInvalid: true,\n noRefs: true,\n noCompatMode: true,\n });\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport {\n MessageItem,\n MessageItemContent,\n useChatViewContext,\n} from \"../../ChatViewContext.js\";\nimport { GuideItem } from \"./GuideItem.js\";\nimport { MarkdownItem } from \"./Markdown/index.js\";\nimport { TableItem } from \"./TableItem.js\";\nimport { ChatItemLoading } from \"../Loading.js\";\nimport { TextItem } from \"./TextItem.js\";\nimport { Toolbar } from \"./Toolbar.js\";\nimport { Time } from \"./Time.js\";\n// import { ContentTip } from \"./ContentTip.js\";\nimport { MsgItemContext } from \"./MsgItemContext.js\";\nimport {\n DEFAULT_TYPE,\n RELATED_QUESTIONS_TYPE,\n} from \"../../hooks/useChatViewInfo.js\";\nimport { ToolCalls } from \"./ToolCalls.js\";\n\nconst NOT_AGENT_MATCH = \"no_agent\";\n\nexport function MessageNode(props: MessageItem): React.ReactNode {\n const {\n content,\n created,\n role,\n agentId,\n type: itemType,\n chatting,\n toolCalls,\n } = props;\n const isUser = useMemo(() => role === \"user\", [role]);\n const { quickAnswerConfig, showToolCalls } = useChatViewContext();\n\n const getContentNode = useCallback((content: MessageItemContent) => {\n const { type, text, examplePrompts } = content;\n switch (type) {\n case \"guide\":\n return <GuideItem text={text} prompts={examplePrompts} />;\n case \"text\":\n return <TextItem text={text} />;\n case \"table\":\n return <TableItem text={text} />;\n case \"load\":\n return <ChatItemLoading />;\n case \"markdown\":\n default:\n return <MarkdownItem text={text} />;\n }\n }, []);\n\n const messageNode = useMemo(\n () => getContentNode(content),\n [content, getContentNode]\n );\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const matchAgent = useMemo(() => {\n return agentList.find((item) => item.id === agentId);\n }, [agentList, agentId]);\n\n const getMsgNode = useCallback(() => {\n switch (itemType) {\n case RELATED_QUESTIONS_TYPE:\n return (\n <>\n <div className=\"message-top\">\n <div style={{ color: \"gray\" }}>推荐提问</div>\n </div>\n <div className=\"message-content\">\n <div className=\"wrapper\">\n {chatting ? (\n <div className=\"content\">\n <ChatItemLoading />\n </div>\n ) : (\n <>{messageNode}</>\n )}\n </div>\n </div>\n </>\n );\n case DEFAULT_TYPE:\n default:\n return (\n <>\n <div className=\"message-top\">\n {isUser\n ? \"我\"\n : !agentId || agentId === NOT_AGENT_MATCH || !matchAgent\n ? \"AI助手\"\n : matchAgent.name}\n <Time time={created} />\n </div>\n <div className=\"message-content\">\n <div className=\"wrapper\">\n {showToolCalls && toolCalls?.length ? (\n <ToolCalls toolCalls={toolCalls} />\n ) : null}\n <div className=\"content\">{messageNode}</div>\n <Toolbar {...props} />\n </div>\n </div>\n </>\n );\n }\n }, [\n itemType,\n isUser,\n agentId,\n matchAgent,\n created,\n chatting,\n messageNode,\n props,\n showToolCalls,\n toolCalls,\n ]);\n\n return (\n <MsgItemContext.Provider value={props}>\n <div className=\"message-box\">{getMsgNode()}</div>\n </MsgItemContext.Provider>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChatViewContext } from \"../../ChatViewContext\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport interface AgentDetailItem {\n name: string;\n description: string;\n icon: GeneralIconProps & { color: string };\n starterPrompts?: string[];\n instanceId: string;\n id: string;\n [key: string]: any;\n}\n\nconst CARD_ITEM_HEIGHT = 85;\nconst HEIGHT_GAP = 24;\n\nfunction QuickAnswerCardItem({\n name,\n description,\n icon,\n starterPrompts,\n}: AgentDetailItem) {\n const { setSearchStr } = useChatViewContext();\n\n const handleCardClick = () => {\n starterPrompts?.length && setSearchStr(starterPrompts[0]);\n };\n\n const iconColor = useMemo(() => icon?.color ?? \"geekblue\", [icon]);\n\n return (\n <div\n className=\"quick-answer-card-item\"\n style={{\n height: CARD_ITEM_HEIGHT,\n background: `linear-gradient(rgba(var(--theme-${iconColor}-color-rgb-channel), 0.1), rgba(var(--theme-${iconColor}-color-rgb-channel), 0.08))`,\n }}\n onClick={handleCardClick}\n >\n <div className=\"left\">\n <WrappedIcon\n className=\"icon\"\n {...(icon ?? {\n icon: \"default-app\",\n lib: \"easyops\",\n category: \"app\",\n })}\n style={{\n background: `rgba(var(--theme-${iconColor}-color-rgb-channel), 0.5)`,\n }}\n />\n </div>\n <div className=\"content\">\n <div className=\"title\">{name}</div>\n <div className=\"description\">{description}</div>\n </div>\n </div>\n );\n}\n\nexport function QuickAnswerList() {\n const { quickAnswerConfig, msgList, loading } = useChatViewContext();\n const [showMoreBtn, setShowMoreBtn] = useState<boolean>(false);\n const listRef = useRef<HTMLDivElement>(null);\n const hadClickShowMoreBtn = useRef<boolean>(false);\n\n const handleShowMoreClick = () => {\n hadClickShowMoreBtn.current = true;\n setShowMoreBtn(false);\n };\n\n useEffect(() => {\n const element = listRef.current;\n if (element) {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (\n entry.contentRect.height >\n CARD_ITEM_HEIGHT * 3 + HEIGHT_GAP * 2\n ) {\n if (!hadClickShowMoreBtn.current) {\n setShowMoreBtn(true);\n }\n } else {\n setShowMoreBtn(false);\n }\n }\n });\n observer.observe(element);\n return () => observer.disconnect();\n }\n }, [showMoreBtn, quickAnswerConfig?.list]);\n\n return quickAnswerConfig?.list.length && msgList.length === 0 && !loading ? (\n <div className=\"quick-answer-wrapper\">\n <div className=\"tip\">\n {quickAnswerConfig.tip ??\n \"你好,我是运维数智人 — Murphy,我能为你提供以下服务:\"}\n </div>\n <div\n className=\"quick-answer-list\"\n style={{\n ...(showMoreBtn\n ? {\n maxHeight: CARD_ITEM_HEIGHT * 3 + HEIGHT_GAP * 2 + 10,\n overflow: \"hidden\",\n }\n : {}),\n }}\n ref={listRef}\n >\n {quickAnswerConfig.list.map((item) => (\n <QuickAnswerCardItem key={item.instanceId} {...item} />\n ))}\n </div>\n {showMoreBtn ? (\n <div className=\"show-more-wrapper\">\n <WrappedLink\n icon={{\n lib: \"antd\",\n icon: \"down\",\n }}\n className=\"show-more-btn\"\n onClick={handleShowMoreClick}\n >\n 显示更多\n </WrappedLink>\n </div>\n ) : null}\n </div>\n ) : null;\n}\n","import React from \"react\";\nimport { useChatViewContext } from \"../ChatViewContext\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport function StopBtn() {\n const { stopChat } = useChatViewContext();\n\n const handleStopChat = () => {\n stopChat();\n };\n return (\n <div className=\"stop-responding-wrapper\">\n <WrappedLink className=\"stop-btn\" onClick={handleStopChat}>\n 停止生成\n </WrappedLink>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport ResizeObserver from \"resize-observer-polyfill\";\nimport { MessageItem, useChatViewContext } from \"../ChatViewContext\";\nimport { Avatar } from \"./MessageItem/Avatar.js\";\nimport classNames from \"classnames\";\nimport { CommonLoading, MessageListLoading } from \"./Loading.js\";\nimport { MessageNode } from \"./MessageItem/index.js\";\nimport { QuickAnswerList } from \"./QuickAnswerList/index.js\";\nimport { StopBtn } from \"./StopBtn.js\";\nimport { DEFAULT_TYPE, RELATED_QUESTIONS_TYPE } from \"../hooks/useChatViewInfo\";\n\ninterface MessageListProps {\n showAvatar?: boolean;\n}\n\nexport function MessageList({\n showAvatar = true,\n}: MessageListProps): React.ReactNode {\n const chatViewRef = useRef<HTMLDivElement>(null);\n const messageListRef = useRef<HTMLDivElement>(null);\n\n const { msgLoading, msgEnd, msgList, loading, chatting } =\n useChatViewContext();\n\n const getMsgItemNode = useCallback(\n (item: MessageItem, index: number = 0) => {\n switch (item.type) {\n case RELATED_QUESTIONS_TYPE:\n return (\n <div\n className={classNames(\"message-item\")}\n style={{ marginTop: \"-36px\", marginLeft: \"44px\" }}\n key={index}\n >\n <MessageNode {...item} />\n </div>\n );\n case DEFAULT_TYPE:\n default:\n return (\n <div\n className={classNames(\"message-item\", {\n user: item.role === \"user\",\n })}\n key={index}\n >\n {showAvatar && <Avatar role={item.role} agentId={item.agentId} />}\n <MessageNode {...item} />\n </div>\n );\n }\n },\n [showAvatar]\n );\n\n const msgListNode = useMemo(() => {\n return msgList.map((item, index) => {\n return (\n <React.Fragment key={item.key}>\n {item.chatting ? (\n <>\n {getMsgItemNode(item, index)}\n {chatting &&\n index === msgList.length - 1 &&\n item.type !== RELATED_QUESTIONS_TYPE ? (\n <StopBtn />\n ) : null}\n </>\n ) : (\n getMsgItemNode(item, index)\n )}\n </React.Fragment>\n );\n });\n }, [msgList, chatting, getMsgItemNode]);\n\n const [manualScrolled, setManualScrolled] = useState(false);\n const autoScrollingRef = useRef(false);\n\n useEffect(() => {\n const chatView = chatViewRef.current;\n if (!chatView) {\n return;\n }\n const handleScroll = () => {\n if (!autoScrollingRef.current) {\n // Make a small buffer of 6px\n setManualScrolled(\n chatView.scrollTop + chatView.clientHeight! + 6 <\n chatView.scrollHeight\n );\n }\n };\n chatView.addEventListener(\"scroll\", handleScroll);\n return () => {\n chatView.removeEventListener(\"scroll\", handleScroll);\n };\n }, []);\n\n useEffect(() => {\n const element = messageListRef.current;\n const chatView = chatViewRef.current;\n if (manualScrolled || !element || !chatView) {\n // Do not auto-scroll if manual scroll detected\n return;\n }\n const observer = new ResizeObserver(() => {\n autoScrollingRef.current = true;\n chatView.scroll({ top: chatView.scrollHeight });\n requestAnimationFrame(() => {\n autoScrollingRef.current = false;\n });\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [manualScrolled]);\n\n return (\n <div className=\"chat-view\" ref={chatViewRef}>\n <div className=\"message-list\" ref={messageListRef}>\n <div className=\"message-list-box\">\n {msgEnd && msgList.length ? (\n <div className=\"message-start-tip\">会话开始</div>\n ) : null}\n {msgLoading && <CommonLoading />}\n <QuickAnswerList />\n {msgListNode}\n </div>\n {loading && <MessageListLoading />}\n </div>\n </div>\n );\n}\n","const HIDDEN_TEXTAREA_STYLE = `\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n padding: 10px !important;\n pointer-events: none !important;\n`;\n\nconst SIZING_STYLE = [\n \"letter-spacing\",\n \"line-height\",\n \"padding-top\",\n \"padding-bottom\",\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"font-variant\",\n \"text-rendering\",\n \"text-transform\",\n \"width\",\n \"text-indent\",\n \"padding-left\",\n \"padding-right\",\n \"border-width\",\n \"box-sizing\",\n \"word-break\",\n \"white-space\",\n];\nlet hiddenTextarea: HTMLTextAreaElement;\n\n/**\n * 计算 textare 高度\n * https://github.com/react-component/textarea/blob/1c0026fbe30e5f7dff1fca695b2cf262246381ca/src/calculateNodeHeight.tsx\n * */\nexport default function calculateAutoSizeStyle(\n uiTextNode: HTMLTextAreaElement,\n minRows: number | null = null,\n maxRows: number | null = null\n): React.CSSProperties {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement(\"textarea\");\n hiddenTextarea.setAttribute(\"tab-index\", \"-1\");\n hiddenTextarea.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(hiddenTextarea);\n }\n\n const uiTextNodeStyle = window.getComputedStyle(uiTextNode);\n const sizingStyle = SIZING_STYLE.map(\n (name) => `${name}:${uiTextNodeStyle.getPropertyValue(name)}`\n ).join(\";\");\n\n // equal style\n hiddenTextarea.setAttribute(\n \"style\",\n `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`\n );\n hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || \"\";\n\n let minHeight: number | undefined = undefined;\n let maxHeight: number | undefined = undefined;\n // let overflowY: any;\n\n const borderSize = 2;\n const paddingSize = 20;\n let height = hiddenTextarea.scrollHeight - paddingSize + borderSize;\n\n if (minRows !== null || maxRows !== null) {\n // measure height of a textarea with a single row\n hiddenTextarea.value = \" \";\n const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\n if (minRows !== null) {\n minHeight = singleRowHeight * minRows - paddingSize + borderSize;\n height = Math.max(paddingSize, height);\n }\n if (maxRows !== null) {\n maxHeight = singleRowHeight * maxRows - paddingSize + borderSize;\n // overflowY = height > maxHeight ? \"\" : \"hidden\";\n height = Math.min(maxHeight, height);\n }\n }\n\n const style: React.CSSProperties = {\n height,\n overflowY: \"scroll\",\n resize: \"none\",\n };\n\n if (minHeight) {\n style.minHeight = minHeight;\n }\n if (maxHeight) {\n style.maxHeight = maxHeight;\n }\n\n return style;\n}\n","import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport calculateAutoSizeStyle from \"./utils/calculateAutoSizeStyle.js\";\nimport classNames from \"classnames\";\nimport { snippet, useChatViewContext } from \"../ChatViewContext.js\";\nimport { AgentDetailItem } from \"./QuickAnswerList/index\";\nimport { ChatBody } from \"../ChatService.js\";\nimport { ReactUseMultipleBricks } from \"@next-core/react-runtime\";\n\nexport interface SearchInputRef {\n handleInsertQuestion: (value: string) => void;\n sendMsg: (msg: string | ChatBody) => void;\n}\n\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst PREFIX_WORD = \"@\";\n\nexport function LegacySearchInput(\n props: any,\n ref: React.Ref<SearchInputRef>\n): React.ReactNode {\n const [value, setValue] = useState<string>(\"\");\n const [active, setActive] = useState<boolean>(false);\n const [expand, setExpand] = useState<boolean>(false);\n const [autoSizeStyle, setAutoSizeStyle] = useState<React.CSSProperties>();\n const [isFillContent, setIsFillContent] = useState<boolean>(false);\n\n // snippets\n const [snippetOpen, setSnippetOpen] = useState<boolean>(false);\n const [matchSnippetList, setMatchSnippetList] = useState<snippet[]>([]);\n const [matchSnippetIndex, setMatchSnippetIndex] = useState<number>(0);\n\n // mention\n const [mentionOpen, setMentionOpen] = useState<boolean>(false);\n const [matchPrefixIndex, setMatchPrefixIndex] = useState<number>(-1);\n const [matchAgentList, setMatchMentionList] = useState<AgentDetailItem[]>([]);\n const [matchMentionsIndex, setMatchMentionsIndex] = useState<number>(0);\n\n const mentionsRef = useRef<HTMLDivElement>(null);\n const snippetsRef = useRef<HTMLDivElement>(null);\n const searchInputBoxRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const hadExpanded = useRef<boolean>(false);\n const inputEndRef = useRef<boolean>(false);\n\n const {\n chatting,\n loading,\n searchStr,\n quickAnswerConfig,\n createSession,\n setSearchStr,\n handleChat,\n setAgent,\n snippetList,\n } = useChatViewContext();\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const hadValue = useMemo(() => !!value, [value]);\n const defaultSize = useMemo(() => [1, 5], []);\n const disabled = useMemo(() => loading || chatting, [chatting, loading]);\n\n const matchPrefixInfo = useMemo(() => {\n const textareaElement = textareaRef.current!;\n if (matchPrefixIndex >= 0 && value) {\n const currentFocusIndex = textareaElement.selectionStart;\n let matchWord = \"\";\n for (let i = matchPrefixIndex + 1; i < currentFocusIndex; i++) {\n // 匹配中文英文数字\n if (/[\\u4e00-\\u9fa5]|\\w|\\d/.test(value[i]) || inputEndRef.current) {\n matchWord = matchWord + value[i];\n } else {\n setMatchPrefixIndex(-1);\n return false;\n }\n }\n return {\n start: matchPrefixIndex + 1,\n end: currentFocusIndex,\n word: matchWord,\n };\n }\n return false;\n }, [matchPrefixIndex, value]);\n\n const handleAgentItemSelect = useCallback(\n (item: AgentDetailItem) => {\n if (matchPrefixInfo) {\n const { start, end } = matchPrefixInfo;\n const valueList = value.split(\"\");\n const trimName = item.name.replace(/\\s+/g, \"\") + \" \";\n const focusIndex = start + trimName.length;\n valueList.splice(start, end - start, trimName);\n setValue(valueList.join(\"\"));\n setMatchPrefixIndex(-1);\n\n setTimeout(() => {\n textareaRef.current!.selectionStart = focusIndex;\n textareaRef.current!.selectionEnd = focusIndex;\n textareaRef.current!.focus();\n }, 0);\n }\n },\n [matchPrefixInfo, value]\n );\n\n const handleSnippetItemSelect = useCallback(\n (item: snippet) => {\n const regex = /@([\\u4e00-\\u9fa5|\\w|\\d]+)/g;\n const matches = [];\n let match;\n // 在字符串中循环匹配正则表达式,将匹配的@技能放入数组中\n while ((match = regex.exec(value)) !== null) {\n matches.push(match[0]);\n }\n if (matches.length) {\n setValue(matches.join(\" \") + \" \" + item.content);\n } else {\n setValue(item.content);\n }\n setSnippetOpen(false);\n setMatchSnippetIndex(0);\n setTimeout(() => {\n textareaRef.current!.focus();\n }, 0);\n },\n [value]\n );\n\n const isShowMentions = useMemo(() => {\n return matchAgentList.length && mentionOpen;\n }, [matchAgentList, mentionOpen]);\n\n const mentions = useMemo(() => {\n return isShowMentions ? (\n <div className=\"mentions-list-wrapper\" ref={mentionsRef}>\n <div className=\"content\">\n <div className=\"mentions-title\">技能</div>\n <div className=\"mentions-list\">\n {matchAgentList.slice(0, 10).map((item, index) => {\n return (\n <div\n className={classNames(\"mentions-item\", {\n active: index === matchMentionsIndex,\n })}\n key={index}\n onClick={() => handleAgentItemSelect(item)}\n >\n <WrappedIcon\n className=\"icon\"\n {...item.icon}\n style={{\n color: `var(--theme-${item.icon.color}-color)`,\n background: `var(--theme-${item.icon.color}-background)`,\n }}\n />\n <div className=\"name\">{item.name}</div>\n <div className=\"description\">{item.description}</div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n ) : null;\n }, [\n matchAgentList,\n matchMentionsIndex,\n isShowMentions,\n handleAgentItemSelect,\n ]);\n\n const isShowSnippets = useMemo(() => {\n return !isShowMentions && matchSnippetList.length && snippetOpen;\n }, [isShowMentions, matchSnippetList, snippetOpen]);\n\n const snippets = useMemo(() => {\n return isShowSnippets ? (\n <div className=\"snippets-list-wrapper\" ref={snippetsRef}>\n <div className=\"content\">\n <div className=\"snippets-title\">常用语</div>\n <div className=\"snippets-list\">\n {matchSnippetList.slice(0, 10).map((item, index) => {\n return (\n <div\n className={classNames(\"snippets-item\", {\n active: index === matchSnippetIndex,\n })}\n key={index}\n onClick={() => handleSnippetItemSelect(item)}\n >\n <div className=\"name\">{item.name}</div>\n <div className=\"description\">{item.content}</div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n ) : null;\n }, [\n matchSnippetList,\n matchSnippetIndex,\n isShowSnippets,\n handleSnippetItemSelect,\n ]);\n\n const computedAutoSize = useCallback(\n (size = defaultSize) => {\n if (hadExpanded.current && expand) return;\n const textareaElement = textareaRef.current as HTMLTextAreaElement;\n if (textareaElement) {\n const textareaStyles = calculateAutoSizeStyle(\n textareaElement,\n size[0],\n size[1]\n );\n\n setAutoSizeStyle(textareaStyles);\n }\n hadExpanded.current = expand;\n },\n [defaultSize, expand]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement> | string): void => {\n const value = typeof e === \"string\" ? e : e.target.value;\n setValue(value);\n textareaRef.current!.value = value;\n\n // 获取snippet关键词\n const keyword = value\n .replaceAll(/@([\\u4e00-\\u9fa5|\\w|\\d]+)\\s/g, \"\")\n .trim();\n\n // 过滤出matchSnippetList\n if (keyword) {\n const filterResult =\n snippetList?.filter((item) => item.name.includes(keyword)) ?? [];\n setMatchSnippetList(filterResult);\n setSnippetOpen(!!filterResult.length);\n } else {\n setMatchSnippetList([]);\n setSnippetOpen(false);\n }\n },\n [snippetList]\n );\n\n const handleCompositionStart = () => {\n inputEndRef.current = true;\n };\n\n const handleCompositionEnd = () => {\n inputEndRef.current = false;\n };\n\n const hanldeCreateSession = () => {\n createSession();\n };\n\n const handleExpand = useCallback(() => {\n setExpand((value) => {\n return !value;\n });\n }, []);\n\n const matchFirstAgent = useCallback(\n (value: string) => {\n const regex = /@([\\u4e00-\\u9fa5|\\w|\\d]+)/g;\n\n // 在字符串中循环匹配正则表达式\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n if (match) {\n const agent = agentList?.find(\n (item) => item.name.replace(/\\s+/g, \"\") === match![1]\n );\n agent && setAgent(agent.id);\n if (agent) break;\n }\n }\n },\n [agentList, setAgent]\n );\n\n const handleDispatchQuestion = useCallback(\n (val: string) => {\n matchFirstAgent(val);\n handleChat(val);\n\n setActive(false);\n setExpand(false);\n handleChange(\"\");\n textareaRef.current?.blur();\n },\n [handleChat, handleChange, matchFirstAgent]\n );\n\n const handleSubmit = useCallback(() => {\n if (!hadValue || !textareaRef.current || disabled) return;\n handleDispatchQuestion(value);\n }, [value, hadValue, disabled, handleDispatchQuestion]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // 默认情况下,按下 Enter 键会触发提交,按 Shift + Enter 换行;\n // 当显示 mentions 或 snippets 时,按 Enter 键选中对应项;\n // 当输入框展开放大时(且没有 mentions 或 snippets),恢复 Enter 键换行,需要按发送按钮进行提交。\n if (\n e.key === \"Enter\" &&\n (!expand || isShowMentions || isShowSnippets) &&\n !e.shiftKey &&\n !inputEndRef.current\n ) {\n e.preventDefault();\n if (isShowMentions) {\n handleAgentItemSelect(matchAgentList[matchMentionsIndex]);\n } else if (isShowSnippets) {\n handleSnippetItemSelect(matchSnippetList[matchSnippetIndex]);\n } else {\n handleSubmit();\n }\n }\n if (isShowMentions) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setMatchMentionsIndex((index) => Math.max(0, index - 1));\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setMatchMentionsIndex((index) =>\n Math.min(matchAgentList.length - 1, index + 1)\n );\n }\n } else if (isShowSnippets) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setMatchSnippetIndex((index) => Math.max(0, index - 1));\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setMatchSnippetIndex((index) =>\n Math.min(matchSnippetList.length - 1, index + 1)\n );\n }\n }\n },\n [\n handleSubmit,\n handleAgentItemSelect,\n handleSnippetItemSelect,\n isShowMentions,\n matchAgentList,\n matchMentionsIndex,\n isShowSnippets,\n matchSnippetList,\n matchSnippetIndex,\n expand,\n ]\n );\n\n const handleKeyUp = useCallback(\n (e: React.KeyboardEvent) => {\n const textareaElement = textareaRef.current!;\n\n const selectionIndex = textareaElement.selectionStart;\n const prefixWord = textareaElement.value[selectionIndex - 1];\n const beforeSelectionText = textareaElement.value.slice(\n 0,\n selectionIndex\n );\n const index = beforeSelectionText.lastIndexOf(PREFIX_WORD);\n\n if (\n e.key === \"Escape\" ||\n (!isShowMentions &&\n [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].indexOf(e.key) !==\n -1)\n ) {\n setMatchPrefixIndex(-1);\n return;\n }\n\n if (prefixWord === PREFIX_WORD) {\n setMatchPrefixIndex(selectionIndex - 1);\n } else {\n setMatchPrefixIndex(index);\n }\n },\n [isShowMentions]\n );\n\n useEffect(() => {\n if (searchStr) {\n handleChange(searchStr.trim());\n textareaRef.current?.focus();\n setSearchStr(\"\");\n }\n }, [searchStr, disabled, setSearchStr, handleChange]);\n\n useEffect(() => {\n computedAutoSize(expand ? [20, 20] : undefined);\n }, [value, expand, computedAutoSize]);\n\n useEffect(() => {\n const searchInputBox = searchInputBoxRef.current;\n if (searchInputBox) {\n const observe = new ResizeObserver(() => {\n const { width: currentWidth } = searchInputBox.getBoundingClientRect();\n const FIT_CONTENT_WIDTH = 900;\n\n setIsFillContent(currentWidth < FIT_CONTENT_WIDTH);\n });\n\n observe.observe(searchInputBox);\n\n return () => {\n observe.disconnect();\n };\n }\n }, []);\n\n useEffect(() => {\n if (!chatting && textareaRef.current) {\n textareaRef.current?.focus();\n }\n }, [chatting]);\n\n useEffect(() => {\n if (agentList?.length && matchPrefixInfo) {\n const filterList =\n matchPrefixInfo.word === \"\"\n ? agentList\n : agentList.filter((item) =>\n item.name.includes(matchPrefixInfo.word)\n );\n\n setMatchMentionList(filterList);\n setMatchMentionsIndex(0);\n setMentionOpen(true);\n } else {\n setMatchMentionList([]);\n setMentionOpen(false);\n }\n }, [matchPrefixInfo, agentList]);\n\n useEffect(() => {\n if (matchMentionsIndex >= 0 && mentionsRef.current) {\n const element = mentionsRef.current.querySelector(\n \".mentions-item.active\"\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }\n }, [matchMentionsIndex]);\n\n useEffect(() => {\n if (matchSnippetIndex >= 0 && snippetsRef.current) {\n const element = snippetsRef.current.querySelector(\n \".snippets-item.active\"\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }\n }, [matchSnippetIndex]);\n\n useEffect(() => {\n const handleDocumentClick = (e: any) => {\n const mentionsElemnt = mentionsRef.current;\n if (mentionsElemnt && !mentionsElemnt.contains(e.composedPath()[0])) {\n setMentionOpen(false);\n }\n };\n\n document.addEventListener(\"click\", handleDocumentClick);\n\n return () => {\n document.removeEventListener(\"click\", handleDocumentClick);\n };\n }, []);\n\n useImperativeHandle(ref, () => ({\n handleInsertQuestion: (value: string) => {\n handleDispatchQuestion(value);\n },\n sendMsg: (msg: string | ChatBody) => {\n handleChat(msg);\n },\n }));\n\n return (\n <div\n className={classNames(\"search-input-box\", {\n \"fill-content\": isFillContent,\n })}\n ref={searchInputBoxRef}\n >\n {mentions}\n {snippets}\n {props.inputToolbarBrick && (\n <div className=\"input-toolbar\">\n <ReactUseMultipleBricks {...props.inputToolbarBrick} />\n </div>\n )}\n <div\n className={classNames(\"input-box\", {\n active,\n disabled,\n expand,\n })}\n >\n <textarea\n value={value}\n ref={textareaRef}\n style={{\n ...autoSizeStyle,\n paddingRight: expand ? \"50px\" : \"140px\",\n }}\n placeholder={chatting ? \"回复中,请稍等...\" : \"提出你的想法...\"}\n onFocus={() => setActive(true)}\n onBlur={() => setActive(false)}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onKeyUpCapture={handleKeyUp}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n />\n <span className=\"suffix-icon\">\n <WrappedToolTip content=\"新增会话\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"plus-circle\"\n onClick={hanldeCreateSession}\n />\n </WrappedToolTip>\n {!expand && (\n <WrappedToolTip content=\"放大\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"arrows-alt\"\n onClick={handleExpand}\n />\n </WrappedToolTip>\n )}\n <div className=\"submit-split\"></div>\n <WrappedToolTip content=\"提交\">\n <WrappedIcon\n className={classNames(\"submit-btn\", {\n active: hadValue,\n disabled: !hadValue || disabled,\n })}\n lib={chatting ? \"antd\" : \"easyops\"}\n icon={chatting ? \"loading\" : \"release-management-fill\"}\n category={chatting ? \"\" : \"menu\"}\n spinning={chatting}\n onClick={handleSubmit}\n />\n </WrappedToolTip>\n </span>\n <span className=\"toolbar-icon\">\n {expand && (\n <WrappedToolTip content=\"缩小\">\n <WrappedIcon lib=\"antd\" icon=\"shrink\" onClick={handleExpand} />\n </WrappedToolTip>\n )}\n </span>\n </div>\n {hadValue && (\n <div className=\"search-input-toolbar\">\n <div className=\"input-tip\">Shift + Enter 换行</div>\n </div>\n )}\n </div>\n );\n}\n\nexport const SearchInput = forwardRef(LegacySearchInput);\n","import React, { useCallback, useEffect, useRef } from \"react\";\nimport { useChatViewContext } from \"../ChatViewContext\";\nimport classNames from \"classnames\";\nimport { debounce } from \"lodash\";\nimport { SessionItem as SessionItemProps } from \"../ChatService\";\nimport { CommonLoading } from \"./Loading.js\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport { unwrapProvider } from \"@next-core/utils/general\";\nimport type { showDialog as _showDialog } from \"@next-bricks/basic/data-providers/show-dialog/show-dialog\";\nimport type { showNotification as _showNotification } from \"@next-bricks/basic/data-providers/show-notification/show-notification\";\nimport { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport type {\n Modal,\n ModalProps,\n ModalEvents,\n ModalMapEvents,\n} from \"@next-bricks/containers/modal\";\nimport type { Input, InputProps } from \"@next-bricks/form/input\";\nimport {\n Form,\n FormEvents,\n FormMapEvents,\n FormProps,\n} from \"@next-bricks/form/form\";\nimport { NEW_SESSION_ID } from \"../hooks/useChatViewInfo\";\n\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\n\nconst showNotification = unwrapProvider<typeof _showNotification>(\n \"basic.show-notification\"\n);\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst showDialog = unwrapProvider<typeof _showDialog>(\"basic.show-dialog\");\n\nconst WrappedModal = wrapBrick<Modal, ModalProps, ModalEvents, ModalMapEvents>(\n \"eo-modal\",\n {\n onClose: \"close\",\n onConfirm: \"confirm\",\n onCancel: \"cancel\",\n onOpen: \"open\",\n }\n);\nconst WrappedForm = wrapBrick<Form, FormProps, FormEvents, FormMapEvents>(\n \"eo-form\",\n {\n onValuesChange: \"values.change\",\n onValidateSuccess: \"validate.success\",\n onValidateError: \"validate.error\",\n }\n);\nconst WrappedInput = wrapBrick<Input, InputProps>(\"eo-input\");\n\nconst SESSION_ITEM_HEIGHT = 42;\nconst BUFFER_NUMBER = 5;\nconst CACHE_HEIGHT = 100;\n\nexport function SessionList(): React.ReactNode {\n const {\n sessionEnd,\n sessionLoading,\n sessionList,\n querySessionHistory,\n updateSession,\n } = useChatViewContext();\n const sessionWrapperRef = useRef<HTMLDivElement>(null);\n const sessionListRef = useRef<HTMLDivElement>(null);\n const searchQueryRef = useRef<string>(\"\");\n const editModalRef = useRef<Modal>(null);\n const editFormRef = useRef<Form>(null);\n const editRawDataRef = useRef<Partial<SessionItemProps>>();\n const editConversationIdRef = useRef<string>(\"\");\n\n const getFitLimit = () => {\n let limit = 20;\n const sessionWrapper = sessionWrapperRef.current;\n if (sessionWrapper) {\n // limit = 视图高度 % 单条高度 + 缓冲长度\n limit =\n Math.floor(sessionWrapper.clientHeight / SESSION_ITEM_HEIGHT) +\n BUFFER_NUMBER;\n }\n return limit;\n };\n\n useEffect(() => {\n querySessionHistory(getFitLimit());\n }, []);\n\n const checkSessionList = useCallback(() => {\n if (sessionLoading || sessionEnd) return;\n const sessionList = sessionListRef.current;\n if (sessionList) {\n const { scrollTop, scrollHeight, clientHeight } = sessionList;\n // 如果滚动的高度 + 视图高度 + 缓冲高度 > 视图的滚动高度,请求新的数据\n if (scrollTop + clientHeight + CACHE_HEIGHT > scrollHeight) {\n querySessionHistory();\n }\n }\n }, [querySessionHistory, sessionLoading, sessionEnd]);\n\n const handleScroll = debounce(checkSessionList, 200);\n\n const handleChange = useCallback((e: any) => {\n searchQueryRef.current = e.target.value;\n }, []);\n\n const handleSearch = useCallback(() => {\n querySessionHistory(getFitLimit(), searchQueryRef.current);\n }, []);\n\n const handleSearchEnter = useCallback((e: any) => {\n if (e.key === \"Enter\") {\n handleSearch();\n }\n }, []);\n\n const handleEditSession = useCallback(\n (conversationId: string, rawData: Partial<SessionItemProps>) => {\n // 从item传上来的已知数据\n editConversationIdRef.current = conversationId;\n editRawDataRef.current = rawData;\n editFormRef.current?.setInitValue({ ...rawData });\n editModalRef.current?.open();\n },\n []\n );\n\n const handleEditModalConfirm = useCallback(() => {\n editFormRef.current?.validate();\n }, []);\n\n const handleEditFormSubmit = useCallback(\n async (e: any) => {\n // 调用接口,更新数据后要关掉modal\n const result = await updateSession(\n editConversationIdRef.current,\n e.detail\n );\n showNotification({\n message: `修改会话${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n if (result) {\n editModalRef.current?.close();\n }\n },\n [editConversationIdRef.current, editModalRef.current]\n );\n\n return (\n <>\n <div className=\"session-list-wrapper\" ref={sessionWrapperRef}>\n <div className=\"session-title\">历史对话</div>\n <div className=\"session-search-input-box\">\n <input\n placeholder={\"输入关键词进行搜索\"}\n onChange={handleChange}\n onKeyUpCapture={handleSearchEnter}\n />\n <span className=\"suffix-icon\">\n <WrappedToolTip content=\"搜索\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"search\"\n theme=\"outlined\"\n onClick={handleSearch}\n />\n </WrappedToolTip>\n </span>\n </div>\n <div\n className=\"session-list\"\n ref={sessionListRef}\n onScroll={handleScroll}\n >\n {sessionList.map((item, index) => {\n return (\n <SessionItem\n key={index}\n {...item}\n handleEditSession={handleEditSession}\n />\n );\n })}\n {sessionLoading && <CommonLoading />}\n {/* {sessionEnd && <div className=\"session-end-tip\">到底啦</div>} */}\n </div>\n </div>\n <WrappedModal\n ref={editModalRef}\n modalTitle={\"编辑会话\"}\n width=\"688px\"\n maskClosable={false}\n closeWhenConfirm={false}\n onConfirm={handleEditModalConfirm}\n >\n <WrappedForm\n layout=\"horizontal\"\n ref={editFormRef}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n onValidateSuccess={handleEditFormSubmit}\n >\n <WrappedInput label=\"标题\" name=\"title\"></WrappedInput>\n </WrappedForm>\n </WrappedModal>\n </>\n );\n}\n\nfunction SessionItem({\n title,\n conversationId,\n handleEditSession,\n}: SessionItemProps) {\n const { activeSessionId, checkSession, deleteSession } = useChatViewContext();\n\n const handleCheckSession = useCallback(() => {\n checkSession(conversationId, true);\n }, [conversationId, checkSession]);\n\n const handleDeleteSession = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n showDialog({\n type: \"confirm\",\n title: \"会话删除确认\",\n content: `请输入 {{ expect }} 以确认删除`,\n expect: title.replace(/\\s+/g, \"\"),\n }).then(async () => {\n const result = await deleteSession([conversationId]);\n showNotification({\n message: `删除会话${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n });\n },\n [conversationId, deleteSession, title]\n );\n\n const handleEditSessionItem = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n handleEditSession && handleEditSession(conversationId, { title });\n },\n [conversationId, handleEditSession, title]\n );\n\n return (\n <div\n key={title}\n className={classNames(\"session-item\", {\n active: conversationId === activeSessionId,\n })}\n onClick={handleCheckSession}\n >\n <div className=\"content\">\n <div className=\"title\" title={title}>\n {title}\n </div>\n </div>\n {conversationId !== NEW_SESSION_ID && (\n <>\n <div className=\"session-edit-btn\" onClick={handleEditSessionItem}>\n <WrappedIcon icon=\"edit\" lib=\"antd\" />\n </div>\n <div className=\"session-close-btn\" onClick={handleDeleteSession}>\n <WrappedIcon icon=\"close\" lib=\"antd\" />\n </div>\n </>\n )}\n </div>\n );\n}\n","import { fetchEventSource } from \"@microsoft/fetch-event-source\";\nimport { http } from \"@next-core/http\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport moment from \"moment\";\nimport _, { pick } from \"lodash\";\nimport type { ToolCall } from \"./ChatViewContext\";\nimport { isGeneralTextType } from \"./hooks/useChatViewInfo\";\n\nexport interface SSEMessageItem {\n conversationId?: string;\n created: number | string;\n delta: {\n content: string;\n role: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n };\n taskId?: string;\n agentId?: string;\n robotId?: string;\n type?: string;\n error?: string;\n}\n\nexport interface QueueItem {\n topic: string;\n message?: SSEMessageItem;\n}\n\nexport interface SessionItem {\n conversationId: string;\n isDelete: boolean;\n time: number;\n title: string;\n user: string;\n _row_id: string;\n robotId: string;\n handleEditSession?: (\n conversationId: string,\n rawData: Partial<SessionItem>\n ) => void;\n}\n\nexport interface ChatItem {\n agentId: string;\n robotId: string;\n conversationId: string;\n input: string;\n output: string;\n taskId: string;\n time: number;\n inputTime: number;\n user: string;\n _row_id: string;\n tag: {\n isLike?: boolean;\n };\n allToolCalls?: string;\n}\n\nexport interface ChatBody {\n agentId?: string;\n conversationId?: string;\n input: string;\n stream?: boolean;\n config?: Record<string, any>;\n [k: string]: any;\n}\n\nexport class ChatService {\n #debug: boolean;\n #ctrl?: AbortController;\n #agentId: string;\n #robotId: string;\n #enterInterval: number;\n #chatting = false;\n #isStartEmitEvent = false;\n #emitTimer: NodeJS.Timeout | undefined;\n #messageQueue: Array<QueueItem> = [];\n #subscribers: Record<string, Array<(msg?: SSEMessageItem) => void>> = {};\n #conversationId?: string;\n #answerLanguage?: string | undefined;\n\n // 会话\n #sessionNextToken?: string;\n #cacheLimit?: number;\n #cacheQuery?: string;\n\n // 消息\n #messageNextToken?: string;\n\n #useSpiltWord = false;\n\n constructor({\n agentId,\n robotId,\n enterInterval = 50,\n debug = false,\n answerLanguage,\n useSpiltWord,\n }: {\n agentId: string;\n robotId: string;\n enterInterval: number;\n debug: boolean;\n answerLanguage?: string;\n useSpiltWord?: boolean;\n }) {\n this.#agentId = agentId;\n this.#robotId = robotId;\n this.#enterInterval = enterInterval;\n this.#debug = debug;\n this.#useSpiltWord = useSpiltWord ?? false;\n this.#answerLanguage = answerLanguage;\n }\n\n enqueue(data: QueueItem) {\n this.#messageQueue.push(data);\n this.#startEmitEvent();\n }\n\n dequeue() {\n return this.#messageQueue.shift();\n }\n\n #clear() {\n this.#messageQueue.length = 0;\n }\n\n getMessageQueue() {\n return this.#messageQueue;\n }\n\n subscribe(topic: string, callback: (msg?: SSEMessageItem) => void) {\n if (!this.#subscribers[topic]) {\n this.#subscribers[topic] = [];\n }\n this.#subscribers[topic].push(callback);\n }\n\n unsubscribe(topic: string, callback: (msg?: SSEMessageItem) => void) {\n if (this.#subscribers[topic]) {\n this.#subscribers[topic] = this.#subscribers[topic].filter(\n (cb) => cb !== callback\n );\n }\n }\n\n notifySubscribers(data: QueueItem) {\n const topic = data.topic;\n if (this.#subscribers[topic]) {\n this.#subscribers[topic].forEach((callback) => {\n callback(data?.message);\n });\n }\n }\n\n async setChatItemIsLike(id: string, isLike: boolean): Promise<boolean> {\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.CommentDialogue/conversation/comment`,\n {\n method: \"POST\",\n body: JSON.stringify({\n taskId: id,\n isLike,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n setAgentId(id: string) {\n this.#agentId = id;\n }\n\n setConversationId(id?: string) {\n this.#conversationId = id;\n }\n\n async getSessionHistory(\n limit?: number,\n query?: string\n ): Promise<SessionItem[]> {\n if (limit) {\n this.#cacheLimit = limit;\n }\n if (!_.isNil(query)) {\n if (this.#cacheQuery !== query) {\n // 说明进行了搜索,需要重置token\n this.#sessionNextToken = undefined;\n }\n this.#cacheQuery = query;\n }\n try {\n const {\n data: { conversations, next_token },\n } = await http.request<{\n data: {\n conversations: SessionItem[];\n next_token: string;\n previous_token: string;\n };\n }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.ListConversation/conversation/list`,\n {\n method: \"POST\",\n body: JSON.stringify({\n limit: this.#cacheLimit ?? 20,\n query: this.#cacheQuery,\n next_token: this.#sessionNextToken,\n }),\n }\n );\n this.#sessionNextToken = next_token;\n if (!next_token) {\n this.notifySubscribers({ topic: \"session.fetch.end\" });\n }\n return conversations;\n } catch {\n // eslint-disable-next-line no-console\n console.error(\"获取会话历史失败\");\n }\n return [];\n }\n\n async getChatHistory(id?: string): Promise<ChatItem[]> {\n if (id) {\n this.setConversationId(id);\n this.#messageNextToken = \"\";\n }\n if (!this.#conversationId) return [];\n try {\n const {\n data: { conversations, next_token },\n } = await http.request<{\n data: {\n conversations: ChatItem[];\n next_token: string;\n previous_token: string;\n };\n }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.GetAllDialogue/conversation/get/${this.#conversationId}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n limit: 1000,\n next_token: this.#messageNextToken,\n }),\n }\n );\n this.#messageNextToken = next_token;\n if (!next_token) {\n this.notifySubscribers({ topic: \"message.fetch.end\" });\n }\n return conversations;\n } catch {\n // eslint-disable-next-line no-console\n console.error(\"获取消息历史失败\");\n }\n return [];\n }\n\n async deleteSession(id: string[]): Promise<boolean> {\n if (!id.length) return false;\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.DeleteConversation/conversation/delete`,\n {\n method: \"POST\",\n body: JSON.stringify({\n conversationIds: id,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n async updateSession(\n id: string,\n data: Partial<SessionItem>\n ): Promise<boolean> {\n if (!id) return false;\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.UpdateConversation/conversation/update/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n updateData: data,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n getCustomSplit() {\n return {\n [Symbol.split](str: string) {\n let pos = 0;\n const result = [];\n let cache = \"\";\n while (pos < str.length) {\n const matchStr = str.substring(pos, pos + 1);\n // 如果是中文,单个输出\n if (/[\\u4e00-\\u9fa5]/.test(matchStr)) {\n result.push(cache + matchStr);\n cache = \"\";\n } else {\n // 否则,遇到空格或者标点符号再分词\n if (!/\\s|[,。;《》?!,.:<>?!]]/.test(matchStr)) {\n cache = cache + matchStr;\n } else {\n result.push(cache + matchStr);\n cache = \"\";\n }\n }\n pos++;\n }\n if (cache) result.push(cache);\n return result;\n },\n };\n }\n\n splitWord(str: string): string[] {\n if (!str) return [];\n // 单词长度小于 5 直接返回, 否则做单词分割处理\n if (str?.length < 5) return [str];\n let list = [];\n\n // 只要是命令字,且命令字不等于easy_cmd_progress的时候就直接返回\n if (\n /^```easy_cmd_.*?```[^`]*$/s.test(str) &&\n !/easy_cmd_progress/.test(str)\n ) {\n return [str];\n }\n\n if (window.Intl) {\n try {\n const segmenterFr = new Intl.Segmenter(\"zh-Hans-CN\", {\n granularity: \"word\",\n });\n const iterator = segmenterFr.segment(str)[Symbol.iterator]();\n\n let nextWord = iterator.next();\n while (!nextWord.done) {\n list.push(nextWord.value.segment);\n nextWord = iterator.next();\n }\n } catch {\n list = [];\n const customSplit = this.getCustomSplit();\n str.split(customSplit).forEach((word) => {\n list.push(word);\n });\n }\n } else {\n const customSplit = this.getCustomSplit();\n str.split(customSplit).forEach((word) => {\n list.push(word);\n });\n }\n\n return list;\n }\n\n async chat(msg: string | ChatBody): Promise<void> {\n this.#ctrl = new AbortController();\n let hadMatchMessage = false;\n this.#chatting = true;\n await fetchEventSource(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.manage.LLMChatProxy@1.0.0/api/aiops_chat/v1/chat/completions`,\n {\n method: \"POST\",\n signal: this.#ctrl.signal,\n openWhenHidden: true,\n body: JSON.stringify({\n agentId: this.#agentId,\n robotId: this.#robotId,\n conversationId: this.#conversationId,\n stream: true,\n config: {\n debug: this.#debug,\n ...(this.#answerLanguage ? { lang: this.#answerLanguage } : {}),\n },\n ...(typeof msg === \"string\"\n ? {\n input: msg,\n }\n : msg),\n }),\n headers: {\n \"giraffe-contract-name\": \"easyops.api.aiops_chat.manage.LLMChatProxy\",\n },\n onopen: async (response) => {\n if (response.ok) {\n // eslint-disable-next-line no-console\n console.log(\"open sse service success!\");\n } else {\n // eslint-disable-next-line no-console\n console.log(\"open sse service fail!\");\n }\n },\n onmessage: (msg) => {\n const { data } = msg;\n hadMatchMessage = true;\n if (data === \"[DONE]\") {\n this.#ctrl!.abort();\n return;\n }\n let result = {} as SSEMessageItem;\n try {\n result = JSON.parse(data);\n\n if (!this.#conversationId) {\n this.setConversationId(result.conversationId);\n }\n if (this.#useSpiltWord && isGeneralTextType(result.type)) {\n const wordList = this.splitWord(result.delta.content);\n\n // 一段消息最多拆分为 50-100 段内容\n let chunkedWords = wordList;\n const maxChunks = 100;\n if (wordList.length > maxChunks) {\n const minChunks = 50;\n const chunkSize = Math.ceil(\n wordList.length /\n (Math.floor(Math.random() * (maxChunks - minChunks + 1)) +\n minChunks)\n );\n chunkedWords = _.chunk(wordList, chunkSize).map((chunk) =>\n chunk.join(\"\")\n );\n }\n\n chunkedWords.forEach((word) => {\n // wordList.forEach((word) => {\n this.enqueue({\n topic: \"add\",\n message: {\n ...result,\n delta: {\n role: result.delta.role ?? \"assistant\",\n content: word,\n },\n },\n });\n });\n } else {\n this.enqueue({\n topic: \"add\",\n message: {\n ...result,\n delta: {\n role: result.delta.role ?? \"assistant\",\n ...pick(result.delta, [\n \"content\",\n \"tool_calls\",\n \"tool_call_id\",\n ]),\n },\n },\n });\n }\n } catch {\n result = JSON.parse(data);\n\n const SENSITIVE_WORDS_ERROR =\n \"input messages contains sensitive words\";\n const EXCEED_TOKENS_ERROR = \"exceed tokens resource limit\";\n let content = `\\`【数据格式错误】:\\` ${data}`;\n\n if (result?.error?.includes(SENSITIVE_WORDS_ERROR)) {\n content =\n \"触发敏感词限制,请换一个问题,或找管理员修改敏感词配置\";\n } else if (result?.error?.includes(EXCEED_TOKENS_ERROR)) {\n content = \"超过资源配额限制,请找管理员增加资源配额\";\n }\n\n this.enqueue({\n topic: \"add\",\n message: {\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n delta: {\n role: \"assistant\",\n content: content,\n },\n agentId: this.#agentId,\n robotId: this.#robotId,\n },\n });\n this.#ctrl!.abort();\n return;\n }\n },\n onclose: () => {\n // eslint-disable-next-line no-console\n console.log(\"close\");\n // 兜底逻辑,连接结束,并且没有数据返回\n if (!hadMatchMessage) {\n this.enqueue({\n topic: \"add\",\n message: {\n delta: {\n role: \"assistant\",\n content: \"`无法识别`\",\n },\n agentId: this.#agentId,\n robotId: this.#robotId,\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n },\n });\n }\n this.#ctrl!.abort();\n },\n onerror: (err) => {\n throw err;\n },\n }\n );\n\n this.#chatting = false;\n }\n\n stop() {\n clearTimeout(this.#emitTimer);\n this.#ctrl && this.#ctrl?.abort();\n this.#chatting = false;\n this.#emitTimer = undefined;\n this.#isStartEmitEvent = false;\n this.#clear();\n this.notifySubscribers({ topic: \"stop\" });\n }\n\n #startEmitEvent() {\n if (this.#isStartEmitEvent) return;\n this.#isStartEmitEvent = true;\n // 轮训队列,每隔 #enterInterval(默认 50ms) 推出第一条数据,获取到 text,推送给组件,组件接受后进行渲染\n // 直到聊天结束,并且消息队列数据为空时,停止 emit\n const callback = () => {\n if (this.#chatting || this.#messageQueue.length) {\n const messageItem = this.dequeue()!;\n messageItem && this.notifySubscribers(messageItem);\n this.#emitTimer = setTimeout(\n callback,\n getRandomInterval(this.#enterInterval, this.#messageQueue.length)\n );\n } else {\n clearTimeout(this.#emitTimer);\n this.#emitTimer = undefined;\n this.#isStartEmitEvent = false;\n this.notifySubscribers({ topic: \"finish\" });\n }\n };\n\n this.#emitTimer = setTimeout(\n callback,\n getRandomInterval(this.#enterInterval, this.#messageQueue.length)\n );\n }\n}\n\nfunction getRandomInterval(\n enterInterval: number,\n messagesInQueue: number\n): number {\n // 如果设置了 enterInterval >= 0,使用该值作为间隔\n if (enterInterval >= 0) {\n return enterInterval;\n }\n // 否则,根据消息队列中的消息数量动态调整间隔时间\n // 当队列中消息很多时,尽快输出内容\n if (messagesInQueue > 50) {\n return 16;\n }\n const value = Math.floor(Math.random() * 11);\n // 当队列消息不多时,20% 的概率返回 50ms,80% 的概率返回 50-300ms 之间的随机数\n return value < 9 ? 50 : Math.floor(Math.random() * 251) + 50;\n}\n\n// export const chartService = new ChatService();\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageItem, type ToolCall } from \"../ChatViewContext.js\";\nimport moment from \"moment\";\nimport {\n ChatBody,\n ChatItem,\n ChatService,\n SessionItem,\n SSEMessageItem,\n} from \"../ChatService.js\";\nimport { uniqueId } from \"lodash\";\nimport { InstanceApi_postSearchV3 } from \"@next-api-sdk/cmdb-sdk\";\n\nexport const NEW_SESSION_ID = \"new_session_id\";\nexport const RELATED_QUESTIONS_TYPE = \"RELATED_QUESTIONS\";\nexport const DEFAULT_TYPE = \"TEXT\";\n\nconst GENERAL_TEXT_TYPES: readonly string[] = [\n \"TEXT\",\n \"tool_call\",\n \"tool_response\",\n];\n\nexport function isGeneralTextType(type: string | undefined) {\n return GENERAL_TEXT_TYPES.includes(type ?? \"TEXT\");\n}\n\nfunction isGeneralSameType(a: string | undefined, b: string | undefined) {\n return a === b || (isGeneralTextType(a) && isGeneralTextType(b));\n}\n\nexport function useChatViewInfo({\n agentId,\n robotId,\n sessionId,\n enterInterval = 50,\n debug,\n answerLanguage,\n useSpiltWord,\n showToolCalls,\n}: {\n agentId: string;\n robotId: string;\n sessionId?: string;\n enterInterval?: number;\n debug: boolean;\n answerLanguage?: string;\n useSpiltWord?: boolean;\n showToolCalls?: boolean;\n}) {\n const [sessionEnd, setSessionEnd] = useState<boolean>(false);\n const [sessionLoading, setSessionLoading] = useState<boolean>(false);\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>(\n sessionId || NEW_SESSION_ID\n );\n const [loading, setLoading] = useState<boolean>(false);\n const [chatting, setChatting] = useState<boolean>(false);\n const [sessionList, setSessionList] = useState<SessionItem[]>([]);\n\n const [msgLoading, setMsgLoading] = useState<boolean>(false);\n const [msgEnd, setMsgEnd] = useState<boolean>(false);\n const [msgList, setMsgList] = useState<MessageItem[]>([]);\n const [searchStr, setSearchStr] = useState<string>(\"\");\n const chattingMessageItem = useRef<MessageItem>();\n const sessionSearchQuery = useRef<string | undefined>();\n const haveCreatedSession = useRef<boolean>(false);\n const [toolNames, setToolNames] = useState<Map<string, string | null>>(\n new Map()\n );\n const toolNameRequests = useRef<Map<string, Promise<void>>>(new Map());\n\n const fetchToolName = useCallback((toolId: string) => {\n // 不要重复查询工具名称\n if (toolNameRequests.current.has(toolId)) {\n return;\n }\n const promise = InstanceApi_postSearchV3(\"LLM_TOOL@EASYOPS\", {\n query: {\n id: toolId,\n },\n fields: [\"name\"],\n }).then(\n (res) => {\n const list = res.list as { name: string }[];\n const name = list.length > 0 ? list[0].name : null;\n setToolNames((pre) => {\n const newMap = new Map(pre);\n newMap.set(toolId, name);\n return newMap;\n });\n },\n (error) => {\n // eslint-disable-next-line no-console\n console.error(\"fetch tool name error\", error);\n }\n );\n toolNameRequests.current.set(toolId, promise);\n }, []);\n\n const chatService = useMemo(\n () =>\n new ChatService({\n agentId,\n robotId,\n enterInterval,\n debug,\n answerLanguage,\n useSpiltWord,\n }),\n [agentId, robotId, enterInterval, debug, answerLanguage, useSpiltWord]\n );\n\n const defaultNewSessionItem = useMemo(\n () =>\n ({\n conversationId: NEW_SESSION_ID,\n title: \"新建会话\",\n }) as SessionItem,\n []\n );\n\n const stopChat = useCallback(() => {\n chatService.stop();\n }, [chatService]);\n\n const setAgent = useCallback(\n (id: string) => {\n chatService.setAgentId(id);\n },\n [chatService]\n );\n\n const checkSession = useCallback(\n async (id?: string, isInit = false) => {\n if (isInit && id) {\n // 切换聊天,重制状态\n setMsgEnd(false);\n setMsgLoading(false);\n setLoading(true);\n setMsgList([]);\n setActiveSessionId(id);\n if (chatting) {\n stopChat();\n }\n } else {\n setMsgLoading(true);\n }\n // 如果是新建会话,不需要查询历史\n if (id === NEW_SESSION_ID) {\n // 重置会话id\n chatService.setConversationId();\n setMsgEnd(true);\n setLoading(false);\n return;\n }\n const list = await chatService.getChatHistory(id);\n const computedList = (list: ChatItem[]) => {\n const newList: MessageItem[] = [];\n list.forEach((item) => {\n let toolCalls: ToolCall[] | undefined;\n if (showToolCalls && item.allToolCalls) {\n try {\n const allToolCalls = JSON.parse(item.allToolCalls);\n toolCalls = [];\n allToolCalls.forEach(\n (call: { callId: string; call: string; result: string }) => {\n try {\n // In legacy backend API, `call` is an array of objects,\n // and is an object in the latest API. We support both.\n const originalCall = JSON.parse(call.call);\n toolCalls!.push({\n id: call.callId,\n ...(Array.isArray(originalCall)\n ? originalCall[0]\n : originalCall),\n response: call.result,\n });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"parse allToolCalls.call error\", e);\n }\n }\n );\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"parse allToolCalls error\", e);\n }\n }\n newList.unshift(\n {\n agentId: item.agentId,\n robotId: item.robotId,\n taskId: item.taskId,\n conversationId: item.conversationId,\n role: \"user\",\n content: {\n type: \"markdown\",\n text: item.input,\n },\n key: uniqueId(\"msg-\"),\n created: item.time,\n type: DEFAULT_TYPE,\n },\n {\n agentId: item.agentId,\n taskId: item.taskId,\n conversationId: item.conversationId,\n role: \"assistant\",\n content: {\n type: \"markdown\",\n text: item.output,\n },\n key: uniqueId(\"msg-\"),\n created: item.inputTime,\n tag: item.tag,\n type: DEFAULT_TYPE,\n toolCalls,\n }\n );\n });\n return newList.filter((item) => item.content.text);\n };\n setMsgList((preList) => {\n return computedList(list).concat(preList);\n });\n setMsgLoading(false);\n setLoading(false);\n },\n [chatService, chatting, stopChat]\n );\n\n const deleteSession = useCallback(\n async (ids: string[]): Promise<boolean> => {\n // 需要过滤新建会话, 因为新建会话在本地,还没上报到远端\n const filterIds = ids.filter((item) => item !== NEW_SESSION_ID);\n const result = await chatService.deleteSession(filterIds);\n if (result) {\n let deleteActiveSession = false;\n if (\n activeSessionId &&\n filterIds.includes(activeSessionId) &&\n activeSessionId !== NEW_SESSION_ID\n ) {\n // 如果删除会话包含当前会话,需要重置状态\n deleteActiveSession = true;\n // 清除会话id\n chatService.setConversationId();\n\n setMsgEnd(false);\n setMsgLoading(false);\n setMsgList([]);\n\n if (chatting) {\n stopChat();\n }\n }\n\n setSessionList((list) => {\n const newList = list.filter(\n (item) => !filterIds.includes(item.conversationId!)\n );\n if (deleteActiveSession) {\n // 已经选中的当前会话被删除,新建会话\n const hasNewOne = list.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n setLoading(false);\n\n setActiveSessionId(NEW_SESSION_ID);\n if (hasNewOne) {\n return newList;\n } else {\n return [defaultNewSessionItem].concat(newList);\n }\n }\n return newList;\n });\n }\n return result;\n },\n [activeSessionId, chatService, chatting, defaultNewSessionItem, stopChat]\n );\n\n const updateSession = useCallback(\n async (id: string, data: Partial<SessionItem>): Promise<boolean> => {\n const result = await chatService.updateSession(id, data);\n if (result && data?.title) {\n // 如果成功修改title,需要修改本地展示\n setSessionList((list: any) => {\n return list.map((item: any) => ({\n ...item,\n title: item.conversationId === id ? data.title : item?.title,\n }));\n });\n }\n return result;\n },\n [activeSessionId, chatService, chatting, defaultNewSessionItem, stopChat]\n );\n\n const querySessionHistory = useCallback(\n async (limit?: number, query?: string) => {\n setSessionLoading(true);\n const list = await chatService.getSessionHistory(limit, query);\n let newSessionList = list;\n if (!activeSessionId) {\n // 如果没有 activeSessionId, 默认新增会话\n setActiveSessionId(NEW_SESSION_ID);\n setMsgList([]);\n }\n if (!query || sessionSearchQuery.current === query) {\n // 如果没有搜索或者搜索关键词相同,则直接拼接\n newSessionList = [...sessionList].concat(newSessionList);\n } else {\n // 如果搜索关键词不同\n setSessionEnd(false);\n }\n\n if (!activeSessionId) {\n // 如果没有 activeSessionId, 补充一个新增会话项\n newSessionList = [defaultNewSessionItem].concat(newSessionList);\n } else if (activeSessionId && !haveCreatedSession.current) {\n // 对于初始化时有activeSessionId的场景,也需要补充一个新增会话项\n const hasNewOne = sessionList.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n if (!hasNewOne) {\n newSessionList = [defaultNewSessionItem].concat(newSessionList);\n }\n }\n\n sessionSearchQuery.current = query;\n setSessionList(newSessionList);\n setSessionLoading(false);\n },\n [\n chatService,\n activeSessionId,\n sessionList,\n defaultNewSessionItem,\n sessionSearchQuery,\n haveCreatedSession.current,\n ]\n );\n\n const handleChat = useCallback(\n async (msg: string | ChatBody) => {\n const inputMsg = typeof msg === \"string\" ? msg : msg.input;\n if (activeSessionId === NEW_SESSION_ID) {\n // 如果当前会话属于新建会话,更新会话历史数据\n setSessionList((list) => {\n return list.map((item) => ({\n ...item,\n title:\n item.conversationId === NEW_SESSION_ID ? inputMsg : item.title,\n }));\n });\n haveCreatedSession.current = true;\n }\n setChatting(true);\n chatService.chat(msg);\n setMsgList((list) => {\n return list\n .filter((item) => item.type !== RELATED_QUESTIONS_TYPE)\n .concat([\n {\n role: \"user\",\n content: {\n type: \"markdown\",\n text: inputMsg,\n },\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n type: DEFAULT_TYPE,\n key: uniqueId(\"msg-\"),\n },\n {\n role: \"assistant\",\n content: {\n type: \"load\",\n text: \"\",\n },\n chatting: true,\n created: \"Now\",\n type: DEFAULT_TYPE,\n key: uniqueId(\"msg-\"),\n },\n ]);\n });\n },\n [chatService, activeSessionId]\n );\n\n const createSession = useCallback(() => {\n chatService.setConversationId();\n setMsgList([]);\n setActiveSessionId(NEW_SESSION_ID);\n const hasNewOne = sessionList.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n if (!hasNewOne) {\n setSessionList((preList) => {\n return [defaultNewSessionItem].concat(preList);\n });\n }\n }, [chatService, sessionList, defaultNewSessionItem]);\n\n const handleIsLike = useCallback(\n async (id: string, isLike: boolean): Promise<boolean> => {\n const result = await chatService.setChatItemIsLike(id, isLike);\n if (result) {\n setMsgList((list) => {\n return list.map((item) => ({\n ...item,\n tag:\n id === item.taskId\n ? {\n isLike,\n }\n : item.tag,\n }));\n });\n }\n return result;\n },\n [chatService]\n );\n\n useEffect(() => {\n if (sessionId) {\n checkSession(sessionId);\n } else {\n // 因为在sessionList内部会有一次querySessionHistory的初始调用,设置activeSessionId等\n // 此处兼容处理不显示sessionList时的场景(如,嵌入iframe)\n querySessionHistory(30);\n }\n }, [sessionId]);\n\n useEffect(() => {\n // session listener\n const handleSessionEnd = () => {\n setSessionEnd(true);\n };\n chatService.subscribe(\"session.fetch.end\", handleSessionEnd);\n\n return () => {\n chatService.subscribe(\"session.fetch.end\", handleSessionEnd);\n };\n }, [chatService]);\n\n useEffect(() => {\n // chat listener\n const listener = (_msgItem?: SSEMessageItem) => {\n if (!_msgItem) return;\n\n const msgItemData = {\n type: DEFAULT_TYPE,\n ..._msgItem,\n };\n\n if (activeSessionId === NEW_SESSION_ID && msgItemData.conversationId) {\n // 如果当前会话属于新建会话,更新会话历史数据\n setSessionList((list) => {\n return list.map((item) => ({\n ...item,\n conversationId:\n item.conversationId === NEW_SESSION_ID\n ? msgItemData.conversationId!\n : item.conversationId,\n }));\n });\n setActiveSessionId(msgItemData.conversationId);\n }\n\n // 如果未开启显示工具调用过程,则忽略工具调用相关消息\n if (\n !showToolCalls &&\n (msgItemData.type === \"tool_call\" ||\n msgItemData.type === \"tool_response\")\n ) {\n return;\n }\n\n if (msgItemData.type === \"tool_call\") {\n for (const toolId of msgItemData.delta.tool_calls!.map(\n (call) => call.function.name\n )) {\n fetchToolName(toolId);\n }\n }\n\n let generalSameType = false;\n const isStart = !chattingMessageItem.current;\n const isUpdate =\n !isStart &&\n (generalSameType =\n isGeneralSameType(\n msgItemData.type,\n chattingMessageItem.current!.type\n ) && msgItemData.taskId === chattingMessageItem.current!.taskId);\n\n const thisMessage = (chattingMessageItem.current = {\n ...msgItemData,\n role: \"assistant\",\n content: {\n type: \"markdown\",\n // 只有普通文本类型才更新聊天文本内容,其他如 `tool_response` 不更新。\n text:\n msgItemData.type === RELATED_QUESTIONS_TYPE\n ? msgItemData.delta.content\n : msgItemData.type == null || msgItemData.type === \"TEXT\"\n ? `${isUpdate ? chattingMessageItem.current!.content.text : \"\"}${msgItemData.delta.content}`\n : (chattingMessageItem.current?.content.text ?? \"\"),\n },\n chatting: true,\n toolCalls:\n msgItemData.type === \"tool_call\"\n ? [\n ...(chattingMessageItem.current?.toolCalls ?? []),\n ...msgItemData.delta.tool_calls!,\n ]\n : msgItemData.type === \"tool_response\"\n ? chattingMessageItem.current?.toolCalls?.map((call) =>\n call.id === msgItemData.delta.tool_call_id\n ? {\n ...call,\n response: msgItemData.delta.content,\n }\n : call\n )\n : msgItemData.type === RELATED_QUESTIONS_TYPE\n ? undefined\n : chattingMessageItem.current?.toolCalls,\n created: moment(msgItemData?.created).format(\"YYYY-MM-DD HH:mm:ss\"),\n key: chattingMessageItem.current?.key ?? uniqueId(\"msg-\"),\n });\n\n setMsgList((list) => {\n if (isStart || isUpdate) {\n list.pop();\n return list.concat(thisMessage);\n }\n return (\n generalSameType\n ? list\n : list.filter((item) => item.type !== RELATED_QUESTIONS_TYPE)\n )\n .map<MessageItem>((item) => ({ ...item, chatting: false }))\n .concat(thisMessage);\n });\n };\n const reset = () => {\n setChatting(false);\n setLoading(false);\n chattingMessageItem.current = undefined;\n };\n const finishListener = () => {\n setMsgList((list) => {\n return list.map((item) => ({\n ...item,\n chatting: false,\n toolCalls: item.toolCalls?.map((call) =>\n call.response === undefined ? { ...call, failed: true } : call\n ),\n }));\n });\n reset();\n };\n const fetchEndListener = () => {\n setMsgEnd(true);\n };\n const stopListener = () => {\n if (chattingMessageItem.current) {\n const stopMessageItem: MessageItem = {\n ...chattingMessageItem.current,\n content: {\n type: \"markdown\",\n text:\n chattingMessageItem.current.content.text +\n \" \\\\\\n ` 对话被中断了 `\",\n },\n };\n setMsgList((list) => {\n list.pop();\n return msgList.concat(stopMessageItem);\n });\n } else {\n setMsgList((list) => {\n return list.filter((item) => item.content.type !== \"load\");\n });\n }\n reset();\n };\n chatService.subscribe(\"add\", listener);\n chatService.subscribe(\"finish\", finishListener);\n chatService.subscribe(\"stop\", stopListener);\n chatService.subscribe(\"message.fetch.end\", fetchEndListener);\n return () => {\n chatService.unsubscribe(\"add\", listener);\n chatService.unsubscribe(\"finish\", finishListener);\n chatService.unsubscribe(\"stop\", stopListener);\n chatService.unsubscribe(\"message.fetch.end\", fetchEndListener);\n };\n }, [chatService, activeSessionId, msgList, showToolCalls, fetchToolName]);\n\n return {\n sessionEnd,\n sessionLoading,\n loading,\n chatting,\n activeSessionId,\n sessionList,\n searchStr,\n msgEnd,\n msgLoading,\n msgList,\n toolNames,\n setAgent,\n handleChat,\n stopChat,\n createSession,\n deleteSession,\n updateSession,\n checkSession,\n setSearchStr,\n querySessionHistory,\n handleIsLike,\n };\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.progress-text{position:relative;margin-left:12px;font-size:12px;color:var(--palette-gray-7);line-height:22px;min-height:22px}.progress-text::before{content:\"·\";font-size:16px;position:absolute;left:-10px;top:-4px}.custom-component-wrapper .params{margin-top:6px;border-radius:3px}.custom-component-wrapper .params pre{margin:4px 0}.custom-component-wrapper .params-tip,.custom-component-wrapper .error-tip,.custom-component-wrapper .result-tip{font-size:0.875em;color:rgb(94 129 172)}.custom-component-wrapper .empty-tip{font-size:12px;color:var(--palette-gray-7)}.custom-component-wrapper .table-wrapper .table-container{position:relative;box-sizing:border-box;margin:0;padding:0;font-size:14px;clear:both;max-width:100%;overflow:hidden}.custom-component-wrapper .table-wrapper .table-container .table-content{overflow-x:auto}.custom-component-wrapper .table-wrapper .table-container .table-content table{margin:4px 0}.custom-component-wrapper .table-wrapper .table-container .table-content table tr td{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.custom-component-wrapper .table-wrapper .open-more{margin-top:4px;font-size:12px;display:flex;justify-content:flex-end}.custom-component-wrapper .chart-wrapper{background:#fff;margin-top:12px}.default-container .default-toolbar-container{visibility:hidden;position:absolute;top:0;right:0}.default-container:hover .default-toolbar-container{visibility:visible}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ProseMirror{position:relative;word-wrap:break-word;white-space:pre-wrap;white-space:break-spaces;font-variant-ligatures:none;font-feature-settings:\"liga\" 0,none;font-weight:400}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:\"\";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}img.ProseMirror-separator{display:inline!important;border:none!important;margin:0!important}.ProseMirror .tableWrapper{overflow-x:auto}.ProseMirror table{border-collapse:collapse;table-layout:fixed;width:100%;overflow:hidden;background-color:white;margin:4px 0}.ProseMirror td,\n.ProseMirror th{vertical-align:top;box-sizing:border-box;position:relative}.ProseMirror .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;z-index:20;background-color:#adf;pointer-events:none}.ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.ProseMirror .selectedCell:after{z-index:2;position:absolute;content:\"\";left:0;right:0;top:0;bottom:0;background:rgba(200,200,255,0.4);pointer-events:none}.milkdown-theme-nord blockquote{border-left-width:4px;--tw-border-opacity:1;border-color:rgb(94 129 172/var(--tw-border-opacity));padding-left:1rem;font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif;font-style:normal}.milkdown-theme-nord code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-weight:400;--tw-text-opacity:1;color:rgb(94 129 172/var(--tw-text-opacity))}.user .milkdown-theme-nord code{color:rgb(120 168 237)}.milkdown-theme-nord pre code{color:inherit}.milkdown-theme-nord img{margin-top:0!important;margin-bottom:0!important;display:inline-block;max-width:100%}.milkdown-theme-nord.prose\n :where(blockquote):not(:where([class~=\"not-prose\"] *)){font-weight:400}.milkdown-theme-nord.prose\n :where(ol > li):not(:where([class~=\"not-prose\"] *))::marker,\n.milkdown-theme-nord.prose\n :where(ul > li):not(:where([class~=\"not-prose\"] *))::marker{--tw-text-opacity:1;color:rgb(94 129 172/var(--tw-text-opacity))}.milkdown-theme-nord.prose\n :where(blockquote p:first-of-type):not(:where([class~=\"not-prose\"] *)):before,\n.milkdown-theme-nord.prose\n :where(blockquote p:first-of-type):not(:where([class~=\"not-prose\"] *)):after{content:\"\"}.milkdown-theme-nord.prose\n :where(code):not(:where([class~=\"not-prose\"] *)):before,\n.milkdown-theme-nord.prose\n :where(code):not(:where([class~=\"not-prose\"] *)):after{content:\"\"}.milkdown-theme-nord.prose .tableWrapper{position:relative;margin-bottom:0.5rem;overflow-x:auto}.milkdown-theme-nord.prose table{font-size:0.875rem;line-height:1.25rem;--tw-shadow:0 4px 6px -1px rgb(0 0 0/0.1),0 2px 4px -2px rgb(0 0 0/0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);width:max-content}@media (min-width: 640px){.milkdown-theme-nord.prose table{border-radius:0.5rem}}.milkdown-theme-nord.prose td,\n.milkdown-theme-nord.prose th{padding:0.75rem 1.5rem!important;max-width:20em}.milkdown-theme-nord.prose tr{border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.prose :where(tr:first-child){background-color:var(--antd-table-header-bg)}.dark .milkdown-theme-nord.prose tr{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.milkdown-theme-nord.prose :where(td, th) p{margin:0!important}.dark .milkdown-theme-nord.prose :where(td, th):nth-child(odd){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.milkdown-theme-nord.prose.ProseMirror .selectedCell:after{background-color:#88c0d04d}.milkdown-theme-nord.prose br[data-is-inline=\"true\"],\n.milkdown-theme-nord.prose br[data-is-inline=\"true\"]:after{content:\" \"}.prose{color:var(--color-normal-text)}.prose :where(p):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=\"lead\"]):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=\"not-prose\"] *)){color:var(--color-info);-webkit-text-decoration:underline;text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600}.user .prose :where(strong):not(:where([class~=\"not-prose\"] *)){color:inherit;font-weight:600;padding:0 2px}.prose :where(a strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(ol):not(:where([class~=\"not-prose\"] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=\"A\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-alpha}.prose :where(ol[type=\"a\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-alpha}.prose :where(ol[type=\"A\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-alpha}.prose :where(ol[type=\"a\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-alpha}.prose :where(ol[type=\"I\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-roman}.prose :where(ol[type=\"i\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-roman}.prose :where(ol[type=\"I\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-roman}.prose :where(ol[type=\"i\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-roman}.prose :where(ol[type=\"1\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=\"not-prose\"] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol > li):not(:where([class~=\"not-prose\"] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul > li):not(:where([class~=\"not-prose\"] *))::marker{color:var(--tw-prose-bullets)}.prose :where(hr):not(:where([class~=\"not-prose\"] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=\"not-prose\"] *)){font-weight:500;font-style:italic;color:var(--color-auxiliary-text);border-left-width:0.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:\"\\\\201C\" \"\\\\201D\" \"\\\\2018\" \"\\\\2019\";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose\n :where(blockquote p:first-of-type):not(\n :where([class~=\"not-prose\"] *)\n )::before{content:open-quote}.prose\n :where(blockquote p:last-of-type):not(:where([class~=\"not-prose\"] *))::after{content:close-quote}.prose :where(h1):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:0.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=\"not-prose\"] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=\"not-prose\"] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:0.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=\"not-prose\"] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;margin-top:1.5em;margin-bottom:0.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=\"not-prose\"] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure > *):not(:where([class~=\"not-prose\"] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-captions);font-size:0.875em;line-height:1.4285714;margin-top:0.8571429em}.prose :where(code):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-code);font-weight:600;font-size:0.875em}.prose :where(code):not(:where([class~=\"not-prose\"] *))::before{content:\"\\`\"}.prose :where(code):not(:where([class~=\"not-prose\"] *))::after{content:\"\\`\"}.prose :where(a code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(h1 code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(h2 code):not(:where([class~=\"not-prose\"] *)){color:inherit;font-size:0.875em}.prose :where(h3 code):not(:where([class~=\"not-prose\"] *)){color:inherit;font-size:0.9em}.prose :where(h4 code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(thead th code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(pre):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:0.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:0.375rem;padding-top:0.8571429em;padding-right:1.1428571em;padding-bottom:0.8571429em;padding-left:1.1428571em}.prose :where(pre code):not(:where([class~=\"not-prose\"] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=\"not-prose\"] *))::before{content:none}.prose :where(pre code):not(:where([class~=\"not-prose\"] *))::after{content:none}.prose :where(table):not(:where([class~=\"not-prose\"] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:0.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=\"not-prose\"] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;vertical-align:bottom;padding-right:0.5714286em;padding-bottom:0.5714286em;padding-left:0.5714286em}.prose :where(tbody tr):not(:where([class~=\"not-prose\"] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=\"not-prose\"] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=\"not-prose\"] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=\"not-prose\"] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=\"not-prose\"] *)){vertical-align:top}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgb(0 0 0/50%);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(video):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=\"not-prose\"] *)){margin-top:0.5em;margin-bottom:0.5em}.prose :where(ol > li):not(:where([class~=\"not-prose\"] *)){padding-left:0.375em}.prose :where(ul > li):not(:where([class~=\"not-prose\"] *)){padding-left:0.375em}.prose :where(.prose > ul > li p):not(:where([class~=\"not-prose\"] *)){margin-top:0.75em;margin-bottom:0.75em}.prose\n :where(.prose > ul > li > *:first-child):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em}.prose\n :where(.prose > ul > li > *:last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:1.25em}.prose\n :where(.prose > ol > li > *:first-child):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em}.prose\n :where(.prose > ol > li > *:last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:1.25em}.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~=\"not-prose\"] *)){margin-top:0.75em;margin-bottom:0.75em}.prose :where(hr + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h2 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h3 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h4 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=\"not-prose\"] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=\"not-prose\"] *)){padding-right:0}.prose :where(tbody td, tfoot td):not(:where([class~=\"not-prose\"] *)){padding-top:0.5714286em;padding-right:0.5714286em;padding-bottom:0.5714286em;padding-left:0.5714286em}.prose\n :where(tbody td:first-child, tfoot td:first-child):not(\n :where([class~=\"not-prose\"] *)\n ){padding-left:0}.prose\n :where(tbody td:last-child, tfoot td:last-child):not(\n :where([class~=\"not-prose\"] *)\n ){padding-right:0}.prose :where(.prose > :first-child):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(.prose > :last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:0}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.isolate{isolation:isolate}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.\\\\!table{display:table!important}.table{display:table}.inline-table{display:inline-table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.flex-shrink{flex-shrink:1}.shrink{flex-shrink:1}.flex-grow{flex-grow:1}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.\\\\!transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.select-all{-webkit-user-select:all;user-select:all}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.break-all{word-break:break-all}.rounded{border-radius:0.25rem}.border{border-width:1px}.text-justify{text-align:justify}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.lining-nums{--tw-numeric-figure:lining-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0/0.1),0 1px 2px -1px rgb(0 0 0/0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}.ease-in{transition-timing-function:cubic-bezier(0.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(0.4,0,0.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,0.2,1)}.milkdown{border-radius:0.25rem;margin:0;padding:0}.editor{margin-left:auto;margin-right:auto}.dark .dark\\\\:prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}code[class*=\"language-\"],\npre[class*=\"language-\"]{color:#f8f8f2;background:none;font-family:\"Fira Code\",Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=\"language-\"]{padding:1em;margin:0.5em 0;overflow:auto;border-radius:0.3em}:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"]{background:#2e3440}:not(pre) > code[class*=\"language-\"]{padding:0.1em;border-radius:0.3em;white-space:normal}.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:0.7}.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted{color:#a3be8c}.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable{color:#81a1c1}.token.atrule,\n.token.attr-value,\n.token.function,\n.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,\n.token.important{color:#ebcb8b}.token.important,\n.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.quick-answer-wrapper{margin-top:20px;border-radius:6px;border:1px solid var(--color-border-divider-line);padding:16px 24px}.quick-answer-wrapper .tip{font-size:18px;margin-bottom:30px}.quick-answer-wrapper .quick-answer-list{display:grid;gap:24px 16px;border-radius:3px;grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item{position:relative;padding:16px;border-radius:6px;cursor:pointer;display:flex;padding:10px 20px;gap:12px;width:auto;box-sizing:border-box}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item:hover{box-shadow:var(--quick-answer-card-item-hover)}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .left .icon{font-size:20px;color:#fff;padding:8px;border-radius:6px;margin-top:4px}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content{flex:1;min-width:0}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content .title{font-size:16px;font-weight:bold;color:var(--color-normal-text);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content .description{color:var(--color-auxiliary-text);font-size:12px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.quick-answer-wrapper .show-more-wrapper{text-align:center;margin-top:20px}.quick-answer-wrapper .show-more-wrapper .show-more-btn{line-height:24px}.quick-answer-wrapper .show-more-wrapper .show-more-btn::after{content:\"- - - - -\";color:var(--color-text-divider-line);position:absolute}.quick-answer-wrapper .show-more-wrapper .show-more-btn::before{content:\"- - - - -\";color:var(--color-text-divider-line);position:absolute}.quick-answer-wrapper .show-more-wrapper .show-more-btn::before{margin-left:-60px}.quick-answer-wrapper .show-more-wrapper .show-more-btn::after{margin-left:10px}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../assets/loading.gif\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.message-list-loading-wrapper{width:140px;height:140px;background-repeat:no-repeat;margin:auto;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___})}.chart-item-loading-wrapper{display:flex;padding:10px;font-size:40px;align-items:center;justify-content:center;color:#d2d3d4;border-radius:6px}.chart-item-loading-wrapper .load{display:inline-block;position:relative;width:64px;height:64px}.chart-item-loading-wrapper .load div{position:absolute;top:27px;width:11px;height:11px;border-radius:50%;background:#aaa8a8;animation-timing-function:cubic-bezier(0,1,1,0)}.chart-item-loading-wrapper .load div:nth-child(1){left:6px;animation:load1 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(2){left:6px;animation:load2 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(3){left:26px;animation:load2 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(4){left:45px;animation:load3 0.6s infinite}@keyframes load1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes load2{0%{transform:translate(0,0)}100%{transform:translate(19px,0)}}@keyframes load3{0%{transform:scale(1)}100%{transform:scale(0)}}.common-loading-wrapper{text-align:center;font-size:30px;color:#ddd}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--message-box-bg:#f1f3f4;--search-input-icon-hover:#ddd;--quick-answer-card-item-hover:0px 7px 8px 0px rgba(0,0,0,0.15)}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--message-box-bg:rgba(255,255,255,0.16);--search-input-icon-hover:#383838;--quick-answer-card-item-hover:0px 7px 8px 0px rgba(0,0,0,0.24)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./styles.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_1___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/loading.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_2___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/MessageItem/Markdown/markdown.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_3___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/QuickAnswerList/quickAnswerList.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_4___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/MessageItem/Markdown/CodeBlock/CodeBlock.shadow.css\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_2___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_3___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_4___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"./assets/user.png\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"./assets/robot.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block;height:100%}:host([hidden]){display:none}.chat-view-container{display:flex;flex-direction:row;width:100%;height:100%}.chat-view-selector{width:200px;padding:14px;border-right:1px solid var(--color-border-divider-line)}.chat-view-content{flex:1;display:flex;flex-direction:column;width:100%;gap:8px}.chat-view-content .chat-view-toolbar{background:#e0e4e5;padding:18px;display:flex;justify-content:space-between;align-items:center}.chat-view-content .chat-view-toolbar .username{color:#333333;font-weight:500;line-height:22px;font-size:16px}.chat-view-content .chat-view{max-width:100%;position:relative;display:flex;flex:1;flex-direction:column;box-sizing:border-box;overflow-y:auto}.session-list-wrapper{display:flex;flex-direction:column;height:100%}.session-list-wrapper .session-title{font-size:16px;color:var(--color-header-text);margin-bottom:16px}.session-list-wrapper .session-list{overflow-y:auto}.session-list-wrapper .session-list .session-item{display:flex;justify-content:space-between;cursor:pointer;border-radius:var(--small-border-radius);background-color:var(--third-menu-default-bg);padding:6px 18px;color:var(--color-header-text);margin-top:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-list-wrapper .session-list .session-item .content{width:0;flex:1}.session-list-wrapper .session-list .session-item .content .title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-list-wrapper .session-list .session-item:hover .session-close-btn eo-icon{display:block}.session-list-wrapper .session-list .session-item:hover .session-edit-btn eo-icon{display:block}.session-list-wrapper .session-list .session-item:first-child{margin-top:0px}.session-list-wrapper .session-list .session-item.active{background-color:var(--third-menu-item-selected-bg);color:var(--color-brand)}.session-list-wrapper .session-list .session-item:hover,.session-list-wrapper .session-list .session-item.active:hover{color:var(--color-header-text);background-color:var(--third-menu-item-hover-bg)}.session-list-wrapper .session-list .session-item .session-close-btn{display:flex;align-items:center;cursor:pointer;font-size:12px;margin-left:6px}.session-list-wrapper .session-list .session-item .session-close-btn:hover{color:var(--color-error)}.session-list-wrapper .session-list .session-item .session-close-btn eo-icon{display:none}.session-list-wrapper .session-list .session-item .session-edit-btn{display:flex;align-items:center;cursor:pointer;font-size:12px}.session-list-wrapper .session-list .session-item .session-edit-btn:hover{color:var(--color-info)}.session-list-wrapper .session-list .session-item .session-edit-btn eo-icon{display:none}.message-list{display:flex;flex-direction:column;padding-bottom:30px;padding:12px;flex:1;margin:0 auto;max-width:1556px;width:100%;box-sizing:border-box}.message-list .message-list-box{display:flex;flex-direction:column;position:relative;gap:36px}.message-list .message-list-box .message-item{display:flex;gap:8px;padding-right:40px}.message-list .message-list-box .message-item:last-child{margin-bottom:10px}.message-list .message-list-box .message-item.user{flex-direction:row-reverse;padding:0;padding-left:40px}.message-list .message-list-box .message-item.user .message-box{margin-bottom:0;overflow:hidden}.message-list .message-list-box .message-item.user .message-box .message-top{flex-direction:row-reverse}.message-list .message-list-box .message-item.user .message-box .message-content{justify-content:flex-end}.message-list .message-list-box .message-item.user .message-box .message-content .wrapper .content{background-color:#606f7c;color:#fff}.message-list .message-list-box .message-item.user .message-box .message-content .wrapper .content .ProseMirror.prose{color:#fff}.message-list .message-list-box .message-item .avatar{width:36px;height:36px;margin-top:32px;border-radius:50%;font-size:20px;display:flex;align-items:center;justify-content:center}.message-list .message-list-box .message-item .avatar.user{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___})}.message-list .message-list-box .message-item .avatar.robot{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___})}.message-list .message-list-box .message-item .message-box{position:relative;flex:1;overflow:hidden}.message-list .message-list-box .message-item .message-box .message-content{display:flex;justify-content:start;position:relative}.message-list .message-list-box .message-item .message-box .message-content .wrapper{position:relative;overflow:hidden}.message-list .message-list-box .message-item .message-box .message-content .wrapper .content{position:relative;padding:14px;border-radius:6px;overflow:hidden;background:var(--message-box-bg)}.message-list .message-list-box .message-item .message-box .message-content .wrapper .content .text-item{white-space:pre-wrap}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar{display:flex;gap:12px;justify-content:flex-end;margin-top:4px}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar eo-icon{cursor:pointer;color:#606f7c}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar eo-icon.active{color:var(--color-brand)}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar .split{width:1px;height:16px;background-color:#d9d9d9;margin-bottom:1px}.message-list .message-list-box .message-item .message-box .message-top{display:flex;margin-bottom:4px;color:#bec8ce;gap:8px}.message-list .message-list-box .message-item .message-box .message-top .time{min-height:22px}.message-list .message-list-box .stop-responding-wrapper{position:absolute;left:44px;bottom:-28px}.message-list .tool-calls{width:-moz-fit-content;width:fit-content;max-width:100%;padding:14px;border-radius:6px;background:var(--message-box-bg);margin-bottom:8px}.message-list .tool-calls pre{margin-top:1em;padding:0.5em;border:1px solid var(--palette-gray-5);border-radius:4px;font-size:12px}.message-list .tool-calls-summary{cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.message-list .tool-calls-summary-toggle{color:var(--color-secondary-text)}.message-list .tool-calls-status,.message-list .tool-call-function-name{display:flex;gap:8px;align-items:center}.message-list .tool-calls-status.processing{color:var(--color-secondary-text)}.message-list .tool-calls-status.ok{color:var(--color-success)}.message-list .tool-calls-status.failed{color:var(--color-error)}.message-list .tool-call{margin-top:1em;padding-top:1em;border-top:1px solid var(--palette-gray-5)}.message-list .tool-call-function-name{font-weight:bold;margin-bottom:0.5em}.message-list .tool-call-wait-response{margin:1em 0}.message-list .tool-call-function-arguments.failed,.message-list .tool-call-function-response.failed{color:var(--color-error)}.message-list .tool-call-function-arguments.failed pre,.message-list .tool-call-function-response.failed pre{border-color:var(--color-error)}.search-input-box{display:flex;flex-direction:column;height:87px;padding:12px;position:relative;margin:0 auto;max-width:1556px;width:100%;box-sizing:border-box}.search-input-box .input-toolbar{position:absolute;bottom:71%;left:12px;right:12px}.search-input-box .mentions-list-wrapper{position:absolute;bottom:100%;left:12px;right:12px;z-index:1}.search-input-box .mentions-list-wrapper .content{background-color:var(--antd-input-bg);border-radius:6px;border:1px solid var(--palette-gray-4);padding:8px}.search-input-box .mentions-list-wrapper .content .mentions-title{font-size:14px;font-weight:bold;color:var(--color-strong-text);padding-bottom:8px}.search-input-box .mentions-list-wrapper .content .mentions-list{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow-y:auto}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item{display:flex;flex-direction:row;align-items:center;gap:12px;padding:8px;border-radius:6px;cursor:pointer}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .icon{font-size:18px;padding:8px;border-radius:50%}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .name{color:var(--color-normal-text)}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .description{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--color-disabled-text)}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item:hover,.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item.active{background:var(--palette-gray-3)}.search-input-box .snippets-list-wrapper{position:absolute;bottom:100%;left:12px;right:12px;z-index:1}.search-input-box .snippets-list-wrapper .content{background-color:var(--antd-input-bg);border-radius:6px;border:1px solid var(--palette-gray-4);padding:8px}.search-input-box .snippets-list-wrapper .content .snippets-title{font-size:14px;font-weight:bold;color:var(--color-strong-text);padding-bottom:8px}.search-input-box .snippets-list-wrapper .content .snippets-list{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow-y:auto}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item{display:flex;flex-direction:row;align-items:center;gap:12px;padding:8px;border-radius:6px;cursor:pointer}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .icon{font-size:18px;padding:8px;border-radius:50%}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .name{color:var(--color-normal-text)}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .description{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--color-disabled-text)}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item:hover,.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item.active{background:var(--palette-gray-3)}.search-input-box.fill-content{border-top:1px solid rgba(197,197,197,0.5)}.search-input-box .input-box{position:absolute;bottom:20px;left:12px;right:12px;display:inline-flex;padding:var(--input-affix-wrapper-padding);border-radius:var(--small-border-radius);height:-moz-fit-content;height:fit-content;color:var(--text-color-default);background-color:var(--antd-input-bg);border:1px solid var(--color-border-divider-line);transition:border-color 0.3s;overflow:visible}.search-input-box .input-box.active{border-color:var(--antd-input-focus-border-color)}.search-input-box .input-box.disabled{pointer-events:none;background:var(--input-outline-disabled);cursor:not-allowed}.search-input-box .input-box.expand textarea{padding-right:50px;margin-bottom:50px}.search-input-box .input-box textarea{width:100%;height:22px;font-size:18px;resize:none;padding:10px 50px 10px 10px;outline:none;border:none;line-height:20px;color:var(--color-normal-text);background-color:transparent;cursor:inherit;transition:all 300ms ease-out;box-sizing:content-box}.search-input-box .input-box textarea::placeholder{color:#b0b1b8}.search-input-box .input-box .suffix-icon{display:flex;align-items:center;gap:8px;position:absolute;right:12px;bottom:6px}.search-input-box .input-box .suffix-icon eo-tooltip{display:flex}.search-input-box .input-box .suffix-icon eo-icon{font-size:20px;cursor:pointer;padding:6px;border-radius:3px}.search-input-box .input-box .suffix-icon eo-icon:not(.disabled):hover{background:var(--search-input-icon-hover)}.search-input-box .input-box .suffix-icon .submit-split{width:1px;height:20px;background:#d1d1d1}.search-input-box .input-box .suffix-icon .submit-btn.active{color:var(--color-brand)}.search-input-box .input-box .suffix-icon .submit-btn.disabled{color:var(--color-disabled-text);cursor:not-allowed}.search-input-box .input-box .toolbar-icon{position:absolute;top:12px;right:14px}.search-input-box .input-box .toolbar-icon eo-icon{font-size:20px;cursor:pointer;padding:6px;border-radius:3px}.search-input-box .input-box .toolbar-icon eo-icon:hover{background:var(--search-input-icon-hover)}.search-input-box .search-input-toolbar{display:flex;justify-content:flex-end;position:absolute;right:12px;bottom:0px}.search-input-box .search-input-toolbar .input-tip{font-size:12px;color:var(--color-secondary-text)}.message-start-tip,\n.session-end-tip{color:var(--color-disabled-text);font-size:12px;text-align:center;margin-top:12px;position:relative}.message-start-tip::after{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.session-end-tip::after{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.message-start-tip::before{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.session-end-tip::before{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.message-start-tip::before{margin-left:-35px}.session-end-tip::before{margin-left:-35px}.message-start-tip::after{margin-left:10px}.session-end-tip::after{margin-left:10px}.session-search-input-box{position:relative;display:inline-flex;padding:var(--input-affix-wrapper-padding);border-radius:var(--small-border-radius);height:-moz-fit-content;height:fit-content;color:var(--text-color-default);background-color:var(--antd-input-bg);border:1px solid var(--color-border-divider-line);margin-bottom:8px}.session-search-input-box input{width:100%;padding:4px 28px 4px 8px;outline:none;border:none;color:var(--color-normal-text);background-color:transparent;cursor:inherit;transition:all 300ms ease-out;box-sizing:content-box}.session-search-input-box input::placeholder{color:#b0b1b8}.session-search-input-box .suffix-icon{display:flex;align-items:center;position:absolute;right:0;bottom:0;color:var(--color-secondary-text)}.session-search-input-box .suffix-icon eo-tooltip{display:flex}.session-search-input-box .suffix-icon eo-icon{font-size:18px;cursor:pointer;padding:6px;border-radius:3px}.session-search-input-box .suffix-icon eo-icon:not(.disabled):hover{color:var(--color-info-active)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./index.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./index.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["ChatViewContext","createContext","useChatViewContext","useContext","WrappedIcon","wrapBrick","MessageListLoading","React","className","ChatItemLoading","CommonLoading","icon","lib","spinning","Avatar","_ref","role","agentId","isUser","useMemo","quickAnswerConfig","agentList","_quickAnswerConfig$li","list","matchAgent","find","item","id","_extends","style","color","background","WrappedLink","GuideItem","text","prompts","map","index","key","ProgressText","renderText","replace","MsgItemContext","useMsgItemContext","CustomComponent","_ref2","language","commandBricks","chatting","robotId","conversationId","taskId","parseData","isError","cahceTextRef","useRef","isEnd","setIsEnd","useState","setIsError","setParseData","useEffect","current","data","JSON","parse","match","useData","commandBrickConf","config","component","ReactUseMultipleBricks","useBrick","showOriginData","copyIcon","theme","CodeBlock","setLanguage","contentRef","node","useNodeViewContext","messageApi","contextHolder","message","useMessage","handleCopy","async","_node$content$firstCh","content","firstChild","navigator","clipboard","writeText","success","err","console","error","defaultContent","spellCheck","ref","position","Tooltip","title","arrow","onClick","cursor","renderContent","_node$firstChild","_node$firstChild2","_node$attrs","textContent","lang","attrs","MarkdownItem","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownDisplay","value","nodeViewFactory","useNodeViewFactory","transformOpenAIToCodeBlock","str","test","_","$1","get","useEditor","root","Editor","make","ctx","set","rootCtx","update","editorViewOptionsCtx","prev","editable","handleClickOn","view","pos","handleClick","found","state","tr","doc","nodeAt","mark","marks","m","type","name","href","window","open","realValue","defaultValueCtx","MutationObserver","Array","from","querySelectorAll","forEach","link","onclick","observe","childList","subtree","nord","use","prism","gfm","commonmark","$view","codeBlockSchema","undefined","_get","action","replaceAll","Milkdown","TableItem","TextItem","WrapperIcon","WrappedToolTip","copyToClipboard","unwrapProvider","showNotification","Toolbar","tag","isAssistant","isChattingItem","showLike","globalChatting","showShare","readonly","handleIsLike","setSearchStr","handleLikeOrIsLike","useCallback","result","islike","hoist","classNames","active","isLike","then","catch","handleShare","location","origin","getBasePath","handleRequestion","Time","time","moment","format","WrappedButton","WrappedTag","ToolCalls","toolCalls","expanded","setExpanded","processedToolCalls","processedArguments","processedResponse","function","func","response","ok","arguments","functionName","args","processStatus","status","toolCall","marginRight","prefix","ToolCallComponent","_ref3","_toolNames$get","toolNames","outline","failed","dumpYaml","safeDump","schema","JSON_SCHEMA","skipInvalid","noRefs","noCompatMode","NOT_AGENT_MATCH","MessageNode","props","created","itemType","showToolCalls","getContentNode","examplePrompts","messageNode","getMsgNode","RELATED_QUESTIONS_TYPE","DEFAULT_TYPE","length","Provider","CARD_ITEM_HEIGHT","HEIGHT_GAP","QuickAnswerCardItem","description","starterPrompts","iconColor","_icon$color","height","handleCardClick","category","QuickAnswerList","_quickAnswerConfig$ti","msgList","loading","showMoreBtn","setShowMoreBtn","listRef","hadClickShowMoreBtn","element","observer","ResizeObserver","entries","entry","contentRect","disconnect","tip","maxHeight","overflow","instanceId","handleShowMoreClick","StopBtn","stopChat","handleStopChat","MessageList","showAvatar","chatViewRef","messageListRef","msgLoading","msgEnd","getMsgItemNode","marginTop","marginLeft","user","msgListNode","manualScrolled","setManualScrolled","autoScrollingRef","chatView","handleScroll","scrollTop","clientHeight","scrollHeight","addEventListener","removeEventListener","scroll","top","requestAnimationFrame","SIZING_STYLE","hiddenTextarea","LegacySearchInput","setValue","setActive","expand","setExpand","autoSizeStyle","setAutoSizeStyle","isFillContent","setIsFillContent","snippetOpen","setSnippetOpen","matchSnippetList","setMatchSnippetList","matchSnippetIndex","setMatchSnippetIndex","mentionOpen","setMentionOpen","matchPrefixIndex","setMatchPrefixIndex","matchAgentList","setMatchMentionList","matchMentionsIndex","setMatchMentionsIndex","mentionsRef","snippetsRef","searchInputBoxRef","textareaRef","hadExpanded","inputEndRef","searchStr","createSession","handleChat","setAgent","snippetList","hadValue","defaultSize","disabled","matchPrefixInfo","textareaElement","currentFocusIndex","selectionStart","matchWord","i","start","end","word","handleAgentItemSelect","valueList","split","trimName","focusIndex","splice","join","setTimeout","selectionEnd","focus","handleSnippetItemSelect","regex","matches","exec","push","isShowMentions","mentions","slice","isShowSnippets","snippets","computedAutoSize","size","textareaStyles","uiTextNode","minRows","maxRows","document","createElement","setAttribute","body","appendChild","uiTextNodeStyle","getComputedStyle","sizingStyle","getPropertyValue","minHeight","placeholder","singleRowHeight","Math","max","min","overflowY","resize","calculateAutoSizeStyle","handleChange","e","target","keyword","trim","_snippetList$filter","filterResult","filter","includes","handleExpand","matchFirstAgent","agent","handleDispatchQuestion","val","_textareaRef$current","blur","handleSubmit","handleKeyDown","shiftKey","preventDefault","handleKeyUp","selectionIndex","prefixWord","lastIndexOf","indexOf","_textareaRef$current2","searchInputBox","width","currentWidth","getBoundingClientRect","_textareaRef$current3","filterList","querySelector","scrollIntoView","block","handleDocumentClick","mentionsElemnt","contains","composedPath","useImperativeHandle","handleInsertQuestion","sendMsg","msg","inputToolbarBrick","paddingRight","onFocus","onBlur","onChange","onKeyDown","onKeyUpCapture","onCompositionStart","handleCompositionStart","onCompositionEnd","handleCompositionEnd","hanldeCreateSession","SearchInput","forwardRef","showDialog","WrappedModal","onClose","onConfirm","onCancel","onOpen","WrappedForm","onValuesChange","onValidateSuccess","onValidateError","WrappedInput","SESSION_ITEM_HEIGHT","BUFFER_NUMBER","CACHE_HEIGHT","SessionList","sessionEnd","sessionLoading","sessionList","querySessionHistory","updateSession","sessionWrapperRef","sessionListRef","searchQueryRef","editModalRef","editFormRef","editRawDataRef","editConversationIdRef","getFitLimit","limit","sessionWrapper","floor","checkSessionList","debounce","handleSearch","handleSearchEnter","handleEditSession","rawData","_editFormRef$current","_editModalRef$current","setInitValue","handleEditModalConfirm","_editFormRef$current2","validate","handleEditFormSubmit","detail","_editModalRef$current2","close","onScroll","SessionItem","modalTitle","maskClosable","closeWhenConfirm","layout","label","activeSessionId","checkSession","deleteSession","handleCheckSession","handleDeleteSession","stopPropagation","expect","handleEditSessionItem","NEW_SESSION_ID","_debug","WeakMap","_ctrl","_agentId","_robotId","_enterInterval","_chatting","_isStartEmitEvent","_emitTimer","_messageQueue","_subscribers","_conversationId","_answerLanguage","_sessionNextToken","_cacheLimit","_cacheQuery","_messageNextToken","_useSpiltWord","_ChatService_brand","WeakSet","ChatService","constructor","enterInterval","debug","answerLanguage","useSpiltWord","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_classPrivateFieldSet","this","enqueue","_classPrivateFieldGet","_assertClassBrand","_startEmitEvent","call","dequeue","shift","getMessageQueue","subscribe","topic","callback","unsubscribe","cb","notifySubscribers","setChatItemIsLike","flag","code","http","request","method","stringify","setAgentId","setConversationId","getSessionHistory","query","_classPrivateFieldGet2","conversations","next_token","getChatHistory","conversationIds","updateData","getCustomSplit","Symbol","cache","matchStr","substring","splitWord","Intl","iterator","Segmenter","granularity","segment","nextWord","next","done","customSplit","chat","AbortController","hadMatchMessage","fetchEventSource","signal","openWhenHidden","stream","input","headers","onopen","log","onmessage","abort","isGeneralTextType","wordList","delta","chunkedWords","maxChunks","minChunks","chunkSize","ceil","random","chunk","_result$delta$role","_result$delta$role2","pick","_result","_result2","SENSITIVE_WORDS_ERROR","EXCEED_TOKENS_ERROR","onclose","onerror","stop","_classPrivateFieldGet3","clearTimeout","_clear","messageItem","getRandomInterval","messagesInQueue","GENERAL_TEXT_TYPES","useChatViewInfo","sessionId","setSessionEnd","setSessionLoading","setActiveSessionId","setLoading","setChatting","setSessionList","setMsgLoading","setMsgEnd","setMsgList","chattingMessageItem","sessionSearchQuery","haveCreatedSession","setToolNames","Map","toolNameRequests","fetchToolName","toolId","has","promise","InstanceApi_postSearchV3","fields","res","pre","newMap","chatService","defaultNewSessionItem","preList","newList","allToolCalls","originalCall","callId","isArray","unshift","uniqueId","output","inputTime","computedList","concat","filterIds","ids","deleteActiveSession","hasNewOne","newSessionList","inputMsg","handleSessionEnd","listener","_msgItem","_chattingMessageItem$","_chattingMessageItem$2","_chattingMessageItem$3","_chattingMessageItem$4","_chattingMessageItem$5","_chattingMessageItem$6","_chattingMessageItem$7","_chattingMessageItem$8","msgItemData","tool_calls","generalSameType","isStart","isUpdate","a","b","thisMessage","tool_call_id","pop","reset","finishListener","_item$toolCalls","fetchEndListener","stopListener","stopMessageItem","___CSS_LOADER_EXPORT___","module","___CSS_LOADER_URL_IMPORT_0___","URL","___CSS_LOADER_URL_REPLACEMENT_0___","___CSS_LOADER_URL_IMPORT_1___","___CSS_LOADER_URL_REPLACEMENT_1___","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"chunks/3497.306a84f1.js","mappings":"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","sources":["webpack:///./src/chat-view/ChatViewContext.ts","webpack:///./src/chat-view/components/Loading.tsx","webpack:///./src/chat-view/components/MessageItem/Avatar.tsx","webpack:///./src/chat-view/components/MessageItem/GuideItem.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/ProgressText.tsx","webpack:///./src/chat-view/components/MessageItem/MsgItemContext.ts","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/CustomComponent.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/index.tsx","webpack:///./src/chat-view/components/MessageItem/Markdown/index.tsx","webpack:///./src/chat-view/components/MessageItem/TableItem.tsx","webpack:///./src/chat-view/components/MessageItem/TextItem.tsx","webpack:///./src/chat-view/components/MessageItem/Toolbar.tsx","webpack:///./src/chat-view/components/MessageItem/Time.tsx","webpack:///./src/chat-view/components/MessageItem/ToolCalls.tsx","webpack:///./src/chat-view/components/MessageItem/index.tsx","webpack:///./src/chat-view/components/QuickAnswerList/index.tsx","webpack:///./src/chat-view/components/StopBtn.tsx","webpack:///./src/chat-view/components/MessageList.tsx","webpack:///./src/chat-view/components/utils/calculateAutoSizeStyle.ts","webpack:///./src/chat-view/components/SearchInput.tsx","webpack:///./src/chat-view/components/SessionList.tsx","webpack:///./src/chat-view/ChatService.ts","webpack:///./src/chat-view/hooks/useChatViewInfo.ts","webpack:///./src/chat-view/components/MessageItem/Markdown/CodeBlock/CodeBlock.shadow.css","webpack:///./src/chat-view/components/MessageItem/Markdown/markdown.shadow.css","webpack:///./src/chat-view/components/QuickAnswerList/quickAnswerList.shadow.css","webpack:///./src/chat-view/components/loading.shadow.css","webpack:///./src/chat-view/host-context.css","webpack:///./src/chat-view/index.css","webpack:///./src/chat-view/styles.shadow.css","webpack:///./src/chat-view/host-context.css?1beb","webpack:///./src/chat-view/index.css?7225"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { AgentDetailItem } from \"./components/QuickAnswerList/index.js\";\nimport { ChatBody, SessionItem } from \"./ChatService.js\";\nimport { UseBrickConf } from \"@next-core/types\";\n\nexport type Role = \"guide\" | \"user\" | \"assistant\" | \"tool\";\n\nexport type commandBrickConf = Record<\n string,\n { useBrick: UseBrickConf; showOriginData?: boolean }\n>;\n\nexport interface MessageItemContent {\n type: \"guide\" | \"text\" | \"markdown\" | \"table\" | \"load\";\n text: string;\n examplePrompts?: string[];\n}\n\nexport interface MessageItem {\n role: Role;\n content: MessageItemContent;\n created?: number | string;\n key: string;\n conversationId?: string;\n taskId?: string;\n agentId?: string;\n robotId?: string;\n chatting?: boolean;\n tag?: {\n isLike?: boolean;\n };\n type?: string;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: ToolCallFunction;\n response?: string;\n failed?: boolean;\n}\n\nexport interface ToolCallFunction {\n name: string;\n arguments: string;\n}\n\nexport interface QuickAnswerConfig {\n tip: string;\n list: AgentDetailItem[];\n}\n\nexport interface snippet {\n content: string;\n name: string;\n}\n\ninterface ChatViewContextProps {\n sessionEnd: boolean;\n sessionLoading: boolean;\n activeSessionId?: string;\n sessionList: SessionItem[];\n msgEnd: boolean;\n msgLoading: boolean;\n msgList: MessageItem[];\n loading: boolean;\n chatting: boolean;\n searchStr: string;\n showLike: boolean;\n showShare: boolean;\n readonly: boolean;\n quickAnswerConfig?: QuickAnswerConfig;\n snippetList?: snippet[];\n commandBricks?: commandBrickConf;\n showToolCalls?: boolean;\n toolNames: Map<string, string | null>;\n setAgent: (id: string) => void;\n handleIsLike: (id: string, isLike: boolean) => Promise<boolean>;\n handleChat: (str: string | ChatBody) => void;\n stopChat: () => void;\n checkSession: (id?: string, isInit?: boolean) => void;\n createSession: () => void;\n deleteSession: (ids: string[]) => Promise<boolean>;\n updateSession: (id: string, data: Partial<SessionItem>) => Promise<boolean>;\n setSearchStr: (str: string) => void;\n querySessionHistory: (limit?: number, query?: string) => void;\n}\n\nexport const ChatViewContext = createContext<ChatViewContextProps>(\n {} as ChatViewContextProps\n);\n\nexport const useChatViewContext = (): ChatViewContextProps =>\n useContext(ChatViewContext);\n","import React from \"react\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nexport function MessageListLoading() {\n return <div className=\"message-list-loading-wrapper\"></div>;\n}\n\nexport function ChatItemLoading() {\n return (\n <div className=\"chart-item-loading-wrapper\">\n <div className=\"load\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n </div>\n );\n}\n\nexport function CommonLoading() {\n return (\n <div className=\"common-loading-wrapper\">\n <WrappedIcon icon=\"loading\" lib=\"antd\" spinning />\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { useChatViewContext, type Role } from \"../../ChatViewContext.js\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nexport function Avatar({\n role,\n agentId,\n}: {\n role: Role;\n agentId?: string;\n}): React.ReactNode {\n const isUser = useMemo(() => role === \"user\", [role]);\n const { quickAnswerConfig } = useChatViewContext();\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const matchAgent = useMemo(() => {\n return agentList.find((item) => item.id === agentId);\n }, [agentList, agentId]);\n\n return !isUser && matchAgent ? (\n <WrappedIcon\n className=\"avatar\"\n {...matchAgent.icon}\n style={{\n color: `var(--theme-${matchAgent.icon.color}-color)`,\n background: `var(--theme-${matchAgent.icon.color}-background)`,\n }}\n />\n ) : (\n <div className={`avatar ${isUser ? \"user\" : \"robot\"}`} />\n );\n}\n","import React from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\ninterface GuideItemProps {\n text: string;\n prompts?: string[];\n}\n\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport function GuideItem({ text, prompts }: GuideItemProps) {\n return (\n <div className=\"guide-item\">\n {text}\n <div className=\"prompts-list\">\n {prompts\n ? prompts.map((item, index) => (\n <WrappedLink key={index}>{item}</WrappedLink>\n ))\n : null}\n </div>\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\n\nexport function ProgressText({ text }: { text: string }): React.ReactNode {\n const renderText = useMemo(() => {\n // 文本末尾存在 \\n ```, 会导致在渲染快结束的时候突然有一个换行,在结束的时候,换行被干掉,导致页面闪动的情况\n // 所以在这里计算,如果文本将要关闭,则默认不然 \\n ``` 显示\n const newText = text.replace(/\\n[`]{0,3}$/, \"\");\n return newText;\n }, [text]);\n\n return <div className=\"progress-text\">{renderText}</div>;\n}\n","import { createContext, useContext } from \"react\";\nimport { MessageItem } from \"../../ChatViewContext\";\n\nexport const MsgItemContext = createContext<MessageItem>({} as MessageItem);\n\nexport const useMsgItemContext = (): MessageItem => useContext(MsgItemContext);\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useMsgItemContext } from \"../../MsgItemContext.js\";\nimport { ReactUseMultipleBricks } from \"@next-core/react-runtime\";\nimport { useChatViewContext } from \"../../../../ChatViewContext.js\";\n\ninterface UseDataProps {\n text: string;\n chatting: boolean;\n}\n\nfunction useData({ text, chatting }: UseDataProps) {\n const cahceTextRef = useRef<string>(\"\");\n const [isEnd, setIsEnd] = useState<boolean>(false);\n const [isError, setIsError] = useState<boolean>(false);\n const [parseData, setParseData] = useState<any>();\n\n useEffect(() => {\n if (cahceTextRef.current !== text) {\n cahceTextRef.current = text;\n let data: any;\n try {\n data = JSON.parse(text);\n } catch {\n setIsError(true);\n return;\n }\n setParseData(data);\n }\n }, [text]);\n\n useEffect(() => {\n if (chatting) {\n if (text.match(/\\n[`]{0,3}$/)) {\n setIsEnd(true);\n }\n } else {\n setIsEnd(true);\n }\n }, [text, chatting]);\n\n return {\n parseData,\n isError: isEnd && isError,\n };\n}\n\nexport default function CustomComponent({\n text,\n language,\n}: {\n text: string;\n language: string;\n}) {\n const { commandBricks } = useChatViewContext();\n const { chatting, agentId, robotId, conversationId, taskId } =\n useMsgItemContext();\n\n const { parseData, isError } = useData({\n text,\n chatting: !!chatting,\n });\n\n const commandBrickConf = useMemo(() => {\n const config = commandBricks?.[language];\n if (config) {\n const data = {\n data: parseData,\n agentId,\n robotId,\n conversationId,\n taskId,\n };\n return {\n component: (\n <ReactUseMultipleBricks useBrick={config.useBrick} data={data} />\n ),\n ...config,\n };\n }\n return {\n component: null,\n showOriginData: true,\n };\n }, [\n commandBricks,\n language,\n parseData,\n agentId,\n robotId,\n conversationId,\n taskId,\n ]);\n\n return (\n <div className=\"custom-component-wrapper not-prose\">\n {commandBrickConf?.showOriginData ? (\n <>\n <div className=\"params\">\n <div className=\"params-tip\">【原始命令】: </div>\n <pre>\n <code>{text}</code>\n </pre>\n </div>\n {isError ? (\n <div className=\"error-tip\">【执行失败】</div>\n ) : (\n <>\n <div className=\"result-tip\">【执行结果】:</div>\n <div className=\"custom-component\">\n {commandBrickConf.component}\n </div>\n </>\n )}\n </>\n ) : (\n commandBrickConf.component\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useNodeViewContext } from \"@prosemirror-adapter/react\";\nimport { ProgressText } from \"./ProgressText.js\";\nimport CustomComponent from \"./CustomComponent.js\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport { GeneralIcon, GeneralIconProps } from \"@next-bricks/icons/general-icon\";\nimport { Tooltip, message } from \"antd\";\nimport { useChatViewContext } from \"../../../../ChatViewContext\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst copyIcon: GeneralIconProps = {\n lib: \"antd\",\n icon: \"copy\",\n theme: \"outlined\",\n};\n\nexport const CodeBlock = () => {\n const [language, setLanguage] = useState(\"\");\n const { contentRef, node } = useNodeViewContext();\n const { commandBricks } = useChatViewContext();\n const [messageApi, contextHolder] = message.useMessage();\n\n const handleCopy = async () => {\n const text = node.content.firstChild?.text;\n try {\n if (text) {\n await navigator.clipboard.writeText(text);\n messageApi.success(\"复制成功\");\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"Failed to copy: \", err);\n messageApi.error(\"复制失败\");\n }\n };\n\n const defaultContent = useMemo(\n () => (\n <div className=\"default-container\">\n {contextHolder}\n <pre spellCheck={false}>\n <code ref={contentRef} style={{ position: \"relative\" }}>\n <div className=\"default-toolbar-container\">\n <Tooltip title=\"复制\" color=\"#474747\" arrow={false}>\n <WrappedIcon\n {...(copyIcon as GeneralIconProps)}\n onClick={handleCopy}\n style={{ cursor: \"pointer\" }}\n />\n </Tooltip>\n </div>\n </code>\n </pre>\n </div>\n ),\n [contentRef]\n );\n\n const renderContent = useMemo(() => {\n if (!node.firstChild?.text) return null;\n const text = node.firstChild?.textContent;\n const lang = language || node.attrs?.language;\n if (commandBricks && commandBricks[lang]) {\n return <CustomComponent text={text} language={lang} />;\n }\n switch (lang) {\n case \"easy_cmd_progress\":\n return <ProgressText text={text} />;\n default:\n return defaultContent;\n }\n }, [node, language, defaultContent, commandBricks]);\n\n useEffect(() => {\n if (!language) {\n const {\n attrs: { language },\n } = node;\n if (language) {\n setLanguage(language);\n }\n }\n }, [node, language]);\n\n return renderContent;\n};\n","import React, { useEffect } from \"react\";\nimport {\n defaultValueCtx,\n Editor,\n rootCtx,\n editorViewOptionsCtx,\n} from \"@milkdown/core\";\nimport { EditorView } from \"prosemirror-view\";\nimport { Milkdown, useEditor, MilkdownProvider } from \"@milkdown/react\";\nimport { commonmark, codeBlockSchema } from \"@milkdown/preset-commonmark\";\nimport { nord } from \"@milkdown/theme-nord\";\nimport { gfm } from \"@milkdown/preset-gfm\";\nimport { prism } from \"@milkdown/plugin-prism\";\nimport { $view, replaceAll } from \"@milkdown/utils\";\nimport {\n ProsemirrorAdapterProvider,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { CodeBlock } from \"./CodeBlock/index.js\";\n\nexport function MarkdownItem({ text }: { text: string }) {\n return (\n <div className=\"markdown-item\">\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownDisplay value={text} />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n </div>\n );\n}\n\nexport function MarkdownDisplay({ value }: { value: string }): React.ReactNode {\n const nodeViewFactory = useNodeViewFactory();\n\n const handleClick = (view: EditorView, pos: number) => {\n const found = view.state.tr.doc.nodeAt(pos);\n const mark = found?.marks.find((m) => m.type.name === \"link\");\n if (mark) {\n const href = mark?.attrs.href;\n window.open(href, \"_blank\");\n }\n return true;\n };\n\n const transformOpenAIToCodeBlock = (str: string) => {\n if (/<tool_call>(.+)<\\/tool_call>/.test(str)) {\n return str.replace(\n /<tool_call>(.+?)<\\/tool_call>/g,\n (_, $1) => `\\n\\`\\`\\`easy_cmd_tool_call\\n${$1}\\n\\`\\`\\`\\n`\n );\n }\n return str;\n };\n\n const { get } = useEditor((root) => {\n return Editor.make()\n .config((ctx) => {\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => false,\n handleClickOn: (view: EditorView, pos: number) =>\n handleClick(view, pos),\n }));\n const realValue = transformOpenAIToCodeBlock(value);\n realValue && ctx.set(defaultValueCtx, realValue);\n //拦截link的默认点击事件以支持通过新窗口弹出页面,如果后续有其他的定制化需求可以改用custom widget的方式写link widget\n const observer = new MutationObserver(() => {\n const links = Array.from(root.querySelectorAll(\"a\"));\n links.forEach((link) => {\n link.onclick = () => false;\n });\n });\n observer.observe(root, {\n childList: true,\n subtree: true,\n });\n })\n .config(nord)\n .use(prism)\n .use(gfm)\n .use(commonmark)\n .use(\n $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n if (value !== undefined) {\n const realValue = transformOpenAIToCodeBlock(value);\n get()?.action(replaceAll(realValue));\n }\n }, [get, value]);\n\n return <Milkdown />;\n}\n","import React from \"react\";\n// import { wrapBrick } from \"@next-core/react-element\";\n// import type {\n// EoNextTable,\n// NextTableComponentProps,\n// } from \"@next-bricks/advanced/next-table\";\n\ninterface MarkdownItemProps {\n text: string;\n}\n\n// const WrappedNextTable = wrapBrick<EoNextTable, NextTableComponentProps>(\n// \"eo-next-table\"\n// );\n\nexport function TableItem({ text }: MarkdownItemProps) {\n // const parseContent = useMemo((): NextTableComponentProps => {\n // let content: NextTableComponentProps;\n // try {\n // content = JSON.parse(text);\n // } catch {\n // content = {} as NextTableComponentProps;\n // }\n // return content;\n // }, [text]);\n\n // return (\n // <div className=\"table-item\">\n // <WrappedNextTable pagination={false} {...parseContent} />\n // </div>\n // );\n return <div className=\"table-item\">{text}</div>;\n}\n","import React from \"react\";\n\ninterface TextItem {\n text: string;\n}\n\nexport function TextItem({ text }: TextItem) {\n return <div className=\"text-item\">{text}</div>;\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { copyToClipboard as _copyToClipboard } from \"@next-bricks/basic/data-providers/copy-to-clipboard\";\nimport type { showNotification as _showNotification } from \"@next-bricks/basic/data-providers/show-notification/show-notification\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport { MessageItem, useChatViewContext } from \"../../ChatViewContext\";\nimport { unwrapProvider } from \"@next-core/utils/general\";\nimport classNames from \"classnames\";\nimport { useMsgItemContext } from \"./MsgItemContext\";\nimport { getBasePath } from \"@next-core/runtime\";\n\nconst WrapperIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\nconst copyToClipboard = unwrapProvider<typeof _copyToClipboard>(\n \"basic.copy-to-clipboard\"\n);\nconst showNotification = unwrapProvider<typeof _showNotification>(\n \"basic.show-notification\"\n);\n\nexport function Toolbar({\n role,\n content,\n chatting,\n taskId,\n tag,\n}: MessageItem): React.ReactNode {\n const isAssistant = useMemo(\n () => role === \"assistant\" && content.type !== \"load\",\n [role, content.type]\n );\n const isUser = useMemo(() => role === \"user\", [role]);\n\n const isChattingItem = useMemo(() => chatting, [chatting]);\n const {\n showLike,\n chatting: globalChatting,\n showShare,\n readonly,\n handleIsLike,\n setSearchStr,\n } = useChatViewContext();\n const { agentId, robotId, conversationId } = useMsgItemContext();\n\n const handleCopy = () => {\n copyToClipboard(content.text)\n .then(() => showNotification({ type: \"success\", message: \"复制成功\" }))\n .catch(() => showNotification({ type: \"error\", message: \"复制失败\" }));\n };\n\n const handleRequestion = () => {\n setSearchStr(content.text);\n };\n\n const handleShare = () => {\n copyToClipboard(\n `${location.origin}${getBasePath()}ai-center/share?agentId=${agentId}&robotId=${robotId}&conversationId=${conversationId}`\n )\n .then(() =>\n showNotification({ type: \"success\", message: \"会话链接已复制到剪贴板\" })\n )\n .catch(() =>\n showNotification({ type: \"error\", message: \"会话链接复制失败\" })\n );\n };\n\n const handleLikeOrIsLike = useCallback(\n async (islike: boolean) => {\n const result = await handleIsLike(taskId!, islike);\n showNotification({\n message: `${islike ? \"点赞\" : \"操作\"}${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n },\n [taskId, handleIsLike]\n );\n\n return isAssistant && !isChattingItem ? (\n <div className=\"message-toolbar\">\n {showLike && !readonly && (\n <>\n <WrappedToolTip content=\"点赞\" hoist>\n <WrapperIcon\n className={classNames(\"like\", {\n active: tag?.isLike === true,\n })}\n lib=\"easyops\"\n icon=\"like\"\n onClick={() => handleLikeOrIsLike(true)}\n />\n </WrappedToolTip>\n <WrappedToolTip content=\"还不够好\" hoist>\n <WrapperIcon\n className={classNames(\"unlike\", {\n active: tag?.isLike === false,\n })}\n lib=\"easyops\"\n icon=\"unlike\"\n onClick={() => handleLikeOrIsLike(false)}\n />\n </WrappedToolTip>\n <div className=\"split\" />\n </>\n )}\n <WrappedToolTip content=\"点击复制\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"copy\" onClick={handleCopy} />\n </WrappedToolTip>\n {showShare && (\n <WrappedToolTip content=\"点击分享\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"share-alt\" onClick={handleShare} />\n </WrappedToolTip>\n )}\n </div>\n ) : !readonly && isUser && !globalChatting ? (\n <div className=\"message-toolbar\">\n <WrappedToolTip content=\"点击再次提问\" hoist>\n <WrapperIcon lib=\"antd\" icon=\"edit\" onClick={handleRequestion} />\n </WrappedToolTip>\n </div>\n ) : null;\n}\n","import moment from \"moment\";\nimport React from \"react\";\n\nexport function Time({ time }: { time?: string | number }) {\n return (\n <div className=\"time\">\n {time\n ? typeof time === \"string\"\n ? time\n : moment(time).format(\"YYYY-MM-DD HH:mm:ss\")\n : null}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { Tag, TagProps } from \"@next-bricks/basic/tag\";\nimport type { Button, ButtonProps } from \"@next-bricks/basic/button\";\nimport classNames from \"classnames\";\nimport { JSON_SCHEMA, safeDump } from \"js-yaml\";\nimport { useChatViewContext, type ToolCall } from \"../../ChatViewContext\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedButton = wrapBrick<Button, ButtonProps>(\"eo-button\");\nconst WrappedTag = wrapBrick<Tag, TagProps>(\"eo-tag\");\n\nexport interface ToolCallsProps {\n toolCalls: ToolCall[];\n}\n\ninterface ProcessedToolCall {\n id: string;\n functionName: string;\n processedArguments: ProcessedValue;\n processedResponse?: ProcessedValue;\n args: string;\n response?: string;\n failed?: boolean;\n}\n\ninterface ProcessedValue {\n ok: boolean;\n data?: unknown;\n error?: unknown;\n}\n\ntype ProcessStatus = \"processing\" | \"ok\" | \"failed\";\n\nexport function ToolCalls({ toolCalls }: ToolCallsProps) {\n const [expanded, setExpanded] = useState(false);\n\n const processedToolCalls = useMemo(() => {\n return toolCalls.map<ProcessedToolCall>(\n ({ id, function: func, response }) => {\n let processedArguments: ProcessedValue;\n try {\n const data = JSON.parse(func.arguments);\n processedArguments = {\n ok: true,\n data,\n };\n } catch {\n // Fallback to the original arguments\n processedArguments = {\n ok: true,\n data: func.arguments,\n };\n }\n\n let processedResponse: ProcessedValue | undefined;\n if (typeof response === \"string\") {\n let data: unknown;\n try {\n data = JSON.parse(response);\n processedResponse = {\n ok: true,\n data,\n };\n } catch {\n // Fallback to the original response\n processedResponse = {\n ok: true,\n data: response,\n };\n }\n } else {\n processedResponse = {\n ok: false,\n };\n }\n\n return {\n id,\n functionName: func.name,\n processedArguments,\n processedResponse,\n args: func.arguments,\n response,\n };\n }\n );\n }, [toolCalls]);\n\n const processStatus = useMemo(() => {\n let status: ProcessStatus = \"ok\";\n for (const toolCall of processedToolCalls) {\n if (toolCall.processedResponse === undefined) {\n status = \"processing\";\n break;\n }\n if (toolCall.processedResponse.ok === false) {\n status = \"failed\";\n }\n }\n return status;\n }, [processedToolCalls]);\n\n return (\n <div className=\"tool-calls\">\n {expanded ? (\n <>\n <div className=\"tool-calls-summary\">\n <WrappedButton type=\"ghost\" onClick={() => setExpanded(false)}>\n <span style={{ marginRight: 8 }}>隐藏工具调用过程</span>\n <WrappedIcon\n lib=\"fa\"\n prefix=\"fas\"\n icon=\"chevron-up\"\n className=\"tool-calls-summary-toggle\"\n />\n </WrappedButton>\n </div>\n {processedToolCalls.map((toolCall) => (\n <ToolCallComponent\n id={toolCall.id}\n key={toolCall.id}\n functionName={toolCall.functionName}\n processedArguments={toolCall.processedArguments}\n processedResponse={toolCall.processedResponse}\n args={toolCall.args}\n />\n ))}\n </>\n ) : (\n <div className=\"tool-calls-summary\" onClick={() => setExpanded(true)}>\n <span className={classNames(\"tool-calls-status\", processStatus)}>\n {processStatus === \"processing\" ? (\n <WrappedIcon lib=\"fa\" prefix=\"fas\" icon=\"spinner\" spinning />\n ) : processStatus === \"ok\" ? (\n <WrappedIcon lib=\"fa\" prefix=\"far\" icon=\"circle-check\" />\n ) : (\n <WrappedIcon lib=\"fa\" prefix=\"fas\" icon=\"triangle-exclamation\" />\n )}\n <span>\n {processStatus === \"processing\"\n ? \"工具调用中\"\n : processStatus === \"ok\"\n ? \"工具调用完成\"\n : \"工具调用失败\"}\n </span>\n </span>\n <WrappedIcon\n lib=\"fa\"\n prefix=\"fas\"\n icon=\"chevron-down\"\n className=\"tool-calls-summary-toggle\"\n />\n </div>\n )}\n </div>\n );\n}\n\ninterface ToolCallProps {\n id: string;\n functionName: string;\n processedArguments: ProcessedValue;\n processedResponse?: ProcessedValue;\n args: string;\n response?: string;\n}\n\nfunction ToolCallComponent({\n functionName,\n processedArguments,\n processedResponse,\n args,\n}: ToolCallProps) {\n const { toolNames } = useChatViewContext();\n\n return (\n <div className=\"tool-call\">\n <div className=\"tool-call-function-name\">\n <WrappedIcon lib=\"antd\" theme=\"outlined\" icon=\"function\" />\n {toolNames.get(functionName) ?? functionName}\n </div>\n <WrappedTag outline>Arguments</WrappedTag>\n <div\n className={classNames(\"tool-call-function-arguments\", {\n failed: !processedArguments.ok,\n })}\n >\n <pre>\n <code>\n {processedArguments.ok ? dumpYaml(processedArguments.data) : args}\n </code>\n </pre>\n </div>\n {processedResponse ? (\n <>\n <WrappedTag outline>Response</WrappedTag>\n <div\n className={classNames(\"tool-call-function-response\", {\n failed: !processedResponse.ok,\n })}\n >\n <pre>\n <code>\n {processedResponse.ok\n ? dumpYaml(processedResponse.data)\n : \"Failed\"}\n </code>\n </pre>\n </div>\n </>\n ) : (\n <div className=\"tool-call-wait-response\">…</div>\n )}\n </div>\n );\n}\n\nfunction dumpYaml(value: unknown) {\n return safeDump(value, {\n schema: JSON_SCHEMA,\n skipInvalid: true,\n noRefs: true,\n noCompatMode: true,\n });\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport {\n MessageItem,\n MessageItemContent,\n useChatViewContext,\n} from \"../../ChatViewContext.js\";\nimport { GuideItem } from \"./GuideItem.js\";\nimport { MarkdownItem } from \"./Markdown/index.js\";\nimport { TableItem } from \"./TableItem.js\";\nimport { ChatItemLoading } from \"../Loading.js\";\nimport { TextItem } from \"./TextItem.js\";\nimport { Toolbar } from \"./Toolbar.js\";\nimport { Time } from \"./Time.js\";\n// import { ContentTip } from \"./ContentTip.js\";\nimport { MsgItemContext } from \"./MsgItemContext.js\";\nimport {\n DEFAULT_TYPE,\n RELATED_QUESTIONS_TYPE,\n} from \"../../hooks/useChatViewInfo.js\";\nimport { ToolCalls } from \"./ToolCalls.js\";\n\nconst NOT_AGENT_MATCH = \"no_agent\";\n\nexport function MessageNode(props: MessageItem): React.ReactNode {\n const {\n content,\n created,\n role,\n agentId,\n type: itemType,\n chatting,\n toolCalls,\n } = props;\n const isUser = useMemo(() => role === \"user\", [role]);\n const { quickAnswerConfig, showToolCalls } = useChatViewContext();\n\n const getContentNode = useCallback((content: MessageItemContent) => {\n const { type, text, examplePrompts } = content;\n switch (type) {\n case \"guide\":\n return <GuideItem text={text} prompts={examplePrompts} />;\n case \"text\":\n return <TextItem text={text} />;\n case \"table\":\n return <TableItem text={text} />;\n case \"load\":\n return <ChatItemLoading />;\n case \"markdown\":\n default:\n return <MarkdownItem text={text} />;\n }\n }, []);\n\n const messageNode = useMemo(\n () => getContentNode(content),\n [content, getContentNode]\n );\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const matchAgent = useMemo(() => {\n return agentList.find((item) => item.id === agentId);\n }, [agentList, agentId]);\n\n const getMsgNode = useCallback(() => {\n switch (itemType) {\n case RELATED_QUESTIONS_TYPE:\n return (\n <>\n <div className=\"message-top\">\n <div style={{ color: \"gray\" }}>推荐提问</div>\n </div>\n <div className=\"message-content\">\n <div className=\"wrapper\">\n {chatting ? (\n <div className=\"content\">\n <ChatItemLoading />\n </div>\n ) : (\n <>{messageNode}</>\n )}\n </div>\n </div>\n </>\n );\n case DEFAULT_TYPE:\n default:\n return (\n <>\n <div className=\"message-top\">\n {isUser\n ? \"我\"\n : !agentId || agentId === NOT_AGENT_MATCH || !matchAgent\n ? \"AI助手\"\n : matchAgent.name}\n <Time time={created} />\n </div>\n <div className=\"message-content\">\n <div className=\"wrapper\">\n {showToolCalls && toolCalls?.length ? (\n <ToolCalls toolCalls={toolCalls} />\n ) : null}\n <div className=\"content\">{messageNode}</div>\n <Toolbar {...props} />\n </div>\n </div>\n </>\n );\n }\n }, [\n itemType,\n isUser,\n agentId,\n matchAgent,\n created,\n chatting,\n messageNode,\n props,\n showToolCalls,\n toolCalls,\n ]);\n\n return (\n <MsgItemContext.Provider value={props}>\n <div className=\"message-box\">{getMsgNode()}</div>\n </MsgItemContext.Provider>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChatViewContext } from \"../../ChatViewContext\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport interface AgentDetailItem {\n name: string;\n description: string;\n icon: GeneralIconProps & { color: string };\n starterPrompts?: string[];\n instanceId: string;\n id: string;\n [key: string]: any;\n}\n\nconst CARD_ITEM_HEIGHT = 85;\nconst HEIGHT_GAP = 24;\n\nfunction QuickAnswerCardItem({\n name,\n description,\n icon,\n starterPrompts,\n}: AgentDetailItem) {\n const { setSearchStr } = useChatViewContext();\n\n const handleCardClick = () => {\n starterPrompts?.length && setSearchStr(starterPrompts[0]);\n };\n\n const iconColor = useMemo(() => icon?.color ?? \"geekblue\", [icon]);\n\n return (\n <div\n className=\"quick-answer-card-item\"\n style={{\n height: CARD_ITEM_HEIGHT,\n background: `linear-gradient(rgba(var(--theme-${iconColor}-color-rgb-channel), 0.1), rgba(var(--theme-${iconColor}-color-rgb-channel), 0.08))`,\n }}\n onClick={handleCardClick}\n >\n <div className=\"left\">\n <WrappedIcon\n className=\"icon\"\n {...(icon ?? {\n icon: \"default-app\",\n lib: \"easyops\",\n category: \"app\",\n })}\n style={{\n background: `rgba(var(--theme-${iconColor}-color-rgb-channel), 0.5)`,\n }}\n />\n </div>\n <div className=\"content\">\n <div className=\"title\">{name}</div>\n <div className=\"description\">{description}</div>\n </div>\n </div>\n );\n}\n\nexport function QuickAnswerList() {\n const { quickAnswerConfig, msgList, loading } = useChatViewContext();\n const [showMoreBtn, setShowMoreBtn] = useState<boolean>(false);\n const listRef = useRef<HTMLDivElement>(null);\n const hadClickShowMoreBtn = useRef<boolean>(false);\n\n const handleShowMoreClick = () => {\n hadClickShowMoreBtn.current = true;\n setShowMoreBtn(false);\n };\n\n useEffect(() => {\n const element = listRef.current;\n if (element) {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (\n entry.contentRect.height >\n CARD_ITEM_HEIGHT * 3 + HEIGHT_GAP * 2\n ) {\n if (!hadClickShowMoreBtn.current) {\n setShowMoreBtn(true);\n }\n } else {\n setShowMoreBtn(false);\n }\n }\n });\n observer.observe(element);\n return () => observer.disconnect();\n }\n }, [showMoreBtn, quickAnswerConfig?.list]);\n\n return quickAnswerConfig?.list.length && msgList.length === 0 && !loading ? (\n <div className=\"quick-answer-wrapper\">\n <div className=\"tip\">\n {quickAnswerConfig.tip ??\n \"你好,我是运维数智人 — Murphy,我能为你提供以下服务:\"}\n </div>\n <div\n className=\"quick-answer-list\"\n style={{\n ...(showMoreBtn\n ? {\n maxHeight: CARD_ITEM_HEIGHT * 3 + HEIGHT_GAP * 2 + 10,\n overflow: \"hidden\",\n }\n : {}),\n }}\n ref={listRef}\n >\n {quickAnswerConfig.list.map((item) => (\n <QuickAnswerCardItem key={item.instanceId} {...item} />\n ))}\n </div>\n {showMoreBtn ? (\n <div className=\"show-more-wrapper\">\n <WrappedLink\n icon={{\n lib: \"antd\",\n icon: \"down\",\n }}\n className=\"show-more-btn\"\n onClick={handleShowMoreClick}\n >\n 显示更多\n </WrappedLink>\n </div>\n ) : null}\n </div>\n ) : null;\n}\n","import React from \"react\";\nimport { useChatViewContext } from \"../ChatViewContext\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { Link, LinkProps } from \"@next-bricks/basic/link\";\n\nconst WrappedLink = wrapBrick<Link, LinkProps>(\"eo-link\");\n\nexport function StopBtn() {\n const { stopChat } = useChatViewContext();\n\n const handleStopChat = () => {\n stopChat();\n };\n return (\n <div className=\"stop-responding-wrapper\">\n <WrappedLink className=\"stop-btn\" onClick={handleStopChat}>\n 停止生成\n </WrappedLink>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport ResizeObserver from \"resize-observer-polyfill\";\nimport { MessageItem, useChatViewContext } from \"../ChatViewContext\";\nimport { Avatar } from \"./MessageItem/Avatar.js\";\nimport classNames from \"classnames\";\nimport { CommonLoading, MessageListLoading } from \"./Loading.js\";\nimport { MessageNode } from \"./MessageItem/index.js\";\nimport { QuickAnswerList } from \"./QuickAnswerList/index.js\";\nimport { StopBtn } from \"./StopBtn.js\";\nimport { DEFAULT_TYPE, RELATED_QUESTIONS_TYPE } from \"../hooks/useChatViewInfo\";\n\ninterface MessageListProps {\n showAvatar?: boolean;\n}\n\nexport function MessageList({\n showAvatar = true,\n}: MessageListProps): React.ReactNode {\n const chatViewRef = useRef<HTMLDivElement>(null);\n const messageListRef = useRef<HTMLDivElement>(null);\n\n const { msgLoading, msgEnd, msgList, loading, chatting } =\n useChatViewContext();\n\n const getMsgItemNode = useCallback(\n (item: MessageItem, index: number = 0) => {\n switch (item.type) {\n case RELATED_QUESTIONS_TYPE:\n return (\n <div\n className={classNames(\"message-item\")}\n style={{ marginTop: \"-36px\", marginLeft: \"44px\" }}\n key={index}\n >\n <MessageNode {...item} />\n </div>\n );\n case DEFAULT_TYPE:\n default:\n return (\n <div\n className={classNames(\"message-item\", {\n user: item.role === \"user\",\n })}\n key={index}\n >\n {showAvatar && <Avatar role={item.role} agentId={item.agentId} />}\n <MessageNode {...item} />\n </div>\n );\n }\n },\n [showAvatar]\n );\n\n const msgListNode = useMemo(() => {\n return msgList.map((item, index) => {\n return (\n <React.Fragment key={item.key}>\n {item.chatting ? (\n <>\n {getMsgItemNode(item, index)}\n {chatting &&\n index === msgList.length - 1 &&\n item.type !== RELATED_QUESTIONS_TYPE ? (\n <StopBtn />\n ) : null}\n </>\n ) : (\n getMsgItemNode(item, index)\n )}\n </React.Fragment>\n );\n });\n }, [msgList, chatting, getMsgItemNode]);\n\n const [manualScrolled, setManualScrolled] = useState(false);\n const autoScrollingRef = useRef(false);\n\n useEffect(() => {\n const chatView = chatViewRef.current;\n if (!chatView) {\n return;\n }\n const handleScroll = () => {\n if (!autoScrollingRef.current) {\n // Make a small buffer of 6px\n setManualScrolled(\n chatView.scrollTop + chatView.clientHeight! + 6 <\n chatView.scrollHeight\n );\n }\n };\n chatView.addEventListener(\"scroll\", handleScroll);\n return () => {\n chatView.removeEventListener(\"scroll\", handleScroll);\n };\n }, []);\n\n useEffect(() => {\n const element = messageListRef.current;\n const chatView = chatViewRef.current;\n if (manualScrolled || !element || !chatView) {\n // Do not auto-scroll if manual scroll detected\n return;\n }\n const observer = new ResizeObserver(() => {\n autoScrollingRef.current = true;\n chatView.scroll({ top: chatView.scrollHeight });\n requestAnimationFrame(() => {\n autoScrollingRef.current = false;\n });\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [manualScrolled]);\n\n return (\n <div className=\"chat-view\" ref={chatViewRef}>\n <div className=\"message-list\" ref={messageListRef}>\n <div className=\"message-list-box\">\n {msgEnd && msgList.length ? (\n <div className=\"message-start-tip\">会话开始</div>\n ) : null}\n {msgLoading && <CommonLoading />}\n <QuickAnswerList />\n {msgListNode}\n </div>\n {loading && <MessageListLoading />}\n </div>\n </div>\n );\n}\n","const HIDDEN_TEXTAREA_STYLE = `\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n padding: 10px !important;\n pointer-events: none !important;\n`;\n\nconst SIZING_STYLE = [\n \"letter-spacing\",\n \"line-height\",\n \"padding-top\",\n \"padding-bottom\",\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"font-variant\",\n \"text-rendering\",\n \"text-transform\",\n \"width\",\n \"text-indent\",\n \"padding-left\",\n \"padding-right\",\n \"border-width\",\n \"box-sizing\",\n \"word-break\",\n \"white-space\",\n];\nlet hiddenTextarea: HTMLTextAreaElement;\n\n/**\n * 计算 textare 高度\n * https://github.com/react-component/textarea/blob/1c0026fbe30e5f7dff1fca695b2cf262246381ca/src/calculateNodeHeight.tsx\n * */\nexport default function calculateAutoSizeStyle(\n uiTextNode: HTMLTextAreaElement,\n minRows: number | null = null,\n maxRows: number | null = null\n): React.CSSProperties {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement(\"textarea\");\n hiddenTextarea.setAttribute(\"tab-index\", \"-1\");\n hiddenTextarea.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(hiddenTextarea);\n }\n\n const uiTextNodeStyle = window.getComputedStyle(uiTextNode);\n const sizingStyle = SIZING_STYLE.map(\n (name) => `${name}:${uiTextNodeStyle.getPropertyValue(name)}`\n ).join(\";\");\n\n // equal style\n hiddenTextarea.setAttribute(\n \"style\",\n `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`\n );\n hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || \"\";\n\n let minHeight: number | undefined = undefined;\n let maxHeight: number | undefined = undefined;\n // let overflowY: any;\n\n const borderSize = 2;\n const paddingSize = 20;\n let height = hiddenTextarea.scrollHeight - paddingSize + borderSize;\n\n if (minRows !== null || maxRows !== null) {\n // measure height of a textarea with a single row\n hiddenTextarea.value = \" \";\n const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\n if (minRows !== null) {\n minHeight = singleRowHeight * minRows - paddingSize + borderSize;\n height = Math.max(paddingSize, height);\n }\n if (maxRows !== null) {\n maxHeight = singleRowHeight * maxRows - paddingSize + borderSize;\n // overflowY = height > maxHeight ? \"\" : \"hidden\";\n height = Math.min(maxHeight, height);\n }\n }\n\n const style: React.CSSProperties = {\n height,\n overflowY: \"scroll\",\n resize: \"none\",\n };\n\n if (minHeight) {\n style.minHeight = minHeight;\n }\n if (maxHeight) {\n style.maxHeight = maxHeight;\n }\n\n return style;\n}\n","import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport calculateAutoSizeStyle from \"./utils/calculateAutoSizeStyle.js\";\nimport classNames from \"classnames\";\nimport { snippet, useChatViewContext } from \"../ChatViewContext.js\";\nimport { AgentDetailItem } from \"./QuickAnswerList/index\";\nimport { ChatBody } from \"../ChatService.js\";\nimport { ReactUseMultipleBricks } from \"@next-core/react-runtime\";\n\nexport interface SearchInputRef {\n handleInsertQuestion: (value: string) => void;\n sendMsg: (msg: string | ChatBody) => void;\n}\n\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst PREFIX_WORD = \"@\";\n\nexport function LegacySearchInput(\n props: any,\n ref: React.Ref<SearchInputRef>\n): React.ReactNode {\n const [value, setValue] = useState<string>(\"\");\n const [active, setActive] = useState<boolean>(false);\n const [expand, setExpand] = useState<boolean>(false);\n const [autoSizeStyle, setAutoSizeStyle] = useState<React.CSSProperties>();\n const [isFillContent, setIsFillContent] = useState<boolean>(false);\n\n // snippets\n const [snippetOpen, setSnippetOpen] = useState<boolean>(false);\n const [matchSnippetList, setMatchSnippetList] = useState<snippet[]>([]);\n const [matchSnippetIndex, setMatchSnippetIndex] = useState<number>(0);\n\n // mention\n const [mentionOpen, setMentionOpen] = useState<boolean>(false);\n const [matchPrefixIndex, setMatchPrefixIndex] = useState<number>(-1);\n const [matchAgentList, setMatchMentionList] = useState<AgentDetailItem[]>([]);\n const [matchMentionsIndex, setMatchMentionsIndex] = useState<number>(0);\n\n const mentionsRef = useRef<HTMLDivElement>(null);\n const snippetsRef = useRef<HTMLDivElement>(null);\n const searchInputBoxRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const hadExpanded = useRef<boolean>(false);\n const inputEndRef = useRef<boolean>(false);\n\n const {\n chatting,\n loading,\n searchStr,\n quickAnswerConfig,\n createSession,\n setSearchStr,\n handleChat,\n setAgent,\n snippetList,\n } = useChatViewContext();\n\n const agentList = useMemo(\n () => quickAnswerConfig?.list ?? [],\n [quickAnswerConfig]\n );\n\n const hadValue = useMemo(() => !!value, [value]);\n const defaultSize = useMemo(() => [1, 5], []);\n const disabled = useMemo(() => loading || chatting, [chatting, loading]);\n\n const matchPrefixInfo = useMemo(() => {\n const textareaElement = textareaRef.current!;\n if (matchPrefixIndex >= 0 && value) {\n const currentFocusIndex = textareaElement.selectionStart;\n let matchWord = \"\";\n for (let i = matchPrefixIndex + 1; i < currentFocusIndex; i++) {\n // 匹配中文英文数字\n if (/[\\u4e00-\\u9fa5]|\\w|\\d/.test(value[i]) || inputEndRef.current) {\n matchWord = matchWord + value[i];\n } else {\n setMatchPrefixIndex(-1);\n return false;\n }\n }\n return {\n start: matchPrefixIndex + 1,\n end: currentFocusIndex,\n word: matchWord,\n };\n }\n return false;\n }, [matchPrefixIndex, value]);\n\n const handleAgentItemSelect = useCallback(\n (item: AgentDetailItem) => {\n if (matchPrefixInfo) {\n const { start, end } = matchPrefixInfo;\n const valueList = value.split(\"\");\n const trimName = item.name.replace(/\\s+/g, \"\") + \" \";\n const focusIndex = start + trimName.length;\n valueList.splice(start, end - start, trimName);\n setValue(valueList.join(\"\"));\n setMatchPrefixIndex(-1);\n\n setTimeout(() => {\n textareaRef.current!.selectionStart = focusIndex;\n textareaRef.current!.selectionEnd = focusIndex;\n textareaRef.current!.focus();\n }, 0);\n }\n },\n [matchPrefixInfo, value]\n );\n\n const handleSnippetItemSelect = useCallback(\n (item: snippet) => {\n const regex = /@([\\u4e00-\\u9fa5|\\w|\\d]+)/g;\n const matches = [];\n let match;\n // 在字符串中循环匹配正则表达式,将匹配的@技能放入数组中\n while ((match = regex.exec(value)) !== null) {\n matches.push(match[0]);\n }\n if (matches.length) {\n setValue(matches.join(\" \") + \" \" + item.content);\n } else {\n setValue(item.content);\n }\n setSnippetOpen(false);\n setMatchSnippetIndex(0);\n setTimeout(() => {\n textareaRef.current!.focus();\n }, 0);\n },\n [value]\n );\n\n const isShowMentions = useMemo(() => {\n return matchAgentList.length && mentionOpen;\n }, [matchAgentList, mentionOpen]);\n\n const mentions = useMemo(() => {\n return isShowMentions ? (\n <div className=\"mentions-list-wrapper\" ref={mentionsRef}>\n <div className=\"content\">\n <div className=\"mentions-title\">技能</div>\n <div className=\"mentions-list\">\n {matchAgentList.slice(0, 10).map((item, index) => {\n return (\n <div\n className={classNames(\"mentions-item\", {\n active: index === matchMentionsIndex,\n })}\n key={index}\n onClick={() => handleAgentItemSelect(item)}\n >\n <WrappedIcon\n className=\"icon\"\n {...item.icon}\n style={{\n color: `var(--theme-${item.icon.color}-color)`,\n background: `var(--theme-${item.icon.color}-background)`,\n }}\n />\n <div className=\"name\">{item.name}</div>\n <div className=\"description\">{item.description}</div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n ) : null;\n }, [\n matchAgentList,\n matchMentionsIndex,\n isShowMentions,\n handleAgentItemSelect,\n ]);\n\n const isShowSnippets = useMemo(() => {\n return !isShowMentions && matchSnippetList.length && snippetOpen;\n }, [isShowMentions, matchSnippetList, snippetOpen]);\n\n const snippets = useMemo(() => {\n return isShowSnippets ? (\n <div className=\"snippets-list-wrapper\" ref={snippetsRef}>\n <div className=\"content\">\n <div className=\"snippets-title\">常用语</div>\n <div className=\"snippets-list\">\n {matchSnippetList.slice(0, 10).map((item, index) => {\n return (\n <div\n className={classNames(\"snippets-item\", {\n active: index === matchSnippetIndex,\n })}\n key={index}\n onClick={() => handleSnippetItemSelect(item)}\n >\n <div className=\"name\">{item.name}</div>\n <div className=\"description\">{item.content}</div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n ) : null;\n }, [\n matchSnippetList,\n matchSnippetIndex,\n isShowSnippets,\n handleSnippetItemSelect,\n ]);\n\n const computedAutoSize = useCallback(\n (size = defaultSize) => {\n if (hadExpanded.current && expand) return;\n const textareaElement = textareaRef.current as HTMLTextAreaElement;\n if (textareaElement) {\n const textareaStyles = calculateAutoSizeStyle(\n textareaElement,\n size[0],\n size[1]\n );\n\n setAutoSizeStyle(textareaStyles);\n }\n hadExpanded.current = expand;\n },\n [defaultSize, expand]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement> | string): void => {\n const value = typeof e === \"string\" ? e : e.target.value;\n setValue(value);\n textareaRef.current!.value = value;\n\n // 获取snippet关键词\n const keyword = value\n .replaceAll(/@([\\u4e00-\\u9fa5|\\w|\\d]+)\\s/g, \"\")\n .trim();\n\n // 过滤出matchSnippetList\n if (keyword) {\n const filterResult =\n snippetList?.filter((item) => item.name.includes(keyword)) ?? [];\n setMatchSnippetList(filterResult);\n setSnippetOpen(!!filterResult.length);\n } else {\n setMatchSnippetList([]);\n setSnippetOpen(false);\n }\n },\n [snippetList]\n );\n\n const handleCompositionStart = () => {\n inputEndRef.current = true;\n };\n\n const handleCompositionEnd = () => {\n inputEndRef.current = false;\n };\n\n const hanldeCreateSession = () => {\n createSession();\n };\n\n const handleExpand = useCallback(() => {\n setExpand((value) => {\n return !value;\n });\n }, []);\n\n const matchFirstAgent = useCallback(\n (value: string) => {\n const regex = /@([\\u4e00-\\u9fa5|\\w|\\d]+)/g;\n\n // 在字符串中循环匹配正则表达式\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n if (match) {\n const agent = agentList?.find(\n (item) => item.name.replace(/\\s+/g, \"\") === match![1]\n );\n agent && setAgent(agent.id);\n if (agent) break;\n }\n }\n },\n [agentList, setAgent]\n );\n\n const handleDispatchQuestion = useCallback(\n (val: string) => {\n matchFirstAgent(val);\n handleChat(val);\n\n setActive(false);\n setExpand(false);\n handleChange(\"\");\n textareaRef.current?.blur();\n },\n [handleChat, handleChange, matchFirstAgent]\n );\n\n const handleSubmit = useCallback(() => {\n if (!hadValue || !textareaRef.current || disabled) return;\n handleDispatchQuestion(value);\n }, [value, hadValue, disabled, handleDispatchQuestion]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // 默认情况下,按下 Enter 键会触发提交,按 Shift + Enter 换行;\n // 当显示 mentions 或 snippets 时,按 Enter 键选中对应项;\n // 当输入框展开放大时(且没有 mentions 或 snippets),恢复 Enter 键换行,需要按发送按钮进行提交。\n if (\n e.key === \"Enter\" &&\n (!expand || isShowMentions || isShowSnippets) &&\n !e.shiftKey &&\n !inputEndRef.current\n ) {\n e.preventDefault();\n if (isShowMentions) {\n handleAgentItemSelect(matchAgentList[matchMentionsIndex]);\n } else if (isShowSnippets) {\n handleSnippetItemSelect(matchSnippetList[matchSnippetIndex]);\n } else {\n handleSubmit();\n }\n }\n if (isShowMentions) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setMatchMentionsIndex((index) => Math.max(0, index - 1));\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setMatchMentionsIndex((index) =>\n Math.min(matchAgentList.length - 1, index + 1)\n );\n }\n } else if (isShowSnippets) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setMatchSnippetIndex((index) => Math.max(0, index - 1));\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setMatchSnippetIndex((index) =>\n Math.min(matchSnippetList.length - 1, index + 1)\n );\n }\n }\n },\n [\n handleSubmit,\n handleAgentItemSelect,\n handleSnippetItemSelect,\n isShowMentions,\n matchAgentList,\n matchMentionsIndex,\n isShowSnippets,\n matchSnippetList,\n matchSnippetIndex,\n expand,\n ]\n );\n\n const handleKeyUp = useCallback(\n (e: React.KeyboardEvent) => {\n const textareaElement = textareaRef.current!;\n\n const selectionIndex = textareaElement.selectionStart;\n const prefixWord = textareaElement.value[selectionIndex - 1];\n const beforeSelectionText = textareaElement.value.slice(\n 0,\n selectionIndex\n );\n const index = beforeSelectionText.lastIndexOf(PREFIX_WORD);\n\n if (\n e.key === \"Escape\" ||\n (!isShowMentions &&\n [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].indexOf(e.key) !==\n -1)\n ) {\n setMatchPrefixIndex(-1);\n return;\n }\n\n if (prefixWord === PREFIX_WORD) {\n setMatchPrefixIndex(selectionIndex - 1);\n } else {\n setMatchPrefixIndex(index);\n }\n },\n [isShowMentions]\n );\n\n useEffect(() => {\n if (searchStr) {\n handleChange(searchStr.trim());\n textareaRef.current?.focus();\n setSearchStr(\"\");\n }\n }, [searchStr, disabled, setSearchStr, handleChange]);\n\n useEffect(() => {\n computedAutoSize(expand ? [20, 20] : undefined);\n }, [value, expand, computedAutoSize]);\n\n useEffect(() => {\n const searchInputBox = searchInputBoxRef.current;\n if (searchInputBox) {\n const observe = new ResizeObserver(() => {\n const { width: currentWidth } = searchInputBox.getBoundingClientRect();\n const FIT_CONTENT_WIDTH = 900;\n\n setIsFillContent(currentWidth < FIT_CONTENT_WIDTH);\n });\n\n observe.observe(searchInputBox);\n\n return () => {\n observe.disconnect();\n };\n }\n }, []);\n\n useEffect(() => {\n if (!chatting && textareaRef.current) {\n textareaRef.current?.focus();\n }\n }, [chatting]);\n\n useEffect(() => {\n if (agentList?.length && matchPrefixInfo) {\n const filterList =\n matchPrefixInfo.word === \"\"\n ? agentList\n : agentList.filter((item) =>\n item.name.includes(matchPrefixInfo.word)\n );\n\n setMatchMentionList(filterList);\n setMatchMentionsIndex(0);\n setMentionOpen(true);\n } else {\n setMatchMentionList([]);\n setMentionOpen(false);\n }\n }, [matchPrefixInfo, agentList]);\n\n useEffect(() => {\n if (matchMentionsIndex >= 0 && mentionsRef.current) {\n const element = mentionsRef.current.querySelector(\n \".mentions-item.active\"\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }\n }, [matchMentionsIndex]);\n\n useEffect(() => {\n if (matchSnippetIndex >= 0 && snippetsRef.current) {\n const element = snippetsRef.current.querySelector(\n \".snippets-item.active\"\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }\n }, [matchSnippetIndex]);\n\n useEffect(() => {\n const handleDocumentClick = (e: any) => {\n const mentionsElemnt = mentionsRef.current;\n if (mentionsElemnt && !mentionsElemnt.contains(e.composedPath()[0])) {\n setMentionOpen(false);\n }\n };\n\n document.addEventListener(\"click\", handleDocumentClick);\n\n return () => {\n document.removeEventListener(\"click\", handleDocumentClick);\n };\n }, []);\n\n useImperativeHandle(ref, () => ({\n handleInsertQuestion: (value: string) => {\n handleDispatchQuestion(value);\n },\n sendMsg: (msg: string | ChatBody) => {\n handleChat(msg);\n },\n }));\n\n return (\n <div\n className={classNames(\"search-input-box\", {\n \"fill-content\": isFillContent,\n })}\n ref={searchInputBoxRef}\n >\n {mentions}\n {snippets}\n {props.inputToolbarBrick && (\n <div className=\"input-toolbar\">\n <ReactUseMultipleBricks {...props.inputToolbarBrick} />\n </div>\n )}\n <div\n className={classNames(\"input-box\", {\n active,\n disabled,\n expand,\n })}\n >\n <textarea\n value={value}\n ref={textareaRef}\n style={{\n ...autoSizeStyle,\n paddingRight: expand ? \"50px\" : \"140px\",\n }}\n placeholder={chatting ? \"回复中,请稍等...\" : \"提出你的想法...\"}\n onFocus={() => setActive(true)}\n onBlur={() => setActive(false)}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onKeyUpCapture={handleKeyUp}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n />\n <span className=\"suffix-icon\">\n <WrappedToolTip content=\"新增会话\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"plus-circle\"\n onClick={hanldeCreateSession}\n />\n </WrappedToolTip>\n {!expand && (\n <WrappedToolTip content=\"放大\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"arrows-alt\"\n onClick={handleExpand}\n />\n </WrappedToolTip>\n )}\n <div className=\"submit-split\"></div>\n <WrappedToolTip content=\"提交\">\n <WrappedIcon\n className={classNames(\"submit-btn\", {\n active: hadValue,\n disabled: !hadValue || disabled,\n })}\n lib={chatting ? \"antd\" : \"easyops\"}\n icon={chatting ? \"loading\" : \"release-management-fill\"}\n category={chatting ? \"\" : \"menu\"}\n spinning={chatting}\n onClick={handleSubmit}\n />\n </WrappedToolTip>\n </span>\n <span className=\"toolbar-icon\">\n {expand && (\n <WrappedToolTip content=\"缩小\">\n <WrappedIcon lib=\"antd\" icon=\"shrink\" onClick={handleExpand} />\n </WrappedToolTip>\n )}\n </span>\n </div>\n {hadValue && (\n <div className=\"search-input-toolbar\">\n <div className=\"input-tip\">Shift + Enter 换行</div>\n </div>\n )}\n </div>\n );\n}\n\nexport const SearchInput = forwardRef(LegacySearchInput);\n","import React, { useCallback, useEffect, useRef } from \"react\";\nimport { useChatViewContext } from \"../ChatViewContext\";\nimport classNames from \"classnames\";\nimport { debounce } from \"lodash\";\nimport { SessionItem as SessionItemProps } from \"../ChatService\";\nimport { CommonLoading } from \"./Loading.js\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport { unwrapProvider } from \"@next-core/utils/general\";\nimport type { showDialog as _showDialog } from \"@next-bricks/basic/data-providers/show-dialog/show-dialog\";\nimport type { showNotification as _showNotification } from \"@next-bricks/basic/data-providers/show-notification/show-notification\";\nimport { EoTooltip, ToolTipProps } from \"@next-bricks/basic/tooltip\";\nimport type {\n Modal,\n ModalProps,\n ModalEvents,\n ModalMapEvents,\n} from \"@next-bricks/containers/modal\";\nimport type { Input, InputProps } from \"@next-bricks/form/input\";\nimport {\n Form,\n FormEvents,\n FormMapEvents,\n FormProps,\n} from \"@next-bricks/form/form\";\nimport { NEW_SESSION_ID } from \"../hooks/useChatViewInfo\";\n\nconst WrappedToolTip = wrapBrick<EoTooltip, ToolTipProps>(\"eo-tooltip\");\n\nconst showNotification = unwrapProvider<typeof _showNotification>(\n \"basic.show-notification\"\n);\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\nconst showDialog = unwrapProvider<typeof _showDialog>(\"basic.show-dialog\");\n\nconst WrappedModal = wrapBrick<Modal, ModalProps, ModalEvents, ModalMapEvents>(\n \"eo-modal\",\n {\n onClose: \"close\",\n onConfirm: \"confirm\",\n onCancel: \"cancel\",\n onOpen: \"open\",\n }\n);\nconst WrappedForm = wrapBrick<Form, FormProps, FormEvents, FormMapEvents>(\n \"eo-form\",\n {\n onValuesChange: \"values.change\",\n onValidateSuccess: \"validate.success\",\n onValidateError: \"validate.error\",\n }\n);\nconst WrappedInput = wrapBrick<Input, InputProps>(\"eo-input\");\n\nconst SESSION_ITEM_HEIGHT = 42;\nconst BUFFER_NUMBER = 5;\nconst CACHE_HEIGHT = 100;\n\nexport function SessionList(): React.ReactNode {\n const {\n sessionEnd,\n sessionLoading,\n sessionList,\n querySessionHistory,\n updateSession,\n } = useChatViewContext();\n const sessionWrapperRef = useRef<HTMLDivElement>(null);\n const sessionListRef = useRef<HTMLDivElement>(null);\n const searchQueryRef = useRef<string>(\"\");\n const editModalRef = useRef<Modal>(null);\n const editFormRef = useRef<Form>(null);\n const editRawDataRef = useRef<Partial<SessionItemProps>>();\n const editConversationIdRef = useRef<string>(\"\");\n\n const getFitLimit = () => {\n let limit = 20;\n const sessionWrapper = sessionWrapperRef.current;\n if (sessionWrapper) {\n // limit = 视图高度 % 单条高度 + 缓冲长度\n limit =\n Math.floor(sessionWrapper.clientHeight / SESSION_ITEM_HEIGHT) +\n BUFFER_NUMBER;\n }\n return limit;\n };\n\n useEffect(() => {\n querySessionHistory(getFitLimit());\n }, []);\n\n const checkSessionList = useCallback(() => {\n if (sessionLoading || sessionEnd) return;\n const sessionList = sessionListRef.current;\n if (sessionList) {\n const { scrollTop, scrollHeight, clientHeight } = sessionList;\n // 如果滚动的高度 + 视图高度 + 缓冲高度 > 视图的滚动高度,请求新的数据\n if (scrollTop + clientHeight + CACHE_HEIGHT > scrollHeight) {\n querySessionHistory();\n }\n }\n }, [querySessionHistory, sessionLoading, sessionEnd]);\n\n const handleScroll = debounce(checkSessionList, 200);\n\n const handleChange = useCallback((e: any) => {\n searchQueryRef.current = e.target.value;\n }, []);\n\n const handleSearch = useCallback(() => {\n querySessionHistory(getFitLimit(), searchQueryRef.current);\n }, []);\n\n const handleSearchEnter = useCallback((e: any) => {\n if (e.key === \"Enter\") {\n handleSearch();\n }\n }, []);\n\n const handleEditSession = useCallback(\n (conversationId: string, rawData: Partial<SessionItemProps>) => {\n // 从item传上来的已知数据\n editConversationIdRef.current = conversationId;\n editRawDataRef.current = rawData;\n editFormRef.current?.setInitValue({ ...rawData });\n editModalRef.current?.open();\n },\n []\n );\n\n const handleEditModalConfirm = useCallback(() => {\n editFormRef.current?.validate();\n }, []);\n\n const handleEditFormSubmit = useCallback(\n async (e: any) => {\n // 调用接口,更新数据后要关掉modal\n const result = await updateSession(\n editConversationIdRef.current,\n e.detail\n );\n showNotification({\n message: `修改会话${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n if (result) {\n editModalRef.current?.close();\n }\n },\n [editConversationIdRef.current, editModalRef.current]\n );\n\n return (\n <>\n <div className=\"session-list-wrapper\" ref={sessionWrapperRef}>\n <div className=\"session-title\">历史对话</div>\n <div className=\"session-search-input-box\">\n <input\n placeholder={\"输入关键词进行搜索\"}\n onChange={handleChange}\n onKeyUpCapture={handleSearchEnter}\n />\n <span className=\"suffix-icon\">\n <WrappedToolTip content=\"搜索\">\n <WrappedIcon\n lib=\"antd\"\n icon=\"search\"\n theme=\"outlined\"\n onClick={handleSearch}\n />\n </WrappedToolTip>\n </span>\n </div>\n <div\n className=\"session-list\"\n ref={sessionListRef}\n onScroll={handleScroll}\n >\n {sessionList.map((item, index) => {\n return (\n <SessionItem\n key={index}\n {...item}\n handleEditSession={handleEditSession}\n />\n );\n })}\n {sessionLoading && <CommonLoading />}\n {/* {sessionEnd && <div className=\"session-end-tip\">到底啦</div>} */}\n </div>\n </div>\n <WrappedModal\n ref={editModalRef}\n modalTitle={\"编辑会话\"}\n width=\"688px\"\n maskClosable={false}\n closeWhenConfirm={false}\n onConfirm={handleEditModalConfirm}\n >\n <WrappedForm\n layout=\"horizontal\"\n ref={editFormRef}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n onValidateSuccess={handleEditFormSubmit}\n >\n <WrappedInput label=\"标题\" name=\"title\"></WrappedInput>\n </WrappedForm>\n </WrappedModal>\n </>\n );\n}\n\nfunction SessionItem({\n title,\n conversationId,\n handleEditSession,\n}: SessionItemProps) {\n const { activeSessionId, checkSession, deleteSession } = useChatViewContext();\n\n const handleCheckSession = useCallback(() => {\n checkSession(conversationId, true);\n }, [conversationId, checkSession]);\n\n const handleDeleteSession = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n showDialog({\n type: \"confirm\",\n title: \"会话删除确认\",\n content: `请输入 {{ expect }} 以确认删除`,\n expect: title.replace(/\\s+/g, \"\"),\n }).then(async () => {\n const result = await deleteSession([conversationId]);\n showNotification({\n message: `删除会话${result ? \"成功\" : \"失败\"}`,\n type: result ? \"success\" : \"error\",\n });\n });\n },\n [conversationId, deleteSession, title]\n );\n\n const handleEditSessionItem = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n handleEditSession && handleEditSession(conversationId, { title });\n },\n [conversationId, handleEditSession, title]\n );\n\n return (\n <div\n key={title}\n className={classNames(\"session-item\", {\n active: conversationId === activeSessionId,\n })}\n onClick={handleCheckSession}\n >\n <div className=\"content\">\n <div className=\"title\" title={title}>\n {title}\n </div>\n </div>\n {conversationId !== NEW_SESSION_ID && (\n <>\n <div className=\"session-edit-btn\" onClick={handleEditSessionItem}>\n <WrappedIcon icon=\"edit\" lib=\"antd\" />\n </div>\n <div className=\"session-close-btn\" onClick={handleDeleteSession}>\n <WrappedIcon icon=\"close\" lib=\"antd\" />\n </div>\n </>\n )}\n </div>\n );\n}\n","import { fetchEventSource } from \"@microsoft/fetch-event-source\";\nimport { http } from \"@next-core/http\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport moment from \"moment\";\nimport _, { pick } from \"lodash\";\nimport type { ToolCall } from \"./ChatViewContext\";\nimport { isGeneralTextType } from \"./hooks/useChatViewInfo\";\n\nexport interface SSEMessageItem {\n conversationId?: string;\n created: number | string;\n delta: {\n content: string;\n role: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n };\n taskId?: string;\n agentId?: string;\n robotId?: string;\n type?: string;\n error?: string;\n}\n\nexport interface QueueItem {\n topic: string;\n message?: SSEMessageItem;\n}\n\nexport interface SessionItem {\n conversationId: string;\n isDelete: boolean;\n time: number;\n title: string;\n user: string;\n _row_id: string;\n robotId: string;\n handleEditSession?: (\n conversationId: string,\n rawData: Partial<SessionItem>\n ) => void;\n}\n\nexport interface ChatItem {\n agentId: string;\n robotId: string;\n conversationId: string;\n input: string;\n output: string;\n taskId: string;\n time: number;\n inputTime: number;\n user: string;\n _row_id: string;\n tag: {\n isLike?: boolean;\n };\n allToolCalls?: string;\n}\n\nexport interface ChatBody {\n agentId?: string;\n conversationId?: string;\n input: string;\n stream?: boolean;\n config?: Record<string, any>;\n [k: string]: any;\n}\n\nexport class ChatService {\n #debug: boolean;\n #ctrl?: AbortController;\n #agentId: string;\n #robotId: string;\n #enterInterval: number;\n #chatting = false;\n #isStartEmitEvent = false;\n #emitTimer: NodeJS.Timeout | undefined;\n #messageQueue: Array<QueueItem> = [];\n #subscribers: Record<string, Array<(msg?: SSEMessageItem) => void>> = {};\n #conversationId?: string;\n #answerLanguage?: string | undefined;\n\n // 会话\n #sessionNextToken?: string;\n #cacheLimit?: number;\n #cacheQuery?: string;\n\n // 消息\n #messageNextToken?: string;\n\n #useSpiltWord = false;\n\n constructor({\n agentId,\n robotId,\n enterInterval = 50,\n debug = false,\n answerLanguage,\n useSpiltWord,\n }: {\n agentId: string;\n robotId: string;\n enterInterval: number;\n debug: boolean;\n answerLanguage?: string;\n useSpiltWord?: boolean;\n }) {\n this.#agentId = agentId;\n this.#robotId = robotId;\n this.#enterInterval = enterInterval;\n this.#debug = debug;\n this.#useSpiltWord = useSpiltWord ?? false;\n this.#answerLanguage = answerLanguage;\n }\n\n enqueue(data: QueueItem) {\n this.#messageQueue.push(data);\n this.#startEmitEvent();\n }\n\n dequeue() {\n return this.#messageQueue.shift();\n }\n\n #clear() {\n this.#messageQueue.length = 0;\n }\n\n getMessageQueue() {\n return this.#messageQueue;\n }\n\n subscribe(topic: string, callback: (msg?: SSEMessageItem) => void) {\n if (!this.#subscribers[topic]) {\n this.#subscribers[topic] = [];\n }\n this.#subscribers[topic].push(callback);\n }\n\n unsubscribe(topic: string, callback: (msg?: SSEMessageItem) => void) {\n if (this.#subscribers[topic]) {\n this.#subscribers[topic] = this.#subscribers[topic].filter(\n (cb) => cb !== callback\n );\n }\n }\n\n notifySubscribers(data: QueueItem) {\n const topic = data.topic;\n if (this.#subscribers[topic]) {\n this.#subscribers[topic].forEach((callback) => {\n callback(data?.message);\n });\n }\n }\n\n async setChatItemIsLike(id: string, isLike: boolean): Promise<boolean> {\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.CommentDialogue/conversation/comment`,\n {\n method: \"POST\",\n body: JSON.stringify({\n taskId: id,\n isLike,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n setAgentId(id: string) {\n this.#agentId = id;\n }\n\n setConversationId(id?: string) {\n this.#conversationId = id;\n }\n\n async getSessionHistory(\n limit?: number,\n query?: string\n ): Promise<SessionItem[]> {\n if (limit) {\n this.#cacheLimit = limit;\n }\n if (!_.isNil(query)) {\n if (this.#cacheQuery !== query) {\n // 说明进行了搜索,需要重置token\n this.#sessionNextToken = undefined;\n }\n this.#cacheQuery = query;\n }\n try {\n const {\n data: { conversations, next_token },\n } = await http.request<{\n data: {\n conversations: SessionItem[];\n next_token: string;\n previous_token: string;\n };\n }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.ListConversation/conversation/list`,\n {\n method: \"POST\",\n body: JSON.stringify({\n limit: this.#cacheLimit ?? 20,\n query: this.#cacheQuery,\n next_token: this.#sessionNextToken,\n }),\n }\n );\n this.#sessionNextToken = next_token;\n if (!next_token) {\n this.notifySubscribers({ topic: \"session.fetch.end\" });\n }\n return conversations;\n } catch {\n // eslint-disable-next-line no-console\n console.error(\"获取会话历史失败\");\n }\n return [];\n }\n\n async getChatHistory(id?: string): Promise<ChatItem[]> {\n if (id) {\n this.setConversationId(id);\n this.#messageNextToken = \"\";\n }\n if (!this.#conversationId) return [];\n try {\n const {\n data: { conversations, next_token },\n } = await http.request<{\n data: {\n conversations: ChatItem[];\n next_token: string;\n previous_token: string;\n };\n }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.GetAllDialogue/conversation/get/${this.#conversationId}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n limit: 1000,\n next_token: this.#messageNextToken,\n }),\n }\n );\n this.#messageNextToken = next_token;\n if (!next_token) {\n this.notifySubscribers({ topic: \"message.fetch.end\" });\n }\n return conversations;\n } catch {\n // eslint-disable-next-line no-console\n console.error(\"获取消息历史失败\");\n }\n return [];\n }\n\n async deleteSession(id: string[]): Promise<boolean> {\n if (!id.length) return false;\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.DeleteConversation/conversation/delete`,\n {\n method: \"POST\",\n body: JSON.stringify({\n conversationIds: id,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n async updateSession(\n id: string,\n data: Partial<SessionItem>\n ): Promise<boolean> {\n if (!id) return false;\n let flag: boolean = false;\n try {\n const { code } = await http.request<{ code: number }>(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.conversation.UpdateConversation/conversation/update/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n updateData: data,\n }),\n }\n );\n if (code === 0) {\n flag = true;\n }\n } catch {\n flag = false;\n }\n return flag;\n }\n\n getCustomSplit() {\n return {\n [Symbol.split](str: string) {\n let pos = 0;\n const result = [];\n let cache = \"\";\n while (pos < str.length) {\n const matchStr = str.substring(pos, pos + 1);\n // 如果是中文,单个输出\n if (/[\\u4e00-\\u9fa5]/.test(matchStr)) {\n result.push(cache + matchStr);\n cache = \"\";\n } else {\n // 否则,遇到空格或者标点符号再分词\n if (!/\\s|[,。;《》?!,.:<>?!]]/.test(matchStr)) {\n cache = cache + matchStr;\n } else {\n result.push(cache + matchStr);\n cache = \"\";\n }\n }\n pos++;\n }\n if (cache) result.push(cache);\n return result;\n },\n };\n }\n\n splitWord(str: string): string[] {\n if (!str) return [];\n // 单词长度小于 5 直接返回, 否则做单词分割处理\n if (str?.length < 5) return [str];\n let list = [];\n\n // 只要是命令字,且命令字不等于easy_cmd_progress的时候就直接返回\n if (\n /^```easy_cmd_.*?```[^`]*$/s.test(str) &&\n !/easy_cmd_progress/.test(str)\n ) {\n return [str];\n }\n\n if (window.Intl) {\n try {\n const segmenterFr = new Intl.Segmenter(\"zh-Hans-CN\", {\n granularity: \"word\",\n });\n const iterator = segmenterFr.segment(str)[Symbol.iterator]();\n\n let nextWord = iterator.next();\n while (!nextWord.done) {\n list.push(nextWord.value.segment);\n nextWord = iterator.next();\n }\n } catch {\n list = [];\n const customSplit = this.getCustomSplit();\n str.split(customSplit).forEach((word) => {\n list.push(word);\n });\n }\n } else {\n const customSplit = this.getCustomSplit();\n str.split(customSplit).forEach((word) => {\n list.push(word);\n });\n }\n\n return list;\n }\n\n async chat(msg: string | ChatBody): Promise<void> {\n this.#ctrl = new AbortController();\n let hadMatchMessage = false;\n this.#chatting = true;\n await fetchEventSource(\n `${getBasePath()}api/gateway/easyops.api.aiops_chat.manage.LLMChatProxy@1.0.0/api/aiops_chat/v1/chat/completions`,\n {\n method: \"POST\",\n signal: this.#ctrl.signal,\n openWhenHidden: true,\n body: JSON.stringify({\n agentId: this.#agentId,\n robotId: this.#robotId,\n conversationId: this.#conversationId,\n stream: true,\n config: {\n debug: this.#debug,\n ...(this.#answerLanguage ? { lang: this.#answerLanguage } : {}),\n },\n ...(typeof msg === \"string\"\n ? {\n input: msg,\n }\n : msg),\n }),\n headers: {\n \"giraffe-contract-name\": \"easyops.api.aiops_chat.manage.LLMChatProxy\",\n },\n onopen: async (response) => {\n if (response.ok) {\n // eslint-disable-next-line no-console\n console.log(\"open sse service success!\");\n } else {\n // eslint-disable-next-line no-console\n console.log(\"open sse service fail!\");\n }\n },\n onmessage: (msg) => {\n const { data } = msg;\n hadMatchMessage = true;\n if (data === \"[DONE]\") {\n this.#ctrl!.abort();\n return;\n }\n let result = {} as SSEMessageItem;\n try {\n result = JSON.parse(data);\n\n if (!this.#conversationId) {\n this.setConversationId(result.conversationId);\n }\n if (this.#useSpiltWord && isGeneralTextType(result.type)) {\n const wordList = this.splitWord(result.delta.content);\n\n // 一段消息最多拆分为 50-100 段内容\n let chunkedWords = wordList;\n const maxChunks = 100;\n if (wordList.length > maxChunks) {\n const minChunks = 50;\n const chunkSize = Math.ceil(\n wordList.length /\n (Math.floor(Math.random() * (maxChunks - minChunks + 1)) +\n minChunks)\n );\n chunkedWords = _.chunk(wordList, chunkSize).map((chunk) =>\n chunk.join(\"\")\n );\n }\n\n chunkedWords.forEach((word) => {\n // wordList.forEach((word) => {\n this.enqueue({\n topic: \"add\",\n message: {\n ...result,\n delta: {\n role: result.delta.role ?? \"assistant\",\n content: word,\n },\n },\n });\n });\n } else {\n this.enqueue({\n topic: \"add\",\n message: {\n ...result,\n delta: {\n role: result.delta.role ?? \"assistant\",\n ...pick(result.delta, [\n \"content\",\n \"tool_calls\",\n \"tool_call_id\",\n ]),\n },\n },\n });\n }\n } catch {\n result = JSON.parse(data);\n\n const SENSITIVE_WORDS_ERROR =\n \"input messages contains sensitive words\";\n const EXCEED_TOKENS_ERROR = \"exceed tokens resource limit\";\n let content = `\\`【数据格式错误】:\\` ${data}`;\n\n if (result?.error?.includes(SENSITIVE_WORDS_ERROR)) {\n content =\n \"触发敏感词限制,请换一个问题,或找管理员修改敏感词配置\";\n } else if (result?.error?.includes(EXCEED_TOKENS_ERROR)) {\n content = \"超过资源配额限制,请找管理员增加资源配额\";\n }\n\n this.enqueue({\n topic: \"add\",\n message: {\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n delta: {\n role: \"assistant\",\n content: content,\n },\n agentId: this.#agentId,\n robotId: this.#robotId,\n },\n });\n this.#ctrl!.abort();\n return;\n }\n },\n onclose: () => {\n // eslint-disable-next-line no-console\n console.log(\"close\");\n // 兜底逻辑,连接结束,并且没有数据返回\n if (!hadMatchMessage) {\n this.enqueue({\n topic: \"add\",\n message: {\n delta: {\n role: \"assistant\",\n content: \"`无法识别`\",\n },\n agentId: this.#agentId,\n robotId: this.#robotId,\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n },\n });\n }\n this.#ctrl!.abort();\n },\n onerror: (err) => {\n throw err;\n },\n }\n );\n\n this.#chatting = false;\n }\n\n stop() {\n clearTimeout(this.#emitTimer);\n this.#ctrl && this.#ctrl?.abort();\n this.#chatting = false;\n this.#emitTimer = undefined;\n this.#isStartEmitEvent = false;\n this.#clear();\n this.notifySubscribers({ topic: \"stop\" });\n }\n\n #startEmitEvent() {\n if (this.#isStartEmitEvent) return;\n this.#isStartEmitEvent = true;\n // 轮训队列,每隔 #enterInterval(默认 50ms) 推出第一条数据,获取到 text,推送给组件,组件接受后进行渲染\n // 直到聊天结束,并且消息队列数据为空时,停止 emit\n const callback = () => {\n if (this.#chatting || this.#messageQueue.length) {\n const messageItem = this.dequeue()!;\n messageItem && this.notifySubscribers(messageItem);\n this.#emitTimer = setTimeout(\n callback,\n getRandomInterval(this.#enterInterval, this.#messageQueue.length)\n );\n } else {\n clearTimeout(this.#emitTimer);\n this.#emitTimer = undefined;\n this.#isStartEmitEvent = false;\n this.notifySubscribers({ topic: \"finish\" });\n }\n };\n\n this.#emitTimer = setTimeout(\n callback,\n getRandomInterval(this.#enterInterval, this.#messageQueue.length)\n );\n }\n}\n\nfunction getRandomInterval(\n enterInterval: number,\n messagesInQueue: number\n): number {\n // 如果设置了 enterInterval >= 0,使用该值作为间隔\n if (enterInterval >= 0) {\n return enterInterval;\n }\n // 否则,根据消息队列中的消息数量动态调整间隔时间\n // 当队列中消息很多时,尽快输出内容\n if (messagesInQueue > 50) {\n return 16;\n }\n const value = Math.floor(Math.random() * 11);\n // 当队列消息不多时,20% 的概率返回 50ms,80% 的概率返回 50-300ms 之间的随机数\n return value < 9 ? 50 : Math.floor(Math.random() * 251) + 50;\n}\n\n// export const chartService = new ChatService();\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageItem, type ToolCall } from \"../ChatViewContext.js\";\nimport moment from \"moment\";\nimport {\n ChatBody,\n ChatItem,\n ChatService,\n SessionItem,\n SSEMessageItem,\n} from \"../ChatService.js\";\nimport { uniqueId } from \"lodash\";\nimport { InstanceApi_postSearchV3 } from \"@next-api-sdk/cmdb-sdk\";\n\nexport const NEW_SESSION_ID = \"new_session_id\";\nexport const RELATED_QUESTIONS_TYPE = \"RELATED_QUESTIONS\";\nexport const DEFAULT_TYPE = \"TEXT\";\n\nconst GENERAL_TEXT_TYPES: readonly string[] = [\n \"TEXT\",\n \"tool_call\",\n \"tool_response\",\n];\n\nexport function isGeneralTextType(type: string | undefined) {\n return GENERAL_TEXT_TYPES.includes(type ?? \"TEXT\");\n}\n\nfunction isGeneralSameType(a: string | undefined, b: string | undefined) {\n return a === b || (isGeneralTextType(a) && isGeneralTextType(b));\n}\n\nexport function useChatViewInfo({\n agentId,\n robotId,\n sessionId,\n enterInterval = 50,\n debug,\n answerLanguage,\n useSpiltWord,\n showToolCalls,\n}: {\n agentId: string;\n robotId: string;\n sessionId?: string;\n enterInterval?: number;\n debug: boolean;\n answerLanguage?: string;\n useSpiltWord?: boolean;\n showToolCalls?: boolean;\n}) {\n const [sessionEnd, setSessionEnd] = useState<boolean>(false);\n const [sessionLoading, setSessionLoading] = useState<boolean>(false);\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>(\n sessionId || NEW_SESSION_ID\n );\n const [loading, setLoading] = useState<boolean>(false);\n const [chatting, setChatting] = useState<boolean>(false);\n const [sessionList, setSessionList] = useState<SessionItem[]>([]);\n\n const [msgLoading, setMsgLoading] = useState<boolean>(false);\n const [msgEnd, setMsgEnd] = useState<boolean>(false);\n const [msgList, setMsgList] = useState<MessageItem[]>([]);\n const [searchStr, setSearchStr] = useState<string>(\"\");\n const chattingMessageItem = useRef<MessageItem>();\n const sessionSearchQuery = useRef<string | undefined>();\n const haveCreatedSession = useRef<boolean>(false);\n const [toolNames, setToolNames] = useState<Map<string, string | null>>(\n new Map()\n );\n const toolNameRequests = useRef<Map<string, Promise<void>>>(new Map());\n\n const fetchToolName = useCallback((toolId: string) => {\n // 不要重复查询工具名称\n if (toolNameRequests.current.has(toolId)) {\n return;\n }\n const promise = InstanceApi_postSearchV3(\"LLM_TOOL@EASYOPS\", {\n query: {\n id: toolId,\n },\n fields: [\"name\"],\n }).then(\n (res) => {\n const list = res.list as { name: string }[];\n const name = list.length > 0 ? list[0].name : null;\n setToolNames((pre) => {\n const newMap = new Map(pre);\n newMap.set(toolId, name);\n return newMap;\n });\n },\n (error) => {\n // eslint-disable-next-line no-console\n console.error(\"fetch tool name error\", error);\n }\n );\n toolNameRequests.current.set(toolId, promise);\n }, []);\n\n const chatService = useMemo(\n () =>\n new ChatService({\n agentId,\n robotId,\n enterInterval,\n debug,\n answerLanguage,\n useSpiltWord,\n }),\n [agentId, robotId, enterInterval, debug, answerLanguage, useSpiltWord]\n );\n\n const defaultNewSessionItem = useMemo(\n () =>\n ({\n conversationId: NEW_SESSION_ID,\n title: \"新建会话\",\n }) as SessionItem,\n []\n );\n\n const stopChat = useCallback(() => {\n chatService.stop();\n }, [chatService]);\n\n const setAgent = useCallback(\n (id: string) => {\n chatService.setAgentId(id);\n },\n [chatService]\n );\n\n const checkSession = useCallback(\n async (id?: string, isInit = false) => {\n if (isInit && id) {\n // 切换聊天,重制状态\n setMsgEnd(false);\n setMsgLoading(false);\n setLoading(true);\n setMsgList([]);\n setActiveSessionId(id);\n if (chatting) {\n stopChat();\n }\n } else {\n setMsgLoading(true);\n }\n // 如果是新建会话,不需要查询历史\n if (id === NEW_SESSION_ID) {\n // 重置会话id\n chatService.setConversationId();\n setMsgEnd(true);\n setLoading(false);\n return;\n }\n const list = await chatService.getChatHistory(id);\n const computedList = (list: ChatItem[]) => {\n const newList: MessageItem[] = [];\n list.forEach((item) => {\n let toolCalls: ToolCall[] | undefined;\n if (showToolCalls && item.allToolCalls) {\n try {\n const allToolCalls = JSON.parse(item.allToolCalls);\n toolCalls = [];\n allToolCalls.forEach(\n (call: { callId: string; call: string; result: string }) => {\n try {\n // In legacy backend API, `call` is an array of objects,\n // and is an object in the latest API. We support both.\n const originalCall = JSON.parse(call.call);\n toolCalls!.push({\n id: call.callId,\n ...(Array.isArray(originalCall)\n ? originalCall[0]\n : originalCall),\n response: call.result,\n });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"parse allToolCalls.call error\", e);\n }\n }\n );\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"parse allToolCalls error\", e);\n }\n }\n newList.unshift(\n {\n agentId: item.agentId,\n robotId: item.robotId,\n taskId: item.taskId,\n conversationId: item.conversationId,\n role: \"user\",\n content: {\n type: \"markdown\",\n text: item.input,\n },\n key: uniqueId(\"msg-\"),\n created: item.time,\n type: DEFAULT_TYPE,\n },\n {\n agentId: item.agentId,\n taskId: item.taskId,\n conversationId: item.conversationId,\n role: \"assistant\",\n content: {\n type: \"markdown\",\n text: item.output,\n },\n key: uniqueId(\"msg-\"),\n created: item.inputTime,\n tag: item.tag,\n type: DEFAULT_TYPE,\n toolCalls,\n }\n );\n });\n return newList.filter((item) => item.content.text);\n };\n setMsgList((preList) => {\n return computedList(list).concat(preList);\n });\n setMsgLoading(false);\n setLoading(false);\n },\n [chatService, chatting, stopChat]\n );\n\n const deleteSession = useCallback(\n async (ids: string[]): Promise<boolean> => {\n // 需要过滤新建会话, 因为新建会话在本地,还没上报到远端\n const filterIds = ids.filter((item) => item !== NEW_SESSION_ID);\n const result = await chatService.deleteSession(filterIds);\n if (result) {\n let deleteActiveSession = false;\n if (\n activeSessionId &&\n filterIds.includes(activeSessionId) &&\n activeSessionId !== NEW_SESSION_ID\n ) {\n // 如果删除会话包含当前会话,需要重置状态\n deleteActiveSession = true;\n // 清除会话id\n chatService.setConversationId();\n\n setMsgEnd(false);\n setMsgLoading(false);\n setMsgList([]);\n\n if (chatting) {\n stopChat();\n }\n }\n\n setSessionList((list) => {\n const newList = list.filter(\n (item) => !filterIds.includes(item.conversationId!)\n );\n if (deleteActiveSession) {\n // 已经选中的当前会话被删除,新建会话\n const hasNewOne = list.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n setLoading(false);\n\n setActiveSessionId(NEW_SESSION_ID);\n if (hasNewOne) {\n return newList;\n } else {\n return [defaultNewSessionItem].concat(newList);\n }\n }\n return newList;\n });\n }\n return result;\n },\n [activeSessionId, chatService, chatting, defaultNewSessionItem, stopChat]\n );\n\n const updateSession = useCallback(\n async (id: string, data: Partial<SessionItem>): Promise<boolean> => {\n const result = await chatService.updateSession(id, data);\n if (result && data?.title) {\n // 如果成功修改title,需要修改本地展示\n setSessionList((list: any) => {\n return list.map((item: any) => ({\n ...item,\n title: item.conversationId === id ? data.title : item?.title,\n }));\n });\n }\n return result;\n },\n [activeSessionId, chatService, chatting, defaultNewSessionItem, stopChat]\n );\n\n const querySessionHistory = useCallback(\n async (limit?: number, query?: string) => {\n setSessionLoading(true);\n const list = await chatService.getSessionHistory(limit, query);\n let newSessionList = list;\n if (!activeSessionId) {\n // 如果没有 activeSessionId, 默认新增会话\n setActiveSessionId(NEW_SESSION_ID);\n setMsgList([]);\n }\n if (!query || sessionSearchQuery.current === query) {\n // 如果没有搜索或者搜索关键词相同,则直接拼接\n newSessionList = [...sessionList].concat(newSessionList);\n } else {\n // 如果搜索关键词不同\n setSessionEnd(false);\n }\n\n if (!activeSessionId) {\n // 如果没有 activeSessionId, 补充一个新增会话项\n newSessionList = [defaultNewSessionItem].concat(newSessionList);\n } else if (activeSessionId && !haveCreatedSession.current) {\n // 对于初始化时有activeSessionId的场景,也需要补充一个新增会话项\n const hasNewOne = sessionList.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n if (!hasNewOne) {\n newSessionList = [defaultNewSessionItem].concat(newSessionList);\n }\n }\n\n sessionSearchQuery.current = query;\n setSessionList(newSessionList);\n setSessionLoading(false);\n },\n [\n chatService,\n activeSessionId,\n sessionList,\n defaultNewSessionItem,\n sessionSearchQuery,\n haveCreatedSession.current,\n ]\n );\n\n const handleChat = useCallback(\n async (msg: string | ChatBody) => {\n const inputMsg = typeof msg === \"string\" ? msg : msg.input;\n if (activeSessionId === NEW_SESSION_ID) {\n // 如果当前会话属于新建会话,更新会话历史数据\n setSessionList((list) => {\n return list.map((item) => ({\n ...item,\n title:\n item.conversationId === NEW_SESSION_ID ? inputMsg : item.title,\n }));\n });\n haveCreatedSession.current = true;\n }\n setChatting(true);\n chatService.chat(msg);\n setMsgList((list) => {\n return list\n .filter((item) => item.type !== RELATED_QUESTIONS_TYPE)\n .concat([\n {\n role: \"user\",\n content: {\n type: \"markdown\",\n text: inputMsg,\n },\n created: moment().format(\"YYYY-MM-DD HH:mm:ss\"),\n type: DEFAULT_TYPE,\n key: uniqueId(\"msg-\"),\n },\n {\n role: \"assistant\",\n content: {\n type: \"load\",\n text: \"\",\n },\n chatting: true,\n created: \"Now\",\n type: DEFAULT_TYPE,\n key: uniqueId(\"msg-\"),\n },\n ]);\n });\n },\n [chatService, activeSessionId]\n );\n\n const createSession = useCallback(() => {\n chatService.setConversationId();\n setMsgList([]);\n setActiveSessionId(NEW_SESSION_ID);\n const hasNewOne = sessionList.find(\n (item) => item.conversationId === NEW_SESSION_ID\n );\n if (!hasNewOne) {\n setSessionList((preList) => {\n return [defaultNewSessionItem].concat(preList);\n });\n }\n }, [chatService, sessionList, defaultNewSessionItem]);\n\n const handleIsLike = useCallback(\n async (id: string, isLike: boolean): Promise<boolean> => {\n const result = await chatService.setChatItemIsLike(id, isLike);\n if (result) {\n setMsgList((list) => {\n return list.map((item) => ({\n ...item,\n tag:\n id === item.taskId\n ? {\n isLike,\n }\n : item.tag,\n }));\n });\n }\n return result;\n },\n [chatService]\n );\n\n useEffect(() => {\n if (sessionId) {\n checkSession(sessionId);\n } else {\n // 因为在sessionList内部会有一次querySessionHistory的初始调用,设置activeSessionId等\n // 此处兼容处理不显示sessionList时的场景(如,嵌入iframe)\n querySessionHistory(30);\n }\n }, [sessionId]);\n\n useEffect(() => {\n // session listener\n const handleSessionEnd = () => {\n setSessionEnd(true);\n };\n chatService.subscribe(\"session.fetch.end\", handleSessionEnd);\n\n return () => {\n chatService.subscribe(\"session.fetch.end\", handleSessionEnd);\n };\n }, [chatService]);\n\n useEffect(() => {\n // chat listener\n const listener = (_msgItem?: SSEMessageItem) => {\n if (!_msgItem) return;\n\n const msgItemData = {\n type: DEFAULT_TYPE,\n ..._msgItem,\n };\n\n if (activeSessionId === NEW_SESSION_ID && msgItemData.conversationId) {\n // 如果当前会话属于新建会话,更新会话历史数据\n setSessionList((list) => {\n return list.map((item) => ({\n ...item,\n conversationId:\n item.conversationId === NEW_SESSION_ID\n ? msgItemData.conversationId!\n : item.conversationId,\n }));\n });\n setActiveSessionId(msgItemData.conversationId);\n }\n\n // 如果未开启显示工具调用过程,则忽略工具调用相关消息\n if (\n !showToolCalls &&\n (msgItemData.type === \"tool_call\" ||\n msgItemData.type === \"tool_response\")\n ) {\n return;\n }\n\n if (msgItemData.type === \"tool_call\") {\n for (const toolId of msgItemData.delta.tool_calls!.map(\n (call) => call.function.name\n )) {\n fetchToolName(toolId);\n }\n }\n\n let generalSameType = false;\n const isStart = !chattingMessageItem.current;\n const isUpdate =\n !isStart &&\n (generalSameType =\n isGeneralSameType(\n msgItemData.type,\n chattingMessageItem.current!.type\n ) && msgItemData.taskId === chattingMessageItem.current!.taskId);\n\n const thisMessage = (chattingMessageItem.current = {\n ...msgItemData,\n role: \"assistant\",\n content: {\n type: \"markdown\",\n // 只有普通文本类型才更新聊天文本内容,其他如 `tool_response` 不更新。\n text:\n msgItemData.type === RELATED_QUESTIONS_TYPE\n ? msgItemData.delta.content\n : msgItemData.type == null || msgItemData.type === \"TEXT\"\n ? `${isUpdate ? chattingMessageItem.current!.content.text : \"\"}${msgItemData.delta.content}`\n : (chattingMessageItem.current?.content.text ?? \"\"),\n },\n chatting: true,\n toolCalls:\n msgItemData.type === \"tool_call\"\n ? [\n ...(chattingMessageItem.current?.toolCalls ?? []),\n ...msgItemData.delta.tool_calls!,\n ]\n : msgItemData.type === \"tool_response\"\n ? chattingMessageItem.current?.toolCalls?.map((call) =>\n call.id === msgItemData.delta.tool_call_id\n ? {\n ...call,\n response: msgItemData.delta.content,\n }\n : call\n )\n : msgItemData.type === RELATED_QUESTIONS_TYPE\n ? undefined\n : chattingMessageItem.current?.toolCalls,\n created: moment(msgItemData?.created).format(\"YYYY-MM-DD HH:mm:ss\"),\n key: chattingMessageItem.current?.key ?? uniqueId(\"msg-\"),\n });\n\n setMsgList((list) => {\n if (isStart || isUpdate) {\n list.pop();\n return list.concat(thisMessage);\n }\n return (\n generalSameType\n ? list\n : list.filter((item) => item.type !== RELATED_QUESTIONS_TYPE)\n )\n .map<MessageItem>((item) => ({ ...item, chatting: false }))\n .concat(thisMessage);\n });\n };\n const reset = () => {\n setChatting(false);\n setLoading(false);\n chattingMessageItem.current = undefined;\n };\n const finishListener = () => {\n setMsgList((list) => {\n return list.map((item) => ({\n ...item,\n chatting: false,\n toolCalls: item.toolCalls?.map((call) =>\n call.response === undefined ? { ...call, failed: true } : call\n ),\n }));\n });\n reset();\n };\n const fetchEndListener = () => {\n setMsgEnd(true);\n };\n const stopListener = () => {\n if (chattingMessageItem.current) {\n const stopMessageItem: MessageItem = {\n ...chattingMessageItem.current,\n content: {\n type: \"markdown\",\n text:\n chattingMessageItem.current.content.text +\n \" \\\\\\n ` 对话被中断了 `\",\n },\n };\n setMsgList((list) => {\n list.pop();\n return msgList.concat(stopMessageItem);\n });\n } else {\n setMsgList((list) => {\n return list.filter((item) => item.content.type !== \"load\");\n });\n }\n reset();\n };\n chatService.subscribe(\"add\", listener);\n chatService.subscribe(\"finish\", finishListener);\n chatService.subscribe(\"stop\", stopListener);\n chatService.subscribe(\"message.fetch.end\", fetchEndListener);\n return () => {\n chatService.unsubscribe(\"add\", listener);\n chatService.unsubscribe(\"finish\", finishListener);\n chatService.unsubscribe(\"stop\", stopListener);\n chatService.unsubscribe(\"message.fetch.end\", fetchEndListener);\n };\n }, [chatService, activeSessionId, msgList, showToolCalls, fetchToolName]);\n\n return {\n sessionEnd,\n sessionLoading,\n loading,\n chatting,\n activeSessionId,\n sessionList,\n searchStr,\n msgEnd,\n msgLoading,\n msgList,\n toolNames,\n setAgent,\n handleChat,\n stopChat,\n createSession,\n deleteSession,\n updateSession,\n checkSession,\n setSearchStr,\n querySessionHistory,\n handleIsLike,\n };\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.progress-text{position:relative;margin-left:12px;font-size:12px;color:var(--palette-gray-7);line-height:22px;min-height:22px}.progress-text::before{content:\"·\";font-size:16px;position:absolute;left:-10px;top:-4px}.custom-component-wrapper .params{margin-top:6px;border-radius:3px}.custom-component-wrapper .params pre{margin:4px 0}.custom-component-wrapper .params-tip,.custom-component-wrapper .error-tip,.custom-component-wrapper .result-tip{font-size:0.875em;color:rgb(94 129 172)}.custom-component-wrapper .empty-tip{font-size:12px;color:var(--palette-gray-7)}.custom-component-wrapper .table-wrapper .table-container{position:relative;box-sizing:border-box;margin:0;padding:0;font-size:14px;clear:both;max-width:100%;overflow:hidden}.custom-component-wrapper .table-wrapper .table-container .table-content{overflow-x:auto}.custom-component-wrapper .table-wrapper .table-container .table-content table{margin:4px 0}.custom-component-wrapper .table-wrapper .table-container .table-content table tr td{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.custom-component-wrapper .table-wrapper .open-more{margin-top:4px;font-size:12px;display:flex;justify-content:flex-end}.custom-component-wrapper .chart-wrapper{background:#fff;margin-top:12px}.default-container .default-toolbar-container{visibility:hidden;position:absolute;top:0;right:0}.default-container:hover .default-toolbar-container{visibility:visible}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ProseMirror{position:relative;word-wrap:break-word;white-space:pre-wrap;white-space:break-spaces;font-variant-ligatures:none;font-feature-settings:\"liga\" 0,none;font-weight:400}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:\"\";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}img.ProseMirror-separator{display:inline!important;border:none!important;margin:0!important}.ProseMirror .tableWrapper{overflow-x:auto}.ProseMirror table{border-collapse:collapse;table-layout:fixed;width:100%;overflow:hidden;background-color:white;margin:4px 0}.ProseMirror td,\n.ProseMirror th{vertical-align:top;box-sizing:border-box;position:relative}.ProseMirror .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;z-index:20;background-color:#adf;pointer-events:none}.ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.ProseMirror .selectedCell:after{z-index:2;position:absolute;content:\"\";left:0;right:0;top:0;bottom:0;background:rgba(200,200,255,0.4);pointer-events:none}.milkdown-theme-nord blockquote{border-left-width:4px;--tw-border-opacity:1;border-color:rgb(94 129 172/var(--tw-border-opacity));padding-left:1rem;font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif;font-style:normal}.milkdown-theme-nord code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-weight:400;--tw-text-opacity:1;color:rgb(94 129 172/var(--tw-text-opacity))}.user .milkdown-theme-nord code{color:rgb(120 168 237)}.milkdown-theme-nord pre code{color:inherit}.milkdown-theme-nord img{margin-top:0!important;margin-bottom:0!important;display:inline-block;max-width:100%}.milkdown-theme-nord.prose\n :where(blockquote):not(:where([class~=\"not-prose\"] *)){font-weight:400}.milkdown-theme-nord.prose\n :where(ol > li):not(:where([class~=\"not-prose\"] *))::marker,\n.milkdown-theme-nord.prose\n :where(ul > li):not(:where([class~=\"not-prose\"] *))::marker{--tw-text-opacity:1;color:rgb(94 129 172/var(--tw-text-opacity))}.milkdown-theme-nord.prose\n :where(blockquote p:first-of-type):not(:where([class~=\"not-prose\"] *)):before,\n.milkdown-theme-nord.prose\n :where(blockquote p:first-of-type):not(:where([class~=\"not-prose\"] *)):after{content:\"\"}.milkdown-theme-nord.prose\n :where(code):not(:where([class~=\"not-prose\"] *)):before,\n.milkdown-theme-nord.prose\n :where(code):not(:where([class~=\"not-prose\"] *)):after{content:\"\"}.milkdown-theme-nord.prose .tableWrapper{position:relative;margin-bottom:0.5rem;overflow-x:auto}.milkdown-theme-nord.prose table{font-size:0.875rem;line-height:1.25rem;--tw-shadow:0 4px 6px -1px rgb(0 0 0/0.1),0 2px 4px -2px rgb(0 0 0/0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);width:max-content}@media (min-width: 640px){.milkdown-theme-nord.prose table{border-radius:0.5rem}}.milkdown-theme-nord.prose td,\n.milkdown-theme-nord.prose th{padding:0.75rem 1.5rem!important;max-width:20em}.milkdown-theme-nord.prose tr{border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.prose :where(tr:first-child){background-color:var(--antd-table-header-bg)}.dark .milkdown-theme-nord.prose tr{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.milkdown-theme-nord.prose :where(td, th) p{margin:0!important}.dark .milkdown-theme-nord.prose :where(td, th):nth-child(odd){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.milkdown-theme-nord.prose.ProseMirror .selectedCell:after{background-color:#88c0d04d}.milkdown-theme-nord.prose br[data-is-inline=\"true\"],\n.milkdown-theme-nord.prose br[data-is-inline=\"true\"]:after{content:\" \"}.prose{color:var(--color-normal-text)}.prose :where(p):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=\"lead\"]):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=\"not-prose\"] *)){color:var(--color-info);-webkit-text-decoration:underline;text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600}.user .prose :where(strong):not(:where([class~=\"not-prose\"] *)){color:inherit;font-weight:600;padding:0 2px}.prose :where(a strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(ol):not(:where([class~=\"not-prose\"] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=\"A\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-alpha}.prose :where(ol[type=\"a\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-alpha}.prose :where(ol[type=\"A\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-alpha}.prose :where(ol[type=\"a\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-alpha}.prose :where(ol[type=\"I\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-roman}.prose :where(ol[type=\"i\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-roman}.prose :where(ol[type=\"I\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:upper-roman}.prose :where(ol[type=\"i\" s]):not(:where([class~=\"not-prose\"] *)){list-style-type:lower-roman}.prose :where(ol[type=\"1\"]):not(:where([class~=\"not-prose\"] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=\"not-prose\"] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol > li):not(:where([class~=\"not-prose\"] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul > li):not(:where([class~=\"not-prose\"] *))::marker{color:var(--tw-prose-bullets)}.prose :where(hr):not(:where([class~=\"not-prose\"] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=\"not-prose\"] *)){font-weight:500;font-style:italic;color:var(--color-auxiliary-text);border-left-width:0.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:\"\\\\201C\" \"\\\\201D\" \"\\\\2018\" \"\\\\2019\";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose\n :where(blockquote p:first-of-type):not(\n :where([class~=\"not-prose\"] *)\n )::before{content:open-quote}.prose\n :where(blockquote p:last-of-type):not(:where([class~=\"not-prose\"] *))::after{content:close-quote}.prose :where(h1):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:0.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=\"not-prose\"] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=\"not-prose\"] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:0.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=\"not-prose\"] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;margin-top:1.5em;margin-bottom:0.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=\"not-prose\"] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure > *):not(:where([class~=\"not-prose\"] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-captions);font-size:0.875em;line-height:1.4285714;margin-top:0.8571429em}.prose :where(code):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-code);font-weight:600;font-size:0.875em}.prose :where(code):not(:where([class~=\"not-prose\"] *))::before{content:\"\\`\"}.prose :where(code):not(:where([class~=\"not-prose\"] *))::after{content:\"\\`\"}.prose :where(a code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(h1 code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(h2 code):not(:where([class~=\"not-prose\"] *)){color:inherit;font-size:0.875em}.prose :where(h3 code):not(:where([class~=\"not-prose\"] *)){color:inherit;font-size:0.9em}.prose :where(h4 code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(thead th code):not(:where([class~=\"not-prose\"] *)){color:inherit}.prose :where(pre):not(:where([class~=\"not-prose\"] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:0.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:0.375rem;padding-top:0.8571429em;padding-right:1.1428571em;padding-bottom:0.8571429em;padding-left:1.1428571em}.prose :where(pre code):not(:where([class~=\"not-prose\"] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=\"not-prose\"] *))::before{content:none}.prose :where(pre code):not(:where([class~=\"not-prose\"] *))::after{content:none}.prose :where(table):not(:where([class~=\"not-prose\"] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:0.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=\"not-prose\"] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=\"not-prose\"] *)){color:var(--color-strong-text);font-weight:600;vertical-align:bottom;padding-right:0.5714286em;padding-bottom:0.5714286em;padding-left:0.5714286em}.prose :where(tbody tr):not(:where([class~=\"not-prose\"] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=\"not-prose\"] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=\"not-prose\"] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=\"not-prose\"] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=\"not-prose\"] *)){vertical-align:top}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgb(0 0 0/50%);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(video):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure):not(:where([class~=\"not-prose\"] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=\"not-prose\"] *)){margin-top:0.5em;margin-bottom:0.5em}.prose :where(ol > li):not(:where([class~=\"not-prose\"] *)){padding-left:0.375em}.prose :where(ul > li):not(:where([class~=\"not-prose\"] *)){padding-left:0.375em}.prose :where(.prose > ul > li p):not(:where([class~=\"not-prose\"] *)){margin-top:0.75em;margin-bottom:0.75em}.prose\n :where(.prose > ul > li > *:first-child):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em}.prose\n :where(.prose > ul > li > *:last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:1.25em}.prose\n :where(.prose > ol > li > *:first-child):not(:where([class~=\"not-prose\"] *)){margin-top:1.25em}.prose\n :where(.prose > ol > li > *:last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:1.25em}.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~=\"not-prose\"] *)){margin-top:0.75em;margin-bottom:0.75em}.prose :where(hr + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h2 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h3 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(h4 + *):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=\"not-prose\"] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=\"not-prose\"] *)){padding-right:0}.prose :where(tbody td, tfoot td):not(:where([class~=\"not-prose\"] *)){padding-top:0.5714286em;padding-right:0.5714286em;padding-bottom:0.5714286em;padding-left:0.5714286em}.prose\n :where(tbody td:first-child, tfoot td:first-child):not(\n :where([class~=\"not-prose\"] *)\n ){padding-left:0}.prose\n :where(tbody td:last-child, tfoot td:last-child):not(\n :where([class~=\"not-prose\"] *)\n ){padding-right:0}.prose :where(.prose > :first-child):not(:where([class~=\"not-prose\"] *)){margin-top:0}.prose :where(.prose > :last-child):not(:where([class~=\"not-prose\"] *)){margin-bottom:0}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.isolate{isolation:isolate}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.\\\\!table{display:table!important}.table{display:table}.inline-table{display:inline-table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.flex-shrink{flex-shrink:1}.shrink{flex-shrink:1}.flex-grow{flex-grow:1}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.\\\\!transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.select-all{-webkit-user-select:all;user-select:all}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.break-all{word-break:break-all}.rounded{border-radius:0.25rem}.border{border-width:1px}.text-justify{text-align:justify}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.lining-nums{--tw-numeric-figure:lining-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0/0.1),0 1px 2px -1px rgb(0 0 0/0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}.ease-in{transition-timing-function:cubic-bezier(0.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(0.4,0,0.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,0.2,1)}.milkdown{border-radius:0.25rem;margin:0;padding:0}.editor{margin-left:auto;margin-right:auto}.dark .dark\\\\:prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}code[class*=\"language-\"],\npre[class*=\"language-\"]{color:#f8f8f2;background:none;font-family:\"Fira Code\",Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=\"language-\"]{padding:1em;margin:0.5em 0;overflow:auto;border-radius:0.3em}:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"]{background:#2e3440}:not(pre) > code[class*=\"language-\"]{padding:0.1em;border-radius:0.3em;white-space:normal}.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:0.7}.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted{color:#a3be8c}.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable{color:#81a1c1}.token.atrule,\n.token.attr-value,\n.token.function,\n.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,\n.token.important{color:#ebcb8b}.token.important,\n.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.quick-answer-wrapper{margin-top:20px;border-radius:6px;border:1px solid var(--color-border-divider-line);padding:16px 24px}.quick-answer-wrapper .tip{font-size:18px;margin-bottom:30px}.quick-answer-wrapper .quick-answer-list{display:grid;gap:24px 16px;border-radius:3px;grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item{position:relative;padding:16px;border-radius:6px;cursor:pointer;display:flex;padding:10px 20px;gap:12px;width:auto;box-sizing:border-box}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item:hover{box-shadow:var(--quick-answer-card-item-hover)}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .left .icon{font-size:20px;color:#fff;padding:8px;border-radius:6px;margin-top:4px}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content{flex:1;min-width:0}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content .title{font-size:16px;font-weight:bold;color:var(--color-normal-text);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.quick-answer-wrapper .quick-answer-list .quick-answer-card-item .content .description{color:var(--color-auxiliary-text);font-size:12px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.quick-answer-wrapper .show-more-wrapper{text-align:center;margin-top:20px}.quick-answer-wrapper .show-more-wrapper .show-more-btn{line-height:24px}.quick-answer-wrapper .show-more-wrapper .show-more-btn::after{content:\"- - - - -\";color:var(--color-text-divider-line);position:absolute}.quick-answer-wrapper .show-more-wrapper .show-more-btn::before{content:\"- - - - -\";color:var(--color-text-divider-line);position:absolute}.quick-answer-wrapper .show-more-wrapper .show-more-btn::before{margin-left:-60px}.quick-answer-wrapper .show-more-wrapper .show-more-btn::after{margin-left:10px}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../assets/loading.gif\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.message-list-loading-wrapper{width:140px;height:140px;background-repeat:no-repeat;margin:auto;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___})}.chart-item-loading-wrapper{display:flex;padding:10px;font-size:40px;align-items:center;justify-content:center;color:#d2d3d4;border-radius:6px}.chart-item-loading-wrapper .load{display:inline-block;position:relative;width:64px;height:64px}.chart-item-loading-wrapper .load div{position:absolute;top:27px;width:11px;height:11px;border-radius:50%;background:#aaa8a8;animation-timing-function:cubic-bezier(0,1,1,0)}.chart-item-loading-wrapper .load div:nth-child(1){left:6px;animation:load1 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(2){left:6px;animation:load2 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(3){left:26px;animation:load2 0.6s infinite}.chart-item-loading-wrapper .load div:nth-child(4){left:45px;animation:load3 0.6s infinite}@keyframes load1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes load2{0%{transform:translate(0,0)}100%{transform:translate(19px,0)}}@keyframes load3{0%{transform:scale(1)}100%{transform:scale(0)}}.common-loading-wrapper{text-align:center;font-size:30px;color:#ddd}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--message-box-bg:#f1f3f4;--search-input-icon-hover:#ddd;--quick-answer-card-item-hover:0px 7px 8px 0px rgba(0,0,0,0.15)}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--message-box-bg:rgba(255,255,255,0.16);--search-input-icon-hover:#383838;--quick-answer-card-item-hover:0px 7px 8px 0px rgba(0,0,0,0.24)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./styles.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_1___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/loading.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_2___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/MessageItem/Markdown/markdown.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_3___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/QuickAnswerList/quickAnswerList.shadow.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_4___ from \"-!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./components/MessageItem/Markdown/CodeBlock/CodeBlock.shadow.css\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_2___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_3___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_4___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"./assets/user.png\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"./assets/robot.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block;height:100%}:host([hidden]){display:none}.chat-view-container{display:flex;flex-direction:row;width:100%;height:100%}.chat-view-selector{width:200px;padding:14px;border-right:1px solid var(--color-border-divider-line)}.chat-view-content{flex:1;display:flex;flex-direction:column;width:100%;gap:8px}.chat-view-content .chat-view-toolbar{background:#e0e4e5;padding:18px;display:flex;justify-content:space-between;align-items:center}.chat-view-content .chat-view-toolbar .username{color:#333333;font-weight:500;line-height:22px;font-size:16px}.chat-view-content .chat-view{max-width:100%;position:relative;display:flex;flex:1;flex-direction:column;box-sizing:border-box;overflow-y:auto}.session-list-wrapper{display:flex;flex-direction:column;height:100%}.session-list-wrapper .session-title{font-size:16px;color:var(--color-header-text);margin-bottom:16px}.session-list-wrapper .session-list{overflow-y:auto}.session-list-wrapper .session-list .session-item{display:flex;justify-content:space-between;cursor:pointer;border-radius:var(--small-border-radius);background-color:var(--third-menu-default-bg);padding:6px 18px;color:var(--color-header-text);margin-top:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-list-wrapper .session-list .session-item .content{width:0;flex:1}.session-list-wrapper .session-list .session-item .content .title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-list-wrapper .session-list .session-item:hover .session-close-btn eo-icon{display:block}.session-list-wrapper .session-list .session-item:hover .session-edit-btn eo-icon{display:block}.session-list-wrapper .session-list .session-item:first-child{margin-top:0px}.session-list-wrapper .session-list .session-item.active{background-color:var(--third-menu-item-selected-bg);color:var(--color-brand)}.session-list-wrapper .session-list .session-item:hover,.session-list-wrapper .session-list .session-item.active:hover{color:var(--color-header-text);background-color:var(--third-menu-item-hover-bg)}.session-list-wrapper .session-list .session-item .session-close-btn{display:flex;align-items:center;cursor:pointer;font-size:12px;margin-left:6px}.session-list-wrapper .session-list .session-item .session-close-btn:hover{color:var(--color-error)}.session-list-wrapper .session-list .session-item .session-close-btn eo-icon{display:none}.session-list-wrapper .session-list .session-item .session-edit-btn{display:flex;align-items:center;cursor:pointer;font-size:12px}.session-list-wrapper .session-list .session-item .session-edit-btn:hover{color:var(--color-info)}.session-list-wrapper .session-list .session-item .session-edit-btn eo-icon{display:none}.message-list{display:flex;flex-direction:column;padding-bottom:30px;padding:12px;flex:1;margin:0 auto;max-width:1556px;width:100%;box-sizing:border-box}.message-list .message-list-box{display:flex;flex-direction:column;position:relative;gap:36px}.message-list .message-list-box .message-item{display:flex;gap:8px;padding-right:40px}.message-list .message-list-box .message-item:last-child{margin-bottom:10px}.message-list .message-list-box .message-item.user{flex-direction:row-reverse;padding:0;padding-left:40px}.message-list .message-list-box .message-item.user .message-box{margin-bottom:0;overflow:hidden}.message-list .message-list-box .message-item.user .message-box .message-top{flex-direction:row-reverse}.message-list .message-list-box .message-item.user .message-box .message-content{justify-content:flex-end}.message-list .message-list-box .message-item.user .message-box .message-content .wrapper .content{background-color:#606f7c;color:#fff}.message-list .message-list-box .message-item.user .message-box .message-content .wrapper .content .ProseMirror.prose{color:#fff}.message-list .message-list-box .message-item .avatar{width:36px;height:36px;margin-top:32px;border-radius:50%;font-size:20px;display:flex;align-items:center;justify-content:center}.message-list .message-list-box .message-item .avatar.user{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___})}.message-list .message-list-box .message-item .avatar.robot{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___})}.message-list .message-list-box .message-item .message-box{position:relative;flex:1;overflow:hidden}.message-list .message-list-box .message-item .message-box .message-content{display:flex;justify-content:start;position:relative}.message-list .message-list-box .message-item .message-box .message-content .wrapper{position:relative;overflow:hidden}.message-list .message-list-box .message-item .message-box .message-content .wrapper .content{position:relative;padding:14px;border-radius:6px;overflow:hidden;background:var(--message-box-bg)}.message-list .message-list-box .message-item .message-box .message-content .wrapper .content .text-item{white-space:pre-wrap}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar{display:flex;gap:12px;justify-content:flex-end;margin-top:4px}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar eo-icon{cursor:pointer;color:#606f7c}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar eo-icon.active{color:var(--color-brand)}.message-list .message-list-box .message-item .message-box .message-content .wrapper .message-toolbar .split{width:1px;height:16px;background-color:#d9d9d9;margin-bottom:1px}.message-list .message-list-box .message-item .message-box .message-top{display:flex;margin-bottom:4px;color:#bec8ce;gap:8px}.message-list .message-list-box .message-item .message-box .message-top .time{min-height:22px}.message-list .message-list-box .stop-responding-wrapper{position:absolute;left:44px;bottom:-28px}.message-list .tool-calls{width:-moz-fit-content;width:fit-content;max-width:100%;padding:14px;border-radius:6px;background:var(--message-box-bg);margin-bottom:8px}.message-list .tool-calls pre{margin-top:1em;padding:0.5em;border:1px solid var(--palette-gray-5);border-radius:4px;font-size:12px}.message-list .tool-calls-summary{cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.message-list .tool-calls-summary-toggle{color:var(--color-secondary-text)}.message-list .tool-calls-status,.message-list .tool-call-function-name{display:flex;gap:8px;align-items:center}.message-list .tool-calls-status.processing{color:var(--color-secondary-text)}.message-list .tool-calls-status.ok{color:var(--color-success)}.message-list .tool-calls-status.failed{color:var(--color-error)}.message-list .tool-call{margin-top:1em;padding-top:1em;border-top:1px solid var(--palette-gray-5)}.message-list .tool-call-function-name{font-weight:bold;margin-bottom:0.5em}.message-list .tool-call-wait-response{margin:1em 0}.message-list .tool-call-function-arguments.failed,.message-list .tool-call-function-response.failed{color:var(--color-error)}.message-list .tool-call-function-arguments.failed pre,.message-list .tool-call-function-response.failed pre{border-color:var(--color-error)}.search-input-box{display:flex;flex-direction:column;height:87px;padding:12px;position:relative;margin:0 auto;max-width:1556px;width:100%;box-sizing:border-box}.search-input-box .input-toolbar{position:absolute;bottom:71%;left:12px;right:12px}.search-input-box .mentions-list-wrapper{position:absolute;bottom:100%;left:12px;right:12px;z-index:1}.search-input-box .mentions-list-wrapper .content{background-color:var(--antd-input-bg);border-radius:6px;border:1px solid var(--palette-gray-4);padding:8px}.search-input-box .mentions-list-wrapper .content .mentions-title{font-size:14px;font-weight:bold;color:var(--color-strong-text);padding-bottom:8px}.search-input-box .mentions-list-wrapper .content .mentions-list{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow-y:auto}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item{display:flex;flex-direction:row;align-items:center;gap:12px;padding:8px;border-radius:6px;cursor:pointer}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .icon{font-size:18px;padding:8px;border-radius:50%}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .name{color:var(--color-normal-text)}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item .description{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--color-disabled-text)}.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item:hover,.search-input-box .mentions-list-wrapper .content .mentions-list .mentions-item.active{background:var(--palette-gray-3)}.search-input-box .snippets-list-wrapper{position:absolute;bottom:100%;left:12px;right:12px;z-index:1}.search-input-box .snippets-list-wrapper .content{background-color:var(--antd-input-bg);border-radius:6px;border:1px solid var(--palette-gray-4);padding:8px}.search-input-box .snippets-list-wrapper .content .snippets-title{font-size:14px;font-weight:bold;color:var(--color-strong-text);padding-bottom:8px}.search-input-box .snippets-list-wrapper .content .snippets-list{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow-y:auto}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item{display:flex;flex-direction:row;align-items:center;gap:12px;padding:8px;border-radius:6px;cursor:pointer}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .icon{font-size:18px;padding:8px;border-radius:50%}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .name{color:var(--color-normal-text)}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item .description{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--color-disabled-text)}.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item:hover,.search-input-box .snippets-list-wrapper .content .snippets-list .snippets-item.active{background:var(--palette-gray-3)}.search-input-box.fill-content{border-top:1px solid rgba(197,197,197,0.5)}.search-input-box .input-box{position:absolute;bottom:20px;left:12px;right:12px;display:inline-flex;padding:var(--input-affix-wrapper-padding);border-radius:var(--small-border-radius);height:-moz-fit-content;height:fit-content;color:var(--text-color-default);background-color:var(--antd-input-bg);border:1px solid var(--color-border-divider-line);transition:border-color 0.3s;overflow:visible}.search-input-box .input-box.active{border-color:var(--antd-input-focus-border-color)}.search-input-box .input-box.disabled{pointer-events:none;background:var(--input-outline-disabled);cursor:not-allowed}.search-input-box .input-box.expand textarea{padding-right:50px;margin-bottom:50px}.search-input-box .input-box textarea{width:100%;height:22px;font-size:18px;resize:none;padding:10px 50px 10px 10px;outline:none;border:none;line-height:20px;color:var(--color-normal-text);background-color:transparent;cursor:inherit;transition:all 300ms ease-out;box-sizing:content-box}.search-input-box .input-box textarea::placeholder{color:#b0b1b8}.search-input-box .input-box .suffix-icon{display:flex;align-items:center;gap:8px;position:absolute;right:12px;bottom:6px}.search-input-box .input-box .suffix-icon eo-tooltip{display:flex}.search-input-box .input-box .suffix-icon eo-icon{font-size:20px;cursor:pointer;padding:6px;border-radius:3px}.search-input-box .input-box .suffix-icon eo-icon:not(.disabled):hover{background:var(--search-input-icon-hover)}.search-input-box .input-box .suffix-icon .submit-split{width:1px;height:20px;background:#d1d1d1}.search-input-box .input-box .suffix-icon .submit-btn.active{color:var(--color-brand)}.search-input-box .input-box .suffix-icon .submit-btn.disabled{color:var(--color-disabled-text);cursor:not-allowed}.search-input-box .input-box .toolbar-icon{position:absolute;top:12px;right:14px}.search-input-box .input-box .toolbar-icon eo-icon{font-size:20px;cursor:pointer;padding:6px;border-radius:3px}.search-input-box .input-box .toolbar-icon eo-icon:hover{background:var(--search-input-icon-hover)}.search-input-box .search-input-toolbar{display:flex;justify-content:flex-end;position:absolute;right:12px;bottom:0px}.search-input-box .search-input-toolbar .input-tip{font-size:12px;color:var(--color-secondary-text)}.message-start-tip,\n.session-end-tip{color:var(--color-disabled-text);font-size:12px;text-align:center;margin-top:12px;position:relative}.message-start-tip::after{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.session-end-tip::after{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.message-start-tip::before{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.session-end-tip::before{content:\"- - -\";color:var(--color-disabled-text);position:absolute}.message-start-tip::before{margin-left:-35px}.session-end-tip::before{margin-left:-35px}.message-start-tip::after{margin-left:10px}.session-end-tip::after{margin-left:10px}.session-search-input-box{position:relative;display:inline-flex;padding:var(--input-affix-wrapper-padding);border-radius:var(--small-border-radius);height:-moz-fit-content;height:fit-content;color:var(--text-color-default);background-color:var(--antd-input-bg);border:1px solid var(--color-border-divider-line);margin-bottom:8px}.session-search-input-box input{width:100%;padding:4px 28px 4px 8px;outline:none;border:none;color:var(--color-normal-text);background-color:transparent;cursor:inherit;transition:all 300ms ease-out;box-sizing:content-box}.session-search-input-box input::placeholder{color:#b0b1b8}.session-search-input-box .suffix-icon{display:flex;align-items:center;position:absolute;right:0;bottom:0;color:var(--color-secondary-text)}.session-search-input-box .suffix-icon eo-tooltip{display:flex}.session-search-input-box .suffix-icon eo-icon{font-size:18px;cursor:pointer;padding:6px;border-radius:3px}.session-search-input-box .suffix-icon eo-icon:not(.disabled):hover{color:var(--color-info-active)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./index.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./index.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["ChatViewContext","createContext","useChatViewContext","useContext","WrappedIcon","wrapBrick","MessageListLoading","React","className","ChatItemLoading","CommonLoading","icon","lib","spinning","Avatar","_ref","role","agentId","isUser","useMemo","quickAnswerConfig","agentList","_quickAnswerConfig$li","list","matchAgent","find","item","id","_extends","style","color","background","WrappedLink","GuideItem","text","prompts","map","index","key","ProgressText","renderText","replace","MsgItemContext","useMsgItemContext","CustomComponent","_ref2","language","commandBricks","chatting","robotId","conversationId","taskId","parseData","isError","cahceTextRef","useRef","isEnd","setIsEnd","useState","setIsError","setParseData","useEffect","current","data","JSON","parse","match","useData","commandBrickConf","config","component","ReactUseMultipleBricks","useBrick","showOriginData","copyIcon","theme","CodeBlock","setLanguage","contentRef","node","useNodeViewContext","messageApi","contextHolder","message","useMessage","handleCopy","async","_node$content$firstCh","content","firstChild","navigator","clipboard","writeText","success","err","console","error","defaultContent","spellCheck","ref","position","Tooltip","title","arrow","onClick","cursor","renderContent","_node$firstChild","_node$firstChild2","_node$attrs","textContent","lang","attrs","MarkdownItem","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownDisplay","value","nodeViewFactory","useNodeViewFactory","transformOpenAIToCodeBlock","str","test","_","$1","get","useEditor","root","Editor","make","ctx","set","rootCtx","update","editorViewOptionsCtx","prev","editable","handleClickOn","view","pos","handleClick","found","state","tr","doc","nodeAt","mark","marks","m","type","name","href","window","open","realValue","defaultValueCtx","MutationObserver","Array","from","querySelectorAll","forEach","link","onclick","observe","childList","subtree","nord","use","prism","gfm","commonmark","$view","codeBlockSchema","undefined","_get","action","replaceAll","Milkdown","TableItem","TextItem","WrapperIcon","WrappedToolTip","copyToClipboard","unwrapProvider","showNotification","Toolbar","tag","isAssistant","isChattingItem","showLike","globalChatting","showShare","readonly","handleIsLike","setSearchStr","handleLikeOrIsLike","useCallback","result","islike","hoist","classNames","active","isLike","then","catch","handleShare","location","origin","getBasePath","handleRequestion","Time","time","moment","format","WrappedButton","WrappedTag","ToolCalls","toolCalls","expanded","setExpanded","processedToolCalls","processedArguments","processedResponse","function","func","response","ok","arguments","functionName","args","processStatus","status","toolCall","marginRight","prefix","ToolCallComponent","_ref3","_toolNames$get","toolNames","outline","failed","dumpYaml","safeDump","schema","JSON_SCHEMA","skipInvalid","noRefs","noCompatMode","NOT_AGENT_MATCH","MessageNode","props","created","itemType","showToolCalls","getContentNode","examplePrompts","messageNode","getMsgNode","RELATED_QUESTIONS_TYPE","DEFAULT_TYPE","length","Provider","CARD_ITEM_HEIGHT","HEIGHT_GAP","QuickAnswerCardItem","description","starterPrompts","iconColor","_icon$color","height","handleCardClick","category","QuickAnswerList","_quickAnswerConfig$ti","msgList","loading","showMoreBtn","setShowMoreBtn","listRef","hadClickShowMoreBtn","element","observer","ResizeObserver","entries","entry","contentRect","disconnect","tip","maxHeight","overflow","instanceId","handleShowMoreClick","StopBtn","stopChat","handleStopChat","MessageList","showAvatar","chatViewRef","messageListRef","msgLoading","msgEnd","getMsgItemNode","marginTop","marginLeft","user","msgListNode","manualScrolled","setManualScrolled","autoScrollingRef","chatView","handleScroll","scrollTop","clientHeight","scrollHeight","addEventListener","removeEventListener","scroll","top","requestAnimationFrame","SIZING_STYLE","hiddenTextarea","LegacySearchInput","setValue","setActive","expand","setExpand","autoSizeStyle","setAutoSizeStyle","isFillContent","setIsFillContent","snippetOpen","setSnippetOpen","matchSnippetList","setMatchSnippetList","matchSnippetIndex","setMatchSnippetIndex","mentionOpen","setMentionOpen","matchPrefixIndex","setMatchPrefixIndex","matchAgentList","setMatchMentionList","matchMentionsIndex","setMatchMentionsIndex","mentionsRef","snippetsRef","searchInputBoxRef","textareaRef","hadExpanded","inputEndRef","searchStr","createSession","handleChat","setAgent","snippetList","hadValue","defaultSize","disabled","matchPrefixInfo","textareaElement","currentFocusIndex","selectionStart","matchWord","i","start","end","word","handleAgentItemSelect","valueList","split","trimName","focusIndex","splice","join","setTimeout","selectionEnd","focus","handleSnippetItemSelect","regex","matches","exec","push","isShowMentions","mentions","slice","isShowSnippets","snippets","computedAutoSize","size","textareaStyles","uiTextNode","minRows","maxRows","document","createElement","setAttribute","body","appendChild","uiTextNodeStyle","getComputedStyle","sizingStyle","getPropertyValue","minHeight","placeholder","singleRowHeight","Math","max","min","overflowY","resize","calculateAutoSizeStyle","handleChange","e","target","keyword","trim","_snippetList$filter","filterResult","filter","includes","handleExpand","matchFirstAgent","agent","handleDispatchQuestion","val","_textareaRef$current","blur","handleSubmit","handleKeyDown","shiftKey","preventDefault","handleKeyUp","selectionIndex","prefixWord","lastIndexOf","indexOf","_textareaRef$current2","searchInputBox","width","currentWidth","getBoundingClientRect","_textareaRef$current3","filterList","querySelector","scrollIntoView","block","handleDocumentClick","mentionsElemnt","contains","composedPath","useImperativeHandle","handleInsertQuestion","sendMsg","msg","inputToolbarBrick","paddingRight","onFocus","onBlur","onChange","onKeyDown","onKeyUpCapture","onCompositionStart","handleCompositionStart","onCompositionEnd","handleCompositionEnd","hanldeCreateSession","SearchInput","forwardRef","showDialog","WrappedModal","onClose","onConfirm","onCancel","onOpen","WrappedForm","onValuesChange","onValidateSuccess","onValidateError","WrappedInput","SESSION_ITEM_HEIGHT","BUFFER_NUMBER","CACHE_HEIGHT","SessionList","sessionEnd","sessionLoading","sessionList","querySessionHistory","updateSession","sessionWrapperRef","sessionListRef","searchQueryRef","editModalRef","editFormRef","editRawDataRef","editConversationIdRef","getFitLimit","limit","sessionWrapper","floor","checkSessionList","debounce","handleSearch","handleSearchEnter","handleEditSession","rawData","_editFormRef$current","_editModalRef$current","setInitValue","handleEditModalConfirm","_editFormRef$current2","validate","handleEditFormSubmit","detail","_editModalRef$current2","close","onScroll","SessionItem","modalTitle","maskClosable","closeWhenConfirm","layout","label","activeSessionId","checkSession","deleteSession","handleCheckSession","handleDeleteSession","stopPropagation","expect","handleEditSessionItem","NEW_SESSION_ID","_debug","WeakMap","_ctrl","_agentId","_robotId","_enterInterval","_chatting","_isStartEmitEvent","_emitTimer","_messageQueue","_subscribers","_conversationId","_answerLanguage","_sessionNextToken","_cacheLimit","_cacheQuery","_messageNextToken","_useSpiltWord","_ChatService_brand","WeakSet","ChatService","constructor","enterInterval","debug","answerLanguage","useSpiltWord","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_classPrivateFieldSet","this","enqueue","_classPrivateFieldGet","_assertClassBrand","_startEmitEvent","call","dequeue","shift","getMessageQueue","subscribe","topic","callback","unsubscribe","cb","notifySubscribers","setChatItemIsLike","flag","code","http","request","method","stringify","setAgentId","setConversationId","getSessionHistory","query","_classPrivateFieldGet2","conversations","next_token","getChatHistory","conversationIds","updateData","getCustomSplit","Symbol","cache","matchStr","substring","splitWord","Intl","iterator","Segmenter","granularity","segment","nextWord","next","done","customSplit","chat","AbortController","hadMatchMessage","fetchEventSource","signal","openWhenHidden","stream","input","headers","onopen","log","onmessage","abort","isGeneralTextType","wordList","delta","chunkedWords","maxChunks","minChunks","chunkSize","ceil","random","chunk","_result$delta$role","_result$delta$role2","pick","_result","_result2","SENSITIVE_WORDS_ERROR","EXCEED_TOKENS_ERROR","onclose","onerror","stop","_classPrivateFieldGet3","clearTimeout","_clear","messageItem","getRandomInterval","messagesInQueue","GENERAL_TEXT_TYPES","useChatViewInfo","sessionId","setSessionEnd","setSessionLoading","setActiveSessionId","setLoading","setChatting","setSessionList","setMsgLoading","setMsgEnd","setMsgList","chattingMessageItem","sessionSearchQuery","haveCreatedSession","setToolNames","Map","toolNameRequests","fetchToolName","toolId","has","promise","InstanceApi_postSearchV3","fields","res","pre","newMap","chatService","defaultNewSessionItem","preList","newList","allToolCalls","originalCall","callId","isArray","unshift","uniqueId","output","inputTime","computedList","concat","filterIds","ids","deleteActiveSession","hasNewOne","newSessionList","inputMsg","handleSessionEnd","listener","_msgItem","_chattingMessageItem$","_chattingMessageItem$2","_chattingMessageItem$3","_chattingMessageItem$4","_chattingMessageItem$5","_chattingMessageItem$6","_chattingMessageItem$7","_chattingMessageItem$8","msgItemData","tool_calls","generalSameType","isStart","isUpdate","a","b","thisMessage","tool_call_id","pop","reset","finishListener","_item$toolCalls","fetchEndListener","stopListener","stopMessageItem","___CSS_LOADER_EXPORT___","module","___CSS_LOADER_URL_IMPORT_0___","URL","___CSS_LOADER_URL_REPLACEMENT_0___","___CSS_LOADER_URL_IMPORT_1___","___CSS_LOADER_URL_REPLACEMENT_1___","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals"],"sourceRoot":""}
|