@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.js","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":["ref","inject","reactive","item","nextTick","computed","watch","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_renderList","_createElementVNode","_toDisplayString","_openBlock","_withKeys","_withModifiers"],"mappings":"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"}
1
+ {"version":3,"file":"HistoryList.vue2.js","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":["ref","inject","reactive","item","nextTick","computed","watch","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_renderList","_createElementVNode","_toDisplayString","_openBlock","_withKeys","_withModifiers"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HistorySidebar.vue2.js","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":["ref","inject","reactive","title","item","_createElementBlock","_createElementVNode","_createCommentVNode","_createVNode","AgentsView","HistoryList"],"mappings":"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"}
1
+ {"version":3,"file":"HistorySidebar.vue2.js","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":["ref","inject","reactive","title","item","_createElementBlock","_createElementVNode","_createCommentVNode","_createVNode","AgentsView","HistoryList"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SiderBarView.vue2.js","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":";;;;;;;;;;;;;;;4BACC,EAAAA,sBAAA;AAAA,QAEM,KAAA;AAAA,QAAA;AAAA,UAFD,KAAA,EAAKC,mBAAA,CAAC,gBAAA,EAAyB,QAAI,IAAA,GAAA,qBAAA,GAAA,EAAA,CAAA,CAAA;AAAA;;UACvCC,cAAA,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.js","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":";;;;;;;;;;;;;;;4BACC,EAAAA,sBAAA;AAAA,QAEM,KAAA;AAAA,QAAA;AAAA,UAFD,KAAA,EAAKC,mBAAA,CAAC,gBAAA,EAAyB,QAAI,IAAA,GAAA,qBAAA,GAAA,EAAA,CAAA,CAAA;AAAA;;UACvCC,cAAA,CAAuD,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA;AAAA,YAAlC,MAAM,OAAI,CAAA,IAAA;AAAA,YAAG,OAAO,OAAK,CAAA,KAAA;AAAA;;;;;;;;;;;"}
@@ -9,7 +9,7 @@ var ChatInput = require('./ChatInput.vue.js');
9
9
  var HelloChat = require('../../component/HelloChat.vue.js');
10
10
  var index = require('../../../../../node_modules/.pnpm/throttle-debounce@5.0.2/node_modules/throttle-debounce/esm/index.js');
11
11
  var tools = require('../../utils/tools.js');
12
- var purify_es = require('../../../../../node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js');
12
+ var purify_es = require('../../../../../node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js');
13
13
  var markdown = require('../../utils/markdown.js');
14
14
  var types = require('./Chat/types.js');
15
15
  var useMessageRender = require('./Chat/useMessageRender.js');
@@ -33,7 +33,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
33
33
  name: "A2A Agent",
34
34
  version: "1.0",
35
35
  // 使用代理路径,配合 vite.config.ts 中的 /ai-gateway 代理配置
36
- endpoint: "/ai-gateway/a2a/agents/MjAxOTMwMTI4OjMwMDE1L2VuZ2luZS9hcGkvdjEvYTJhL2JiYmJiYmJiYi8xLjA=",
36
+ // endpoint: '/ai-gateway/a2a/agents/MjAxOTMwMTI4OjMwMDE1L2VuZ2luZS9hcGkvdjEvYTJhL2JiYmJiYmJiYi8xLjA=',
37
+ endpoint: "********",
37
38
  authToken: "c09f1251-e979-4a1a-ac67-6a11a8ab49f7",
38
39
  // endpoint: '/agent-api/Njd8NnwxfDUy',
39
40
  // authToken: 'a7ef44a7-9e85-4989-a2eb-34ae4dc76b7a',
@@ -95,6 +96,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
95
96
  const typeFlag = vue.ref("");
96
97
  const scrollObserver = vue.ref(null);
97
98
  const abortController = vue.ref(null);
99
+ const isAborting = vue.ref(false);
98
100
  const renderQueue = vue.ref([]);
99
101
  const isRendering = vue.ref(false);
100
102
  const currentMessageProcessor = vue.ref(null);
@@ -221,7 +223,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
221
223
  }
222
224
  };
223
225
  const enqueueRender = (data) => {
224
- if (isUnmounting.value || !isMounted.value)
226
+ if (isUnmounting.value || !isMounted.value || isAborting.value)
225
227
  return;
226
228
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
227
229
  return;
@@ -255,6 +257,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
255
257
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
256
258
  return;
257
259
  const currentItem = chatList.value[currIndex.value];
260
+ if (currentItem.isError)
261
+ return;
258
262
  currentItem.thinkContent = data.thinkContent;
259
263
  currentItem.content = data.mainContent;
260
264
  currentItem.reasoningContent = data.reasoningContent;
@@ -339,8 +343,62 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
339
343
  }
340
344
  return "";
341
345
  };
346
+ const extractTextFromParts = (parts) => {
347
+ let text = "";
348
+ for (const part of parts) {
349
+ if ((part == null ? void 0 : part.data) && typeof part.data.content === "string") {
350
+ text += part.data.content;
351
+ } else if ((part == null ? void 0 : part.kind) === "text" && typeof part.text === "string") {
352
+ text += part.text;
353
+ } else if ((part == null ? void 0 : part.type) === "text" && typeof part.text === "string") {
354
+ text += part.text;
355
+ } else if (typeof (part == null ? void 0 : part.text) === "string") {
356
+ text += part.text;
357
+ }
358
+ }
359
+ return text;
360
+ };
361
+ const extractTextFromStreamChunk = (chunk) => {
362
+ var _a, _b, _c, _d, _e, _f, _g;
363
+ if (isA2A1_0Chunk(chunk)) {
364
+ return extractTextFromA2A1_0Chunk(chunk);
365
+ }
366
+ const result = chunk == null ? void 0 : chunk.result;
367
+ if (result) {
368
+ if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
369
+ return extractTextFromParts(result.artifact.parts);
370
+ }
371
+ if ((_c = (_b = result.status) == null ? void 0 : _b.message) == null ? void 0 : _c.parts) {
372
+ return extractTextFromParts(result.status.message.parts);
373
+ }
374
+ }
375
+ const params = chunk == null ? void 0 : chunk.params;
376
+ if (params) {
377
+ if ((_d = params.artifact) == null ? void 0 : _d.parts) {
378
+ return extractTextFromParts(params.artifact.parts);
379
+ }
380
+ if ((_f = (_e = params.status) == null ? void 0 : _e.message) == null ? void 0 : _f.parts) {
381
+ return extractTextFromParts(params.status.message.parts);
382
+ }
383
+ if ((_g = params.message) == null ? void 0 : _g.parts) {
384
+ return extractTextFromParts(params.message.parts);
385
+ }
386
+ }
387
+ return "";
388
+ };
389
+ const appendAgentStreamText = async (newText, chatId, accumulatedText) => {
390
+ if (!newText)
391
+ return accumulatedText;
392
+ const lastMessage = createTextMessage("", "agent");
393
+ if (newText.length > 10) {
394
+ return typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
395
+ }
396
+ const combinedText = accumulatedText + newText;
397
+ randerAngentMessage(combinedText, chatId);
398
+ return combinedText;
399
+ };
342
400
  const sendSingleAgentMessage = async (userContent, chatId) => {
343
- var _a, _b, _c, _d, _e;
401
+ var _a;
344
402
  abortController.value = new AbortController();
345
403
  const { signal } = abortController.value;
346
404
  const agentMessage = createTextMessage(userContent, "user");
@@ -373,65 +431,15 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
373
431
  isDone = true;
374
432
  break;
375
433
  }
