@touchvue/chat 1.0.0-beta.55 → 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 (125) 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 +2 -2
  26. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  27. package/es/packages/components/touchchat/component/UploadView_api.vue2.mjs.map +1 -1
  28. package/es/packages/components/touchchat/index.mjs.map +1 -1
  29. package/es/packages/components/touchchat/src/AiChat/Chat/TouchChat.mjs.map +1 -1
  30. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +7 -39
  31. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  32. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  33. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +26 -16
  34. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  35. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -1
  36. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +16 -4
  37. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  38. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  39. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  40. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  41. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +139 -81
  42. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  43. package/es/packages/components/touchchat/src/index.vue2.mjs +11 -1
  44. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  45. package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
  46. package/es/packages/components/touchchat/utils/a2aService.mjs +204 -104
  47. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  48. package/es/packages/components/touchchat/utils/chatRobot.mjs.map +1 -1
  49. package/es/packages/components/touchchat/utils/deepCloneDom.mjs.map +1 -1
  50. package/es/packages/components/touchchat/utils/hight-it.mjs.map +1 -1
  51. package/es/packages/components/touchchat/utils/markdown.mjs +23 -6
  52. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  53. package/es/packages/components/touchchat/utils/socket.mjs.map +1 -1
  54. package/es/packages/components/touchchat/utils/tools.mjs +4 -4
  55. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  56. package/es/packages/components/touchchat/utils/uuid.mjs.map +1 -1
  57. package/es/packages/utils/config.mjs.map +1 -1
  58. package/es/packages/utils/types.mjs.map +1 -1
  59. package/lib/index.js.map +1 -1
  60. package/lib/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.js +939 -226
  61. package/lib/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js.map +1 -0
  62. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.js +109 -105
  63. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.js.map +1 -0
  64. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.js +34 -30
  65. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.js.map +1 -0
  66. 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
  67. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js.map +1 -0
  68. package/lib/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js +1 -1
  69. package/lib/package.json.js +1 -1
  70. package/lib/packages/components/touchchat/component/AiRobot/face.vue2.js.map +1 -1
  71. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +1 -1
  72. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  73. package/lib/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.js.map +1 -1
  74. package/lib/packages/components/touchchat/component/AiRobot/start.vue2.js.map +1 -1
  75. package/lib/packages/components/touchchat/component/CardView.vue2.js.map +1 -1
  76. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  77. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  78. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  81. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/ThoughtChain.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/component/UploadView.vue2.js +2 -2
  84. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  85. package/lib/packages/components/touchchat/component/UploadView_api.vue2.js.map +1 -1
  86. package/lib/packages/components/touchchat/index.js.map +1 -1
  87. package/lib/packages/components/touchchat/src/AiChat/Chat/TouchChat.js.map +1 -1
  88. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +6 -38
  89. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  90. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  91. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +26 -16
  92. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  93. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -1
  94. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +15 -3
  95. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  96. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  97. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  99. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +139 -81
  100. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  101. package/lib/packages/components/touchchat/src/index.vue2.js +11 -1
  102. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  103. package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
  104. package/lib/packages/components/touchchat/utils/a2aService.js +204 -104
  105. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  106. package/lib/packages/components/touchchat/utils/chatRobot.js.map +1 -1
  107. package/lib/packages/components/touchchat/utils/deepCloneDom.js.map +1 -1
  108. package/lib/packages/components/touchchat/utils/hight-it.js.map +1 -1
  109. package/lib/packages/components/touchchat/utils/markdown.js +23 -6
  110. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  111. package/lib/packages/components/touchchat/utils/socket.js.map +1 -1
  112. package/lib/packages/components/touchchat/utils/tools.js +4 -4
  113. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  114. package/lib/packages/components/touchchat/utils/uuid.js.map +1 -1
  115. package/lib/packages/utils/config.js.map +1 -1
  116. package/lib/packages/utils/types.js.map +1 -1
  117. package/package.json +1 -1
  118. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  119. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs.map +0 -1
  120. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs.map +0 -1
  121. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.mjs.map +0 -1
  122. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +0 -1
  123. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.js.map +0 -1
  124. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.js.map +0 -1
  125. 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');
@@ -32,7 +32,9 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
32
32
  id: "agent-1",
33
33
  name: "A2A Agent",
34
34
  version: "1.0",
35
- endpoint: "http://10.19.93.128:30015/engine/api/v1/a2a/7b8f4d0eeee643859a812a166c606b13/1.0",
35
+ // 使用代理路径,配合 vite.config.ts 中的 /ai-gateway 代理配置
36
+ // endpoint: '/ai-gateway/a2a/agents/MjAxOTMwMTI4OjMwMDE1L2VuZ2luZS9hcGkvdjEvYTJhL2JiYmJiYmJiYi8xLjA=',
37
+ endpoint: "********",
36
38
  authToken: "c09f1251-e979-4a1a-ac67-6a11a8ab49f7",
