@touchvue/chat 1.0.0-beta.45 → 1.0.0-beta.46
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.
- package/README.md +70 -70
- package/es/package.json.css +1 -1
- package/es/package.json.mjs +1 -1
- package/es/packages/components/resolver.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +35 -26
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +5 -5
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +21 -19
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +5 -3
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
- package/lib/package.json.css +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/resolver.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
- package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
- package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +35 -26
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -5
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +20 -18
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +5 -3
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
- package/package.json +83 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2aService.mjs","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\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(6)\n\t\t\t\t\t\t\t\tif (data === '[DONE]') {\n\t\t\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\n\t\t\t\t\t\t\t\t\t// Add a small delay to simulate streaming effect\n\t\t\t\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50))\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\n\t\t\t\t\t\t\t\t}\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.mjs","sources":["../../../../../../packages/components/touchchat/utils/a2aService.ts"],"sourcesContent":["import type { AgentConfig, Message, JSONRPCRequest, StreamChunk, Task, AgentCard, SubAgent } from '../src/types/a2a'\r\n// @/types/a2a\r\n\r\n// A2A Service - Handles communication with A2A agents\r\nexport class A2AService {\r\n\tprivate agents: Map<string, AgentConfig> = new Map()\r\n\r\n\t// Register an agent\r\n\tregisterAgent(config: AgentConfig): void {\r\n\t\tthis.agents.set(config.id, config)\r\n\t}\r\n\r\n\t// Unregister an agent\r\n\tunregisterAgent(agentId: string): void {\r\n\t\tthis.agents.delete(agentId)\r\n\t}\r\n\r\n\t// Get registered agent\r\n\tgetAgent(agentId: string): AgentConfig | undefined {\r\n\t\treturn this.agents.get(agentId)\r\n\t}\r\n\r\n\t// Get all registered agents\r\n\tgetAllAgents(): AgentConfig[] {\r\n\t\treturn Array.from(this.agents.values())\r\n\t}\r\n\r\n\t// Fetch agent card (agent discovery)\r\n\tasync fetchAgentCard(url: string): Promise<AgentCard> {\r\n\t\tconst response = await fetch(url, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\theaders: {\r\n\t\t\t\tAccept: 'application/json'\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`Failed to fetch agent card: ${response.statusText}`)\r\n\t\t}\r\n\r\n\t\treturn response.json()\r\n\t}\r\n\r\n\t// Send message to agent (non-streaming)\r\n\tasync sendMessage(agentId: string, message: Message, sessionId?: string): Promise<Task> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'message/send',\r\n\t\t\tparams: {\r\n\t\t\t\tmessage,\r\n\t\t\t\tsessionId\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\r\n\t\treturn data.result as Task\r\n\t}\r\n\r\n\t// Stream message to agent (for streaming responses)\r\n\tasync streamMessage(agentId: string, message: Message, sessionId?: string, signal?: AbortSignal): Promise<ReadableStream<StreamChunk>> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'message/stream',\r\n\t\t\tparams: {\r\n\t\t\t\tmessage,\r\n\t\t\t\tsessionId\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\tAccept: 'text/event-stream',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request),\r\n\t\t\tsignal\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tif (!response.body) {\r\n\t\t\tthrow new Error('No response body')\r\n\t\t}\r\n\r\n\t\treturn new ReadableStream<StreamChunk>({\r\n\t\t\tasync start(controller) {\r\n\t\t\t\tconst reader = response.body!.getReader()\r\n\t\t\t\tconst decoder = new TextDecoder()\r\n\t\t\t\tlet buffer = ''\r\n\r\n\t\t\t\t// Handle abort signal\r\n\t\t\t\tif (signal) {\r\n\t\t\t\t\tsignal.addEventListener('abort', () => {\r\n\t\t\t\t\t\tcontroller.close()\r\n\t\t\t\t\t\treader.cancel()\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tlet isDone = false\r\n\t\t\t\t\twhile (!isDone) {\r\n\t\t\t\t\t\t// Check if the signal has been aborted\r\n\t\t\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\t\t\tcontroller.close()\r\n\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst { done, value } = await reader.read()\r\n\t\t\t\t\t\tif (done) {\r\n\t\t\t\t\t\t\tisDone = true\r\n\t\t\t\t\t\t\tcontroller.close()\r\n\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\r\n\t\t\t\t\t\tconst lines = buffer.split('\\n')\r\n\t\t\t\t\t\tbuffer = lines.pop() || ''\r\n\r\n\t\t\t\t\t\tfor (const line of lines) {\r\n\t\t\t\t\t\t\tconst trimmed = line.trim()\r\n\t\t\t\t\t\t\tif (trimmed.startsWith('data: ')) {\r\n\t\t\t\t\t\t\t\tconst data = trimmed.slice(6)\r\n\t\t\t\t\t\t\t\tif (data === '[DONE]') {\r\n\t\t\t\t\t\t\t\t\tcontroller.close()\r\n\t\t\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\r\n\t\t\t\t\t\t\t\t\t// Add a small delay to simulate streaming effect\r\n\t\t\t\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50))\r\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(chunk)\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\r\n\t\t\t\t\t\t\t\t}\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} finally {\r\n\t\t\t\t\treader.releaseLock()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// Multi-agent message routing\r\n\tasync routeMessage(agentIds: string[], message: Message, mode: 'sequential' | 'parallel' = 'sequential'): Promise<Map<string, Task>> {\r\n\t\tconst results = new Map<string, Task>()\r\n\r\n\t\tif (mode === 'parallel') {\r\n\t\t\tconst promises = agentIds.map(async agentId => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\r\n\t\t\t\t\treturn { agentId, task, error: null }\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\treturn { agentId, task: null, error }\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tconst settled = await Promise.all(promises)\r\n\t\t\tfor (const { agentId, task, error } of settled) {\r\n\t\t\t\tif (task) {\r\n\t\t\t\t\tresults.set(agentId, task)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Sequential\r\n\t\t\tfor (const agentId of agentIds) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\r\n\t\t\t\t\tresults.set(agentId, task)\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn results\r\n\t}\r\n\r\n\t// Get task status\r\n\tasync getTask(agentId: string, taskId: string): Promise<Task> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'task/get',\r\n\t\t\tparams: { taskId }\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\r\n\t\treturn data.result as Task\r\n\t}\r\n\r\n\t// Cancel task\r\n\tasync cancelTask(agentId: string, taskId: string): Promise<void> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'task/cancel',\r\n\t\t\tparams: { taskId }\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\t}\r\n\r\n\t// Generate unique ID\r\n\tprivate generateId(): string {\r\n\t\treturn `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\r\n\t}\r\n\r\n\t// Multi-agent streaming message\r\n\tasync *streamMultiAgentMessage(hostEndpoint: string, subAgents: SubAgent[], message: Message, headers: object, sessionId?: string, signal?: AbortSignal): AsyncGenerator<StreamChunk, void, unknown> {\r\n\t\t// Build X-Sub-Agents headers: JSON array -> Base64\r\n\t\tconst subAgentsJson = JSON.stringify(subAgents)\r\n\t\t// Use Unicode-safe Base64 encoding\r\n\t\tconst xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)))\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'message/stream',\r\n\t\t\tparams: {\r\n\t\t\t\tmessage,\r\n\t\t\t\tsessionId\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(hostEndpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\tAccept: 'text/event-stream',\r\n\t\t\t\t'X-Sub-Agents': xSubAgents,\r\n\t\t\t\t// 'ai-jwt-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhc2lhaW5mby5jb20iLCJzdWIiOiJkZW5nd2FuIiwiYXVkIjoiY29tLmFpZi5wYWFzLndlYlRva2VuIiwidXNlckluZm8iOiJ7XCJhbGlhc1wiOlwiZGVuZ3dhblwiLFwiYXV0b2luXCI6ZmFsc2UsXCJlbnZDb2RlXCI6XCJQUk9EXCIsXCJlbnZOYW1lXCI6XCLnlJ_kuqfnjq_looNcIixcImxhbmd1YWdlXCI6XCJ6aFwiLFwicGVybWlzc2lvbnNcIjpbXCJcIixcInBvcnRhbDpzeXN0ZW06cm9sZTpiaW5kXCIsXCJwb3J0YWw6ZGljdGlvbmFyeTpkYXRhOmFkZFwiLG51bGwsXCJhZ2VudFwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTp1cGRhdGVcIixcImF1ZGl0TG9nL2xpc3RBdWRpdExvZ1wiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW06dXNlcjp1cGRhdGVcIixcInBvcnRhbDptY3A6YXVkaXRcIixcInBvcnRhbDptY3A6c2FmZWF1ZGl0XCIsXCJwb3J0YWw6bWNwOnRvb2xjb25maXJtXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDphZGRcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnJlbGF0aW9uXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpwZXJtaXNzaW9uXCIsXCJwb3J0YWw6c3lzdGVtUGFyYW1ldGVyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6dXBkYXRlXCIsXCJwb3J0YWw6c3lzdGVtOnJvbGU6YWRkXCIsXCJ0ZW5hbnQvZ2V0VGVuYW50RHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOnVwZGF0ZVwiLFwicG9ydGFsOmFnZW50OmF1ZGl0XCIsXCJwb3J0YWw6bm90aWNlOnVwZGF0ZVwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOmRlbGV0ZVwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmFkZFwiLFwibWVudS9nZXRNZW51QnlQYXJhbVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGVsZXRlXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpkZWxldGVcIixcInVzZXIvcXVlcnlVc2VyRHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTptZW51OmFkZFwiLFwicG9ydGFsOnN5c3RlbVBhcmFtZXRlcjp1cGRhdGVcIixcInBvcnRhbDphZ2VudDptb2RlbGNoZWNrXCIsXCJwb3J0YWw6c3lzdGVtOm1lbnU6dXBkYXRlXCIsXCJyb2xlL3F1ZXJ5Um9sZUxpc3RcIixcInBvcnRhbDpzeXN0ZW06bWVudTpkZWxldGVcIixcInBvcnRhbDpub3RpY2U6YWRkXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW1QYXJhbWV0ZXI6YWRkXCIsXCJyb2xlUGVybWlzc2lvbnMvcXVlcnlNZW51UGVybWlzc2lvbkxpc3RcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnVwZGF0ZVwiLFwibm90aWNlL2xpc3ROb3RpY2VcIl0sXCJwbGF0Zm9ybU1hbmFnZXJcIjp0cnVlLFwicm9sZUxpc3RcIjpbe1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwiY2FwX3Byb3ZpZGVyXCIsXCJyb2xlSWRcIjoxMixcInJvbGVOYW1lXCI6XCLog73lipvmj5DkvpvogIVcIixcInJvbGVUeXBlXCI6MX0se1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwidGVuYW50X2FkbWluXCIsXCJyb2xlSWRcIjo4LFwicm9sZU5hbWVcIjpcIuenn-aIt-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfSx7XCJjcmVhdGVUaW1lXCI6XCIyMDIyLTA2LTI4IDAwOjAwOjAwXCIsXCJoYXNFZGl0XCI6MSxcInJvbGVDb2RlXCI6XCJyb2xlX2FkbWluXCIsXCJyb2xlSWRcIjoxLFwicm9sZU5hbWVcIjpcIui2hee6p-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfV0sXCJ0ZW5hbnRDb2RlXCI6XCJ0ZW5hbnQtb25lXCIsXCJ0ZW5hbnRJZFwiOjUsXCJ0ZW5hbnROYW1lXCI6XCLkuIDnuqfov5DokKXnqbrpl7RcIixcInVzZXJJZFwiOjYsXCJ1c2VyTmFtZVwiOlwiZGVuZ3dhblwifSIsImV4cCI6MTc3Mzk5ODEzN30.7P8WVl3ji1G2unk0wOISJbF43ilcuzksOdSOQJNHGXM'\r\n\t\t\t\t// 'ai-jwt-token': authToken\r\n\t\t\t\t...headers\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request),\r\n\t\t\tsignal\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tif (!response.body) {\r\n\t\t\tthrow new Error('No response body')\r\n\t\t}\r\n\r\n\t\tconst reader = response.body.getReader()\r\n\t\tconst decoder = new TextDecoder()\r\n\t\tlet buffer = ''\r\n\r\n\t\ttry {\r\n\t\t\twhile (true) {\r\n\t\t\t\t// Check if the signal has been aborted\r\n\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst { done, value } = await reader.read()\r\n\t\t\t\tif (done) break\r\n\r\n\t\t\t\tbuffer += decoder.decode(value, { stream: true })\r\n\t\t\t\tconst lines = buffer.split('\\n')\r\n\t\t\t\tbuffer = lines.pop() || ''\r\n\r\n\t\t\t\tfor (const line of lines) {\r\n\t\t\t\t\tconst trimmed = line.trim()\r\n\t\t\t\t\tif (trimmed.startsWith('data: ')) {\r\n\t\t\t\t\t\tconst data = trimmed.slice(6)\r\n\t\t\t\t\t\tif (data === '[DONE]') return\r\n\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\r\n\t\t\t\t\t\t\tyield chunk\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\treader.releaseLock()\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Singleton instance\r\nexport const a2aService = new A2AService()\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchStream.mjs","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":"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"}
|
|
1
|
+
{"version":3,"file":"fetchStream.mjs","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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"}
|
package/lib/package.json.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.typewriter-container[data-v-
|
|
1
|
+
.typewriter-container[data-v-6fd1b883]{position:relative}.loading-container[data-v-6fd1b883]{min-height:40px}.typewriter-loading[data-v-6fd1b883]{align-items:center;color:#666;display:flex;font-size:14px;gap:8px;line-height:1;margin-top:12px;padding:8px 0}.loading-dot[data-v-6fd1b883]{animation:bounce-6fd1b883 1.4s ease-in-out infinite both;background-color:#666;border-radius:50%;display:inline-block;height:8px;width:8px}.loading-text[data-v-6fd1b883]{user-select:none}@keyframes bounce-6fd1b883{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.markdown-content[data-v-6fd1b883]{color:#333}.markdown-content h1[data-v-6fd1b883],.markdown-content h2[data-v-6fd1b883]{margin:1em 0 .5em}.markdown-content p[data-v-6fd1b883]{margin:.5em 0}.markdown-content code[data-v-6fd1b883]{background:#f0f0f0;border-radius:4px;padding:.2em .4em}.hljs{background:#fafafa;color:#383a42;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-built_in,.hljs-class .hljs-title{color:#c18401}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}
|
package/lib/package.json.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@touchvue/chat";
|
|
6
|
-
var version = "1.0.0-beta.
|
|
6
|
+
var version = "1.0.0-beta.46";
|
|
7
7
|
var description = "TouchVue Chat Component Library";
|
|
8
8
|
var main = "lib/index.js";
|
|
9
9
|
var module$1 = "es/index.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sources":["../../../../packages/components/resolver.ts"],"sourcesContent":["/**\n * TouchVue Chat 组件解析器\n * 用于支持 unplugin-auto-import 和 unplugin-vue-components 插件\n */\n\n// 组件库名称\nconst LIBRARY_NAME = '@touchvue/chat'\n// 组件前缀\nconst PREFIX = 'To'\n\n/**\n * 检查组件名称是否符合规则\n * @param name 组件名称\n * @returns 是否符合规则\n */\nconst isValidComponentName = (name: string): boolean => {\n\treturn name.startsWith(PREFIX)\n}\n\n/**\n * 获取组件名称(不带前缀)\n * @param name 组件名称\n * @returns 不带前缀的组件名称\n */\nconst getComponentName = (name: string): string => {\n\treturn name.slice(PREFIX.length)\n}\n\nconst getSideEffectsPath = (name: string, prefix: string = LIBRARY_NAME): string => {\n\treturn `${prefix}/theme/components/${getComponentName(name).toLowerCase()}/index.css`\n}\n\n/**\n * 组件解析器\n * 用于 unplugin-vue-components 插件\n */\nexport function TouchVueResolver() {\n\treturn {\n\t\ttype: 'component',\n\t\tresolve: (name: string) => {\n\t\t\tif (!isValidComponentName(name)) return\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tfrom: LIBRARY_NAME,\n\t\t\t\tsideEffects: getSideEffectsPath(name)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * 默认导出所有解析器\n */\nexport default {\n\tTouchVueResolver\n}\n"],"names":[],"mappings":";;;;AAMA,MAAM,YAAe,GAAA,gBAAA,CAAA;AAErB,MAAM,MAAS,GAAA,IAAA,CAAA;AAOf,MAAM,oBAAA,GAAuB,CAAC,IAA0B,KAAA;AACvD,EAAO,OAAA,IAAA,CAAK,WAAW,MAAM,CAAA,CAAA;AAC9B,CAAA,CAAA;AAOA,MAAM,gBAAA,GAAmB,CAAC,IAAyB,KAAA;AAClD,EAAO,OAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAChC,CAAA,CAAA;AAEA,MAAM,kBAAqB,GAAA,CAAC,IAAc,EAAA,MAAA,GAAiB,YAAyB,KAAA;AACnF,EAAA,OAAO,CAAG,EAAA,MAAA,CAAA,kBAAA,EAA2B,gBAAiB,CAAA,IAAI,EAAE,WAAY,EAAA,CAAA,UAAA,CAAA,CAAA;AACzE,CAAA,CAAA;AAMO,SAAS,gBAAmB,GAAA;AAClC,EAAO,OAAA;AAAA,IACN,IAAM,EAAA,WAAA;AAAA,IACN,OAAA,EAAS,CAAC,IAAiB,KAAA;AAC1B,MAAI,IAAA,CAAC,qBAAqB,IAAI,CAAA;AAAG,QAAA,OAAA;AACjC,MAAO,OAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAM,EAAA,YAAA;AAAA,QACN,WAAA,EAAa,mBAAmB,IAAI,CAAA;AAAA,OACrC,CAAA;AAAA,KACD;AAAA,GACD,CAAA;AACD,CAAA;AAKA,eAAe;AAAA,EACd,gBAAA;AACD,CAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"resolver.js","sources":["../../../../packages/components/resolver.ts"],"sourcesContent":["/**\r\n * TouchVue Chat 组件解析器\r\n * 用于支持 unplugin-auto-import 和 unplugin-vue-components 插件\r\n */\r\n\r\n// 组件库名称\r\nconst LIBRARY_NAME = '@touchvue/chat'\r\n// 组件前缀\r\nconst PREFIX = 'To'\r\n\r\n/**\r\n * 检查组件名称是否符合规则\r\n * @param name 组件名称\r\n * @returns 是否符合规则\r\n */\r\nconst isValidComponentName = (name: string): boolean => {\r\n\treturn name.startsWith(PREFIX)\r\n}\r\n\r\n/**\r\n * 获取组件名称(不带前缀)\r\n * @param name 组件名称\r\n * @returns 不带前缀的组件名称\r\n */\r\nconst getComponentName = (name: string): string => {\r\n\treturn name.slice(PREFIX.length)\r\n}\r\n\r\nconst getSideEffectsPath = (name: string, prefix: string = LIBRARY_NAME): string => {\r\n\treturn `${prefix}/theme/components/${getComponentName(name).toLowerCase()}/index.css`\r\n}\r\n\r\n/**\r\n * 组件解析器\r\n * 用于 unplugin-vue-components 插件\r\n */\r\nexport function TouchVueResolver() {\r\n\treturn {\r\n\t\ttype: 'component',\r\n\t\tresolve: (name: string) => {\r\n\t\t\tif (!isValidComponentName(name)) return\r\n\t\t\treturn {\r\n\t\t\t\tname,\r\n\t\t\t\tfrom: LIBRARY_NAME,\r\n\t\t\t\tsideEffects: getSideEffectsPath(name)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * 默认导出所有解析器\r\n */\r\nexport default {\r\n\tTouchVueResolver\r\n}\r\n"],"names":[],"mappings":";;;;AAMA,MAAM,YAAe,GAAA,gBAAA,CAAA;AAErB,MAAM,MAAS,GAAA,IAAA,CAAA;AAOf,MAAM,oBAAA,GAAuB,CAAC,IAA0B,KAAA;AACvD,EAAO,OAAA,IAAA,CAAK,WAAW,MAAM,CAAA,CAAA;AAC9B,CAAA,CAAA;AAOA,MAAM,gBAAA,GAAmB,CAAC,IAAyB,KAAA;AAClD,EAAO,OAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAChC,CAAA,CAAA;AAEA,MAAM,kBAAqB,GAAA,CAAC,IAAc,EAAA,MAAA,GAAiB,YAAyB,KAAA;AACnF,EAAA,OAAO,CAAG,EAAA,MAAA,CAAA,kBAAA,EAA2B,gBAAiB,CAAA,IAAI,EAAE,WAAY,EAAA,CAAA,UAAA,CAAA,CAAA;AACzE,CAAA,CAAA;AAMO,SAAS,gBAAmB,GAAA;AAClC,EAAO,OAAA;AAAA,IACN,IAAM,EAAA,WAAA;AAAA,IACN,OAAA,EAAS,CAAC,IAAiB,KAAA;AAC1B,MAAI,IAAA,CAAC,qBAAqB,IAAI,CAAA;AAAG,QAAA,OAAA;AACjC,MAAO,OAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAM,EAAA,YAAA;AAAA,QACN,WAAA,EAAa,mBAAmB,IAAI,CAAA;AAAA,OACrC,CAAA;AAAA,KACD;AAAA,GACD,CAAA;AACD,CAAA;AAKA,eAAe;AAAA,EACd,gBAAA;AACD,CAAA;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HelloChat.vue2.js","sources":["../../../../../../../packages/components/touchchat/component/AiRobot/HelloChat.vue"],"sourcesContent":["<script lang=\"ts\">\nconst itemsPerPage = 5\n\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'HelloChat' });</script>\n<template>\n\t<div class=\"hello-chat\">\n\t\t<img src=\"../../img/aiAvatar.png\" alt=\"\" />\n\t\t<p class=\"title\">您好,我能帮您处理什么</p>\n\t\t<p class=\"sub-info\">作为您的智能伙伴,我既能帮您查账单、办业务,又能陪您聊天、学知识。</p>\n\t</div>\n\t<div class=\"function-buttons\">\n\t\t<ul>\n\t\t\t<li v-for=\"item in helloChatList\" :key=\"item.id\" @click=\"handleItemClick(item, '0')\">\n\t\t\t\t<img src=\"../../img/icon.png\" alt=\"{{ item.name }}\" class=\"icon\" />\n\t\t\t\t<span class=\"ellipsis-text\">{{ item.name }}</span>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n\t<div class=\"option-conter\">\n\t\t<div v-if=\"optionList.length > 0\" class=\"option-item item-1\">\n\t\t\t<div class=\"item-top\">\n\t\t\t\t<div class=\"item-1-left\">\n\t\t\t\t\t<p>猜你想所问</p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"item-1-right\" @click=\"handleChange\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\">\n\t\t\t\t\t\t<path d=\"M10.5 2.40796V6.40796\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t<path d=\"M1.5 6.40747V10.4075\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t<path d=\"M10.5 6.40747C10.5 3.9222 8.48528 1.90747 6 1.90747C4.72863 1.90747 3.5804 2.43471 2.76203 3.28247M1.5 6.40747C1.5 8.89275 3.51472 10.9075 6 10.9075C7.2139 10.9075 8.31555 10.4268 9.125 9.64545\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<span>换一换</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"item-bottom\">\n\t\t\t\t<ul>\n\t\t\t\t\t<li v-for=\"item in optionList\" :key=\"item.id\" @click=\"handleItemClick(item, '1')\">\n\t\t\t\t\t\t<span>{{ item.name }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"optionTeam.length\" class=\"option-item item-2\">\n\t\t\t<ul>\n\t\t\t\t<li v-for=\"item in optionTeam\" :key=\"item.id\" @click=\"handleItemClick(item, '2')\">\n\t\t\t\t\t<p class=\"title\">{{ item.name }}</p>\n\t\t\t\t\t<p class=\"team\">\n\t\t\t\t\t\t<span class=\"content\">{{ item.subTitle }}</span>\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\n\t\t\t\t\t\t\t<g clip-path=\"url(#clip0_2450_2140)\">\n\t\t\t\t\t\t\t\t<path d=\"M8.00006 16.4075C12.4183 16.4075 16.0001 12.8258 16.0001 8.40747C16.0001 3.98919 12.4183 0.407471 8.00006 0.407471C3.58178 0.407471 6.10352e-05 3.98919 6.10352e-05 8.40747C6.10352e-05 12.8258 3.58178 16.4075 8.00006 16.4075Z\" fill=\"url(#paint0_linear_2450_2140)\" />\n\t\t\t\t\t\t\t\t<path d=\"M4.83057 8.57422H10.8306\" stroke=\"white\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t\t\t<path d=\"M7.83057 5.57422L10.8306 8.57422L7.83057 11.5742\" stroke=\"white\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t\t<linearGradient id=\"paint0_linear_2450_2140\" x1=\"15.6001\" y1=\"14.9055\" x2=\"0.714348\" y2=\"14.9055\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3B80FF\" />\n\t\t\t\t\t\t\t\t\t<stop offset=\"0.899038\" stop-color=\"#C8B6FF\" />\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t<clipPath id=\"clip0_2450_2140\">\n\t\t\t\t\t\t\t\t\t<rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(0 0.407471)\" />\n\t\t\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</p>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div v-if=\"optionOther.length\" class=\"option-item item-3\">\n\t\t\t<ul>\n\t\t\t\t<li v-for=\"item in optionOther\" :key=\"item.id\" @click=\"handleItemClick(item, '3')\">\n\t\t\t\t\t<span>{{ item.name }}</span>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref, computed } from 'vue'\n\n\n// 定义类型\ninterface HelloChatInfo {\n\tinfo1: any[]\n\tinfo2: any[]\n\tinfo3: any[]\n}\n\ntype HelloChatItem = { id: string; name: string }\n\n// 为注入的变量添加类型参数\nconst helloChatList = inject<HelloChatItem[]>('helloChatList', [])\nconst helloChatInfo = inject<HelloChatInfo>('helloChatInfo', {\n\tinfo1: [],\n\tinfo2: [],\n\tinfo3: []\n})\n\n// 添加当前页码状态,默认为0\nconst currentPage = ref(0)\n// 每页显示的项目数量\n\n\n// 获取完整的选项列表\nconst fullOptionList = ref(helloChatInfo.info1)\n\n// 计算当前显示的项目\\\nconst optionList = computed(() => {\n\tif (!fullOptionList.value.length) {\n\t\treturn []\n\t}\n\tconst startIndex = currentPage.value * itemsPerPage\n\treturn fullOptionList.value.slice(startIndex, startIndex + itemsPerPage) || []\n})\n\nconst optionTeam = ref(helloChatInfo.info2)\nconst optionOther = ref(helloChatInfo.info3)\n\n// 处理列表项点击事件\nconst emit = defineEmits(['handleItemClick'])\nconst handleItemClick = (item: HelloChatItem, type: string) => {\n\temit('handleItemClick', item, type)\n}\n\n// 实现换一换功能\nconst handleChange = () => {\n\t// 计算总页数\n\tconst totalPages = Math.ceil(fullOptionList.value.length / itemsPerPage)\n\t// 切换到下一页,如果是最后一页则回到第一页\n\tcurrentPage.value = (currentPage.value + 1) % totalPages\n}\n</script>\n\n<!-- <style lang=\"less\" scoped>\n@import '../style/HelloChatRobot.less';\n</style> -->\n"],"names":["DO_defineComponent","inject","ref","computed","_createElementVNode","_imports_0","_createElementBlock","_Fragment","_renderList","_unref","_imports_1","_toDisplayString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HelloChat.vue2.js","sources":["../../../../../../../packages/components/touchchat/component/AiRobot/HelloChat.vue"],"sourcesContent":["<script lang=\"ts\">\nconst itemsPerPage = 5\n\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'HelloChat' });</script>\n<template>\r\n\t<div class=\"hello-chat\">\r\n\t\t<img src=\"../../img/aiAvatar.png\" alt=\"\" />\r\n\t\t<p class=\"title\">您好,我能帮您处理什么</p>\r\n\t\t<p class=\"sub-info\">作为您的智能伙伴,我既能帮您查账单、办业务,又能陪您聊天、学知识。</p>\r\n\t</div>\r\n\t<div class=\"function-buttons\">\r\n\t\t<ul>\r\n\t\t\t<li v-for=\"item in helloChatList\" :key=\"item.id\" @click=\"handleItemClick(item, '0')\">\r\n\t\t\t\t<img src=\"../../img/icon.png\" alt=\"{{ item.name }}\" class=\"icon\" />\r\n\t\t\t\t<span class=\"ellipsis-text\">{{ item.name }}</span>\r\n\t\t\t</li>\r\n\t\t</ul>\r\n\t</div>\r\n\t<div class=\"option-conter\">\r\n\t\t<div v-if=\"optionList.length > 0\" class=\"option-item item-1\">\r\n\t\t\t<div class=\"item-top\">\r\n\t\t\t\t<div class=\"item-1-left\">\r\n\t\t\t\t\t<p>猜你想所问</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"item-1-right\" @click=\"handleChange\">\r\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\">\r\n\t\t\t\t\t\t<path d=\"M10.5 2.40796V6.40796\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n\t\t\t\t\t\t<path d=\"M1.5 6.40747V10.4075\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n\t\t\t\t\t\t<path d=\"M10.5 6.40747C10.5 3.9222 8.48528 1.90747 6 1.90747C4.72863 1.90747 3.5804 2.43471 2.76203 3.28247M1.5 6.40747C1.5 8.89275 3.51472 10.9075 6 10.9075C7.2139 10.9075 8.31555 10.4268 9.125 9.64545\" stroke=\"#0077FA\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t\t<span>换一换</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"item-bottom\">\r\n\t\t\t\t<ul>\r\n\t\t\t\t\t<li v-for=\"item in optionList\" :key=\"item.id\" @click=\"handleItemClick(item, '1')\">\r\n\t\t\t\t\t\t<span>{{ item.name }}</span>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t</ul>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div v-if=\"optionTeam.length\" class=\"option-item item-2\">\r\n\t\t\t<ul>\r\n\t\t\t\t<li v-for=\"item in optionTeam\" :key=\"item.id\" @click=\"handleItemClick(item, '2')\">\r\n\t\t\t\t\t<p class=\"title\">{{ item.name }}</p>\r\n\t\t\t\t\t<p class=\"team\">\r\n\t\t\t\t\t\t<span class=\"content\">{{ item.subTitle }}</span>\r\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n\t\t\t\t\t\t\t<g clip-path=\"url(#clip0_2450_2140)\">\r\n\t\t\t\t\t\t\t\t<path d=\"M8.00006 16.4075C12.4183 16.4075 16.0001 12.8258 16.0001 8.40747C16.0001 3.98919 12.4183 0.407471 8.00006 0.407471C3.58178 0.407471 6.10352e-05 3.98919 6.10352e-05 8.40747C6.10352e-05 12.8258 3.58178 16.4075 8.00006 16.4075Z\" fill=\"url(#paint0_linear_2450_2140)\" />\r\n\t\t\t\t\t\t\t\t<path d=\"M4.83057 8.57422H10.8306\" stroke=\"white\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n\t\t\t\t\t\t\t\t<path d=\"M7.83057 5.57422L10.8306 8.57422L7.83057 11.5742\" stroke=\"white\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n\t\t\t\t\t\t\t</g>\r\n\t\t\t\t\t\t\t<defs>\r\n\t\t\t\t\t\t\t\t<linearGradient id=\"paint0_linear_2450_2140\" x1=\"15.6001\" y1=\"14.9055\" x2=\"0.714348\" y2=\"14.9055\" gradientUnits=\"userSpaceOnUse\">\r\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3B80FF\" />\r\n\t\t\t\t\t\t\t\t\t<stop offset=\"0.899038\" stop-color=\"#C8B6FF\" />\r\n\t\t\t\t\t\t\t\t</linearGradient>\r\n\t\t\t\t\t\t\t\t<clipPath id=\"clip0_2450_2140\">\r\n\t\t\t\t\t\t\t\t\t<rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(0 0.407471)\" />\r\n\t\t\t\t\t\t\t\t</clipPath>\r\n\t\t\t\t\t\t\t</defs>\r\n\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</li>\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t\t<div v-if=\"optionOther.length\" class=\"option-item item-3\">\r\n\t\t\t<ul>\r\n\t\t\t\t<li v-for=\"item in optionOther\" :key=\"item.id\" @click=\"handleItemClick(item, '3')\">\r\n\t\t\t\t\t<span>{{ item.name }}</span>\r\n\t\t\t\t</li>\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject, ref, computed } from 'vue'\r\n\r\n\r\n// 定义类型\r\ninterface HelloChatInfo {\r\n\tinfo1: any[]\r\n\tinfo2: any[]\r\n\tinfo3: any[]\r\n}\r\n\r\ntype HelloChatItem = { id: string; name: string }\r\n\r\n// 为注入的变量添加类型参数\r\nconst helloChatList = inject<HelloChatItem[]>('helloChatList', [])\r\nconst helloChatInfo = inject<HelloChatInfo>('helloChatInfo', {\r\n\tinfo1: [],\r\n\tinfo2: [],\r\n\tinfo3: []\r\n})\r\n\r\n// 添加当前页码状态,默认为0\r\nconst currentPage = ref(0)\r\n// 每页显示的项目数量\r\n\r\n\r\n// 获取完整的选项列表\r\nconst fullOptionList = ref(helloChatInfo.info1)\r\n\r\n// 计算当前显示的项目\\\r\nconst optionList = computed(() => {\r\n\tif (!fullOptionList.value.length) {\r\n\t\treturn []\r\n\t}\r\n\tconst startIndex = currentPage.value * itemsPerPage\r\n\treturn fullOptionList.value.slice(startIndex, startIndex + itemsPerPage) || []\r\n})\r\n\r\nconst optionTeam = ref(helloChatInfo.info2)\r\nconst optionOther = ref(helloChatInfo.info3)\r\n\r\n// 处理列表项点击事件\r\nconst emit = defineEmits(['handleItemClick'])\r\nconst handleItemClick = (item: HelloChatItem, type: string) => {\r\n\temit('handleItemClick', item, type)\r\n}\r\n\r\n// 实现换一换功能\r\nconst handleChange = () => {\r\n\t// 计算总页数\r\n\tconst totalPages = Math.ceil(fullOptionList.value.length / itemsPerPage)\r\n\t// 切换到下一页,如果是最后一页则回到第一页\r\n\tcurrentPage.value = (currentPage.value + 1) % totalPages\r\n}\r\n</script>\r\n\r\n<!-- <style lang=\"less\" scoped>\r\n@import '../style/HelloChatRobot.less';\r\n</style> -->\r\n"],"names":["DO_defineComponent","inject","ref","computed","_createElementVNode","_imports_0","_createElementBlock","_Fragment","_renderList","_unref","_imports_1","_toDisplayString"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var letter_vue_vue_type_script_setup_true_lang = require('./letter.vue2.js');
|
|
6
6
|
var _pluginVue_exportHelper = require('../../../../../_virtual/_plugin-vue_export-helper.js');
|
|
7
7
|
|
|
8
|
-
var Letter = /* @__PURE__ */ _pluginVue_exportHelper.default(letter_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-
|
|
8
|
+
var Letter = /* @__PURE__ */ _pluginVue_exportHelper.default(letter_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-6fd1b883"], ["__file", "letter.vue"]]);
|
|
9
9
|
|
|
10
10
|
exports.default = Letter;
|
|
11
11
|
//# sourceMappingURL=letter.vue.js.map
|
|
@@ -184,14 +184,14 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
184
184
|
innerHTML: displayContent.value
|
|
185
185
|
}, null, 10, ["innerHTML"]),
|
|
186
186
|
vue.createCommentVNode(" \u6761\u4EF6\u663E\u793Aloading\uFF0C\u4EC5\u5728HTML\u6A21\u5F0F\u4E14\u6B63\u5728\u6253\u5B57\u65F6\u663E\u793A "),
|
|
187
|
-
vue.createCommentVNode(` <div v-if="isTyping" class="typewriter-loading"
|
|
188
|
-
<span class="loading-dot" :style="{ animationDelay: '0ms' }"></span
|
|
189
|
-
<span class="loading-dot" :style="{ animationDelay: '200ms' }"></span
|
|
190
|
-
<span class="loading-dot" :style="{ animationDelay: '400ms' }"></span
|
|
191
|
-
<span class="loading-text">{{ loadingText ?? '\u6B63\u5728\u6E32\u67D3\u5185\u5BB9' }}</span
|
|
192
|
-
<span class="loading-dot" :style="{ animationDelay: '0ms' }"></span
|
|
193
|
-
<span class="loading-dot" :style="{ animationDelay: '200ms' }"></span
|
|
194
|
-
<span class="loading-dot" :style="{ animationDelay: '400ms' }"></span
|
|
187
|
+
vue.createCommentVNode(` <div v-if="isTyping" class="typewriter-loading">\r
|
|
188
|
+
<span class="loading-dot" :style="{ animationDelay: '0ms' }"></span>\r
|
|
189
|
+
<span class="loading-dot" :style="{ animationDelay: '200ms' }"></span>\r
|
|
190
|
+
<span class="loading-dot" :style="{ animationDelay: '400ms' }"></span>\r
|
|
191
|
+
<span class="loading-text">{{ loadingText ?? '\u6B63\u5728\u6E32\u67D3\u5185\u5BB9' }}</span>\r
|
|
192
|
+
<span class="loading-dot" :style="{ animationDelay: '0ms' }"></span>\r
|
|
193
|
+
<span class="loading-dot" :style="{ animationDelay: '200ms' }"></span>\r
|
|
194
|
+
<span class="loading-dot" :style="{ animationDelay: '400ms' }"></span>\r
|
|
195
195
|
</div> `)
|
|
196
196
|
],
|
|
197
197
|
2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"letter.vue2.js","sources":["../../../../../../../packages/components/touchchat/component/AiRobot/letter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'Touchletter' });\n</script>\n<template>\n\t<div class=\"typewriter-container\" :class=\"isTyping ? 'loading-container' : ''\">\n\t\t<div\n\t\t\tclass=\"typewriter-content\"\n\t\t\t:class=\"{\n\t\t\t\t'markdown-content': currentType === 'markdown',\n\t\t\t\t'html-content': currentType === 'html'\n\t\t\t}\"\n\t\t\tv-html=\"displayContent\"\n\t\t/>\n\t\t<!-- 条件显示loading,仅在HTML模式且正在打字时显示 -->\n\t\t<!-- <div v-if=\"isTyping\" class=\"typewriter-loading\">\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '0ms' }\"></span>\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '200ms' }\"></span>\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '400ms' }\"></span>\n\t\t\t<span class=\"loading-text\">{{ loadingText ?? '正在渲染内容' }}</span>\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '0ms' }\"></span>\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '200ms' }\"></span>\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '400ms' }\"></span>\n\t\t</div> -->\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch, Ref, onUnmounted, inject } from 'vue'\n// import { marked } from 'marked';\n\n// DOMPurify 模块缓存\nlet DOMPurifyModule: any = null\n\n// 动态加载 DOMPurify\nconst loadDOMPurify = async () => {\n\tif (!DOMPurifyModule) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tDOMPurifyModule = await import('dompurify')\n\t\t}\n\t}\n\treturn DOMPurifyModule?.default || null\n}\n\n\n\ntype ContentType = 'text' | 'markdown' | 'html'\n\nconst props = defineProps<{\n\tdata: any\n\tspeed?: number\n\tcontentType?: ContentType | 'auto'\n\t// onComplete?: () => void\n\tsanitizeHtml?: boolean\n\tloadingText?: string\n}>()\n\nconst emits = defineEmits<{\n\t(e: 'complete'): void\n\t(e: 'start'): void\n}>()\n\nconst injectSpeed = inject<number>('speed', 10)\n\n// 默认值处理\nconst speed = computed(() => Math.max(1, props.speed || injectSpeed || 10))\nconst sanitizeHtml = computed(() => props.sanitizeHtml !== false)\n// const loadingText = computed(() => props.loadingText || '正在渲染内容...')\n\n// 内部状态\nconst currentIndex = ref(0)\nconst validContent = ref('')\nconst isTyping = ref(false)\nconst timer: Ref<number | null> = ref(null)\nconst tagStack = ref<string[]>([])\n\n// 内容类型检测与处理\nconst detectContentType = (content: string): ContentType => {\n\tif (/<\\/?[a-z][\\s\\S]*>/i.test(content)) {\n\t\treturn 'html'\n\t}\n\tif (/^#{1,6}\\s+/.test(content) || /\\*\\*.*\\*\\*/.test(content) || /```/.test(content)) {\n\t\treturn 'markdown'\n\t}\n\treturn 'text'\n}\n\nconst currentType = computed<ContentType>(() => {\n\tif (props.contentType && props.contentType !== 'auto') {\n\t\treturn props.contentType\n\t}\n\treturn detectContentType(props.data)\n})\n\n// 显示内容处理\nconst displayContent = computed(() => {\n\tlet content = validContent.value\n\tswitch (currentType.value) {\n\t\tcase 'html':\n\t\t\tif (sanitizeHtml.value && typeof window !== 'undefined') {\n\t\t\t\t// 动态加载并使用 DOMPurify\n\t\t\t\treturn DOMPurifyModule ? DOMPurifyModule.sanitize(content) : content\n\t\t\t}\n\t\t\treturn content\n\t\t// case 'markdown':\n\t\t// \treturn marked.parse(content);\n\t\tcase 'text':\n\t\t\treturn content.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\\n/g, '<br>').replace(/ {2}/g, ' ')\n\t\tdefault:\n\t\t\treturn content\n\t}\n})\n\n// 打字间隔计算\nconst getInterval = (isTag: boolean) => {\n\tconst baseInterval = 1000 / speed.value\n\treturn baseInterval * (isTag ? 1.2 : 0.8 + Math.random() * 0.4)\n}\n\n// 标签处理工具函数\nconst isSelfClosingTag = (tag: string) => {\n\tconst selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']\n\tconst tagNameMatch = tag.match(/<\\/?([a-z0-9]+)/i)\n\tif (tagNameMatch && tagNameMatch[1]) {\n\t\tconst tagName = tagNameMatch[1].toLowerCase()\n\t\treturn selfClosingTags.includes(tagName) || tag.endsWith('/>')\n\t}\n\treturn false\n}\n\nconst processTag = (tag: string) => {\n\tif (tag.startsWith('</')) {\n\t\tconst tagName = tag.match(/<\\/([a-z0-9]+)/i)?.[1]?.toLowerCase()\n\t\tif (tagName && tagStack.value.at(-1) === tagName) {\n\t\t\ttagStack.value.pop()\n\t\t}\n\t} else if (tag.startsWith('<') && !isSelfClosingTag(tag)) {\n\t\tconst tagName = tag.match(/<([a-z0-9]+)/i)?.[1]?.toLowerCase()\n\t\tif (tagName) {\n\t\t\ttagStack.value.push(tagName)\n\t\t}\n\t}\n}\n\n// 核心打字逻辑\nconst typeNext = () => {\n\tif (currentIndex.value >= props.data.length) {\n\t\twhile (tagStack.value.length > 0) {\n\t\t\tconst tag = tagStack.value.pop()\n\t\t\tvalidContent.value += `</${tag}>`\n\t\t}\n\t\tcompleteTyping()\n\t\treturn\n\t}\n\n\tconst currentChar = props.data[currentIndex.value]\n\tlet nextIndex = currentIndex.value\n\tlet newContent = ''\n\tlet isTag = false\n\n\tif (currentChar === '<') {\n\t\tisTag = true\n\t\tconst endIndex = props.data.indexOf('>', currentIndex.value)\n\t\tif (endIndex === -1) {\n\t\t\tnextIndex = currentIndex.value + 1\n\t\t\tnewContent = currentChar\n\t\t} else {\n\t\t\tnextIndex = endIndex + 1\n\t\t\tnewContent = props.data.substring(currentIndex.value, nextIndex)\n\t\t\tprocessTag(newContent)\n\t\t}\n\t} else {\n\t\tnextIndex = currentIndex.value + 1\n\t\tnewContent = currentChar\n\t}\n\n\tcurrentIndex.value = nextIndex\n\tvalidContent.value += newContent\n\ttimer.value = window.setTimeout(typeNext, getInterval(isTag))\n}\n\n// 控制方法\nconst startTyping = () => {\n\tif (isTyping.value || currentIndex.value >= props.data.length) return\n\tisTyping.value = true\n\temits('start')\n\ttypeNext()\n}\n\nconst stopTyping = () => {\n\tif (timer.value) {\n\t\tclearTimeout(timer.value)\n\t\ttimer.value = null\n\t\tisTyping.value = false\n\t}\n}\n\nconst resetTyping = () => {\n\tstopTyping()\n\tcurrentIndex.value = 0\n\tvalidContent.value = ''\n\ttagStack.value = []\n}\n\nconst completeTyping = () => {\n\tstopTyping()\n\t// props.onComplete?.()\n\t// complete\n\temits('complete')\n}\n\n// 监听内容变化\nwatch(\n\t() => props.data,\n\t() => {\n\t\tresetTyping()\n\t\tstartTyping()\n\t},\n\t{ immediate: true }\n)\n\nwatch(\n\t() => props.contentType,\n\t() => {\n\t\tvalidContent.value = props.data.substring(0, currentIndex.value)\n\t}\n)\n\nonMounted(async () => {\n\tif (currentIndex.value === 0) {\n\t\tstartTyping()\n\t}\n\tawait loadDOMPurify()\n})\n\nonUnmounted(() => stopTyping())\n\ndefineExpose({ startTyping, stopTyping, resetTyping, currentIndex, isTyping })\n</script>\n\n<style scoped>\n.typewriter-container {\n\tposition: relative;\n}\n.loading-container {\n\tmin-height: 40px;\n}\n\n/* .typewriter-content {\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tline-height: 1.6;\n\tfont-family: 'Courier New', Courier, monospace;\n} */\n\n/* loading样式 */\n.typewriter-loading {\n\tmargin-top: 12px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tcolor: #666;\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 8px 0;\n}\n\n.loading-dot {\n\tdisplay: inline-block;\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground-color: #666;\n\tanimation: bounce 1.4s infinite ease-in-out both;\n}\n\n.loading-text {\n\tuser-select: none;\n}\n\n@keyframes bounce {\n\t0%,\n\t80%,\n\t100% {\n\t\ttransform: scale(0);\n\t}\n\n\t40% {\n\t\ttransform: scale(1);\n\t}\n}\n\n/* 内容样式 */\n.markdown-content {\n\tcolor: #333;\n}\n\n.markdown-content h1,\n.markdown-content h2 {\n\tmargin: 1em 0 0.5em;\n}\n\n.markdown-content p {\n\tmargin: 0.5em 0;\n}\n\n.markdown-content code {\n\tbackground: #f0f0f0;\n\tpadding: 0.2em 0.4em;\n\tborder-radius: 4px;\n}\n\n/* .html-content {\n\t\n} */\n</style>\n"],"names":["DO_defineComponent","inject","computed","ref","watch","onMounted","onUnmounted","_createElementBlock","_normalizeClass","_createElementVNode","_createCommentVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"letter.vue2.js","sources":["../../../../../../../packages/components/touchchat/component/AiRobot/letter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'Touchletter' });\n</script>\n<template>\r\n\t<div class=\"typewriter-container\" :class=\"isTyping ? 'loading-container' : ''\">\r\n\t\t<div\r\n\t\t\tclass=\"typewriter-content\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t'markdown-content': currentType === 'markdown',\r\n\t\t\t\t'html-content': currentType === 'html'\r\n\t\t\t}\"\r\n\t\t\tv-html=\"displayContent\"\r\n\t\t/>\r\n\t\t<!-- 条件显示loading,仅在HTML模式且正在打字时显示 -->\r\n\t\t<!-- <div v-if=\"isTyping\" class=\"typewriter-loading\">\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '0ms' }\"></span>\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '200ms' }\"></span>\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '400ms' }\"></span>\r\n\t\t\t<span class=\"loading-text\">{{ loadingText ?? '正在渲染内容' }}</span>\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '0ms' }\"></span>\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '200ms' }\"></span>\r\n\t\t\t<span class=\"loading-dot\" :style=\"{ animationDelay: '400ms' }\"></span>\r\n\t\t</div> -->\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, watch, Ref, onUnmounted, inject } from 'vue'\r\n// import { marked } from 'marked';\r\n\r\n// DOMPurify 模块缓存\r\nlet DOMPurifyModule: any = null\r\n\r\n// 动态加载 DOMPurify\r\nconst loadDOMPurify = async () => {\r\n\tif (!DOMPurifyModule) {\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\tDOMPurifyModule = await import('dompurify')\r\n\t\t}\r\n\t}\r\n\treturn DOMPurifyModule?.default || null\r\n}\r\n\r\n\r\n\r\ntype ContentType = 'text' | 'markdown' | 'html'\r\n\r\nconst props = defineProps<{\r\n\tdata: any\r\n\tspeed?: number\r\n\tcontentType?: ContentType | 'auto'\r\n\t// onComplete?: () => void\r\n\tsanitizeHtml?: boolean\r\n\tloadingText?: string\r\n}>()\r\n\r\nconst emits = defineEmits<{\r\n\t(e: 'complete'): void\r\n\t(e: 'start'): void\r\n}>()\r\n\r\nconst injectSpeed = inject<number>('speed', 10)\r\n\r\n// 默认值处理\r\nconst speed = computed(() => Math.max(1, props.speed || injectSpeed || 10))\r\nconst sanitizeHtml = computed(() => props.sanitizeHtml !== false)\r\n// const loadingText = computed(() => props.loadingText || '正在渲染内容...')\r\n\r\n// 内部状态\r\nconst currentIndex = ref(0)\r\nconst validContent = ref('')\r\nconst isTyping = ref(false)\r\nconst timer: Ref<number | null> = ref(null)\r\nconst tagStack = ref<string[]>([])\r\n\r\n// 内容类型检测与处理\r\nconst detectContentType = (content: string): ContentType => {\r\n\tif (/<\\/?[a-z][\\s\\S]*>/i.test(content)) {\r\n\t\treturn 'html'\r\n\t}\r\n\tif (/^#{1,6}\\s+/.test(content) || /\\*\\*.*\\*\\*/.test(content) || /```/.test(content)) {\r\n\t\treturn 'markdown'\r\n\t}\r\n\treturn 'text'\r\n}\r\n\r\nconst currentType = computed<ContentType>(() => {\r\n\tif (props.contentType && props.contentType !== 'auto') {\r\n\t\treturn props.contentType\r\n\t}\r\n\treturn detectContentType(props.data)\r\n})\r\n\r\n// 显示内容处理\r\nconst displayContent = computed(() => {\r\n\tlet content = validContent.value\r\n\tswitch (currentType.value) {\r\n\t\tcase 'html':\r\n\t\t\tif (sanitizeHtml.value && typeof window !== 'undefined') {\r\n\t\t\t\t// 动态加载并使用 DOMPurify\r\n\t\t\t\treturn DOMPurifyModule ? DOMPurifyModule.sanitize(content) : content\r\n\t\t\t}\r\n\t\t\treturn content\r\n\t\t// case 'markdown':\r\n\t\t// \treturn marked.parse(content);\r\n\t\tcase 'text':\r\n\t\t\treturn content.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\\n/g, '<br>').replace(/ {2}/g, ' ')\r\n\t\tdefault:\r\n\t\t\treturn content\r\n\t}\r\n})\r\n\r\n// 打字间隔计算\r\nconst getInterval = (isTag: boolean) => {\r\n\tconst baseInterval = 1000 / speed.value\r\n\treturn baseInterval * (isTag ? 1.2 : 0.8 + Math.random() * 0.4)\r\n}\r\n\r\n// 标签处理工具函数\r\nconst isSelfClosingTag = (tag: string) => {\r\n\tconst selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']\r\n\tconst tagNameMatch = tag.match(/<\\/?([a-z0-9]+)/i)\r\n\tif (tagNameMatch && tagNameMatch[1]) {\r\n\t\tconst tagName = tagNameMatch[1].toLowerCase()\r\n\t\treturn selfClosingTags.includes(tagName) || tag.endsWith('/>')\r\n\t}\r\n\treturn false\r\n}\r\n\r\nconst processTag = (tag: string) => {\r\n\tif (tag.startsWith('</')) {\r\n\t\tconst tagName = tag.match(/<\\/([a-z0-9]+)/i)?.[1]?.toLowerCase()\r\n\t\tif (tagName && tagStack.value.at(-1) === tagName) {\r\n\t\t\ttagStack.value.pop()\r\n\t\t}\r\n\t} else if (tag.startsWith('<') && !isSelfClosingTag(tag)) {\r\n\t\tconst tagName = tag.match(/<([a-z0-9]+)/i)?.[1]?.toLowerCase()\r\n\t\tif (tagName) {\r\n\t\t\ttagStack.value.push(tagName)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// 核心打字逻辑\r\nconst typeNext = () => {\r\n\tif (currentIndex.value >= props.data.length) {\r\n\t\twhile (tagStack.value.length > 0) {\r\n\t\t\tconst tag = tagStack.value.pop()\r\n\t\t\tvalidContent.value += `</${tag}>`\r\n\t\t}\r\n\t\tcompleteTyping()\r\n\t\treturn\r\n\t}\r\n\r\n\tconst currentChar = props.data[currentIndex.value]\r\n\tlet nextIndex = currentIndex.value\r\n\tlet newContent = ''\r\n\tlet isTag = false\r\n\r\n\tif (currentChar === '<') {\r\n\t\tisTag = true\r\n\t\tconst endIndex = props.data.indexOf('>', currentIndex.value)\r\n\t\tif (endIndex === -1) {\r\n\t\t\tnextIndex = currentIndex.value + 1\r\n\t\t\tnewContent = currentChar\r\n\t\t} else {\r\n\t\t\tnextIndex = endIndex + 1\r\n\t\t\tnewContent = props.data.substring(currentIndex.value, nextIndex)\r\n\t\t\tprocessTag(newContent)\r\n\t\t}\r\n\t} else {\r\n\t\tnextIndex = currentIndex.value + 1\r\n\t\tnewContent = currentChar\r\n\t}\r\n\r\n\tcurrentIndex.value = nextIndex\r\n\tvalidContent.value += newContent\r\n\ttimer.value = window.setTimeout(typeNext, getInterval(isTag))\r\n}\r\n\r\n// 控制方法\r\nconst startTyping = () => {\r\n\tif (isTyping.value || currentIndex.value >= props.data.length) return\r\n\tisTyping.value = true\r\n\temits('start')\r\n\ttypeNext()\r\n}\r\n\r\nconst stopTyping = () => {\r\n\tif (timer.value) {\r\n\t\tclearTimeout(timer.value)\r\n\t\ttimer.value = null\r\n\t\tisTyping.value = false\r\n\t}\r\n}\r\n\r\nconst resetTyping = () => {\r\n\tstopTyping()\r\n\tcurrentIndex.value = 0\r\n\tvalidContent.value = ''\r\n\ttagStack.value = []\r\n}\r\n\r\nconst completeTyping = () => {\r\n\tstopTyping()\r\n\t// props.onComplete?.()\r\n\t// complete\r\n\temits('complete')\r\n}\r\n\r\n// 监听内容变化\r\nwatch(\r\n\t() => props.data,\r\n\t() => {\r\n\t\tresetTyping()\r\n\t\tstartTyping()\r\n\t},\r\n\t{ immediate: true }\r\n)\r\n\r\nwatch(\r\n\t() => props.contentType,\r\n\t() => {\r\n\t\tvalidContent.value = props.data.substring(0, currentIndex.value)\r\n\t}\r\n)\r\n\r\nonMounted(async () => {\r\n\tif (currentIndex.value === 0) {\r\n\t\tstartTyping()\r\n\t}\r\n\tawait loadDOMPurify()\r\n})\r\n\r\nonUnmounted(() => stopTyping())\r\n\r\ndefineExpose({ startTyping, stopTyping, resetTyping, currentIndex, isTyping })\r\n</script>\r\n\r\n<style scoped>\r\n.typewriter-container {\r\n\tposition: relative;\r\n}\r\n.loading-container {\r\n\tmin-height: 40px;\r\n}\r\n\r\n/* .typewriter-content {\r\n\twhite-space: pre-wrap;\r\n\tword-break: break-word;\r\n\tline-height: 1.6;\r\n\tfont-family: 'Courier New', Courier, monospace;\r\n} */\r\n\r\n/* loading样式 */\r\n.typewriter-loading {\r\n\tmargin-top: 12px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 8px;\r\n\tcolor: #666;\r\n\tfont-size: 14px;\r\n\tline-height: 1;\r\n\tpadding: 8px 0;\r\n}\r\n\r\n.loading-dot {\r\n\tdisplay: inline-block;\r\n\twidth: 8px;\r\n\theight: 8px;\r\n\tborder-radius: 50%;\r\n\tbackground-color: #666;\r\n\tanimation: bounce 1.4s infinite ease-in-out both;\r\n}\r\n\r\n.loading-text {\r\n\tuser-select: none;\r\n}\r\n\r\n@keyframes bounce {\r\n\t0%,\r\n\t80%,\r\n\t100% {\r\n\t\ttransform: scale(0);\r\n\t}\r\n\r\n\t40% {\r\n\t\ttransform: scale(1);\r\n\t}\r\n}\r\n\r\n/* 内容样式 */\r\n.markdown-content {\r\n\tcolor: #333;\r\n}\r\n\r\n.markdown-content h1,\r\n.markdown-content h2 {\r\n\tmargin: 1em 0 0.5em;\r\n}\r\n\r\n.markdown-content p {\r\n\tmargin: 0.5em 0;\r\n}\r\n\r\n.markdown-content code {\r\n\tbackground: #f0f0f0;\r\n\tpadding: 0.2em 0.4em;\r\n\tborder-radius: 4px;\r\n}\r\n\r\n/* .html-content {\r\n\t\r\n} */\r\n</style>\r\n"],"names":["DO_defineComponent","inject","computed","ref","watch","onMounted","onUnmounted","_createElementBlock","_normalizeClass","_createElementVNode","_createCommentVNode"],"mappings":"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"}
|
|
@@ -106,7 +106,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
106
106
|
(vue.openBlock(true), vue.createElementBlock(
|
|
107
107
|
vue.Fragment,
|
|
108
108
|
null,
|
|
109
|
-
vue.renderList(
|
|
109
|
+
vue.renderList(__props.fileList, (item, index) => {
|
|
110
110
|
return vue.openBlock(), vue.createElementBlock(
|
|
111
111
|
vue.Fragment,
|
|
112
112
|
{
|
|
@@ -117,13 +117,13 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
117
117
|
key: 0,
|
|
118
118
|
item,
|
|
119
119
|
index,
|
|
120
|
-
"has-colse":
|
|
120
|
+
"has-colse": __props.hasColse,
|
|
121
121
|
onColse: handleColse
|
|
122
122
|
}, null, 8, ["item", "index", "has-colse"])) : (vue.openBlock(), vue.createBlock(PDFFile.default, {
|
|
123
123
|
key: 1,
|
|
124
124
|
item,
|
|
125
125
|
index,
|
|
126
|
-
"has-colse":
|
|
126
|
+
"has-colse": __props.hasColse,
|
|
127
127
|
onColse: handleColse
|
|
128
128
|
}, null, 8, ["item", "index", "has-colse"]))
|
|
129
129
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileContent.vue2.js","sources":["../../../../../../packages/components/touchchat/component/FileContent.vue"],"sourcesContent":["<template>\n\t<div class=\"file-content\">\n\t\t<div ref=\"scrollContainer\" class=\"file-content-scroll\">\n\t\t\t<template v-for=\"(item, index) in fileList\" :key=\"item.id\">\n\t\t\t\t<ImageFile v-if=\"item.fileType.includes('image')\" :item=\"item\" :index=\"index\" :has-colse=\"hasColse\" @colse=\"handleColse\" />\n\t\t\t\t<PDFFile v-else :item=\"item\" :index=\"index\" :has-colse=\"hasColse\" @colse=\"handleColse\" />\n\t\t\t</template>\n\t\t</div>\n\t\t<div v-show=\"showRightTip\" class=\"file-content-right-tip\">\n\t\t\t<div class=\"file-content-svg\" @click=\"scrollRightFn\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"9\" viewBox=\"0 0 5 9\" fill=\"none\">\n\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.01036 0.877808L4.5968 4.46425C4.80562 4.67307 4.80562 5.01164 4.5968 5.22046L1.01036 8.8069L0.25415 8.05069L3.46248 4.84235L0.25415 1.63402L1.01036 0.877808Z\" fill=\"#1D2129\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-show=\"showLeftTip\" class=\"file-content-left-tip\">\n\t\t\t<div class=\"file-content-svg\" @click=\"scrollLeftFn\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"9\" viewBox=\"0 0 5 9\" fill=\"none\">\n\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.01036 0.877808L4.5968 4.46425C4.80562 4.67307 4.80562 5.01164 4.5968 5.22046L1.01036 8.8069L0.25415 8.05069L3.46248 4.84235L0.25415 1.63402L1.01036 0.877808Z\" fill=\"#1D2129\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nimport ImageFile from './ImageFile.vue'\nimport PDFFile from './PDFFile.vue'\nimport { ref, onMounted, onUnmounted } from 'vue'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\nconst showRightTip = ref(false)\nconst showLeftTip = ref(false)\nconst scrollDistance = ref(256) // 每次滚动的距离\nconst scrollContainer = ref<HTMLDivElement | null>(null)\n\nconst props = defineProps<{\n\tfileList: FileItem[]\n\thasColse: boolean\n\ttype: string\n}>()\nconst emits = defineEmits<{\n\t(e: 'colse', id: string): void\n\t(e: 'userMessageFileList', value: FileItem, index: number): void\n}>()\n\nlet edgeDetectionDebounce: NodeJS.Timeout | null = null\n\n// 处理鼠标滚轮事件,将纵向滚动转为横向滚动\nconst handleWheel = (e: WheelEvent) => {\n\tif (!scrollContainer.value) return\n\n\t// 阻止默认的纵向滚动\n\te.preventDefault()\n\tshowRightTip.value = true\n\tshowLeftTip.value = true\n\tconst { scrollLeft, clientWidth, scrollWidth } = scrollContainer.value\n\n\t// 左边缘检测(允许1px的误差)\n\tif (scrollLeft <= 1) {\n\t\tshowLeftTip.value = false\n\t}\n\n\t// 右边缘检测(允许1px的误差)\n\tif (scrollLeft + clientWidth >= scrollWidth - 1) {\n\t\tshowRightTip.value = false\n\t}\n\n\t// 计算滚动距离,添加一些乘数使滚动更自然\n\tconst scrollAmount = e.deltaY * 0.8\n\n\t// 平滑滚动\n\tscrollContainer.value.scrollBy({\n\t\tleft: scrollAmount,\n\t\tbehavior: 'smooth'\n\t})\n}\n\nconst handleScroll = (e: WheelEvent) => {\n\t// 防抖处理,避免滚动过程中频繁触发\n\tif (edgeDetectionDebounce) {\n\t\tclearTimeout(edgeDetectionDebounce)\n\t}\n\n\tedgeDetectionDebounce = setTimeout(() => {\n\t\thandleWheel(e)\n\t}, 50) // 50ms的防抖延迟\n}\n\n// 向左滚动(模拟向上滚轮事件)\nconst scrollLeftFn = () => {\n\tif (!showLeftTip.value || !scrollContainer.value) return\n\n\t// 模拟向上滚动的滚轮事件(deltaY 为负值)\n\tconst mockEvent = new WheelEvent('wheel', {\n\t\tdeltaY: -scrollDistance.value, // 负值表示向上滚动,我们将其转换为向左滚动\n\t\tbubbles: true,\n\t\tcancelable: true\n\t})\n\n\t// 复用 handleWheel 方法处理模拟事件\n\thandleWheel(mockEvent)\n}\n\n// 向右滚动(模拟向下滚轮事件)\nconst scrollRightFn = () => {\n\tif (!showRightTip.value || !scrollContainer.value) return\n\n\t// 模拟向下滚动的滚轮事件(deltaY 为正值)\n\tconst mockEvent = new WheelEvent('wheel', {\n\t\tdeltaY: scrollDistance.value, // 正值表示向下滚动,我们将其转换为向右滚动\n\t\tbubbles: true,\n\t\tcancelable: true\n\t})\n\n\t// 复用 handleWheel 方法处理模拟事件\n\thandleWheel(mockEvent)\n}\n\nconst handleColse = (id: string) => {\n\temits('colse', id)\n}\n\nconst init = () => {\n\tif (props.type === 'UserMessage' && props.fileList.length > 0) {\n\t\tconst list = props.fileList\n\t\tlist.forEach((item, index) => {\n\t\t\temits('userMessageFileList', item, index)\n\t\t})\n\t}\n}\n\nonMounted(() => {\n\tif (scrollContainer.value) {\n\t\t// 添加事件监听,passive: false 允许我们调用 preventDefault\n\t\tscrollContainer.value.addEventListener('wheel', handleScroll, { passive: false })\n\t}\n\tinit()\n})\n\nonUnmounted(() => {\n\tif (scrollContainer.value) {\n\t\tscrollContainer.value.removeEventListener('wheel', handleScroll)\n\t}\n})\n</script>\n"],"names":["ref","onMounted","onUnmounted","_createElementBlock","_createElementVNode","_openBlock","_Fragment","
|
|
1
|
+
{"version":3,"file":"FileContent.vue2.js","sources":["../../../../../../packages/components/touchchat/component/FileContent.vue"],"sourcesContent":["<template>\n\t<div class=\"file-content\">\n\t\t<div ref=\"scrollContainer\" class=\"file-content-scroll\">\n\t\t\t<template v-for=\"(item, index) in fileList\" :key=\"item.id\">\n\t\t\t\t<ImageFile v-if=\"item.fileType.includes('image')\" :item=\"item\" :index=\"index\" :has-colse=\"hasColse\" @colse=\"handleColse\" />\n\t\t\t\t<PDFFile v-else :item=\"item\" :index=\"index\" :has-colse=\"hasColse\" @colse=\"handleColse\" />\n\t\t\t</template>\n\t\t</div>\n\t\t<div v-show=\"showRightTip\" class=\"file-content-right-tip\">\n\t\t\t<div class=\"file-content-svg\" @click=\"scrollRightFn\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"9\" viewBox=\"0 0 5 9\" fill=\"none\">\n\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.01036 0.877808L4.5968 4.46425C4.80562 4.67307 4.80562 5.01164 4.5968 5.22046L1.01036 8.8069L0.25415 8.05069L3.46248 4.84235L0.25415 1.63402L1.01036 0.877808Z\" fill=\"#1D2129\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-show=\"showLeftTip\" class=\"file-content-left-tip\">\n\t\t\t<div class=\"file-content-svg\" @click=\"scrollLeftFn\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"9\" viewBox=\"0 0 5 9\" fill=\"none\">\n\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.01036 0.877808L4.5968 4.46425C4.80562 4.67307 4.80562 5.01164 4.5968 5.22046L1.01036 8.8069L0.25415 8.05069L3.46248 4.84235L0.25415 1.63402L1.01036 0.877808Z\" fill=\"#1D2129\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nimport ImageFile from './ImageFile.vue'\nimport PDFFile from './PDFFile.vue'\nimport { ref, onMounted, onUnmounted } from 'vue'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\nconst showRightTip = ref(false)\nconst showLeftTip = ref(false)\nconst scrollDistance = ref(256) // 每次滚动的距离\nconst scrollContainer = ref<HTMLDivElement | null>(null)\n\nconst props = defineProps<{\n\tfileList: FileItem[]\n\thasColse: boolean\n\ttype: string\n}>()\nconst emits = defineEmits<{\n\t(e: 'colse', id: string): void\n\t(e: 'userMessageFileList', value: FileItem, index: number): void\n}>()\n\nlet edgeDetectionDebounce: NodeJS.Timeout | null = null\n\n// 处理鼠标滚轮事件,将纵向滚动转为横向滚动\nconst handleWheel = (e: WheelEvent) => {\n\tif (!scrollContainer.value) return\n\n\t// 阻止默认的纵向滚动\n\te.preventDefault()\n\tshowRightTip.value = true\n\tshowLeftTip.value = true\n\tconst { scrollLeft, clientWidth, scrollWidth } = scrollContainer.value\n\n\t// 左边缘检测(允许1px的误差)\n\tif (scrollLeft <= 1) {\n\t\tshowLeftTip.value = false\n\t}\n\n\t// 右边缘检测(允许1px的误差)\n\tif (scrollLeft + clientWidth >= scrollWidth - 1) {\n\t\tshowRightTip.value = false\n\t}\n\n\t// 计算滚动距离,添加一些乘数使滚动更自然\n\tconst scrollAmount = e.deltaY * 0.8\n\n\t// 平滑滚动\n\tscrollContainer.value.scrollBy({\n\t\tleft: scrollAmount,\n\t\tbehavior: 'smooth'\n\t})\n}\n\nconst handleScroll = (e: WheelEvent) => {\n\t// 防抖处理,避免滚动过程中频繁触发\n\tif (edgeDetectionDebounce) {\n\t\tclearTimeout(edgeDetectionDebounce)\n\t}\n\n\tedgeDetectionDebounce = setTimeout(() => {\n\t\thandleWheel(e)\n\t}, 50) // 50ms的防抖延迟\n}\n\n// 向左滚动(模拟向上滚轮事件)\nconst scrollLeftFn = () => {\n\tif (!showLeftTip.value || !scrollContainer.value) return\n\n\t// 模拟向上滚动的滚轮事件(deltaY 为负值)\n\tconst mockEvent = new WheelEvent('wheel', {\n\t\tdeltaY: -scrollDistance.value, // 负值表示向上滚动,我们将其转换为向左滚动\n\t\tbubbles: true,\n\t\tcancelable: true\n\t})\n\n\t// 复用 handleWheel 方法处理模拟事件\n\thandleWheel(mockEvent)\n}\n\n// 向右滚动(模拟向下滚轮事件)\nconst scrollRightFn = () => {\n\tif (!showRightTip.value || !scrollContainer.value) return\n\n\t// 模拟向下滚动的滚轮事件(deltaY 为正值)\n\tconst mockEvent = new WheelEvent('wheel', {\n\t\tdeltaY: scrollDistance.value, // 正值表示向下滚动,我们将其转换为向右滚动\n\t\tbubbles: true,\n\t\tcancelable: true\n\t})\n\n\t// 复用 handleWheel 方法处理模拟事件\n\thandleWheel(mockEvent)\n}\n\nconst handleColse = (id: string) => {\n\temits('colse', id)\n}\n\nconst init = () => {\n\tif (props.type === 'UserMessage' && props.fileList.length > 0) {\n\t\tconst list = props.fileList\n\t\tlist.forEach((item, index) => {\n\t\t\temits('userMessageFileList', item, index)\n\t\t})\n\t}\n}\n\nonMounted(() => {\n\tif (scrollContainer.value) {\n\t\t// 添加事件监听,passive: false 允许我们调用 preventDefault\n\t\tscrollContainer.value.addEventListener('wheel', handleScroll, { passive: false })\n\t}\n\tinit()\n})\n\nonUnmounted(() => {\n\tif (scrollContainer.value) {\n\t\tscrollContainer.value.removeEventListener('wheel', handleScroll)\n\t}\n})\n</script>\n"],"names":["ref","onMounted","onUnmounted","_createElementBlock","_createElementVNode","_openBlock","_Fragment","_renderList","_createBlock","ImageFile","PDFFile"],"mappings":";;;;;;;;;;;;;;;;;AA8BA,IAAM,MAAA,YAAA,GAAeA,QAAI,KAAK,CAAA,CAAA;AAC9B,IAAM,MAAA,WAAA,GAAcA,QAAI,KAAK,CAAA,CAAA;AAC7B,IAAM,MAAA,cAAA,GAAiBA,QAAI,GAAG,CAAA,CAAA;AAC9B,IAAM,MAAA,eAAA,GAAkBA,QAA2B,IAAI,CAAA,CAAA;AAEvD,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAKd,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAA;AAKd,IAAA,IAAI,qBAA+C,GAAA,IAAA,CAAA;AAGnD,IAAM,MAAA,WAAA,GAAc,CAAC,CAAkB,KAAA;AACtC,MAAA,IAAI,CAAC,eAAgB,CAAA,KAAA;AAAO,QAAA,OAAA;AAG5B,MAAA,CAAA,CAAE,cAAe,EAAA,CAAA;AACjB,MAAA,YAAA,CAAa,KAAQ,GAAA,IAAA,CAAA;AACrB,MAAA,WAAA,CAAY,KAAQ,GAAA,IAAA,CAAA;AACpB,MAAA,MAAM,EAAE,UAAA,EAAY,WAAa,EAAA,WAAA,KAAgB,eAAgB,CAAA,KAAA,CAAA;AAGjE,MAAA,IAAI,cAAc,CAAG,EAAA;AACpB,QAAA,WAAA,CAAY,KAAQ,GAAA,KAAA,CAAA;AAAA,OACrB;AAGA,MAAI,IAAA,UAAA,GAAa,WAAe,IAAA,WAAA,GAAc,CAAG,EAAA;AAChD,QAAA,YAAA,CAAa,KAAQ,GAAA,KAAA,CAAA;AAAA,OACtB;AAGA,MAAM,MAAA,YAAA,GAAe,EAAE,MAAS,GAAA,GAAA,CAAA;AAGhC,MAAA,eAAA,CAAgB,MAAM,QAAS,CAAA;AAAA,QAC9B,IAAM,EAAA,YAAA;AAAA,QACN,QAAU,EAAA,QAAA;AAAA,OACV,CAAA,CAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,YAAA,GAAe,CAAC,CAAkB,KAAA;AAEvC,MAAA,IAAI,qBAAuB,EAAA;AAC1B,QAAA,YAAA,CAAa,qBAAqB,CAAA,CAAA;AAAA,OACnC;AAEA,MAAA,qBAAA,GAAwB,WAAW,MAAM;AACxC,QAAA,WAAA,CAAY,CAAC,CAAA,CAAA;AAAA,SACX,EAAE,CAAA,CAAA;AAAA,KACN,CAAA;AAGA,IAAA,MAAM,eAAe,MAAM;AAC1B,MAAA,IAAI,CAAC,WAAA,CAAY,KAAS,IAAA,CAAC,eAAgB,CAAA,KAAA;AAAO,QAAA,OAAA;AAGlD,MAAM,MAAA,SAAA,GAAY,IAAI,UAAA,CAAW,OAAS,EAAA;AAAA,QACzC,MAAA,EAAQ,CAAC,cAAe,CAAA,KAAA;AAAA;AAAA,QACxB,OAAS,EAAA,IAAA;AAAA,QACT,UAAY,EAAA,IAAA;AAAA,OACZ,CAAA,CAAA;AAGD,MAAA,WAAA,CAAY,SAAS,CAAA,CAAA;AAAA,KACtB,CAAA;AAGA,IAAA,MAAM,gBAAgB,MAAM;AAC3B,MAAA,IAAI,CAAC,YAAA,CAAa,KAAS,IAAA,CAAC,eAAgB,CAAA,KAAA;AAAO,QAAA,OAAA;AAGnD,MAAM,MAAA,SAAA,GAAY,IAAI,UAAA,CAAW,OAAS,EAAA;AAAA,QACzC,QAAQ,cAAe,CAAA,KAAA;AAAA;AAAA,QACvB,OAAS,EAAA,IAAA;AAAA,QACT,UAAY,EAAA,IAAA;AAAA,OACZ,CAAA,CAAA;AAGD,MAAA,WAAA,CAAY,SAAS,CAAA,CAAA;AAAA,KACtB,CAAA;AAEA,IAAM,MAAA,WAAA,GAAc,CAAC,EAAe,KAAA;AACnC,MAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AAAA,KAClB,CAAA;AAEA,IAAA,MAAM,OAAO,MAAM;AAClB,MAAA,IAAI,MAAM,IAAS,KAAA,aAAA,IAAiB,KAAM,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AAC9D,QAAA,MAAM,OAAO,KAAM,CAAA,QAAA,CAAA;AACnB,QAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAU,KAAA;AAC7B,UAAM,KAAA,CAAA,qBAAA,EAAuB,MAAM,KAAK,CAAA,CAAA;AAAA,SACxC,CAAA,CAAA;AAAA,OACF;AAAA,KACD,CAAA;AAEA,IAAAC,aAAA,CAAU,MAAM;AACf,MAAA,IAAI,gBAAgB,KAAO,EAAA;AAE1B,QAAA,eAAA,CAAgB,MAAM,gBAAiB,CAAA,OAAA,EAAS,cAAc,EAAE,OAAA,EAAS,OAAO,CAAA,CAAA;AAAA,OACjF;AACA,MAAK,IAAA,EAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAED,IAAAC,eAAA,CAAY,MAAM;AACjB,MAAA,IAAI,gBAAgB,KAAO,EAAA;AAC1B,QAAgB,eAAA,CAAA,KAAA,CAAM,mBAAoB,CAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AAAA,OAChE;AAAA,KACA,CAAA,CAAA;;4BA9IA,EAAAC,sBAAA,CAqBM,OAAA,EArBD,KAAA,EAAM,gBAAc,EAAA;AAAA,QACxBC,sBAAA;AAAA,UAKM,KAAA;AAAA,UAAA;AAAA,mBALG,EAAA,iBAAA;AAAA,YAAJ,GAAI,EAAA,eAAA;AAAA,YAAkB,KAAM,EAAA,qBAAA;AAAA;;aAChCC,aAAA,CAAA,IAAA,CAAA,EAAAF,sBAAA;AAAA,cAGWG,YAAA;AAAA,cAHuB,IAAA;AAAA,cAAAC,cAAA,CAAA,OAAA,CAAA,QAAhB,EAAA,CAAA,MAAM,KAAK,KAAA;;;;oBAAqB,KAAA,IAAK,CAAA,EAAA;AAAA;;oBACrC,IAAA,CAAK,SAAS,QAAQ,CAAA,OAAA,sBAAvCC,gBAA2HC,iBAAA,EAAA;AAAA;sBAAxE,IAAA;AAAA,sBAAa,KAAA;AAAA,sBAAe,aAAW,OAAQ,CAAA,QAAA;AAAA,sBAAG,OAAO,EAAA,WAAA;AAAA,mFAC5G,EAAAD,eAAA,CAAyFE,eAAA,EAAA;AAAA;sBAAxE,IAAA;AAAA,sBAAa,KAAA;AAAA,sBAAe,aAAW,OAAQ,CAAA,QAAA;AAAA,sBAAG,OAAO,EAAA,WAAA;AAAA;;;;;;;;;;;;;0BAG5E,CAAAN,sBAAA;AAAA,UAMM,KAAA;AAAA,UAAA,EANqB,OAAM,wBAAwB,EAAA;AAAA,UAAA;AAAA,YACxDA,uBAIM,KAAA,EAAA;AAAA,cAJD,KAAM,EAAA,kBAAA;AAAA,cAAoB,OAAO,EAAA,aAAA;AAAA;8BACrC,EAAAD,sBAAA,CAEM,KAAA,EAAA;AAAA,gBAFD,KAAM,EAAA,4BAAA;AAAA,gBAA6B,KAAM,EAAA,GAAA;AAAA,gBAAI,MAAO,EAAA,GAAA;AAAA,gBAAI,OAAQ,EAAA,SAAA;AAAA,gBAAU,IAAK,EAAA,MAAA;AAAA;gBACnFC,uBAAoO,MAAA,EAAA;AAAA,kBAA9N,WAAU,EAAA,SAAA;AAAA,kBAAU,WAAU,EAAA,SAAA;AAAA,kBAAU,CAAE,EAAA,kKAAA;AAAA,kBAAmK,IAAK,EAAA,SAAA;AAAA;;;;;;;oBAH9M,EAAA,YAAA,CAAY,KAAA,CAAA;AAAA;0BAOzB,CAAAA,sBAAA;AAAA,UAMM,KAAA;AAAA,UAAA,EANoB,OAAM,uBAAuB,EAAA;AAAA,UAAA;AAAA,YACtDA,uBAIM,KAAA,EAAA;AAAA,cAJD,KAAM,EAAA,kBAAA;AAAA,cAAoB,OAAO,EAAA,YAAA;AAAA;8BACrC,EAAAD,sBAAA,CAEM,KAAA,EAAA;AAAA,gBAFD,KAAM,EAAA,4BAAA;AAAA,gBAA6B,KAAM,EAAA,GAAA;AAAA,gBAAI,MAAO,EAAA,GAAA;AAAA,gBAAI,OAAQ,EAAA,SAAA;AAAA,gBAAU,IAAK,EAAA,MAAA;AAAA;gBACnFC,uBAAoO,MAAA,EAAA;AAAA,kBAA9N,WAAU,EAAA,SAAA;AAAA,kBAAU,WAAU,EAAA,SAAA;AAAA,kBAAU,CAAE,EAAA,kKAAA;AAAA,kBAAmK,IAAK,EAAA,SAAA;AAAA;;;;;;;oBAH9M,EAAA,WAAA,CAAW,KAAA,CAAA;AAAA;;;;;;;;"}
|
|
@@ -44,14 +44,14 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
44
44
|
vue.createElementVNode(
|
|
45
45
|
"div",
|
|
46
46
|
{ class: "file-name" },
|
|
47
|
-
vue.toDisplayString(
|
|
47
|
+
vue.toDisplayString(__props.item.fileName || "\u672A\u77E5\u6587\u4EF6"),
|
|
48
48
|
1
|
|
49
49
|
/* TEXT */
|
|
50
50
|
),
|
|
51
51
|
vue.createElementVNode(
|
|
52
52
|
"div",
|
|
53
53
|
{ class: "file-size" },
|
|
54
|
-
vue.toDisplayString(formatFileSize(
|
|
54
|
+
vue.toDisplayString(formatFileSize(__props.item.fileSize)),
|
|
55
55
|
1
|
|
56
56
|
/* TEXT */
|
|
57
57
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/FileView.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'FileView' });\n</script>\n<template>\n <div class=\"file-view\" @click=\"handleFileClick\">\n <img src=\"../img/file.png\" alt=\"文件图标\" class=\"file-icon\" />\n <div class=\"file-info\">\n <div class=\"file-name\">{{ item.fileName || '未知文件' }}</div>\n <div class=\"file-size\">{{ formatFileSize(item.fileSize) }}</div>\n </div>\n <!-- <div class=\"file-action\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n </div> -->\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n// import type { ChatMessage } from '../src/AiChat/TouchChat.vue';\ninterface ChatMessage {\n chatId?: string;\n user: string;\n type: string;\n content: string;\n isChating?: boolean;\n thinkContent?: string;\n reasoningContent?: string;\n isLiked?: boolean;\n isDisliked?: boolean;\n isEditing?: boolean;\n editContent?: string;\n componentName?: string;\n thinkStatus?: 'thinking' | 'completed' | 'stopped';\n thinkStartTime?: number;\n thinkTime?: number;\n [key: string]: unknown;\n}\n\n;\n\nconst props = defineProps<{\n item: ChatMessage & { fileName?: string; fileSize?: number };\n index: number;\n}>();\n\nconst emit = defineEmits<{\n (e: 'fileClick', fileName: string, index: number): void;\n}>();\n\n// 格式化文件大小\nconst formatFileSize = (size?: number): string => {\n if (!size) return '未知大小';\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n};\n\n// 处理文件点击事件\nconst handleFileClick = () => {\n if (props.item.fileName) {\n emit('fileClick', props.item.fileName, props.index);\n }\n};\n</script>\n\n<!-- <style scoped lang=\"less\">\n@import './style/FileView.less';\n</style> -->\n"],"names":["DO_defineComponent","_createElementBlock","_createElementVNode","_imports_0","
|
|
1
|
+
{"version":3,"file":"FileView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/FileView.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'FileView' });\n</script>\n<template>\n <div class=\"file-view\" @click=\"handleFileClick\">\n <img src=\"../img/file.png\" alt=\"文件图标\" class=\"file-icon\" />\n <div class=\"file-info\">\n <div class=\"file-name\">{{ item.fileName || '未知文件' }}</div>\n <div class=\"file-size\">{{ formatFileSize(item.fileSize) }}</div>\n </div>\n <!-- <div class=\"file-action\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n </div> -->\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n// import type { ChatMessage } from '../src/AiChat/TouchChat.vue';\ninterface ChatMessage {\n chatId?: string;\n user: string;\n type: string;\n content: string;\n isChating?: boolean;\n thinkContent?: string;\n reasoningContent?: string;\n isLiked?: boolean;\n isDisliked?: boolean;\n isEditing?: boolean;\n editContent?: string;\n componentName?: string;\n thinkStatus?: 'thinking' | 'completed' | 'stopped';\n thinkStartTime?: number;\n thinkTime?: number;\n [key: string]: unknown;\n}\n\n;\n\nconst props = defineProps<{\n item: ChatMessage & { fileName?: string; fileSize?: number };\n index: number;\n}>();\n\nconst emit = defineEmits<{\n (e: 'fileClick', fileName: string, index: number): void;\n}>();\n\n// 格式化文件大小\nconst formatFileSize = (size?: number): string => {\n if (!size) return '未知大小';\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n};\n\n// 处理文件点击事件\nconst handleFileClick = () => {\n if (props.item.fileName) {\n emit('fileClick', props.item.fileName, props.index);\n }\n};\n</script>\n\n<!-- <style scoped lang=\"less\">\n@import './style/FileView.less';\n</style> -->\n"],"names":["DO_defineComponent","_createElementBlock","_createElementVNode","_imports_0","_toDisplayString","_createCommentVNode"],"mappings":";;;;;;;AAEA,MAAA,WAA6B,GAAAA,mBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA,CAAA;;;;;;;;;AA0CpE,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAKd,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAKb,IAAM,MAAA,cAAA,GAAiB,CAAC,IAA0B,KAAA;AAChD,MAAA,IAAI,CAAC,IAAA;AAAM,QAAO,OAAA,0BAAA,CAAA;AAClB,MAAA,IAAI,IAAO,GAAA,IAAA;AAAM,QAAA,OAAO,CAAG,EAAA,IAAA,CAAA,EAAA,CAAA,CAAA;AAC3B,MAAA,IAAI,OAAO,IAAO,GAAA,IAAA;AAAM,QAAA,OAAO,CAAI,EAAA,CAAA,IAAA,GAAO,IAAM,EAAA,OAAA,CAAQ,CAAC,CAAA,CAAA,GAAA,CAAA,CAAA;AACzD,MAAA,OAAO,CAAI,EAAA,CAAA,IAAA,IAAQ,IAAO,GAAA,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA,CAAA,GAAA,CAAA,CAAA;AAAA,KAC5C,CAAA;AAGA,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAI,IAAA,KAAA,CAAM,KAAK,QAAU,EAAA;AACvB,QAAA,IAAA,CAAK,WAAa,EAAA,KAAA,CAAM,IAAK,CAAA,QAAA,EAAU,MAAM,KAAK,CAAA,CAAA;AAAA,OACpD;AAAA,KACF,CAAA;;4BA7DE,EAAAC,sBAAA,CAaM,KAAA,EAAA;AAAA,QAbD,KAAM,EAAA,WAAA;AAAA,QAAa,OAAO,EAAA,eAAA;AAAA;QAC7BC,uBAA0D,KAAA,EAAA;AAAA,UAArD,GAAA,EAAAC,YAAA;AAAA,UAAsB,GAAI,EAAA,0BAAA;AAAA,UAAO,KAAM,EAAA,WAAA;AAAA;QAC5CD,sBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,aAAW,EAAA;AAAA,UACpBA,sBAAA;AAAA,YAA0D,KAAA;AAAA,cAArD,OAAM,WAAe,EAAA;AAAA,YAAAE,mBAAA,CAAA,OAAA,CAAA,IAAK,CAAA,QAAA,IAAQ,0BAAA,CAAA;AAAA,YAAA,CAAA;AAAA;AAAA,WAAA;AAAA,UACvCF,sBAAA;AAAA,YAAgE,KAAA;AAAA,YAAA,EAA3D,OAAM;+BAAe,CAAA,cAAA,CAAe,OAAI,CAAA,IAAA,CAAC,QAAQ,CAAA,CAAA;AAAA,YAAA,CAAA;AAAA;AAAA,WAAA;AAAA;QAExDG,uBAMU,yXAAA,CAAA;AAAA;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HelloChat.vue2.js","sources":["../../../../../../packages/components/touchchat/component/HelloChat.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'HelloChat' });\n</script>\n<template>\n\t<div>\n\t\t<div class=\"hello-chat\">\n\t\t\t<p class=\"title\">你好,我是 touchchat</p>\n\t\t\t<p class=\"sub-info\">作为您的智能伙伴,我既能帮您查账单、办业务,又能陪您聊天、学知识。</p>\n\t\t</div>\n\t\t<div v-if=\"helloChatList.length\" class=\"function-buttons\">\n\t\t\t<ul>\n\t\t\t\t<li v-for=\"item in helloChatList\" :key=\"item.id\" @click=\"handleItemClick(item)\">\n\t\t\t\t\t<img src=\"../../touchchat/img/icon.png\" alt=\"{{ item.name }}\" class=\"icon\" />\n\t\t\t\t\t<span class=\"ellipsis-text\">{{ item.name }}</span>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject } from 'vue'\n\n\n// 定义接口来描述helloChatList中项的结构\ninterface HelloChatItem {\n\tid: number\n\tname: string\n\t// 可以根据实际情况添加其他属性\n}\n\n// 为注入的helloChatList指定类型\nconst helloChatList = inject<HelloChatItem[]>('helloChatList', [])\n\nconst emit = defineEmits(['sendMessage'])\n\nconst handleItemClick = (item: HelloChatItem) => {\n\temit('sendMessage', item)\n}\n</script>\n\n<!-- <style scoped lang=\"less\">\n@import './style/HelloChat.less';\n</style> -->\n"],"names":["DO_defineComponent","inject","_createElementBlock","_createElementVNode","_unref","_Fragment","_renderList","_imports_0","_toDisplayString"],"mappings":";;;;;;;AAEA,MAAA,WAA6B,GAAAA,mBAAA,CAAmB,EAAE,IAAA,EAAM,aAAa,CAAA,CAAA;;;;;AA+BrE,IAAA,MAAM,aAAgB,GAAAC,UAAA,CAAwB,eAAiB,EAAA,EAAE,CAAA,CAAA;AAEjE,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAEb,IAAM,MAAA,eAAA,GAAkB,CAAC,IAAwB,KAAA;AAChD,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA,CAAA;AAAA,KACzB,CAAA;;8BAlCCC,sBAaM,CAAA,KAAA,EAAA,IAAA,EAAA;AAAA,QAZLC,sBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,cAAY,EAAA;AAAA,UACtBA,uBAAoC,GAAjC,EAAA,EAAA,KAAM,EAAA,OAAA,IAAQ,0CAAe,CAAA;AAAA,UAChCA,uBAAyD,GAAtD,EAAA,EAAA,KAAM,EAAA,UAAA,IAAW,wMAAiC,CAAA;AAAA;QAE3CC,UAAA,aAAA,CAAA,CAAc,2BAAzBF,uBAOM,KAAA,EAAA;AAAA;UAP2B,KAAM,EAAA,kBAAA;AAAA;UACtCC,sBAAA,CAKK,MAAA,IAAA,EAAA;AAAA,gCAJJ,EAAAD,sBAAA;AAAA,cAGKG,YAAA;AAAA,cAAA,IAAA;AAAA,cAAAC,cAHc,CAAAF,SAAA,CAAa,aAAA,CAAA,EAAA,CAArB,IAAI,KAAA;sCAAf,EAAAF,sBAAA,CAGK,IAAA,EAAA;AAAA,kBAH8B,KAAK,IAAK,CAAA,EAAA;AAAA,kBAAK,OAAK,EAAA,CAAA,MAAE,KAAA,eAAA,CAAgB,IAAI,CAAA;AAAA;kBAC5EC,uBAA6E,KAAA,EAAA;AAAA,oBAAxE,GAAA,EAAAI,YAAA;AAAA,oBAAmC,GAAI,EAAA,iBAAA;AAAA,oBAAkB,KAAM,EAAA,MAAA;AAAA;kBACpEJ,sBAAA;AAAA,oBAAkD,MAAA;AAAA,sBAA5C,OAAM,eAAmB,EAAA;AAAA,oBAAAK,mBAAA,CAAA,KAAK,IAAI,CAAA;AAAA,oBAAA,CAAA;AAAA;AAAA,mBAAA;AAAA;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"HelloChat.vue2.js","sources":["../../../../../../packages/components/touchchat/component/HelloChat.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'HelloChat' });\n</script>\n<template>\r\n\t<div>\r\n\t\t<div class=\"hello-chat\">\r\n\t\t\t<p class=\"title\">你好,我是 touchchat</p>\r\n\t\t\t<p class=\"sub-info\">作为您的智能伙伴,我既能帮您查账单、办业务,又能陪您聊天、学知识。</p>\r\n\t\t</div>\r\n\t\t<div v-if=\"helloChatList.length\" class=\"function-buttons\">\r\n\t\t\t<ul>\r\n\t\t\t\t<li v-for=\"item in helloChatList\" :key=\"item.id\" @click=\"handleItemClick(item)\">\r\n\t\t\t\t\t<img src=\"../../touchchat/img/icon.png\" alt=\"{{ item.name }}\" class=\"icon\" />\r\n\t\t\t\t\t<span class=\"ellipsis-text\">{{ item.name }}</span>\r\n\t\t\t\t</li>\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject } from 'vue'\r\n\r\n\r\n// 定义接口来描述helloChatList中项的结构\r\ninterface HelloChatItem {\r\n\tid: number\r\n\tname: string\r\n\t// 可以根据实际情况添加其他属性\r\n}\r\n\r\n// 为注入的helloChatList指定类型\r\nconst helloChatList = inject<HelloChatItem[]>('helloChatList', [])\r\n\r\nconst emit = defineEmits(['sendMessage'])\r\n\r\nconst handleItemClick = (item: HelloChatItem) => {\r\n\temit('sendMessage', item)\r\n}\r\n</script>\r\n\r\n<!-- <style scoped lang=\"less\">\r\n@import './style/HelloChat.less';\r\n</style> -->\r\n"],"names":["DO_defineComponent","inject","_createElementBlock","_createElementVNode","_unref","_Fragment","_renderList","_imports_0","_toDisplayString"],"mappings":";;;;;;;AAEA,MAAA,WAA6B,GAAAA,mBAAA,CAAmB,EAAE,IAAA,EAAM,aAAa,CAAA,CAAA;;;;;AA+BrE,IAAA,MAAM,aAAgB,GAAAC,UAAA,CAAwB,eAAiB,EAAA,EAAE,CAAA,CAAA;AAEjE,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAEb,IAAM,MAAA,eAAA,GAAkB,CAAC,IAAwB,KAAA;AAChD,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA,CAAA;AAAA,KACzB,CAAA;;8BAlCCC,sBAaM,CAAA,KAAA,EAAA,IAAA,EAAA;AAAA,QAZLC,sBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,cAAY,EAAA;AAAA,UACtBA,uBAAoC,GAAjC,EAAA,EAAA,KAAM,EAAA,OAAA,IAAQ,0CAAe,CAAA;AAAA,UAChCA,uBAAyD,GAAtD,EAAA,EAAA,KAAM,EAAA,UAAA,IAAW,wMAAiC,CAAA;AAAA;QAE3CC,UAAA,aAAA,CAAA,CAAc,2BAAzBF,uBAOM,KAAA,EAAA;AAAA;UAP2B,KAAM,EAAA,kBAAA;AAAA;UACtCC,sBAAA,CAKK,MAAA,IAAA,EAAA;AAAA,gCAJJ,EAAAD,sBAAA;AAAA,cAGKG,YAAA;AAAA,cAAA,IAAA;AAAA,cAAAC,cAHc,CAAAF,SAAA,CAAa,aAAA,CAAA,EAAA,CAArB,IAAI,KAAA;sCAAf,EAAAF,sBAAA,CAGK,IAAA,EAAA;AAAA,kBAH8B,KAAK,IAAK,CAAA,EAAA;AAAA,kBAAK,OAAK,EAAA,CAAA,MAAE,KAAA,eAAA,CAAgB,IAAI,CAAA;AAAA;kBAC5EC,uBAA6E,KAAA,EAAA;AAAA,oBAAxE,GAAA,EAAAI,YAAA;AAAA,oBAAmC,GAAI,EAAA,iBAAA;AAAA,oBAAkB,KAAM,EAAA,MAAA;AAAA;kBACpEJ,sBAAA;AAAA,oBAAkD,MAAA;AAAA,sBAA5C,OAAM,eAAmB,EAAA;AAAA,oBAAAK,mBAAA,CAAA,KAAK,IAAI,CAAA;AAAA,oBAAA,CAAA;AAAA;AAAA,mBAAA;AAAA;;;;;;;;;;;;;;"}
|
|
@@ -39,14 +39,14 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
39
39
|
return vue.openBlock(), vue.createElementBlock("div", { class: "image-file" }, [
|
|
40
40
|
vue.createElementVNode("div", { class: "image-file-content" }, [
|
|
41
41
|
vue.createElementVNode("img", {
|
|
42
|
-
src: (_a =
|
|
42
|
+
src: (_a = __props.item.base64) != null ? _a : "../img/link.png",
|
|
43
43
|
alt: "\u56FE\u7247",
|
|
44
44
|
onClick: ($event) => showPreview.value = true
|
|
45
45
|
}, null, 8, ["src", "onClick"]),
|
|
46
|
-
!(showLoading.value ||
|
|
46
|
+
!(showLoading.value || __props.item.uploadError) && __props.hasColse ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
47
47
|
key: 0,
|
|
48
48
|
class: "image-file-colse",
|
|
49
|
-
onClick: ($event) => emits("colse",
|
|
49
|
+
onClick: ($event) => emits("colse", __props.item.id)
|
|
50
50
|
}, [
|
|
51
51
|
(vue.openBlock(), vue.createElementBlock("svg", {
|
|
52
52
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -61,7 +61,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
61
61
|
})
|
|
62
62
|
]))
|
|
63
63
|
], 8, ["onClick"])) : vue.createCommentVNode("v-if", true),
|
|
64
|
-
showLoading.value && !
|
|
64
|
+
showLoading.value && !__props.item.uploadError ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
65
65
|
key: 1,
|
|
66
66
|
class: "img-file-loading"
|
|
67
67
|
}, [
|
|
@@ -114,7 +114,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
114
114
|
/* TEXT */
|
|
115
115
|
)
|
|
116
116
|
])) : vue.createCommentVNode("v-if", true),
|
|
117
|
-
|
|
117
|
+
__props.item.uploadError ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
118
118
|
key: 2,
|
|
119
119
|
class: "img-file-loading img-error-loading",
|
|
120
120
|
onClick: handleReset
|
|
@@ -150,7 +150,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
150
150
|
}, [
|
|
151
151
|
vue.createElementVNode("div", { class: "image-preview-content" }, [
|
|
152
152
|
vue.createElementVNode("img", {
|
|
153
|
-
src: (_b =
|
|
153
|
+
src: (_b = __props.item.base64) != null ? _b : "../img/link.png",
|
|
154
154
|
alt: "\u9884\u89C8\u56FE\u7247"
|
|
155
155
|
}, null, 8, ["src"])
|
|
156
156
|
])
|