Skip to content

feat:1、subagent支持skill,mcp;2、@提及支持药丸样式;3、聊天记录滚动时用户提问自动吸顶悬浮能力;4、 Shift+Enter 换行提示#715

Closed
supreme0597 wants to merge 34 commits into
xerrors:devfrom
supreme0597:dev-new

Conversation

@supreme0597
Copy link
Copy Markdown
Contributor

变更描述

简要描述这个 PR 做了什么

  • 重构输入框与历史消息中的 @ 提及药丸样式与极客交互体验:将提及药丸升级为 100% 纯正 Token 驱动自适应深色模式,引入亚像素垂直居中对齐、字型渲染缓冲防边缘物理裁剪以及 P0 级 HTML 转义 XSS 攻击防护;优雅封装 mention.jsfile_utils.js 统一组件逻辑。
  • 建立全新「无界全局文件预览系统」:解耦并设计高内聚单例弹窗组件 AgentFilePreviewModal.vue,打通 Pinia 响应式触发源与 Blob 内存自动销毁,精简清洗大聊天组件与交付件卡片中数百行重复代码。
  • 封堵双 Watcher 冲突 Bug 与性能守护:为全局文件预览增加 useInlinePreview.value 内联拦截守卫,彻底解决了宽屏模式下点击药丸产生双倍 API 重复调用的严重缺陷。
  • 优化聊天交互与消息流排版表现:修复对话框换行丢失及空格合并的历史排版漏洞,新增聊天记录滚动时用户提问自动吸顶悬浮能力与 Shift+Enter 换行提示,精简了吸顶悬浮的动画状态锁和同步物理预判;重新精雕细琢提问卡片圆形浮球动作条与收缩折叠按钮的悬浮与 hover 隐藏机制,并升级 scrollToBottomStaticForce 置底重试策略以彻底解决会话切换时因异步渲染导致无法贴底的 Bug。
  • 支持 SubAgent 的 MCP 与 Skills 独立配置及运行时隔离:支持子智能体在编译期绑定专属普通/MCP工具和 Skills,运行时按需动态激活,并通过实例级状态隔离防止父子智能体状态污染,配套完整单元与集成测试。
  • 优化开发环境后台 worker 代码热重载机制:引入 watchfiles 级进程监控与超时强杀释放,彻底解决了原热重载死锁卡死缺陷,大幅提升代码变更的重启效率。
  • 统一本地与 MCP 动态工具容错控制:为本地及 MCP 动态工具注入统一的 handle_tool_error 异常捕获与容错逻辑,防止因外部工具调用失败导致 Agent 运行崩溃。

变更类型

  • 新功能
  • Bug 修复
  • 文档更新
  • 其他

测试

  • 已在 Docker 环境测试
  • 相关功能正常工作

相关日志或者截图
image
image
image

image image

说明

(可选)有什么需要特别说明的吗?

  • 本来想拆分多分支提交的,但是我自己都被搞懵逼了,整了两版,冲突越来越多。实在是搞不定了,一把提吧。

💡 提示: 提交前可以运行 make lintmake format 检查代码规范

