@blueking/chat-x 0.0.45-dev.1 → 0.0.46-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.
@@ -26,7 +26,7 @@
26
26
  - **消息分组**:将连续的非用户消息合并为一组,每组共享一个工具栏
27
27
  - **Tool 消息关联**:自动将 `role: 'tool'` 消息注入到对应 Assistant 消息的 toolCall 中
28
28
  - **Loading 自动注入**:末尾为用户消息时,自动追加 Loading 动画组
29
- - **滚动管理**:`messageStatus` 为流式、等待响应或请求中(`streaming` / `pending` / `fetching`)时显示「停止生成」,离开底部时显示「返回底部」
29
+ - **滚动管理**:`messageStatus` 为流式、等待响应或请求中(`streaming` / `pending` / `fetching`)时显示「停止生成」,离开底部时显示「返回底部」;`renderMode` 为 `Share` 时不显示「停止生成」
30
30
  - **多选模式**:支持按消息组勾选,用户消息与 AI 回复联动选中
31
31
 
32
32
  ## 基础用法
@@ -130,11 +130,11 @@
130
130
 
131
131
  ## 等待响应(Loading 自动注入)
132
132
 
133
- 当 `messages` 末尾为 `role: 'user'` 时,自动追加 Loading 消息组,展示 AI 正在处理的加载动画:
133
+ 当 `messages` 末尾为 `role: 'user'` 时,自动追加 Loading 消息组,展示 AI 正在处理的加载动画(`renderMode` 为 `Share` 时不追加,且 `MessageContainer` 会过滤 Loading 组):
134
134
 
135
135
  ## 流式输出与停止生成
136
136
 
137
- 当 `messageStatus` 为 `streaming`、`pending`(等待首包)或 `fetching`(请求中、与末尾 Loading 占位一致)时,底部固定区域显示「停止生成」按钮(`stop-loading` 时按钮展示为正在停止),点击后触发 `@stop-streaming` 事件。
137
+ 当 `messageStatus` 为 `streaming`、`pending`(等待首包)或 `fetching`(请求中、与末尾 Loading 占位一致)时,底部固定区域显示「停止生成」按钮(`stop-loading` 时按钮展示为正在停止),点击后触发 `@stop-streaming` 事件。`renderMode` 为 `Share` 时不显示「停止生成」按钮。
138
138
 
139
139
  点击下方按钮体验完整的流式输出过程:
140
140
 
@@ -487,7 +487,7 @@ AI 回复状态为 `error` 时,消息以错误样式展示:
487
487
 
488
488
  | 按钮 | 显示条件 | 点击行为 |
489
489
  | ------------ | ---------------------------------------------------------------------------------------------- | ---------------------- |
490
- | 「停止生成」 | `messageStatus` 为 `streaming`、`pending`、`fetching` 或 `stop-loading`(停止中 loading 态) | 触发 `@stop-streaming` |
490
+ | 「停止生成」 | `messageStatus` 为 `streaming`、`pending`、`fetching` 或 `stop-loading`(停止中 loading 态),且 `renderMode` 不为 `Share` | 触发 `@stop-streaming` |
491
491
  | 「返回底部」 | `debouncedShowScrollBottomBtn`(距底部 > 100px,且防抖 300ms 后才显示/隐藏) | 滚动到消息列表底部 |
492
492
 
493
493
  > **防抖说明**:「返回底部」按钮的显隐使用 300ms 防抖,避免快速滚动时按钮频繁闪烁。隐藏时立即生效(无防抖),显示时延迟 300ms。
@@ -510,7 +510,7 @@ AI 回复状态为 `error` 时,消息以错误样式展示:
510
510
  | onUserInputConfirm | `(message: Message, content: UserMessage['content'], docSchema: TagSchema) => Promise<void>` | — | 用户编辑消息确认回调 |
511
511
  | onUserShortcutConfirm | `(message: Message, formModel: Record<string, unknown>) => Promise<void>` | — | 用户快捷指令表单提交回调 |
512
512
  | onInterruptResume | `OnInterruptResume` | — | AG-UI human-in-the-loop 中断响应回调,透传给 `MessageRender` → `InterruptMessageRender` |
513
- | renderMode | `RenderMode` | — | 渲染模式。`Share` 模式下启用多选样式并隐藏工具栏;`Test` 模式下过滤掉「分享」按钮;不传或 `Chat` 为默认行为 |
513
+ | renderMode | `RenderMode` | — | 渲染模式。`Share` 模式下启用多选样式并隐藏工具栏与「停止生成」按钮;`Test` 模式下过滤掉「分享」按钮;不传或 `Chat` 为默认行为 |
514
514
 
515
515
  ### v-model
516
516
 
