@deep-eye/core 0.9.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/README.md +140 -86
  3. package/dist/components/chat/ChatBot.vue.d.ts +48 -17
  4. package/dist/components/chat/ChatBot.vue.d.ts.map +1 -1
  5. package/dist/components/chat/attachmentController.d.ts +25 -0
  6. package/dist/components/chat/attachmentController.d.ts.map +1 -0
  7. package/dist/components/chat/attachments.d.ts +12 -0
  8. package/dist/components/chat/attachments.d.ts.map +1 -0
  9. package/dist/components/chat/chatContext.d.ts +14 -0
  10. package/dist/components/chat/chatContext.d.ts.map +1 -0
  11. package/dist/components/chat/chatErrors.d.ts +16 -0
  12. package/dist/components/chat/chatErrors.d.ts.map +1 -0
  13. package/dist/components/chat/chatQueue.d.ts +6 -0
  14. package/dist/components/chat/chatQueue.d.ts.map +1 -0
  15. package/dist/components/chat/components/ArtifactPreview.vue.d.ts +15 -0
  16. package/dist/components/chat/components/ArtifactPreview.vue.d.ts.map +1 -0
  17. package/dist/components/chat/components/ChatActionbar.vue.d.ts +3 -3
  18. package/dist/components/chat/components/ChatActionbar.vue.d.ts.map +1 -1
  19. package/dist/components/chat/components/ChatAttachments.vue.d.ts +12 -0
  20. package/dist/components/chat/components/ChatAttachments.vue.d.ts.map +1 -0
  21. package/dist/components/chat/components/ChatFilePreview.vue.d.ts +45 -0
  22. package/dist/components/chat/components/ChatFilePreview.vue.d.ts.map +1 -0
  23. package/dist/components/chat/components/ChatFilePreviewPanel.vue.d.ts +24 -0
  24. package/dist/components/chat/components/ChatFilePreviewPanel.vue.d.ts.map +1 -0
  25. package/dist/components/chat/components/ChatImageLightbox.vue.d.ts +16 -0
  26. package/dist/components/chat/components/ChatImageLightbox.vue.d.ts.map +1 -0
  27. package/dist/components/chat/components/ChatMediaPreview.vue.d.ts +9 -0
  28. package/dist/components/chat/components/ChatMediaPreview.vue.d.ts.map +1 -0
  29. package/dist/components/chat/components/ChatMessage.vue.d.ts +43 -2
  30. package/dist/components/chat/components/ChatMessage.vue.d.ts.map +1 -1
  31. package/dist/components/chat/components/ChatOfficePreview.vue.d.ts +9 -0
  32. package/dist/components/chat/components/ChatOfficePreview.vue.d.ts.map +1 -0
  33. package/dist/components/chat/components/ChatProvider.vue.d.ts +73 -0
  34. package/dist/components/chat/components/ChatProvider.vue.d.ts.map +1 -0
  35. package/dist/components/chat/components/ChatQueue.vue.d.ts +16 -0
  36. package/dist/components/chat/components/ChatQueue.vue.d.ts.map +1 -0
  37. package/dist/components/chat/components/ChatReasoning.vue.d.ts +21 -0
  38. package/dist/components/chat/components/ChatReasoning.vue.d.ts.map +1 -0
  39. package/dist/components/chat/components/ChatSender.vue.d.ts +34 -17
  40. package/dist/components/chat/components/ChatSender.vue.d.ts.map +1 -1
  41. package/dist/components/chat/components/ChatSidebarResizeHandle.vue.d.ts +13 -0
  42. package/dist/components/chat/components/ChatSidebarResizeHandle.vue.d.ts.map +1 -0
  43. package/dist/components/chat/components/ChatToolGroup.vue.d.ts +28 -0
  44. package/dist/components/chat/components/ChatToolGroup.vue.d.ts.map +1 -0
  45. package/dist/components/chat/components/ConversationList.vue.d.ts +129 -0
  46. package/dist/components/chat/components/ConversationList.vue.d.ts.map +1 -0
  47. package/dist/components/chat/components/InputContentParts.vue.d.ts +8 -0
  48. package/dist/components/chat/components/InputContentParts.vue.d.ts.map +1 -0
  49. package/dist/components/chat/components/MessageBubble.vue.d.ts +43 -2
  50. package/dist/components/chat/components/MessageBubble.vue.d.ts.map +1 -1
  51. package/dist/components/chat/components/TextPartRenderer.vue.d.ts.map +1 -1
  52. package/dist/components/chat/components/ToolCallPart.vue.d.ts +12 -3
  53. package/dist/components/chat/components/ToolCallPart.vue.d.ts.map +1 -1
  54. package/dist/components/chat/components/index.d.ts +9 -0
  55. package/dist/components/chat/components/index.d.ts.map +1 -1
  56. package/dist/components/chat/composables/index.d.ts +0 -1
  57. package/dist/components/chat/composables/index.d.ts.map +1 -1
  58. package/dist/components/chat/composables/useChatVoice.d.ts +45 -0
  59. package/dist/components/chat/composables/useChatVoice.d.ts.map +1 -0
  60. package/dist/components/chat/composables/useConversation.d.ts +1 -5
  61. package/dist/components/chat/composables/useConversation.d.ts.map +1 -1
  62. package/dist/components/chat/composables/useMeasuredHeight.d.ts +11 -0
  63. package/dist/components/chat/composables/useMeasuredHeight.d.ts.map +1 -0
  64. package/dist/components/chat/composables/useStreamSmoothing.d.ts +13 -0
  65. package/dist/components/chat/composables/useStreamSmoothing.d.ts.map +1 -0
  66. package/dist/components/chat/index.d.ts +12 -4
  67. package/dist/components/chat/index.d.ts.map +1 -1
  68. package/dist/components/chat/mdoc/ContentNodes.vue.d.ts.map +1 -1
  69. package/dist/components/chat/mdoc/MediaImageStack.vue.d.ts.map +1 -1
  70. package/dist/components/chat/previewRenderers.d.ts +6 -0
  71. package/dist/components/chat/previewRenderers.d.ts.map +1 -0
  72. package/dist/components/chat/qiniuUpload.d.ts +10 -0
  73. package/dist/components/chat/qiniuUpload.d.ts.map +1 -0
  74. package/dist/components/chat/responseStream.d.ts +17 -0
  75. package/dist/components/chat/responseStream.d.ts.map +1 -0
  76. package/dist/components/chat/toolLabels.d.ts +4 -0
  77. package/dist/components/chat/toolLabels.d.ts.map +1 -0
  78. package/dist/components/chat/toolStatus.d.ts +16 -0
  79. package/dist/components/chat/toolStatus.d.ts.map +1 -0
  80. package/dist/components/chat/types.d.ts +457 -144
  81. package/dist/components/chat/types.d.ts.map +1 -1
  82. package/dist/components/visualization/types.d.ts +8 -7
  83. package/dist/components/visualization/types.d.ts.map +1 -1
  84. package/dist/components/visualization/utils.d.ts +4 -2
  85. package/dist/components/visualization/utils.d.ts.map +1 -1
  86. package/dist/composables/useMindMapTheme.d.ts +4 -7
  87. package/dist/composables/useMindMapTheme.d.ts.map +1 -1
  88. package/dist/errors-CHzikrqu.js +70 -0
  89. package/dist/errors-upLl4kf2.cjs +1 -0
  90. package/dist/index-B4hgICk-.cjs +198 -0
  91. package/dist/index-BJdNN1GV.cjs +33 -0
  92. package/dist/index-Bj9h-xEr.cjs +112 -0
  93. package/dist/index-BufnUXnQ.js +5071 -0
  94. package/dist/index-CnxZBHPD.js +42825 -0
  95. package/dist/index-DF8KmkKX.js +38392 -0
  96. package/dist/index-DPhuLMkO.cjs +1 -0
  97. package/dist/index-Dq4cniDm.cjs +5 -0
  98. package/dist/index-cW_BnxHR.js +1722 -0
  99. package/dist/index-iCVvFIlX.js +28 -0
  100. package/dist/index.cjs +275 -49
  101. package/dist/index.js +18895 -8273
  102. package/dist/media-community-skin-Djo8L1G9.js +302 -0
  103. package/dist/media-community-skin-YI6NjsJg.cjs +1 -0
  104. package/dist/media-core-CkW37AYl.js +3827 -0
  105. package/dist/media-core-Rxz2MNwG.cjs +1 -0
  106. package/dist/media-outlet-CZTh6XmJ.cjs +1 -0
  107. package/dist/media-outlet-D2rcuhYN.js +2 -0
  108. package/dist/media-player-BZrIM0O_.js +387 -0
  109. package/dist/media-player-D_USOhtK.cjs +1 -0
  110. package/dist/media-ui-DfPbRfFS.js +2832 -0
  111. package/dist/media-ui-zZVnK1ts.cjs +1 -0
  112. package/dist/prod-Ba2x-T01.cjs +4 -0
  113. package/dist/prod-DBMM0zDd.js +992 -0
  114. package/dist/provider-B7wAEcCR.js +163 -0
  115. package/dist/provider-BPphQwpc.cjs +1 -0
  116. package/dist/provider-BSeBwvzM.cjs +1 -0
  117. package/dist/provider-DgSZc2dM.js +162 -0
  118. package/dist/provider-EKFFiZS1.js +27 -0
  119. package/dist/provider-O8r0RFmF.cjs +1 -0
  120. package/dist/provider-WrRdjcjY.js +483 -0
  121. package/dist/provider-sqICX3H9.cjs +1 -0
  122. package/dist/srt-parser-BECMkbXb.cjs +2 -0
  123. package/dist/srt-parser-BR28Llpk.js +27 -0
  124. package/dist/ssa-parser-BJTK0kd-.js +209 -0
  125. package/dist/ssa-parser-CuKkTpK_.cjs +4 -0
  126. package/dist/style.css +1 -1
  127. package/package.json +8 -2
  128. package/dist/components/chat/AiConversation.vue.d.ts +0 -28
  129. package/dist/components/chat/AiConversation.vue.d.ts.map +0 -1
  130. package/dist/components/chat/components/AssistantTrace.vue.d.ts +0 -27
  131. package/dist/components/chat/components/AssistantTrace.vue.d.ts.map +0 -1
  132. package/dist/components/chat/composables/useConversationStream.d.ts +0 -3
  133. package/dist/components/chat/composables/useConversationStream.d.ts.map +0 -1
  134. package/dist/components/chat/presentation.d.ts +0 -27
  135. package/dist/components/chat/presentation.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,106 @@
2
2
 
3
3
  此文件记录 `@deep-eye/core` 的用户可见变更。新版本采用语义化版本,并按 `Added`、`Changed`、`Fixed`、`Removed` 分类记录。
4
4
 
5
+ ## [1.0.0] - 2026-07-31
6
+
7
+ ### Added
8
+
9
+ - 新增共享侧栏拖拽手柄 `ChatSidebarResizeHandle`:细线 + 胶囊 grip,悬浮淡蓝色高亮,仅在侧栏打开且非全屏展开时显示。
10
+ - 官方文档全面重写:安装引入、Props/事件/插槽、使用示例与全局 FAQ,覆盖 `ChatBot`、`ChatMessage`、`ChatSender`、`D3MindMap` 完整使用链路。
11
+ - 文档示例补充可预览样例 PDF(`/files/q3.pdf`),并按 VitePress `base` 路径解析。
12
+
13
+ ### Changed
14
+
15
+ - 侧栏宽度拖拽改为相对 `ChatBot` 根节点边界计算,嵌入非全屏容器时拖拽跟随指针,不再使用 `window.innerWidth`。
16
+ - 工具调用图标轨道与思维链(`ChatReasoning`)脑图标对齐;同组工具名列宽同步,参数摘要水平对齐。
17
+ - 文档与对外表述统一为企业 Agent Responses 协议,不再使用「火山方舟」措辞。
18
+
19
+ ### Fixed
20
+
21
+ - 修复侧栏拖拽手柄被消息区/`overflow: hidden` 裁切、仅显示一半的问题。
22
+ - 修复文档站点 PDF 预览因缺少 base 前缀与素材文件导致的 Vite 提示页问题。
23
+
24
+ ## [0.11.0] - 2026-07-29
25
+
26
+ ### Added
27
+
28
+ - 新增 `ChatProvider`,统一提供七牛上传配置、只可收紧的附件限制、`ChatTheme`、颜色模式和实例 renderer。
29
+ - 新增七牛 getToken + XHR 直传状态机,支持并发、进度、去重、取消、手动重试和完整响应校验。
30
+ - 新增用户附件区、图片灯箱、可拖拽文件预览侧栏、Vue Office 与 Vidstack 懒加载预览、严格 sandbox HTML 预览。
31
+ - 新增 `ChatReasoning`、`ChatToolGroup`、`ChatQueue`、`ChatFilePreview`、`ChatImageLightbox` 等公开 primitives。
32
+ - 新增受控 `toolStates`、强类型 `tool-action`、工具审批、孤立工具结果警告与 renderer 注册 API。
33
+ - 新增流式消息队列,支持编辑、删除、拖拽/按钮排序以及终态自动出队。
34
+ - `ChatBot` 新增 `consume(Response)` 与 `abort()`,直接消费火山方舟 Responses API 原始 HTTP SSE,并公开 18 种官方事件与完整 `ResponseObject` 类型。
35
+ - 标准 messages 支持 system、user、assistant、tool 四种角色,以及 text、image、video、audio、file 多模态输入。
36
+ - `ConversationStreamStatus` 新增 `incomplete`;失败和异常 EOF 会保留已生成的部分 assistant 内容。
37
+ - 正文、思考区流式输出改用逐帧平滑追赶,避免逐 delta 硬跳;思考区、工具调用结果区展开/收起高度过渡动画化。
38
+ - 新增 `classifyChatError`,将失败归类为 `network`/`timeout`/`api`/`protocol`/`unknown`;`response-error` 事件随原始 `Error` 一并携带分类结果。
39
+ - 用户主动停止(`aborted` 且无 error)时内联展示"已停止生成"状态,与失败态区分。
40
+ - 多个并发工具调用改为扁平连接的时间线(去除嵌套的"执行了 A、B"分组折叠层,修复该分组标题因 `<button>` 默认居中样式导致与下方条目错位的问题),每条工具调用独立展开/折叠,完成态自动收起为单行摘要,视觉上更接近 Cursor/Codex 的工具调用列表。`running` 状态图标由易误读为"卡死转圈"的 spinner 改为随呼吸动画渐隐渐显的实心圆环。
41
+ - 修复工具调用时间线中图标+连接线轨道占用行内布局宽度、导致工具名称文字比同一条消息里的正文文字多缩进约 26px 的问题:轨道改为绝对定位悬挂在内容左侧的空白区域,工具名称与正文文字现在水平起始位置对齐。
42
+ - 修复工具调用展开详情后图标随连接线轨道整体高度垂直居中、与标题错位的问题:连接线改为固定顶部间距 + 弹性底部,图标始终与标题保持同一水平线,与折叠态一致。鼠标悬浮时仅 `tool-call-part__header`(标题行)显示背景色,不再覆盖到左侧图标与整行。
43
+ - 文档新增连续 5 张图片堆叠展示示例(`ChatImageStackDemo`),演示折叠封面、九宫格展开与灯箱浏览。
44
+ - `ChatSender` 新增 `quickActions`/`v-model:active-quick-action`,在 `+` 图标后可扩展一排快捷功能按钮,选中后收起为可移除的模式标签并联动占位符(豆包式交互);模式标签的关闭按钮点击区域由 18px 增大到 22px,图标同步放大,避免误触/难以点击。
45
+
46
+ ### Changed
47
+
48
+ - `ChatBot@send` 改为单一 `ChatSendPayload`;user 消息强制包含 `resource_files`,附件模型输入与持久化字段彻底分离。
49
+ - `ChatSender` 改用可选 `v-model:draft` 与 `v-model:attachments`,流式时同时显示发送与停止操作。
50
+ - assistant 固定按思考、工具组、最终正文渲染;思考区尊重用户手动展开选择。
51
+ - 侧栏桌面默认宽度改为 42%,限制在 360px 至视口 72%,移动端使用全屏预览。
52
+ - 默认消息操作栏只保留复制,错误以 assistant 内联状态显示并提供重试事件。
53
+ - 一个 Responses 流统一聚合为一条 assistant 消息;正文、思考和 function call delta 立即显示,done 与终态 Response 权威校准结果。
54
+ - `useConversation` 简化为 `appendMessage`、`setMessages` 与 `reset`。
55
+ - Playground、README 与组件文档在原有富文本、工具、工件和表单示例上改用 Responses SSE。
56
+
57
+ ### Fixed
58
+
59
+ - 兼容 `response.reasoning_summary_part.added` 中仅包含 `type: "summary_text"`、尚未包含 `text` 的官方事件序列。
60
+ - 连续图片堆叠(`MediaImageStack`)折叠态的背景层不再向容器外溢出,避免遮挡上方消息文字。
61
+
62
+ ### Removed
63
+
64
+ - 正文流式输出移除逐字闪烁的光标块,仅保留文字自然增长。
65
+ - 移除复制操作栏的自绘 CSS 图标,改用 lucide `Copy`/`Check`/`CircleAlert`。
66
+ - 移除 `ChatSender` 的 `modelValue`、`showToolbar`、`attach` 描述和 `(content, files?)` 发送签名。
67
+ - 移除字符串 HTML 自定义菜单图标、blob 消息持久化与旧的独立 Sender 主题类型。
68
+ - 移除公开的 `AiConversation` 组件导出。
69
+ - 移除公开的 `useConversationStream`、completion/delta 类型、session/resume、event ID、last index 与 `[DONE]` 协议。
70
+ - 移除 assistant 正文中的私有 Turn、`<summary>`、`<think>` 与 `🛠️` 标记解析。
71
+
72
+ ## [0.10.0] - 2026-07-28
73
+
74
+ ### Added
75
+
76
+ - `ChatBot` 新增可完整替换内置输入框的 `#sender`,并透传 `#message`、`#prepend`、`#append`。
77
+ - `AiConversation` 新增消息外壳及列表前后扩展插槽,`ChatMessage` 新增只替换规范化正文的 `#content`。
78
+ - `ConversationMessage` 新增不透明业务扩展字段 `metadata`。
79
+ - `useConversationStream` 新增 `ConversationStreamEvent`、`onEvent`、`initialLastIndex` 和响应式 `lastIndex`。
80
+
81
+ ### Changed
82
+
83
+ - SSE 消费兼容标准 `data:`、`data:data:`、heartbeat、`event: session` 和 `event: end`;只有明确的 DONE 标记会完成,异常 EOF 可由调用方显式续传。
84
+ - 原始 SSE 事件与完整 JSON chunk 会保留未知字段,数字 `lastEventId` 与逻辑 `lastIndex` 独立维护。
85
+
86
+ ### Fixed
87
+
88
+ - 恢复 OpenAI 标准 tool-call delta 类型及按调用索引合并行为。
89
+ - `ChatSender` 在浏览器媒体 API 不可用时安全降级。
90
+
91
+ ## [0.9.1] - 2026-07-28
92
+
93
+ ### Added
94
+
95
+ - `ChatBot` 默认工件侧边栏新增 Preview/Code、复制、下载、展开/收起和关闭操作栏。
96
+
97
+ ### Changed
98
+
99
+ - 工件侧边栏在桌面端与移动端使用更稳定的响应式布局,自定义 `sidebar` 插槽仍可完整替换默认预览。
100
+
101
+ ### Fixed
102
+
103
+ - 工件预览关闭操作恢复为明确的关闭图标与“关闭侧边栏”可访问语义。
104
+
5
105
  ## [0.7.0] - 2026-07-23
6
106
 
7
107
  ### Added
package/README.md CHANGED
@@ -1,148 +1,202 @@
1
1
  # @deep-eye/core
2
2
 
3
- 深瞳前端团队企业级 Vue 3 组件库,提供 AI 会话、思维导图等可视化组件。
3
+ 深瞳前端团队的企业级 Vue 3 组件库,提供 AI 对话(`ChatBot` / `ChatMessage` / `ChatSender`)与可视化思维导图(`D3MindMap`)两类核心能力。
4
+
5
+ ## 环境要求
6
+
7
+ | 依赖 | 最低版本 |
8
+ | ------- | ------------------------------------------- |
9
+ | Node.js | 22.0.0(LTS) |
10
+ | Vue | 3.5.0(peerDependency,需宿主项目自行安装) |
11
+
12
+ 组件库只发布 ES Module 与 CommonJS 两种产物,不提供浏览器 `<script>` 标签可用的 UMD/IIFE 版本,也不支持 `app.use(...)` 整体注册;请通过包管理器安装后使用具名导入。
4
13
 
5
14
  ## 安装
6
15
 
7
16
  ```bash
8
17
  pnpm add @deep-eye/core
18
+ # 或 npm install @deep-eye/core / yarn add @deep-eye/core
9
19
  ```