37
39
  // endpoint: '/agent-api/Njd8NnwxfDUy',
38
40
  // authToken: 'a7ef44a7-9e85-4989-a2eb-34ae4dc76b7a',
@@ -41,6 +43,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
41
43
  const selectedAgents = vue.ref(["agent-1"]);
42
44
  const agentInfo = vue.inject("agentInfo", vue.ref({ list: [], url: "", headers: {} }));
43
45
  const iMultiAgentInfo = vue.ref(agentInfo.value || { list: [], url: "", headers: {} });
46
+ const iModules = vue.inject("modules", vue.ref([]));
44
47
  vue.watch(
45
48
  () => agentInfo.value,
46
49
  (newVal) => {
@@ -93,6 +96,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
93
96
  const typeFlag = vue.ref("");
94
97
  const scrollObserver = vue.ref(null);
95
98
  const abortController = vue.ref(null);
99
+ const isAborting = vue.ref(false);
96
100
  const renderQueue = vue.ref([]);
97
101
  const isRendering = vue.ref(false);
98
102
  const currentMessageProcessor = vue.ref(null);
@@ -166,7 +170,6 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
166
170
  };
167
171
  const update = (index, message) => {
168
172
  chatList.value[index] = { ...chatList.value[index], ...message };
169
- console.log("update", chatList.value[index]);
170
173
  };
171
174
  const completeRendered = (chatId) => {
172
175
  if (currentMessageProcessor.value) {
@@ -220,7 +223,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
220
223
  }
221
224
  };
222
225
  const enqueueRender = (data) => {
223
- if (isUnmounting.value || !isMounted.value)
226
+ if (isUnmounting.value || !isMounted.value || isAborting.value)
224
227
  return;
225
228
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
226
229
  return;
@@ -254,6 +257,8 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
254
257
  if (currIndex.value < 0 || currIndex.value >= chatList.value.length)
255
258
  return;
256
259
  const currentItem = chatList.value[currIndex.value];
260
+ if (currentItem.isError)
261
+ return;
257
262
  currentItem.thinkContent = data.thinkContent;
258
263
  currentItem.content = data.mainContent;
259
264
  currentItem.reasoningContent = data.reasoningContent;
@@ -338,16 +343,69 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
338
343
  }
339
344
  return "";
340
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
+ };
341
400
  const sendSingleAgentMessage = async (userContent, chatId) => {
342
- var _a, _b, _c;
401
+ var _a;
343
402
  abortController.value = new AbortController();
344
403
  const { signal } = abortController.value;
345
404
  const agentMessage = createTextMessage(userContent, "user");
346
405
  const agentId = selectedAgents.value[0];
347
406
  let stream;
348
407
  try {
349
- stream = await a2aService.a2aService.streamMessage(agentId, agentMessage, void 0, signal);
350
- console.log("stream === TouchAgent.vue === 455", stream);
408
+ stream = await a2aService.a2aService.streamMessage(agentId, agentMessage, void 0, signal, iModules.value);
351
409
  } catch (error) {
352
410
  if (error.name === "AbortError") {
353
411
  abortController.value = null;
@@ -369,47 +427,19 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
369
427
  let isDone = false;
370
428
  while (!isDone) {
371
429
  const { done, value: chunk } = await reader.read();
372
- console.log("done === TouchAgent.vue === 483", done);
373
430
  if (done) {
374
431
  isDone = true;
375
432
  break;
376
433
  }
377
- if (isA2A1_0Chunk(chunk)) {
378
- const newText = extractTextFromA2A1_0Chunk(chunk);
379
- if (newText) {
380
- fullResponseText += newText;
381
- const lastMessage = createTextMessage("", "agent");
382
- if (newText.length > 10) {
383
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
384
- } else {
385
- accumulatedText += newText;
386
- randerAngentMessage(accumulatedText, chatId);
387
- }
388
- }
389
- continue;
390
- }
391
- if (chunk.result) {
392
- if ("status" in chunk.result) {
393
- const status = chunk.result.status;
394
- if ((_a = status == null ? void 0 : status.message) == null ? void 0 : _a.parts) {
395
- const textParts = status.message.parts.filter((p) => p.kind === "text");
396
- const newText = textParts.map((p) => p.text).join("");
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
- }
408
- if ((_b = chunk.params) == null ? void 0 : _b.status) {
409
- console.log("Task status:", chunk.params.status);
434
+ if (chunk.error) {
435
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u8BF7\u6C42\u5931\u8D25");
436
+ isDone = true;
437
+ break;
410
438
  }
411
- if ((_c = chunk.params) == null ? void 0 : _c.artifact) {
412
- console.log("Artifact received:", chunk.params.artifact);
439
+ const newText = extractTextFromStreamChunk(chunk);
440
+ if (newText) {
441
+ fullResponseText += newText;
442
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
413
443
  }
414
444
  }
415
445
  } catch (error) {
@@ -437,7 +467,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
437
467
  }));
438
468
  };
439
469
  const sendMultiAgentMessage = async (text, chatId) => {
440
- var _a, _b;
470
+ var _a;
441
471
  abortController.value = new AbortController();
442
472
  const { signal } = abortController.value;
443
473
  let fullResponseText = "";
@@ -447,42 +477,15 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
447
477
  const subAgents = getSubAgents();
448
478
  const stream = a2aService.a2aService.streamMultiAgentMessage(iMultiAgentInfo.value.url || MULTI_AGENT_HOST, subAgents, userMessage, iMultiAgentInfo.value.headers || {}, void 0, signal);
449
479
  for await (const chunk of stream) {
450
- if (isA2A1_0Chunk(chunk)) {
451
- const newText = extractTextFromA2A1_0Chunk(chunk);
452
- if (newText) {
453
- fullResponseText += newText;
454
- const lastMessage = createTextMessage("", "agent");
455
- if (newText.length > 10) {
456
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
457
- } else {
458
- accumulatedText += newText;
459
- randerAngentMessage(accumulatedText, chatId);
460
- }
461
- }
462
- continue;
463
- }
464
- if (chunk.result) {
465
- if ("status" in chunk.result) {
466
- const status = chunk.result.status;
467
- if ((_a = status == null ? void 0 : status.message) == null ? void 0 : _a.parts) {
468
- const textParts = status.message.parts.filter((p) => p.kind === "text");
469
- const newText = textParts.map((p) => p.text).join("");
470
- fullResponseText += newText;
471
- const lastMessage = createTextMessage("", "agent");
472
- if (newText.length > 10) {
473
- accumulatedText = await typewriterEffect(lastMessage, newText, 30, chatId, accumulatedText);
474
- } else {
475
- accumulatedText += newText;
476
- randerAngentMessage(accumulatedText, chatId);
477
- }
478
- }
479
- }
480
- }
481
480
  if (chunk.error) {
482
- console.error("Multi-agent error chunk:", chunk.error);
483
- showErrorMessage((_b = chunk.error.message) != null ? _b : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
481
+ showErrorMessage((_a = chunk.error.message) != null ? _a : "\u591A\u667A\u80FD\u4F53\u8BF7\u6C42\u5931\u8D25");
484
482
  break;
485
483
  }
484
+ const newText = extractTextFromStreamChunk(chunk);
485
+ if (newText) {
486
+ fullResponseText += newText;
487
+ accumulatedText = await appendAgentStreamText(newText, chatId, accumulatedText);
488
+ }
486
489
  }
487
490
  } catch (err) {
488
491
  console.error("Error in multi-agent mode:", err);
@@ -505,6 +508,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
505
508
  try {
506
509
  if (isUnmounting.value)
507
510
  return;
511
+ isAborting.value = false;
508
512
  isChating.value = true;
509
513
  const currentAiMessage = chatList.value.find((item) => item.isChating);
510
514
  if (currentAiMessage) {
@@ -519,6 +523,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
519
523
  user: "ai",
520
524
  type: "text",
521
525
  isChating: true,
526
+ isError: false,
522
527
  content: "",
523
528
  thinkContent: "",
524
529
  reasoningContent: "",
@@ -549,12 +554,22 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
549
554
  };
550
555
  const showErrorMessage = (message) => {
551
556
  isChating.value = false;
552
- 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">
553
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"/>
554
561
  </svg>${message}</div>`;
555
- chatList.value[currIndex.value].isChating = false;
556
- chatList.value[currIndex.value].isShowCopy = false;
557
- 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
+ });
558
573
  tools.showToast("\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5", "error", 3e3);
559
574
  };
560
575
  const attachCopyButtons = (container) => {
@@ -656,6 +671,48 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
656
671
  openSSE(inputValue.value, index + 1);
657
672
  inputValue.value = "";
658
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
+ };
659
716
  const handleStop = () => {
660
717
  var _a;
661
718
  if (isChating.value) {
@@ -663,6 +720,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
663
720
  isChating.value = false;
664
721
  chatList.value[currIndex.value].isChating = false;
665
722
  stop(chatList.value[currIndex.value], currIndex.value);
723
+ handleUserAbort();
666
724
  }
667
725
  };
668
726
  const scrollToBottom = () => {