mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-06 05:09:09 +08:00
parent
7e29d5147c
commit
304cbc814f
@ -1,22 +1,77 @@
|
|||||||
import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons'
|
import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons'
|
||||||
import { useMultiSelect } from '@renderer/pages/home/Messages/MessageSelectContext'
|
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||||
import type { Topic } from '@renderer/types'
|
import type { Message } from '@renderer/types/newMessage'
|
||||||
import { Button, Tooltip } from 'antd'
|
import { Button, Tooltip } from 'antd'
|
||||||
import { FC } from 'react'
|
import { FC, useEffect, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
interface MultiSelectActionPopupProps {
|
interface MultiSelectActionPopupProps {
|
||||||
topic: Topic
|
visible: boolean
|
||||||
|
onClose: () => void
|
||||||
|
onAction?: (action: string, messageIds: string[]) => void
|
||||||
|
topic: any
|
||||||
}
|
}
|
||||||
|
|
||||||
const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = () => {
|
interface MessageTypeInfo {
|
||||||
const { t } = useTranslation()
|
hasUserMessages: boolean
|
||||||
const { isMultiSelectMode, toggleMultiSelectMode, selectedMessageIds, handleAction } = useMultiSelect()
|
hasAssistantMessages: boolean
|
||||||
|
messageIds: string[]
|
||||||
|
}
|
||||||
|
|
||||||
if (!isMultiSelectMode) return null
|
const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = ({ visible, onClose, onAction }) => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
const [, setSelectedMessages] = useState<Message[]>([])
|
||||||
|
const [selectedMessageIds, setSelectedMessageIds] = useState<string[]>([])
|
||||||
|
const [, setMessageTypeInfo] = useState<MessageTypeInfo>({
|
||||||
|
hasUserMessages: false,
|
||||||
|
hasAssistantMessages: false,
|
||||||
|
messageIds: []
|
||||||
|
})
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleSelectedMessagesChanged = (messageIds: string[]) => {
|
||||||
|
setSelectedMessageIds(messageIds)
|
||||||
|
EventEmitter.emit('REQUEST_SELECTED_MESSAGE_DETAILS', messageIds)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSelectedMessageDetails = (messages: Message[]) => {
|
||||||
|
setSelectedMessages(messages)
|
||||||
|
|
||||||
|
const hasUserMessages = messages.some((msg) => msg.role === 'user')
|
||||||
|
const hasAssistantMessages = messages.some((msg) => msg.role === 'assistant')
|
||||||
|
|
||||||
|
setMessageTypeInfo({
|
||||||
|
hasUserMessages,
|
||||||
|
hasAssistantMessages,
|
||||||
|
messageIds: selectedMessageIds
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
EventEmitter.on(EVENT_NAMES.SELECTED_MESSAGES_CHANGED, handleSelectedMessagesChanged)
|
||||||
|
EventEmitter.on('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
EventEmitter.off(EVENT_NAMES.SELECTED_MESSAGES_CHANGED, handleSelectedMessagesChanged)
|
||||||
|
EventEmitter.off('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails)
|
||||||
|
}
|
||||||
|
}, [selectedMessageIds])
|
||||||
|
|
||||||
|
const handleAction = (action: string) => {
|
||||||
|
if (onAction) {
|
||||||
|
onAction(action, selectedMessageIds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClose = () => {
|
||||||
|
EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false)
|
||||||
|
onClose()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!visible) return null
|
||||||
|
|
||||||
// TODO: 视情况调整
|
// TODO: 视情况调整
|
||||||
|
// const isActionDisabled = selectedMessages.some((msg) => msg.role === 'user')
|
||||||
const isActionDisabled = false
|
const isActionDisabled = false
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -35,7 +90,7 @@ const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = () => {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
</ActionButtons>
|
</ActionButtons>
|
||||||
<Tooltip title={t('chat.navigation.close')}>
|
<Tooltip title={t('chat.navigation.close')}>
|
||||||
<ActionButton icon={<CloseOutlined />} onClick={() => toggleMultiSelectMode(false)} />
|
<ActionButton icon={<CloseOutlined />} onClick={handleClose} />
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</ActionBar>
|
</ActionBar>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@ -5,16 +5,21 @@ import { useAssistant } from '@renderer/hooks/useAssistant'
|
|||||||
import { useSettings } from '@renderer/hooks/useSettings'
|
import { useSettings } from '@renderer/hooks/useSettings'
|
||||||
import { useShortcut } from '@renderer/hooks/useShortcuts'
|
import { useShortcut } from '@renderer/hooks/useShortcuts'
|
||||||
import { useShowTopics } from '@renderer/hooks/useStore'
|
import { useShowTopics } from '@renderer/hooks/useStore'
|
||||||
|
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||||
|
import { RootState } from '@renderer/store'
|
||||||
|
import { messageBlocksSelectors } from '@renderer/store/messageBlock'
|
||||||
|
import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage'
|
||||||
import { Assistant, Topic } from '@renderer/types'
|
import { Assistant, Topic } from '@renderer/types'
|
||||||
import { Flex } from 'antd'
|
import { Flex, Modal } from 'antd'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
import React, { FC, useMemo, useState } from 'react'
|
import React, { FC, useEffect, useMemo, useState } from 'react'
|
||||||
import { useHotkeys } from 'react-hotkeys-hook'
|
import { useHotkeys } from 'react-hotkeys-hook'
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import { useDispatch, useSelector } from 'react-redux'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
import Inputbar from './Inputbar/Inputbar'
|
import Inputbar from './Inputbar/Inputbar'
|
||||||
import Messages from './Messages/Messages'
|
import Messages from './Messages/Messages'
|
||||||
import { MultiSelectProvider } from './Messages/MessageSelectContext'
|
|
||||||
import Tabs from './Tabs'
|
import Tabs from './Tabs'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@ -28,6 +33,16 @@ const Chat: FC<Props> = (props) => {
|
|||||||
const { assistant } = useAssistant(props.assistant.id)
|
const { assistant } = useAssistant(props.assistant.id)
|
||||||
const { topicPosition, messageStyle, showAssistants } = useSettings()
|
const { topicPosition, messageStyle, showAssistants } = useSettings()
|
||||||
const { showTopics } = useShowTopics()
|
const { showTopics } = useShowTopics()
|
||||||
|
const { t } = useTranslation()
|
||||||
|
const [isMultiSelectMode, setIsMultiSelectMode] = useState(false)
|
||||||
|
const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false)
|
||||||
|
const [messagesToDelete, setMessagesToDelete] = useState<string[]>([])
|
||||||
|
|
||||||
|
const dispatch = useDispatch()
|
||||||
|
// 从 Redux 中获取当前主题的消息
|
||||||
|
const messages = useSelector((state: RootState) => selectMessagesForTopic(state, props.activeTopic.id))
|
||||||
|
// 获取所有消息块
|
||||||
|
const messageBlocks = useSelector(messageBlocksSelectors.selectEntities)
|
||||||
|
|
||||||
const mainRef = React.useRef<HTMLDivElement>(null)
|
const mainRef = React.useRef<HTMLDivElement>(null)
|
||||||
const contentSearchRef = React.useRef<ContentSearchRef>(null)
|
const contentSearchRef = React.useRef<ContentSearchRef>(null)
|
||||||
@ -104,43 +119,159 @@ const Chat: FC<Props> = (props) => {
|
|||||||
firstUpdateOrNoFirstUpdateHandler()
|
firstUpdateOrNoFirstUpdateHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleToggleMultiSelect = (value: boolean) => {
|
||||||
|
setIsMultiSelectMode(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
EventEmitter.on(EVENT_NAMES.MESSAGE_MULTI_SELECT, handleToggleMultiSelect)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
EventEmitter.off(EVENT_NAMES.MESSAGE_MULTI_SELECT, handleToggleMultiSelect)
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleMultiSelectAction = (actionType: string, messageIds: string[]) => {
|
||||||
|
if (messageIds.length === 0) {
|
||||||
|
window.message.warning(t('chat.multiple.select.empty'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch (actionType) {
|
||||||
|
case 'delete':
|
||||||
|
setMessagesToDelete(messageIds)
|
||||||
|
setConfirmDeleteVisible(true)
|
||||||
|
break
|
||||||
|
case 'save': {
|
||||||
|
const assistantMessages = messages.filter((msg) => messageIds.includes(msg.id))
|
||||||
|
if (assistantMessages.length > 0) {
|
||||||
|
const contentToSave = assistantMessages
|
||||||
|
.map((msg) => {
|
||||||
|
return msg.blocks
|
||||||
|
.map((blockId) => {
|
||||||
|
const block = messageBlocks[blockId]
|
||||||
|
return block && 'content' in block ? block.content : ''
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join('\n')
|
||||||
|
.trim()
|
||||||
|
})
|
||||||
|
.join('\n\n---\n\n')
|
||||||
|
const fileName = `chat_export_${new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-')}.md`
|
||||||
|
window.api.file.save(fileName, contentToSave)
|
||||||
|
window.message.success({ content: t('message.save.success.title'), key: 'save-messages' })
|
||||||
|
EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false)
|
||||||
|
} else {
|
||||||
|
window.message.warning(t('message.save.no.assistant'))
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'copy': {
|
||||||
|
const assistantMessages = messages.filter((msg) => messageIds.includes(msg.id))
|
||||||
|
if (assistantMessages.length > 0) {
|
||||||
|
const contentToCopy = assistantMessages
|
||||||
|
.map((msg) => {
|
||||||
|
return msg.blocks
|
||||||
|
.map((blockId) => {
|
||||||
|
const block = messageBlocks[blockId]
|
||||||
|
return block && 'content' in block ? block.content : ''
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join('\n')
|
||||||
|
.trim()
|
||||||
|
})
|
||||||
|
.join('\n\n---\n\n')
|
||||||
|
navigator.clipboard.writeText(contentToCopy)
|
||||||
|
window.message.success({ content: t('message.copied'), key: 'copy-messages' })
|
||||||
|
EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false)
|
||||||
|
} else {
|
||||||
|
window.message.warning(t('message.copy.no.assistant'))
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmDelete = async () => {
|
||||||
|
try {
|
||||||
|
dispatch(
|
||||||
|
newMessagesActions.removeMessages({
|
||||||
|
topicId: props.activeTopic.id,
|
||||||
|
messageIds: messagesToDelete
|
||||||
|
})
|
||||||
|
)
|
||||||
|
window.message.success(t('message.delete.success'))
|
||||||
|
setMessagesToDelete([])
|
||||||
|
setIsMultiSelectMode(false)
|
||||||
|
EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false)
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to delete messages:', error)
|
||||||
|
window.message.error(t('message.delete.failed'))
|
||||||
|
} finally {
|
||||||
|
setConfirmDeleteVisible(false)
|
||||||
|
setIsMultiSelectMode(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const cancelDelete = () => {
|
||||||
|
setConfirmDeleteVisible(false)
|
||||||
|
setMessagesToDelete([])
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container id="chat" className={messageStyle}>
|
<Container id="chat" className={messageStyle}>
|
||||||
<MultiSelectProvider topic={props.activeTopic}>
|
<Main ref={mainRef} id="chat-main" vertical flex={1} justify="space-between" style={{ maxWidth }}>
|
||||||
<Main ref={mainRef} id="chat-main" vertical flex={1} justify="space-between" style={{ maxWidth }}>
|
<ContentSearch
|
||||||
<ContentSearch
|
ref={contentSearchRef}
|
||||||
ref={contentSearchRef}
|
searchTarget={mainRef as React.RefObject<HTMLElement>}
|
||||||
searchTarget={mainRef as React.RefObject<HTMLElement>}
|
filter={contentSearchFilter}
|
||||||
filter={contentSearchFilter}
|
includeUser={filterIncludeUser}
|
||||||
includeUser={filterIncludeUser}
|
onIncludeUserChange={userOutlinedItemClickHandler}
|
||||||
onIncludeUserChange={userOutlinedItemClickHandler}
|
/>
|
||||||
/>
|
<MessagesContainer>
|
||||||
<MessagesContainer>
|
<Messages
|
||||||
<Messages
|
key={props.activeTopic.id}
|
||||||
key={props.activeTopic.id}
|
assistant={assistant}
|
||||||
assistant={assistant}
|
topic={props.activeTopic}
|
||||||
topic={props.activeTopic}
|
|
||||||
setActiveTopic={props.setActiveTopic}
|
|
||||||
onComponentUpdate={messagesComponentUpdateHandler}
|
|
||||||
onFirstUpdate={messagesComponentFirstUpdateHandler}
|
|
||||||
/>
|
|
||||||
</MessagesContainer>
|
|
||||||
<QuickPanelProvider>
|
|
||||||
<Inputbar assistant={assistant} setActiveTopic={props.setActiveTopic} topic={props.activeTopic} />
|
|
||||||
<MultiSelectActionPopup topic={props.activeTopic} />
|
|
||||||
</QuickPanelProvider>
|
|
||||||
</Main>
|
|
||||||
{topicPosition === 'right' && showTopics && (
|
|
||||||
<Tabs
|
|
||||||
activeAssistant={assistant}
|
|
||||||
activeTopic={props.activeTopic}
|
|
||||||
setActiveAssistant={props.setActiveAssistant}
|
|
||||||
setActiveTopic={props.setActiveTopic}
|
setActiveTopic={props.setActiveTopic}
|
||||||
position="right"
|
onComponentUpdate={messagesComponentUpdateHandler}
|
||||||
|
onFirstUpdate={messagesComponentFirstUpdateHandler}
|
||||||
/>
|
/>
|
||||||
)}
|
</MessagesContainer>
|
||||||
{/* 删除Modal,现在已经移到Provider中 */}
|
<QuickPanelProvider>
|
||||||
</MultiSelectProvider>
|
{isMultiSelectMode ? (
|
||||||
|
<MultiSelectActionPopup
|
||||||
|
visible={isMultiSelectMode}
|
||||||
|
onClose={() => setIsMultiSelectMode(false)}
|
||||||
|
onAction={handleMultiSelectAction}
|
||||||
|
topic={props.activeTopic}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<Inputbar assistant={assistant} setActiveTopic={props.setActiveTopic} topic={props.activeTopic} />
|
||||||
|
)}
|
||||||
|
</QuickPanelProvider>
|
||||||
|
</Main>
|
||||||
|
{topicPosition === 'right' && showTopics && (
|
||||||
|
<Tabs
|
||||||
|
activeAssistant={assistant}
|
||||||
|
activeTopic={props.activeTopic}
|
||||||
|
setActiveAssistant={props.setActiveAssistant}
|
||||||
|
setActiveTopic={props.setActiveTopic}
|
||||||
|
position="right"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<Modal
|
||||||
|
title={t('message.delete.confirm.title')}
|
||||||
|
open={confirmDeleteVisible}
|
||||||
|
onOk={confirmDelete}
|
||||||
|
onCancel={cancelDelete}
|
||||||
|
okText={t('common.confirm')}
|
||||||
|
cancelText={t('common.cancel')}
|
||||||
|
okButtonProps={{ danger: true }}
|
||||||
|
centered={true}>
|
||||||
|
<p>{t('message.delete.confirm.content', { count: messagesToDelete.length })}</p>
|
||||||
|
</Modal>
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,158 +0,0 @@
|
|||||||
import { RootState } from '@renderer/store'
|
|
||||||
import { messageBlocksSelectors } from '@renderer/store/messageBlock'
|
|
||||||
import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage'
|
|
||||||
import { Topic } from '@renderer/types'
|
|
||||||
import { Modal } from 'antd'
|
|
||||||
import { createContext, FC, ReactNode, use, useState } from 'react'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { useDispatch, useSelector } from 'react-redux'
|
|
||||||
|
|
||||||
interface MultiSelectContextType {
|
|
||||||
isMultiSelectMode: boolean
|
|
||||||
toggleMultiSelectMode: (value: boolean) => void
|
|
||||||
selectedMessageIds: string[]
|
|
||||||
handleMessageSelection: (messageId: string, selected: boolean) => void
|
|
||||||
handleAction: (action: string) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
const MultiSelectContext = createContext<MultiSelectContextType | undefined>(undefined)
|
|
||||||
|
|
||||||
export const useMultiSelect = () => {
|
|
||||||
const context = use(MultiSelectContext)
|
|
||||||
if (!context) {
|
|
||||||
throw new Error('useMultiSelect必须在MultiSelectProvider内使用')
|
|
||||||
}
|
|
||||||
return context
|
|
||||||
}
|
|
||||||
|
|
||||||
interface MultiSelectProviderProps {
|
|
||||||
children: ReactNode
|
|
||||||
topic: Topic
|
|
||||||
}
|
|
||||||
|
|
||||||
export const MultiSelectProvider: FC<MultiSelectProviderProps> = ({ children, topic }) => {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
const dispatch = useDispatch()
|
|
||||||
const [isMultiSelectMode, setIsMultiSelectMode] = useState(false)
|
|
||||||
const [selectedMessageIds, setSelectedMessageIds] = useState<string[]>([])
|
|
||||||
const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false)
|
|
||||||
|
|
||||||
// 获取消息和消息块
|
|
||||||
const messages = useSelector((state: RootState) => selectMessagesForTopic(state, topic.id))
|
|
||||||
const messageBlocks = useSelector(messageBlocksSelectors.selectEntities)
|
|
||||||
|
|
||||||
const toggleMultiSelectMode = (value: boolean) => {
|
|
||||||
setIsMultiSelectMode(value)
|
|
||||||
if (!value) setSelectedMessageIds([])
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleMessageSelection = (messageId: string, selected: boolean) => {
|
|
||||||
setSelectedMessageIds((prev) => (selected ? [...prev, messageId] : prev.filter((id) => id !== messageId)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理保存、复制、删除等操作
|
|
||||||
const handleAction = (action: string) => {
|
|
||||||
if (selectedMessageIds.length === 0) {
|
|
||||||
window.message.warning(t('chat.multiple.select.empty'))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (action) {
|
|
||||||
case 'delete':
|
|
||||||
setConfirmDeleteVisible(true)
|
|
||||||
break
|
|
||||||
case 'save': {
|
|
||||||
const assistantMessages = messages.filter((msg) => selectedMessageIds.includes(msg.id))
|
|
||||||
if (assistantMessages.length > 0) {
|
|
||||||
const contentToSave = assistantMessages
|
|
||||||
.map((msg) => {
|
|
||||||
return msg.blocks
|
|
||||||
.map((blockId) => {
|
|
||||||
const block = messageBlocks[blockId]
|
|
||||||
return block && 'content' in block ? block.content : ''
|
|
||||||
})
|
|
||||||
.filter(Boolean)
|
|
||||||
.join('\n')
|
|
||||||
.trim()
|
|
||||||
})
|
|
||||||
.join('\n\n---\n\n')
|
|
||||||
|
|
||||||
const fileName = `chat_export_${new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-')}.md`
|
|
||||||
window.api.file.save(fileName, contentToSave)
|
|
||||||
window.message.success({ content: t('message.save.success.title'), key: 'save-messages' })
|
|
||||||
toggleMultiSelectMode(false)
|
|
||||||
} else {
|
|
||||||
window.message.warning(t('message.save.no.assistant'))
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'copy': {
|
|
||||||
const assistantMessages = messages.filter((msg) => selectedMessageIds.includes(msg.id))
|
|
||||||
if (assistantMessages.length > 0) {
|
|
||||||
const contentToCopy = assistantMessages
|
|
||||||
.map((msg) => {
|
|
||||||
return msg.blocks
|
|
||||||
.map((blockId) => {
|
|
||||||
const block = messageBlocks[blockId]
|
|
||||||
return block && 'content' in block ? block.content : ''
|
|
||||||
})
|
|
||||||
.filter(Boolean)
|
|
||||||
.join('\n')
|
|
||||||
.trim()
|
|
||||||
})
|
|
||||||
.join('\n\n---\n\n')
|
|
||||||
|
|
||||||
navigator.clipboard.writeText(contentToCopy)
|
|
||||||
window.message.success({ content: t('message.copied'), key: 'copy-messages' })
|
|
||||||
toggleMultiSelectMode(false)
|
|
||||||
} else {
|
|
||||||
window.message.warning(t('message.copy.no.assistant'))
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const confirmDelete = () => {
|
|
||||||
try {
|
|
||||||
dispatch(
|
|
||||||
newMessagesActions.removeMessages({
|
|
||||||
topicId: topic.id,
|
|
||||||
messageIds: selectedMessageIds
|
|
||||||
})
|
|
||||||
)
|
|
||||||
window.message.success(t('message.delete.success'))
|
|
||||||
toggleMultiSelectMode(false)
|
|
||||||
} catch (error) {
|
|
||||||
console.error('删除消息失败:', error)
|
|
||||||
window.message.error(t('message.delete.failed'))
|
|
||||||
} finally {
|
|
||||||
setConfirmDeleteVisible(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<MultiSelectContext
|
|
||||||
value={{
|
|
||||||
isMultiSelectMode,
|
|
||||||
toggleMultiSelectMode,
|
|
||||||
selectedMessageIds,
|
|
||||||
handleMessageSelection,
|
|
||||||
handleAction
|
|
||||||
}}>
|
|
||||||
{children}
|
|
||||||
|
|
||||||
<Modal
|
|
||||||
title={t('message.delete.confirm.title')}
|
|
||||||
open={confirmDeleteVisible}
|
|
||||||
onOk={confirmDelete}
|
|
||||||
onCancel={() => setConfirmDeleteVisible(false)}
|
|
||||||
okText={t('common.confirm')}
|
|
||||||
cancelText={t('common.cancel')}
|
|
||||||
okButtonProps={{ danger: true }}
|
|
||||||
centered={true}>
|
|
||||||
<p>{t('message.delete.confirm.content', { count: selectedMessageIds.length })}</p>
|
|
||||||
</Modal>
|
|
||||||
</MultiSelectContext>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -382,7 +382,7 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
style={{
|
style={{
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
maxWidth,
|
maxWidth,
|
||||||
paddingTop: showPrompt ? 10 : 0
|
paddingTop: showPrompt ? 10 : 0,
|
||||||
}}
|
}}
|
||||||
key={assistant.id}
|
key={assistant.id}
|
||||||
$right={topicPosition === 'left'}>
|
$right={topicPosition === 'left'}>
|
||||||
@ -425,7 +425,7 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
left: Math.min(dragStart.x, dragCurrent.x),
|
left: Math.min(dragStart.x, dragCurrent.x),
|
||||||
top: Math.min(dragStart.y, dragCurrent.y),
|
top: Math.min(dragStart.y, dragCurrent.y),
|
||||||
width: Math.abs(dragCurrent.x - dragStart.x),
|
width: Math.abs(dragCurrent.x - dragStart.x),
|
||||||
height: Math.abs(dragCurrent.y - dragStart.y)
|
height: Math.abs(dragCurrent.y - dragStart.y),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
280
yarn.lock
280
yarn.lock
@ -360,6 +360,17 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@babel/plugin-syntax-jsx@npm:^7.22.5":
|
||||||
|
version: 7.25.9
|
||||||
|
resolution: "@babel/plugin-syntax-jsx@npm:7.25.9"
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-plugin-utils": "npm:^7.25.9"
|
||||||
|
peerDependencies:
|
||||||
|
"@babel/core": ^7.0.0-0
|
||||||
|
checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@babel/plugin-transform-arrow-functions@npm:^7.25.9":
|
"@babel/plugin-transform-arrow-functions@npm:^7.25.9":
|
||||||
version: 7.25.9
|
version: 7.25.9
|
||||||
resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9"
|
resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9"
|
||||||
@ -423,6 +434,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@bcoe/v8-coverage@npm:^1.0.2":
|
||||||
|
version: 1.0.2
|
||||||
|
resolution: "@bcoe/v8-coverage@npm:1.0.2"
|
||||||
|
checksum: 10c0/1eb1dc93cc17fb7abdcef21a6e7b867d6aa99a7ec88ec8207402b23d9083ab22a8011213f04b2cf26d535f1d22dc26139b7929e6c2134c254bd1e14ba5e678c3
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@braintree/sanitize-url@npm:^7.0.4":
|
"@braintree/sanitize-url@npm:^7.0.4":
|
||||||
version: 7.1.1
|
version: 7.1.1
|
||||||
resolution: "@braintree/sanitize-url@npm:7.1.1"
|
resolution: "@braintree/sanitize-url@npm:7.1.1"
|
||||||
@ -2017,7 +2035,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@iconify/types@npm:^2.0.0":
|
"@iconify-json/svg-spinners@npm:^1.2.2":
|
||||||
|
version: 1.2.2
|
||||||
|
resolution: "@iconify-json/svg-spinners@npm:1.2.2"
|
||||||
|
dependencies:
|
||||||
|
"@iconify/types": "npm:*"
|
||||||
|
checksum: 10c0/61869963c21bc03052d64cd19155f9d596ffc71b3934ccdb468f5b5a1d3f003089c87744bf76145d8b1e946c45a88e1439e1f9470fcfc3a847b88262f1d71c76
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@iconify/types@npm:*, @iconify/types@npm:^2.0.0":
|
||||||
version: 2.0.0
|
version: 2.0.0
|
||||||
resolution: "@iconify/types@npm:2.0.0"
|
resolution: "@iconify/types@npm:2.0.0"
|
||||||
checksum: 10c0/65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2
|
checksum: 10c0/65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2
|
||||||
@ -3968,13 +3995,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@sec-ant/readable-stream@npm:^0.4.1":
|
|
||||||
version: 0.4.1
|
|
||||||
resolution: "@sec-ant/readable-stream@npm:0.4.1"
|
|
||||||
checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@selderee/plugin-htmlparser2@npm:^0.11.0":
|
"@selderee/plugin-htmlparser2@npm:^0.11.0":
|
||||||
version: 0.11.0
|
version: 0.11.0
|
||||||
resolution: "@selderee/plugin-htmlparser2@npm:0.11.0"
|
resolution: "@selderee/plugin-htmlparser2@npm:0.11.0"
|
||||||
@ -4068,27 +4088,20 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.2.0":
|
"@sindresorhus/is@npm:^4.0.0":
|
||||||
version: 4.6.0
|
version: 4.6.0
|
||||||
resolution: "@sindresorhus/is@npm:4.6.0"
|
resolution: "@sindresorhus/is@npm:4.6.0"
|
||||||
checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e
|
checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@sindresorhus/is@npm:^5.2.0, @sindresorhus/is@npm:^5.3.0":
|
"@sindresorhus/is@npm:^5.2.0":
|
||||||
version: 5.6.0
|
version: 5.6.0
|
||||||
resolution: "@sindresorhus/is@npm:5.6.0"
|
resolution: "@sindresorhus/is@npm:5.6.0"
|
||||||
checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52
|
checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@sindresorhus/is@npm:^7.0.1":
|
|
||||||
version: 7.0.1
|
|
||||||
resolution: "@sindresorhus/is@npm:7.0.1"
|
|
||||||
checksum: 10c0/6d43a916d70d9b64066394c272883869b22faf21f4748aaf399c1b691ea704ea607d1668ff2eb5704e5be8809c4a7faafe16be048ce5e1a2ba6e8928b8e3461c
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@strongtz/win32-arm64-msvc@npm:^0.4.7":
|
"@strongtz/win32-arm64-msvc@npm:^0.4.7":
|
||||||
version: 0.4.7
|
version: 0.4.7
|
||||||
resolution: "@strongtz/win32-arm64-msvc@npm:0.4.7"
|
resolution: "@strongtz/win32-arm64-msvc@npm:0.4.7"
|
||||||
@ -4669,7 +4682,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2, @types/http-cache-semantics@npm:^4.0.4":
|
"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2":
|
||||||
version: 4.0.4
|
version: 4.0.4
|
||||||
resolution: "@types/http-cache-semantics@npm:4.0.4"
|
resolution: "@types/http-cache-semantics@npm:4.0.4"
|
||||||
checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6
|
checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6
|
||||||
@ -4954,7 +4967,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/ws@npm:^8, @types/ws@npm:^8.5.4":
|
"@types/ws@npm:^8.5.4":
|
||||||
version: 8.18.1
|
version: 8.18.1
|
||||||
resolution: "@types/ws@npm:8.18.1"
|
resolution: "@types/ws@npm:8.18.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -5871,7 +5884,6 @@ __metadata:
|
|||||||
tiny-pinyin: "npm:^1.3.2"
|
tiny-pinyin: "npm:^1.3.2"
|
||||||
tokenx: "npm:^0.4.1"
|
tokenx: "npm:^0.4.1"
|
||||||
turndown: "npm:^7.2.0"
|
turndown: "npm:^7.2.0"
|
||||||
turndown-plugin-gfm: "npm:^1.0.2"
|
|
||||||
typescript: "npm:^5.6.2"
|
typescript: "npm:^5.6.2"
|
||||||
uuid: "npm:^10.0.0"
|
uuid: "npm:^10.0.0"
|
||||||
vite: "npm:6.2.6"
|
vite: "npm:6.2.6"
|
||||||
@ -5933,13 +5945,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"adm-zip@npm:^0.5.9":
|
|
||||||
version: 0.5.16
|
|
||||||
resolution: "adm-zip@npm:0.5.16"
|
|
||||||
checksum: 10c0/6f10119d4570c7ba76dcf428abb8d3f69e63f92e51f700a542b43d4c0130373dd2ddfc8f85059f12d4a843703a90c3970cfd17876844b4f3f48bf042bfa6b49f
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"agent-base@npm:6, agent-base@npm:^6.0.2":
|
"agent-base@npm:6, agent-base@npm:^6.0.2":
|
||||||
version: 6.0.2
|
version: 6.0.2
|
||||||
resolution: "agent-base@npm:6.0.2"
|
resolution: "agent-base@npm:6.0.2"
|
||||||
@ -6246,6 +6251,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"applescript@npm:^1.0.0":
|
||||||
|
version: 1.0.0
|
||||||
|
resolution: "applescript@npm:1.0.0"
|
||||||
|
checksum: 10c0/b535e7df97a3e1272d1b8e8c832494ba3933fbad879847cb83c8990c08aed5bcb097d2af200ba2e0754c3467c2367441706b7864173e1aa9ee4132f5189287f0
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"aproba@npm:^1.0.3":
|
"aproba@npm:^1.0.3":
|
||||||
version: 1.2.0
|
version: 1.2.0
|
||||||
resolution: "aproba@npm:1.2.0"
|
resolution: "aproba@npm:1.2.0"
|
||||||
@ -6635,20 +6647,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"browserslist@npm:^4.21.1":
|
|
||||||
version: 4.24.5
|
|
||||||
resolution: "browserslist@npm:4.24.5"
|
|
||||||
dependencies:
|
|
||||||
caniuse-lite: "npm:^1.0.30001716"
|
|
||||||
electron-to-chromium: "npm:^1.5.149"
|
|
||||||
node-releases: "npm:^2.0.19"
|
|
||||||
update-browserslist-db: "npm:^1.1.3"
|
|
||||||
bin:
|
|
||||||
browserslist: cli.js
|
|
||||||
checksum: 10c0/f4c1ce1a7d8fdfab5e5b88bb6e93d09e8a883c393f86801537a252da0362dbdcde4dbd97b318246c5d84c6607b2f6b47af732c1b000d6a8a881ee024bad29204
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"browserslist@npm:^4.24.0":
|
"browserslist@npm:^4.24.0":
|
||||||
version: 4.24.4
|
version: 4.24.4
|
||||||
resolution: "browserslist@npm:4.24.4"
|
resolution: "browserslist@npm:4.24.4"
|
||||||
@ -6853,21 +6851,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"cacheable-request@npm:^12.0.1":
|
|
||||||
version: 12.0.1
|
|
||||||
resolution: "cacheable-request@npm:12.0.1"
|
|
||||||
dependencies:
|
|
||||||
"@types/http-cache-semantics": "npm:^4.0.4"
|
|
||||||
get-stream: "npm:^9.0.1"
|
|
||||||
http-cache-semantics: "npm:^4.1.1"
|
|
||||||
keyv: "npm:^4.5.4"
|
|
||||||
mimic-response: "npm:^4.0.0"
|
|
||||||
normalize-url: "npm:^8.0.1"
|
|
||||||
responselike: "npm:^3.0.0"
|
|
||||||
checksum: 10c0/3ccc26519c8dd0821fcb21fa00781e55f05ab6e1da1487fbbee9c8c03435a3cf72c29a710a991cebe398fb9a5274e2a772fc488546d402db8dc21310764ed83a
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"cacheable-request@npm:^7.0.2":
|
"cacheable-request@npm:^7.0.2":
|
||||||
version: 7.0.4
|
version: 7.0.4
|
||||||
resolution: "cacheable-request@npm:7.0.4"
|
resolution: "cacheable-request@npm:7.0.4"
|
||||||
@ -6903,20 +6886,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"callsites@npm:^3.0.0, callsites@npm:^3.1.0":
|
"callsites@npm:^3.0.0":
|
||||||
version: 3.1.0
|
version: 3.1.0
|
||||||
resolution: "callsites@npm:3.1.0"
|
resolution: "callsites@npm:3.1.0"
|
||||||
checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301
|
checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"callsites@npm:^4.0.0":
|
|
||||||
version: 4.2.0
|
|
||||||
resolution: "callsites@npm:4.2.0"
|
|
||||||
checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"camelcase@npm:5.0.0":
|
"camelcase@npm:5.0.0":
|
||||||
version: 5.0.0
|
version: 5.0.0
|
||||||
resolution: "camelcase@npm:5.0.0"
|
resolution: "camelcase@npm:5.0.0"
|
||||||
@ -6952,13 +6928,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"caniuse-lite@npm:^1.0.30001716":
|
|
||||||
version: 1.0.30001718
|
|
||||||
resolution: "caniuse-lite@npm:1.0.30001718"
|
|
||||||
checksum: 10c0/67f9ad09bc16443e28d14f265d6e468480cd8dc1900d0d8b982222de80c699c4f2306599c3da8a3fa7139f110d4b30d49dbac78f215470f479abb6ffe141d5d3
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"caseless@npm:~0.12.0":
|
"caseless@npm:~0.12.0":
|
||||||
version: 0.12.0
|
version: 0.12.0
|
||||||
resolution: "caseless@npm:0.12.0"
|
resolution: "caseless@npm:0.12.0"
|
||||||
@ -8680,15 +8649,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"dot-prop@npm:^7.2.0":
|
|
||||||
version: 7.2.0
|
|
||||||
resolution: "dot-prop@npm:7.2.0"
|
|
||||||
dependencies:
|
|
||||||
type-fest: "npm:^2.11.2"
|
|
||||||
checksum: 10c0/2621702a01e7a47730e3a8e2938a406afc79b62fbb77bd1394e786ff13776673904bf0a4fc6b812eb9849ec71034e9fc1019a9e0bbe91f84010d8a8088cd41a9
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"dotenv-cli@npm:^7.4.2":
|
"dotenv-cli@npm:^7.4.2":
|
||||||
version: 7.4.4
|
version: 7.4.4
|
||||||
resolution: "dotenv-cli@npm:7.4.4"
|
resolution: "dotenv-cli@npm:7.4.4"
|
||||||
@ -8869,13 +8829,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"electron-to-chromium@npm:^1.5.149":
|
|
||||||
version: 1.5.155
|
|
||||||
resolution: "electron-to-chromium@npm:1.5.155"
|
|
||||||
checksum: 10c0/aee32a0b03282e488352370f6a910de37788b814031020a0e244943450e844e8a41f741d6e5ec70d553dfa4382ef80088034ddc400b48f45de95de331b9ec178
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"electron-to-chromium@npm:^1.5.73":
|
"electron-to-chromium@npm:^1.5.73":
|
||||||
version: 1.5.137
|
version: 1.5.137
|
||||||
resolution: "electron-to-chromium@npm:1.5.137"
|
resolution: "electron-to-chromium@npm:1.5.137"
|
||||||
@ -10302,13 +10255,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"form-data-encoder@npm:^4.0.2":
|
|
||||||
version: 4.0.2
|
|
||||||
resolution: "form-data-encoder@npm:4.0.2"
|
|
||||||
checksum: 10c0/559d3130e265316452434eaf68d68560fb36392ff4d04614683419de4fb43c3dbe152dc303599fae382ce24d3451a6d3d289d3bcc182ae3d8ad32e7ce8e35e53
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"form-data@npm:^4.0.0":
|
"form-data@npm:^4.0.0":
|
||||||
version: 4.0.2
|
version: 4.0.2
|
||||||
resolution: "form-data@npm:4.0.2"
|
resolution: "form-data@npm:4.0.2"
|
||||||
@ -10548,16 +10494,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"generative-bayesian-network@npm:^2.1.66":
|
|
||||||
version: 2.1.66
|
|
||||||
resolution: "generative-bayesian-network@npm:2.1.66"
|
|
||||||
dependencies:
|
|
||||||
adm-zip: "npm:^0.5.9"
|
|
||||||
tslib: "npm:^2.4.0"
|
|
||||||
checksum: 10c0/ea8089492fe447aefc595ce5196d91474c8295d4592b4bcda8fedd2209d30ed897122ff1dc9efefcd7046e210f12cf06f2b6ec36e31f64646323ad3336a83b24
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"gensync@npm:^1.0.0-beta.2":
|
"gensync@npm:^1.0.0-beta.2":
|
||||||
version: 1.0.0-beta.2
|
version: 1.0.0-beta.2
|
||||||
resolution: "gensync@npm:1.0.0-beta.2"
|
resolution: "gensync@npm:1.0.0-beta.2"
|
||||||
@ -10647,16 +10583,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"get-stream@npm:^9.0.1":
|
|
||||||
version: 9.0.1
|
|
||||||
resolution: "get-stream@npm:9.0.1"
|
|
||||||
dependencies:
|
|
||||||
"@sec-ant/readable-stream": "npm:^0.4.1"
|
|
||||||
is-stream: "npm:^4.0.1"
|
|
||||||
checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"get-uri@npm:^6.0.1":
|
"get-uri@npm:^6.0.1":
|
||||||
version: 6.0.4
|
version: 6.0.4
|
||||||
resolution: "get-uri@npm:6.0.4"
|
resolution: "get-uri@npm:6.0.4"
|
||||||
@ -10859,21 +10785,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"got-scraping@npm:^4.1.1":
|
|
||||||
version: 4.1.1
|
|
||||||
resolution: "got-scraping@npm:4.1.1"
|
|
||||||
dependencies:
|
|
||||||
got: "npm:^14.2.1"
|
|
||||||
header-generator: "npm:^2.1.41"
|
|
||||||
http2-wrapper: "npm:^2.2.0"
|
|
||||||
mimic-response: "npm:^4.0.0"
|
|
||||||
ow: "npm:^1.1.1"
|
|
||||||
quick-lru: "npm:^7.0.0"
|
|
||||||
tslib: "npm:^2.6.2"
|
|
||||||
checksum: 10c0/66b9bd88fea1c7a1248fec6e9c9757300b70e6039d2b2e0cf1c70e44e88be80f02a26e2e36d5f9c3acb4ec963558d72b0d236a7f11a7a6c87b39b5615afcf7db
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"got@npm:13.0.0":
|
"got@npm:13.0.0":
|
||||||
version: 13.0.0
|
version: 13.0.0
|
||||||
resolution: "got@npm:13.0.0"
|
resolution: "got@npm:13.0.0"
|
||||||
@ -10912,25 +10823,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"got@npm:^14.2.1":
|
|
||||||
version: 14.4.7
|
|
||||||
resolution: "got@npm:14.4.7"
|
|
||||||
dependencies:
|
|
||||||
"@sindresorhus/is": "npm:^7.0.1"
|
|
||||||
"@szmarczak/http-timer": "npm:^5.0.1"
|
|
||||||
cacheable-lookup: "npm:^7.0.0"
|
|
||||||
cacheable-request: "npm:^12.0.1"
|
|
||||||
decompress-response: "npm:^6.0.0"
|
|
||||||
form-data-encoder: "npm:^4.0.2"
|
|
||||||
http2-wrapper: "npm:^2.2.1"
|
|
||||||
lowercase-keys: "npm:^3.0.0"
|
|
||||||
p-cancelable: "npm:^4.0.1"
|
|
||||||
responselike: "npm:^3.0.0"
|
|
||||||
type-fest: "npm:^4.26.1"
|
|
||||||
checksum: 10c0/9b5b8dbc0642c78dbc64ab5ff6f12f6edab3e0cb80e89a3a69623a79ba3986f0ff0066a116fba47c0aacce4b0ba1eccf72f923f7fac13a31ce852bf9e2cb8f81
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
|
"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
|
||||||
version: 4.2.11
|
version: 4.2.11
|
||||||
resolution: "graceful-fs@npm:4.2.11"
|
resolution: "graceful-fs@npm:4.2.11"
|
||||||
@ -11237,18 +11129,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"header-generator@npm:^2.1.41":
|
|
||||||
version: 2.1.66
|
|
||||||
resolution: "header-generator@npm:2.1.66"
|
|
||||||
dependencies:
|
|
||||||
browserslist: "npm:^4.21.1"
|
|
||||||
generative-bayesian-network: "npm:^2.1.66"
|
|
||||||
ow: "npm:^0.28.1"
|
|
||||||
tslib: "npm:^2.4.0"
|
|
||||||
checksum: 10c0/86354e65a047b6519b204adc2a4193dff6bb0782ca2c9d69f1c0320319cbd1a46d3eff31e4a32fe9b3dc0e7910351af5ca8ee2d50baade97b6e7dffd813145be
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2":
|
"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2":
|
||||||
version: 3.3.2
|
version: 3.3.2
|
||||||
resolution: "hoist-non-react-statics@npm:3.3.2"
|
resolution: "hoist-non-react-statics@npm:3.3.2"
|
||||||
@ -11414,7 +11294,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"http2-wrapper@npm:^2.1.10, http2-wrapper@npm:^2.2.0, http2-wrapper@npm:^2.2.1":
|
"http2-wrapper@npm:^2.1.10":
|
||||||
version: 2.2.1
|
version: 2.2.1
|
||||||
resolution: "http2-wrapper@npm:2.2.1"
|
resolution: "http2-wrapper@npm:2.2.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -11943,13 +11823,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"is-stream@npm:^4.0.1":
|
|
||||||
version: 4.0.1
|
|
||||||
resolution: "is-stream@npm:4.0.1"
|
|
||||||
checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"is-typedarray@npm:~1.0.0":
|
"is-typedarray@npm:~1.0.0":
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
resolution: "is-typedarray@npm:1.0.0"
|
resolution: "is-typedarray@npm:1.0.0"
|
||||||
@ -14040,7 +13913,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"mime@npm:^4.0.4, mime@npm:^4.0.6":
|
"mime@npm:^4.0.6":
|
||||||
version: 4.0.7
|
version: 4.0.7
|
||||||
resolution: "mime@npm:4.0.7"
|
resolution: "mime@npm:4.0.7"
|
||||||
bin:
|
bin:
|
||||||
@ -14618,7 +14491,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"normalize-url@npm:^8.0.0, normalize-url@npm:^8.0.1":
|
"normalize-url@npm:^8.0.0":
|
||||||
version: 8.0.1
|
version: 8.0.1
|
||||||
resolution: "normalize-url@npm:8.0.1"
|
resolution: "normalize-url@npm:8.0.1"
|
||||||
checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef
|
checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef
|
||||||
@ -14944,32 +14817,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ow@npm:^0.28.1":
|
|
||||||
version: 0.28.2
|
|
||||||
resolution: "ow@npm:0.28.2"
|
|
||||||
dependencies:
|
|
||||||
"@sindresorhus/is": "npm:^4.2.0"
|
|
||||||
callsites: "npm:^3.1.0"
|
|
||||||
dot-prop: "npm:^6.0.1"
|
|
||||||
lodash.isequal: "npm:^4.5.0"
|
|
||||||
vali-date: "npm:^1.0.0"
|
|
||||||
checksum: 10c0/8d0de10fd3aa1ab69dd844ace087718c31ceb1a25cf79d38a5be4d0a5da46f960b6bc15a95405747899b882fb51dcf5a502d7e6508005d1c57e157d12fa17cdd
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"ow@npm:^1.1.1":
|
|
||||||
version: 1.1.1
|
|
||||||
resolution: "ow@npm:1.1.1"
|
|
||||||
dependencies:
|
|
||||||
"@sindresorhus/is": "npm:^5.3.0"
|
|
||||||
callsites: "npm:^4.0.0"
|
|
||||||
dot-prop: "npm:^7.2.0"
|
|
||||||
lodash.isequal: "npm:^4.5.0"
|
|
||||||
vali-date: "npm:^1.0.0"
|
|
||||||
checksum: 10c0/3973f9d6245f2e468a0f1d614ece96f1289632f7425094e8b266b50ddbe79471f2e6cba447b80e90b54bbeb13c20e83671edfb5ef4c0b13c15546ba0710554e1
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"p-cancelable@npm:^2.0.0":
|
"p-cancelable@npm:^2.0.0":
|
||||||
version: 2.1.1
|
version: 2.1.1
|
||||||
resolution: "p-cancelable@npm:2.1.1"
|
resolution: "p-cancelable@npm:2.1.1"
|
||||||
@ -14984,13 +14831,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"p-cancelable@npm:^4.0.1":
|
|
||||||
version: 4.0.1
|
|
||||||
resolution: "p-cancelable@npm:4.0.1"
|
|
||||||
checksum: 10c0/12636623f46784ba962b6fe7a1f34d021f1d9a2cc12c43e270baa715ea872d5c8c7d9f086ed420b8b9817e91d9bbe92c14c90e5dddd4a9968c81a2a7aef7089d
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"p-finally@npm:^1.0.0":
|
"p-finally@npm:^1.0.0":
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
resolution: "p-finally@npm:1.0.0"
|
resolution: "p-finally@npm:1.0.0"
|
||||||
@ -15885,13 +15725,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"quick-lru@npm:^7.0.0":
|
|
||||||
version: 7.0.1
|
|
||||||
resolution: "quick-lru@npm:7.0.1"
|
|
||||||
checksum: 10c0/631d031d9aba116311b1db57fbf8637874f2b72731f435a9d015cc0405aae5d18206336953563627ca7c9ed971a3824f11cb4dc1575d03283252a8cea22ac8e1
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"raf-schd@npm:^4.0.3":
|
"raf-schd@npm:^4.0.3":
|
||||||
version: 4.0.3
|
version: 4.0.3
|
||||||
resolution: "raf-schd@npm:4.0.3"
|
resolution: "raf-schd@npm:4.0.3"
|
||||||
@ -18776,7 +18609,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.1":
|
"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.1":
|
||||||
version: 2.8.1
|
version: 2.8.1
|
||||||
resolution: "tslib@npm:2.8.1"
|
resolution: "tslib@npm:2.8.1"
|
||||||
checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
|
checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
|
||||||
@ -18792,13 +18625,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"turndown-plugin-gfm@npm:^1.0.2":
|
|
||||||
version: 1.0.2
|
|
||||||
resolution: "turndown-plugin-gfm@npm:1.0.2"
|
|
||||||
checksum: 10c0/eb9bc20dbb08d5335231f9617d7440f14b35781f14a3a393d8f13fc8205afeb11a0a632d52da4548ab0fa353f315ca265462b24d368faf23258dccbe439182b9
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"turndown@npm:^7.2.0":
|
"turndown@npm:^7.2.0":
|
||||||
version: 7.2.0
|
version: 7.2.0
|
||||||
resolution: "turndown@npm:7.2.0"
|
resolution: "turndown@npm:7.2.0"
|
||||||
@ -18831,20 +18657,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"type-fest@npm:^2.11.2, type-fest@npm:^2.17.0":
|
"type-fest@npm:^2.17.0":
|
||||||
version: 2.19.0
|
version: 2.19.0
|
||||||
resolution: "type-fest@npm:2.19.0"
|
resolution: "type-fest@npm:2.19.0"
|
||||||
checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb
|
checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"type-fest@npm:^4.26.1":
|
|
||||||
version: 4.41.0
|
|
||||||
resolution: "type-fest@npm:4.41.0"
|
|
||||||
checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"type-fest@npm:^4.39.1":
|
"type-fest@npm:^4.39.1":
|
||||||
version: 4.40.0
|
version: 4.40.0
|
||||||
resolution: "type-fest@npm:4.40.0"
|
resolution: "type-fest@npm:4.40.0"
|
||||||
@ -19138,7 +18957,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"update-browserslist-db@npm:^1.1.1, update-browserslist-db@npm:^1.1.3":
|
"update-browserslist-db@npm:^1.1.1":
|
||||||
version: 1.1.3
|
version: 1.1.3
|
||||||
resolution: "update-browserslist-db@npm:1.1.3"
|
resolution: "update-browserslist-db@npm:1.1.3"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -19271,13 +19090,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"vali-date@npm:^1.0.0":
|
|
||||||
version: 1.0.0
|
|
||||||
resolution: "vali-date@npm:1.0.0"
|
|
||||||
checksum: 10c0/5755215f6734caab535f60af0a32bbbf2052c61b1a40668d773df78fd3754e4fe9da2ea5466731505f3e0a599acc209d5578c4b70488ed120fb03f0c2ab06449
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"validate-npm-package-license@npm:^3.0.1":
|
"validate-npm-package-license@npm:^3.0.1":
|
||||||
version: 3.0.4
|
version: 3.0.4
|
||||||
resolution: "validate-npm-package-license@npm:3.0.4"
|
resolution: "validate-npm-package-license@npm:3.0.4"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user