@blueking/chat-x 0.0.49-beta.9 → 0.0.51-beta.1
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/dist/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/messages.d.ts +3 -0
- package/dist/common/constants.d.ts +1 -1
- package/dist/components/ai-buttons/file-upload-btn/file-upload-btn.vue.d.ts +0 -2
- package/dist/components/chat-content/file-content/file-content.vue.d.ts +5 -2
- package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +12 -0
- package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +21 -0
- package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +1 -1
- package/dist/components/chat-input/build-default-placeholder.d.ts +7 -0
- package/dist/components/chat-input/chat-input.vue.d.ts +1 -1
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -0
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +2 -0
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +2 -1
- package/dist/composables/use-custom-tab.d.ts +5 -3
- package/dist/composables/use-message-group.d.ts +78 -72
- package/dist/icons/execution.d.ts +6 -0
- package/dist/icons/tools.d.ts +3 -0
- package/dist/index.css +1 -1
- package/dist/index.js +3054 -2854
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +7 -7
- package/dist/mcp/generated/docs/ai-slash-input.md +2 -0
- package/dist/mcp/generated/docs/assistant-message.md +9 -7
- package/dist/mcp/generated/docs/chat-container.md +35 -31
- package/dist/mcp/generated/docs/chat-input.md +18 -12
- package/dist/mcp/generated/docs/cite-content.md +3 -3
- package/dist/mcp/generated/docs/desc-panel.md +32 -10
- package/dist/mcp/generated/docs/execution-summary.md +3 -3
- package/dist/mcp/generated/docs/file-artifact-panel.md +6 -4
- package/dist/mcp/generated/docs/file-content.md +89 -73
- package/dist/mcp/generated/docs/file-upload-btn.md +16 -18
- package/dist/mcp/generated/docs/message-container.md +1 -0
- package/dist/mcp/generated/docs/message-render.md +2 -1
- package/dist/mcp/generated/docs/messages.md +5 -0
- package/dist/mcp/generated/docs/toolcall-render.md +82 -43
- package/dist/mcp/generated/docs/use-artifact-preview.md +19 -17
- package/dist/mcp/generated/docs/use-custom-tab.md +12 -8
- package/dist/mcp/generated/docs/user-message.md +3 -0
- package/dist/mcp/generated/docs/user-question-card.md +2 -0
- package/dist/mcp/generated/index.json +7 -3
- package/dist/mcp/index.js +0 -0
- package/dist/types/input.d.ts +6 -0
- package/dist/utils/file.d.ts +7 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/merge-tools-by-id.d.ts +6 -0
- package/dist/utils/upload-file.d.ts +35 -0
- package/package.json +21 -20
|
@@ -75,32 +75,30 @@ const { addCustomTab, ensureCustomTab, removeCustomTab } = useCustomTabProvider(
|
|
|
75
75
|
// 会话级文件产物聚合已内聚在 useMessageGroup,直接消费
|
|
76
76
|
const { sessionArtifacts } = useMessageGroup({ keyword, messages, selectedUserMessages });
|
|
77
77
|
|
|
78
|
+
const FILE_ARTIFACT_TAB = {
|
|
79
|
+
closable: false,
|
|
80
|
+
label: t('文件产物'),
|
|
81
|
+
name: FILE_ARTIFACT_TAB_NAME,
|
|
82
|
+
order: -1,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// 常驻挂载:不随产物有无增删,无产物时由面板展示空态
|
|
86
|
+
ensureCustomTab(FILE_ARTIFACT_TAB);
|
|
87
|
+
|
|
78
88
|
const { activeArtifactId, setActiveArtifactId } = useArtifactPreviewProvider({
|
|
79
89
|
getOnArtifactClick: () => props.onArtifactClick,
|
|
80
90
|
// 点击文件卡片:展开侧栏并选中「文件产物」Tab
|
|
81
91
|
onOpen: () => {
|
|
82
|
-
addCustomTab(
|
|
83
|
-
closable: false,
|
|
84
|
-
label: t('文件产物'),
|
|
85
|
-
name: FILE_ARTIFACT_TAB_NAME,
|
|
86
|
-
order: -1,
|
|
87
|
-
});
|
|
92
|
+
addCustomTab(FILE_ARTIFACT_TAB);
|
|
88
93
|
},
|
|
89
94
|
});
|
|
90
95
|
|
|
91
|
-
//
|
|
96
|
+
// 仅维护命中态:无产物清空,命中项失效时回落到第一个
|
|
92
97
|
watch(sessionArtifacts, list => {
|
|
93
98
|
if (!list.length) {
|
|
94
|
-
removeCustomTab(FILE_ARTIFACT_TAB_NAME);
|
|
95
99
|
setActiveArtifactId('');
|
|
96
100
|
return;
|
|
97
101
|
}
|
|
98
|
-
ensureCustomTab({
|
|
99
|
-
closable: false,
|
|
100
|
-
label: t('文件产物'),
|
|
101
|
-
name: FILE_ARTIFACT_TAB_NAME,
|
|
102
|
-
order: -1,
|
|
103
|
-
});
|
|
104
102
|
if (!list.some(item => item.outputId === activeArtifactId.value)) {
|
|
105
103
|
setActiveArtifactId(list[0].outputId);
|
|
106
104
|
}
|
|
@@ -211,8 +209,12 @@ ArtifactFileCard(点击)
|
|
|
211
209
|
└─ FileArtifactPanel(列表 + 下载头,@select → setActiveArtifactId)
|
|
212
210
|
└─ ArtifactPreviewHost(loader + 分类型 renderer)
|
|
213
211
|
|
|
214
|
-
|
|
215
|
-
└─ ensureCustomTab(FILE_ARTIFACT_TAB_NAME)
|
|
212
|
+
容器初始化
|
|
213
|
+
└─ ensureCustomTab(FILE_ARTIFACT_TAB_NAME) 常驻挂上(不展开侧栏);因 order:-1 排在首位,
|
|
214
|
+
未主动切换过 Tab 时会成为默认选中面板;无产物时由面板展示整块空态
|
|
215
|
+
|
|
216
|
+
sessionArtifacts 变化
|
|
217
|
+
└─ 仅维护命中态(无产物清空,命中项失效回落第一个);不增删 Tab
|
|
216
218
|
```
|
|
217
219
|
|
|
218
220
|
分类型预览策略见 [FileArtifactPanel 预览机制](../components/message/file-artifact-panel#预览机制)。
|
|
@@ -222,7 +224,7 @@ sessionArtifacts 变化(有产物)
|
|
|
222
224
|
- **职责单一**:composable 不直接调用 `useCustomTab`,侧栏 Tab 打开逻辑由 `onOpen` 注入;也不做正文 fetch / iframe 渲染
|
|
223
225
|
- **ShallowRef 优先**:`activeArtifactId` 使用 `shallowRef`,避免不必要的深层响应式开销
|
|
224
226
|
- **Consumer 兜底**:`useArtifactPreviewConsumer` 无 Provider 时返回 `undefined`,文件卡片在无容器上下文时自动不可点击
|
|
225
|
-
- **与 useCustomTab 协作**:点击卡片走 `addCustomTab`(展开 +
|
|
227
|
+
- **与 useCustomTab 协作**:点击卡片走 `addCustomTab`(展开 + 选中);容器初始化时走 `ensureCustomTab` 常驻挂载(不展开;因 `order: -1` 在未主动切换前会成为默认选中),无产物也不移除,由面板展示空态
|
|
226
228
|
|
|
227
229
|
## 关联组件
|
|
228
230
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
useCustomTabProvider 返回 tabs、selectedTab、isCollapse 及 add/ensure/remove/selectCustomTab,并通过 provide 共享;可选 onTabChange
|
|
4
|
+
useCustomTabProvider 返回 tabs、selectedTab、isCollapse 及 add/ensure/remove/selectCustomTab,并通过 provide 共享;可选 onTabChange 在切换时拉取数据、可选 collapsed 注入受控折叠态 ref。 ensureCustomTab 只挂载/合并元信息,不展开侧栏、不主动切换选中;addCustomTab 会展开并选中。 未被主动切换过时,选中态默认跟随 Tab 栏首位(order 最小),如常驻的「文件产物」。 useCustomTabConsumer 在后代注入同一套 API,常用于侧栏动态节点详情等。EXECUTION_TAB_NAME 标识默认「执行情况」Tab。 ChatContainer 侧栏集成 Provider 与 Tab UI。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **chat-container** — Provider 与侧栏 Tab 主场景
|
|
@@ -21,6 +21,8 @@ Provider/Consumer 模式的自定义 Tab 管理,用于 `ChatContainer` 侧边
|
|
|
21
21
|
|
|
22
22
|
```typescript
|
|
23
23
|
function useCustomTabProvider<T extends Record<string, unknown>>(options: {
|
|
24
|
+
// 侧栏折叠态;由容器传入受控 ref(如 ChatContainer 的 v-model:asideCollapsed),缺省内部自持
|
|
25
|
+
collapsed?: Ref<boolean>;
|
|
24
26
|
// 执行情况 Tab 是否展示,缺省 true;传 getter 以保持响应式
|
|
25
27
|
executionTabVisible?: () => boolean | undefined;
|
|
26
28
|
onTabChange?: (tab: CustomTab<T>) => void;
|
|
@@ -28,7 +30,7 @@ function useCustomTabProvider<T extends Record<string, unknown>>(options: {
|
|
|
28
30
|
tabs: ShallowRef<CustomTab<T>[]>;
|
|
29
31
|
displayTabs: ComputedRef<CustomTab<T>[]>;
|
|
30
32
|
selectedTab: Ref<CustomTab<T>>;
|
|
31
|
-
isCollapse:
|
|
33
|
+
isCollapse: Ref<boolean>;
|
|
32
34
|
addCustomTab: (tab: CustomTab<T>) => void;
|
|
33
35
|
ensureCustomTab: (tab: CustomTab<T>) => void;
|
|
34
36
|
removeCustomTab: (tabName: string) => void;
|
|
@@ -88,7 +90,7 @@ tabManager?.addCustomTab({
|
|
|
88
90
|
},
|
|
89
91
|
});
|
|
90
92
|
|
|
91
|
-
// 仅确保 Tab 存在(不展开、不切换选中)——
|
|
93
|
+
// 仅确保 Tab 存在(不展开、不切换选中)—— 如常驻挂上文件产物 Tab
|
|
92
94
|
tabManager?.ensureCustomTab({
|
|
93
95
|
name: 'file-artifact',
|
|
94
96
|
label: '文件产物',
|
|
@@ -114,10 +116,10 @@ tabManager?.removeCustomTab('node-detail-123');
|
|
|
114
116
|
| --------------- | --------------------------- | ------------------------------------------------- |
|
|
115
117
|
| tabs | `ShallowRef<CustomTab[]>` | 所有 Tab 列表(含默认的执行情况 Tab,保留隐藏项) |
|
|
116
118
|
| displayTabs | `ComputedRef<CustomTab[]>` | Tab 栏实际展示列表:过滤 `visible === false`,按 `order` 升序稳定排序 |
|
|
117
|
-
| selectedTab | `Ref<CustomTab>` | 当前选中的 Tab
|
|
118
|
-
| isCollapse | `
|
|
119
|
+
| selectedTab | `Ref<CustomTab>` | 当前选中的 Tab;未被主动切换过时跟随 Tab 栏首位,选中项被隐藏时自动回退到首个可见 Tab |
|
|
120
|
+
| isCollapse | `Ref<boolean>` | 侧边栏折叠状态;传入 `collapsed` 时即该受控 ref(读写都作用于外部),否则为内部状态;`addCustomTab` 时自动设为 `false` |
|
|
119
121
|
| addCustomTab | `(tab: CustomTab) => void` | 添加/合并 Tab,**展开侧栏并选中**目标 Tab |
|
|
120
|
-
| ensureCustomTab | `(tab: CustomTab) => void` | 添加/合并 Tab
|
|
122
|
+
| ensureCustomTab | `(tab: CustomTab) => void` | 添加/合并 Tab,**不展开、不主动切换选中**;用于常驻挂载(如文件产物) |
|
|
121
123
|
| removeCustomTab | `(tabName: string) => void` | 移除指定 Tab |
|
|
122
124
|
| selectCustomTab | `(tab: CustomTab) => void` | 切换到指定 Tab,触发 `onTabChange` 回调 |
|
|
123
125
|
| resetCustomTab | `() => void` | 重置为仅保留「执行情况」Tab、折叠侧栏并选中默认 Tab;`ChatContainer` 在卸载时调用,避免残留自定义 Tab |
|
|
@@ -147,9 +149,11 @@ interface CustomTab<T = Record<string, unknown>> {
|
|
|
147
149
|
- 排序为稳定排序,`order` 相同的 Tab 保持插入先后顺序
|
|
148
150
|
- 选中的 Tab 被配置隐藏时,内容不再渲染,自动切换到首个可见 Tab
|
|
149
151
|
- `addCustomTab` 同时展开侧边栏(`isCollapse = false`)并在 `nextTick` 后自动选中目标 Tab;同名 Tab 合并更新
|
|
150
|
-
- `ensureCustomTab` 与 `addCustomTab` 共用合并逻辑,但不改 `isCollapse
|
|
152
|
+
- `ensureCustomTab` 与 `addCustomTab` 共用合并逻辑,但不改 `isCollapse`、自身不切换 `selectedTab`;适合「常驻挂载文件产物 Tab」等场景
|
|
153
|
+
- 默认选中跟随 Tab 栏首位:只要没调用过 `selectCustomTab` / `addCustomTab`,挂上更靠前(`order` 更小)的 Tab 就会成为选中项,因此常驻的「文件产物」(`order: -1`)是侧栏默认面板;一旦主动切换过便不再跟随。`resetCustomTab` 会重置该标记
|
|
154
|
+
- 折叠态支持受控:传入 `collapsed` 后 Provider 不再自持状态,内部展开动作直接写回该 ref,容器即可通过 `v-model` 把状态交给外部判断
|
|
151
155
|
|
|
152
156
|
## 关联组件
|
|
153
157
|
|
|
154
158
|
- [ChatContainer](../components/setup/chat-container) — 侧栏 Tab 与自定义面板
|
|
155
|
-
- [useArtifactPreview](./use-artifact-preview) — 文件产物 Tab
|
|
159
|
+
- [useArtifactPreview](./use-artifact-preview) — 文件产物 Tab:初始化 `ensureCustomTab` 常驻挂载,点击卡片时 `addCustomTab`
|
|
@@ -315,6 +315,8 @@ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
|
|
|
315
315
|
| `edit` | 编辑 | 切换 `isEdit=true`,进入编辑模式 |
|
|
316
316
|
| `delete` | 删除 | 无内置行为,需通过 `onAction` 外部处理 |
|
|
317
317
|
|
|
318
|
+
可通过 `messageTools` 按 id 覆盖/追加,`{ id: 'edit', hidden: true }` 可隐藏内置项。
|
|
319
|
+
|
|
318
320
|
```vue
|
|
319
321
|
<!-- 经 MessageRender 控制工具栏状态 -->
|
|
320
322
|
<MessageRender
|
|
@@ -362,6 +364,7 @@ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
|
|
|
362
364
|
| content | `string \| InputContent[]` | 消息内容,字符串或含 text/binary 的数组 |
|
|
363
365
|
| createdAt | `number \| string` | 消息创建时间,经 `MessageTools` 的 `#prepend` 插槽交给 `MessageTime` 渲染在工具图标左侧;无值时不展示 |
|
|
364
366
|
| property | `{ extra?: MessageExtra; artifacts?: AIFileInfo[] }` | 附加属性;本组件消费 `extra.cite` / `shortcut` / `context` |
|
|
367
|
+
| messageTools | `IToolBtn[]` | 自定义用户消息工具组;按 id 与 `CONST_USER_MESSAGE_TOOLS` 合并,`{ id, hidden: true }` 可隐藏 |
|
|
365
368
|
| messageToolsStatus | `MessageToolsStatus` | 工具按钮状态,`disabled` 禁用、`hidden` 从 DOM 移除 |
|
|
366
369
|
| onAction | `MessageToolsProps['onAction']` | 工具回调;`copy`/`edit` 有内置行为,`cite`/`delete` 需外部处理 |
|
|
367
370
|
| onInputConfirm | `(content: UserMessage['content'], docSchema: TagSchema) => Promise<void>` | 普通消息编辑确认回调 |
|
|
@@ -188,6 +188,8 @@ const payload = buildSkipResumePayload(interrupt);
|
|
|
188
188
|
|
|
189
189
|
`ChatContainer` 提供同名 `#interruptQuestion` slot,参数与 `#question` 一致,透传自输入区上方的 `UserQuestionCard`。
|
|
190
190
|
|
|
191
|
+
> **跳过按钮禁用态**:`disabled` 时文字与图标同步变灰(`currentColor` / `#c4c6cc`)。
|
|
192
|
+
|
|
191
193
|
## API
|
|
192
194
|
|
|
193
195
|
### UserQuestionCard Props
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "2.0.0",
|
|
3
|
-
"generatedAt": "2026-
|
|
3
|
+
"generatedAt": "2026-09-01T04:15:26.001Z",
|
|
4
4
|
"domains": {
|
|
5
5
|
"setup": {
|
|
6
6
|
"label": "对话搭建",
|
|
@@ -1433,6 +1433,10 @@
|
|
|
1433
1433
|
"slug": "toolcall-render",
|
|
1434
1434
|
"relation": "工具调用详情中渲染描述与参数"
|
|
1435
1435
|
},
|
|
1436
|
+
{
|
|
1437
|
+
"slug": "tool-message",
|
|
1438
|
+
"relation": "工具返回内容同样由 DescPanel 承载"
|
|
1439
|
+
},
|
|
1436
1440
|
{
|
|
1437
1441
|
"slug": "highlight-keyword",
|
|
1438
1442
|
"relation": "键值与文本匹配关键词高亮"
|
|
@@ -1556,7 +1560,7 @@
|
|
|
1556
1560
|
"slug": "chat-container",
|
|
1557
1561
|
"kind": "component",
|
|
1558
1562
|
"description": "完整对话容器,组合消息列表、输入区、模型选择、快捷指令、执行摘要、分享选择和自定义 Tab。",
|
|
1559
|
-
"aiSummary": "完整对话容器,组合消息列表、输入区、模型选择、快捷指令、执行摘要、分享选择和自定义 Tab。 透传 models / selectedModel;支持 welcomeTitle 与 #welcome。 源码位置:src/components/chat-container/chat-container.vue。",
|
|
1563
|
+
"aiSummary": "完整对话容器,组合消息列表、输入区、模型选择、快捷指令、执行摘要、分享选择和自定义 Tab。 透传 models / selectedModel;支持 welcomeTitle 与 #welcome。 侧栏展开/折叠由外部 v-model:asideCollapsed 严格受控(传入后以外部值为准,内部展开动作仅发 update 事件),不再依赖执行数据或文件产物有无;无数据时侧栏照常展开并展示空态。 侧栏固定从右侧展开(无 placement prop),且不再内置折叠按钮。 「文件产物」Tab 常驻挂载。 源码位置:src/components/chat-container/chat-container.vue。",
|
|
1560
1564
|
"relatedComponents": [
|
|
1561
1565
|
{
|
|
1562
1566
|
"slug": "message-container",
|
|
@@ -1718,7 +1722,7 @@
|
|
|
1718
1722
|
"slug": "use-custom-tab",
|
|
1719
1723
|
"kind": "composable",
|
|
1720
1724
|
"description": "Provider/Consumer 模式的自定义 Tab 管理,用于 `ChatContainer` 侧边栏的 Tab 动态管理。Provider 在 `ChatContainer` 中创建,Consumer 在任意后代组件中注入使用。",
|
|
1721
|
-
"aiSummary": "useCustomTabProvider 返回 tabs、selectedTab、isCollapse 及 add/ensure/remove/selectCustomTab,并通过 provide 共享;可选 onTabChange
|
|
1725
|
+
"aiSummary": "useCustomTabProvider 返回 tabs、selectedTab、isCollapse 及 add/ensure/remove/selectCustomTab,并通过 provide 共享;可选 onTabChange 在切换时拉取数据、可选 collapsed 注入受控折叠态 ref。 ensureCustomTab 只挂载/合并元信息,不展开侧栏、不主动切换选中;addCustomTab 会展开并选中。 未被主动切换过时,选中态默认跟随 Tab 栏首位(order 最小),如常驻的「文件产物」。 useCustomTabConsumer 在后代注入同一套 API,常用于侧栏动态节点详情等。EXECUTION_TAB_NAME 标识默认「执行情况」Tab。 ChatContainer 侧栏集成 Provider 与 Tab UI。",
|
|
1722
1726
|
"relatedComponents": [
|
|
1723
1727
|
{
|
|
1724
1728
|
"slug": "chat-container",
|
package/dist/mcp/index.js
CHANGED
|
File without changes
|
package/dist/types/input.d.ts
CHANGED
|
@@ -26,3 +26,9 @@ export type UploadFile = BinaryInputContent & {
|
|
|
26
26
|
file?: File;
|
|
27
27
|
status?: UploadStatus;
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* 附件展示形态。图片均为定高 48px、宽度按原图比例(48~120px),差异只在圆角与描边:
|
|
31
|
+
* - input:输入框内待发送态(圆角 8px、浅灰描边)
|
|
32
|
+
* - message:消息内已发送态(圆角 4px、线条中描边,整体右对齐)
|
|
33
|
+
*/
|
|
34
|
+
export type UploadFileVariant = 'input' | 'message';
|
package/dist/utils/file.d.ts
CHANGED
|
@@ -16,10 +16,16 @@ export declare const getFilePreviewUrl: (file?: File) => string;
|
|
|
16
16
|
* @returns 文件扩展名
|
|
17
17
|
*/
|
|
18
18
|
export declare const getFileExtension: (file?: File) => string;
|
|
19
|
+
/**
|
|
20
|
+
* 格式化字节数及单位展示
|
|
21
|
+
* @param size 字节数
|
|
22
|
+
* @returns 1024B -> 1KB 1024KB -> 1M 1024M -> 1GB;大小未知时返回空串
|
|
23
|
+
*/
|
|
24
|
+
export declare const formatBytes: (size?: number) => string;
|
|
19
25
|
/**
|
|
20
26
|
* 格式化文件大小 及 单位展示
|
|
21
27
|
* @param file 文件
|
|
22
|
-
* @returns 1024B -> 1KB 1024KB ->
|
|
28
|
+
* @returns 1024B -> 1KB 1024KB -> 1M 1024M -> 1GB
|
|
23
29
|
*/
|
|
24
30
|
export declare const formatFileSize: (file?: File) => string;
|
|
25
31
|
/**
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** 附件的结构化最小契约,`Partial<UploadFile>` 可直接传入 */
|
|
2
|
+
export type UploadFileLike = {
|
|
3
|
+
file?: File;
|
|
4
|
+
filename?: string;
|
|
5
|
+
mimeType?: string;
|
|
6
|
+
size?: number;
|
|
7
|
+
url?: string;
|
|
8
|
+
};
|
|
9
|
+
/** `File` 的身份标识:同名文件靠体积与修改时间区分,用于去重与列表 key */
|
|
10
|
+
export declare const getFileIdentity: (file: File) => string;
|
|
11
|
+
/**
|
|
12
|
+
* 附件的稳定 key:待发送态用 `File` 身份(上传成功回填 url 后不变),
|
|
13
|
+
* 已发送态退回 url / 文件名。
|
|
14
|
+
*/
|
|
15
|
+
export declare const getUploadFileKey: (item: UploadFileLike) => string;
|
|
16
|
+
/**
|
|
17
|
+
* 是否按图片渲染缩略图。
|
|
18
|
+
* 仅依据 MIME,不再因「有 url」就当图片——解除类型限制后,
|
|
19
|
+
* 任意文件上传成功都会拿到 url,靠 url 判断必然把 doc / pdf 渲染成破图。
|
|
20
|
+
*/
|
|
21
|
+
export declare const isUploadImageFile: (item: UploadFileLike) => boolean;
|
|
22
|
+
/** 文件名:已发送态的 filename 优先,回退原始 `File` */
|
|
23
|
+
export declare const getUploadFileName: (item: UploadFileLike) => string;
|
|
24
|
+
/** 字节数:待发送态取 `File.size`,已发送态取消息内下发的 size */
|
|
25
|
+
export declare const getUploadFileSize: (item: UploadFileLike) => number | undefined;
|
|
26
|
+
/** 附件大小文案,无法得知大小时返回空串(消息态老数据无 size) */
|
|
27
|
+
export declare const formatUploadFileSize: (item: UploadFileLike) => string;
|
|
28
|
+
/**
|
|
29
|
+
* 单次遍历分出图片组与其他文件组。
|
|
30
|
+
* 设计稿要求图片始终排在文件前方,分组本身即承担了排序职责。
|
|
31
|
+
*/
|
|
32
|
+
export declare const splitUploadFiles: <T extends UploadFileLike>(items: T[]) => {
|
|
33
|
+
imageFiles: T[];
|
|
34
|
+
otherFiles: T[];
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blueking/chat-x",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.51-beta.1",
|
|
4
4
|
"description": "蓝鲸智云 AI Chat 组件库 —— 遵循 AG-UI,为 AI Agent 和人类开发者共同设计的对话 UI 组件库。",
|
|
5
5
|
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"prepublishOnly": "vite --config vite.config.ts build && pnpm dts && pnpm mcp:build",
|
|
8
|
+
"dev": "vite --config vite.config.ts",
|
|
9
|
+
"dts": "vue-tsc --project tsconfig.dts.json",
|
|
10
|
+
"build": "vitest && vite --config vite.config.ts build && pnpm dts",
|
|
11
|
+
"preview": "vite --config vite.config.ts build --mode preview && pnpm dts",
|
|
12
|
+
"lint:script": "eslint . --ext .vue,.ts --fix",
|
|
13
|
+
"lint:style": "stylelint \"**/*.{scss,css,vue}\" --fix",
|
|
14
|
+
"lint:all": "pnpm lint:script && pnpm lint:style",
|
|
15
|
+
"test": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage",
|
|
17
|
+
"wiki:dev": "vitepress dev wikis",
|
|
18
|
+
"wiki:build": "vitepress build wikis",
|
|
19
|
+
"mcp:build:index": "tsx mcp/scripts/build-index.ts",
|
|
20
|
+
"mcp:build": "tsc -p mcp/tsconfig.json && pnpm mcp:build:index",
|
|
21
|
+
"mcp:start": "node dist/mcp/index.js",
|
|
22
|
+
"mcp:dev": "tsx mcp/src/index.ts"
|
|
23
|
+
},
|
|
6
24
|
"bin": {
|
|
7
25
|
"chat-x-mcp": "dist/mcp/index.js"
|
|
8
26
|
},
|
|
@@ -50,6 +68,7 @@
|
|
|
50
68
|
"zod": "^4.3.6"
|
|
51
69
|
},
|
|
52
70
|
"devDependencies": {
|
|
71
|
+
"@blueking/chat-helper": "workspace:*",
|
|
53
72
|
"@types/katex": "^0.16.7",
|
|
54
73
|
"@types/lodash": "^4.17.23",
|
|
55
74
|
"@types/markdown-it": "^14.1.2",
|
|
@@ -78,24 +97,6 @@
|
|
|
78
97
|
"vite-bundle-analyzer": "^1.3.2",
|
|
79
98
|
"vitepress": "2.0.0-alpha.16",
|
|
80
99
|
"vitest": "^4.0.18",
|
|
81
|
-
"vue-tsc": "^3.1.4"
|
|
82
|
-
"@blueking/chat-helper": "0.0.12-beta.20"
|
|
83
|
-
},
|
|
84
|
-
"scripts": {
|
|
85
|
-
"dev": "vite --config vite.config.ts",
|
|
86
|
-
"dts": "vue-tsc --project tsconfig.dts.json",
|
|
87
|
-
"build": "vitest && vite --config vite.config.ts build && pnpm dts",
|
|
88
|
-
"preview": "vite --config vite.config.ts build --mode preview && pnpm dts",
|
|
89
|
-
"lint:script": "eslint . --ext .vue,.ts --fix",
|
|
90
|
-
"lint:style": "stylelint \"**/*.{scss,css,vue}\" --fix",
|
|
91
|
-
"lint:all": "pnpm lint:script && pnpm lint:style",
|
|
92
|
-
"test": "vitest",
|
|
93
|
-
"test:coverage": "vitest run --coverage",
|
|
94
|
-
"wiki:dev": "vitepress dev wikis",
|
|
95
|
-
"wiki:build": "vitepress build wikis",
|
|
96
|
-
"mcp:build:index": "tsx mcp/scripts/build-index.ts",
|
|
97
|
-
"mcp:build": "tsc -p mcp/tsconfig.json && pnpm mcp:build:index",
|
|
98
|
-
"mcp:start": "node dist/mcp/index.js",
|
|
99
|
-
"mcp:dev": "tsx mcp/src/index.ts"
|
|
100
|
+
"vue-tsc": "^3.1.4"
|
|
100
101
|
}
|
|
101
102
|
}
|