@touchvue/chat 1.0.0-beta.56 → 1.0.0-beta.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/es/index.mjs.map +1 -1
  2. package/es/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.mjs +939 -226
  3. package/es/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
  4. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.mjs +109 -105
  5. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.mjs.map +1 -0
  6. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.mjs +34 -30
  7. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.mjs.map +1 -0
  8. package/es/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.mjs +2 -1
  9. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.mjs.map +1 -0
  10. package/es/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.mjs +1 -1
  11. package/es/package.json.mjs +1 -1
  12. package/es/packages/components/touchchat/component/AiRobot/face.vue2.mjs.map +1 -1
  13. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +1 -1
  14. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  15. package/es/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/component/AiRobot/start.vue2.mjs.map +1 -1
  17. package/es/packages/components/touchchat/component/CardView.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  19. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  21. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  23. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/ThoughtChain.vue2.mjs.map +1 -1
  25. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/UploadView_api.vue2.mjs.map +1 -1
  27. package/es/packages/components/touchchat/index.mjs.map +1 -1
  28. package/es/packages/components/touchchat/src/AiChat/Chat/TouchChat.mjs.map +1 -1
  29. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +7 -2
  30. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  31. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  32. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +10 -7
  33. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  34. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -1
  35. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +6 -2
  36. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  37. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  38. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  39. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  40. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +136 -120
  41. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  42. package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
  43. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  44. package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
  45. package/es/packages/components/touchchat/utils/a2aService.mjs +189 -132
  46. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  47. package/es/packages/components/touchchat/utils/chatRobot.mjs.map +1 -1
  48. package/es/packages/components/touchchat/utils/deepCloneDom.mjs.map +1 -1
  49. package/es/packages/components/touchchat/utils/hight-it.mjs.map +1 -1
  50. package/es/packages/components/touchchat/utils/markdown.mjs +2 -2
  51. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  52. package/es/packages/components/touchchat/utils/socket.mjs.map +1 -1
  53. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  54. package/es/packages/components/touchchat/utils/uuid.mjs.map +1 -1
  55. package/es/packages/utils/config.mjs.map +1 -1
  56. package/es/packages/utils/types.mjs.map +1 -1
  57. package/lib/index.js.map +1 -1
  58. package/lib/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.js +939 -226
  59. package/lib/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js.map +1 -0
  60. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.js +109 -105
  61. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.js.map +1 -0
  62. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.js +34 -30
  63. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.js.map +1 -0
  64. package/lib/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.js +2 -1
  65. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js.map +1 -0
  66. package/lib/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js +1 -1
  67. package/lib/package.json.js +1 -1
  68. package/lib/packages/components/touchchat/component/AiRobot/face.vue2.js.map +1 -1
  69. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +1 -1
  70. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  71. package/lib/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.js.map +1 -1
  72. package/lib/packages/components/touchchat/component/AiRobot/start.vue2.js.map +1 -1
  73. package/lib/packages/components/touchchat/component/CardView.vue2.js.map +1 -1
  74. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  75. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  76. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  77. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  78. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/ThoughtChain.vue2.js.map +1 -1
  81. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/UploadView_api.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/index.js.map +1 -1
  84. package/lib/packages/components/touchchat/src/AiChat/Chat/TouchChat.js.map +1 -1
  85. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +6 -1
  86. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  87. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  88. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +10 -7
  89. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  90. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -1
  91. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -1
  92. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  93. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  94. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  95. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  96. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +136 -120
  97. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
  99. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  100. package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
  101. package/lib/packages/components/touchchat/utils/a2aService.js +189 -132
  102. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  103. package/lib/packages/components/touchchat/utils/chatRobot.js.map +1 -1
  104. package/lib/packages/components/touchchat/utils/deepCloneDom.js.map +1 -1
  105. package/lib/packages/components/touchchat/utils/hight-it.js.map +1 -1
  106. package/lib/packages/components/touchchat/utils/markdown.js +2 -2
  107. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  108. package/lib/packages/components/touchchat/utils/socket.js.map +1 -1
  109. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  110. package/lib/packages/components/touchchat/utils/uuid.js.map +1 -1
  111. package/lib/packages/utils/config.js.map +1 -1
  112. package/lib/packages/utils/types.js.map +1 -1
  113. package/package.json +83 -83
  114. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  115. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs.map +0 -1
  116. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs.map +0 -1
  117. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.mjs.map +0 -1
  118. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +0 -1
  119. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.js.map +0 -1
  120. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.js.map +0 -1
  121. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryList.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/HistoryList.vue"],"sourcesContent":["<template>\n\t<div ref=\"historyListRef\" class=\"touchchat-history\" :class=\"{ 'is-robot': isRobot }\" @scroll=\"handleScroll\">\n\t\t<!-- 动态时间分组 -->\n\t\t<div v-for=\"group in groupedChatHistory\" :key=\"group.groupKey\" class=\"touchchat-history-group\">\n\t\t\t<!-- 分组标题 -->\n\t\t\t<div class=\"touchchat-history-title\">\n\t\t\t\t<div class=\"touchchat-history-title-icon\"></div>\n\t\t\t\t<div class=\"touchchat-history-title-text\">\n\t\t\t\t\t{{ group.groupName }}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- 分组内对话项 -->\n\t\t\t<div class=\"touchchat-history-content\">\n\t\t\t\t<div v-for=\"item in group.items\" :key=\"item.id\" :ref=\"el => setHistoryItemRef(item.id, el as HTMLElement)\" :class=\"[item.id === activeChat ? 'is-on' : '', 'touchchat-history-item']\" @click=\"handleSelectChat(item.id)\">\n\t\t\t\t\t<div :ref=\"el => setTooltipContainerRef(item.id, el as HTMLElement)\" class=\"touchchat-history-item-text\" style=\"flex: 1\">\n\t\t\t\t\t\t<template v-if=\"editingId === item.id\">\n\t\t\t\t\t\t\t<div class=\"touchchat-history-input\">\n\t\t\t\t\t\t\t\t<input :ref=\"el => setEditInputRef(item.id, el as HTMLInputElement)\" v-model=\"editTitle\" @blur=\"handleRenameComplete(item.id)\" @keyup.enter=\"handleRenameComplete(item.id)\" @click.stop />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ item.title || '新对话' }}\n\t\t\t\t\t\t\t<div v-if=\"shouldShowTooltip(item.id, item.title)\" ref=\"tooltipRef\" class=\"touchchat-tooltip\">\n\t\t\t\t\t\t\t\t{{ item.title }}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- 菜单显示状态 - 添加条件判断隐藏操作按钮 -->\n\t\t\t\t\t<div v-if=\"editingId !== item.id\" class=\"touchchat-history-fn\">\n\t\t\t\t\t\t<button class=\"touchchat-history-more\" @click.stop=\"handleToggleActionMenu(item.id)\">\n\t\t\t\t\t\t\t<div class=\"touchchat-history-more-icon\"></div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div v-if=\"state.actionMenuVisible[item.id]\" :ref=\"el => (actionMenus[item.id] = el as HTMLElement)\" class=\"touchchat-history-float\" @mouseenter=\"preventMenuClose\" @mouseleave=\"delayedCloseMenu(item.id)\">\n\t\t\t\t\t\t\t<div class=\"touchchat-history-rename\" @click.stop=\"handleStartRename(item.id)\">\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-rename-icon\"></span>\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-rename-text\">重命名</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"touchchat-history-remove\" @click.stop=\"handleMenuAction('delete', item.id)\">\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-remove-icon\"></span>\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-remove-text\">删除</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"isDeleteDialogVisible\" class=\"delete-dialog-overlay\">\n\t\t\t<div class=\"delete-dialog\">\n\t\t\t\t<div class=\"delete-dialog-title\">永久删除对话</div>\n\t\t\t\t<div class=\"delete-dialog-content\">删除后,该对话将不可恢复。确认删除吗?</div>\n\t\t\t\t<div class=\"delete-dialog-actions\">\n\t\t\t\t\t<button class=\"delete-dialog-cancel\" @click=\"handleCancelDelete\">取消</button>\n\t\t\t\t\t<button class=\"delete-dialog-confirm\" @click=\"handleConfirmDelete\">确认</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, reactive, nextTick, computed, watch, inject } from 'vue'\n\n// 类型定义\ninterface ChatMessage {\n\tchatId?: string\n\tuser: string\n\ttype: string\n\tcontent: string\n\tisShowAvatar?: boolean\n\tavatar?: string\n\tisChating?: boolean\n\tthinkContent?: string\n\treasoningContent?: string\n}\n\ninterface HistoryItem {\n\tid: string\n\ttitle: string\n\ttime: Date\n\ttype: string\n\tmessages?: ChatMessage[]\n}\n\ninterface GroupedChat {\n\tgroupKey: string\n\tgroupName: string\n\titems: HistoryItem[]\n}\n\n// Props\nconst props = defineProps<{\n\tactiveChat: string\n\tchatHistory: HistoryItem[]\n}>()\n\nconst isDeleteDialogVisible = ref(false)\nconst deletingId = ref('')\n\nconst isRobot = inject('scripts', []).length > 0\n\n// Emits\nconst emit = defineEmits<{\n\t(e: 'select-chat', id: string): void\n\t(e: 'rename-chat', id: string, newTitle: string): void\n\t(e: 'delete-chat', id: string): void\n}>()\n\n// 内部状态\nconst actionMenus = ref<Record<string, HTMLElement | null>>({})\nconst tooltipContainerRefs = ref<Record<string, HTMLElement | null>>({})\nconst editingId = ref<string | null>(null)\nconst editTitle = ref('')\nconst editInputRefs = ref<Record<string, HTMLInputElement | null>>({}) // 修改为对象存储多个引用\n\n// 设置输入框引用\nconst setEditInputRef = (id: string, el: HTMLInputElement | null) => {\n\teditInputRefs.value[id] = el\n}\n\nconst setTooltipContainerRef = (id: string, el: HTMLElement | null) => {\n\ttooltipContainerRefs.value[id] = el\n}\n\nconst state = reactive<{\n\tactionMenuVisible: Record<string, boolean>\n}>({\n\tactionMenuVisible: {}\n})\n\nconst sideBottom = inject<() => void>('sideBottom', () => {\n\tconsole.warn('未提供bottom函数')\n})\n\n// 开始重命名\nlet scrollTimeout: ReturnType<typeof setTimeout> | null = null\nconst handleScroll = (event: Event) => {\n\tif (scrollTimeout) {\n\t\tclearTimeout(scrollTimeout)\n\t}\n\tscrollTimeout = setTimeout(() => {\n\t\tconst container = event.target as HTMLElement\n\t\tconst { scrollTop, scrollHeight, clientHeight } = container\n\t\tconst isBottom = scrollHeight - scrollTop <= clientHeight + 10 // 10px 缓冲\n\t\tif (isBottom) {\n\t\t\tsideBottom()\n\t\t}\n\t}, 200)\n}\n\nconst handleStartRename = (id: string) => {\n\tconst item = props.chatHistory.find(item => item.id === id)\n\tif (item) {\n\t\teditingId.value = id\n\t\teditTitle.value = item.title || ''\n\t\tstate.actionMenuVisible[id] = false\n\t\tnextTick(() => {\n\t\t\teditInputRefs.value[id]?.focus()\n\t\t})\n\t}\n}\n\n// 完成重命名\nconst handleRenameComplete = (id: string) => {\n\tif (editingId.value === id) {\n\t\tconst trimmedTitle = editTitle.value.trim()\n\t\tif (trimmedTitle) {\n\t\t\temit('rename-chat', id, trimmedTitle)\n\t\t}\n\t\teditingId.value = null\n\t}\n}\n\n// 时间分组辅助函数\nconst getGroupKey = (date: Date): string => {\n\tconst now = new Date()\n\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\tconst yesterday = new Date(today)\n\tyesterday.setDate(yesterday.getDate() - 1)\n\tconst sevenDaysAgo = new Date(today)\n\tsevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7)\n\tconst thirtyDaysAgo = new Date(today)\n\tthirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30)\n\n\tconst targetDate = new Date(date)\n\tconst targetDateNormalized = new Date(targetDate.getFullYear(), targetDate.getMonth(), targetDate.getDate())\n\n\tif (targetDateNormalized >= today) return 'today'\n\tif (targetDateNormalized >= yesterday) return 'yesterday'\n\tif (targetDate >= sevenDaysAgo) return 'sevenDays'\n\tif (targetDate >= thirtyDaysAgo) return 'thirtyDays'\n\treturn `${targetDate.getFullYear()}-${String(targetDate.getMonth() + 1).padStart(2, '0')}`\n}\n\n// 格式化分组名称\nconst formatGroupName = (key: string): string => {\n\tswitch (key) {\n\t\tcase 'today':\n\t\t\treturn '今天'\n\t\tcase 'yesterday':\n\t\t\treturn '昨天'\n\t\tcase 'sevenDays':\n\t\t\treturn '7天内'\n\t\tcase 'thirtyDays':\n\t\t\treturn '30天内'\n\t\tdefault:\n\t\t\treturn key\n\t}\n}\n\nconst handleMenuAction = (action: string, id: string) => {\n\tif (action === 'delete') {\n\t\tdeletingId.value = id\n\t\tisDeleteDialogVisible.value = true\n\t}\n}\n\nconst handleConfirmDelete = () => {\n\temit('delete-chat', deletingId.value)\n\tisDeleteDialogVisible.value = false\n}\n\nconst handleCancelDelete = () => {\n\tisDeleteDialogVisible.value = false\n}\n\n// 按时间分组的计算属性\nconst groupedChatHistory = computed<GroupedChat[]>(() => {\n\tif (props.chatHistory.length === 0) return []\n\tconst filterHistory = props.chatHistory.filter(item => item.type === '')\n\t// 复制并排序对话(最新的在前)\n\tconst sortedChats = [...filterHistory].sort((a, b) => new Date(b.time).getTime() - new Date(a.time).getTime())\n\n\t// 分组处理\n\tconst groups: Record<string, HistoryItem[]> = {}\n\tsortedChats.forEach(chat => {\n\t\tconst key = getGroupKey(new Date(chat.time))\n\t\tif (!groups[key]) groups[key] = []\n\t\tgroups[key].push(chat)\n\t})\n\n\t// 转换为有序数组\n\treturn Object.entries(groups)\n\t\t.map(([key, items]) => ({\n\t\t\tgroupKey: key,\n\t\t\tgroupName: formatGroupName(key),\n\t\t\titems\n\t\t}))\n\t\t.sort((a, b) => {\n\t\t\t// 自定义排序确保分组顺序正确\n\t\t\tconst order: Record<string, number> = {\n\t\t\t\ttoday: 0,\n\t\t\t\tyesterday: 1,\n\t\t\t\tsevenDays: 2,\n\t\t\t\tthirtyDays: 3\n\t\t\t}\n\t\t\treturn (order[a.groupKey] ?? 100) - (order[b.groupKey] ?? 100) || b.groupKey.localeCompare(a.groupKey)\n\t\t})\n})\n\n// 修改缓存类型定义\ninterface TooltipCacheItem {\n\tvalue: boolean\n\ttimestamp: number\n}\n\n// 使用Map存储每个ID的测量结果,避免重复计算\nconst tooltipMeasurementCache = new Map<string, TooltipCacheItem>()\n\nconst clearTooltipCache = () => {\n\ttooltipMeasurementCache.clear()\n}\n\nwatch(() => props.chatHistory, clearTooltipCache)\n\n// 改进shouldShowTooltip函数\nconst shouldShowTooltip = (id: string, title: string) => {\n\tif (!title || editingId.value === id) return false\n\n\t// 获取容器元素\n\tconst containerEl = tooltipContainerRefs.value[id]\n\tif (!containerEl) {\n\t\treturn false\n\t}\n\n\t// 强制重新计算布局\n\tcontainerEl.getBoundingClientRect()\n\t// 获取容器的实际宽度(包括padding和border)\n\tconst containerStyle = window.getComputedStyle(containerEl)\n\tconst containerWidth = containerEl.offsetWidth\n\tconst containerPaddingX = parseFloat(containerStyle.paddingLeft) + parseFloat(containerStyle.paddingRight)\n\tconst containerBorderX = parseFloat(containerStyle.borderLeftWidth) + parseFloat(containerStyle.borderRightWidth)\n\t// 内容区域宽度 = 总宽度 - padding - border\n\tconst contentWidth = containerWidth - containerPaddingX - containerBorderX\n\n\t// 如果容器宽度为0,不缓存结果,返回false\n\tif (containerWidth === 0) {\n\t\treturn false\n\t}\n\n\t// 检查缓存,但添加时间戳以支持定期更新\n\tconst now = Date.now()\n\tconst cacheKey = `${id}_${containerWidth}_${contentWidth}` // 改进缓存键\n\tif (tooltipMeasurementCache.has(cacheKey)) {\n\t\tconst cached = tooltipMeasurementCache.get(cacheKey)\n\t\t// 如果缓存项存在且未过期(5秒)\n\t\tif (cached && now - cached.timestamp < 5000) {\n\t\t\treturn cached.value\n\t\t}\n\t}\n\n\t// 创建临时元素测量文本宽度\n\tconst tempElement = document.createElement('span')\n\ttempElement.className = 'history-title'\n\ttempElement.textContent = title\n\n\t// 复制实际元素的样式\n\tconst historyTitleEl = containerEl.querySelector('.history-title')\n\tif (historyTitleEl) {\n\t\tconst titleStyle = window.getComputedStyle(historyTitleEl)\n\t\t// 复制所有相关样式\n\t\ttempElement.style.fontSize = titleStyle.fontSize\n\t\ttempElement.style.fontFamily = titleStyle.fontFamily\n\t\ttempElement.style.fontWeight = titleStyle.fontWeight\n\t\ttempElement.style.letterSpacing = titleStyle.letterSpacing\n\t\ttempElement.style.wordSpacing = titleStyle.wordSpacing\n\t\ttempElement.style.textTransform = titleStyle.textTransform\n\t}\n\n\ttempElement.style.visibility = 'hidden'\n\ttempElement.style.position = 'absolute'\n\ttempElement.style.whiteSpace = 'nowrap'\n\tdocument.body.appendChild(tempElement)\n\n\t// 强制重绘\n\ttempElement.getBoundingClientRect()\n\tconst textWidth = tempElement.offsetWidth\n\n\tdocument.body.removeChild(tempElement)\n\n\t// 添加5px阈值,避免边框等因素导致的误差\n\tconst shouldShow = textWidth > contentWidth + 5\n\n\t// 缓存结果,包含时间戳\n\ttooltipMeasurementCache.set(cacheKey, {\n\t\tvalue: shouldShow,\n\t\ttimestamp: now\n\t})\n\n\treturn shouldShow\n}\n\n// 事件处理\nconst handleSelectChat = (id: string) => {\n\tif (editingId.value === null) {\n\t\temit('select-chat', id)\n\t\tresetAllMenus()\n\t}\n}\n\nconst resetAllMenus = () => {\n\tObject.keys(state.actionMenuVisible).forEach(key => {\n\t\tstate.actionMenuVisible[key] = false\n\t})\n}\n\nconst handleToggleActionMenu = (id: string, event?: MouseEvent) => {\n\tif (editingId.value === null) {\n\t\tevent?.stopPropagation()\n\t\tprops.chatHistory.forEach(item => {\n\t\t\titem.id !== id && (state.actionMenuVisible[item.id] = false)\n\t\t})\n\t\tstate.actionMenuVisible[id] = !state.actionMenuVisible[id]\n\n\t\t// 添加动态定位逻辑\n\t\tif (state.actionMenuVisible[id]) {\n\t\t\tpositionActionMenu(id)\n\t\t}\n\t}\n}\n\n// 添加对history-group容器的引用\nconst historyListRef = ref<HTMLUListElement | null>(null)\n\n// 添加对历史记录项的引用\nconst historyItemRefs = ref<Record<string, HTMLElement | null>>({})\n\nconst setHistoryItemRef = (id: string, el: HTMLElement | null) => {\n\thistoryItemRefs.value[id] = el\n}\n\n// 添加菜单定位函数\nconst positionActionMenu = (id: string) => {\n\tnextTick(() => {\n\t\tconst menuEl = actionMenus.value[id]\n\t\tconst historyItemEl = historyItemRefs.value[id]\n\t\tif (!menuEl || !historyItemEl || !historyListRef.value) return\n\n\t\t// 重置样式\n\t\tmenuEl.style.top = ''\n\t\tmenuEl.style.bottom = ''\n\t\tmenuEl.style.transform = ''\n\t\tmenuEl.style.marginTop = ''\n\t\tmenuEl.style.position = 'absolute'\n\n\t\tconst menuHeight = menuEl.offsetHeight\n\t\tconst historyItemRect = historyItemEl.getBoundingClientRect()\n\t\tconst listRect = historyListRef.value.getBoundingClientRect()\n\t\tconst buttonEl = menuEl.previousElementSibling as HTMLElement\n\n\t\t// 计算历史记录项底部到列表容器底部的距离\n\t\tconst distanceToBottom = listRect.bottom - historyItemRect.bottom\n\n\t\t// 如果距离小于菜单高度,则显示在上方\n\t\tif (distanceToBottom < menuHeight) {\n\t\t\tif (buttonEl) {\n\t\t\t\t// const buttonRect = buttonEl.getBoundingClientRect();\n\t\t\t\t// 直接设置菜单顶部位置为按钮顶部减去菜单高度\n\t\t\t\tmenuEl.style.top = `${-menuHeight}px`\n\t\t\t\tmenuEl.style.bottom = 'auto'\n\t\t\t\tmenuEl.style.transform = 'none'\n\t\t\t}\n\t\t} else {\n\t\t\t// 否则显示在下方\n\t\t\tmenuEl.style.top = '100%'\n\t\t\tmenuEl.style.bottom = 'auto'\n\t\t\tmenuEl.style.transform = 'translateY(0)'\n\t\t}\n\t})\n}\n\n// 添加菜单关闭延迟逻辑\nlet menuCloseTimer: number | null = null\n\nconst preventMenuClose = () => {\n\tif (menuCloseTimer) {\n\t\tclearTimeout(menuCloseTimer)\n\t\tmenuCloseTimer = null\n\t}\n}\n\nconst delayedCloseMenu = (id: string) => {\n\tpreventMenuClose()\n\tmenuCloseTimer = window.setTimeout(() => {\n\t\tstate.actionMenuVisible[id] = false\n\t}, 200)\n}\n</script>\n"],"names":["item","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_renderList","_createElementVNode","_toDisplayString","_openBlock","_withKeys","_withModifiers"],"mappings":"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"}
