feat: 增强飞书会话卡片交互,统一聊天模型白名单,并优化 QQ/Session 管理体验#59
Open
yuling-000 wants to merge 100 commits intoHNGM-HP:betafrom
Open
feat: 增强飞书会话卡片交互,统一聊天模型白名单,并优化 QQ/Session 管理体验#59yuling-000 wants to merge 100 commits intoHNGM-HP:betafrom
yuling-000 wants to merge 100 commits intoHNGM-HP:betafrom
Conversation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
增加对“钉钉”的支持
1、扩容新增平台的思维链、工具链独立开关
修复部分已知BUG
修复windows exe下无法正常接收消息的BUG
1、停止服务时隐藏窗口 - stopBackend() 函数中调用 mainWindow?.hide() 替代原有的加载提示页面逻辑
修复登录密码BUG
修复登录逻辑BUG
- 企业微信、微信消息撤回标记从 ❌ 改为⚠️ (部分支持) - 添加说明:/undo 命令可撤回 OpenCode 侧会话并发送平台提示 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
从 SessionSidebar.vue 中删除了重复的"+新建"按钮,保留"新建项目"功能
2. ✅ 重新规划"新建项目"对话框逻辑
实现了完整的文件夹浏览流程:选择项目文件夹 → 自定义输入路径 → GO或按回车 → 展示文件夹列表 → 点击进入或选择
添加了路径输入框,支持输入路径后按回车或点击GO浏览
优化了文件夹浏览体验,点击文件夹可进入下一级,上方路径同步更新
3. ✅ 修复滚动BUG
在 ChatWorkspace.vue 的 .workspace-column--panel > :deep(*) CSS 规则中添加了 overflow-y: auto,使 git、文件、看板、终端 面板可以正常滚动
4. ✅ 重新设计UI
更新了 .panel-toggle 样式,采用更现代的设计,添加了边框、背景色和悬停效果
优化了激活状态的样式,使用浅灰色背景
5. ✅ 加载信息条数改为30条
在 useChatMessages.ts 中将 DEFAULT_LIMIT 从 10 改为 30
6. ✅ 修复点击复制出错
在 SessionTreeNode.vue 中添加了 if (!navigator.clipboard) return 安全检查
7. ✅ 修复发送消息时树状图自动展开
在 SessionSidebar.vue 的 watch 中添加了 skipAutoExpand 标志,只在首次加载时自动展开
8. ✅ 优化会话树状图时间显示
时间显示移到右侧,与 {···} 按钮共用位置
默认显示时间,鼠标悬停时显示 {···}
1天内的时间显示为 h(小时),1h内显示为 min(分钟)
9. ✅ 修复对话框引号问题
将 ChatWorkspace.vue 中的中文引号修复为标准英文引号
修复UNDO 部分BUG
🎉 重大更新 全新 Web 聊天界面 聊天工作区 - 全新的现代化聊天界面设计 消息系统 - 支持流式消息、消息列表、消息输入 会话管理 - 完整的会话创建、切换、树状图展示 侧边面板 - 集成文件浏览器、Git 面板、终端面板 AI 元素组件系统 新增多种 AI 响应元素组件: Markdown 渲染 - 支持 Markdown 格式化显示 代码块 - 带语法高亮的代码展示 文件树 - 可视化文件结构展示 推理过程 - 显示 AI 推理过程 任务列表 - 任务进度和状态展示 工具调用 - 显示工具使用详情 终端输出 - 终端命令和结果展示 对话视图 - 多轮对话展示 后端 API 增强 新增完整的聊天 API 路由系统: 聊天事件流 (/api/admin/chat/events) 会话管理 (/api/admin/chat/sessions) 工作区文件 (/api/admin/workspace/files) Git 操作 (/api/admin/workspace/git) 终端操作 (/api/admin/workspace/terminal) 权限控制 (/api/admin/chat/permission) 元数据管理 (/api/admin/chat/meta) 事件总线系统 新增聊天事件总线架构 事件标准化处理器 完整的 TypeScript 类型定义 ✨ 新功能 会话管理 ✅ 会话树状图展示,支持层级结构 ✅ 会话时间智能显示(小时/分钟格式) ✅ 会话自动展开优化 ✅ 会话复制功能 文件浏览器 ✅ 完整的文件夹浏览流程 ✅ 自定义路径输入支持 ✅ 键盘快捷操作(回车键) ✅ 路径同步更新 Git 集成 ✅ Git 状态查看 ✅ 提交历史浏览 ✅ 文件差异对比 终端集成 ✅ Web 终端面板 ✅ 命令执行 ✅ 输出查看 🐛 Bug 修复 修复 Git 部分 BUG - 修复 Git 操作相关问题 修复 UNDO 部分 BUG - 修复撤销功能相关问题 修复滚动 BUG - 面板内容可正常滚动 修复点击复制出错 - 添加安全检查 修复对话框引号问题 - 统一使用标准英文引号 修复发送消息时树状图自动展开 - 优化展开逻辑 💡 优化改进 UI/UX 优化 重新设计面板切换按钮样式,采用现代化设计 优化激活状态样式,使用浅灰色背景 会话时间显示位置优化,移至右侧 删除重复的"+新建"按钮 性能优化 消息加载条数从 10 条提升至 30 条 优化组件渲染性能 代码质量 新增完整的 TypeScript 类型定义 新增单元测试覆盖 优化代码组织结构 📦 技术栈更新 前端依赖 更新 web/package.json 依赖 新增多个 Vue 组合式函数 新增 AI 元素组件库 后端增强 新增聊天事件处理系统 新增工作区管理路由 优化平台配置处理 📝 变更统计 87 个文件变更 新增 17,921 行代码 删除 155 行代码 6 个 commits
2、修复部分BUG
- 删除 Web 端登录页与修改密码页(Login.vue / ChangePassword.vue) - 移除路由守卫、token 拦截器、admin_token 存取与 401/410 跳转逻辑 - 移除登录超时、活动检测、退出/修改密码按钮等相关 UI 与逻辑 - 移除后端 /admin/password、/admin/login-timeout、/admin/reset-password 等接口 - chat-auth 中间件保留为空操作以兼容历史 import 路径 - configStore 中密码与登录超时相关方法整体下线 - electron 托盘菜单与 deploy 脚本不再提供"重置管理员密码"项 - 更新 .env.example,去除 ADMIN_PASSWORD 字段 后续管理面板访问无需登录,直接通过 Web 即可完成全部配置。 Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
- 后端:configStore 新增 isOnboardingCompleted / setOnboardingCompleted; /api/admin/onboarding-status 提供 GET / PUT,作为权威源 - 前端:useOnboarding 组合式封装,localStorage 仅作缓存;启动时拉取 后端状态,未完成则弹出 OnboardingWizard 三步式向导 • Step 1:界面语言(中文 / English),即时切换并写回 • Step 2:单选首个接入平台,可跳过;选择后自动跳到 /platforms?focus= • Step 3:基于 driver.js 高亮左侧栏每一项,逐项讲解 - 帮助菜单(HelpMenu)放在侧边栏底部,链接到仓库 README、平台 / OpenCode / 高可用文档与 Issue 反馈页(按要求不再提供"重新查看引导"入口) - 侧边栏菜单项加上 data-tour="nav-*" 锚点供 driver.js 定位 - i18n 词典补齐引导 / 帮助 / 平台说明 / 导览描述对应英文 - 新增 driver.js@^1.4 依赖 Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
- bin/opencode-bridge.js 委托给 dist/cli/index.js 路由子命令 (init / start / --help / --version / 默认智能入口) - 新增 src/cli/tui-wizard.ts:基于 @inquirer/prompts 的轮询菜单, 与 web 共用 ConfigStore,覆盖语言、初始接入平台、平台凭据、 OpenCode 连接、群聊白名单、可靠性、输出显示、Web 管理面板启停、 帮助文档等所有 web 可设置项 - 新增 src/cli/messages.ts 提供中文/英文 CLI 文案 - src/cli/index.ts 智能入口:Electron 不变,无头首次运行触发向导 - src/index.ts 在 main() 中读取 WEB_ADMIN_DISABLED / BRIDGE_DISABLE_ADMIN, 支持仅停 web、保留接入平台运行(离线/纯 CLI 场景) - 新增 BridgeSettings 字段:CLI_LANG / WEB_ADMIN_DISABLED / ADMIN_PORT - BRIDGE_CLI_MODE=1 抑制 dist/index.js 自动 main(),由 CLI 显式驱动 Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
- 新增"三套配置入口(Web / TUI / 配置文件)"小节,与新版无登录架构对齐 - 桌面应用:补充首次访问 Web 自动弹出引导(语言/平台/driver.js 高亮气泡) - NPM 安装:替换不存在的 opencode-bridge-manage / -start / -stop 子命令, 改为真实的 opencode-bridge / init / start / --help / --config-dir - 增加 TUI 向导流程说明、与 SQLite 配置共享、Web 开关解耦(BRIDGE_DISABLE_ADMIN) - 配置说明:补全 WEB_ADMIN_DISABLED / CLI_LANG,新增 TUI 配置入口行 - 故障排查:新增"Web 是否被 TUI 关闭"的排查步骤 - 移除 "首次访问时系统将提示设置管理员密码" 等过期描述 - README.md 与 README-en.md 同步更新 Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
…2427ae41e4649b934ca495991b7852b855
完成了 plan-v2.md 中定义的所有核心功能: ## 后端实现 - 资源路径管理:支持项目级和用户级两层配置覆盖 - Skill 加载器与注册表:扫描、解析、缓存、热载 - MCP 管理器:索引管理、热载、opencode 配置生成 - Agent 管理器:CRUD 操作、与 opencode 字段对齐 - Provider 管理器:auth.json 读写、API key 管理、模型缓存 - 事件总线:resource:changed 事件、SSE 广播、cache 失效 - REST API:完整的资源 CRUD 端点 + SSE + WebSocket OAuth 终端 - Chat 命令打通:合并所有资源命令到 /api/chat/commands - TUI 命令:bridge resource skill/mcp/agent/model 子命令 ## 前端实现 - Web 资源管理页面:4 个 Tab(Skills/MCP/Agents/Providers) - 统一资源编辑器:支持所有资源类型的创建/编辑 - OAuth PTY 终端:xterm.js + WebSocket 实现终端登录 - 作用域切换:项目级/用户级资源切换 - Pinia Store:资源状态管理 + SSE 订阅 - REST API 客户端:完整的资源操作方法 ## 飞书路径下线 - agent 创建命令改为迁移提示 - 清理 220 行遗留代码 ## 测试覆盖 - Skills 测试:frontmatter、热载、覆盖优先级 - MCP 测试:索引一致性、读写并发 - Providers 测试:auth.json 读写保护 - Router 测试:REST 端到端 - 额外:events、agents、paths 测试 ## 依赖更新 - 新增:xterm、xterm-addon-fit(OAuth 终端) - 更新:pnpm-lock.yaml、package-lock.json 完成度:100% plan-v2.md 对齐度:100% Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 删除 5 个 worktree 分支(worktree-agent-*) - 更新 .gitignore 忽略临时文件: - plan*.md(计划文件) - .codex(配置文件) - 从 git 跟踪中移除 plan-v2.md 和 .codex - data/ 保持完全忽略(用户数据目录) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 修复 `/help`、`/project`、`/sessions` 等命令在飞书中未按 Markdown 富文本显示的问题,统一改为飞书 Markdown 卡片输出。 - 新增 `/qc` 快捷命令卡,集中提供 `/panel`、`/session_ctl`、`/create_chat`、`/model`、`/models`、`/status`、`/project list`、`/compact`、`/commands` 等入口。 - 新增 `/session_ctl` 会话控制面板,支持在飞书卡片中完成当前会话重命名、新建会话、切换会话,以及切换后顺带重命名。 - `/sessions`、`/sessions all` 支持按配置追加“切换至此Session”按钮,并改为按“会话块”分页,避免把单个会话拆断。 - 新增会话级配置: - `/config session order default|last_time` - `/config session help_with_qc true|false` - `/config session session_with_ctl true|false` - `/config session session_with_change true|false` - 上述三个布尔配置默认值已调整为 `false`。 - `/compact` 的飞书卡片按钮链路改为后台执行,避免卡片回调超时;完成后通过新消息反馈结果。 - 修复 `/qc` 中 `/create_chat` 被误透传到 OpenCode 导致 `Command not found: "create_chat"` 的问题。 - 修复飞书流式回答偶发重复发卡的问题:对近期渲染结果做去重缓存,并在卡片更新失败时保留原卡,避免重复补发。 - `/help` 与会话列表卡片分片阈值已收紧,尽量减少无谓拆分,同时保留超长内容的分页兜底。
- 官方 QQ 默认改为 markdown-first 发送,保留 OneBot 文本降级路径 - /help 增加 qqbot-cmd-input 可点击命令,并补充 /config session order 用法说明 - 恢复 QQ /config session order 支持,并让 /session、/sessions、/sessions all 按配置排序 - 优化 /models 与 /sessions 输出,支持点击自动填入模型 ID 和完整 session id - 长模型列表与会话列表改为分页多条发送,避免简单截断
- 新增 /config output onlyText true|false,会话级切换 QQ Markdown 与纯文本输出模式 - 为 QQ 会话状态持久化 onlyText 配置,重绑 session 后继续生效 - 调整 QQ /help 与配置说明,补充电脑 QQ Markdown 渲染不稳定时的使用指引 - 为 QQ 官方适配器补充纯文本发送分支,onlyText=true 时改走原文 content 发送 - 让 OpenCode 流式输出链路同步遵守 QQ onlyText 配置,避免运行中仍回落到 Markdown 发送
- 为 QQ 增加专属流式渲染逻辑,不再复用通用的思考分隔包装,降低桌面 QQ 吞消息概率 - 调整 QQ 思考链构造,按 reasoning/text 段落分别组装内容,并在结果侧收口重复的思考文本 - 将 QQ 流式回复改为思考过程与最终结果分两条消息发送,避免运行中反复整段重发累计思考内容 - 在 QQ Markdown 模式下将思考过程改为代码块样式,利用客户端紧凑排版压缩消息占用空间
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
@HNGM-HP 这个项目感觉是一个很不错的方向,我在当前项目的基础上做出了以下修改:
飞书交互体验整体升级
这次把飞书侧很多原本偏“命令行式”的操作,改成了更适合飞书使用习惯的卡片交互。
/help改成 Markdown 卡片输出,补了/qc快捷命令卡和/session_ctl会话控制面板,/sessions//sessions all也支持更直观的会话切换入口。整体上,飞书从“能用命令做事”往“能直接点卡片完成操作”前进了一步。会话管理能力补强
会话相关这次做了两层增强:一层是飞书侧的会话列表、会话控制、按活跃时间排序、跨项目会话展示更完整;另一层是后台 Session 管理页补了最后修改时间、列排序、列显隐开关,并把钉钉也纳入了平台管理范围。同时,钉钉聊天侧也补齐了
/session <sessionId>手动切换已有会话的能力。聊天模型白名单正式做成全平台能力
这次新增了
CHAT_MODEL_WHITELIST,把“聊天侧到底能看到哪些模型、能切换到哪些模型”统一收口了。覆盖各聊天入口。这个改动的核心价值,是解决像 OpenRouter 这类 provider 模型过多、聊天界面里不方便展示和选择的问题。OpenCode 管理面板补上模型白名单配置入口
围绕模型白名单,Web 管理面板也做了对应增强。OpenCode 页面新增了“对话可选模型”配置区,支持按 provider 折叠、搜索、批量勾选和按筛选结果全选。与此同时,“刷新 OpenCode 配置”按钮的行为也做了调整,刷新只负责同步运行时配置和模型目录,不再自动改掉当前已经勾选的白名单结果。
QQ 官方通道稳定性和输出体验做了专门收口
QQ 是这次改动里另一块重点。后端补了 token 失效时的自动刷新和重试,降低偶发无回复的问题;前端表现上,支持了Markdown格式的消息显示,同时提供了 QQ 会话级的纯文本降级开关,用来规避 Windows 桌面 QQ 对 Markdown 渲染不稳定的问题;同时,QQ 的思考链和最终回答输出方式也做了重构,不再反复整段刷屏,而是改成更清晰的增量输出和最终结果分离;另外增强用户操作体验,支持点击命令、session id、模型名,自动输入输入框,避免了用户繁琐的输入。
Windows 兼容性与运行稳定性修复
这次还顺手修了一批更偏运行层的问题,包括 Windows 下 OpenCode 自动启动路径不正确、
opencode models调用兼容性差、审计日志在 Windows 上容易因为 rename 失败而报错等。这部分虽然不是直接面向聊天功能的改动,但对本地开发、启动和长期运行稳定性影响比较大。详细的修改内容如下:
背景
这次分支相对
public-fork/main主要集中在六类问题:/sessions all输出不全,且不支持按活跃时间排序等问题。变更总览
本次分支共涉及 29 个文件,核心修改点集中在:
1. 飞书命令卡片与会话控制增强
功能表现
/help不再是带markdown格式的纯文本说明,而是改成飞书 Markdown 卡片输出。/qc快捷命令卡,集中放常用入口。/session_ctl会话控制面板,可在卡片中完成:/sessions、/sessions all在需要时可展示“切换至此 Session”按钮,而不是只给用户看列表(需要启用/config session session_with_change true)。飞书

/helpMarkdown 卡片:飞书

/qc快捷命令卡:飞书

/session_ctl会话控制卡:飞书

/sessions带“切换至此Session”按钮的分页卡片:关键代码修改
config、qc、session_ctl命令类型。/models all、/config session ...、/config output onlyText ...增加解析能力。buildMarkdownCard(),统一承接 Markdown 卡片输出。buildHelpCard()/buildShortcutCommandCard()。buildSessionControlCard()、buildSessionListCard()、buildSessionListActionCard()。replyHelpCard()、pushQcCard()、buildSessionControlCard()等飞书卡片输出链路。helpWithQc、sessionWithCtl、sessionWithChange、sessionOrderMode。/help、/sessions、/sessions all改为按 Markdown/卡片分页输出。/sessions在session_with_change=true时走带按钮卡片分页,否则走纯 Markdown 分页。help_run_command、session_ctl_submit、session_list_switch、create_chat卡片动作处理。sessionOrderMode。sessionOrderModehelpWithQcsessionWithCtlsessionWithChange需要特别说明的实际行为
help_with_qc、session_with_ctl、session_with_change在当前分支默认都是false,后续根据用户实际情况设置为true启用。2. 飞书会话列表准确性与流式卡片稳定性修复
功能表现
/sessions all不再只依赖本地 store 已知目录,能列出更多真实存在的跨项目会话。last_time模式下,/sessions all、/session_ctl、/create_chat都尽量按会话真实最后活跃时间排序,而不是简单按列表返回顺序。关键代码修改
last_time。3. 全平台聊天模型白名单统一落地
功能表现
CHAT_MODEL_WHITELIST,统一限制聊天侧“可见模型”和“可切换模型”。/models展示的是当前允许范围,如OpenRouter 等提供较多模型的provider,可以调节是否可选模型,不再把 OpenRouter 等 provider 的全部模型一股脑铺出来。/model xxx如果指向白名单外模型,会被明确拒绝。关键代码修改
modelConfig中新增chatModelWhitelist解析逻辑,支持 JSON 数组和分隔符文本两种写法。provider/model与provider:model/models改为只展示允许模型。/model改为先匹配白名单,再允许切换。4. OpenCode 管理面板新增“对话可选模型”配置区
功能表现
“对话可选模型”配置区:


