@chat-lab/ui 0.1.0-beta.19 → 0.1.0-beta.20

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.
@@ -127,7 +127,7 @@ const Chatkit = (props, refFromProps) => {
127
127
  file,
128
128
  };
129
129
  },
130
- accept: "image/*, video/*",
130
+ accept: "image/*",
131
131
  add: async ({ file }) => {
132
132
  return {
133
133
  file,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,WAAW,GAAGA,gBAAU,CAC5B,CACE,KAcC,EACDC,KAA6B,KAC3B;AACF,IAAA,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,cACPC,YAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,GAAG,KAAK,EACvB,gBAAgB,GAAG,KAAK,GACzB,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,EAAE,SAAS,EAAE,GAAGC,6BAAqB,EAAE,CAAC;AAC9C,IAAAC,GAA6B,CAACH,KAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC3D,IAAA,QACEI,cAAA,CAACC,8BAAe,EAAA,EACd,KAAK,EAAE;AACL,YAAA,GAAG,EAAEL,KAA0C;YAC/C,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,cAAc,EAAEC,YAAU,KAAK,KAAK;YACpC,WAAW,EAAE,WAAW,IAAI,OAAO;YACnC,UAAU;YACV,eAAe;YACf,gBAAgB;AACjB,SAAA,EAAA,QAAA,EAEDK,yBAAK,SAAS,EAAC,oBAAoB,EAChC,QAAA,EAAA,CAAAL,YAAU,KAAK,KAAK;qBAClB,OAAOA,YAAU,KAAK,UAAU,IAC/BA,YAAU,CAAC;AACT,wBAAA,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAiB;AACzD,qBAAA,CAAC,KAEFG,cAAA,CAACG,UAAU,EAAA,EAAA,CAAG,CACf,CAAC,EACJH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAC5B,QAAA,EAAAA,cAAA,CAACI,aAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAI,CAAA,EAAA,CAChD,CACF,EAAA,CAAA,EAAA,CACU,EAClB;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,KAAmB,EACnB,YAAsC,KACpC;IACF,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,GAAG,KAAK,CAAC;AAEV,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAEtC,IAAA,MAAM,EAAE,SAAS,EAAE,GAAGN,6BAAqB,EAAE,CAAC;AAC9C,IAAA,MAAM,QAAQ,GACZ,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,UAAU,GAAGO,aAAO,CACxB,MACE,yBAAyB,CAAC,QAA+B,EAAE;QACzD,WAAW,EAAE,WAAW,IAAI,OAAO;AACpC,KAAA,CAAC,EACJ,CAAC,QAAQ,CAAC,CACX,CAAC;AAEF,IAAA,MAAM,QAAQ,GAAGC,YAAM,CAAa,IAAI,CAAC,CAAC;AAE1C,IAAA,IAAI,GAAwC,CAAC;AAC7C,IAAA,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AACtC,QAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,GAAG,GAAG,QAAQ,CAAC;KAChB;AAAM,SAAA,IAAI,YAAY,KAAK,IAAI,EAAE;QAChC,GAAG,GAAG,QAAQ,CAAC;KAChB;SAAM;QACL,GAAG,GAAG,YAAY,CAAC;KACpB;IAGD,MAAM,OAAO,GAAGC,+CAAuB,CAAC;AACtC,QAAA,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,aAAa,EAAE,OAAO;AACjC,QAAA,cAAc,EAAE,CAAC,OAAO,KAAK,OAAO;AACpC,QAAA,KAAK,EAAE,OAAO,OAAO,KAAI;AACvB,YAAA,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,IAAI,KAAI;gBACtC,OAAO;AACL,oBAAA,GAAG,IAAI;AACP,oBAAA,MAAM,EAAE,MAAMC,+BAAe,CAAC,IAAI,CAAC,IAAY,CAAC;iBACjD,CAAC;AACJ,aAAC,CAAC,IAAI,EAAE,CACT,CAAC;AAEF,YAAA,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;gBACvB,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;oBACnC,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,GAAG,EAAE,IAAI,CAAC,MAAM;AAChB,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;oBAClC,QAAQ,EAAE,IAAI,CAAC,WAAW;AAC3B,iBAAA,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,CAAC;oBACf,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC9B,wBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;4BACxB,OAAO;AACL,gCAAA,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,IAAI;6BACD,CAAC;yBAClB;AACH,qBAAC,CAAC;iBACH,CAAC;AACH,aAAA,CAAC,CAAC;SACJ;AACD,QAAA,QAAQ,EAAE,OAAO,QAAQ,EAAE,MAAM,KAAI;AACnC,YAAA,IAAI,aAAa,EAAE,EAAE,IAAI,QAAQ;gBAC/B,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;iBACrD;gBACH,OAAO,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,gBAAAC,cAAK,CAAC;AACJ,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,WAAW,EAAE,UAAU;AACxB,iBAAA,CAAC,CAAC;aACJ;SACF;QACD,QAAQ,EAAE,YAAW;AACnB,YAAA,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;SAC7B;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,WAAW,EAAE;AACX,gBAAA,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAI;AACvB,oBAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACjB;gBACD,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAI;oBAC3B,OAAO;wBACL,EAAE;AACF,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,OAAO,EAAE;AACP,4BAAA;AACE,gCAAA,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,IAAI,CAAC,IAAI;AACjB,6BAAA;AACF,yBAAA;AACD,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,UAAU;AACjB,yBAAA;wBACD,IAAI;qBACL,CAAC;iBACH;AACD,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAI;oBACtB,OAAO;wBACL,IAAI;wBACJ,EAAE,EAAEC,EAAI,EAAE;AACV,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,SAAS;AACf,4BAAA,MAAM,EAAE,WAAW;AACnB,4BAAA,QAAQ,EAAE,CAAC;AACZ,yBAAA;qBACF,CAAC;iBACH;AACF,aAAA;AACF,SAAA;AACF,KAAA,CAAC,CAAC;AAEH,IAAA,QACEV,cAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAC1D,cAAA,EAAA,IAAA,EAAA,QAAA,EAAAE,eAAA,CAACS,iDAAwB,EAAC,EAAA,OAAO,EAAE,OAAO,aACxCX,cAAC,CAAA,WAAW,EACV,EAAA,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACtB,EACFA,cAAA,CAACY,eAAO,EAAA,EAAA,CAAG,EACXZ,cAAC,CAAAa,aAAa,KAAG,CACQ,EAAA,CAAA,EAAA,CACvB,EACN;AACJ,CAAC,CAAC;AAEF,YAAelB,gBAAU,CAAC,OAAO,CAAC;;;;"}
@@ -125,7 +125,7 @@ const Chatkit = (props, refFromProps) => {
125
125
  file,
126
126
  };
127
127
  },
128
- accept: "image/*, video/*",
128
+ accept: "image/*",
129
129
  add: async ({ file }) => {
130
130
  return {
131
131
  file,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":"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"}
@@ -69,7 +69,7 @@ const VoiceInput = () => {
69
69
  };
70
70
  return (jsxRuntime.jsx(tooltip.TooltipProvider, { children: jsxRuntime.jsxs(tooltip.Tooltip, { children: [jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: jsxRuntime.jsx(button.Button, { variant: isListening ? "destructive" : "ghost", size: "icon", onClick: isListening ? stopListening : startListening, disabled: !!error, className: `w-10 h-10 transition-all duration-200 ${isListening
71
71
  ? "bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8"
72
- : ""}`, children: isListening ? (jsxRuntime.jsx(micOff.default, { className: "h-5 w-5" })) : (jsxRuntime.jsx(mic.default, { className: "h-5 w-5" })) }) }), jsxRuntime.jsx(tooltip.TooltipContent, { children: jsxRuntime.jsx("p", { children: isListening ? "停止录音" : "语音输入" }) })] }) }));
72
+ : ""}`, children: isListening ? (jsxRuntime.jsx(micOff.default, { className: "h-[18px] w-[18px]" })) : (jsxRuntime.jsx(mic.default, { className: "h-[18px] w-[18px]" })) }) }), jsxRuntime.jsx(tooltip.TooltipContent, { children: jsxRuntime.jsx("p", { children: isListening ? "停止录音" : "语音输入" }) })] }) }));
73
73
  };
74
74
 
75
75
  module.exports = VoiceInput;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/VoiceInput/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Mic, MicOff } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useChatkitRef } from \"@/contexts/ChatkitContext\";\n\n// 定义语音识别相关类型\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n [index: number]: SpeechRecognitionResult;\n length: number;\n}\n\ninterface SpeechRecognitionResult {\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n length: number;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognition extends EventTarget {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\n\nconst VoiceInput: React.FC = () => {\n const [transcript, setTranscript] = useState<string>(\"\");\n const [isListening, setIsListening] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const ref = useChatkitRef();\n useEffect(() => {\n // 检查浏览器支持\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n setError(\"您的浏览器不支持语音识别功能,请使用最新版 Chrome 浏览器\");\n return;\n }\n\n // 初始化识别实例\n const recognition = new SpeechRecognition() as SpeechRecognition;\n recognition.lang = \"zh-CN\"; // 设置为中文识别\n recognition.interimResults = true; // 实时返回结果\n recognition.continuous = false; // 单次识别模式\n\n // 处理识别结果\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n if (event.results.length > 0) {\n const currentResult = event.results[0][0].transcript;\n setTranscript(currentResult);\n ref.current?.setInput(currentResult);\n }\n };\n\n // 识别结束时重置状态\n recognition.onend = () => {\n setIsListening(false);\n };\n\n recognitionRef.current = recognition;\n\n // 清理函数\n return () => {\n recognition.stop();\n };\n }, []);\n\n const startListening = () => {\n if (!recognitionRef.current || isListening) return;\n\n try {\n setIsListening(true);\n setTranscript(\"\");\n recognitionRef.current.start();\n } catch (err) {\n setError(\"启动语音识别失败,请稍后重试\");\n setIsListening(false);\n console.error(\"语音识别启动错误:\", err);\n }\n };\n const stopListening = async () => {\n if (!recognitionRef.current || !isListening) return;\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n recognitionRef.current.stop();\n setIsListening(false);\n ref.current?.setInput(transcript);\n };\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isListening ? \"destructive\" : \"ghost\"}\n size=\"icon\"\n onClick={isListening ? stopListening : startListening}\n disabled={!!error}\n className={`w-10 h-10 transition-all duration-200 ${\n isListening\n ? \"bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8\"\n : \"\"\n }`}\n >\n {isListening ? (\n <MicOff className=\"h-5 w-5\" />\n ) : (\n <Mic className=\"h-5 w-5\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isListening ? \"停止录音\" : \"语音输入\"}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nexport default VoiceInput;\n"],"names":["useState","useRef","useChatkitRef","useEffect","_jsx","TooltipProvider","_jsxs","Tooltip","TooltipTrigger","Button","MicOff","Mic","TooltipContent"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/VoiceInput/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Mic, MicOff } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useChatkitRef } from \"@/contexts/ChatkitContext\";\n\n// 定义语音识别相关类型\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n [index: number]: SpeechRecognitionResult;\n length: number;\n}\n\ninterface SpeechRecognitionResult {\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n length: number;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognition extends EventTarget {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\n\nconst VoiceInput: React.FC = () => {\n const [transcript, setTranscript] = useState<string>(\"\");\n const [isListening, setIsListening] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const ref = useChatkitRef();\n useEffect(() => {\n // 检查浏览器支持\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n setError(\"您的浏览器不支持语音识别功能,请使用最新版 Chrome 浏览器\");\n return;\n }\n\n // 初始化识别实例\n const recognition = new SpeechRecognition() as SpeechRecognition;\n recognition.lang = \"zh-CN\"; // 设置为中文识别\n recognition.interimResults = true; // 实时返回结果\n recognition.continuous = false; // 单次识别模式\n\n // 处理识别结果\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n if (event.results.length > 0) {\n const currentResult = event.results[0][0].transcript;\n setTranscript(currentResult);\n ref.current?.setInput(currentResult);\n }\n };\n\n // 识别结束时重置状态\n recognition.onend = () => {\n setIsListening(false);\n };\n\n recognitionRef.current = recognition;\n\n // 清理函数\n return () => {\n recognition.stop();\n };\n }, []);\n\n const startListening = () => {\n if (!recognitionRef.current || isListening) return;\n\n try {\n setIsListening(true);\n setTranscript(\"\");\n recognitionRef.current.start();\n } catch (err) {\n setError(\"启动语音识别失败,请稍后重试\");\n setIsListening(false);\n console.error(\"语音识别启动错误:\", err);\n }\n };\n const stopListening = async () => {\n if (!recognitionRef.current || !isListening) return;\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n recognitionRef.current.stop();\n setIsListening(false);\n ref.current?.setInput(transcript);\n };\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isListening ? \"destructive\" : \"ghost\"}\n size=\"icon\"\n onClick={isListening ? stopListening : startListening}\n disabled={!!error}\n className={`w-10 h-10 transition-all duration-200 ${\n isListening\n ? \"bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8\"\n : \"\"\n }`}\n >\n {isListening ? (\n <MicOff className=\"h-[18px] w-[18px]\" />\n ) : (\n <Mic className=\"h-[18px] w-[18px]\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isListening ? \"停止录音\" : \"语音输入\"}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nexport default VoiceInput;\n"],"names":["useState","useRef","useChatkitRef","useEffect","_jsx","TooltipProvider","_jsxs","Tooltip","TooltipTrigger","Button","MicOff","Mic","TooltipContent"],"mappings":"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"}
