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

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 (171) hide show
  1. package/README.md +70 -70
  2. package/es/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.mjs +299 -143
  3. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
  4. package/es/package.json.css +1 -1
  5. package/es/package.json.mjs +1 -1
  6. package/es/packages/components/resolver.mjs.map +1 -1
  7. package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
  8. package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
  9. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +9 -9
  10. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  11. package/es/packages/components/touchchat/component/AudioFile.vue.mjs +7 -0
  12. package/es/packages/components/touchchat/component/AudioFile.vue.mjs.map +1 -0
  13. package/es/packages/components/touchchat/component/AudioFile.vue2.mjs +111 -0
  14. package/es/packages/components/touchchat/component/AudioFile.vue2.mjs.map +1 -0
  15. package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
  16. package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
  17. package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
  18. package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
  19. package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
  21. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
  23. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
  25. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
  27. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  28. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +56 -5
  29. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  30. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +10 -10
  31. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
  32. package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs +52 -10
  33. package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
  34. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
  35. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
  36. package/es/packages/components/touchchat/component/UploadView.vue2.mjs +2 -2
  37. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  38. package/es/packages/components/touchchat/component/VideoFile.vue.mjs +1 -1
  39. package/es/packages/components/touchchat/component/VideoFile.vue2.mjs.map +1 -1
  40. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +13 -4
  41. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
  42. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
  43. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
  44. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +30 -30
  45. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
  46. package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
  47. package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
  48. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +10 -44
  49. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  50. package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
  51. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  52. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
  53. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +16 -9
  54. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  55. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +26 -13
  56. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  57. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
  58. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  59. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
  60. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  61. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
  62. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
  63. package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs +33 -0
  64. package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs.map +1 -0
  65. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
  66. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  67. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +55 -13
  68. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  69. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +36 -0
  70. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
  71. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
  72. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +127 -75
  73. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
  74. package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
  75. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  76. package/es/packages/components/touchchat/utils/a2aService.mjs +58 -15
  77. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  78. package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
  79. package/es/packages/components/touchchat/utils/markdown.mjs +22 -5
  80. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  81. package/es/packages/components/touchchat/utils/tools.mjs +4 -4
  82. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  83. package/lib/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.js +299 -143
  84. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +1 -0
  85. package/lib/package.json.css +1 -1
  86. package/lib/package.json.js +1 -1
  87. package/lib/packages/components/resolver.js.map +1 -1
  88. package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
  89. package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
  90. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +9 -9
  91. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  92. package/lib/packages/components/touchchat/component/AudioFile.vue.js +11 -0
  93. package/lib/packages/components/touchchat/component/AudioFile.vue.js.map +1 -0
  94. package/lib/packages/components/touchchat/component/AudioFile.vue2.js +115 -0
  95. package/lib/packages/components/touchchat/component/AudioFile.vue2.js.map +1 -0
  96. package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
  97. package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
  99. package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
  100. package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
  101. package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
  102. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  103. package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
  104. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  105. package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
  106. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  107. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
  108. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  109. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +55 -4
  110. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  111. package/lib/packages/components/touchchat/component/PDFFile.vue2.js +10 -10
  112. package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
  113. package/lib/packages/components/touchchat/component/QuoteContent.vue2.js +51 -9
  114. package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
  115. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
  116. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
  117. package/lib/packages/components/touchchat/component/UploadView.vue2.js +2 -2
  118. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  119. package/lib/packages/components/touchchat/component/VideoFile.vue.js +1 -1
  120. package/lib/packages/components/touchchat/component/VideoFile.vue2.js.map +1 -1
  121. package/lib/packages/components/touchchat/component/VoiceView.vue2.js +13 -4
  122. package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
  123. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
  124. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
  125. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +30 -30
  126. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
  127. package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
  128. package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
  129. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +10 -44
  130. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  131. package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
  132. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  133. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
  134. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +16 -9
  135. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  136. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +25 -12
  137. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  138. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
  139. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  140. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
  141. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  142. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
  143. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
  144. package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js +37 -0
  145. package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js.map +1 -0
  146. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
  147. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  148. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +55 -13
  149. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  150. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +36 -0
  151. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
  152. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
  153. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +126 -74
  154. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
  155. package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
  156. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  157. package/lib/packages/components/touchchat/utils/a2aService.js +58 -15
  158. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  159. package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
  160. package/lib/packages/components/touchchat/utils/markdown.js +22 -5
  161. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  162. package/lib/packages/components/touchchat/utils/tools.js +4 -4
  163. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  164. package/package.json +1 -1
  165. package/theme/components/index.css +152 -3
  166. package/theme/font/iconfont.woff +0 -0
  167. package/theme/font/iconfont.woff2 +0 -0
  168. package/theme/index.css +152 -3
  169. package/theme/skin/default.css +152 -3
  170. package/es/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  171. package/lib/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue2.js","sources":["../../../../../../packages/components/touchchat/src/index.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'Touchchat' });\n</script>\n<template>\n\t<!-- <div>1.0.0-beta.2026032301</div> -->\n\t<DeepSeek ref=\"deepSeekRef\" :style=\"elementStyle\" :class=\"elementClass\">\n\t\t<!-- msg -->\n\t\t<template #aimsg=\"{ item, index }\">\n\t\t\t<slot name=\"aimsg\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #msg=\"{ item, index }\">\n\t\t\t<slot name=\"msg\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #aiAvatar>\n\t\t\t<slot name=\"aiAvatar\" />\n\t\t</template>\n\t\t<template #userAvatar>\n\t\t\t<slot name=\"userAvatar\" />\n\t\t</template>\n\t\t<template #welcome>\n\t\t\t<slot name=\"welcome\" />\n\t\t</template>\n\t\t<!-- edit -->\n\t\t<template #edit>\n\t\t\t<slot name=\"edit\" />\n\t\t</template>\n\t\t<!-- top -->\n\t\t<template #top>\n\t\t\t<slot name=\"top\" />\n\t\t</template>\n\t\t<template #shortcut>\n\t\t\t<slot name=\"shortcut\" />\n\t\t</template>\n\t\t<!-- extend -->\n\t\t<template #extend=\"{ item, index }\">\n\t\t\t<slot name=\"extend\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<!-- fn -->\n\t\t<template #fn=\"{ item, index }\">\n\t\t\t<slot name=\"fn\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #editTop>\n\t\t\t<slot name=\"editTop\" />\n\t\t</template>\n\t\t<template #editFn>\n\t\t\t<slot name=\"editFn\" />\n\t\t</template>\n\t\t<template #editSubmitRight>\n\t\t\t<slot name=\"editSubmitRight\"></slot>\n\t\t</template>\n\t\t<template #editSubmitLeft>\n\t\t\t<slot name=\"editSubmitLeft\"></slot>\n\t\t</template>\n\t\t<template #extendsFn=\"{ item, index }\">\n\t\t\t<slot name=\"extendsFn\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #mayLike=\"{ item, index }\">\n\t\t\t<slot name=\"mayLike\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t</DeepSeek>\n</template>\n<script setup lang=\"ts\">\nimport { ChatMessage, ChatMsgList, MessageActions, ModuleItem } from './AiChat/Chat/types'\nimport type { AgentConfig, SubAgent } from './types/a2a'\nimport DeepSeek from './AiChat/TouchHistory.vue'\nimport { provide, ref, computed, watch } from 'vue'\n\n\n\nconst emits = defineEmits<{\n\t(e: 'send', value: string, fileList?: any[]): void\n\t(e: 'afterSend', result: any): void\n\t(e: 'like', index: number, isLike: boolean): void\n\t(e: 'dislike', index: number, isDislike: boolean): void\n\t(e: 'side-bottom'): void\n\t(e: 'change', id: string): void\n\t(e: 'historyRemove', id: string): void\n\t(e: 'remove', item: ChatMessage, index: number): void\n\t(e: 'bottom'): void\n\t(e: 'stop', item: ChatMessage, index: number): void\n\t(e: 'modelChange', item: ModuleItem, index: number): void\n\t(e: 'openSideBar', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'share', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'withDraw', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'file-action', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'download-action', item: ChatMessage & ChatMsgList, index: number): void\n}>()\n\nconst sendVal = ref('')\n\ninterface ScriptItem {\n\tid?: string\n\tname: string\n\tsubTitle?: string\n\tcontent: Array<{\n\t\tuser: string\n\t\tdata?: string\n\t\talias?: string[]\n\t\ttype?: string\n\t}>\n}\n\ninterface HistoryItem {\n\tid?: string\n\ttime?: string\n\ttitle?: string\n}\n\ninterface MessageItem {\n\tchatId: string\n\tuser: string\n\ttype: string\n\tcontent: string\n\t[props: string]: any\n}\n\n// interface ModuleItem {\n// \tname: string\n// \tconfig: {\n// \t\taction: string\n// \t\theaders: () => object\n// \t\tbody: () => object\n// \t\trespoKey: () => object\n// \t}\n// }\ntype Modules = (string | ModuleItem)[]\ntype ResultArray = AgentConfig[] | SubAgent[]\ninterface MultiAgentInfo {\n\tlist: ResultArray\n\turl?: string\n\t// token?: string\n\theaders?: object\n}\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tmode?: string\n\t\tscripts?: ScriptItem[]\n\t\twidth?: number | string\n\t\theight?: number | string\n\t\tcomponents?: { [key: string]: any } // components\n\t\tavatar?: boolean // avatar\n\t\tplaceholder?: string\n\t\tunmatchText?: string // unmatchText\n\t\ttitle?: string\n\t\tlayout?: string // layout=\"side, think, upload, chain,realtime\"\n\t\tbeforeSend?: () => { result: boolean; componentName?: string }\n\t\thistoryList?: HistoryItem[] // historyList\n\t\thistoryDetail?: MessageItem[] // historyDetail\n\t\tagents?: {\n\t\t\tid: string\n\t\t\tname: string\n\t\t\tintro: string\n\t\t}[] // agents\n\t\tmodules?: Modules // modules\n\t\tspeed?: number // speed\n\t\tallowedTypes?: string[] // allowedTypes\n\t\t// agentConfigList?: ResultArray // agentConfigList 智能体配置列表\n\t\t// multiAgentHost?: string // multiAgentHost 多智能体主机地址\n\t\t// multiAgentToken?: string // multiAgentToken 多智能体认证令牌\n\t\tagentInfo?: MultiAgentInfo // agentInfo 多智能体信息\n\t\ta2uiProps?: {\n\t\t\t[key: string]: any\n\t\t}\n\t\tmessageActions?: MessageActions\n\t\thasRead?: boolean\n\t\tisSelectMode?: boolean\n\t\tuploadAction?: (file: File, onProgress: (percent: number) => void) => Promise<any>\n\t}>(),\n\t{\n\t\tmode: '',\n\t\tscripts: () => [],\n\t\twidth: '',\n\t\theight: '',\n\t\tcomponents: () => ({}),\n\t\tavatar: true,\n\t\tplaceholder: 'hi,我是touchchat,快来和我聊天吧~',\n\t\tunmatchText: '您的消息未匹配到任何内容',\n\t\ttitle: 'TouchChat',\n\t\tlayout: 'side, clear, think, upload, screen, voice,realtime', //chain 思考链\n\t\t// side 侧边栏(历史记录),think 深度思考,upload 上传文件,chain 思考链\n\t\tbeforeSend: () => ({ result: true, componentName: '' }),\n\t\thistoryList: () => [],\n\t\thistoryDetail: () => [],\n\t\tagents: () => [],\n\t\tmodules: () => [],\n\t\tspeed: 10,\n\t\tallowedTypes: () => [],\n\t\tagentInfo: () => ({\n\t\t\tlist: [], // list 智能体列表 =1 单智能体 >1 多智能体\n\t\t\turl: '', // url 多智能体主机地址 单智能体为空 多智能体必传\n\t\t\theaders: {} // 多智能体请求头信息\n\t\t}),\n\t\ta2uiProps: () => ({}),\n\t\tmessageActions: () => {\n\t\t\treturn {\n\t\t\t\tuser: ['edit', 'delete', 'copy'],\n\t\t\t\tai: ['retry', 'like', 'dislike', 'copy']\n\t\t\t}\n\t\t},\n\t\thasRead: false,\n\t\tisSelectMode: false,\n\t\tuploadAction: undefined\n\t}\n)\nconst selectMode = computed(() => props.isSelectMode)\nprovide('components', props.components)\nprovide('avatar', props.avatar)\nprovide('placeholder', props.placeholder)\nprovide('unmatchText', props.unmatchText)\nprovide('title', props.title)\nprovide('layout', props.layout)\nprovide('beforeSend', props.beforeSend)\nprovide('scripts', ref(props.scripts || []))\nprovide('speed', props.speed)\nprovide('allowedTypes', props.allowedTypes)\nprovide('a2uiProps', props.a2uiProps)\nprovide('messageActions', props.messageActions)\nprovide('hasRead', props.hasRead)\nprovide('isSelectMode', selectMode)\nprovide('uploadAction', props.uploadAction)\nconst historyListComputed = computed(() => props.historyList)\nconst providedHistoryList = ref(props.historyList)\nwatch(\n\thistoryListComputed,\n\tnewVal => {\n\t\tprovidedHistoryList.value = newVal\n\t},\n\t{ immediate: true }\n)\nprovide('historyList', providedHistoryList)\nconst historyDetailComputed = computed(() => props.historyDetail)\nconst providedHistoryDetail = ref(props.historyDetail)\nwatch(\n\thistoryDetailComputed,\n\tnewVal => {\n\t\tprovidedHistoryDetail.value = newVal\n\t},\n\t{ immediate: true }\n)\nprovide('historyDetail', providedHistoryDetail)\nprovide('agents', props.agents)\nconst iModules = ref(props.modules)\nwatch(\n\t() => props.modules,\n\tnewVal => {\n\t\tiModules.value = newVal\n\t\t// console.log('modules === index.vue === 191', newVal)\n\t},\n\t{ immediate: true }\n)\nprovide('modules', iModules)\n\nconst iMultiAgentInfo = ref(props.agentInfo)\nwatch(\n\t() => props.agentInfo,\n\tnewVal => {\n\t\tiMultiAgentInfo.value = newVal\n\t},\n\t{ immediate: true, deep: true }\n)\nprovide('agentInfo', iMultiAgentInfo)\n\n// 新增:提供处理点赞事件的函数\nprovide('like', (index: number, isLike: boolean) => {\n\t// 这里可以实现具体的点赞逻辑\n\temits('like', index, isLike) // like\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\n// 新增:提供处理点赞事件的函数 dislike\nprovide('dislike', (index: number, isUnlike: boolean) => {\n\t// 这里可以实现具体的点赞逻辑\n\temits('dislike', index, isUnlike) // dislike\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\nprovide('send', (value: string, fileList?: any[]) => {\n\t// send\n\t// 这里可以实现具体的点赞逻辑\n\tsendVal.value = value\n\temits('send', value, fileList)\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\nprovide('sideBottom', () => {\n\t// console.log('sideBottom === 触底事件') // bottom\n\temits('side-bottom')\n})\n\nprovide('change', (id: string) => {\n\t// console.log('change === 激活事件', id) // change\n\temits('change', id)\n})\n\nprovide('historyRemove', (id: string) => {\n\t//remove\n\t// console.log('historyRemove === 删除事件', id)\n\temits('historyRemove', id)\n})\n\nprovide('openSideBar', (item: any, index: number) => {\n\temits('openSideBar', item, index)\n})\n\nprovide('share', (item: any, index: number) => {\n\temits('share', item, index)\n})\n\nprovide('withDraw', (item: any, index: number) => {\n\temits('withDraw', item, index)\n})\n\nprovide('afterSend', (content: any) => {\n\t// afterSend\n\t// console.log('afterSend === 发送消息事件', content)\n\temits('afterSend', content)\n})\n\nprovide('remove', (item: ChatMessage, index: number) => {\n\t// afterSend\n\t// console.log('remove === 详情删除', item, index)\n\temits('remove', item, index)\n})\n\nprovide('bottom', () => {\n\t// console.log('bottom === 详情触底')\n\temits('bottom')\n})\n\nprovide('stop', (item: ChatMessage, index: number) => {\n\t// console.log('stop === 用户终止事件')\n\temits('stop', item, index)\n})\n\nprovide('modelChange', (item: ModuleItem, index: number) => {\n\t// console.log('modelChange === 模型切换事件', item, index)\n\temits('modelChange', item, index)\n})\n\n// const rootRef = ref(null)\nconst deepSeekRef = ref<InstanceType<typeof DeepSeek> | null>(null)\n\nconst elementClass = computed(() => {\n\tconst classList = []\n\tif (props.mode) {\n\t\tclassList.push(`touchchat-${props.mode}`)\n\t}\n\treturn classList.join(' ')\n})\n\n// 修改elementStyle计算属性,移除对scripts.length的检查\nconst elementStyle = computed(() => {\n\tlet width = ''\n\tlet height = ''\n\n\tif (props.width) {\n\t\tif (typeof props.width === 'string') {\n\t\t\twidth = props.width ?? '100%'\n\t\t} else {\n\t\t\twidth = `${props.width}em`\n\t\t}\n\t}\n\n\tif (props.height) {\n\t\tif (typeof props.height === 'string') {\n\t\t\theight = props.height ?? '100%'\n\t\t} else {\n\t\t\theight = `${props.height}em`\n\t\t}\n\t}\n\n\treturn {\n\t\twidth,\n\t\theight\n\t}\n})\nconst updateInputMethod = ref<any>(null)\nprovide('setInput', updateInputMethod)\nconst setInput = (newValue: string) => {\n\tif (updateInputMethod.value) {\n\t\tupdateInputMethod.value(newValue)\n\t}\n}\nprovide('fileAction', (item: any, index: number) => {\n\temits('file-action', item, index)\n})\nprovide('downloadAction', (item: any, index: number) => {\n\temits('download-action', item, index)\n})\ndefineExpose({\n\tsend: (value: string, fileList?: any[], auto?: boolean, type?: string) => {\n\t\tdeepSeekRef.value?.send(value, fileList, auto, type) //send\n\t},\n\tcloseExtend: () => {\n\t\tdeepSeekRef.value?.closeExtend() // closeExtend\n\t},\n\tcreate: () => {\n\t\tdeepSeekRef.value?.create() // reset\n\t},\n\tretry: (index: number) => {\n\t\tdeepSeekRef.value?.retry(index)\n\t},\n\tupdate: (index: number, message: object) => {\n\t\tdeepSeekRef.value?.update(index, message)\n\t},\n\tchangeChat: (index: number) => {\n\t\tdeepSeekRef.value?.changeChat(index)\n\t},\n\tclearChat: () => {\n\t\tdeepSeekRef.value?.clearChat()\n\t},\n\tsetInput\n})\n</script>\n"],"names":["DO_defineComponent","ref","computed","provide","watch","_createCommentVNode","_createVNode","DeepSeek","_withCtx","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"index.vue2.js","sources":["../../../../../../packages/components/touchchat/src/index.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'Touchchat' });\n</script>\n<template>\n\t<!-- <div>1.0.0-beta.2026032301</div> -->\n\t<DeepSeek ref=\"deepSeekRef\" :style=\"elementStyle\" :class=\"elementClass\">\n\t\t<!-- msg -->\n\t\t<template #aimsg=\"{ item, index }\">\n\t\t\t<slot name=\"aimsg\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #msg=\"{ item, index }\">\n\t\t\t<slot name=\"msg\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #aiAvatar>\n\t\t\t<slot name=\"aiAvatar\" />\n\t\t</template>\n\t\t<template #userAvatar>\n\t\t\t<slot name=\"userAvatar\" />\n\t\t</template>\n\t\t<template #welcome>\n\t\t\t<slot name=\"welcome\" />\n\t\t</template>\n\t\t<!-- edit -->\n\t\t<template #edit>\n\t\t\t<slot name=\"edit\" />\n\t\t</template>\n\t\t<!-- top -->\n\t\t<template #top>\n\t\t\t<slot name=\"top\" />\n\t\t</template>\n\t\t<template #shortcut>\n\t\t\t<slot name=\"shortcut\" />\n\t\t</template>\n\t\t<!-- extend -->\n\t\t<template #extend=\"{ item, index }\">\n\t\t\t<slot name=\"extend\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<!-- fn -->\n\t\t<template #fn=\"{ item, index }\">\n\t\t\t<slot name=\"fn\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #editTop>\n\t\t\t<slot name=\"editTop\" />\n\t\t</template>\n\t\t<template #editFn>\n\t\t\t<slot name=\"editFn\" />\n\t\t</template>\n\t\t<template #editSubmitRight>\n\t\t\t<slot name=\"editSubmitRight\"></slot>\n\t\t</template>\n\t\t<template #editSubmitLeft>\n\t\t\t<slot name=\"editSubmitLeft\"></slot>\n\t\t</template>\n\t\t<template #extendsFn=\"{ item, index }\">\n\t\t\t<slot name=\"extendsFn\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t\t<template #mayLike=\"{ item, index }\">\n\t\t\t<slot name=\"mayLike\" :item=\"item\" :index=\"index\" />\n\t\t</template>\n\t</DeepSeek>\n</template>\n<script setup lang=\"ts\">\nimport { ChatMessage, ChatMsgList, MessageActions, ModuleItem } from './AiChat/Chat/types'\nimport type { AgentConfig, SubAgent } from './types/a2a'\nimport DeepSeek from './AiChat/TouchHistory.vue'\nimport { provide, ref, computed, watch } from 'vue'\n\n\n\nconst emits = defineEmits<{\n\t(e: 'send', value: string, fileList?: any[]): void\n\t(e: 'afterSend', result: any): void\n\t(e: 'like', index: number, isLike: boolean): void\n\t(e: 'dislike', index: number, isDislike: boolean): void\n\t(e: 'side-bottom'): void\n\t(e: 'change', id: string): void\n\t(e: 'historyRemove', id: string): void\n\t(e: 'remove', item: ChatMessage, index: number): void\n\t(e: 'bottom'): void\n\t(e: 'stop', item: ChatMessage, index: number): void\n\t(e: 'modelChange', item: ModuleItem, index: number): void\n\t(e: 'openSideBar', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'share', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'withDraw', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'file-action', item: ChatMessage & ChatMsgList, index: number): void\n\t(e: 'download-action', item: ChatMessage & ChatMsgList, index: number): void\n}>()\n\nconst sendVal = ref('')\n\ninterface ScriptItem {\n\tid?: string\n\tname: string\n\tsubTitle?: string\n\tcontent: Array<{\n\t\tuser: string\n\t\tdata?: string\n\t\talias?: string[]\n\t\ttype?: string\n\t}>\n}\n\ninterface HistoryItem {\n\tid?: string\n\ttime?: string\n\ttitle?: string\n}\n\ninterface MessageItem {\n\tchatId: string\n\tuser: string\n\ttype: string\n\tcontent: string\n\t[props: string]: any\n}\n\n// interface ModuleItem {\n// \tname: string\n// \tconfig: {\n// \t\taction: string\n// \t\theaders: () => object\n// \t\tbody: () => object\n// \t\trespoKey: () => object\n// \t}\n// }\ntype Modules = (string | ModuleItem)[]\ntype ResultArray = AgentConfig[] | SubAgent[]\ninterface MultiAgentInfo {\n\tlist: ResultArray\n\turl?: string\n\t// token?: string\n\theaders?: object\n}\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tmode?: string\n\t\tscripts?: ScriptItem[]\n\t\twidth?: number | string\n\t\theight?: number | string\n\t\tcomponents?: { [key: string]: any } // components\n\t\tavatar?: boolean // avatar\n\t\tplaceholder?: string\n\t\tunmatchText?: string // unmatchText\n\t\ttitle?: string\n\t\tlayout?: string // layout=\"side, think, upload, chain,realtime\"\n\t\tbeforeSend?: () => { result: boolean; componentName?: string }\n\t\thistoryList?: HistoryItem[] // historyList\n\t\thistoryDetail?: MessageItem[] // historyDetail\n\t\tagents?: {\n\t\t\tid: string\n\t\t\tname: string\n\t\t\tintro: string\n\t\t}[] // agents\n\t\tmodules?: Modules // modules\n\t\tspeed?: number // speed\n\t\tallowedTypes?: string[] // allowedTypes\n\t\t// agentConfigList?: ResultArray // agentConfigList 智能体配置列表\n\t\t// multiAgentHost?: string // multiAgentHost 多智能体主机地址\n\t\t// multiAgentToken?: string // multiAgentToken 多智能体认证令牌\n\t\tagentInfo?: MultiAgentInfo // agentInfo 多智能体信息\n\t\ta2uiProps?: {\n\t\t\t[key: string]: any\n\t\t}\n\t\tmessageActions?: MessageActions\n\t\thasRead?: boolean\n\t\tisSelectMode?: boolean\n\t\tuploadAction?: (file: File, onProgress: (percent: number) => void) => Promise<any>\n\t\thasChating?: boolean\n\t}>(),\n\t{\n\t\tmode: '',\n\t\tscripts: () => [],\n\t\twidth: '',\n\t\theight: '',\n\t\tcomponents: () => ({}),\n\t\tavatar: true,\n\t\tplaceholder: 'hi,我是touchchat,快来和我聊天吧~',\n\t\tunmatchText: '您的消息未匹配到任何内容',\n\t\ttitle: 'TouchChat',\n\t\tlayout: 'side, clear, think, upload, screen, voice,realtime', //chain 思考链\n\t\t// side 侧边栏(历史记录),think 深度思考,upload 上传文件,chain 思考链\n\t\tbeforeSend: () => ({ result: true, componentName: '' }),\n\t\thistoryList: () => [],\n\t\thistoryDetail: () => [],\n\t\tagents: () => [],\n\t\tmodules: () => [],\n\t\tspeed: 10,\n\t\tallowedTypes: () => [],\n\t\tagentInfo: () => ({\n\t\t\tlist: [], // list 智能体列表 =1 单智能体 >1 多智能体\n\t\t\turl: '', // url 多智能体主机地址 单智能体为空 多智能体必传\n\t\t\theaders: {} // 多智能体请求头信息\n\t\t}),\n\t\ta2uiProps: () => ({}),\n\t\tmessageActions: () => {\n\t\t\treturn {\n\t\t\t\tuser: ['edit', 'delete', 'copy'],\n\t\t\t\tai: ['retry', 'like', 'dislike', 'copy']\n\t\t\t}\n\t\t},\n\t\thasRead: false,\n\t\tisSelectMode: false,\n\t\tuploadAction: undefined,\n\t\thasChating: false\n\t}\n)\nconst selectMode = computed(() => props.isSelectMode)\nprovide('components', props.components)\nprovide('avatar', props.avatar)\nprovide('placeholder', props.placeholder)\nprovide('unmatchText', props.unmatchText)\nprovide('title', props.title)\nprovide('layout', props.layout)\nprovide('beforeSend', props.beforeSend)\nprovide('scripts', ref(props.scripts || []))\nprovide('speed', props.speed)\nprovide('allowedTypes', props.allowedTypes)\nprovide('a2uiProps', props.a2uiProps)\nprovide('messageActions', props.messageActions)\nprovide('hasRead', props.hasRead)\nprovide('isSelectMode', selectMode)\nprovide('uploadAction', props.uploadAction)\n\nprovide(\n\t'hasChating',\n\tcomputed(() => props.hasChating)\n)\n\nconst historyListComputed = computed(() => props.historyList)\nconst providedHistoryList = ref(props.historyList)\nwatch(\n\thistoryListComputed,\n\tnewVal => {\n\t\tprovidedHistoryList.value = newVal\n\t},\n\t{ immediate: true }\n)\nprovide('historyList', providedHistoryList)\nconst historyDetailComputed = computed(() => props.historyDetail)\nconst providedHistoryDetail = ref(props.historyDetail)\nwatch(\n\thistoryDetailComputed,\n\tnewVal => {\n\t\tprovidedHistoryDetail.value = newVal\n\t},\n\t{ immediate: true }\n)\nprovide('historyDetail', providedHistoryDetail)\nprovide('agents', props.agents)\nconst iModules = ref(props.modules)\nwatch(\n\t() => props.modules,\n\tnewVal => {\n\t\tiModules.value = newVal\n\t\t// console.log('modules === index.vue === 191', newVal)\n\t},\n\t{ immediate: true }\n)\nprovide('modules', iModules)\n\nconst iMultiAgentInfo = ref(props.agentInfo)\nwatch(\n\t() => props.agentInfo,\n\tnewVal => {\n\t\tiMultiAgentInfo.value = newVal\n\t},\n\t{ immediate: true, deep: true }\n)\nprovide('agentInfo', iMultiAgentInfo)\n\n// 新增:提供处理点赞事件的函数\nprovide('like', (index: number, isLike: boolean) => {\n\t// 这里可以实现具体的点赞逻辑\n\temits('like', index, isLike) // like\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\n// 新增:提供处理点赞事件的函数 dislike\nprovide('dislike', (index: number, isUnlike: boolean) => {\n\t// 这里可以实现具体的点赞逻辑\n\temits('dislike', index, isUnlike) // dislike\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\nprovide('send', (value: string, fileList?: any[]) => {\n\t// send\n\t// 这里可以实现具体的点赞逻辑\n\tsendVal.value = value\n\temits('send', value, fileList)\n\t// 可以添加实际的业务逻辑,如调用API等\n})\n\nprovide('sideBottom', () => {\n\t// console.log('sideBottom === 触底事件') // bottom\n\temits('side-bottom')\n})\n\nprovide('change', (id: string) => {\n\t// console.log('change === 激活事件', id) // change\n\temits('change', id)\n})\n\nprovide('historyRemove', (id: string) => {\n\t//remove\n\t// console.log('historyRemove === 删除事件', id)\n\temits('historyRemove', id)\n})\n\nprovide('openSideBar', (item: any, index: number) => {\n\temits('openSideBar', item, index)\n})\n\nprovide('share', (item: any, index: number) => {\n\temits('share', item, index)\n})\n\nprovide('withDraw', (item: any, index: number) => {\n\temits('withDraw', item, index)\n})\n\nprovide('afterSend', (content: any) => {\n\t// afterSend\n\t// console.log('afterSend === 发送消息事件', content)\n\temits('afterSend', content)\n})\n\nprovide('remove', (item: ChatMessage, index: number) => {\n\t// afterSend\n\t// console.log('remove === 详情删除', item, index)\n\temits('remove', item, index)\n})\n\nprovide('bottom', () => {\n\t// console.log('bottom === 详情触底')\n\temits('bottom')\n})\n\nprovide('stop', (item: ChatMessage, index: number) => {\n\t// console.log('stop === 用户终止事件')\n\temits('stop', item, index)\n})\n\nprovide('modelChange', (item: ModuleItem, index: number) => {\n\t// console.log('modelChange === 模型切换事件', item, index)\n\temits('modelChange', item, index)\n})\n\n// const rootRef = ref(null)\nconst deepSeekRef = ref<InstanceType<typeof DeepSeek> | null>(null)\n\nconst elementClass = computed(() => {\n\tconst classList = []\n\tif (props.mode) {\n\t\tclassList.push(`touchchat-${props.mode}`)\n\t}\n\treturn classList.join(' ')\n})\n\n// 修改elementStyle计算属性,移除对scripts.length的检查\nconst elementStyle = computed(() => {\n\tlet width = ''\n\tlet height = ''\n\n\tif (props.width) {\n\t\tif (typeof props.width === 'string') {\n\t\t\twidth = props.width ?? '100%'\n\t\t} else {\n\t\t\twidth = `${props.width}em`\n\t\t}\n\t}\n\n\tif (props.height) {\n\t\tif (typeof props.height === 'string') {\n\t\t\theight = props.height ?? '100%'\n\t\t} else {\n\t\t\theight = `${props.height}em`\n\t\t}\n\t}\n\n\treturn {\n\t\twidth,\n\t\theight\n\t}\n})\nconst updateInputMethod = ref<any>(null)\nprovide('setInput', updateInputMethod)\nconst setInput = (newValue: string) => {\n\tif (updateInputMethod.value) {\n\t\tupdateInputMethod.value(newValue)\n\t}\n}\nprovide('fileAction', (item: any, index: number) => {\n\temits('file-action', item, index)\n})\nprovide('downloadAction', (item: any, index: number) => {\n\temits('download-action', item, index)\n})\ndefineExpose({\n\tsend: (value: string, fileList?: any[], auto?: boolean, type?: string) => {\n\t\tdeepSeekRef.value?.send(value, fileList, auto, type) //send\n\t},\n\tcloseExtend: () => {\n\t\tdeepSeekRef.value?.closeExtend() // closeExtend\n\t},\n\tcreate: () => {\n\t\tdeepSeekRef.value?.create() // reset\n\t},\n\tretry: (index: number) => {\n\t\tdeepSeekRef.value?.retry(index)\n\t},\n\tupdate: (index: number, message: object) => {\n\t\tdeepSeekRef.value?.update(index, message)\n\t},\n\tchangeChat: (index: number) => {\n\t\tdeepSeekRef.value?.changeChat(index)\n\t},\n\tclearChat: () => {\n\t\tdeepSeekRef.value?.clearChat()\n\t},\n\tsetInput\n})\n</script>\n"],"names":["DO_defineComponent","ref","computed","provide","watch","_createCommentVNode","_createVNode","DeepSeek","_withCtx","_renderSlot"],"mappings":"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"}