@@ -29,11 +29,15 @@ ToolApprovalCard
29
29
  ├── 标题栏:左侧色条 + 单据标题 + 复制图标 + 状态徽章(评审中/已通过/已拒绝/已撤销等)
30
30
  ├── 字段区:单据编号、提交时间
31
31
  ├── 处理人:当前处理人(overflow-tips 省略)
32
- └── 操作区:查看单据详情(新窗口打开 url)、取消审批(仅 pending / draft 且非 readonly
32
+ └── 操作区:查看单据详情(新窗口打开 url)、取消审批(仅 pending / draft 且非 readonly;点击后 loading 防重复提交;分享只读渲染下禁用)
33
33
  ```
34
34
 
35
35
  `readonly` 为 `true` 时用于 `outcome.success` 结果回显:隐藏「取消审批」按钮,不接受审批取消交互。通常由 [InterruptMessageRender](/components/agent/interrupt-message) 内部传入,业务侧无需手动设置。
36
36
 
37
+ 分享只读渲染模式(注入的 `RenderMode.Share`)下,「取消审批」按钮**保持可见但禁用**(区别于 `readonly` 的直接隐藏),避免在分享回显场景误触发取消。该渲染模式由 [ChatContainer](/components/setup/chat-container) 等容器通过 `useRenderModeProvider` 注入,组件内部经 `useRenderModeInject` 读取,业务侧无需手动设置。
38
+
39
+ 取消审批为同步 `onInterruptResume`,组件无法在回调内获知请求结果。点击后「取消审批」按钮立即进入 loading 并忽略重复点击;待后台刷新使卡片卸载/重建后状态随实例销毁。
40
+
37
41
  状态徽章样式:
38
42
 
39
43
  | `ticket.status` | 视觉 |
@@ -23,6 +23,7 @@ useMessageGroup 接收 keyword、messages、selectedUserMessages,通过 watchE
23
23
  function useMessageGroup(options: {
24
24
  keyword?: ShallowRef<string>;
25
25
  messages: ComputedRef<Message[]>;
26
+ renderMode?: MaybeRef<RenderMode>;
26
27
  selectedUserMessages: Ref<Message[] | undefined>;
27
28
  }): {
28
29
  messageGroups: Ref<MessageGroup[]>;
@@ -59,7 +60,7 @@ role=user role=tool 其他 role
59
60
  成组 后 continue
60
61
 
61
62
  ④ 遍历结束后将剩余 assistantMessages 推入 list
62
- ⑤ 末尾为 user 消息 → 追加 Loading 消息组
63
+ ⑤ 末尾为 user 消息 → 追加 Loading 消息组(`renderMode` 为 `Share` 时不追加)
63
64
  ```
64
65
 
65
66
  注入的占位 Loading 消息使用固定 id:`LOADING_MESSAGE_ID`(`'__loading__'`,定义于 `common/constants`)。`ChatContainer` 据此判断是否在「请求中」阶段,并向 `ChatInput` / `MessageContainer` 下传 `MessageStatus.Fetching`,与流式中的停止、防重复发送行为对齐。
@@ -29,6 +29,7 @@
29
29
  - **自定义作答形态**:通过 `#question` slot 可替换默认选择题,渲染任意表单;作答有效时调用 `setAnswer` 回传 `UserQuestionAnswerItem`,无效时传 `undefined`。
30
30
  - **完成校验**:所有题目均已作答(`setAnswer` 收到有效答案)后才允许点击「完成」。
31
31
  - **跳过**:点击「跳过」返回 `status: 'cancelled'` 与空 `answers`。
32
+ - **提交 loading**:完成/跳过为同步 `onResume`,组件无法在回调内获知请求结果。点击后当前按钮进入 loading、另一按钮禁用,并忽略重复点击;待后台刷新使 `UserQuestionCard` 卸载后状态随实例销毁。
32
33
  - **输入框发送**:存在待回答 UserQuestion 时,用户也可在 `ChatInput` 直接发送;`ChatContainer` 会调用 `onSendMessage` 并在第三参数附带与「跳过」等价的 skip `payload` 及 `interrupt`,输入框内容不会自动清空。
33
34
 
34
35
  ## 数据协议
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "2.0.0",
3
- "generatedAt": "2026-06-16T12:27:28.867Z",
3
+ "generatedAt": "2026-06-26T09:41:20.418Z",
4
4
  "domains": {
5
5
  "setup": {
6
6
  "label": "对话搭建",
package/dist/mcp/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,8 +1,26 @@
1
1
  {
2
2
  "name": "@blueking/chat-x",
3
- "version": "0.0.45-dev.1",
3
+ "version": "0.0.46-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.10-dev.1"
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
  }