10
20
 
11
- ## 组件
12
-
13
- ### AI Conversation
14
-
15
- 完整的 AI 会话渲染方案,支持流式输出、多模态内容、用户交互表单等。
21
+ 在应用入口手动引入一次样式(不会被自动注入):
16
22
 
17
- #### AiConversation
23
+ ```ts
24
+ import '@deep-eye/core/style.css'
25
+ ```
18
26
 
19
- 渲染完整的会话列表,内置自动滚动、流式动画和操作栏。
27
+ ## 快速开始:ChatBot
20
28
 
21
29
  ```vue
22
- <script setup lang=”ts”>
30
+ <script setup lang="ts">
23
31
  import { ref } from 'vue'
24
- import {
25
- AiConversation,
26
- type ChatActionbarCopyPayload,
27
- type ConversationMessage,
28
- } from '@deep-eye/core'
29
- import '@deep-eye/core/style.css'
32
+ import { ChatBot } from '@deep-eye/core'
33
+ import type { ChatBotExpose, ChatSendPayload, ConversationMessage } from '@deep-eye/core'
30
34
 
35
+ const chatBotRef = ref<ChatBotExpose>()
31
36
  const messages = ref<ConversationMessage[]>([
32
- { id: 'user-1', role: 'user', content: '你好' },
33
- { id: 'assistant-1', role: 'assistant', content: '你好,有什么可以帮你?' },
37
+ { role: 'assistant', content: '你好,有什么可以帮助你?' },
34
38
  ])
35
39
 
36
- function saveReply(message: ConversationMessage): void {
37
- console.log('保存消息', message)
38
- }
39
-
40
- function onCopy(payload: ChatActionbarCopyPayload): void {
41
- console.log('复制内容', payload.text)
40
+ async function handleSend(payload: ChatSendPayload) {
41
+ // payload.message 已写入 v-model:messages,适合业务持久化。
42
+ // payload.modelInput 是本次请求发给模型的结构化输入。
43
+ const response = await fetch('/api/responses', {
44
+ method: 'POST',
45
+ headers: { 'content-type': 'application/json' },
46
+ body: JSON.stringify({ input: [payload.modelInput], stream: true }),
47
+ })
48
+ await chatBotRef.value?.consume(response)
42
49
  }
43
50
  </script>
44
51
 
45
52
  <template>
46
- <AiConversation :messages=”messages auto-scroll=”smart” @copy=”onCopy”>
47
- <template #assistant-actionbar=”{ message }”>
48
- <button type=”button” @click=”saveReply(message)”>保存</button>
49
- </template>
50
- </AiConversation>
53
+ <ChatBot ref="chatBotRef" v-model:messages="messages" @send="handleSend" style="height: 600px" />
51
54
  </template>
52
55
  ```
53
56
 
54
- 已完成的助手回复会显示默认复制操作。`#assistant-actionbar`、`ChatMessage` `#actionbar` 与 `ChatActionbar` 默认插槽均为追加插槽,不会替换复制操作;流式输出期间不显示操作栏。
57
+ `ChatBot` 直接消费**企业 Agent Responses API** 返回的原始 HTTP SSE `Response` 对象,不接受 completion chunk、`[DONE]`、session/resume 或其他自定义流格式。`consume()` 在 `response.output_text.delta`、reasoning function call 参数到达时立即更新最后一条 assistant 消息;`response.completed.response` / `response.incomplete.response` 作为终态权威结果做一次性校准。
55
58
 
56
- **流式渲染**
59
+ ```ts
60
+ await chatBotRef.value?.consume(response, {
61
+ signal: controller.signal,
62
+ onEvent(event, frame) {
63
+ console.log(event.type, event.sequence_number, frame.raw)
64
+ },
65
+ })
66
+ ```
57
67
 