@@ -67,7 +67,7 @@ const VoiceInput = () => {
67
67
  };
68
68
  return (jsx(TooltipProvider, { children: jsxs(Tooltip, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx(Button, { variant: isListening ? "destructive" : "ghost", size: "icon", onClick: isListening ? stopListening : startListening, disabled: !!error, className: `w-10 h-10 transition-all duration-200 ${isListening
69
69
  ? "bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8"
70
- : ""}`, children: isListening ? (jsx(MicOff, { className: "h-5 w-5" })) : (jsx(Mic, { className: "h-5 w-5" })) }) }), jsx(TooltipContent, { children: jsx("p", { children: isListening ? "停止录音" : "语音输入" }) })] }) }));
70
+ : ""}`, children: isListening ? (jsx(MicOff, { className: "h-[18px] w-[18px]" })) : (jsx(Mic, { className: "h-[18px] w-[18px]" })) }) }), jsx(TooltipContent, { children: jsx("p", { children: isListening ? "停止录音" : "语音输入" }) })] }) }));
71
71
  };
72
72
 
73
73
  export { VoiceInput as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/VoiceInput/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Mic, MicOff } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useChatkitRef } from \"@/contexts/ChatkitContext\";\n\n// 定义语音识别相关类型\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n [index: number]: SpeechRecognitionResult;\n length: number;\n}\n\ninterface SpeechRecognitionResult {\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n length: number;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognition extends EventTarget {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\n\nconst VoiceInput: React.FC = () => {\n const [transcript, setTranscript] = useState<string>(\"\");\n const [isListening, setIsListening] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const ref = useChatkitRef();\n useEffect(() => {\n // 检查浏览器支持\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n setError(\"您的浏览器不支持语音识别功能,请使用最新版 Chrome 浏览器\");\n return;\n }\n\n // 初始化识别实例\n const recognition = new SpeechRecognition() as SpeechRecognition;\n recognition.lang = \"zh-CN\"; // 设置为中文识别\n recognition.interimResults = true; // 实时返回结果\n recognition.continuous = false; // 单次识别模式\n\n // 处理识别结果\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n if (event.results.length > 0) {\n const currentResult = event.results[0][0].transcript;\n setTranscript(currentResult);\n ref.current?.setInput(currentResult);\n }\n };\n\n // 识别结束时重置状态\n recognition.onend = () => {\n setIsListening(false);\n };\n\n recognitionRef.current = recognition;\n\n // 清理函数\n return () => {\n recognition.stop();\n };\n }, []);\n\n const startListening = () => {\n if (!recognitionRef.current || isListening) return;\n\n try {\n setIsListening(true);\n setTranscript(\"\");\n recognitionRef.current.start();\n } catch (err) {\n setError(\"启动语音识别失败,请稍后重试\");\n setIsListening(false);\n console.error(\"语音识别启动错误:\", err);\n }\n };\n const stopListening = async () => {\n if (!recognitionRef.current || !isListening) return;\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n recognitionRef.current.stop();\n setIsListening(false);\n ref.current?.setInput(transcript);\n };\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isListening ? \"destructive\" : \"ghost\"}\n size=\"icon\"\n onClick={isListening ? stopListening : startListening}\n disabled={!!error}\n className={`w-10 h-10 transition-all duration-200 ${\n isListening\n ? \"bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8\"\n : \"\"\n }`}\n >\n {isListening ? (\n <MicOff className=\"h-5 w-5\" />\n ) : (\n <Mic className=\"h-5 w-5\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isListening ? \"停止录音\" : \"语音输入\"}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nexport default VoiceInput;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/VoiceInput/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Mic, MicOff } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useChatkitRef } from \"@/contexts/ChatkitContext\";\n\n// 定义语音识别相关类型\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n [index: number]: SpeechRecognitionResult;\n length: number;\n}\n\ninterface SpeechRecognitionResult {\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n length: number;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognition extends EventTarget {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\n\nconst VoiceInput: React.FC = () => {\n const [transcript, setTranscript] = useState<string>(\"\");\n const [isListening, setIsListening] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const ref = useChatkitRef();\n useEffect(() => {\n // 检查浏览器支持\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n setError(\"您的浏览器不支持语音识别功能,请使用最新版 Chrome 浏览器\");\n return;\n }\n\n // 初始化识别实例\n const recognition = new SpeechRecognition() as SpeechRecognition;\n recognition.lang = \"zh-CN\"; // 设置为中文识别\n recognition.interimResults = true; // 实时返回结果\n recognition.continuous = false; // 单次识别模式\n\n // 处理识别结果\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n if (event.results.length > 0) {\n const currentResult = event.results[0][0].transcript;\n setTranscript(currentResult);\n ref.current?.setInput(currentResult);\n }\n };\n\n // 识别结束时重置状态\n recognition.onend = () => {\n setIsListening(false);\n };\n\n recognitionRef.current = recognition;\n\n // 清理函数\n return () => {\n recognition.stop();\n };\n }, []);\n\n const startListening = () => {\n if (!recognitionRef.current || isListening) return;\n\n try {\n setIsListening(true);\n setTranscript(\"\");\n recognitionRef.current.start();\n } catch (err) {\n setError(\"启动语音识别失败,请稍后重试\");\n setIsListening(false);\n console.error(\"语音识别启动错误:\", err);\n }\n };\n const stopListening = async () => {\n if (!recognitionRef.current || !isListening) return;\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n recognitionRef.current.stop();\n setIsListening(false);\n ref.current?.setInput(transcript);\n };\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isListening ? \"destructive\" : \"ghost\"}\n size=\"icon\"\n onClick={isListening ? stopListening : startListening}\n disabled={!!error}\n className={`w-10 h-10 transition-all duration-200 ${\n isListening\n ? \"bg-red-500 hover:bg-red-600 text-white animate-pulse w-8 h-8\"\n : \"\"\n }`}\n >\n {isListening ? (\n <MicOff className=\"h-[18px] w-[18px]\" />\n ) : (\n <Mic className=\"h-[18px] w-[18px]\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isListening ? \"停止录音\" : \"语音输入\"}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nexport default VoiceInput;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;AA0CM,MAAA,UAAU,GAAa,MAAK;IAChC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;AACxD,IAAA,MAAM,cAAc,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;AAC9D,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,SAAS,CAAC,MAAK;;AAEb,QAAA,MAAM,iBAAiB,GACpB,MAAc,CAAC,iBAAiB;YAChC,MAAc,CAAC,uBAAuB,CAAC;QAE1C,IAAI,CAAC,iBAAiB,EAAE;YACtB,QAAQ,CAAC,kCAAkC,CAAC,CAAC;YAC7C,OAAO;SACR;;AAGD,QAAA,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAuB,CAAC;AACjE,QAAA,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC;AAC3B,QAAA,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;AAClC,QAAA,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC;;AAG/B,QAAA,WAAW,CAAC,QAAQ,GAAG,CAAC,KAA6B,KAAI;YACvD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,gBAAA,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBACrD,aAAa,CAAC,aAAa,CAAC,CAAC;AAC7B,gBAAA,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;aACtC;AACH,SAAC,CAAC;;AAGF,QAAA,WAAW,CAAC,KAAK,GAAG,MAAK;YACvB,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,SAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;;AAGrC,QAAA,OAAO,MAAK;YACV,WAAW,CAAC,IAAI,EAAE,CAAC;AACrB,SAAC,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,WAAW;YAAE,OAAO;AAEnD,QAAA,IAAI;YACF,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,aAAa,CAAC,EAAE,CAAC,CAAC;AAClB,YAAA,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;SAChC;QAAC,OAAO,GAAG,EAAE;YACZ,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAC3B,cAAc,CAAC,KAAK,CAAC,CAAC;AACtB,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;SACjC;AACH,KAAC,CAAC;AACF,IAAA,MAAM,aAAa,GAAG,YAAW;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,WAAW;YAAE,OAAO;AACpD,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1D,QAAA,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,cAAc,CAAC,KAAK,CAAC,CAAC;AACtB,QAAA,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACpC,KAAC,CAAC;IAEF,QACEA,GAAC,CAAA,eAAe,EACd,EAAA,QAAA,EAAAC,IAAA,CAAC,OAAO,EACN,EAAA,QAAA,EAAA,CAAAD,GAAA,CAAC,cAAc,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACrBA,IAAC,MAAM,EAAA,EACL,OAAO,EAAE,WAAW,GAAG,aAAa,GAAG,OAAO,EAC9C,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,WAAW,GAAG,aAAa,GAAG,cAAc,EACrD,QAAQ,EAAE,CAAC,CAAC,KAAK,EACjB,SAAS,EAAE,CAAA,sCAAA,EACT,WAAW;AACT,8BAAE,8DAA8D;8BAC9D,EACN,CAAE,CAAA,EAAA,QAAA,EAED,WAAW,IACVA,GAAC,CAAA,MAAM,IAAC,SAAS,EAAC,mBAAmB,EAAA,CAAG,KAExCA,GAAC,CAAA,GAAG,EAAC,EAAA,SAAS,EAAC,mBAAmB,EAAA,CAAG,CACtC,EACM,CAAA,EAAA,CACM,EACjBA,GAAC,CAAA,cAAc,EACb,EAAA,QAAA,EAAAA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,WAAW,GAAG,MAAM,GAAG,MAAM,GAAK,EACvB,CAAA,CAAA,EAAA,CACT,EACM,CAAA,EAClB;AACJ;;;;"}
@@ -161,7 +161,13 @@ const AssistantActionBar = () => {
161
161
  }
162
162
  return "";
163
163
  });
164
- return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
164
+ const canDownload = useAssistantState.useAssistantState(({ message }) => {
165
+ if ((message.role !== "assistant" || message.status?.type !== "running") &&
166
+ message.parts.some((c) => c.type === "text" && c.text.length > 0)) {
167
+ return message.status?.type === "incomplete" && !!message.status.error;
168
+ }
169
+ });
170
+ return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", disabled: canDownload, onClick: () => {
165
171
  download.saveStringToMarkdown(downloadContent, "message.md");
166
172
  }, children: jsxRuntime.jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsxRuntime.jsx(ActionBarReload.ActionBarPrimitiveReload, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Refresh", children: jsxRuntime.jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
167
173
  };
@@ -1 +1 @@
1
- {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={currentThread?.messages.length === 0}\n onClick={handleCreateNewThread}\n className={cn(\n \"flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none\",\n currentThread?.messages.length === 0 && \"opacity-50 pointer-events-none\"\n )}\n >\n <ClearIcon className=\"h-[18px] w-[18px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-[10px]\">\n <div className=\"flex items-center justify-center rounded-[1px]\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB] dark:bg-border\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[18px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[18px]\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[30px] fill-white\" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","Button","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
1
+ {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={currentThread?.messages.length === 0}\n onClick={handleCreateNewThread}\n className={cn(\n \"flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none\",\n currentThread?.messages.length === 0 && \"opacity-50 pointer-events-none\"\n )}\n >\n <ClearIcon className=\"h-[18px] w-[18px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-[10px]\">\n <div className=\"flex items-center justify-center rounded-[1px]\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB] dark:bg-border\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[18px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[18px]\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[30px] fill-white\" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n const canDownload = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.status?.type === \"incomplete\" && !!message.status.error;\n }\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n disabled={canDownload}\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","Button","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
@@ -159,7 +159,13 @@ const AssistantActionBar = () => {
159
159
  }
160
160
  return "";
161
161
  });
162
- return (jsxs(ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsx(TooltipIconButton, { tooltip: "Like", children: jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsx(TooltipIconButton, { tooltip: "Dislike", children: jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsx(ActionBarPrimitiveCopy, { asChild: true, children: jsxs(TooltipIconButton, { tooltip: "Copy", children: [jsx(MessagePrimitiveIf, { copied: true, children: jsx(Check, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsx(MessagePrimitiveIf, { copied: false, children: jsx(CopyIcon, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsx(TooltipIconButton, { tooltip: "download", onClick: () => {
162
+ const canDownload = useAssistantState(({ message }) => {
163
+ if ((message.role !== "assistant" || message.status?.type !== "running") &&
164
+ message.parts.some((c) => c.type === "text" && c.text.length > 0)) {
165
+ return message.status?.type === "incomplete" && !!message.status.error;
166
+ }
167
+ });
168
+ return (jsxs(ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsx(TooltipIconButton, { tooltip: "Like", children: jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsx(TooltipIconButton, { tooltip: "Dislike", children: jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsx(ActionBarPrimitiveCopy, { asChild: true, children: jsxs(TooltipIconButton, { tooltip: "Copy", children: [jsx(MessagePrimitiveIf, { copied: true, children: jsx(Check, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsx(MessagePrimitiveIf, { copied: false, children: jsx(CopyIcon, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsx(TooltipIconButton, { tooltip: "download", disabled: canDownload, onClick: () => {
163
169
  saveStringToMarkdown(downloadContent, "message.md");
164
170
  }, children: jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsx(ActionBarPrimitiveReload, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Refresh", children: jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
165
171
  };
@@ -1 +1 @@
1
- {"version":3,"file":"thread.js","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={currentThread?.messages.length === 0}\n onClick={handleCreateNewThread}\n className={cn(\n \"flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none\",\n currentThread?.messages.length === 0 && \"opacity-50 pointer-events-none\"\n )}\n >\n <ClearIcon className=\"h-[18px] w-[18px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-[10px]\">\n <div className=\"flex items-center justify-center rounded-[1px]\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB] dark:bg-border\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[18px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[18px]\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[30px] fill-white\" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["_jsx","_jsxs","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","ArrowDownIcon","ComposerPrimitive.Root","ComposerPrimitive.Input","ComposerPrimitive.Send","ArrowUpIcon","ComposerPrimitive.Cancel","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon"],"mappings":"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"}
1
+ {"version":3,"file":"thread.js","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={currentThread?.messages.length === 0}\n onClick={handleCreateNewThread}\n className={cn(\n \"flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none\",\n currentThread?.messages.length === 0 && \"opacity-50 pointer-events-none\"\n )}\n >\n <ClearIcon className=\"h-[18px] w-[18px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-[10px]\">\n <div className=\"flex items-center justify-center rounded-[1px]\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB] dark:bg-border\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[18px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[18px]\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[30px] fill-white\" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n const canDownload = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.status?.type === \"incomplete\" && !!message.status.error;\n }\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n disabled={canDownload}\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["_jsx","_jsxs","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","ArrowDownIcon","ComposerPrimitive.Root","ComposerPrimitive.Input","ComposerPrimitive.Send","ArrowUpIcon","ComposerPrimitive.Cancel","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon"],"mappings":"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"}
@@ -97,6 +97,19 @@ const convertToAssistantMessage = (messages, options = {
97
97
  id: cur.id,
98
98
  role: cur.role,
99
99
  status,
100
+ attachments: cur.attaches?.map((item) => ({
101
+ status: { type: "complete" },
102
+ id: item.id,
103
+ name: item.id,
104
+ type: "image",
105
+ contentType: item.mimeType,
106
+ content: [
107
+ {
108
+ type: "image",
109
+ image: item.url,
110
+ },
111
+ ],
112
+ })),
100
113
  content: compact([
101
114
  cur.role === "assistant" &&
102
115
  options.toolDisplay === "group" &&
@@ -1 +1 @@
1
- {"version":3,"file":"convertToAssistantMessage.cjs","sources":["../../src/utils/convertToAssistantMessage.ts"],"sourcesContent":["import {\n MessageStatus,\n ThreadAssistantMessagePart,\n ThreadMessageLike,\n ToolCallMessagePart,\n} from \"@assistant-ui/react\";\nimport { Message, MessageStatusEnum } from \"@chatkit/core\";\nimport { compact, keys, last } from \"lodash-es\";\ntype Mutable<T> = {\n -readonly [K in keyof T]: T[K]; // -readonly 表示移除 readonly 修饰符\n};\nconst convertToAssistantMessage = (\n messages: Readonly<Message>[],\n options: { toolDisplay?: \"group\" | \"none\" | \"step\" } = {\n toolDisplay: \"group\",\n }\n) => {\n const uiMessages = messages.map<ThreadMessageLike>((cur) => {\n let status: MessageStatus | undefined = undefined;\n if (cur.role === \"assistant\") {\n status = ![MessageStatusEnum.PENDING, MessageStatusEnum.SENDING].includes(\n cur.status\n )\n ? { type: \"complete\", reason: \"stop\" }\n : { type: \"running\" };\n }\n\n const toolGroup: ToolCallMessagePart<Record<string, any>, null> = {\n type: \"tool-call\",\n toolCallId: `tool-group-${cur.id}`,\n toolName: \"tool-group\",\n args: {},\n argsText: JSON.stringify({}),\n };\n\n const content = cur.content.map((part, index) => {\n if (part.type === \"text\") {\n return {\n type: part.type,\n text: part.text,\n };\n } else if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n };\n } else if (part.type === \"image\") {\n return {\n type: part.type,\n image: part.imageUrl.url,\n };\n } else if (part.type === \"file\") {\n const data =\n part.fileUrl || `data:${part.mimeType};base64,${part.fileData}` || \"\";\n return {\n type: part.type,\n data,\n filename: part.name,\n mimeType: part.mimeType,\n };\n } else if (part.type === \"tool_call\") {\n if (options.toolDisplay === \"group\") {\n toolGroup.args[part.toolCallId] = {\n type: \"tool-call\",\n index,\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n } else if (options.toolDisplay === \"step\") {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n }\n }\n });\n\n if (cur.status === MessageStatusEnum.ERROR || cur.error) {\n return {\n id: cur.id,\n role: cur.role,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n (cur.error as { message: string }).message || (cur.error as any),\n },\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n }\n\n const uiMessage: Mutable<\n Omit<ThreadMessageLike, \"content\"> & {\n content: Exclude<ThreadMessageLike[\"content\"], string>;\n }\n > = {\n id: cur.id,\n role: cur.role,\n status,\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n return uiMessage;\n });\n return uiMessages;\n};\n\nexport default convertToAssistantMessage;\n"],"names":["MessageStatusEnum"],"mappings":"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"}
1
+ {"version":3,"file":"convertToAssistantMessage.cjs","sources":["../../src/utils/convertToAssistantMessage.ts"],"sourcesContent":["import {\n MessageStatus,\n ThreadAssistantMessagePart,\n ThreadMessageLike,\n ToolCallMessagePart,\n} from \"@assistant-ui/react\";\nimport { Message, MessageStatusEnum } from \"@chatkit/core\";\nimport { compact, keys, last } from \"lodash-es\";\ntype Mutable<T> = {\n -readonly [K in keyof T]: T[K]; // -readonly 表示移除 readonly 修饰符\n};\nconst convertToAssistantMessage = (\n messages: Readonly<Message>[],\n options: { toolDisplay?: \"group\" | \"none\" | \"step\" } = {\n toolDisplay: \"group\",\n }\n) => {\n const uiMessages = messages.map<ThreadMessageLike>((cur) => {\n let status: MessageStatus | undefined = undefined;\n if (cur.role === \"assistant\") {\n status = ![MessageStatusEnum.PENDING, MessageStatusEnum.SENDING].includes(\n cur.status\n )\n ? { type: \"complete\", reason: \"stop\" }\n : { type: \"running\" };\n }\n\n const toolGroup: ToolCallMessagePart<Record<string, any>, null> = {\n type: \"tool-call\",\n toolCallId: `tool-group-${cur.id}`,\n toolName: \"tool-group\",\n args: {},\n argsText: JSON.stringify({}),\n };\n\n const content = cur.content.map((part, index) => {\n if (part.type === \"text\") {\n return {\n type: part.type,\n text: part.text,\n };\n } else if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n };\n } else if (part.type === \"image\") {\n return {\n type: part.type,\n image: part.imageUrl.url,\n };\n } else if (part.type === \"file\") {\n const data =\n part.fileUrl || `data:${part.mimeType};base64,${part.fileData}` || \"\";\n return {\n type: part.type,\n data,\n filename: part.name,\n mimeType: part.mimeType,\n };\n } else if (part.type === \"tool_call\") {\n if (options.toolDisplay === \"group\") {\n toolGroup.args[part.toolCallId] = {\n type: \"tool-call\",\n index,\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n } else if (options.toolDisplay === \"step\") {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n }\n }\n });\n\n if (cur.status === MessageStatusEnum.ERROR || cur.error) {\n return {\n id: cur.id,\n role: cur.role,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n (cur.error as { message: string }).message || (cur.error as any),\n },\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n }\n\n const uiMessage: Mutable<\n Omit<ThreadMessageLike, \"content\"> & {\n content: Exclude<ThreadMessageLike[\"content\"], string>;\n }\n > = {\n id: cur.id,\n role: cur.role,\n status,\n attachments: cur.attaches?.map((item) => ({\n status: { type: \"complete\" },\n id: item.id,\n name: item.id,\n type: \"image\",\n contentType: item.mimeType,\n content: [\n {\n type: \"image\",\n image: item.url,\n },\n ],\n })),\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n return uiMessage;\n });\n return uiMessages;\n};\n\nexport default convertToAssistantMessage;\n"],"names":["MessageStatusEnum"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"convertToAssistantMessage.d.ts","sourceRoot":"","sources":["../../src/utils/convertToAssistantMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAqB,MAAM,eAAe,CAAC;AAK3D,QAAA,MAAM,yBAAyB,GAC7B,UAAU,QAAQ,CAAC,OAAO,CAAC,EAAE,EAC7B,UAAS;IAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;CAEjD,wBAgHF,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"convertToAssistantMessage.d.ts","sourceRoot":"","sources":["../../src/utils/convertToAssistantMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAqB,MAAM,eAAe,CAAC;AAK3D,QAAA,MAAM,yBAAyB,GAC7B,UAAU,QAAQ,CAAC,OAAO,CAAC,EAAE,EAC7B,UAAS;IAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;CAEjD,wBA6HF,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -95,6 +95,19 @@ const convertToAssistantMessage = (messages, options = {
95
95
  id: cur.id,
96
96
  role: cur.role,
97
97
  status,
98
+ attachments: cur.attaches?.map((item) => ({
99
+ status: { type: "complete" },
100
+ id: item.id,
101
+ name: item.id,
102
+ type: "image",
103
+ contentType: item.mimeType,
104
+ content: [
105
+ {
106
+ type: "image",
107
+ image: item.url,
108
+ },
109
+ ],
110
+ })),
98
111
  content: compact([
99
112
  cur.role === "assistant" &&
100
113
  options.toolDisplay === "group" &&
@@ -1 +1 @@
1
- {"version":3,"file":"convertToAssistantMessage.js","sources":["../../src/utils/convertToAssistantMessage.ts"],"sourcesContent":["import {\n MessageStatus,\n ThreadAssistantMessagePart,\n ThreadMessageLike,\n ToolCallMessagePart,\n} from \"@assistant-ui/react\";\nimport { Message, MessageStatusEnum } from \"@chatkit/core\";\nimport { compact, keys, last } from \"lodash-es\";\ntype Mutable<T> = {\n -readonly [K in keyof T]: T[K]; // -readonly 表示移除 readonly 修饰符\n};\nconst convertToAssistantMessage = (\n messages: Readonly<Message>[],\n options: { toolDisplay?: \"group\" | \"none\" | \"step\" } = {\n toolDisplay: \"group\",\n }\n) => {\n const uiMessages = messages.map<ThreadMessageLike>((cur) => {\n let status: MessageStatus | undefined = undefined;\n if (cur.role === \"assistant\") {\n status = ![MessageStatusEnum.PENDING, MessageStatusEnum.SENDING].includes(\n cur.status\n )\n ? { type: \"complete\", reason: \"stop\" }\n : { type: \"running\" };\n }\n\n const toolGroup: ToolCallMessagePart<Record<string, any>, null> = {\n type: \"tool-call\",\n toolCallId: `tool-group-${cur.id}`,\n toolName: \"tool-group\",\n args: {},\n argsText: JSON.stringify({}),\n };\n\n const content = cur.content.map((part, index) => {\n if (part.type === \"text\") {\n return {\n type: part.type,\n text: part.text,\n };\n } else if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n };\n } else if (part.type === \"image\") {\n return {\n type: part.type,\n image: part.imageUrl.url,\n };\n } else if (part.type === \"file\") {\n const data =\n part.fileUrl || `data:${part.mimeType};base64,${part.fileData}` || \"\";\n return {\n type: part.type,\n data,\n filename: part.name,\n mimeType: part.mimeType,\n };\n } else if (part.type === \"tool_call\") {\n if (options.toolDisplay === \"group\") {\n toolGroup.args[part.toolCallId] = {\n type: \"tool-call\",\n index,\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n } else if (options.toolDisplay === \"step\") {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n }\n }\n });\n\n if (cur.status === MessageStatusEnum.ERROR || cur.error) {\n return {\n id: cur.id,\n role: cur.role,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n (cur.error as { message: string }).message || (cur.error as any),\n },\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n }\n\n const uiMessage: Mutable<\n Omit<ThreadMessageLike, \"content\"> & {\n content: Exclude<ThreadMessageLike[\"content\"], string>;\n }\n > = {\n id: cur.id,\n role: cur.role,\n status,\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n return uiMessage;\n });\n return uiMessages;\n};\n\nexport default convertToAssistantMessage;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convertToAssistantMessage.js","sources":["../../src/utils/convertToAssistantMessage.ts"],"sourcesContent":["import {\n MessageStatus,\n ThreadAssistantMessagePart,\n ThreadMessageLike,\n ToolCallMessagePart,\n} from \"@assistant-ui/react\";\nimport { Message, MessageStatusEnum } from \"@chatkit/core\";\nimport { compact, keys, last } from \"lodash-es\";\ntype Mutable<T> = {\n -readonly [K in keyof T]: T[K]; // -readonly 表示移除 readonly 修饰符\n};\nconst convertToAssistantMessage = (\n messages: Readonly<Message>[],\n options: { toolDisplay?: \"group\" | \"none\" | \"step\" } = {\n toolDisplay: \"group\",\n }\n) => {\n const uiMessages = messages.map<ThreadMessageLike>((cur) => {\n let status: MessageStatus | undefined = undefined;\n if (cur.role === \"assistant\") {\n status = ![MessageStatusEnum.PENDING, MessageStatusEnum.SENDING].includes(\n cur.status\n )\n ? { type: \"complete\", reason: \"stop\" }\n : { type: \"running\" };\n }\n\n const toolGroup: ToolCallMessagePart<Record<string, any>, null> = {\n type: \"tool-call\",\n toolCallId: `tool-group-${cur.id}`,\n toolName: \"tool-group\",\n args: {},\n argsText: JSON.stringify({}),\n };\n\n const content = cur.content.map((part, index) => {\n if (part.type === \"text\") {\n return {\n type: part.type,\n text: part.text,\n };\n } else if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n };\n } else if (part.type === \"image\") {\n return {\n type: part.type,\n image: part.imageUrl.url,\n };\n } else if (part.type === \"file\") {\n const data =\n part.fileUrl || `data:${part.mimeType};base64,${part.fileData}` || \"\";\n return {\n type: part.type,\n data,\n filename: part.name,\n mimeType: part.mimeType,\n };\n } else if (part.type === \"tool_call\") {\n if (options.toolDisplay === \"group\") {\n toolGroup.args[part.toolCallId] = {\n type: \"tool-call\",\n index,\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n } else if (options.toolDisplay === \"step\") {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolCallName,\n args: part.toolCallArgs as Record<string, string>,\n argsText: JSON.stringify(part.toolCallArgs),\n result: part.content,\n };\n }\n }\n });\n\n if (cur.status === MessageStatusEnum.ERROR || cur.error) {\n return {\n id: cur.id,\n role: cur.role,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n (cur.error as { message: string }).message || (cur.error as any),\n },\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n }\n\n const uiMessage: Mutable<\n Omit<ThreadMessageLike, \"content\"> & {\n content: Exclude<ThreadMessageLike[\"content\"], string>;\n }\n > = {\n id: cur.id,\n role: cur.role,\n status,\n attachments: cur.attaches?.map((item) => ({\n status: { type: \"complete\" },\n id: item.id,\n name: item.id,\n type: \"image\",\n contentType: item.mimeType,\n content: [\n {\n type: \"image\",\n image: item.url,\n },\n ],\n })),\n content: compact([\n cur.role === \"assistant\" &&\n options.toolDisplay === \"group\" &&\n keys(toolGroup.args).length > 0\n ? toolGroup\n : undefined,\n ...(content as ThreadAssistantMessagePart[]),\n ]),\n metadata: cur.metadata,\n };\n return uiMessage;\n });\n return uiMessages;\n};\n\nexport default convertToAssistantMessage;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chat-lab/ui",
3
- "version": "0.1.0-beta.19",
3
+ "version": "0.1.0-beta.20",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",