@@ -66,7 +66,7 @@ class A2AService {
66
66
  return data.result;
67
67
  }
68
68
  // Stream message to agent (for streaming responses)
69
- async streamMessage(agentId, message, sessionId, signal) {
69
+ async streamMessage(agentId, message, sessionId, signal, modules) {
70
70
  const agent = this.agents.get(agentId);
71
71
  if (!agent) {
72
72
  throw new Error(`Agent ${agentId} not found`);
@@ -80,18 +80,52 @@ class A2AService {
80
80
  sessionId
81
81
  }
82
82
  };
83
+ let headers = {
84
+ "Content-Type": "application/json",
85
+ Accept: "text/event-stream",
86
+ ...agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {}
87
+ };
88
+ let body = JSON.stringify(request);
89
+ if (modules && modules.length > 0 && typeof modules[0] === "object" && modules[0] !== null && modules[0].config) {
90
+ const customConfig = modules[0].config;
91
+ if (typeof customConfig.headers === "function") {
92
+ const customHeaders = customConfig.headers();
93
+ headers = {
94
+ ...headers,
95
+ ...customHeaders
96
+ };
97
+ }
98
+ if (typeof customConfig.body === "function") {
99
+ const body_ = customConfig.body();
100
+ if (body_.messages) {
101
+ delete body_.messages;
102
+ }
103
+ if (body_.model) {
104
+ delete body_.model;
105
+ }
106
+ body = JSON.stringify(body_);
107
+ }
108
+ }
83
109
  const response = await fetch(agent.endpoint, {
84
110
  method: "POST",
85
- headers: {
86
- "Content-Type": "application/json",
87
- Accept: "text/event-stream",
88
- ...agent.authToken && { Authorization: `Bearer ${agent.authToken}` }
89
- },
90
- body: JSON.stringify(request),
111
+ headers,
112
+ body,
91
113
  signal
92
114
  });
93
115
  if (!response.ok) {
94
- throw new Error(`HTTP error: ${response.status}`);
116
+ try {
117
+ const errorBody = await response.text();
118
+ try {
119
+ const errorData = JSON.parse(errorBody);
120
+ if (errorData.error) {
121
+ throw new Error(errorData.error.message || `HTTP error: ${response.status}`);
122
+ }
123
+ } catch (e) {
124
+ throw new Error(errorBody || `HTTP error: ${response.status}`);
125
+ }
126
+ } catch (e) {
127
+ throw new Error(e.message || `HTTP error: ${response.status}`);
128
+ }
95
129
  }
96
130
  if (!response.body) {
97
131
  throw new Error("No response body");
@@ -111,39 +145,48 @@ class A2AService {
111
145
  let isDone = false;
112
146
  while (!isDone) {
113
147
  if (signal == null ? void 0 : signal.aborted) {
148
+ console.log("streamMessage: signal aborted");
114
149
  controller.close();
115
150
  return;
116
151
  }
117
152
  const { done, value } = await reader.read();
118
153
  if (done) {
154
+ console.log("streamMessage: stream done");
119
155
  isDone = true;
120
156
  controller.close();
121
157
  break;
122
158
  }
123
- buffer += decoder.decode(value, { stream: true });
159
+ const chunkText = decoder.decode(value, { stream: true });
160
+ buffer += chunkText;
124
161
  const lines = buffer.split("\n");
125
162
  buffer = lines.pop() || "";
126
163
  const fn = async (data) => {
127
164
  if (data === "[DONE]") {
165
+ console.log("streamMessage: [DONE] received");
128
166
  controller.close();
129
167
  return;
130
168
  }
169
+ const trimmedData = data.trim();
170
+ if (!trimmedData)
171
+ return;
131
172
  try {
132
- const chunk = JSON.parse(data);
173
+ const chunk = JSON.parse(trimmedData);
174
+ console.log("streamMessage: parsed chunk:", chunk);
133
175
  await new Promise((resolve) => setTimeout(resolve, 50));
134
176
  controller.enqueue(chunk);
135
177
  } catch (e) {
136
- console.warn("Failed to parse SSE data:", data);
178
+ console.warn("Failed to parse SSE data:", trimmedData);
137
179
  }
138
180
  };
139
181
  for (const line of lines) {
140
182
  const trimmed = line.trim();
141
183
  if (trimmed.startsWith("data:")) {
142
- const data = trimmed.slice(5);
143
- await fn(data);
144
- } else if (trimmed.startsWith("data: ")) {
145
- const data = trimmed.slice(6);
184
+ const data = trimmed.substring(5).trim();
146
185
  await fn(data);
186
+ } else if (trimmed && !trimmed.startsWith(":") && !trimmed.startsWith("event:") && !trimmed.startsWith("id:")) {
187
+ if (trimmed.startsWith("{")) {
188
+ await fn(trimmed);
189
+ }
147
190
  }
148
191
  }
149
192
  }
@@ -1 +1 @@
1
- {"version":3,"file":"a2aService.js","sources":["../../../../../../packages/components/touchchat/utils/a2aService.ts"],"sourcesContent":["import type { AgentConfig, Message, JSONRPCRequest, StreamChunk, Task, AgentCard, SubAgent } from '../src/types/a2a'\n// @/types/a2a\n\n// A2A Service - Handles communication with A2A agents\nexport class A2AService {\n\tprivate agents: Map<string, AgentConfig> = new Map()\n\n\t// Register an agent\n\tregisterAgent(config: AgentConfig): void {\n\t\tthis.agents.set(config.id, config)\n\t}\n\n\t// Unregister an agent\n\tunregisterAgent(agentId: string): void {\n\t\tthis.agents.delete(agentId)\n\t}\n\n\t// Get registered agent\n\tgetAgent(agentId: string): AgentConfig | undefined {\n\t\treturn this.agents.get(agentId)\n\t}\n\n\t// Get all registered agents\n\tgetAllAgents(): AgentConfig[] {\n\t\treturn Array.from(this.agents.values())\n\t}\n\n\t// Fetch agent card (agent discovery)\n\tasync fetchAgentCard(url: string): Promise<AgentCard> {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\tAccept: 'application/json'\n\t\t\t}\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to fetch agent card: ${response.statusText}`)\n\t\t}\n\n\t\treturn response.json()\n\t}\n\n\t// Send message to agent (non-streaming)\n\tasync sendMessage(agentId: string, message: Message, sessionId?: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/send',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Stream message to agent (for streaming responses)\n\tasync streamMessage(agentId: string, message: Message, sessionId?: string, signal?: AbortSignal): Promise<ReadableStream<StreamChunk>> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'text/event-stream',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\treturn new ReadableStream<StreamChunk>({\n\t\t\tasync start(controller) {\n\t\t\t\tconst reader = response.body!.getReader()\n\t\t\t\tconst decoder = new TextDecoder()\n\t\t\t\tlet buffer = ''\n\n\t\t\t\t// Handle abort signal\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\treader.cancel()\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tlet isDone = false\n\t\t\t\t\twhile (!isDone) {\n\t\t\t\t\t\t// Check if the signal has been aborted\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tisDone = true\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\t\t\tconst fn = async (data: string) => {\n\t\t\t\t\t\t\tif (data === '[DONE]') {\n\t\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\n\t\t\t\t\t\t\t\t// Add a small delay to simulate streaming effect\n\t\t\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50))\n\t\t\t\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tconst trimmed = line.trim()\n\t\t\t\t\t\t\tif (trimmed.startsWith('data:')) {\n\t\t\t\t\t\t\t\tconst data = trimmed.slice(5)\n\t\t\t\t\t\t\t\tawait fn(data)\n\t\t\t\t\t\t\t} else if (trimmed.startsWith('data: ')) {\n\t\t\t\t\t\t\t\tconst data = trimmed.slice(6)\n\t\t\t\t\t\t\t\tawait fn(data)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\treader.releaseLock()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// Multi-agent message routing\n\tasync routeMessage(agentIds: string[], message: Message, mode: 'sequential' | 'parallel' = 'sequential'): Promise<Map<string, Task>> {\n\t\tconst results = new Map<string, Task>()\n\n\t\tif (mode === 'parallel') {\n\t\t\tconst promises = agentIds.map(async agentId => {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\treturn { agentId, task, error: null }\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { agentId, task: null, error }\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst settled = await Promise.all(promises)\n\t\t\tfor (const { agentId, task, error } of settled) {\n\t\t\t\tif (task) {\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Sequential\n\t\t\tfor (const agentId of agentIds) {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\t// Get task status\n\tasync getTask(agentId: string, taskId: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/get',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Cancel task\n\tasync cancelTask(agentId: string, taskId: string): Promise<void> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/cancel',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\t}\n\n\t// Generate unique ID\n\tprivate generateId(): string {\n\t\treturn `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n\t}\n\n\t// Multi-agent streaming message\n\tasync *streamMultiAgentMessage(hostEndpoint: string, subAgents: SubAgent[], message: Message, headers: object, sessionId?: string, signal?: AbortSignal): AsyncGenerator<StreamChunk, void, unknown> {\n\t\t// Build X-Sub-Agents headers: JSON array -> Base64\n\t\tconst subAgentsJson = JSON.stringify(subAgents)\n\t\t// Use Unicode-safe Base64 encoding\n\t\tconst xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)))\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(hostEndpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'text/event-stream',\n\t\t\t\t'X-Sub-Agents': xSubAgents,\n\t\t\t\t// 'ai-jwt-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhc2lhaW5mby5jb20iLCJzdWIiOiJkZW5nd2FuIiwiYXVkIjoiY29tLmFpZi5wYWFzLndlYlRva2VuIiwidXNlckluZm8iOiJ7XCJhbGlhc1wiOlwiZGVuZ3dhblwiLFwiYXV0b2luXCI6ZmFsc2UsXCJlbnZDb2RlXCI6XCJQUk9EXCIsXCJlbnZOYW1lXCI6XCLnlJ_kuqfnjq_looNcIixcImxhbmd1YWdlXCI6XCJ6aFwiLFwicGVybWlzc2lvbnNcIjpbXCJcIixcInBvcnRhbDpzeXN0ZW06cm9sZTpiaW5kXCIsXCJwb3J0YWw6ZGljdGlvbmFyeTpkYXRhOmFkZFwiLG51bGwsXCJhZ2VudFwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTp1cGRhdGVcIixcImF1ZGl0TG9nL2xpc3RBdWRpdExvZ1wiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW06dXNlcjp1cGRhdGVcIixcInBvcnRhbDptY3A6YXVkaXRcIixcInBvcnRhbDptY3A6c2FmZWF1ZGl0XCIsXCJwb3J0YWw6bWNwOnRvb2xjb25maXJtXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDphZGRcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnJlbGF0aW9uXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpwZXJtaXNzaW9uXCIsXCJwb3J0YWw6c3lzdGVtUGFyYW1ldGVyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6dXBkYXRlXCIsXCJwb3J0YWw6c3lzdGVtOnJvbGU6YWRkXCIsXCJ0ZW5hbnQvZ2V0VGVuYW50RHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOnVwZGF0ZVwiLFwicG9ydGFsOmFnZW50OmF1ZGl0XCIsXCJwb3J0YWw6bm90aWNlOnVwZGF0ZVwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOmRlbGV0ZVwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmFkZFwiLFwibWVudS9nZXRNZW51QnlQYXJhbVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGVsZXRlXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpkZWxldGVcIixcInVzZXIvcXVlcnlVc2VyRHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTptZW51OmFkZFwiLFwicG9ydGFsOnN5c3RlbVBhcmFtZXRlcjp1cGRhdGVcIixcInBvcnRhbDphZ2VudDptb2RlbGNoZWNrXCIsXCJwb3J0YWw6c3lzdGVtOm1lbnU6dXBkYXRlXCIsXCJyb2xlL3F1ZXJ5Um9sZUxpc3RcIixcInBvcnRhbDpzeXN0ZW06bWVudTpkZWxldGVcIixcInBvcnRhbDpub3RpY2U6YWRkXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW1QYXJhbWV0ZXI6YWRkXCIsXCJyb2xlUGVybWlzc2lvbnMvcXVlcnlNZW51UGVybWlzc2lvbkxpc3RcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnVwZGF0ZVwiLFwibm90aWNlL2xpc3ROb3RpY2VcIl0sXCJwbGF0Zm9ybU1hbmFnZXJcIjp0cnVlLFwicm9sZUxpc3RcIjpbe1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwiY2FwX3Byb3ZpZGVyXCIsXCJyb2xlSWRcIjoxMixcInJvbGVOYW1lXCI6XCLog73lipvmj5DkvpvogIVcIixcInJvbGVUeXBlXCI6MX0se1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwidGVuYW50X2FkbWluXCIsXCJyb2xlSWRcIjo4LFwicm9sZU5hbWVcIjpcIuenn-aIt-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfSx7XCJjcmVhdGVUaW1lXCI6XCIyMDIyLTA2LTI4IDAwOjAwOjAwXCIsXCJoYXNFZGl0XCI6MSxcInJvbGVDb2RlXCI6XCJyb2xlX2FkbWluXCIsXCJyb2xlSWRcIjoxLFwicm9sZU5hbWVcIjpcIui2hee6p-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfV0sXCJ0ZW5hbnRDb2RlXCI6XCJ0ZW5hbnQtb25lXCIsXCJ0ZW5hbnRJZFwiOjUsXCJ0ZW5hbnROYW1lXCI6XCLkuIDnuqfov5DokKXnqbrpl7RcIixcInVzZXJJZFwiOjYsXCJ1c2VyTmFtZVwiOlwiZGVuZ3dhblwifSIsImV4cCI6MTc3Mzk5ODEzN30.7P8WVl3ji1G2unk0wOISJbF43ilcuzksOdSOQJNHGXM'\n\t\t\t\t// 'ai-jwt-token': authToken\n\t\t\t\t...headers\n\t\t\t},\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\tconst reader = response.body.getReader()\n\t\tconst decoder = new TextDecoder()\n\t\tlet buffer = ''\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\t// Check if the signal has been aborted\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\tif (done) break\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tconst trimmed = line.trim()\n\t\t\t\t\tif (trimmed.startsWith('data: ')) {\n\t\t\t\t\t\tconst data = trimmed.slice(6)\n\t\t\t\t\t\tif (data === '[DONE]') return\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\n\t\t\t\t\t\t\tyield chunk\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock()\n\t\t}\n\t}\n}\n\n// Singleton instance\nexport const a2aService = new A2AService()\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"a2aService.js","sources":["../../../../../../packages/components/touchchat/utils/a2aService.ts"],"sourcesContent":["import type { AgentConfig, Message, JSONRPCRequest, StreamChunk, Task, AgentCard, SubAgent } from '../src/types/a2a'\nimport type { ModuleItem } from '../../../../packages/components/touchchat/src/AiChat/Chat/types'\n// @/types/a2a\n\n// A2A Service - Handles communication with A2A agents\nexport class A2AService {\n\tprivate agents: Map<string, AgentConfig> = new Map()\n\n\t// Register an agent\n\tregisterAgent(config: AgentConfig): void {\n\t\tthis.agents.set(config.id, config)\n\t}\n\n\t// Unregister an agent\n\tunregisterAgent(agentId: string): void {\n\t\tthis.agents.delete(agentId)\n\t}\n\n\t// Get registered agent\n\tgetAgent(agentId: string): AgentConfig | undefined {\n\t\treturn this.agents.get(agentId)\n\t}\n\n\t// Get all registered agents\n\tgetAllAgents(): AgentConfig[] {\n\t\treturn Array.from(this.agents.values())\n\t}\n\n\t// Fetch agent card (agent discovery)\n\tasync fetchAgentCard(url: string): Promise<AgentCard> {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\tAccept: 'application/json'\n\t\t\t}\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to fetch agent card: ${response.statusText}`)\n\t\t}\n\n\t\treturn response.json()\n\t}\n\n\t// Send message to agent (non-streaming)\n\tasync sendMessage(agentId: string, message: Message, sessionId?: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/send',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Stream message to agent (for streaming responses)\n\tasync streamMessage(agentId: string, message: Message, sessionId?: string, signal?: AbortSignal, modules?: ModuleItem[]): Promise<ReadableStream<StreamChunk>> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tlet headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t\tAccept: 'text/event-stream',\n\t\t\t...(agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {})\n\t\t}\n\n\t\tlet body = JSON.stringify(request)\n\n\t\t// 只有当 modules 数组有数据且第一个元素是对象且有 config 属性时,才使用自定义配置\n\t\tif (modules && modules.length > 0 && typeof modules[0] === 'object' && modules[0] !== null && modules[0].config) {\n\t\t\tconst customConfig = modules[0].config\n\t\t\tif (typeof customConfig.headers === 'function') {\n\t\t\t\tconst customHeaders = customConfig.headers()\n\t\t\t\theaders = {\n\t\t\t\t\t...headers,\n\t\t\t\t\t...customHeaders\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof customConfig.body === 'function') {\n\t\t\t\tconst body_ = customConfig.body()\n\t\t\t\tif (body_.messages) {\n\t\t\t\t\tdelete body_.messages\n\t\t\t\t}\n\t\t\t\tif (body_.model) {\n\t\t\t\t\tdelete body_.model\n\t\t\t\t}\n\t\t\t\tbody = JSON.stringify(body_)\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders,\n\t\t\tbody,\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\ttry {\n\t\t\t\tconst errorBody = await response.text()\n\t\t\t\ttry {\n\t\t\t\t\tconst errorData = JSON.parse(errorBody)\n\t\t\t\t\tif (errorData.error) {\n\t\t\t\t\t\tthrow new Error(errorData.error.message || `HTTP error: ${response.status}`)\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(errorBody || `HTTP error: ${response.status}`)\n\t\t\t\t}\n\t\t\t} catch (e: any) {\n\t\t\t\tthrow new Error(e.message || `HTTP error: ${response.status}`)\n\t\t\t}\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\treturn new ReadableStream<StreamChunk>({\n\t\t\tasync start(controller) {\n\t\t\t\tconst reader = response.body!.getReader()\n\t\t\t\tconst decoder = new TextDecoder()\n\t\t\t\tlet buffer = ''\n\n\t\t\t\t// Handle abort signal\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\treader.cancel()\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tlet isDone = false\n\t\t\t\t\twhile (!isDone) {\n\t\t\t\t\t\t// Check if the signal has been aborted\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tconsole.log('streamMessage: signal aborted')\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tconsole.log('streamMessage: stream done')\n\t\t\t\t\t\t\tisDone = true\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst chunkText = decoder.decode(value, { stream: true })\n\n\t\t\t\t\t\tbuffer += chunkText\n\t\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\t\t\tconst fn = async (data: string) => {\n\t\t\t\t\t\t\tif (data === '[DONE]') {\n\t\t\t\t\t\t\t\tconsole.log('streamMessage: [DONE] received')\n\t\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Trim whitespace from data\n\t\t\t\t\t\t\tconst trimmedData = data.trim()\n\t\t\t\t\t\t\tif (!trimmedData) return\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(trimmedData)\n\t\t\t\t\t\t\t\tconsole.log('streamMessage: parsed chunk:', chunk)\n\t\t\t\t\t\t\t\t// Add a small delay to simulate streaming effect\n\t\t\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50))\n\t\t\t\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', trimmedData)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tconst trimmed = line.trim()\n\n\t\t\t\t\t\t\t// Handle different SSE formats\n\t\t\t\t\t\t\tif (trimmed.startsWith('data:')) {\n\t\t\t\t\t\t\t\t// Remove 'data:' prefix and any leading whitespace\n\t\t\t\t\t\t\t\tconst data = trimmed.substring(5).trim()\n\t\t\t\t\t\t\t\tawait fn(data)\n\t\t\t\t\t\t\t} else if (trimmed && !trimmed.startsWith(':') && !trimmed.startsWith('event:') && !trimmed.startsWith('id:')) {\n\t\t\t\t\t\t\t\t// Some servers send raw JSON without 'data:' prefix\n\t\t\t\t\t\t\t\t// Try to parse it directly if it looks like JSON\n\t\t\t\t\t\t\t\tif (trimmed.startsWith('{')) {\n\t\t\t\t\t\t\t\t\tawait fn(trimmed)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Ignore comments (lines starting with :), event types, and IDs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\treader.releaseLock()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// Multi-agent message routing\n\tasync routeMessage(agentIds: string[], message: Message, mode: 'sequential' | 'parallel' = 'sequential'): Promise<Map<string, Task>> {\n\t\tconst results = new Map<string, Task>()\n\n\t\tif (mode === 'parallel') {\n\t\t\tconst promises = agentIds.map(async agentId => {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\treturn { agentId, task, error: null }\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { agentId, task: null, error }\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst settled = await Promise.all(promises)\n\t\t\tfor (const { agentId, task, error } of settled) {\n\t\t\t\tif (task) {\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Sequential\n\t\t\tfor (const agentId of agentIds) {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\t// Get task status\n\tasync getTask(agentId: string, taskId: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/get',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Cancel task\n\tasync cancelTask(agentId: string, taskId: string): Promise<void> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/cancel',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\t}\n\n\t// Generate unique ID\n\tprivate generateId(): string {\n\t\treturn `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n\t}\n\n\t// Multi-agent streaming message\n\tasync *streamMultiAgentMessage(hostEndpoint: string, subAgents: SubAgent[], message: Message, headers: object, sessionId?: string, signal?: AbortSignal): AsyncGenerator<StreamChunk, void, unknown> {\n\t\t// Build X-Sub-Agents headers: JSON array -> Base64\n\t\tconst subAgentsJson = JSON.stringify(subAgents)\n\t\t// Use Unicode-safe Base64 encoding\n\t\tconst xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)))\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(hostEndpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'text/event-stream',\n\t\t\t\t'X-Sub-Agents': xSubAgents,\n\t\t\t\t// 'ai-jwt-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhc2lhaW5mby5jb20iLCJzdWIiOiJkZW5nd2FuIiwiYXVkIjoiY29tLmFpZi5wYWFzLndlYlRva2VuIiwidXNlckluZm8iOiJ7XCJhbGlhc1wiOlwiZGVuZ3dhblwiLFwiYXV0b2luXCI6ZmFsc2UsXCJlbnZDb2RlXCI6XCJQUk9EXCIsXCJlbnZOYW1lXCI6XCLnlJ_kuqfnjq_looNcIixcImxhbmd1YWdlXCI6XCJ6aFwiLFwicGVybWlzc2lvbnNcIjpbXCJcIixcInBvcnRhbDpzeXN0ZW06cm9sZTpiaW5kXCIsXCJwb3J0YWw6ZGljdGlvbmFyeTpkYXRhOmFkZFwiLG51bGwsXCJhZ2VudFwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTp1cGRhdGVcIixcImF1ZGl0TG9nL2xpc3RBdWRpdExvZ1wiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW06dXNlcjp1cGRhdGVcIixcInBvcnRhbDptY3A6YXVkaXRcIixcInBvcnRhbDptY3A6c2FmZWF1ZGl0XCIsXCJwb3J0YWw6bWNwOnRvb2xjb25maXJtXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDphZGRcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnJlbGF0aW9uXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpwZXJtaXNzaW9uXCIsXCJwb3J0YWw6c3lzdGVtUGFyYW1ldGVyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6dXBkYXRlXCIsXCJwb3J0YWw6c3lzdGVtOnJvbGU6YWRkXCIsXCJ0ZW5hbnQvZ2V0VGVuYW50RHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOnVwZGF0ZVwiLFwicG9ydGFsOmFnZW50OmF1ZGl0XCIsXCJwb3J0YWw6bm90aWNlOnVwZGF0ZVwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOmRlbGV0ZVwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmFkZFwiLFwibWVudS9nZXRNZW51QnlQYXJhbVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGVsZXRlXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpkZWxldGVcIixcInVzZXIvcXVlcnlVc2VyRHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTptZW51OmFkZFwiLFwicG9ydGFsOnN5c3RlbVBhcmFtZXRlcjp1cGRhdGVcIixcInBvcnRhbDphZ2VudDptb2RlbGNoZWNrXCIsXCJwb3J0YWw6c3lzdGVtOm1lbnU6dXBkYXRlXCIsXCJyb2xlL3F1ZXJ5Um9sZUxpc3RcIixcInBvcnRhbDpzeXN0ZW06bWVudTpkZWxldGVcIixcInBvcnRhbDpub3RpY2U6YWRkXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW1QYXJhbWV0ZXI6YWRkXCIsXCJyb2xlUGVybWlzc2lvbnMvcXVlcnlNZW51UGVybWlzc2lvbkxpc3RcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnVwZGF0ZVwiLFwibm90aWNlL2xpc3ROb3RpY2VcIl0sXCJwbGF0Zm9ybU1hbmFnZXJcIjp0cnVlLFwicm9sZUxpc3RcIjpbe1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwiY2FwX3Byb3ZpZGVyXCIsXCJyb2xlSWRcIjoxMixcInJvbGVOYW1lXCI6XCLog73lipvmj5DkvpvogIVcIixcInJvbGVUeXBlXCI6MX0se1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwidGVuYW50X2FkbWluXCIsXCJyb2xlSWRcIjo4LFwicm9sZU5hbWVcIjpcIuenn-aIt-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfSx7XCJjcmVhdGVUaW1lXCI6XCIyMDIyLTA2LTI4IDAwOjAwOjAwXCIsXCJoYXNFZGl0XCI6MSxcInJvbGVDb2RlXCI6XCJyb2xlX2FkbWluXCIsXCJyb2xlSWRcIjoxLFwicm9sZU5hbWVcIjpcIui2hee6p-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfV0sXCJ0ZW5hbnRDb2RlXCI6XCJ0ZW5hbnQtb25lXCIsXCJ0ZW5hbnRJZFwiOjUsXCJ0ZW5hbnROYW1lXCI6XCLkuIDnuqfov5DokKXnqbrpl7RcIixcInVzZXJJZFwiOjYsXCJ1c2VyTmFtZVwiOlwiZGVuZ3dhblwifSIsImV4cCI6MTc3Mzk5ODEzN30.7P8WVl3ji1G2unk0wOISJbF43ilcuzksOdSOQJNHGXM'\n\t\t\t\t// 'ai-jwt-token': authToken\n\t\t\t\t...headers\n\t\t\t},\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\tconst reader = response.body.getReader()\n\t\tconst decoder = new TextDecoder()\n\t\tlet buffer = ''\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\t// Check if the signal has been aborted\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\tif (done) break\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tconst trimmed = line.trim()\n\t\t\t\t\tif (trimmed.startsWith('data: ')) {\n\t\t\t\t\t\tconst data = trimmed.slice(6)\n\t\t\t\t\t\tif (data === '[DONE]') return\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\n\t\t\t\t\t\t\tyield chunk\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock()\n\t\t}\n\t}\n}\n\n// Singleton instance\nexport const a2aService = new A2AService()\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetchStream.js","sources":["../../../../../../packages/components/touchchat/utils/fetchStream.ts"],"sourcesContent":["// 定义 FetchStream 所需的选项接口\ninterface FetchStreamOptions {\n\turl: string\n\trequestInit?: RequestInit\n\tonmessage?: (line: string, index: number) => void\n\tondone?: (allDataText: string) => void\n\tonerror?: (response: Response | Error) => void\n\tonabort?: () => void\n\tontimeout?: () => void\n}\n\nconst decoder = new TextDecoder('utf-8')\nlet partial = '' // 未完成的字节\n\n// 改进的handleChunk函数,更安全地处理UTF-8字符\nconst handleChunk = (chunk: Uint8Array): string => {\n\t// 将新数据块拼接到剩余字节\n\tconst data = partial + decoder.decode(chunk, { stream: true })\n\n\t// 查找最后一个完整行结束位置\n\tconst lastNewline = data.lastIndexOf('\\n')\n\n\tif (lastNewline >= 0) {\n\t\tpartial = data.slice(lastNewline + 1) // 保留不完整部分\n\t\treturn data.slice(0, lastNewline + 1) // 返回完整行\n\t}\n\n\t// 如果没有找到换行符,保留全部数据\n\tpartial = data\n\treturn ''\n}\n\n// FetchStream 类,用于处理流式请求\nexport class FetchStream {\n\turl: string\n\trequestInit: RequestInit\n\tonmessage?: (line: string, index: number) => void\n\tondone?: (allDataText: string) => void\n\tonerror?: (response: Response | Error) => void\n\tonabort?: () => void\n\tontimeout?: () => void\n\tcontroller: AbortController | null\n\ttimer: ReturnType<typeof setTimeout> | null\n\n\tconstructor(options: FetchStreamOptions) {\n\t\tif (!options.url) {\n\t\t\tthrow new Error('url argument must be provided')\n\t\t}\n\t\tthis.url = options.url\n\t\tthis.requestInit = options.requestInit || {}\n\t\tthis.onmessage = options.onmessage\n\t\tthis.ondone = options.ondone\n\t\tthis.onerror = options.onerror\n\t\tthis.onabort = options.onabort\n\t\tthis.ontimeout = options.ontimeout\n\n\t\tthis.controller = new AbortController()\n\t\tthis.timer = null\n\n\t\tthis.createFetchRequest()\n\t}\n\n\t// 创建 fetch 请求\n\tasync createFetchRequest(): Promise<void> {\n\t\tthis.timeout()\n\n\t\ttry {\n\t\t\tconst response = await fetch(this.url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tsignal: this.controller?.signal,\n\t\t\t\t...this.requestInit\n\t\t\t})\n\n\t\t\tif (this.timer) {\n\t\t\t\tclearTimeout(this.timer)\n\t\t\t}\n\n\t\t\tif (response.status === 200) {\n\t\t\t\tif (!response.body) {\n\t\t\t\t\tthrow new Error('Response body is null')\n\t\t\t\t}\n\t\t\t\tconst reader = response.body.getReader()\n\t\t\t\tlet allDataText = ''\n\t\t\t\tlet buffer = ''\n\t\t\t\tlet index = 0\n\n\t\t\t\tlet shouldContinue = true\n\t\t\t\twhile (shouldContinue) {\n\t\t\t\t\tconst { value, done } = await reader.read()\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tshouldContinue = false\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tconst dataText = handleChunk(value)\n\n\t\t\t\t\t\tif (dataText) {\n\t\t\t\t\t\t\tallDataText += dataText\n\t\t\t\t\t\t\tbuffer += dataText\n\n\t\t\t\t\t\t\t// 处理完整行\n\t\t\t\t\t\t\tlet lineEndIndex\n\t\t\t\t\t\t\twhile ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n\t\t\t\t\t\t\t\tconst line = buffer.slice(0, lineEndIndex)\n\t\t\t\t\t\t\t\tbuffer = buffer.slice(lineEndIndex + 1)\n\t\t\t\t\t\t\t\tthis.onmessage?.(line, index++)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 处理剩余数据\n\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\tthis.onmessage?.(buffer, index++)\n\t\t\t\t}\n\n\t\t\t\tthis.ondone?.(allDataText)\n\t\t\t} else {\n\t\t\t\t// 读取响应体中的错误信息\n\t\t\t\tconst errorBody = await response.text()\n\t\t\t\tthrow new Error(errorBody || `请求失败: ${response.status} ${response.statusText}`)\n\t\t\t}\n\t\t} catch (response) {\n\t\t\t// 如果是用户主动中止的错误,不调用onerror\n\t\t\tconst isAbortError = response instanceof Error && response.name === 'AbortError'\n\n\t\t\t// 如果不是用户主动中止的错误,则调用 onerror\n\t\t\tif (!isAbortError) {\n\t\t\t\tthis.onerror?.(response instanceof Response ? response : new Error(String(response)))\n\t\t\t} else if (this.onabort) {\n\t\t\t\t// 如果是中止错误且定义了 onabort 回调,则调用它\n\t\t\t\tthis.onabort()\n\t\t\t}\n\t\t}\n\t}\n\n\t// 中断 fetch 请求\n\tabort(): void {\n\t\ttry {\n\t\t\tthis.controller?.abort()\n\t\t\tthis.onabort?.()\n\t\t} catch (error) {\n\t\t\tconsole.error('Abort error:', error)\n\t\t}\n\t}\n\n\t// 超时中断\n\ttimeout(time: number = 60000): void {\n\t\tthis.timer = setTimeout(() => {\n\t\t\tthis.abort()\n\t\t\tthis.ontimeout?.()\n\t\t}, time)\n\t}\n}\n"],"names":[],"mappings":";;AAWA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA,CAAA;AACvC,IAAI,OAAU,GAAA,EAAA,CAAA;AAGd,MAAM,WAAA,GAAc,CAAC,KAA8B,KAAA;AAElD,EAAM,MAAA,IAAA,GAAO,UAAU,OAAQ,CAAA,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAA;AAG7D,EAAM,MAAA,WAAA,GAAc,IAAK,CAAA,WAAA,CAAY,IAAI,CAAA,CAAA;AAEzC,EAAA,IAAI,eAAe,CAAG,EAAA;AACrB,IAAU,OAAA,GAAA,IAAA,CAAK,KAAM,CAAA,WAAA,GAAc,CAAC,CAAA,CAAA;AACpC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,WAAA,GAAc,CAAC,CAAA,CAAA;AAAA,GACrC;AAGA,EAAU,OAAA,GAAA,IAAA,CAAA;AACV,EAAO,OAAA,EAAA,CAAA;AACR,CAAA,CAAA;AAGO,MAAM,WAAY,CAAA;AAAA,EAWxB,YAAY,OAA6B,EAAA;AACxC,IAAI,IAAA,CAAC,QAAQ,GAAK,EAAA;AACjB,MAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAAA,KAChD;AACA,IAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,GAAA,CAAA;AACnB,IAAK,IAAA,CAAA,WAAA,GAAc,OAAQ,CAAA,WAAA,IAAe,EAAC,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA,CAAA;AACzB,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA,CAAA;AACtB,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,OAAA,CAAA;AACvB,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,OAAA,CAAA;AACvB,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA,CAAA;AAEzB,IAAK,IAAA,CAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACtC,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AAEb,IAAA,IAAA,CAAK,kBAAmB,EAAA,CAAA;AAAA,GACzB;AAAA;AAAA,EAGA,MAAM,kBAAoC,GAAA;AA/D3C,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAgEE,IAAA,IAAA,CAAK,OAAQ,EAAA,CAAA;AAEb,IAAI,IAAA;AACH,MAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,IAAA,CAAK,GAAK,EAAA;AAAA,QACtC,MAAQ,EAAA,MAAA;AAAA,QACR,MAAA,EAAA,CAAQ,EAAK,GAAA,IAAA,CAAA,UAAA,KAAL,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA;AAAA,QACzB,GAAG,IAAK,CAAA,WAAA;AAAA,OACR,CAAA,CAAA;AAED,MAAA,IAAI,KAAK,KAAO,EAAA;AACf,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA,CAAA;AAAA,OACxB;AAEA,MAAI,IAAA,QAAA,CAAS,WAAW,GAAK,EAAA;AAC5B,QAAI,IAAA,CAAC,SAAS,IAAM,EAAA;AACnB,UAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,SACxC;AACA,QAAM,MAAA,MAAA,GAAS,QAAS,CAAA,IAAA,CAAK,SAAU,EAAA,CAAA;AACvC,QAAA,IAAI,WAAc,GAAA,EAAA,CAAA;AAClB,QAAA,IAAI,MAAS,GAAA,EAAA,CAAA;AACb,QAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AAEZ,QAAA,IAAI,cAAiB,GAAA,IAAA,CAAA;AACrB,QAAA,OAAO,cAAgB,EAAA;AACtB,UAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAS,GAAA,MAAM,OAAO,IAAK,EAAA,CAAA;AAC1C,UAAA,IAAI,IAAM,EAAA;AACT,YAAiB,cAAA,GAAA,KAAA,CAAA;AACjB,YAAA,MAAA;AAAA,WACD;AACA,UAAA,IAAI,KAAO,EAAA;AACV,YAAM,MAAA,QAAA,GAAW,YAAY,KAAK,CAAA,CAAA;AAElC,YAAA,IAAI,QAAU,EAAA;AACb,cAAe,WAAA,IAAA,QAAA,CAAA;AACf,cAAU,MAAA,IAAA,QAAA,CAAA;AAGV,cAAI,IAAA,YAAA,CAAA;AACJ,cAAA,OAAA,CAAQ,YAAe,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAI,MAAM,CAAG,EAAA;AAClD,gBAAA,MAAM,IAAO,GAAA,MAAA,CAAO,KAAM,CAAA,CAAA,EAAG,YAAY,CAAA,CAAA;AACzC,gBAAS,MAAA,GAAA,MAAA,CAAO,KAAM,CAAA,YAAA,GAAe,CAAC,CAAA,CAAA;AACtC,gBAAK,CAAA,EAAA,GAAA,IAAA,CAAA,SAAA,KAAL,8BAAiB,IAAM,EAAA,KAAA,EAAA,CAAA,CAAA;AAAA,eACxB;AAAA,aACD;AAAA,WACD;AAAA,SACD;AAGA,QAAI,IAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AACtB,UAAK,CAAA,EAAA,GAAA,IAAA,CAAA,SAAA,KAAL,8BAAiB,MAAQ,EAAA,KAAA,EAAA,CAAA,CAAA;AAAA,SAC1B;AAEA,QAAA,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AAAA,OACR,MAAA;AAEN,QAAM,MAAA,SAAA,GAAY,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACtC,QAAA,MAAM,IAAI,KAAM,CAAA,SAAA,IAAa,6BAAS,QAAS,CAAA,MAAA,CAAA,CAAA,EAAU,SAAS,UAAY,CAAA,CAAA,CAAA,CAAA;AAAA,OAC/E;AAAA,aACQ,QAAP,EAAA;AAED,MAAA,MAAM,YAAe,GAAA,QAAA,YAAoB,KAAS,IAAA,QAAA,CAAS,IAAS,KAAA,YAAA,CAAA;AAGpE,MAAA,IAAI,CAAC,YAAc,EAAA;AAClB,QAAK,CAAA,EAAA,GAAA,IAAA,CAAA,OAAA,KAAL,8BAAe,QAAoB,YAAA,QAAA,GAAW,WAAW,IAAI,KAAA,CAAM,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,OACpF,MAAA,IAAW,KAAK,OAAS,EAAA;AAExB,QAAA,IAAA,CAAK,OAAQ,EAAA,CAAA;AAAA,OACd;AAAA,KACD;AAAA,GACD;AAAA;AAAA,EAGA,KAAc,GAAA;AAzIf,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0IE,IAAI,IAAA;AACH,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,eAAL,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AACjB,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,aACQ,KAAP,EAAA;AACD,MAAQ,OAAA,CAAA,KAAA,CAAM,gBAAgB,KAAK,CAAA,CAAA;AAAA,KACpC;AAAA,GACD;AAAA;AAAA,EAGA,OAAA,CAAQ,OAAe,GAAa,EAAA;AACnC,IAAK,IAAA,CAAA,KAAA,GAAQ,WAAW,MAAM;AApJhC,MAAA,IAAA,EAAA,CAAA;AAqJG,MAAA,IAAA,CAAK,KAAM,EAAA,CAAA;AACX,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,SAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,OACE,IAAI,CAAA,CAAA;AAAA,GACR;AACD;;;;"}
1
+ {"version":3,"file":"fetchStream.js","sources":["../../../../../../packages/components/touchchat/utils/fetchStream.ts"],"sourcesContent":["// 定义 FetchStream 所需的选项接口\r\ninterface FetchStreamOptions {\r\n\turl: string\r\n\trequestInit?: RequestInit\r\n\tonmessage?: (line: string, index: number) => void\r\n\tondone?: (allDataText: string) => void\r\n\tonerror?: (response: Response | Error) => void\r\n\tonabort?: () => void\r\n\tontimeout?: () => void\r\n}\r\n\r\nconst decoder = new TextDecoder('utf-8')\r\nlet partial = '' // 未完成的字节\r\n\r\n// 改进的handleChunk函数,更安全地处理UTF-8字符\r\nconst handleChunk = (chunk: Uint8Array): string => {\r\n\t// 将新数据块拼接到剩余字节\r\n\tconst data = partial + decoder.decode(chunk, { stream: true })\r\n\r\n\t// 查找最后一个完整行结束位置\r\n\tconst lastNewline = data.lastIndexOf('\\n')\r\n\r\n\tif (lastNewline >= 0) {\r\n\t\tpartial = data.slice(lastNewline + 1) // 保留不完整部分\r\n\t\treturn data.slice(0, lastNewline + 1) // 返回完整行\r\n\t}\r\n\r\n\t// 如果没有找到换行符,保留全部数据\r\n\tpartial = data\r\n\treturn ''\r\n}\r\n\r\n// FetchStream 类,用于处理流式请求\r\nexport class FetchStream {\r\n\turl: string\r\n\trequestInit: RequestInit\r\n\tonmessage?: (line: string, index: number) => void\r\n\tondone?: (allDataText: string) => void\r\n\tonerror?: (response: Response | Error) => void\r\n\tonabort?: () => void\r\n\tontimeout?: () => void\r\n\tcontroller: AbortController | null\r\n\ttimer: ReturnType<typeof setTimeout> | null\r\n\r\n\tconstructor(options: FetchStreamOptions) {\r\n\t\tif (!options.url) {\r\n\t\t\tthrow new Error('url argument must be provided')\r\n\t\t}\r\n\t\tthis.url = options.url\r\n\t\tthis.requestInit = options.requestInit || {}\r\n\t\tthis.onmessage = options.onmessage\r\n\t\tthis.ondone = options.ondone\r\n\t\tthis.onerror = options.onerror\r\n\t\tthis.onabort = options.onabort\r\n\t\tthis.ontimeout = options.ontimeout\r\n\r\n\t\tthis.controller = new AbortController()\r\n\t\tthis.timer = null\r\n\r\n\t\tthis.createFetchRequest()\r\n\t}\r\n\r\n\t// 创建 fetch 请求\r\n\tasync createFetchRequest(): Promise<void> {\r\n\t\tthis.timeout()\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(this.url, {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\tsignal: this.controller?.signal,\r\n\t\t\t\t...this.requestInit\r\n\t\t\t})\r\n\r\n\t\t\tif (this.timer) {\r\n\t\t\t\tclearTimeout(this.timer)\r\n\t\t\t}\r\n\r\n\t\t\tif (response.status === 200) {\r\n\t\t\t\tif (!response.body) {\r\n\t\t\t\t\tthrow new Error('Response body is null')\r\n\t\t\t\t}\r\n\t\t\t\tconst reader = response.body.getReader()\r\n\t\t\t\tlet allDataText = ''\r\n\t\t\t\tlet buffer = ''\r\n\t\t\t\tlet index = 0\r\n\r\n\t\t\t\tlet shouldContinue = true\r\n\t\t\t\twhile (shouldContinue) {\r\n\t\t\t\t\tconst { value, done } = await reader.read()\r\n\t\t\t\t\tif (done) {\r\n\t\t\t\t\t\tshouldContinue = false\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tconst dataText = handleChunk(value)\r\n\r\n\t\t\t\t\t\tif (dataText) {\r\n\t\t\t\t\t\t\tallDataText += dataText\r\n\t\t\t\t\t\t\tbuffer += dataText\r\n\r\n\t\t\t\t\t\t\t// 处理完整行\r\n\t\t\t\t\t\t\tlet lineEndIndex\r\n\t\t\t\t\t\t\twhile ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\r\n\t\t\t\t\t\t\t\tconst line = buffer.slice(0, lineEndIndex)\r\n\t\t\t\t\t\t\t\tbuffer = buffer.slice(lineEndIndex + 1)\r\n\t\t\t\t\t\t\t\tthis.onmessage?.(line, index++)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 处理剩余数据\r\n\t\t\t\tif (buffer.length > 0) {\r\n\t\t\t\t\tthis.onmessage?.(buffer, index++)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.ondone?.(allDataText)\r\n\t\t\t} else {\r\n\t\t\t\t// 读取响应体中的错误信息\r\n\t\t\t\tconst errorBody = await response.text()\r\n\t\t\t\tthrow new Error(errorBody || `请求失败: ${response.status} ${response.statusText}`)\r\n\t\t\t}\r\n\t\t} catch (response) {\r\n\t\t\t// 如果是用户主动中止的错误,不调用onerror\r\n\t\t\tconst isAbortError = response instanceof Error && response.name === 'AbortError'\r\n\r\n\t\t\t// 如果不是用户主动中止的错误,则调用 onerror\r\n\t\t\tif (!isAbortError) {\r\n\t\t\t\tthis.onerror?.(response instanceof Response ? response : new Error(String(response)))\r\n\t\t\t} else if (this.onabort) {\r\n\t\t\t\t// 如果是中止错误且定义了 onabort 回调,则调用它\r\n\t\t\t\tthis.onabort()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 中断 fetch 请求\r\n\tabort(): void {\r\n\t\ttry {\r\n\t\t\tthis.controller?.abort()\r\n\t\t\tthis.onabort?.()\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error('Abort error:', error)\r\n\t\t}\r\n\t}\r\n\r\n\t// 超时中断\r\n\ttimeout(time: number = 60000): void {\r\n\t\tthis.timer = setTimeout(() => {\r\n\t\t\tthis.abort()\r\n\t\t\tthis.ontimeout?.()\r\n\t\t}, time)\r\n\t}\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ var index$5 = require('../../../../node_modules/.pnpm/markdown-it-ins@4.0.0/node
10
10
  var index$6 = require('../../../../node_modules/.pnpm/markdown-it-mark@4.0.0/node_modules/markdown-it-mark/index.js');
11
11
  var index$7 = require('../../../../node_modules/.pnpm/markdown-it-sub@2.0.0/node_modules/markdown-it-sub/index.js');
12
12
  var index$8 = require('../../../../node_modules/.pnpm/markdown-it-sup@2.0.0/node_modules/markdown-it-sup/index.js');
13
- var purify_es = require('../../../../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js');
13
+ var purify_es = require('../../../../node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js');
14
14
  var hightIt = require('./hight-it.js');
15
15
  var index = require('../../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js');
16
16
  var full = require('../../../../node_modules/.pnpm/markdown-it-emoji@3.0.0/node_modules/markdown-it-emoji/lib/full.js');
@@ -32,6 +32,12 @@ const mdInstance = new index.default({
32
32
  mdInstance.renderer.rules.table_open = function() {
33
33
  return '<table class="table touchchat-table">\n';
34
34
  };
35
+ mdInstance.renderer.rules.link_open = function(tokens, idx, options, env, slf) {
36
+ const token = tokens[idx];
37
+ token.attrSet("target", "_blank");
38
+ token.attrSet("rel", "noopener noreferrer");
39
+ return slf.renderToken(tokens, idx, options, env, slf);
40
+ };
35
41
  mdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens, idx, options, env, slf) => {
36
42
  let line;
37
43
  if (tokens[idx].map && tokens[idx].level === 0) {
@@ -41,6 +47,14 @@ mdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_ope
41
47
  }
42
48
  return slf.renderToken(tokens, idx, options, env, slf);
43
49
  };
50
+ const addTargetBlank = (html) => {
51
+ return html.replace(/<a([^>]*)>/gi, (match, attrs) => {
52
+ if (!/target\s*=\s*["']/i.test(attrs)) {
53
+ return `<a${attrs} target="_blank" rel="noopener noreferrer">`;
54
+ }
55
+ return match;
56
+ });
57
+ };
44
58
  const markdown = {
45
59
  render: (content, options) => {
46
60
  if (!content)
@@ -49,13 +63,16 @@ const markdown = {
49
63
  if (options == null ? void 0 : options.isReasoning) {
50
64
  processedContent = processedContent.trim();
51
65
  }
52
- const html = mdInstance.render(processedContent);
66
+ let html = mdInstance.render(processedContent);
53
67
  const purify = getDOMPurify();
54
- const sanitizedHtml = purify ? purify.sanitize(html) : html;
68
+ if (purify) {
69
+ html = purify.sanitize(html);
70
+ }
71
+ html = addTargetBlank(html);
55
72
  if (options == null ? void 0 : options.isReasoning) {
56
- return sanitizedHtml;
73
+ return html;
57
74
  }
58
- return sanitizedHtml;
75
+ return html;
59
76
  }
60
77
  };
61
78
  console.log("markdown", markdown);
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sources":["../../../../../../packages/components/touchchat/utils/markdown.ts"],"sourcesContent":["import Markdown from 'markdown-it'\nimport mdAbbr from 'markdown-it-abbr'\nimport mdContainer from 'markdown-it-container'\nimport mdDeflist from 'markdown-it-deflist'\nimport { full as mdEmoji } from 'markdown-it-emoji'\nimport mdFootnote from 'markdown-it-footnote'\nimport mdIns from 'markdown-it-ins'\nimport mdMark from 'markdown-it-mark'\nimport mdSub from 'markdown-it-sub'\nimport mdSup from 'markdown-it-sup'\nimport DOMPurify from 'dompurify'\nimport highlightPlugin from './hight-it.ts'\n\n// 确保 DOMPurify 在浏览器环境中正确初始化\nconst getDOMPurify = () => {\n\tif (typeof window !== 'undefined') {\n\t\treturn DOMPurify\n\t}\n\treturn null\n}\n\ninterface RenderOptions {\n\tisReasoning?: boolean\n}\n\n// 创建原始 markdown-it 实例\nconst mdInstance = new Markdown({\n\thtml: true,\n\txhtmlOut: false,\n\tbreaks: true,\n\tlangPrefix: 'language-',\n\tlinkify: false,\n\ttypographer: true\n})\n\t.use(mdAbbr)\n\t.use(mdContainer, 'warning')\n\t.use(mdDeflist)\n\t.use(mdEmoji)\n\t.use(mdFootnote)\n\t.use(mdIns)\n\t.use(mdMark)\n\t.use(mdSub)\n\t.use(mdSup)\n\t.use(highlightPlugin)\n\n// 自定义渲染规则\nmdInstance.renderer.rules.table_open = function () {\n\treturn '<table class=\"table touchchat-table\">\\n'\n}\n\nmdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens: any[], idx: number, options: any, env: any, slf: any) => {\n\tlet line: number | undefined\n\tif (tokens[idx].map && tokens[idx].level === 0) {\n\t\tline = tokens[idx].map[0]\n\t\ttokens[idx].attrJoin('class', 'line')\n\t\ttokens[idx].attrSet('data-line', String(line))\n\t}\n\treturn slf.renderToken(tokens, idx, options, env, slf)\n}\n\n// 创建包装对象,支持带参数的 render 方法\nconst markdown = {\n\trender: (content: string, options?: RenderOptions): string => {\n\t\tif (!content) return ''\n\n\t\t// 根据 isReasoning 参数添加不同的 CSS 类\n\t\tlet processedContent = content\n\t\tif (options?.isReasoning) {\n\t\t\t// 对于推理内容,可以添加特定的标记或处理\n\t\t\t// 这里可以根据需要添加特殊的渲染逻辑\n\t\t\t// 例如,可以添加一个包装 div 来标识这是推理内容\n\t\t\tprocessedContent = processedContent.trim()\n\t\t}\n\n\t\tconst html = mdInstance.render(processedContent)\n\t\t\n\t\t// 安全地使用 DOMPurify\n\t\tconst purify = getDOMPurify()\n\t\tconst sanitizedHtml = purify ? purify.sanitize(html) : html\n\n\t\t// 如果是推理内容,可以添加额外的包装\n\t\tif (options?.isReasoning) {\n\t\t\t// 可以在这里添加特殊的 CSS 类或包装\n\t\t\t// 例如:return `<div class=\"reasoning-content\">${sanitizedHtml}</div>`\n\t\t\treturn sanitizedHtml\n\t\t}\n\n\t\treturn sanitizedHtml\n\t}\n}\n\nconsole.log('markdown', markdown)\n\nexport default markdown\n"],"names":["DOMPurify","Markdown","mdAbbr","mdContainer","mdDeflist","mdEmoji","mdFootnote","mdIns","mdMark","mdSub","mdSup","highlightPlugin"],"mappings":";;;;;;;;;;;;;;;;;AAcA,MAAM,eAAe,MAAM;AAC1B,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAClC,IAAO,OAAAA,iBAAA,CAAA;AAAA,GACR;AACA,EAAO,OAAA,IAAA,CAAA;AACR,CAAA,CAAA;AAOA,MAAM,UAAA,GAAa,IAAIC,aAAS,CAAA;AAAA,EAC/B,IAAM,EAAA,IAAA;AAAA,EACN,QAAU,EAAA,KAAA;AAAA,EACV,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,WAAA;AAAA,EACZ,OAAS,EAAA,KAAA;AAAA,EACT,WAAa,EAAA,IAAA;AACd,CAAC,CACC,CAAA,GAAA,CAAIC,eAAM,CAAA,CACV,GAAI,CAAAC,eAAA,EAAa,SAAS,CAAA,CAC1B,GAAI,CAAAC,eAAS,CACb,CAAA,GAAA,CAAIC,YAAO,CACX,CAAA,GAAA,CAAIC,eAAU,CAAA,CACd,GAAI,CAAAC,eAAK,CACT,CAAA,GAAA,CAAIC,eAAM,CAAA,CACV,GAAI,CAAAC,eAAK,CACT,CAAA,GAAA,CAAIC,eAAK,CAAA,CACT,IAAIC,eAAe,CAAA,CAAA;AAGrB,UAAW,CAAA,QAAA,CAAS,KAAM,CAAA,UAAA,GAAa,WAAY;AAClD,EAAO,OAAA,yCAAA,CAAA;AACR,CAAA,CAAA;AAEA,UAAA,CAAW,QAAS,CAAA,KAAA,CAAM,cAAiB,GAAA,UAAA,CAAW,QAAS,CAAA,KAAA,CAAM,YAAe,GAAA,CAAC,MAAe,EAAA,GAAA,EAAa,OAAc,EAAA,GAAA,EAAU,GAAa,KAAA;AACrJ,EAAI,IAAA,IAAA,CAAA;AACJ,EAAI,IAAA,MAAA,CAAO,GAAG,CAAE,CAAA,GAAA,IAAO,OAAO,GAAG,CAAA,CAAE,UAAU,CAAG,EAAA;AAC/C,IAAA,IAAA,GAAO,MAAO,CAAA,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA;AACxB,IAAA,MAAA,CAAO,GAAG,CAAA,CAAE,QAAS,CAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AACpC,IAAA,MAAA,CAAO,GAAG,CAAE,CAAA,OAAA,CAAQ,WAAa,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,GAC9C;AACA,EAAA,OAAO,IAAI,WAAY,CAAA,MAAA,EAAQ,GAAK,EAAA,OAAA,EAAS,KAAK,GAAG,CAAA,CAAA;AACtD,CAAA,CAAA;AAGA,MAAM,QAAW,GAAA;AAAA,EAChB,MAAA,EAAQ,CAAC,OAAA,EAAiB,OAAoC,KAAA;AAC7D,IAAA,IAAI,CAAC,OAAA;AAAS,MAAO,OAAA,EAAA,CAAA;AAGrB,IAAA,IAAI,gBAAmB,GAAA,OAAA,CAAA;AACvB,IAAA,IAAI,mCAAS,WAAa,EAAA;AAIzB,MAAA,gBAAA,GAAmB,iBAAiB,IAAK,EAAA,CAAA;AAAA,KAC1C;AAEA,IAAM,MAAA,IAAA,GAAO,UAAW,CAAA,MAAA,CAAO,gBAAgB,CAAA,CAAA;AAG/C,IAAA,MAAM,SAAS,YAAa,EAAA,CAAA;AAC5B,IAAA,MAAM,aAAgB,GAAA,MAAA,GAAS,MAAO,CAAA,QAAA,CAAS,IAAI,CAAI,GAAA,IAAA,CAAA;AAGvD,IAAA,IAAI,mCAAS,WAAa,EAAA;AAGzB,MAAO,OAAA,aAAA,CAAA;AAAA,KACR;AAEA,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACD,EAAA;AAEA,OAAQ,CAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;;;;"}
1
+ {"version":3,"file":"markdown.js","sources":["../../../../../../packages/components/touchchat/utils/markdown.ts"],"sourcesContent":["import Markdown from 'markdown-it'\nimport mdAbbr from 'markdown-it-abbr'\nimport mdContainer from 'markdown-it-container'\nimport mdDeflist from 'markdown-it-deflist'\nimport { full as mdEmoji } from 'markdown-it-emoji'\nimport mdFootnote from 'markdown-it-footnote'\nimport mdIns from 'markdown-it-ins'\nimport mdMark from 'markdown-it-mark'\nimport mdSub from 'markdown-it-sub'\nimport mdSup from 'markdown-it-sup'\nimport DOMPurify from 'dompurify'\nimport highlightPlugin from './hight-it.ts'\n\n// 确保 DOMPurify 在浏览器环境中正确初始化\nconst getDOMPurify = () => {\n\tif (typeof window !== 'undefined') {\n\t\treturn DOMPurify\n\t}\n\treturn null\n}\n\ninterface RenderOptions {\n\tisReasoning?: boolean\n}\n\n// 创建原始 markdown-it 实例\nconst mdInstance = new Markdown({\n\thtml: true,\n\txhtmlOut: false,\n\tbreaks: true,\n\tlangPrefix: 'language-',\n\tlinkify: false,\n\ttypographer: true\n})\n\t.use(mdAbbr)\n\t.use(mdContainer, 'warning')\n\t.use(mdDeflist)\n\t.use(mdEmoji)\n\t.use(mdFootnote)\n\t.use(mdIns)\n\t.use(mdMark)\n\t.use(mdSub)\n\t.use(mdSup)\n\t.use(highlightPlugin)\n\n// 自定义渲染规则\nmdInstance.renderer.rules.table_open = function () {\n\treturn '<table class=\"table touchchat-table\">\\n'\n}\n\n// 自定义链接渲染规则,添加 target=\"_blank\" 在新窗口打开\nmdInstance.renderer.rules.link_open = function (tokens: any[], idx: number, options: any, env: any, slf: any) {\n\tconst token = tokens[idx]\n\t// 添加 target=\"_blank\" 属性\n\ttoken.attrSet('target', '_blank')\n\t// 添加 rel=\"noopener noreferrer\" 安全属性\n\ttoken.attrSet('rel', 'noopener noreferrer')\n\treturn slf.renderToken(tokens, idx, options, env, slf)\n}\n\nmdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens: any[], idx: number, options: any, env: any, slf: any) => {\n\tlet line: number | undefined\n\tif (tokens[idx].map && tokens[idx].level === 0) {\n\t\tline = tokens[idx].map[0]\n\t\ttokens[idx].attrJoin('class', 'line')\n\t\ttokens[idx].attrSet('data-line', String(line))\n\t}\n\treturn slf.renderToken(tokens, idx, options, env, slf)\n}\n\n// 为所有 <a> 标签添加 target=\"_blank\" 属性\nconst addTargetBlank = (html: string): string => {\n\t// 匹配 <a> 标签,确保没有已存在的 target 属性\n\treturn html.replace(/<a([^>]*)>/gi, (match, attrs) => {\n\t\t// 检查是否已有 target 属性\n\t\tif (!/target\\s*=\\s*[\"']/i.test(attrs)) {\n\t\t\treturn `<a${attrs} target=\"_blank\" rel=\"noopener noreferrer\">`\n\t\t}\n\t\treturn match\n\t})\n}\n\n// 创建包装对象,支持带参数的 render 方法\nconst markdown = {\n\trender: (content: string, options?: RenderOptions): string => {\n\t\tif (!content) return ''\n\n\t\t// 根据 isReasoning 参数添加不同的 CSS 类\n\t\tlet processedContent = content\n\t\tif (options?.isReasoning) {\n\t\t\t// 对于推理内容,可以添加特定的标记或处理\n\t\t\t// 这里可以根据需要添加特殊的渲染逻辑\n\t\t\t// 例如,可以添加一个包装 div 来标识这是推理内容\n\t\t\tprocessedContent = processedContent.trim()\n\t\t}\n\n\t\tlet html = mdInstance.render(processedContent)\n\n\t\t// 安全地使用 DOMPurify\n\t\tconst purify = getDOMPurify()\n\t\tif (purify) {\n\t\t\thtml = purify.sanitize(html)\n\t\t}\n\n\t\t// sanitize 之后,手动为所有 <a> 标签添加 target=\"_blank\"\n\t\thtml = addTargetBlank(html)\n\n\t\t// 如果是推理内容,可以添加额外的包装\n\t\tif (options?.isReasoning) {\n\t\t\t// 可以在这里添加特殊的 CSS 类或包装\n\t\t\t// 例如:return `<div class=\"reasoning-content\">${sanitizedHtml}</div>`\n\t\t\treturn html\n\t\t}\n\n\t\treturn html\n\t}\n}\n\nconsole.log('markdown', markdown)\n\nexport default markdown\n"],"names":["DOMPurify","Markdown","mdAbbr","mdContainer","mdDeflist","mdEmoji","mdFootnote","mdIns","mdMark","mdSub","mdSup","highlightPlugin"],"mappings":"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"}
@@ -46,16 +46,16 @@ function showToast(message, type = "info", duration = 2e3) {
46
46
  transition: opacity 0.3s ease;
47
47
  }
48
48
  .touch-toast-success {
49
- background-color: rgba(52, 199, 89, 0.9);
49
+ background-color: rgba(103, 194, 58, 0.95);
50
50
  }
51
51
  .touch-toast-error {
52
- background-color: rgba(235, 87, 87, 0.9);
52
+ background-color: rgba(245, 108, 108, 0.95);
53
53
  }
54
54
  .touch-toast-warning {
55
- background-color: rgba(250, 204, 21, 0.9);
55
+ background-color: rgba(230, 162, 60, 0.95);
56
56
  }
57
57
  .touch-toast-info {
58
- background-color: rgba(0, 0, 0, 0.9);
58
+ background-color: rgba(144, 147, 153, 0.95);
59
59
  }
60
60
  .touch-toast-fadeout {
61
61
  opacity: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sources":["../../../../../../packages/components/touchchat/utils/tools.ts"],"sourcesContent":["/**\n * 生成唯一聊天ID\n * @returns 唯一ID字符串\n */\nexport function generateChatId(): string {\n const timestamp = Date.now().toString(36);\n const randomStr = Math.random().toString(36).substring(2, 10);\n return `${timestamp}${randomStr}`;\n}\n\n/**\n * 格式化日期\n * @param date 日期对象或时间戳\n * @param format 日期格式字符串,默认为'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(date: Date | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {\n if (typeof date === 'number') {\n date = new Date(date);\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', year.toString())\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * 节流函数\n * @param func 需要节流的函数\n * @param wait 等待时间(毫秒)\n * @returns 节流后的函数\n */\n// 定义一个通用的函数类型\ntype AnyFunction = (...args: any[]) => any;\n\nexport function throttle(func: AnyFunction, wait: number): AnyFunction {\n let lastTime = 0;\n return function (this: any, ...args: any[]) {\n const now = Date.now();\n if (now - lastTime >= wait) {\n lastTime = now;\n return func.apply(this, args);\n }\n };\n}\n\n/**\n * 显示提示框\n * @param message 提示消息\n * @param type 提示类型,可选值:'success', 'error', 'warning', 'info'\n * @param duration 提示框显示时间(毫秒),默认为2000\n */\nexport function showToast(\n message: string,\n type: 'success' | 'error' | 'warning' | 'info' = 'info',\n duration: number = 2000\n): void {\n // 创建toast元素\n const toast = document.createElement('div');\n toast.className = `touch-toast touch-toast-${type}`;\n toast.textContent = message;\n\n // 添加样式\n const style = document.createElement('style');\n style.textContent = `\n .touch-toast {\n position: fixed;\n top: 4%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0.75em 1.25em;\n border-radius: 0.5em;\n color: #fff;\n font-size: 0.875em;\n z-index: 9999;\n transition: opacity 0.3s ease;\n }\n .touch-toast-success {\n background-color: rgba(52, 199, 89, 0.9);\n }\n .touch-toast-error {\n background-color: rgba(235, 87, 87, 0.9);\n }\n .touch-toast-warning {\n background-color: rgba(250, 204, 21, 0.9);\n }\n .touch-toast-info {\n background-color: rgba(0, 0, 0, 0.9);\n }\n .touch-toast-fadeout {\n opacity: 0;\n }\n `;\n document.head.appendChild(style);\n\n // 添加到文档\n document.body.appendChild(toast);\n\n // 设置自动移除\n setTimeout(() => {\n toast.classList.add('touch-toast-fadeout');\n setTimeout(() => {\n document.body.removeChild(toast);\n document.head.removeChild(style);\n }, 300);\n }, duration);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sources":["../../../../../../packages/components/touchchat/utils/tools.ts"],"sourcesContent":["/**\n * 生成唯一聊天ID\n * @returns 唯一ID字符串\n */\nexport function generateChatId(): string {\n\tconst timestamp = Date.now().toString(36)\n\tconst randomStr = Math.random().toString(36).substring(2, 10)\n\treturn `${timestamp}${randomStr}`\n}\n\n/**\n * 格式化日期\n * @param date 日期对象或时间戳\n * @param format 日期格式字符串,默认为'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(date: Date | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {\n\tif (typeof date === 'number') {\n\t\tdate = new Date(date)\n\t}\n\n\tconst year = date.getFullYear()\n\tconst month = String(date.getMonth() + 1).padStart(2, '0')\n\tconst day = String(date.getDate()).padStart(2, '0')\n\tconst hours = String(date.getHours()).padStart(2, '0')\n\tconst minutes = String(date.getMinutes()).padStart(2, '0')\n\tconst seconds = String(date.getSeconds()).padStart(2, '0')\n\n\treturn format.replace('YYYY', year.toString()).replace('MM', month).replace('DD', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds)\n}\n\n/**\n * 节流函数\n * @param func 需要节流的函数\n * @param wait 等待时间(毫秒)\n * @returns 节流后的函数\n */\n// 定义一个通用的函数类型\ntype AnyFunction = (...args: any[]) => any\n\nexport function throttle(func: AnyFunction, wait: number): AnyFunction {\n\tlet lastTime = 0\n\treturn function (this: any, ...args: any[]) {\n\t\tconst now = Date.now()\n\t\tif (now - lastTime >= wait) {\n\t\t\tlastTime = now\n\t\t\treturn func.apply(this, args)\n\t\t}\n\t}\n}\n\n/**\n * 显示提示框\n * @param message 提示消息\n * @param type 提示类型,可选值:'success', 'error', 'warning', 'info'\n * @param duration 提示框显示时间(毫秒),默认为2000\n */\nexport function showToast(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info', duration: number = 2000): void {\n\t// 创建toast元素\n\tconst toast = document.createElement('div')\n\ttoast.className = `touch-toast touch-toast-${type}`\n\ttoast.textContent = message\n\n\t// 添加样式\n\tconst style = document.createElement('style')\n\tstyle.textContent = `\n .touch-toast {\n position: fixed;\n top: 4%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0.75em 1.25em;\n border-radius: 0.5em;\n color: #fff;\n font-size: 0.875em;\n z-index: 9999;\n transition: opacity 0.3s ease;\n }\n .touch-toast-success {\n background-color: rgba(103, 194, 58, 0.95);\n }\n .touch-toast-error {\n background-color: rgba(245, 108, 108, 0.95);\n }\n .touch-toast-warning {\n background-color: rgba(230, 162, 60, 0.95);\n }\n .touch-toast-info {\n background-color: rgba(144, 147, 153, 0.95);\n }\n .touch-toast-fadeout {\n opacity: 0;\n }\n `\n\tdocument.head.appendChild(style)\n\n\t// 添加到文档\n\tdocument.body.appendChild(toast)\n\n\t// 设置自动移除\n\tsetTimeout(() => {\n\t\ttoast.classList.add('touch-toast-fadeout')\n\t\tsetTimeout(() => {\n\t\t\tdocument.body.removeChild(toast)\n\t\t\tdocument.head.removeChild(style)\n\t\t}, 300)\n\t}, duration)\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@touchvue/chat",
3
- "version": "1.0.0-beta.54",
3
+ "version": "1.0.0-beta.56",
4
4
  "description": "TouchVue Chat Component Library",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.mjs",