1. 重构 MessageInputComponent.vue 的 contenteditable 内容序列化算法,采用递归树深度优先遍历,智能还原由浏览器自动插入的块级包裹元素(如 DIV、P)和 BR 的折行换行符 (\n)
2. 将 AgentMessageComponent.vue 中消息气泡的 white-space 样式由 pre-line 优化为更高保真的 pre-wrap,防止多余连续空格被合并,原汁原味还原消息排版
1. 更新 AgentInputArea.vue 输入框占位符 (placeholder),明确引导用户通过 @ 提及资源,并使用 Shift + Enter 进行换行
2. 在 MessageInputComponent.vue 发送按钮上增加悬浮提示 (Tooltip),在非 Loading 状态下明示 '发送 (Enter) / 换行 (Shift + Enter)' 快捷键指南,极大提升用户体验
- 在 AgentChatComponent.vue 中引入滚动监听机制,计算并动态展示完全滚出视野的最新用户提问
- 支持点击悬浮条平滑滚动回溯定位至对应问题锚点
- 在 AgentMessageComponent.vue 中为消息框绑定 data-msg-id,确保通过消息 ID 精确查找并解决匹配比对问题
- 增加了美观的毛玻璃质感,并完美兼容自适应暗色模式样式与划入动画
- 恢复用户消息气泡动作按钮(复制、收起、折叠)为圆形实体小球样式,绝对定位悬挂在气泡外部右下角底边(bottom: -20px)
- 移除 AgentChatComponent.vue 中冲突的旧全局吸顶提问条组件结构、滚动事件监听及对应 Less 规则
- 保留 props.message.id 变化时的 Observer 重连监听以解决 Vue 消息组件 patch 复用失效的问题
- 修复内容很短的单行消息在吸顶触发时误显向右收起(>)灰色浮球按钮的问题
- 限制 shrink-right-btn 的显示条件为 isStuck && isMultiLine
- 将收起小浮球(shrink-right-btn)绝对定位挂在提问气泡的左下角外面(bottom: -20px; left: 0px)
- 默认隐藏(opacity: 0),只有当鼠标 hover 悬浮在提问条/气泡上时才淡入显现,与右下角的复制/控制按钮形成对称美学
- 在吸顶折叠单行模式下,收起按钮自适应平移至单行最左侧内部(left: 0px),并配套增加 message-text 的 padding-left 避让,彻底杜绝文字与按钮重叠
- 移除吸顶折叠(is-collapsed)时在框内左右侧 padding 避让机制,文字在不悬浮时完美填满单行胶囊,消灭多余的视觉空白
- 统一所有状态定位:动作小球(复制、左右收起、折叠)在吸顶折叠时也与普通状态一致,全部作为小浮球绝对定位挂在单行胶囊下的外边缘底侧(bottom: -20px)
- 只有在鼠标 hover 提问条/消息气泡时,浮球动作控制栏才优雅淡入显现,保持常态视觉纯净
- 更新 AgentChatComponent.vue 的对话状态控制
- 优化 AgentMessageComponent.vue 对流式卡片与消息的处理
1. 重构输入框药丸组件(MessageInputComponent):移除大块背景色与硬边缘,重塑为无界极简皮肤。实现后缀名自动检测并渲染三色微发光的 CSS 代码迷你高亮行。彻底解决删除键空白问题,实现 Notion 级呼吸向右撑开 Hover 动效。做像素级(Pixel-perfect)垂直对齐纠偏,杜绝亚像素舍入错位。
2. 建立全局独立预览 Modal 体系(AgentFilePreviewModal):解耦原先散落各处的私有 modal 及 Blob 资源管理代码。通过 Pinia 状态建立订阅信号桥梁,实现多入口(药丸、交付件、窄屏树节点)的极致统一预览。
3. 修复关键双 Watcher 重复请求隐患(AgentPanel):添加 useInlinePreview.value 判定守卫,彻底根治宽屏下重复调用文件预览接口的 Bug。
4. 公共函数去重提取:将 Content-Disposition 文件名解析 parseDownloadFilename 提取至 file_utils.js 中达成 DRY。
5. 更新 roadmap 开发日志。
1. 将提及药丸样式完全提取并重构至独立的 mention-pill.less 样式表中
2. 彻底解决暗色模式下提及药丸不可见、对比度低的视觉缺陷,使用莫兰迪品牌主色进行响应式自适应适配
3. 彻底清除 hover 状态中各种硬编码 rgba 色彩,完全绑定至系统原生色阶(如 --color-info-50 等)
4. 增强提及机制安全防护,引入 mention.js 构建 DOM 结构,彻底防范 XSS 漏洞注入
5. 更新 roadmap.md 文档,记录提及药丸自适应与安全优化内容
…ne-pill to sync UI UX updates and resolve conflicts
# Conflicts:
#	docs/develop-guides/roadmap.md
# Conflicts:
#	docs/develop-guides/roadmap.md
- 在 mcp_service 的 get_mcp_tools 加载出口全局设置 tool.handle_tool_error = True
- 在 toolkits registry 的 @tool 装饰器中对本地工具默认开启 handle_tool_error = True
- 修复因 MCP/本地工具内部执行出错抛出 ToolException 时击穿流服务导致 crash 的 bug
- 新增两个单元测试进行完备性验证
原因:
1. 后端接口 GET /api/system/skills 与 GET /api/system/mcp-servers 之前被权限校验拦截。
2. 前端本地在调用拉取技能和MCP服务底集的方法时,前置调用了 apiAdminGet 会在本地硬性拦截非管理员权限的用户,导致请求被掐断并静默兜底返回空数组。

修改:
1. 后端放开此二接口路由为低特权只读访问,且对 MCP 服务器的敏感连接信息(如 url、command、args、env、headers)在 user 角色拉取时执行强力脱敏过滤,并补充相关单元测试。
2. 前端将 listSkills 与 getMcpServers 从 apiAdminGet 调整为 apiGet,绕过本地硬拦截。
3. 维护 roadmap.md 进度记录。
1. 技能列表接口:普通用户返回数据通过白名单字段投影,屏蔽 dir_path 等绝对物理路径。
2. MCP 服务器列表接口:废除原 pop() 黑名单模式,升级为显式白名单准入映射。
3. 单元测试:同步升级 test_skill_router.py 和 test_mcp_router.py,强化字段脱敏性测试断言。
- 移除提问气泡中冗余的 isSwitching 状态锁与同步物理预判,简化为纯净相交哨兵。
- 优化 human 气泡的 transition 为指定非高度排版属性,规避初次挂载时过渡动画引发的高度计算延迟。
- 重构 scrollToBottomStaticForce 方法,引入 nextTick、waitForLayoutStable 和双重延迟静默重试,确保切换对话后子组件异步渲染也能稳定贴底。
@supreme0597
Copy link
Copy Markdown
Contributor Author

@xerrors 麻烦看看呢

@supreme0597
Copy link
Copy Markdown
Contributor Author

算了,我还是再整理下,这样确实太乱了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant