@chat-lab/ui 0.1.0-beta.52 → 0.1.0-beta.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Chatkit/index.cjs +5 -5
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.js +5 -5
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/Chatkit/types.d.ts +1 -0
- package/dist/components/Chatkit/types.d.ts.map +1 -1
- package/dist/components/assistant-ui/attachment.cjs +7 -58
- package/dist/components/assistant-ui/attachment.cjs.map +1 -1
- package/dist/components/assistant-ui/attachment.d.ts.map +1 -1
- package/dist/components/assistant-ui/attachment.js +8 -59
- package/dist/components/assistant-ui/attachment.js.map +1 -1
- package/dist/components/assistant-ui/message-components-with-avatar.cjs +8 -2
- package/dist/components/assistant-ui/message-components-with-avatar.cjs.map +1 -1
- package/dist/components/assistant-ui/message-components-with-avatar.d.ts +2 -4
- package/dist/components/assistant-ui/message-components-with-avatar.d.ts.map +1 -1
- package/dist/components/assistant-ui/message-components-with-avatar.js +8 -2
- package/dist/components/assistant-ui/message-components-with-avatar.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +0 -1
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.js +0 -1
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/components/assistant-ui-tools/skill-agent-tool-set.cjs +52 -7
- package/dist/components/assistant-ui-tools/skill-agent-tool-set.cjs.map +1 -1
- package/dist/components/assistant-ui-tools/skill-agent-tool-set.d.ts.map +1 -1
- package/dist/components/assistant-ui-tools/skill-agent-tool-set.js +53 -8
- package/dist/components/assistant-ui-tools/skill-agent-tool-set.js.map +1 -1
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.cjs +23 -14
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.cjs.map +1 -1
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.d.ts +2 -2
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.d.ts.map +1 -1
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.js +23 -14
- package/dist/hooks/useSkillAgent/SkillAgentPlugin.js.map +1 -1
- package/dist/hooks/useSkillAgent/index.cjs +15 -3
- package/dist/hooks/useSkillAgent/index.cjs.map +1 -1
- package/dist/hooks/useSkillAgent/index.d.ts +1 -1
- package/dist/hooks/useSkillAgent/index.d.ts.map +1 -1
- package/dist/hooks/useSkillAgent/index.js +16 -4
- package/dist/hooks/useSkillAgent/index.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniqueId.cjs +31 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniqueId.cjs.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniqueId.js +29 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniqueId.js.map +1 -0
- package/dist/packages/core/dist/index.cjs +13 -12
- package/dist/packages/core/dist/index.cjs.map +1 -1
- package/dist/packages/core/dist/index.js +13 -12
- package/dist/packages/core/dist/index.js.map +1 -1
- package/dist/utils/convertToAssistantMessage.cjs +44 -16
- package/dist/utils/convertToAssistantMessage.cjs.map +1 -1
- package/dist/utils/convertToAssistantMessage.d.ts.map +1 -1
- package/dist/utils/convertToAssistantMessage.js +44 -16
- package/dist/utils/convertToAssistantMessage.js.map +1 -1
- package/dist/utils/deepAssign.cjs +31 -0
- package/dist/utils/deepAssign.cjs.map +1 -0
- package/dist/utils/deepAssign.d.ts +2 -0
- package/dist/utils/deepAssign.d.ts.map +1 -0
- package/dist/utils/deepAssign.js +29 -0
- package/dist/utils/deepAssign.js.map +1 -0
- package/package.json +1 -1
|
@@ -24,12 +24,12 @@ var react = require('../../node_modules/.pnpm/valtio@2.1.8_patch_hash_boxi3qpsg2
|
|
|
24
24
|
|
|
25
25
|
const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
26
26
|
const { t } = I18nContext.useI18n();
|
|
27
|
-
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList: threadList$1, showHeader = true, renderHeader, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false,
|
|
27
|
+
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList: threadList$1, showHeader = true, renderHeader, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, accept, } = props;
|
|
28
28
|
const controller = props.controller;
|
|
29
29
|
const { threadMap, currentThreadId } = react.useSnapshot(controller.store.state);
|
|
30
30
|
// useImperativeHandleChatkitRef(ref, controller, onError);
|
|
31
31
|
const currentThread = currentThreadId ? threadMap[currentThreadId] : null;
|
|
32
|
-
const messages =
|
|
32
|
+
const messages = currentThread?.messages || [];
|
|
33
33
|
const { uiMessages, authors } = React.useMemo(() => convertToAssistantMessage(messages, {
|
|
34
34
|
toolDisplay: toolDisplay || 'group',
|
|
35
35
|
}), [messages]);
|
|
@@ -39,7 +39,7 @@ const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
|
39
39
|
isDisabled: !!currentThread?.metadata['isInitingSession'],
|
|
40
40
|
convertMessage: message => message,
|
|
41
41
|
onNew: async (message) => {
|
|
42
|
-
const attachments =
|
|
42
|
+
const attachments = uploadBase64
|
|
43
43
|
? await Promise.all(message.attachments?.map(async (item) => {
|
|
44
44
|
return {
|
|
45
45
|
...item,
|
|
@@ -165,13 +165,13 @@ const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
|
165
165
|
})) : (jsxRuntime.jsx(threadList, {}))), jsxRuntime.jsx("div", { className: "flex-1 h-full w-[calc(100%-200px)]", children: jsxRuntime.jsxs(reactResizablePanels.Group, { orientation: "vertical", style: { height: '100%', width: '100%' }, children: [jsxRuntime.jsx(reactResizablePanels.Panel, { children: jsxRuntime.jsx(thread.Thread, { welcome: welcome, recommends: recommends }) }), selectedSpan && (jsxRuntime.jsx(reactResizablePanels.Panel, { defaultSize: '30%', children: jsxRuntime.jsx(TraceDetail, { selectedSpan: selectedSpan || undefined, onCancel: () => setSelectedSpan(null) }) })), threadBottom] }) })] }), (tools || []).map((tool, index) => React.createElement(tool)), jsxRuntime.jsx(executionCard, {})] }) }, currentThreadId));
|
|
166
166
|
});
|
|
167
167
|
const Chatkit = (props) => {
|
|
168
|
-
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, debugger: debuggerProps, locale, accept, } = props;
|
|
168
|
+
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, debugger: debuggerProps, locale, accept, uploadBase64, } = props;
|
|
169
169
|
const controllerRef = React.useRef(chatControllerFromProps);
|
|
170
170
|
const controller = controllerRef.current;
|
|
171
171
|
const { currentThreadId, threadMap } = react.useSnapshot(controller.store.state);
|
|
172
172
|
const currentThread = currentThreadId ? threadMap[currentThreadId] : null;
|
|
173
173
|
const messages = React.useMemo(() => threadMap[currentThread?.id || '']?.messages || [], [currentThread?.id, threadMap]);
|
|
174
|
-
return (jsxRuntime.jsx(I18nContext.I18nProvider, { defaultLocale: locale, children: jsxRuntime.jsx("div", { className: 'chatkit-wrapper', style: { height: '100%' }, "data-chatkit": true, children: jsxRuntime.jsxs(reactResizablePanels.Group, { style: { height: '100%' }, children: [jsxRuntime.jsx(reactResizablePanels.Panel, { minSize: 750, maxSize: 900, children: jsxRuntime.jsx(ChatkitImpl, { tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept }, currentThreadId) }), debuggerProps && (jsxRuntime.jsx(reactResizablePanels.Panel, { defaultSize: '25%', className: "border-l", children: jsxRuntime.jsx(index$1, { region: debuggerProps.region, controller: controller, thread: currentThread, messages: (messages.filter(msg => msg.role !== 'user') || []) }) }))] }) }) }));
|
|
174
|
+
return (jsxRuntime.jsx(I18nContext.I18nProvider, { defaultLocale: locale, children: jsxRuntime.jsx("div", { className: 'chatkit-wrapper', style: { height: '100%' }, "data-chatkit": true, children: jsxRuntime.jsxs(reactResizablePanels.Group, { style: { height: '100%' }, children: [jsxRuntime.jsx(reactResizablePanels.Panel, { minSize: 750, maxSize: 900, children: jsxRuntime.jsx(ChatkitImpl, { uploadBase64: uploadBase64, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept }, currentThreadId) }), debuggerProps && (jsxRuntime.jsx(reactResizablePanels.Panel, { defaultSize: '25%', className: "border-l", children: jsxRuntime.jsx(index$1, { region: debuggerProps.region, controller: controller, thread: currentThread, messages: (messages.filter(msg => msg.role !== 'user') || []) }) }))] }) }) }));
|
|
175
175
|
};
|
|
176
176
|
var index = React.forwardRef(Chatkit);
|
|
177
177
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n tool,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { ChatMessage, ChatController } from '@chat-lab/core';\nimport { Group, Panel } from 'react-resizable-panels';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chat-lab/core';\nimport './style.less';\nimport TraceDetail from '@/adk/components/Debug/Trace/TraceDetail';\nimport { useTraceStore } from '@/adk/components/Debug/Trace/store';\nimport Debug from '@/adk/components/Debug';\nimport {\n BashTool,\n skillAgentToolSet,\n} from '../assistant-ui-tools/skill-agent-tool-set';\nimport React from 'react';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n tools?: React.ElementType[];\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n threadBottom?: React.ReactNode;\n showHeader?: boolean;\n renderHeader?: (props: { thread: ThreadType }) => React.ReactNode;\n\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n toolDisplay?: 'group' | 'none' | 'step';\n expandReasoning?: boolean;\n controller: ChatController;\n accept?: string;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadeBase64 = true,\n threadBottom,\n accept,\n } = props;\n const controller = props.controller;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [] || [],\n [currentThread?.id, threadMap],\n );\n\n const { uiMessages, authors } = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = uploadeBase64\n ? 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 : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n // Map media type to valid content type\n const baseMediaType = checkMedia(file.type) as\n | 'image'\n | 'video'\n | 'audio';\n const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n 'image',\n 'video',\n 'audio',\n ].includes(baseMediaType)\n ? baseMediaType\n : 'file';\n\n const contentItem: {\n type: typeof mediaType;\n image?: string;\n video?: string;\n audio?: string;\n file?: string;\n } = {\n type: mediaType,\n };\n\n switch (mediaType) {\n case 'image':\n contentItem.image = file.name;\n break;\n case 'video':\n contentItem.video = file.name;\n break;\n case 'audio':\n contentItem.audio = file.name;\n break;\n case 'file':\n contentItem.file = file.name;\n break;\n }\n\n return {\n id,\n type: mediaType,\n name: file.name,\n contentType: file.type,\n content: [contentItem],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 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 const selectedSpan = useTraceStore(state => state.selectedSpan);\n const setSelectedSpan = useTraceStore(state => state.setSelectedSpan);\n useEffect(() => () => setSelectedSpan(null), [setSelectedSpan]);\n\n return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Group\n orientation=\"vertical\"\n style={{ height: '100%', width: '100%' }}\n >\n <Panel>\n <Thread welcome={welcome} recommends={recommends} />\n </Panel>\n {selectedSpan && (\n <Panel defaultSize={'30%'}>\n <TraceDetail\n selectedSpan={selectedSpan || undefined}\n onCancel={() => setSelectedSpan(null)}\n />\n </Panel>\n )}\n {threadBottom}\n </Group>\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nconst Chatkit = (props: ChatkitProps) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n debugger: debuggerProps,\n locale,\n accept,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [],\n [currentThread?.id, threadMap],\n );\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div\n className={'chatkit-wrapper'}\n style={{ height: '100%' }}\n data-chatkit\n >\n <Group style={{ height: '100%' }}>\n <Panel minSize={750} maxSize={900}>\n <ChatkitImpl\n key={currentThreadId}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n />\n </Panel>\n {debuggerProps && (\n <Panel defaultSize={'25%'} className=\"border-l\">\n <Debug\n region={debuggerProps.region}\n controller={controller!}\n thread={currentThread}\n messages={\n (messages.filter(msg => msg.role !== 'user') || []) as any[]\n }\n />\n </Panel>\n )}\n </Group>\n </div>\n </I18nProvider>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","useI18n","threadList","useSnapshot","useMemo","useExternalStoreRuntime","convertToBase64","uuid","useTraceStore","useEffect","_jsx","AssistantRuntimeProvider","_jsxs","ChatkitProvider","ThreadList","Group","Panel","Thread","ExecutionCard","useRef","I18nProvider","Debug"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n tool,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { ChatMessage, ChatController } from '@chat-lab/core';\nimport { Group, Panel } from 'react-resizable-panels';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chat-lab/core';\nimport './style.less';\nimport TraceDetail from '@/adk/components/Debug/Trace/TraceDetail';\nimport { useTraceStore } from '@/adk/components/Debug/Trace/store';\nimport Debug from '@/adk/components/Debug';\nimport {\n BashTool,\n skillAgentToolSet,\n} from '../assistant-ui-tools/skill-agent-tool-set';\nimport React from 'react';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n uploadBase64?: boolean;\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n tools?: React.ElementType[];\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n threadBottom?: React.ReactNode;\n showHeader?: boolean;\n renderHeader?: (props: { thread: ThreadType }) => React.ReactNode;\n\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n toolDisplay?: 'group' | 'none' | 'step';\n expandReasoning?: boolean;\n controller: ChatController;\n accept?: string;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n accept,\n } = props;\n const controller = props.controller;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = uploadBase64\n ? 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 : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n // Map media type to valid content type\n const baseMediaType = checkMedia(file.type) as\n | 'image'\n | 'video'\n | 'audio';\n const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n 'image',\n 'video',\n 'audio',\n ].includes(baseMediaType)\n ? baseMediaType\n : 'file';\n\n const contentItem: {\n type: typeof mediaType;\n image?: string;\n video?: string;\n audio?: string;\n file?: string;\n } = {\n type: mediaType,\n };\n\n switch (mediaType) {\n case 'image':\n contentItem.image = file.name;\n break;\n case 'video':\n contentItem.video = file.name;\n break;\n case 'audio':\n contentItem.audio = file.name;\n break;\n case 'file':\n contentItem.file = file.name;\n break;\n }\n\n return {\n id,\n type: mediaType,\n name: file.name,\n contentType: file.type,\n content: [contentItem],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 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 const selectedSpan = useTraceStore(state => state.selectedSpan);\n const setSelectedSpan = useTraceStore(state => state.setSelectedSpan);\n useEffect(() => () => setSelectedSpan(null), [setSelectedSpan]);\n\n return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Group\n orientation=\"vertical\"\n style={{ height: '100%', width: '100%' }}\n >\n <Panel>\n <Thread welcome={welcome} recommends={recommends} />\n </Panel>\n {selectedSpan && (\n <Panel defaultSize={'30%'}>\n <TraceDetail\n selectedSpan={selectedSpan || undefined}\n onCancel={() => setSelectedSpan(null)}\n />\n </Panel>\n )}\n {threadBottom}\n </Group>\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nconst Chatkit = (props: ChatkitProps) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n debugger: debuggerProps,\n locale,\n accept,\n uploadBase64,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [],\n [currentThread?.id, threadMap],\n );\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div\n className={'chatkit-wrapper'}\n style={{ height: '100%' }}\n data-chatkit\n >\n <Group style={{ height: '100%' }}>\n <Panel minSize={750} maxSize={900}>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n />\n </Panel>\n {debuggerProps && (\n <Panel defaultSize={'25%'} className=\"border-l\">\n <Debug\n region={debuggerProps.region}\n controller={controller!}\n thread={currentThread}\n messages={\n (messages.filter(msg => msg.role !== 'user') || []) as any[]\n }\n />\n </Panel>\n )}\n </Group>\n </div>\n </I18nProvider>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","useI18n","threadList","useSnapshot","useMemo","useExternalStoreRuntime","convertToBase64","uuid","useTraceStore","useEffect","_jsx","AssistantRuntimeProvider","_jsxs","ChatkitProvider","ThreadList","Group","Panel","Thread","ExecutionCard","useRef","I18nProvider","Debug"],"mappings":"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"}
|
|
@@ -22,12 +22,12 @@ import { useSnapshot } from '../../node_modules/.pnpm/valtio@2.1.8_patch_hash_bo
|
|
|
22
22
|
|
|
23
23
|
const ChatkitImpl = forwardRef((props, ref) => {
|
|
24
24
|
const { t } = useI18n();
|
|
25
|
-
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false,
|
|
25
|
+
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, accept, } = props;
|
|
26
26
|
const controller = props.controller;
|
|
27
27
|
const { threadMap, currentThreadId } = useSnapshot(controller.store.state);
|
|
28
28
|
// useImperativeHandleChatkitRef(ref, controller, onError);
|
|
29
29
|
const currentThread = currentThreadId ? threadMap[currentThreadId] : null;
|
|
30
|
-
const messages =
|
|
30
|
+
const messages = currentThread?.messages || [];
|
|
31
31
|
const { uiMessages, authors } = useMemo(() => convertToAssistantMessage(messages, {
|
|
32
32
|
toolDisplay: toolDisplay || 'group',
|
|
33
33
|
}), [messages]);
|
|
@@ -37,7 +37,7 @@ const ChatkitImpl = forwardRef((props, ref) => {
|
|
|
37
37
|
isDisabled: !!currentThread?.metadata['isInitingSession'],
|
|
38
38
|
convertMessage: message => message,
|
|
39
39
|
onNew: async (message) => {
|
|
40
|
-
const attachments =
|
|
40
|
+
const attachments = uploadBase64
|
|
41
41
|
? await Promise.all(message.attachments?.map(async (item) => {
|
|
42
42
|
return {
|
|
43
43
|
...item,
|
|
@@ -163,13 +163,13 @@ const ChatkitImpl = forwardRef((props, ref) => {
|
|
|
163
163
|
})) : (jsx(ThreadList, {}))), jsx("div", { className: "flex-1 h-full w-[calc(100%-200px)]", children: jsxs(Tt, { orientation: "vertical", style: { height: '100%', width: '100%' }, children: [jsx($t, { children: jsx(Thread, { welcome: welcome, recommends: recommends }) }), selectedSpan && (jsx($t, { defaultSize: '30%', children: jsx(TraceDetail, { selectedSpan: selectedSpan || undefined, onCancel: () => setSelectedSpan(null) }) })), threadBottom] }) })] }), (tools || []).map((tool, index) => React__default.createElement(tool)), jsx(ExecutionCard, {})] }) }, currentThreadId));
|
|
164
164
|
});
|
|
165
165
|
const Chatkit = (props) => {
|
|
166
|
-
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, debugger: debuggerProps, locale, accept, } = props;
|
|
166
|
+
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, debugger: debuggerProps, locale, accept, uploadBase64, } = props;
|
|
167
167
|
const controllerRef = useRef(chatControllerFromProps);
|
|
168
168
|
const controller = controllerRef.current;
|
|
169
169
|
const { currentThreadId, threadMap } = useSnapshot(controller.store.state);
|
|
170
170
|
const currentThread = currentThreadId ? threadMap[currentThreadId] : null;
|
|
171
171
|
const messages = useMemo(() => threadMap[currentThread?.id || '']?.messages || [], [currentThread?.id, threadMap]);
|
|
172
|
-
return (jsx(I18nProvider, { defaultLocale: locale, children: jsx("div", { className: 'chatkit-wrapper', style: { height: '100%' }, "data-chatkit": true, children: jsxs(Tt, { style: { height: '100%' }, children: [jsx($t, { minSize: 750, maxSize: 900, children: jsx(ChatkitImpl, { tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept }, currentThreadId) }), debuggerProps && (jsx($t, { defaultSize: '25%', className: "border-l", children: jsx(ADK, { region: debuggerProps.region, controller: controller, thread: currentThread, messages: (messages.filter(msg => msg.role !== 'user') || []) }) }))] }) }) }));
|
|
172
|
+
return (jsx(I18nProvider, { defaultLocale: locale, children: jsx("div", { className: 'chatkit-wrapper', style: { height: '100%' }, "data-chatkit": true, children: jsxs(Tt, { style: { height: '100%' }, children: [jsx($t, { minSize: 750, maxSize: 900, children: jsx(ChatkitImpl, { uploadBase64: uploadBase64, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept }, currentThreadId) }), debuggerProps && (jsx($t, { defaultSize: '25%', className: "border-l", children: jsx(ADK, { region: debuggerProps.region, controller: controller, thread: currentThread, messages: (messages.filter(msg => msg.role !== 'user') || []) }) }))] }) }) }));
|
|
173
173
|
};
|
|
174
174
|
var index = forwardRef(Chatkit);
|
|
175
175
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n tool,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { ChatMessage, ChatController } from '@chat-lab/core';\nimport { Group, Panel } from 'react-resizable-panels';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chat-lab/core';\nimport './style.less';\nimport TraceDetail from '@/adk/components/Debug/Trace/TraceDetail';\nimport { useTraceStore } from '@/adk/components/Debug/Trace/store';\nimport Debug from '@/adk/components/Debug';\nimport {\n BashTool,\n skillAgentToolSet,\n} from '../assistant-ui-tools/skill-agent-tool-set';\nimport React from 'react';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n tools?: React.ElementType[];\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n threadBottom?: React.ReactNode;\n showHeader?: boolean;\n renderHeader?: (props: { thread: ThreadType }) => React.ReactNode;\n\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n toolDisplay?: 'group' | 'none' | 'step';\n expandReasoning?: boolean;\n controller: ChatController;\n accept?: string;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadeBase64 = true,\n threadBottom,\n accept,\n } = props;\n const controller = props.controller;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [] || [],\n [currentThread?.id, threadMap],\n );\n\n const { uiMessages, authors } = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = uploadeBase64\n ? 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 : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n // Map media type to valid content type\n const baseMediaType = checkMedia(file.type) as\n | 'image'\n | 'video'\n | 'audio';\n const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n 'image',\n 'video',\n 'audio',\n ].includes(baseMediaType)\n ? baseMediaType\n : 'file';\n\n const contentItem: {\n type: typeof mediaType;\n image?: string;\n video?: string;\n audio?: string;\n file?: string;\n } = {\n type: mediaType,\n };\n\n switch (mediaType) {\n case 'image':\n contentItem.image = file.name;\n break;\n case 'video':\n contentItem.video = file.name;\n break;\n case 'audio':\n contentItem.audio = file.name;\n break;\n case 'file':\n contentItem.file = file.name;\n break;\n }\n\n return {\n id,\n type: mediaType,\n name: file.name,\n contentType: file.type,\n content: [contentItem],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 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 const selectedSpan = useTraceStore(state => state.selectedSpan);\n const setSelectedSpan = useTraceStore(state => state.setSelectedSpan);\n useEffect(() => () => setSelectedSpan(null), [setSelectedSpan]);\n\n return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Group\n orientation=\"vertical\"\n style={{ height: '100%', width: '100%' }}\n >\n <Panel>\n <Thread welcome={welcome} recommends={recommends} />\n </Panel>\n {selectedSpan && (\n <Panel defaultSize={'30%'}>\n <TraceDetail\n selectedSpan={selectedSpan || undefined}\n onCancel={() => setSelectedSpan(null)}\n />\n </Panel>\n )}\n {threadBottom}\n </Group>\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nconst Chatkit = (props: ChatkitProps) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n debugger: debuggerProps,\n locale,\n accept,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [],\n [currentThread?.id, threadMap],\n );\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div\n className={'chatkit-wrapper'}\n style={{ height: '100%' }}\n data-chatkit\n >\n <Group style={{ height: '100%' }}>\n <Panel minSize={750} maxSize={900}>\n <ChatkitImpl\n key={currentThreadId}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n />\n </Panel>\n {debuggerProps && (\n <Panel defaultSize={'25%'} className=\"border-l\">\n <Debug\n region={debuggerProps.region}\n controller={controller!}\n thread={currentThread}\n messages={\n (messages.filter(msg => msg.role !== 'user') || []) as any[]\n }\n />\n </Panel>\n )}\n </Group>\n </div>\n </I18nProvider>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["uuid","_jsx","_jsxs","Group","Panel","React","Debug"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n tool,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { ChatMessage, ChatController } from '@chat-lab/core';\nimport { Group, Panel } from 'react-resizable-panels';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chat-lab/core';\nimport './style.less';\nimport TraceDetail from '@/adk/components/Debug/Trace/TraceDetail';\nimport { useTraceStore } from '@/adk/components/Debug/Trace/store';\nimport Debug from '@/adk/components/Debug';\nimport {\n BashTool,\n skillAgentToolSet,\n} from '../assistant-ui-tools/skill-agent-tool-set';\nimport React from 'react';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n uploadBase64?: boolean;\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n tools?: React.ElementType[];\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n threadBottom?: React.ReactNode;\n showHeader?: boolean;\n renderHeader?: (props: { thread: ThreadType }) => React.ReactNode;\n\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n toolDisplay?: 'group' | 'none' | 'step';\n expandReasoning?: boolean;\n controller: ChatController;\n accept?: string;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n accept,\n } = props;\n const controller = props.controller;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = uploadBase64\n ? 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 : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n // Map media type to valid content type\n const baseMediaType = checkMedia(file.type) as\n | 'image'\n | 'video'\n | 'audio';\n const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n 'image',\n 'video',\n 'audio',\n ].includes(baseMediaType)\n ? baseMediaType\n : 'file';\n\n const contentItem: {\n type: typeof mediaType;\n image?: string;\n video?: string;\n audio?: string;\n file?: string;\n } = {\n type: mediaType,\n };\n\n switch (mediaType) {\n case 'image':\n contentItem.image = file.name;\n break;\n case 'video':\n contentItem.video = file.name;\n break;\n case 'audio':\n contentItem.audio = file.name;\n break;\n case 'file':\n contentItem.file = file.name;\n break;\n }\n\n return {\n id,\n type: mediaType,\n name: file.name,\n contentType: file.type,\n content: [contentItem],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 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 const selectedSpan = useTraceStore(state => state.selectedSpan);\n const setSelectedSpan = useTraceStore(state => state.setSelectedSpan);\n useEffect(() => () => setSelectedSpan(null), [setSelectedSpan]);\n\n return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Group\n orientation=\"vertical\"\n style={{ height: '100%', width: '100%' }}\n >\n <Panel>\n <Thread welcome={welcome} recommends={recommends} />\n </Panel>\n {selectedSpan && (\n <Panel defaultSize={'30%'}>\n <TraceDetail\n selectedSpan={selectedSpan || undefined}\n onCancel={() => setSelectedSpan(null)}\n />\n </Panel>\n )}\n {threadBottom}\n </Group>\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nconst Chatkit = (props: ChatkitProps) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n debugger: debuggerProps,\n locale,\n accept,\n uploadBase64,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n\n const messages = useMemo(\n () => threadMap[currentThread?.id || '']?.messages || [],\n [currentThread?.id, threadMap],\n );\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div\n className={'chatkit-wrapper'}\n style={{ height: '100%' }}\n data-chatkit\n >\n <Group style={{ height: '100%' }}>\n <Panel minSize={750} maxSize={900}>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n />\n </Panel>\n {debuggerProps && (\n <Panel defaultSize={'25%'} className=\"border-l\">\n <Debug\n region={debuggerProps.region}\n controller={controller!}\n thread={currentThread}\n messages={\n (messages.filter(msg => msg.role !== 'user') || []) as any[]\n }\n />\n </Panel>\n )}\n </Group>\n </div>\n </I18nProvider>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["uuid","_jsx","_jsxs","Group","Panel","React","Debug"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,MAAM,EACP,MAAM,gBAAgB,CAAC;AAKxB,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EACP,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,GACtD,OAAO,CAAC;IACZ,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,aAAa,EAAE;QACb,eAAe,EAAE,kBAAkB,CAAC;QACpC,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
|
|
4
|
+
require('react');
|
|
5
5
|
var tooltip = require('../ui/tooltip.cjs');
|
|
6
|
-
var dialog = require('../ui/dialog.cjs');
|
|
7
|
-
var avatar = require('../ui/avatar.cjs');
|
|
8
|
-
var tooltipIconButton = require('./tooltip-icon-button.cjs');
|
|
9
6
|
var utils = require('../../lib/utils.cjs');
|
|
7
|
+
var tooltipIconButton = require('./tooltip-icon-button.cjs');
|
|
10
8
|
var Attachment = require('../../assets/Attachment.cjs');
|
|
11
|
-
var x = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/x.cjs');
|
|
12
9
|
var fileText = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/file-text.cjs');
|
|
13
|
-
var
|
|
10
|
+
var x = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/x.cjs');
|
|
14
11
|
var ComposerAddAttachment$1 = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/composer/ComposerAddAttachment.cjs');
|
|
15
12
|
var MessageAttachments = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/message/MessageAttachments.cjs');
|
|
16
13
|
var ComposerAttachments$1 = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/composer/ComposerAttachments.cjs');
|
|
@@ -20,56 +17,11 @@ var AttachmentRoot = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.
|
|
|
20
17
|
var AttachmentName = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/attachment/AttachmentName.cjs');
|
|
21
18
|
var AttachmentRemove$1 = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/attachment/AttachmentRemove.cjs');
|
|
22
19
|
|
|
23
|
-
const useFileSrc = (file) => {
|
|
24
|
-
const [src, setSrc] = React.useState(undefined);
|
|
25
|
-
React.useEffect(() => {
|
|
26
|
-
if (!file) {
|
|
27
|
-
setSrc(undefined);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const objectUrl = URL.createObjectURL(file);
|
|
31
|
-
setSrc(objectUrl);
|
|
32
|
-
return () => {
|
|
33
|
-
URL.revokeObjectURL(objectUrl);
|
|
34
|
-
};
|
|
35
|
-
}, [file]);
|
|
36
|
-
return src;
|
|
37
|
-
};
|
|
38
|
-
const useAttachmentSrc = () => {
|
|
39
|
-
const { file, src } = useAssistantState.useAssistantState(shallow.useShallow(({ attachment }) => {
|
|
40
|
-
if (attachment.type !== 'image')
|
|
41
|
-
return {};
|
|
42
|
-
if (attachment.file)
|
|
43
|
-
return { file: attachment.file };
|
|
44
|
-
const src = attachment.content?.filter(c => c.type === 'image')[0]?.image;
|
|
45
|
-
if (!src)
|
|
46
|
-
return {};
|
|
47
|
-
return { src };
|
|
48
|
-
}));
|
|
49
|
-
return useFileSrc(file) ?? src;
|
|
50
|
-
};
|
|
51
|
-
const AttachmentPreview = ({ src }) => {
|
|
52
|
-
const [isLoaded, setIsLoaded] = React.useState(false);
|
|
53
|
-
return (jsxRuntime.jsx("img", { src: src, alt: "Image Preview", width: 1, height: 1, className: isLoaded
|
|
54
|
-
? 'aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain'
|
|
55
|
-
: 'aui-attachment-preview-image-loading hidden', onLoadCapture: () => setIsLoaded(true) }));
|
|
56
|
-
};
|
|
57
|
-
const AttachmentPreviewDialog = ({ children, }) => {
|
|
58
|
-
const src = useAttachmentSrc();
|
|
59
|
-
if (!src)
|
|
60
|
-
return children;
|
|
61
|
-
return (jsxRuntime.jsxs(dialog.Dialog, { children: [jsxRuntime.jsx(dialog.DialogTrigger, { className: "aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50", asChild: true, children: children }), jsxRuntime.jsxs(dialog.DialogContent, { className: "aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive", children: [jsxRuntime.jsx(dialog.DialogTitle, { className: "aui-sr-only sr-only", children: "Image Attachment Preview" }), jsxRuntime.jsx(dialog.DialogDescription, { className: "sr-only", children: "Preview of attached image file" }), jsxRuntime.jsx("div", { className: "aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background", children: jsxRuntime.jsx(AttachmentPreview, { src: src }) })] })] }));
|
|
62
|
-
};
|
|
63
|
-
const AttachmentThumb = () => {
|
|
64
|
-
const isImage = useAssistantState.useAssistantState(({ attachment }) => attachment.type === 'image');
|
|
65
|
-
const src = useAttachmentSrc();
|
|
66
|
-
return (jsxRuntime.jsxs(avatar.Avatar, { className: "aui-attachment-tile-avatar h-full w-full rounded-none", children: [jsxRuntime.jsx(avatar.AvatarImage, { src: src, alt: "Attachment preview", className: "aui-attachment-tile-image object-cover" }), jsxRuntime.jsx(avatar.AvatarFallback, { delayMs: isImage ? 200 : 0, children: jsxRuntime.jsx(fileText.default, { className: "aui-attachment-tile-fallback-icon size-8 text-muted-foreground" }) })] }));
|
|
67
|
-
};
|
|
68
20
|
const AttachmentUI = () => {
|
|
69
21
|
const api = AssistantApiContext.useAssistantApi();
|
|
70
22
|
const isComposer = api.attachment.source === 'composer';
|
|
71
23
|
const isImage = useAssistantState.useAssistantState(({ attachment }) => attachment.type === 'image');
|
|
72
|
-
|
|
24
|
+
useAssistantState.useAssistantState(({ attachment }) => {
|
|
73
25
|
const type = attachment.type;
|
|
74
26
|
switch (type) {
|
|
75
27
|
case 'image':
|
|
@@ -78,14 +30,11 @@ const AttachmentUI = () => {
|
|
|
78
30
|
return 'Document';
|
|
79
31
|
case 'file':
|
|
80
32
|
return 'File';
|
|
81
|
-
default:
|
|
82
|
-
const _exhaustiveCheck = type;
|
|
83
|
-
throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
|
|
84
33
|
}
|
|
85
34
|
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
35
|
+
const name = useAssistantState.useAssistantState(({ attachment }) => attachment.name);
|
|
36
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(AttachmentRoot.AttachmentPrimitiveRoot, { className: utils.cn('aui-attachment-root relative', isImage &&
|
|
37
|
+
'aui-attachment-root-composer only:[&>#attachment-tile]:size-24'), children: [jsxRuntime.jsxs("div", { className: "flex flex-row items-center p-2 rounded-xl bg-muted/50 border gap-2", children: [jsxRuntime.jsx("div", { className: "h-10 w-10 bg-background rounded-lg flex items-center justify-center shrink-0", children: jsxRuntime.jsx(fileText.default, { className: "text-blue-500", size: 24 }) }), jsxRuntime.jsx("div", { className: "flex flex-col overflow-hidden max-w-[80px]", children: jsxRuntime.jsxs(tooltip.Tooltip, { children: [jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: jsxRuntime.jsx("div", { className: "truncate text-sm font-medium", children: jsxRuntime.jsx(AttachmentName.AttachmentPrimitiveName, {}) }) }), jsxRuntime.jsx(tooltip.TooltipContent, { children: jsxRuntime.jsx("div", { style: { backgroundColor: 'white', color: '#111827', padding: '8px', borderRadius: '6px', boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', border: '1px solid #e5e7eb', maxWidth: '20rem', whiteSpace: 'normal', wordBreak: 'break-all' }, children: name }) })] }) })] }), isComposer && jsxRuntime.jsx(AttachmentRemove, {})] }) }));
|
|
89
38
|
};
|
|
90
39
|
const AttachmentRemove = () => {
|
|
91
40
|
return (jsxRuntime.jsx(AttachmentRemove$1.AttachmentPrimitiveRemove, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Remove file", className: "aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black hover:[&_svg]:text-destructive", side: "top", children: jsxRuntime.jsx(x.default, { className: "aui-attachment-remove-icon size-3" }) }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.cjs","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["'use client';\n\nimport { PropsWithChildren, useEffect, useState, type FC } from 'react';\nimport { XIcon, PlusIcon, FileText } from 'lucide-react';\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from '@assistant-ui/react';\nimport { useShallow } from 'zustand/shallow';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/components/ui/tooltip';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from '@/components/ui/dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar';\nimport { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';\nimport { cn } from '@/lib/utils';\nimport AttachmentIcon from '@/assets/Attachment';\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== 'image') return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter(c => c.type === 'image')[0]?.image;\n if (!src) return {};\n return { src };\n }),\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? 'aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain'\n : 'aui-attachment-preview-image-loading hidden'\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === 'image',\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === 'composer';\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === 'image',\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case 'image':\n return 'Image';\n case 'document':\n return 'Document';\n case 'file':\n return 'File';\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);\n }\n });\n\n return (\n <Tooltip>\n <AttachmentPrimitive.Root\n className={cn(\n 'aui-attachment-root relative',\n isImage &&\n 'aui-attachment-root-composer only:[&>#attachment-tile]:size-24',\n )}\n >\n <AttachmentPreviewDialog>\n <TooltipTrigger asChild>\n <div\n className={cn(\n 'aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75',\n isComposer &&\n 'aui-attachment-tile-composer border-foreground/20',\n )}\n role=\"button\"\n id=\"attachment-tile\"\n aria-label={`${typeLabel} attachment`}\n >\n <AttachmentThumb />\n </div>\n </TooltipTrigger>\n </AttachmentPreviewDialog>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n <TooltipContent side=\"top\">\n <AttachmentPrimitive.Name />\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n className=\"aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black hover:[&_svg]:text-destructive\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["useState","useEffect","useAssistantState","useShallow","_jsx","_jsxs","Dialog","DialogTrigger","DialogContent","DialogTitle","DialogDescription","Avatar","AvatarImage","AvatarFallback","FileText","useAssistantApi","Tooltip","AttachmentPrimitive.Root","cn","TooltipTrigger","TooltipContent","AttachmentPrimitive.Name","AttachmentPrimitive.Remove","TooltipIconButton","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment","AttachmentIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attachment.cjs","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["'use client';\n\nimport { PropsWithChildren, useEffect, useState, type FC } from 'react';\nimport { XIcon, PlusIcon, FileText } from 'lucide-react';\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from '@assistant-ui/react';\nimport { useShallow } from 'zustand/shallow';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/components/ui/tooltip';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from '@/components/ui/dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar';\nimport { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';\nimport { cn } from '@/lib/utils';\nimport AttachmentIcon from '@/assets/Attachment';\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== 'image') return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter(c => c.type === 'image')[0]?.image;\n if (!src) return {};\n return { src };\n }),\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? 'aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain'\n : 'aui-attachment-preview-image-loading hidden'\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === 'image',\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === 'composer';\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === 'image',\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case 'image':\n return 'Image';\n case 'document':\n return 'Document';\n case 'file':\n return 'File';\n default:\n const _exhaustiveCheck: never = type;\n }\n });\n\n const name = useAssistantState(({ attachment }) => attachment.name);\n\n return (\n <>\n <AttachmentPrimitive.Root\n className={cn(\n 'aui-attachment-root relative',\n isImage &&\n 'aui-attachment-root-composer only:[&>#attachment-tile]:size-24',\n )}\n >\n <div className=\"flex flex-row items-center p-2 rounded-xl bg-muted/50 border gap-2\">\n <div className=\"h-10 w-10 bg-background rounded-lg flex items-center justify-center shrink-0\">\n <FileText className=\"text-blue-500\" size={24} />\n </div>\n <div className=\"flex flex-col overflow-hidden max-w-[80px]\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"truncate text-sm font-medium\">\n <AttachmentPrimitive.Name />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <div style={{ backgroundColor: 'white', color: '#111827', padding: '8px', borderRadius: '6px', boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', border: '1px solid #e5e7eb', maxWidth: '20rem', whiteSpace: 'normal', wordBreak: 'break-all' }}>\n {name}\n </div>\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n </>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n className=\"aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black hover:[&_svg]:text-destructive\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["useAssistantApi","useAssistantState","_jsx","_Fragment","_jsxs","AttachmentPrimitive.Root","cn","FileText","Tooltip","TooltipTrigger","AttachmentPrimitive.Name","TooltipContent","AttachmentPrimitive.Remove","TooltipIconButton","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment","AttachmentIcon"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/attachment.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/attachment.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AA6MxE,eAAO,MAAM,sBAAsB,EAAE,EAMpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,EAQjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,EAWnC,CAAC"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import 'react';
|
|
3
3
|
import { Tooltip, TooltipTrigger, TooltipContent } from '../ui/tooltip.js';
|
|
4
|
-
import { Dialog, DialogTrigger, DialogContent, DialogTitle, DialogDescription } from '../ui/dialog.js';
|
|
5
|
-
import { Avatar, AvatarImage, AvatarFallback } from '../ui/avatar.js';
|
|
6
|
-
import { TooltipIconButton } from './tooltip-icon-button.js';
|
|
7
4
|
import { cn } from '../../lib/utils.js';
|
|
5
|
+
import { TooltipIconButton } from './tooltip-icon-button.js';
|
|
8
6
|
import AttachmentIcon from '../../assets/Attachment.js';
|
|
9
|
-
import X from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/x.js';
|
|
10
7
|
import FileText from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/file-text.js';
|
|
11
|
-
import
|
|
8
|
+
import X from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/x.js';
|
|
12
9
|
import { ComposerPrimitiveAddAttachment } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/composer/ComposerAddAttachment.js';
|
|
13
10
|
import { MessagePrimitiveAttachments } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/message/MessageAttachments.js';
|
|
14
11
|
import { ComposerPrimitiveAttachments } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/composer/ComposerAttachments.js';
|
|
@@ -18,56 +15,11 @@ import { AttachmentPrimitiveRoot } from '../../node_modules/.pnpm/@assistant-ui_
|
|
|
18
15
|
import { AttachmentPrimitiveName } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/attachment/AttachmentName.js';
|
|
19
16
|
import { AttachmentPrimitiveRemove } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_wncib234fzw2z5h67nrdhchb2a_@types_react-dom@17.0.2_@ty_c64hu5rigivj2gtpzfqjqatr5y/node_modules/@assistant-ui/react/dist/primitives/attachment/AttachmentRemove.js';
|
|
20
17
|
|
|
21
|
-
const useFileSrc = (file) => {
|
|
22
|
-
const [src, setSrc] = useState(undefined);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!file) {
|
|
25
|
-
setSrc(undefined);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const objectUrl = URL.createObjectURL(file);
|
|
29
|
-
setSrc(objectUrl);
|
|
30
|
-
return () => {
|
|
31
|
-
URL.revokeObjectURL(objectUrl);
|
|
32
|
-
};
|
|
33
|
-
}, [file]);
|
|
34
|
-
return src;
|
|
35
|
-
};
|
|
36
|
-
const useAttachmentSrc = () => {
|
|
37
|
-
const { file, src } = useAssistantState(useShallow(({ attachment }) => {
|
|
38
|
-
if (attachment.type !== 'image')
|
|
39
|
-
return {};
|
|
40
|
-
if (attachment.file)
|
|
41
|
-
return { file: attachment.file };
|
|
42
|
-
const src = attachment.content?.filter(c => c.type === 'image')[0]?.image;
|
|
43
|
-
if (!src)
|
|
44
|
-
return {};
|
|
45
|
-
return { src };
|
|
46
|
-
}));
|
|
47
|
-
return useFileSrc(file) ?? src;
|
|
48
|
-
};
|
|
49
|
-
const AttachmentPreview = ({ src }) => {
|
|
50
|
-
const [isLoaded, setIsLoaded] = useState(false);
|
|
51
|
-
return (jsx("img", { src: src, alt: "Image Preview", width: 1, height: 1, className: isLoaded
|
|
52
|
-
? 'aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain'
|
|
53
|
-
: 'aui-attachment-preview-image-loading hidden', onLoadCapture: () => setIsLoaded(true) }));
|
|
54
|
-
};
|
|
55
|
-
const AttachmentPreviewDialog = ({ children, }) => {
|
|
56
|
-
const src = useAttachmentSrc();
|
|
57
|
-
if (!src)
|
|
58
|
-
return children;
|
|
59
|
-
return (jsxs(Dialog, { children: [jsx(DialogTrigger, { className: "aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50", asChild: true, children: children }), jsxs(DialogContent, { className: "aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive", children: [jsx(DialogTitle, { className: "aui-sr-only sr-only", children: "Image Attachment Preview" }), jsx(DialogDescription, { className: "sr-only", children: "Preview of attached image file" }), jsx("div", { className: "aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background", children: jsx(AttachmentPreview, { src: src }) })] })] }));
|
|
60
|
-
};
|
|
61
|
-
const AttachmentThumb = () => {
|
|
62
|
-
const isImage = useAssistantState(({ attachment }) => attachment.type === 'image');
|
|
63
|
-
const src = useAttachmentSrc();
|
|
64
|
-
return (jsxs(Avatar, { className: "aui-attachment-tile-avatar h-full w-full rounded-none", children: [jsx(AvatarImage, { src: src, alt: "Attachment preview", className: "aui-attachment-tile-image object-cover" }), jsx(AvatarFallback, { delayMs: isImage ? 200 : 0, children: jsx(FileText, { className: "aui-attachment-tile-fallback-icon size-8 text-muted-foreground" }) })] }));
|
|
65
|
-
};
|
|
66
18
|
const AttachmentUI = () => {
|
|
67
19
|
const api = useAssistantApi();
|
|
68
20
|
const isComposer = api.attachment.source === 'composer';
|
|
69
21
|
const isImage = useAssistantState(({ attachment }) => attachment.type === 'image');
|
|
70
|
-
|
|
22
|
+
useAssistantState(({ attachment }) => {
|
|
71
23
|
const type = attachment.type;
|
|
72
24
|
switch (type) {
|
|
73
25
|
case 'image':
|
|
@@ -76,14 +28,11 @@ const AttachmentUI = () => {
|
|
|
76
28
|
return 'Document';
|
|
77
29
|
case 'file':
|
|
78
30
|
return 'File';
|
|
79
|
-
default:
|
|
80
|
-
const _exhaustiveCheck = type;
|
|
81
|
-
throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
|
|
82
31
|
}
|
|
83
32
|
});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
33
|
+
const name = useAssistantState(({ attachment }) => attachment.name);
|
|
34
|
+
return (jsx(Fragment, { children: jsxs(AttachmentPrimitiveRoot, { className: cn('aui-attachment-root relative', isImage &&
|
|
35
|
+
'aui-attachment-root-composer only:[&>#attachment-tile]:size-24'), children: [jsxs("div", { className: "flex flex-row items-center p-2 rounded-xl bg-muted/50 border gap-2", children: [jsx("div", { className: "h-10 w-10 bg-background rounded-lg flex items-center justify-center shrink-0", children: jsx(FileText, { className: "text-blue-500", size: 24 }) }), jsx("div", { className: "flex flex-col overflow-hidden max-w-[80px]", children: jsxs(Tooltip, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("div", { className: "truncate text-sm font-medium", children: jsx(AttachmentPrimitiveName, {}) }) }), jsx(TooltipContent, { children: jsx("div", { style: { backgroundColor: 'white', color: '#111827', padding: '8px', borderRadius: '6px', boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', border: '1px solid #e5e7eb', maxWidth: '20rem', whiteSpace: 'normal', wordBreak: 'break-all' }, children: name }) })] }) })] }), isComposer && jsx(AttachmentRemove, {})] }) }));
|
|
87
36
|
};
|
|
88
37
|
const AttachmentRemove = () => {
|
|
89
38
|
return (jsx(AttachmentPrimitiveRemove, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Remove file", className: "aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black hover:[&_svg]:text-destructive", side: "top", children: jsx(X, { className: "aui-attachment-remove-icon size-3" }) }) }));
|