376
- if (isA2A1_0Chunk(chunk)) {
377
- const newText = extractTextFromA2A1_0Chunk(chunk);
378
- if (newText) {
379
- fullResponseText += newText;
380
- const lastMessage = createTextMessage("", "agent");
381
- if (newText.length > 10) {
382
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
383
- } else {
384
- accumulatedText += newText;
385
- randerAngentMessage(accumulatedText, chatId);
386
- }
387
- }
388
- continue;
389
- }
390
- if (chunk.result) {
391
- const result = chunk.result;
392
- if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
393
- const contentParts = result.artifact.parts;
394
- let newText = "";
395
- for (const part of contentParts) {
396
- if (part.data && typeof part.data.content === "string") {
397
- newText += part.data.content;
398
- }
399
- }
400
- if (newText) {
401
- fullResponseText += newText;
402
- const lastMessage = createTextMessage("", "agent");
403
- if (newText.length > 10) {
404
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
405
- } else {
406
- accumulatedText += newText;
407
- randerAngentMessage(accumulatedText, chatId);
408
- }
409
- }
410
- }
411
- if ("status" in chunk.result) {
412
- const status = chunk.result.status;
413
- if ((_b = status == null ? void 0 : status.message) == null ? void 0 : _b.parts) {
414
- const textParts = status.message.parts.filter((p) => p.kind === "text");
415
- const newText = textParts.map((p) => p.text).join("");
416
- fullResponseText += newText;
417
- const lastMessage = createTextMessage("", "agent");
418
- if (newText.length > 10) {
419
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
420
- } else {
421
- accumulatedText += newText;
422
- randerAngentMessage(accumulatedText, chatId);
423
- }
424
- }
425
- }
426
- }
427
- if ((_c = chunk.params) == null ? void 0 : _c.status) {
428
- console.log("Task status:", chunk.params.status);
429
- }
430
- if ((_d = chunk.params) == null ? void 0 : _d.artifact) {
431
- console.log("Artifact received:", chunk.params.artifact);
432
- }
433
434
  if (chunk.error) {
434
- showErrorMessage((_e = chunk.error.message) != null ? _e : "\u8BF7\u6C42\u5931\u8D25");
435
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u8BF7\u6C42\u5931\u8D25");
436
+ isDone = true;
437
+ break;
438
+ }
439
+ const newText = extractTextFromStreamChunk(chunk);
440
+ if (newText) {
441
+ fullResponseText += newText;
442
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
435
443
  }