1
+ {"version":3,"file":"HistoryList.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/HistoryList.vue"],"sourcesContent":["<template>\r\n\t<div ref=\"historyListRef\" class=\"touchchat-history\" :class=\"{ 'is-robot': isRobot }\" @scroll=\"handleScroll\">\r\n\t\t<!-- 动态时间分组 -->\r\n\t\t<div v-for=\"group in groupedChatHistory\" :key=\"group.groupKey\" class=\"touchchat-history-group\">\r\n\t\t\t<!-- 分组标题 -->\r\n\t\t\t<div class=\"touchchat-history-title\">\r\n\t\t\t\t<div class=\"touchchat-history-title-icon\"></div>\r\n\t\t\t\t<div class=\"touchchat-history-title-text\">\r\n\t\t\t\t\t{{ group.groupName }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- 分组内对话项 -->\r\n\t\t\t<div class=\"touchchat-history-content\">\r\n\t\t\t\t<div v-for=\"item in group.items\" :key=\"item.id\" :ref=\"el => setHistoryItemRef(item.id, el as HTMLElement)\" :class=\"[item.id === activeChat ? 'is-on' : '', 'touchchat-history-item']\" @click=\"handleSelectChat(item.id)\">\r\n\t\t\t\t\t<div :ref=\"el => setTooltipContainerRef(item.id, el as HTMLElement)\" class=\"touchchat-history-item-text\" style=\"flex: 1\">\r\n\t\t\t\t\t\t<template v-if=\"editingId === item.id\">\r\n\t\t\t\t\t\t\t<div class=\"touchchat-history-input\">\r\n\t\t\t\t\t\t\t\t<input :ref=\"el => setEditInputRef(item.id, el as HTMLInputElement)\" v-model=\"editTitle\" @blur=\"handleRenameComplete(item.id)\" @keyup.enter=\"handleRenameComplete(item.id)\" @click.stop />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t<template v-else>\r\n\t\t\t\t\t\t\t{{ item.title || '新对话' }}\r\n\t\t\t\t\t\t\t<div v-if=\"shouldShowTooltip(item.id, item.title)\" ref=\"tooltipRef\" class=\"touchchat-tooltip\">\r\n\t\t\t\t\t\t\t\t{{ item.title }}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- 菜单显示状态 - 添加条件判断隐藏操作按钮 -->\r\n\t\t\t\t\t<div v-if=\"editingId !== item.id\" class=\"touchchat-history-fn\">\r\n\t\t\t\t\t\t<button class=\"touchchat-history-more\" @click.stop=\"handleToggleActionMenu(item.id)\">\r\n\t\t\t\t\t\t\t<div class=\"touchchat-history-more-icon\"></div>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<div v-if=\"state.actionMenuVisible[item.id]\" :ref=\"el => (actionMenus[item.id] = el as HTMLElement)\" class=\"touchchat-history-float\" @mouseenter=\"preventMenuClose\" @mouseleave=\"delayedCloseMenu(item.id)\">\r\n\t\t\t\t\t\t\t<div class=\"touchchat-history-rename\" @click.stop=\"handleStartRename(item.id)\">\r\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-rename-icon\"></span>\r\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-rename-text\">重命名</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"touchchat-history-remove\" @click.stop=\"handleMenuAction('delete', item.id)\">\r\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-remove-icon\"></span>\r\n\t\t\t\t\t\t\t\t<span class=\"touchchat-history-remove-text\">删除</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div v-if=\"isDeleteDialogVisible\" class=\"delete-dialog-overlay\">\r\n\t\t\t<div class=\"delete-dialog\">\r\n\t\t\t\t<div class=\"delete-dialog-title\">永久删除对话</div>\r\n\t\t\t\t<div class=\"delete-dialog-content\">删除后,该对话将不可恢复。确认删除吗?</div>\r\n\t\t\t\t<div class=\"delete-dialog-actions\">\r\n\t\t\t\t\t<button class=\"delete-dialog-cancel\" @click=\"handleCancelDelete\">取消</button>\r\n\t\t\t\t\t<button class=\"delete-dialog-confirm\" @click=\"handleConfirmDelete\">确认</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, reactive, nextTick, computed, watch, inject } from 'vue'\r\n\r\n// 类型定义\r\ninterface ChatMessage {\r\n\tchatId?: string\r\n\tuser: string\r\n\ttype: string\r\n\tcontent: string\r\n\tisShowAvatar?: boolean\r\n\tavatar?: string\r\n\tisChating?: boolean\r\n\tthinkContent?: string\r\n\treasoningContent?: string\r\n}\r\n\r\ninterface HistoryItem {\r\n\tid: string\r\n\ttitle: string\r\n\ttime: Date\r\n\ttype: string\r\n\tmessages?: ChatMessage[]\r\n}\r\n\r\ninterface GroupedChat {\r\n\tgroupKey: string\r\n\tgroupName: string\r\n\titems: HistoryItem[]\r\n}\r\n\r\n// Props\r\nconst props = defineProps<{\r\n\tactiveChat: string\r\n\tchatHistory: HistoryItem[]\r\n}>()\r\n\r\nconst isDeleteDialogVisible = ref(false)\r\nconst deletingId = ref('')\r\n\r\nconst isRobot = inject('scripts', []).length > 0\r\n\r\n// Emits\r\nconst emit = defineEmits<{\r\n\t(e: 'select-chat', id: string): void\r\n\t(e: 'rename-chat', id: string, newTitle: string): void\r\n\t(e: 'delete-chat', id: string): void\r\n}>()\r\n\r\n// 内部状态\r\nconst actionMenus = ref<Record<string, HTMLElement | null>>({})\r\nconst tooltipContainerRefs = ref<Record<string, HTMLElement | null>>({})\r\nconst editingId = ref<string | null>(null)\r\nconst editTitle = ref('')\r\nconst editInputRefs = ref<Record<string, HTMLInputElement | null>>({}) // 修改为对象存储多个引用\r\n\r\n// 设置输入框引用\r\nconst setEditInputRef = (id: string, el: HTMLInputElement | null) => {\r\n\teditInputRefs.value[id] = el\r\n}\r\n\r\nconst setTooltipContainerRef = (id: string, el: HTMLElement | null) => {\r\n\ttooltipContainerRefs.value[id] = el\r\n}\r\n\r\nconst state = reactive<{\r\n\tactionMenuVisible: Record<string, boolean>\r\n}>({\r\n\tactionMenuVisible: {}\r\n})\r\n\r\nconst sideBottom = inject<() => void>('sideBottom', () => {\r\n\tconsole.warn('未提供bottom函数')\r\n})\r\n\r\n// 开始重命名\r\nlet scrollTimeout: ReturnType<typeof setTimeout> | null = null\r\nconst handleScroll = (event: Event) => {\r\n\tif (scrollTimeout) {\r\n\t\tclearTimeout(scrollTimeout)\r\n\t}\r\n\tscrollTimeout = setTimeout(() => {\r\n\t\tconst container = event.target as HTMLElement\r\n\t\tconst { scrollTop, scrollHeight, clientHeight } = container\r\n\t\tconst isBottom = scrollHeight - scrollTop <= clientHeight + 10 // 10px 缓冲\r\n\t\tif (isBottom) {\r\n\t\t\tsideBottom()\r\n\t\t}\r\n\t}, 200)\r\n}\r\n\r\nconst handleStartRename = (id: string) => {\r\n\tconst item = props.chatHistory.find(item => item.id === id)\r\n\tif (item) {\r\n\t\teditingId.value = id\r\n\t\teditTitle.value = item.title || ''\r\n\t\tstate.actionMenuVisible[id] = false\r\n\t\tnextTick(() => {\r\n\t\t\teditInputRefs.value[id]?.focus()\r\n\t\t})\r\n\t}\r\n}\r\n\r\n// 完成重命名\r\nconst handleRenameComplete = (id: string) => {\r\n\tif (editingId.value === id) {\r\n\t\tconst trimmedTitle = editTitle.value.trim()\r\n\t\tif (trimmedTitle) {\r\n\t\t\temit('rename-chat', id, trimmedTitle)\r\n\t\t}\r\n\t\teditingId.value = null\r\n\t}\r\n}\r\n\r\n// 时间分组辅助函数\r\nconst getGroupKey = (date: Date): string => {\r\n\tconst now = new Date()\r\n\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\r\n\tconst yesterday = new Date(today)\r\n\tyesterday.setDate(yesterday.getDate() - 1)\r\n\tconst sevenDaysAgo = new Date(today)\r\n\tsevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7)\r\n\tconst thirtyDaysAgo = new Date(today)\r\n\tthirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30)\r\n\r\n\tconst targetDate = new Date(date)\r\n\tconst targetDateNormalized = new Date(targetDate.getFullYear(), targetDate.getMonth(), targetDate.getDate())\r\n\r\n\tif (targetDateNormalized >= today) return 'today'\r\n\tif (targetDateNormalized >= yesterday) return 'yesterday'\r\n\tif (targetDate >= sevenDaysAgo) return 'sevenDays'\r\n\tif (targetDate >= thirtyDaysAgo) return 'thirtyDays'\r\n\treturn `${targetDate.getFullYear()}-${String(targetDate.getMonth() + 1).padStart(2, '0')}`\r\n}\r\n\r\n// 格式化分组名称\r\nconst formatGroupName = (key: string): string => {\r\n\tswitch (key) {\r\n\t\tcase 'today':\r\n\t\t\treturn '今天'\r\n\t\tcase 'yesterday':\r\n\t\t\treturn '昨天'\r\n\t\tcase 'sevenDays':\r\n\t\t\treturn '7天内'\r\n\t\tcase 'thirtyDays':\r\n\t\t\treturn '30天内'\r\n\t\tdefault:\r\n\t\t\treturn key\r\n\t}\r\n}\r\n\r\nconst handleMenuAction = (action: string, id: string) => {\r\n\tif (action === 'delete') {\r\n\t\tdeletingId.value = id\r\n\t\tisDeleteDialogVisible.value = true\r\n\t}\r\n}\r\n\r\nconst handleConfirmDelete = () => {\r\n\temit('delete-chat', deletingId.value)\r\n\tisDeleteDialogVisible.value = false\r\n}\r\n\r\nconst handleCancelDelete = () => {\r\n\tisDeleteDialogVisible.value = false\r\n}\r\n\r\n// 按时间分组的计算属性\r\nconst groupedChatHistory = computed<GroupedChat[]>(() => {\r\n\tif (props.chatHistory.length === 0) return []\r\n\tconst filterHistory = props.chatHistory.filter(item => item.type === '')\r\n\t// 复制并排序对话(最新的在前)\r\n\tconst sortedChats = [...filterHistory].sort((a, b) => new Date(b.time).getTime() - new Date(a.time).getTime())\r\n\r\n\t// 分组处理\r\n\tconst groups: Record<string, HistoryItem[]> = {}\r\n\tsortedChats.forEach(chat => {\r\n\t\tconst key = getGroupKey(new Date(chat.time))\r\n\t\tif (!groups[key]) groups[key] = []\r\n\t\tgroups[key].push(chat)\r\n\t})\r\n\r\n\t// 转换为有序数组\r\n\treturn Object.entries(groups)\r\n\t\t.map(([key, items]) => ({\r\n\t\t\tgroupKey: key,\r\n\t\t\tgroupName: formatGroupName(key),\r\n\t\t\titems\r\n\t\t}))\r\n\t\t.sort((a, b) => {\r\n\t\t\t// 自定义排序确保分组顺序正确\r\n\t\t\tconst order: Record<string, number> = {\r\n\t\t\t\ttoday: 0,\r\n\t\t\t\tyesterday: 1,\r\n\t\t\t\tsevenDays: 2,\r\n\t\t\t\tthirtyDays: 3\r\n\t\t\t}\r\n\t\t\treturn (order[a.groupKey] ?? 100) - (order[b.groupKey] ?? 100) || b.groupKey.localeCompare(a.groupKey)\r\n\t\t})\r\n})\r\n\r\n// 修改缓存类型定义\r\ninterface TooltipCacheItem {\r\n\tvalue: boolean\r\n\ttimestamp: number\r\n}\r\n\r\n// 使用Map存储每个ID的测量结果,避免重复计算\r\nconst tooltipMeasurementCache = new Map<string, TooltipCacheItem>()\r\n\r\nconst clearTooltipCache = () => {\r\n\ttooltipMeasurementCache.clear()\r\n}\r\n\r\nwatch(() => props.chatHistory, clearTooltipCache)\r\n\r\n// 改进shouldShowTooltip函数\r\nconst shouldShowTooltip = (id: string, title: string) => {\r\n\tif (!title || editingId.value === id) return false\r\n\r\n\t// 获取容器元素\r\n\tconst containerEl = tooltipContainerRefs.value[id]\r\n\tif (!containerEl) {\r\n\t\treturn false\r\n\t}\r\n\r\n\t// 强制重新计算布局\r\n\tcontainerEl.getBoundingClientRect()\r\n\t// 获取容器的实际宽度(包括padding和border)\r\n\tconst containerStyle = window.getComputedStyle(containerEl)\r\n\tconst containerWidth = containerEl.offsetWidth\r\n\tconst containerPaddingX = parseFloat(containerStyle.paddingLeft) + parseFloat(containerStyle.paddingRight)\r\n\tconst containerBorderX = parseFloat(containerStyle.borderLeftWidth) + parseFloat(containerStyle.borderRightWidth)\r\n\t// 内容区域宽度 = 总宽度 - padding - border\r\n\tconst contentWidth = containerWidth - containerPaddingX - containerBorderX\r\n\r\n\t// 如果容器宽度为0,不缓存结果,返回false\r\n\tif (containerWidth === 0) {\r\n\t\treturn false\r\n\t}\r\n\r\n\t// 检查缓存,但添加时间戳以支持定期更新\r\n\tconst now = Date.now()\r\n\tconst cacheKey = `${id}_${containerWidth}_${contentWidth}` // 改进缓存键\r\n\tif (tooltipMeasurementCache.has(cacheKey)) {\r\n\t\tconst cached = tooltipMeasurementCache.get(cacheKey)\r\n\t\t// 如果缓存项存在且未过期(5秒)\r\n\t\tif (cached && now - cached.timestamp < 5000) {\r\n\t\t\treturn cached.value\r\n\t\t}\r\n\t}\r\n\r\n\t// 创建临时元素测量文本宽度\r\n\tconst tempElement = document.createElement('span')\r\n\ttempElement.className = 'history-title'\r\n\ttempElement.textContent = title\r\n\r\n\t// 复制实际元素的样式\r\n\tconst historyTitleEl = containerEl.querySelector('.history-title')\r\n\tif (historyTitleEl) {\r\n\t\tconst titleStyle = window.getComputedStyle(historyTitleEl)\r\n\t\t// 复制所有相关样式\r\n\t\ttempElement.style.fontSize = titleStyle.fontSize\r\n\t\ttempElement.style.fontFamily = titleStyle.fontFamily\r\n\t\ttempElement.style.fontWeight = titleStyle.fontWeight\r\n\t\ttempElement.style.letterSpacing = titleStyle.letterSpacing\r\n\t\ttempElement.style.wordSpacing = titleStyle.wordSpacing\r\n\t\ttempElement.style.textTransform = titleStyle.textTransform\r\n\t}\r\n\r\n\ttempElement.style.visibility = 'hidden'\r\n\ttempElement.style.position = 'absolute'\r\n\ttempElement.style.whiteSpace = 'nowrap'\r\n\tdocument.body.appendChild(tempElement)\r\n\r\n\t// 强制重绘\r\n\ttempElement.getBoundingClientRect()\r\n\tconst textWidth = tempElement.offsetWidth\r\n\r\n\tdocument.body.removeChild(tempElement)\r\n\r\n\t// 添加5px阈值,避免边框等因素导致的误差\r\n\tconst shouldShow = textWidth > contentWidth + 5\r\n\r\n\t// 缓存结果,包含时间戳\r\n\ttooltipMeasurementCache.set(cacheKey, {\r\n\t\tvalue: shouldShow,\r\n\t\ttimestamp: now\r\n\t})\r\n\r\n\treturn shouldShow\r\n}\r\n\r\n// 事件处理\r\nconst handleSelectChat = (id: string) => {\r\n\tif (editingId.value === null) {\r\n\t\temit('select-chat', id)\r\n\t\tresetAllMenus()\r\n\t}\r\n}\r\n\r\nconst resetAllMenus = () => {\r\n\tObject.keys(state.actionMenuVisible).forEach(key => {\r\n\t\tstate.actionMenuVisible[key] = false\r\n\t})\r\n}\r\n\r\nconst handleToggleActionMenu = (id: string, event?: MouseEvent) => {\r\n\tif (editingId.value === null) {\r\n\t\tevent?.stopPropagation()\r\n\t\tprops.chatHistory.forEach(item => {\r\n\t\t\titem.id !== id && (state.actionMenuVisible[item.id] = false)\r\n\t\t})\r\n\t\tstate.actionMenuVisible[id] = !state.actionMenuVisible[id]\r\n\r\n\t\t// 添加动态定位逻辑\r\n\t\tif (state.actionMenuVisible[id]) {\r\n\t\t\tpositionActionMenu(id)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// 添加对history-group容器的引用\r\nconst historyListRef = ref<HTMLUListElement | null>(null)\r\n\r\n// 添加对历史记录项的引用\r\nconst historyItemRefs = ref<Record<string, HTMLElement | null>>({})\r\n\r\nconst setHistoryItemRef = (id: string, el: HTMLElement | null) => {\r\n\thistoryItemRefs.value[id] = el\r\n}\r\n\r\n// 添加菜单定位函数\r\nconst positionActionMenu = (id: string) => {\r\n\tnextTick(() => {\r\n\t\tconst menuEl = actionMenus.value[id]\r\n\t\tconst historyItemEl = historyItemRefs.value[id]\r\n\t\tif (!menuEl || !historyItemEl || !historyListRef.value) return\r\n\r\n\t\t// 重置样式\r\n\t\tmenuEl.style.top = ''\r\n\t\tmenuEl.style.bottom = ''\r\n\t\tmenuEl.style.transform = ''\r\n\t\tmenuEl.style.marginTop = ''\r\n\t\tmenuEl.style.position = 'absolute'\r\n\r\n\t\tconst menuHeight = menuEl.offsetHeight\r\n\t\tconst historyItemRect = historyItemEl.getBoundingClientRect()\r\n\t\tconst listRect = historyListRef.value.getBoundingClientRect()\r\n\t\tconst buttonEl = menuEl.previousElementSibling as HTMLElement\r\n\r\n\t\t// 计算历史记录项底部到列表容器底部的距离\r\n\t\tconst distanceToBottom = listRect.bottom - historyItemRect.bottom\r\n\r\n\t\t// 如果距离小于菜单高度,则显示在上方\r\n\t\tif (distanceToBottom < menuHeight) {\r\n\t\t\tif (buttonEl) {\r\n\t\t\t\t// const buttonRect = buttonEl.getBoundingClientRect();\r\n\t\t\t\t// 直接设置菜单顶部位置为按钮顶部减去菜单高度\r\n\t\t\t\tmenuEl.style.top = `${-menuHeight}px`\r\n\t\t\t\tmenuEl.style.bottom = 'auto'\r\n\t\t\t\tmenuEl.style.transform = 'none'\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// 否则显示在下方\r\n\t\t\tmenuEl.style.top = '100%'\r\n\t\t\tmenuEl.style.bottom = 'auto'\r\n\t\t\tmenuEl.style.transform = 'translateY(0)'\r\n\t\t}\r\n\t})\r\n}\r\n\r\n// 添加菜单关闭延迟逻辑\r\nlet menuCloseTimer: number | null = null\r\n\r\nconst preventMenuClose = () => {\r\n\tif (menuCloseTimer) {\r\n\t\tclearTimeout(menuCloseTimer)\r\n\t\tmenuCloseTimer = null\r\n\t}\r\n}\r\n\r\nconst delayedCloseMenu = (id: string) => {\r\n\tpreventMenuClose()\r\n\tmenuCloseTimer = window.setTimeout(() => {\r\n\t\tstate.actionMenuVisible[id] = false\r\n\t}, 200)\r\n}\r\n</script>\r\n"],"names":["item","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_renderList","_createElementVNode","_toDisplayString","_openBlock","_withKeys","_withModifiers"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HistorySidebar.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/HistorySidebar.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-side\">\n\t\t<div class=\"touchchat-side-header\">\n\t\t\t<div class=\"touchchat-logo\">\n\t\t\t\t<div class=\"touchchat-logo-pic\"></div>\n\t\t\t\t<div class=\"touchchat-logo-text\">{{ title }}</div>\n\t\t\t</div>\n\t\t\t<div class=\"touchchat-side-fn\" @click=\"handleToggleSidebar\">\n\t\t\t\t<div class=\"touchchat-hidemenu\">\n\t\t\t\t\t<div class=\"touchchat-hidemenu-icon\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- 新对话按钮 -->\n\t\t<button class=\"touchchat-add\" @click=\"handleStartNewChat\">\n\t\t\t<div class=\"touchchat-add-icon\"></div>\n\t\t\t<div class=\"touchchat-add-text\">新建对话</div>\n\t\t</button>\n\n\t\t<agents-view :active-chat=\"activeChat\" @select-chat=\"agentsSelectChat\"></agents-view>\n\n\t\t<!-- 引入历史记录列表组件 -->\n\t\t<HistoryList :active-chat=\"activeChat\" :chat-history=\"chatHistory\" @select-chat=\"handleSelectChat\" @rename-chat=\"handleRenameChat\" @delete-chat=\"remove\" />\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\n// , watch\nimport { reactive, inject, ref } from 'vue'\nimport HistoryList from './HistoryList.vue'\nimport AgentsView from './AgentsView.vue'\n\n// 类型定义\ninterface ChatMessage {\n\tchatId?: string\n\tuser: string\n\ttype: string\n\tcontent: string\n\tisShowAvatar?: boolean\n\tavatar?: string\n\tisChating?: boolean\n\tthinkContent?: string\n\treasoningContent?: string\n}\n\ninterface HistoryItem {\n\tid: string\n\ttitle: string\n\ttime: Date\n\ttype: string\n\tmessages?: ChatMessage[]\n}\n\n// Props\nconst props = defineProps<{\n\tisSidebarCollapsed: boolean\n\tactiveChat: string\n\tchatHistory: HistoryItem[]\n}>()\n\n// watch(\n// \t() => props.chatHistory,\n// \tnewVal => {\n// \t\tconsole.log('props.chatHistory === HistorySidebar.vue === 162', newVal)\n// \t},\n// \t{ deep: true }\n// )\n\n// Emits\nconst emit = defineEmits<{\n\t(e: 'toggle-sidebar'): void\n\t(e: 'start-new-chat'): void\n\t(e: 'select-chat', id: string, type?: string): void\n\t(e: 'rename-chat', id: string, newTitle: string): void\n\t(e: 'delete-chat', id: string): void\n}>()\n\nconst title = ref(inject('title', 'TouchChat'))\n\n// 内部状态\nconst state = reactive<{\n\trenameInput: string\n\tcurrentRenameId: string\n}>({\n\trenameInput: '',\n\tcurrentRenameId: ''\n})\n\n// 处理重命名请求\nconst handleRenameChat = (id: string, title: string) => {\n\tconst item = props.chatHistory.find(item => item.id === id)\n\tif (item) {\n\t\tstate.currentRenameId = id\n\t\tstate.renameInput = item.title\n\t\temit('rename-chat', id, title)\n\t}\n}\n\n// 处理删除请求\nconst remove = (id: string) => {\n\temit('delete-chat', id)\n}\n\n// 其他事件处理\nconst handleToggleSidebar = () => {\n\temit('toggle-sidebar')\n}\n\nconst handleStartNewChat = () => {\n\temit('start-new-chat')\n}\n\nconst agentsSelectChat = (id: string) => {\n\thandleSelectChat(id, 'agents')\n}\n\nconst handleSelectChat = (id: string, type?: string) => {\n\temit('select-chat', id, type)\n}\n</script>\n"],"names":["title","item","_createElementBlock","_createElementVNode","_createCommentVNode","_createVNode"],"mappings":"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"}
1
+ {"version":3,"file":"HistorySidebar.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/HistorySidebar.vue"],"sourcesContent":["<template>\r\n\t<div class=\"touchchat-side\">\r\n\t\t<div class=\"touchchat-side-header\">\r\n\t\t\t<div class=\"touchchat-logo\">\r\n\t\t\t\t<div class=\"touchchat-logo-pic\"></div>\r\n\t\t\t\t<div class=\"touchchat-logo-text\">{{ title }}</div>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"touchchat-side-fn\" @click=\"handleToggleSidebar\">\r\n\t\t\t\t<div class=\"touchchat-hidemenu\">\r\n\t\t\t\t\t<div class=\"touchchat-hidemenu-icon\"></div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- 新对话按钮 -->\r\n\t\t<button class=\"touchchat-add\" @click=\"handleStartNewChat\">\r\n\t\t\t<div class=\"touchchat-add-icon\"></div>\r\n\t\t\t<div class=\"touchchat-add-text\">新建对话</div>\r\n\t\t</button>\r\n\r\n\t\t<agents-view :active-chat=\"activeChat\" @select-chat=\"agentsSelectChat\"></agents-view>\r\n\r\n\t\t<!-- 引入历史记录列表组件 -->\r\n\t\t<HistoryList :active-chat=\"activeChat\" :chat-history=\"chatHistory\" @select-chat=\"handleSelectChat\" @rename-chat=\"handleRenameChat\" @delete-chat=\"remove\" />\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n// , watch\r\nimport { reactive, inject, ref } from 'vue'\r\nimport HistoryList from './HistoryList.vue'\r\nimport AgentsView from './AgentsView.vue'\r\n\r\n// 类型定义\r\ninterface ChatMessage {\r\n\tchatId?: string\r\n\tuser: string\r\n\ttype: string\r\n\tcontent: string\r\n\tisShowAvatar?: boolean\r\n\tavatar?: string\r\n\tisChating?: boolean\r\n\tthinkContent?: string\r\n\treasoningContent?: string\r\n}\r\n\r\ninterface HistoryItem {\r\n\tid: string\r\n\ttitle: string\r\n\ttime: Date\r\n\ttype: string\r\n\tmessages?: ChatMessage[]\r\n}\r\n\r\n// Props\r\nconst props = defineProps<{\r\n\tisSidebarCollapsed: boolean\r\n\tactiveChat: string\r\n\tchatHistory: HistoryItem[]\r\n}>()\r\n\r\n// watch(\r\n// \t() => props.chatHistory,\r\n// \tnewVal => {\r\n// \t\tconsole.log('props.chatHistory === HistorySidebar.vue === 162', newVal)\r\n// \t},\r\n// \t{ deep: true }\r\n// )\r\n\r\n// Emits\r\nconst emit = defineEmits<{\r\n\t(e: 'toggle-sidebar'): void\r\n\t(e: 'start-new-chat'): void\r\n\t(e: 'select-chat', id: string, type?: string): void\r\n\t(e: 'rename-chat', id: string, newTitle: string): void\r\n\t(e: 'delete-chat', id: string): void\r\n}>()\r\n\r\nconst title = ref(inject('title', 'TouchChat'))\r\n\r\n// 内部状态\r\nconst state = reactive<{\r\n\trenameInput: string\r\n\tcurrentRenameId: string\r\n}>({\r\n\trenameInput: '',\r\n\tcurrentRenameId: ''\r\n})\r\n\r\n// 处理重命名请求\r\nconst handleRenameChat = (id: string, title: string) => {\r\n\tconst item = props.chatHistory.find(item => item.id === id)\r\n\tif (item) {\r\n\t\tstate.currentRenameId = id\r\n\t\tstate.renameInput = item.title\r\n\t\temit('rename-chat', id, title)\r\n\t}\r\n}\r\n\r\n// 处理删除请求\r\nconst remove = (id: string) => {\r\n\temit('delete-chat', id)\r\n}\r\n\r\n// 其他事件处理\r\nconst handleToggleSidebar = () => {\r\n\temit('toggle-sidebar')\r\n}\r\n\r\nconst handleStartNewChat = () => {\r\n\temit('start-new-chat')\r\n}\r\n\r\nconst agentsSelectChat = (id: string) => {\r\n\thandleSelectChat(id, 'agents')\r\n}\r\n\r\nconst handleSelectChat = (id: string, type?: string) => {\r\n\temit('select-chat', id, type)\r\n}\r\n</script>\r\n"],"names":["title","item","_createElementBlock","_createElementVNode","_createCommentVNode","_createVNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SiderBarView.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/SiderBarView.vue"],"sourcesContent":["<template>\n\t<div class=\"sider-bar-view\" :class=\"flag ? 'sider-bar-view-flag' : ''\">\n\t\t<slot name=\"extend\" :item=\"item\" :index=\"index\"></slot>\n\t</div>\n</template>\n<script setup lang=\"ts\">\nimport type { ChatMessage } from './Chat/types'\ndefineProps<{\n\tflag: boolean\n\titem: ChatMessage\n\tindex: number\n}>()\n</script>\n"],"names":["_createElementBlock","_normalizeClass","_renderSlot"],"mappings":";;;;;;;;;;;wBACC,EAAAA,kBAAA;AAAA,QAEM,KAAA;AAAA,QAAA;AAAA,UAFD,KAAA,EAAKC,eAAA,CAAC,gBAAA,EAAyB,QAAI,IAAA,GAAA,qBAAA,GAAA,EAAA,CAAA,CAAA;AAAA;;UACvCC,UAAA,CAAuD,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA;AAAA,YAAlC,MAAM,OAAI,CAAA,IAAA;AAAA,YAAG,OAAO,OAAK,CAAA,KAAA;AAAA;;;;;;;;;;;"}
1
+ {"version":3,"file":"SiderBarView.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/SiderBarView.vue"],"sourcesContent":["<template>\r\n\t<div class=\"sider-bar-view\" :class=\"flag ? 'sider-bar-view-flag' : ''\">\r\n\t\t<slot name=\"extend\" :item=\"item\" :index=\"index\"></slot>\r\n\t</div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport type { ChatMessage } from './Chat/types'\r\ndefineProps<{\r\n\tflag: boolean\r\n\titem: ChatMessage\r\n\tindex: number\r\n}>()\r\n</script>\r\n"],"names":["_createElementBlock","_normalizeClass","_renderSlot"],"mappings":";;;;;;;;;;;wBACC,EAAAA,kBAAA;AAAA,QAEM,KAAA;AAAA,QAAA;AAAA,UAFD,KAAA,EAAKC,eAAA,CAAC,gBAAA,EAAyB,QAAI,IAAA,GAAA,qBAAA,GAAA,EAAA,CAAA,CAAA;AAAA;;UACvCC,UAAA,CAAuD,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA;AAAA,YAAlC,MAAM,OAAI,CAAA,IAAA;AAAA,YAAG,OAAO,OAAK,CAAA,KAAA;AAAA;;;;;;;;;;;"}
@@ -5,7 +5,7 @@ import ChatInput from './ChatInput.vue.mjs';
5
5
  import HelloChat from '../../component/HelloChat.vue.mjs';