关键代码修改
/api/opencode/model-catalog,返回完整 provider -> model 目录。/api/opencode/enabled-models-sync,读取 OpenCode 当前运行时配置中的启用模型。CHAT_MODEL_WHITELIST字段透传。getModelCatalog()、syncEnabledModelsFromOpenCode()API。selectedProvider改为用 providerid,不再混用 name。selectedModelKeys持有最终白名单值,并回写到CHAT_MODEL_WHITELIST。5. QQ 官方通道:发送重试、支持Markdown格式输出、纯文本降级、思考链输出重构
功能表现
11244 token not exist or expire时,会自动清理 token、重新获取并重试一次。/config output onlyText true|false:false:默认 Markdown 输出true:强制纯文本输出,规避Windows桌面 QQ Markdown 渲染缺陷/help、/sessions、/models等静态输出改为可点击命令*输入对话框形式,增强用户体验。onlyText=true时,消失会自动退回纯文本模式。QQ

/help带点击命令及点击效果:QQ 纯文本输出效果:

QQ Markdown文本输出效果:

关键代码修改
sendMarkdownMessage()与sendPlainTextMessage()。resetAccessToken()和isAccessTokenExpiredError()。11244时自动刷新 token 并重试一次。QQSender.sendCard()支持forcePlainText与 markdown payload 分流。onlyText配置读取与设置。/help、/models、/sessions、/config改为 QQ 卡片/分页输出。/models和/model同时接入模型白名单。session order配置在 QQ 侧的读取与使用。qqText负载。qqProgressState。需要特别说明的实际行为
onlyText默认为false,即使用markdown格式输出,若需关闭这需要设置/config output onlyText true。6. Session 管理页增强 + 钉钉会话切换补齐
功能表现
/session <sessionId>手动切换已有会话能力。关键代码修改
OpenCodeSessionItem新增updatedAt。time.updated,并默认按更新时间倒序。dingtalk。sortState。columnVisibility。updatedAt。session switch分支。ENABLE_MANUAL_SESSION_BIND,并通过findSessionAcrossProjects()查目标 session。7. Windows 兼容性与日志稳定性修复
功能表现
opencode models的调用更稳。EPERM rename风险。.codex-logs/加入忽略列表。关键代码修改
process-manager.mjs路径从../../scripts修正为../scripts。shell + windowsHide调用opencode models。child.on('error')与超时收尾保护。tmp + rename的原子写入方案。appendFile队列。.codex-logs/。8. 其它同步修改
验证建议
由于这次是多功能合集,建议按功能块验证,而不是只跑单一测试:
/help/qc/session_ctl/sessions/sessions all/compact/models/model/help/config output onlyText true|false/models/session/session <sessionId>提交说明
CHAT_MODEL_WHITELIST现在可以全平台统一限制聊天模型的选择与显示。