436
444
  }
437
445
  } catch (error) {
@@ -459,7 +467,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
459
467
  }));
460
468
  };
461
469
  const sendMultiAgentMessage = async (text, chatId) => {
462
- var _a, _b, _c;
470
+ var _a;
463
471
  abortController.value = new AbortController();
464
472
  const { signal } = abortController.value;
465
473
  let fullResponseText = "";
@@ -469,62 +477,15 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
469
477
  const subAgents = getSubAgents();
470
478
  const stream = a2aService.a2aService.streamMultiAgentMessage(iMultiAgentInfo.value.url || MULTI_AGENT_HOST, subAgents, userMessage, iMultiAgentInfo.value.headers || {}, void 0, signal);
471
479
  for await (const chunk of stream) {
472
- if (isA2A1_0Chunk(chunk)) {
473
- const newText = extractTextFromA2A1_0Chunk(chunk);
474
- if (newText) {
475
- fullResponseText += newText;
476
- const lastMessage = createTextMessage("", "agent");
477
- if (newText.length > 10) {
478
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
479
- } else {
480
- accumulatedText += newText;
481
- randerAngentMessage(accumulatedText, chatId);
482
- }
483
- }
484
- continue;
485
- }
486
- if (chunk.result) {
487
- const result = chunk.result;
488
- if (result.kind === "artifact-update" && ((_a = result.artifact) == null ? void 0 : _a.parts)) {
489
- const contentParts = result.artifact.parts;
490
- let newText = "";
491
- for (const part of contentParts) {
492
- if (part.data && typeof part.data.content === "string") {
493
- newText += part.data.content;
494
- }
495
- }
496
- if (newText) {
497
- fullResponseText += newText;
498
- const lastMessage = createTextMessage("", "agent");
499
- if (newText.length > 10) {
500
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
501
- } else {
502
- accumulatedText += newText;
503
- randerAngentMessage(accumulatedText, chatId);
504
- }
505
- }
506
- }
507
- if ("status" in chunk.result) {
508
- const status = chunk.result.status;
509
- if ((_b = status == null ? void 0 : status.message) == null ? void 0 : _b.parts) {
510
- const textParts = status.message.parts.filter((p) => p.kind === "text");
511
- const newText = textParts.map((p) => p.text).join("");
512
- fullResponseText += newText;
513
- const lastMessage = createTextMessage("", "agent");
514
- if (newText.length > 10) {
515
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
516
- } else {
517
- accumulatedText += newText;
518
- randerAngentMessage(accumulatedText, chatId);
519
- }
520
- }
521
- }
522
- }
523
480
  if (chunk.error) {
524
- console.error("Multi-agent error chunk:", chunk.error);
525
- showErrorMessage((_c = chunk.error.message) != null ? _c : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
481
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
526
482
  break;
527
483
  }
484
+ const newText = extractTextFromStreamChunk(chunk);
485
+ if (newText) {
486
+ fullResponseText += newText;
487
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
488
+ }
528
489
  }
529
490
  } catch (err) {
530
491
  console.error("Error in multi-agent mode:", err);
@@ -547,6 +508,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
547
508
  try {
548
509
  if (isUnmounting.value)
549
510
  return;
511
+ isAborting.value = false;
550
512
  isChating.value = true;
551
513
  const currentAiMessage = chatList.value.find((item) => item.isChating);
552
514
  if (currentAiMessage) {
@@ -561,6 +523,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
561
523
  user: "ai",
562
524
  type: "text",
563
525
  isChating: true,
526
+ isError: false,
564
527
  content: "",
565
528
  thinkContent: "",
566
529
  reasoningContent: "",
@@ -591,12 +554,22 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
591
554
  };
592
555
  const showErrorMessage = (message) => {
593
556
  isChating.value = false;
594
- 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">
557
+ renderQueue.value = [];
558
+ isRendering.value = false;
559
+ 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">
595
560
  <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"/>
596
561
  </svg>${message}</div>`;
597
- chatList.value[currIndex.value].isChating = false;
598
- chatList.value[currIndex.value].isShowCopy = false;
599
- chatList.value[currIndex.value].isShowLike = false;
562
+ const currentItem = chatList.value[currIndex.value];
563
+ if (!currentItem)
564
+ return;
565
+ currentItem.content = errorHtml;
566
+ currentItem.isError = true;
567
+ currentItem.isChating = false;
568
+ currentItem.isShowCopy = false;
569
+ currentItem.isShowLike = false;
570
+ vue.nextTick(() => {
571
+ renderContent(errorHtml, "main", currIndex.value);
572
+ });
600
573
  tools.showToast("\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5", "error", 3e3);
601
574
  };
602
575
  const attachCopyButtons = (container) => {
@@ -698,6 +671,48 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
698
671
  openSSE(inputValue.value, index + 1);
699
672
  inputValue.value = "";
700
673
  };
674
+ const handleUserAbort = () => {
675
+ if (isUnmounting.value || isAborting.value)
676
+ return;
677
+ isAborting.value = true;
678
+ renderQueue.value = [];
679
+ isRendering.value = false;
680
+ const currentAiMessage = chatList.value[currIndex.value];
681
+ if (!currentAiMessage)
682
+ return;
683
+ const hasContent = currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent;
684
+ if (currentAiMessage.thinkStatus === types.ThinkStatus.THINKING) {
685
+ currentAiMessage.thinkStatus = types.ThinkStatus.STOPPED;
686
+ currentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now());
687
+ }
688
+ if (!hasContent) {
689
+ 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">
690
+ <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"/>
691
+ </svg>${"\u7528\u6237\u6267\u884C\u4E86\u4E3B\u52A8\u7EC8\u6B62\u64CD\u4F5C"}</div>`;
692
+ currentAiMessage.isChating = false;
693
+ vue.nextTick(() => {
694
+ renderContent(currentAiMessage.content || "", "main");
695
+ emit("sendMessage", [...chatList.value]);
696
+ });
697
+ return;
698
+ }
699
+ const updatedAiMessage = {
700
+ ...currentAiMessage,
701
+ isChating: false,
702
+ content: currentAiMessage.content ? currentAiMessage.content + "..." : "",
703
+ thinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + "..." : void 0,
704
+ reasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + "..." : void 0,
705
+ thinkStatus: currentAiMessage.thinkStatus,
706
+ stop: true
707
+ };
708
+ chatList.value.splice(currIndex.value, 1, updatedAiMessage);
709
+ vue.nextTick(() => {
710
+ renderContent(updatedAiMessage.thinkContent || "", "thinking");
711
+ renderContent(updatedAiMessage.reasoningContent || "", "reasoning");
712
+ renderContent(updatedAiMessage.content || "", "main");
713
+ emit("sendMessage", [...chatList.value]);
714
+ });
715
+ };
701
716
  const handleStop = () => {
702
717
  var _a;
703
718
  if (isChating.value) {
@@ -705,6 +720,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
705
720
  isChating.value = false;
706
721
  chatList.value[currIndex.value].isChating = false;
707
722
  stop(chatList.value[currIndex.value], currIndex.value);
723
+ handleUserAbort();
708
724
  }
709
725
  };
710
726
  const scrollToBottom = () => {