6
6
  import { throttle } from '../../../../../node_modules/.pnpm/throttle-debounce@5.0.2/node_modules/throttle-debounce/esm/index.mjs';
7
7
  import { showToast } from '../../utils/tools.mjs';
8
- import purify from '../../../../../node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs';
8
+ import purify from '../../../../../node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs';
9
9
  import markdown from '../../utils/markdown.mjs';
10
10
  import { MessageAction, ThinkStatus } from './Chat/types.mjs';
11
11
  import { useMessageRender } from './Chat/useMessageRender.mjs';
@@ -29,7 +29,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
29
29
  name: "A2A Agent",
30
30
  version: "1.0",
31
31
  // 使用代理路径,配合 vite.config.ts 中的 /ai-gateway 代理配置
32
- endpoint: "/ai-gateway/a2a/agents/MjAxOTMwMTI4OjMwMDE1L2VuZ2luZS9hcGkvdjEvYTJhL2JiYmJiYmJiYi8xLjA=",
32
+ // endpoint: '/ai-gateway/a2a/agents/MjAxOTMwMTI4OjMwMDE1L2VuZ2luZS9hcGkvdjEvYTJhL2JiYmJiYmJiYi8xLjA=',
33
+ endpoint: "********",
33
34
  authToken: "c09f1251-e979-4a1a-ac67-6a11a8ab49f7",
34
35
  // endpoint: '/agent-api/Njd8NnwxfDUy',
35
36
  // authToken: 'a7ef44a7-9e85-4989-a2eb-34ae4dc76b7a',
@@ -91,6 +92,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
91
92
  const typeFlag = ref("");
92
93
  const scrollObserver = ref(null);
93
94
  const abortController = ref(null);
95
+ const isAborting = ref(false);
94
96
  const renderQueue = ref([]);
95
97
  const isRendering = ref(false);
96
98
  const currentMessageProcessor = ref(null);
@@ -217,7 +219,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
217
219
  }
218
220
  };
219
221
  const enqueueRender = (data) => {
220
- if (isUnmounting.value || !isMounted.value)
222
+ if (isUnmounting.value || !isMounted.value || isAborting.value)
221
223
  return;
222
224
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
223
225
  return;
@@ -251,6 +253,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
251
253
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
252
254
  return;
253
255
  const currentItem = chatList.value[currIndex.value];
256
+ if (currentItem.isError)
257
+ return;
254
258
  currentItem.thinkContent = data.thinkContent;
255
259
  currentItem.content = data.mainContent;
256
260
  currentItem.reasoningContent = data.reasoningContent;
@@ -335,8 +339,62 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
335
339
  }
336
340
  return "";