58
- 将后端的 OpenAI 兼容 `chat.completion.chunk` SSE 响应交给 `useConversationStream().consume(response)`,即可得到可传入 `AiConversation` 的消息列表。渲染会隐藏 `LLM Running`、`🛠️` `<summary>` 运行标记,但不改写原始消息。
68
+ `response.failed`、`error`、未知事件类型、非法序号和异常 EOF 会使 `consume()` 抛出异常,同时保留已收到的部分 assistant 内容;`response.incomplete` 会保留部分内容并正常结束;调用 `abort()` 后流状态变为 `aborted`。
69
+
70
+ ## 标准消息模型
71
+
72
+ ```ts
73
+ import type { ConversationMessage } from '@deep-eye/core'
74
+
75
+ const messages: ConversationMessage[] = [
76
+ { role: 'system', content: '回答要简洁。' },
77
+ { role: 'user', resource_files: [], content: '描述这张图' },
78
+ {
79
+ role: 'assistant',
80
+ reasoning_content: '先识别主体,再概括场景。',
81
+ content: '图片中是一片山谷。',
82
+ tool_calls: [
83
+ {
84
+ id: 'call_1',
85
+ type: 'function',
86
+ function: { name: 'search', arguments: '{"query":"山谷"}' },
87
+ },
88
+ ],
89
+ },
90
+ { role: 'tool', tool_call_id: 'call_1', content: '{"count":3}' },
91
+ ]
92
+ ```
59
93
 
60
- **用户交互表单**
94
+ `user.content` 保存原文,附件通过 `resource_files` 携带;`ChatSendPayload.modelInput` 是发送时临时映射出的模型输入(text / image / video / audio / file parts),不会写入 `messages`。assistant 支持 `content`、`reasoning_content`、`encrypted_content` 与 `tool_calls`;tool 消息通过 `tool_call_id` 关联对应的工具调用。
61
95
 
62
- AskUserForm 使用 `ASK_USER_FORM_SYSTEM_PROMPT`;单选自动提交,多选点击”确认”,`required=false` 可跳过。
96
+ ## 主要组件
63
97
 
64
- #### ChatSender
98
+ | 组件 | 用途 |
99
+ | ------------- | ------------------------------------------------------------------------------------- |
100
+ | `ChatBot` | 完整聊天界面:消息列表、输入框、附件、工具调用、可选工件侧栏,内置 Responses SSE 消费 |
101
+ | `ChatMessage` | 单条标准消息的渲染:富文本、多模态、思考区、工具调用,可脱离 `ChatBot` 独立使用 |
102
+ | `ChatSender` | 独立输入框:草稿、附件上传、截图、语音、快捷功能 |
103
+ | `D3MindMap` | 交互式思维导图:缩放、拖拽、展开折叠、多套内置主题 |
65
104
 
66
- 支持文本输入、文件上传、语音录音和截图的聊天输入框。
105
+ ```vue
106
+ <script setup lang="ts">
107
+ import { ChatMessage } from '@deep-eye/core'
108
+
109
+ const message = {
110
+ role: 'assistant' as const,
111
+ reasoning_content: '正在整理要点。',
112
+ content: '答案支持 **Markdown**、公式和富媒体。',
113
+ }
114
+ </script>
115
+
116
+ <template>
117
+ <ChatMessage :message="message" />
118
+ </template>
119
+ ```
67
120
 
68
121
  ```vue
69
- <script setup lang=”ts”>
122
+ <script setup lang="ts">
70
123
  import { ref } from 'vue'
71
124
  import { ChatSender } from '@deep-eye/core'
72
125
 
73
- const message = ref('')
126
+ const draft = ref('')
127
+ </script>
128
+
129
+ <template>
130
+ <ChatSender v-model:draft="draft" show-attachment @send="(payload) => console.log(payload)" />
131
+ </template>
132
+ ```
133
+
134
+ ```vue
135
+ <script setup lang="ts">
136
+ import { D3MindMap } from '@deep-eye/core'
74
137
 
75
- function handleSend(content: string, files?: File[]) {
76
- console.log('发送消息', content, files)
77
- message.value = ''
138
+ const data = {
139
+ nodeData: {
140
+ id: 'root',
141
+ topic: '组件库',
142
+ root: true,
143
+ children: [{ id: 'chat', topic: 'ChatBot' }],
144
+ },
78
145
  }
79
146
  </script>
80
147
 
81
148
  <template>
82
- <ChatSender
83
- v-model=”message”
84
- :show-screenshot=”true”
85
- placeholder=”输入消息...”
86
- @send=”handleSend”
87
- />
149
+ <D3MindMap :data="data" height="600px" show-toolbar />
88
150
  </template>
89
151
  ```
90
152
 
91
- **文件附件功能**
153
+ assistant `content` 原生支持 GFM、代码高亮、KaTeX 公式、图片/视频/音频,以及组件库定义的 mdoc 标签(工件卡片、Ask Form 表单)。将 `ARTIFACT_BLOCK_SYSTEM_PROMPT` 或 `ASK_USER_FORM_SYSTEM_PROMPT` 加入模型的 system prompt,即可引导模型输出对应语法;`ChatBot` 会自动把 Ask Form 固定在底部 dock,并在点击工件卡片时打开侧边栏预览。
92
154
 
93
- - 支持多文件上传,文件累加而不是替换
94
- - 图片文件显示为 120x120 缩略图卡片
95
- - 非图片文件显示文件名、扩展名标签和大小
96
- - 鼠标悬浮显示删除按钮
155
+ ## 进阶能力
97
156
 
98
- **截图功能**
157
+ 除以上四个主要组件外,`@deep-eye/core` 还导出一组可组合使用的 API,用于更细粒度的定制:
99
158
 
100
- 设置 `show-screenshot` 启用截图选项。使用浏览器原生 `getDisplayMedia` API,支持截取屏幕、窗口或标签页,截图后自动添加到附件列表。
159
+ - **`ChatProvider`**:统一配置上传方式、附件限制、主题、颜色模式与实例级 renderer,作用于内部所有 `ChatBot` 实例。
160
+ - **`ConversationList`**、**`ChatQueue`**:多会话列表与流式消息队列(编辑、删除、排序、终态自动出队)。
161
+ - **`registerToolRenderer`** / **`registerChatPreviewRenderer`**:注册自定义工具调用渲染器与附件预览渲染器。
162
+ - **`useConversation`**:`messages` 数组的本地状态管理(`appendMessage`、`setMessages`、`reset`),不处理网络或 SSE。
163
+ - **`useMindMapTheme`** / **`useMindMapLayout`**:`D3MindMap` 主题与布局的组合式函数。
164
+ - 附件相关工具函数、`classifyChatError` 错误分类等。
101
165
 
102
- **语音录音**
166
+ 这些 API 的完整签名与用法示例见仓库 `packages/docs` 文档站点的「进阶用法」章节。
103
167
 
104
- 内置语音录音功能,支持点击录音和长按录音两种模式,使用 Web Speech API 自动转换为文本。
168
+ ## 主题定制
105
169
 
106
- #### 组件导出
170
+ 组件的 Design Token 默认值已内联在各自根元素的 scoped 样式中,引入 `style.css` 后即可获得正确外观,**不存在**可单独引入的 `tokens.css` 文件。自定义主题时,直接在宿主容器上覆盖同名 CSS 自定义属性:
107
171
 
108
- | 组件 | 用途 |
109
- | ---------------- | --------------------------------------------------------- |
110
- | `AiConversation` | 会话列表、自动滚动、AskUserForm 与 `#assistant-actionbar` |
111
- | `ChatMessage` | 单条 `ConversationMessage`,支持 `#actionbar` 与 `@copy` |
112
- | `ChatActionbar` | 默认复制操作,支持默认插槽追加操作与 `@copy` |
113
- | `ChatSender` | 聊天输入框,支持文本、文件、语音和截图 |
172
+ ```css
173
+ .my-app {
174
+ --accent: #7c3aed; /* 主色:链接、发送按钮、选中态 */
175
+ --accent-hover: #6d28d9;
176
+ --accent-subtle: #f5f3ff; /* 用户消息气泡背景 */
177
+ --bg-canvas: #fafafa; /* 页面/容器底色 */
178
+ --radius-md: 10px; /* 气泡、附件圆角 */
179
+ }
180
+ ```
114
181
 
115
- ### D3MindMap
182
+ `ChatBot` 支持三种深色模式触发方式:
116
183
 
117
- 基于 D3.js 的思维导图可视化组件。
184
+ ```html
185
+ <!-- 显式指定 -->
186
+ <ChatBot data-chat-color-mode="dark" ... />
118
187
 
119
- ```vue
120
- <script setup lang=”ts”>
121
- import { D3MindMap } from '@deep-eye/core'
122
- import type { MindMapNode } from '@deep-eye/core'
123
-
124
- const data: MindMapNode = {
125
- name: '根节点',
126
- children: [
127
- { name: '子节点 1' },
128
- { name: '子节点 2' },
129
- ],
130
- }
131
- </script>
188
+ <!-- 适配宿主已有的全局主题系统 -->
189
+ <div data-theme="dark"><ChatBot ... /></div>
132
190
 