337
341
  };
342
+ const extractTextFromParts = (parts) => {
343
+ let text = "";
344
+ for (const part of parts) {
345
+ if ((part == null ? void 0 : part.data) && typeof part.data.content === "string") {
346
+ text += part.data.content;
347
+ } else if ((part == null ? void 0 : part.kind) === "text" && typeof part.text === "string") {
348
+ text += part.text;
349
+ } else if ((part == null ? void 0 : part.type) === "text" && typeof part.text === "string") {
350
+ text += part.text;
351
+ } else if (typeof (part == null ? void 0 : part.text) === "string") {
352
+ text += part.text;
353
+ }
354
+ }
355
+ return text;
356
+ };
357
+ const extractTextFromStreamChunk = (chunk) => {
358
+ var _a, _b, _c, _d, _e, _f, _g;
359
+ if (isA2A1_0Chunk(chunk)) {
360
+ return extractTextFromA2A1_0Chunk(chunk);
361
+ }
362
+ const result = chunk == null ? void 0 : chunk.result;
363
+ if (result) {
364
+ if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
365
+ return extractTextFromParts(result.artifact.parts);
366
+ }
367
+ if ((_c = (_b = result.status) == null ? void 0 : _b.message) == null ? void 0 : _c.parts) {
368
+ return extractTextFromParts(result.status.message.parts);
369
+ }
370
+ }
371
+ const params = chunk == null ? void 0 : chunk.params;
372
+ if (params) {
373
+ if ((_d = params.artifact) == null ? void 0 : _d.parts) {
374
+ return extractTextFromParts(params.artifact.parts);
375
+ }
376
+ if ((_f = (_e = params.status) == null ? void 0 : _e.message) == null ? void 0 : _f.parts) {
377
+ return extractTextFromParts(params.status.message.parts);
378
+ }
379
+ if ((_g = params.message) == null ? void 0 : _g.parts) {
380
+ return extractTextFromParts(params.message.parts);
381
+ }
382
+ }
383
+ return "";
384
+ };
385
+ const appendAgentStreamText = async (newText, chatId, accumulatedText) => {
386
+ if (!newText)
387
+ return accumulatedText;
388
+ const lastMessage = createTextMessage("", "agent");
389
+ if (newText.length > 10) {
390
+ return typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
391
+ }
392
+ const combinedText = accumulatedText + newText;
393
+ randerAngentMessage(combinedText, chatId);
394
+ return combinedText;
395
+ };
338
396
  const sendSingleAgentMessage = async (userContent, chatId) => {
339
- var _a, _b, _c, _d, _e;
397
+ var _a;
340
398
  abortController.value = new AbortController();
341
399
  const { signal } = abortController.value;
342
400
  const agentMessage = createTextMessage(userContent, "user");
@@ -369,65 +427,15 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
369
427
  isDone = true;
370
428
  break;
371
429
  }
372
- if (isA2A1_0Chunk(chunk)) {
373
- const newText = extractTextFromA2A1_0Chunk(chunk);
374
- if (newText) {
375
- fullResponseText += newText;
376
- const lastMessage = createTextMessage("", "agent");
377
- if (newText.length > 10) {
378
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
379
- } else {
380
- accumulatedText += newText;
381
- randerAngentMessage(accumulatedText, chatId);
382
- }
383
- }
384
- continue;
385
- }
386
- if (chunk.result) {
387
- const result = chunk.result;
388
- if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
389
- const contentParts = result.artifact.parts;
390
- let newText = "";
391
- for (const part of contentParts) {
392
- if (part.data && typeof part.data.content === "string") {
393
- newText += part.data.content;
394
- }
395
- }
396
- if (newText) {
397
- fullResponseText += newText;
398
- const lastMessage = createTextMessage("", "agent");
399
- if (newText.length > 10) {
400
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
401
- } else {
402
- accumulatedText += newText;
403
- randerAngentMessage(accumulatedText, chatId);
404
- }
405
- }
406
- }
407
- if ("status" in chunk.result) {
408
- const status = chunk.result.status;
409
- if ((_b = status == null ? void 0 : status.message) == null ? void 0 : _b.parts) {
410
- const textParts = status.message.parts.filter((p) => p.kind === "text");
411
- const newText = textParts.map((p) => p.text).join("");
412
- fullResponseText += newText;
413
- const lastMessage = createTextMessage("", "agent");
414
- if (newText.length > 10) {
415
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
416
- } else {
417
- accumulatedText += newText;
418
- randerAngentMessage(accumulatedText, chatId);
419
- }
420
- }
421
- }
422
- }
423
- if ((_c = chunk.params) == null ? void 0 : _c.status) {
424
- console.log("Task status:", chunk.params.status);
425
- }
426
- if ((_d = chunk.params) == null ? void 0 : _d.artifact) {
427
- console.log("Artifact received:", chunk.params.artifact);
428
- }
429
430
  if (chunk.error) {
430
- showErrorMessage((_e = chunk.error.message) != null ? _e : "\u8BF7\u6C42\u5931\u8D25");
431
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u8BF7\u6C42\u5931\u8D25");
432
+ isDone = true;
433
+ break;
434
+ }
435
+ const newText = extractTextFromStreamChunk(chunk);
436
+ if (newText) {
437
+ fullResponseText += newText;
438
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
431
439
  }
432
440
  }
433
441
  } catch (error) {
@@ -455,7 +463,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
455
463
  }));
456
464
  };
457
465
  const sendMultiAgentMessage = async (text, chatId) => {
458
- var _a, _b, _c;
466
+ var _a;
459
467
  abortController.value = new AbortController();
460
468
  const { signal } = abortController.value;
461
469
  let fullResponseText = "";
@@ -465,62 +473,15 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
465
473
  const subAgents = getSubAgents();
466
474
  const stream = a2aService.streamMultiAgentMessage(iMultiAgentInfo.value.url || MULTI_AGENT_HOST, subAgents, userMessage, iMultiAgentInfo.value.headers || {}, void 0, signal);
467
475
  for await (const chunk of stream) {
468
- if (isA2A1_0Chunk(chunk)) {
469
- const newText = extractTextFromA2A1_0Chunk(chunk);
470
- if (newText) {
471
- fullResponseText += newText;
472
- const lastMessage = createTextMessage("", "agent");
473
- if (newText.length > 10) {
474
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
475
- } else {
476
- accumulatedText += newText;
477
- randerAngentMessage(accumulatedText, chatId);
478
- }
479
- }
480
- continue;
481
- }
482
- if (chunk.result) {
483
- const result = chunk.result;
484
- if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
485
- const contentParts = result.artifact.parts;
486
- let newText = "";
487
- for (const part of contentParts) {
488
- if (part.data && typeof part.data.content === "string") {
489
- newText += part.data.content;
490
- }
491
- }
492
- if (newText) {
493
- fullResponseText += newText;
494
- const lastMessage = createTextMessage("", "agent");
495
- if (newText.length > 10) {
496
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
497
- } else {
498
- accumulatedText += newText;
499
- randerAngentMessage(accumulatedText, chatId);
500
- }
501
- }
502
- }
503
- if ("status" in chunk.result) {
504
- const status = chunk.result.status;
505
- if ((_b = status == null ? void 0 : status.message) == null ? void 0 : _b.parts) {
506
- const textParts = status.message.parts.filter((p) => p.kind === "text");
507
- const newText = textParts.map((p) => p.text).join("");
508
- fullResponseText += newText;
509
- const lastMessage = createTextMessage("", "agent");
510
- if (newText.length > 10) {
511
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
512
- } else {
513
- accumulatedText += newText;
514
- randerAngentMessage(accumulatedText, chatId);
515
- }
516
- }
517
- }
518
- }
519
476
  if (chunk.error) {
520
- console.error("Multi-agent error chunk:", chunk.error);
521
- showErrorMessage((_c = chunk.error.message) != null ? _c : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
477
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
522
478
  break;
523
479
  }
480
+ const newText = extractTextFromStreamChunk(chunk);
481
+ if (newText) {
482
+ fullResponseText += newText;
483
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
484
+ }
524
485
  }
525
486
  } catch (err) {
526
487
  console.error("Error in multi-agent mode:", err);
@@ -543,6 +504,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
543
504
  try {
544
505
  if (isUnmounting.value)
545
506
  return;
507
+ isAborting.value = false;
546
508
  isChating.value = true;
547
509
  const currentAiMessage = chatList.value.find((item) => item.isChating);
548
510
  if (currentAiMessage) {
@@ -557,6 +519,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
557
519
  user: "ai",
558
520
  type: "text",
559
521
  isChating: true,
522
+ isError: false,
560
523
  content: "",
561
524
  thinkContent: "",
562
525
  reasoningContent: "",
@@ -587,12 +550,22 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
587
550
  };
588
551
  const showErrorMessage = (message) => {
589
552
  isChating.value = false;
590
- chatList.value[currIndex.value].content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
553
+ renderQueue.value = [];
554
+ isRendering.value = false;
555
+ const errorHtml = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
591
556
  <path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
592
557
  </svg>${message}</div>`;
593
- chatList.value[currIndex.value].isChating = false;
594
- chatList.value[currIndex.value].isShowCopy = false;
595
- chatList.value[currIndex.value].isShowLike = false;
558
+ const currentItem = chatList.value[currIndex.value];
559
+ if (!currentItem)
560
+ return;
561
+ currentItem.content = errorHtml;
562
+ currentItem.isError = true;
563
+ currentItem.isChating = false;
564
+ currentItem.isShowCopy = false;
565
+ currentItem.isShowLike = false;
566
+ nextTick(() => {
567
+ renderContent(errorHtml, "main", currIndex.value);
568
+ });
596
569
  showToast("\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5", "error", 3e3);
597
570
  };
598
571
  const attachCopyButtons = (container) => {
@@ -694,6 +667,48 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
694
667
  openSSE(inputValue.value, index + 1);
695
668
  inputValue.value = "";
696
669
  };
670
+ const handleUserAbort = () => {
671
+ if (isUnmounting.value || isAborting.value)
672
+ return;
673
+ isAborting.value = true;
674
+ renderQueue.value = [];
675
+ isRendering.value = false;
676
+ const currentAiMessage = chatList.value[currIndex.value];
677
+ if (!currentAiMessage)
678
+ return;
679
+ const hasContent = currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent;
680
+ if (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {
681
+ currentAiMessage.thinkStatus = ThinkStatus.STOPPED;
682
+ currentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now());
683
+ }
684
+ if (!hasContent) {
685
+ currentAiMessage.content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
686
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
687
+ </svg>${"\u7528\u6237\u6267\u884C\u4E86\u4E3B\u52A8\u7EC8\u6B62\u64CD\u4F5C"}</div>`;
688
+ currentAiMessage.isChating = false;
689
+ nextTick(() => {
690
+ renderContent(currentAiMessage.content || "", "main");
691
+ emit("sendMessage", [...chatList.value]);
692
+ });
693
+ return;
694
+ }
695
+ const updatedAiMessage = {
696
+ ...currentAiMessage,
697
+ isChating: false,
698
+ content: currentAiMessage.content ? currentAiMessage.content + "..." : "",
699
+ thinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + "..." : void 0,
700
+ reasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + "..." : void 0,
701
+ thinkStatus: currentAiMessage.thinkStatus,
702
+ stop: true
703
+ };
704
+ chatList.value.splice(currIndex.value, 1, updatedAiMessage);
705
+ nextTick(() => {
706
+ renderContent(updatedAiMessage.thinkContent || "", "thinking");
707
+ renderContent(updatedAiMessage.reasoningContent || "", "reasoning");
708
+ renderContent(updatedAiMessage.content || "", "main");
709
+ emit("sendMessage", [...chatList.value]);
710
+ });
711
+ };
697
712
  const handleStop = () => {
698
713
  var _a;
699
714
  if (isChating.value) {
@@ -701,6 +716,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
701
716
  isChating.value = false;
702
717
  chatList.value[currIndex.value].isChating = false;
703
718
  stop(chatList.value[currIndex.value], currIndex.value);
719
+ handleUserAbort();
704
720
  }
705
721
  };
706
722
  const scrollToBottom = () => {