133
- <template>
134
- <D3MindMap :data=”data” height=”600px” show-toolbar />
135
- </template>
191
+ <!-- 跟随操作系统 -->
192
+ <ChatBot data-chat-color-mode="auto" ... />
136
193
  ```
137
194
 
138
- ## Changelog
139
-
140
- 每个功能版本的用户可见变化记录在 [CHANGELOG.md](./CHANGELOG.md)。发布前在文件顶部新增版本,并使用 `Added`、`Changed`、`Fixed` 或 `Removed` 分类。
195
+ 完整 Token 清单与深色模式覆盖示例见文档站点的「主题与深色模式」章节。
141
196
 
142
- ## 技术要求
197
+ ## 完整文档
143
198
 
144
- - Node >= 22
145
- - Vue >= 3.5
199
+ README 仅覆盖最小可用示例。完整的 Props / Events / Slots / Methods 参考、核心概念(消息模型与 Responses SSE 协议详解)、进阶用法与常见问题(FAQ),请查看仓库 `packages/docs` 目录下的 VitePress 文档站点源码。
146
200
 
147
201
  ## License
148
202
 
@@ -1,41 +1,72 @@
1
- import type { ChatSenderProps, AiConversationProps, ConversationMessage, ConversationUiAction } from './types';
2
- import type { Ref } from 'vue';
3
- interface Props {
4
- messages: readonly ConversationMessage[] | Ref<readonly ConversationMessage[]>;
5
- showSidebar?: boolean;
6
- sidebarWidth?: string | number;
7
- senderConfig?: Partial<ChatSenderProps>;
8
- conversationConfig?: Partial<AiConversationProps>;
9
- }
1
+ import { type ClassifiedChatError } from './chatErrors';
2
+ import type { ChatActionbarCopyPayload, ChatBotExpose, ChatBotProps, ChatMessageProps, ChatComposerAttachment, ChatQueueItem, ChatResourceFile, ChatSendPayload, ChatToolActionPayload, ConversationMessage, ConversationStreamStatus, ConversationToolCall, ConversationUiAction, ResponseStreamEvent, ResponseSseFrame } from './types';
10
3
  type __VLS_Slots = {
11
4
  sidebar?: (props: {
12
5
  artifact: ConversationUiAction | null;
6
+ file: ChatResourceFile | null;
13
7
  }) => unknown;
8
+ sender?: () => unknown;
14
9
  'sender-prepend'?: () => unknown;
15
10
  'sender-append'?: () => unknown;
16
11
  empty?: () => unknown;
12
+ prepend?: () => unknown;
13
+ append?: () => unknown;
14
+ message?: (props: {
15
+ message: ConversationMessage;
16
+ index: number;
17
+ isLast: boolean;
18
+ messageProps: ChatMessageProps;
19
+ }) => unknown;
17
20
  'user-avatar'?: () => unknown;
18
21
  'assistant-avatar'?: () => unknown;
19
22
  'assistant-actionbar'?: (props: {
20
23
  message: unknown;
21
24
  copied: boolean;
22
25
  }) => unknown;
26
+ tool?: (props: {
27
+ toolCall: ConversationToolCall;
28
+ toolMessage?: import('./types').ToolMessage;
29
+ streaming: boolean;
30
+ }) => unknown;
31
+ 'file-preview'?: (props: {
32
+ resource: ChatResourceFile;
33
+ }) => unknown;
23
34
  };
24
- declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
25
- copy: (payload: unknown) => any;
35
+ declare const __VLS_base: import("vue").DefineComponent<ChatBotProps, ChatBotExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
36
+ stop: () => any;
37
+ copy: (payload: ChatActionbarCopyPayload) => any;
26
38
  action: (payload: ConversationUiAction) => any;
27
- send: (content: string, files?: File[] | undefined) => any;
39
+ "tool-action": (payload: ChatToolActionPayload) => any;
40
+ send: (payload: ChatSendPayload) => any;
41
+ "update:draft": (draft: string) => any;
42
+ "update:attachments": (attachments: readonly ChatComposerAttachment[]) => any;
43
+ retry: (payload: ChatSendPayload | null, error: Error) => any;
44
+ "update:messages": (messages: ConversationMessage[]) => any;
45
+ "update:queue": (queue: readonly ChatQueueItem[]) => any;
28
46
  "artifact-open": (payload: ConversationUiAction) => any;
29
- }, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
30
- onCopy?: ((payload: unknown) => any) | undefined;
47
+ "status-change": (status: ConversationStreamStatus) => any;
48
+ "response-event": (event: ResponseStreamEvent, frame: ResponseSseFrame) => any;
49
+ "response-error": (error: Error, info: ClassifiedChatError) => any;
50
+ }, string, import("vue").PublicProps, Readonly<ChatBotProps> & Readonly<{
51
+ onStop?: (() => any) | undefined;
52
+ onCopy?: ((payload: ChatActionbarCopyPayload) => any) | undefined;
31
53
  onAction?: ((payload: ConversationUiAction) => any) | undefined;
32
- onSend?: ((content: string, files?: File[] | undefined) => any) | undefined;
54
+ "onTool-action"?: ((payload: ChatToolActionPayload) => any) | undefined;
55
+ onSend?: ((payload: ChatSendPayload) => any) | undefined;
56
+ "onUpdate:draft"?: ((draft: string) => any) | undefined;
57
+ "onUpdate:attachments"?: ((attachments: readonly ChatComposerAttachment[]) => any) | undefined;
58
+ onRetry?: ((payload: ChatSendPayload | null, error: Error) => any) | undefined;
59
+ "onUpdate:messages"?: ((messages: ConversationMessage[]) => any) | undefined;
60
+ "onUpdate:queue"?: ((queue: readonly ChatQueueItem[]) => any) | undefined;
33
61
  "onArtifact-open"?: ((payload: ConversationUiAction) => any) | undefined;
62
+ "onStatus-change"?: ((status: ConversationStreamStatus) => any) | undefined;
63
+ "onResponse-event"?: ((event: ResponseStreamEvent, frame: ResponseSseFrame) => any) | undefined;
64
+ "onResponse-error"?: ((error: Error, info: ClassifiedChatError) => any) | undefined;
34
65
  }>, {
35
66
  showSidebar: boolean;
36
67
  sidebarWidth: string | number;
37
- senderConfig: Partial<ChatSenderProps>;
38
- conversationConfig: Partial<AiConversationProps>;
68
+ senderConfig: Partial<import("./types").ChatSenderProps>;
69
+ conversationConfig: import("./types").ConversationListConfig;
39
70
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
40
71
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
41
72
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"AAwZA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAI9B,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,GAAG,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAA;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAClD;AAUD,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;KAAE,KAAK,OAAO,CAAA;IACvE,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;CAClF,CAAC;AA8TF,QAAA,MAAM,UAAU;;;;;;;;;;;iBApVA,OAAO;kBACN,MAAM,GAAG,MAAM;kBACf,OAAO,CAAC,eAAe,CAAC;wBAClB,OAAO,CAAC,mBAAmB,CAAC;6EAqVjD,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"AAs0BA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EACV,wBAAwB,EAExB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EAErB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EAEpB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,SAAS,CAAA;AAYhB,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;QACrC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAA;KAC9B,KAAK,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,OAAO,CAAA;QACf,YAAY,EAAE,gBAAgB,CAAA;KAC/B,KAAK,OAAO,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;IACjF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,OAAO,SAAS,EAAE,WAAW,CAAA;QAC3C,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAA;KAAE,KAAK,OAAO,CAAA;CACpE,CAAC;AA8vBF,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAKd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ChatAttachmentError, ChatAttachmentLimits, ChatComposerAttachment, ChatUploadConfig, QiniuUploadFileItem } from './types';
2
+ interface AttachmentUploadOptions {
3
+ config: ChatUploadConfig;
4
+ signal?: AbortSignal;
5
+ onProgress?: (progress: number) => void;
6
+ }
7
+ type AttachmentUpload = (file: File, options: AttachmentUploadOptions) => Promise<QiniuUploadFileItem>;
8
+ export interface ChatAttachmentControllerOptions {
9
+ getAttachments: () => readonly ChatComposerAttachment[];
10
+ setAttachments: (attachments: readonly ChatComposerAttachment[]) => void;
11
+ getUploadConfig: () => ChatUploadConfig | undefined;
12
+ getLimits?: () => ChatAttachmentLimits;
13
+ onError?: (error: ChatAttachmentError, file?: File) => void;
14
+ upload?: AttachmentUpload;
15
+ }
16
+ export interface ChatAttachmentController {
17
+ addFiles: (files: readonly File[]) => Promise<void>;
18
+ retry: (id: string) => Promise<void>;
19
+ remove: (id: string) => void;
20
+ clear: () => void;
21
+ dispose: () => void;
22
+ }
23
+ export declare function createChatAttachmentController(options: ChatAttachmentControllerOptions): ChatAttachmentController;
24
+ export {};
25
+ //# sourceMappingURL=attachmentController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentController.d.ts","sourceRoot":"","sources":["../../../src/components/chat/attachmentController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,UAAU,uBAAuB;IAC/B,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED,KAAK,gBAAgB,GAAG,CACtB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAEjC,MAAM,WAAW,+BAA+B;IAC9C,cAAc,EAAE,MAAM,SAAS,sBAAsB,EAAE,CAAA;IACvD,cAAc,EAAE,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,KAAK,IAAI,CAAA;IACxE,eAAe,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAA;IACnD,SAAS,CAAC,EAAE,MAAM,oBAAoB,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAC3D,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,wBAAwB,CAkJ1B"}
@@ -0,0 +1,12 @@
1
+ import type { ChatAttachmentError, ChatAttachmentLimits, ChatComposerAttachment, ChatFileCategory, ChatResourceFile, ChatSendPayload, ConversationContentPart, QiniuUploadFileItem } from './types';
2
+ export declare const DEFAULT_CHAT_ATTACHMENT_LIMITS: ChatAttachmentLimits;
3
+ export declare function getFileExtension(fileName: string): string;
4
+ export declare function classifyAttachment(file: Pick<File, 'name' | 'type'>): ChatFileCategory;
5
+ export declare function createAttachmentFingerprint(file: Pick<File, 'name' | 'size' | 'lastModified'>): string;
6
+ export declare function validateAttachmentFile(file: File, limits?: ChatAttachmentLimits): ChatAttachmentError | null;
7
+ export declare function parseQiniuUploadResult(value: unknown): QiniuUploadFileItem;
8
+ export declare function toChatResourceFile(result: QiniuUploadFileItem): ChatResourceFile;
9
+ export declare function buildChatSendPayload(content: string, attachments: readonly ChatComposerAttachment[]): ChatSendPayload;
10
+ export declare function resourceToContentPart(resource: ChatResourceFile): ConversationContentPart;
11
+ export declare function createChatMessageId(): string;
12
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../src/components/chat/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EAEpB,MAAM,SAAS,CAAA;AA8BhB,eAAO,MAAM,8BAA8B,EAAE,oBAM5C,CAAA;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,gBAAgB,CAOtF;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC,GACjD,MAAM,CAER;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,oBAAqD,GAC5D,mBAAmB,GAAG,IAAI,CAuB5B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,gBAAgB,CAOhF;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,SAAS,sBAAsB,EAAE,GAC7C,eAAe,CAoBjB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,uBAAuB,CAYzF;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C"}
@@ -0,0 +1,14 @@
1
+ import { type ComputedRef } from 'vue';
2
+ import type { ChatAttachmentLimits, ChatColorMode, ChatPreviewRendererMap, ChatTheme, ChatToolRendererMap, ChatUploadConfig } from './types';
3
+ export interface ChatContext {
4
+ colorMode: ComputedRef<ChatColorMode>;
5
+ uploadConfig: ComputedRef<ChatUploadConfig | undefined>;
6
+ limits: ComputedRef<ChatAttachmentLimits>;
7
+ theme: ComputedRef<ChatTheme>;
8
+ previewRenderers: ComputedRef<ChatPreviewRendererMap>;
9
+ toolRenderers: ComputedRef<ChatToolRendererMap>;
10
+ }
11
+ export declare function provideChatContext(context: ChatContext): void;
12
+ export declare function useChatContext(): ChatContext;
13
+ export declare function resolveChatAttachmentLimits(...overrides: Array<Partial<ChatAttachmentLimits> | undefined>): ChatAttachmentLimits;
14
+ //# sourceMappingURL=chatContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatContext.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chatContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,WAAW,EAAqB,MAAM,KAAK,CAAA;AAEpF,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,sBAAsB,EACtB,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,CAAA;IACrC,YAAY,EAAE,WAAW,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAA;IACvD,MAAM,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAA;IACzC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC7B,gBAAgB,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAA;IACrD,aAAa,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAA;CAChD;AAaD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAE7D;AAED,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,2BAA2B,CACzC,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC,GAC7D,oBAAoB,CAYtB"}
@@ -0,0 +1,16 @@
1
+ export type ChatErrorKind = 'network' | 'timeout' | 'api' | 'protocol' | 'unknown';
2
+ export interface ClassifiedChatError {
3
+ kind: ChatErrorKind;
4
+ error: Error;
5
+ code?: string;
6
+ status?: number;
7
+ }
8
+ /**
9
+ * Buckets a raw stream/request failure into a small set of kinds a host app or the
10
+ * in-conversation fallback can give distinct copy to. `TypeError` is what `fetch()` throws
11
+ * for connection-level failures (offline, DNS, refused, CORS); `TimeoutError` is the name
12
+ * `AbortSignal.timeout()` produces, so a host passing a timeout-bound signal is detected
13
+ * without this package owning any timeout logic itself.
14
+ */
15
+ export declare function classifyChatError(error: Error): ClassifiedChatError;
16
+ //# sourceMappingURL=chatErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatErrors.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chatErrors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;AAElF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAkBnE"}
@@ -0,0 +1,6 @@
1
+ import type { ChatQueueItem, ChatSendPayload } from './types';
2
+ export declare function enqueueChatPayload(queue: readonly ChatQueueItem[], payload: ChatSendPayload): ChatQueueItem[];
3
+ export declare function editChatQueueItem(queue: readonly ChatQueueItem[], id: string, content: string): ChatQueueItem[];
4
+ export declare function removeChatQueueItem(queue: readonly ChatQueueItem[], id: string): ChatQueueItem[];
5
+ export declare function moveChatQueueItem(queue: readonly ChatQueueItem[], fromIndex: number, toIndex: number): ChatQueueItem[];
6
+ //# sourceMappingURL=chatQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatQueue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chatQueue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI7D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,eAAe,GACvB,aAAa,EAAE,CAEjB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,aAAa,EAAE,CAMjB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE,CAEhG;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,aAAa,EAAE,CAcjB"}
@@ -0,0 +1,15 @@
1
+ import type { ConversationUiAction } from '../types';
2
+ type __VLS_Props = {
3
+ artifact: ConversationUiAction;
4
+ expanded?: boolean;
5
+ };
6
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
7
+ close: () => any;
8
+ "toggle-expanded": () => any;
9
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ onClose?: (() => any) | undefined;
11
+ "onToggle-expanded"?: (() => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ //# sourceMappingURL=ArtifactPreview.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtifactPreview.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ArtifactPreview.vue"],"names":[],"mappings":"AAmWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAKpD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA+jBF,QAAA,MAAM,YAAY;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}