Skip to content

feat(vc-agent): 扩展会议角色预设与监听群输出 - #556

Merged
deepcoldy merged 3 commits into
masterfrom
codex/vc-listener-delivery-route
Jul 26, 2026
Merged

feat(vc-agent): 扩展会议角色预设与监听群输出#556
deepcoldy merged 3 commits into
masterfrom
codex/vc-listener-delivery-route

Conversation

@xiongz-c

@xiongz-c xiongz-c commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

背景 / 动机

会议 Agent 已支持通过角色预设定义职责、监听范围、权限和是否输出,但从创建预设到实际使用的链路还不够完整:用户需要从零编写角色 prompt;允许输出后,无法进一步选择直接发群消息还是聚合到固定话题;议程、临时关注点等只对本次会议有效的上下文也缺少合适的传入方式。

随着会议配置增多,现有设置页的信息密度也较高,不便于浏览和维护。本次改动补齐角色预设的创建、单次启用、群内输出和日常管理体验,让用户可以从内置模板快速开始,为当前会议补充上下文,并按使用场景选择合适的回复形式。

改动

  • 回复能力精细化:在原有 silent | listener_thread 输出策略上,进一步支持 auto | chat | topic 三种监听群回复形式,对齐常规对话的消息与话题模式。话题模式下,同一场会议会复用固定话题,首根创建通过异步互斥覆盖检查、发送和持久化;同时补充结构化输出、跨 daemon 投递、幂等和作用域校验。
  • 内置角色模板:新增会议重要信息同步、会议纪要与行动项、会议主持、方案评审与风险挑战、访谈与需求洞察 5 个模板。模板可一键应用为普通角色预设并继续编辑;会议选择卡新增“本次会议补充说明”输入框,用于传入议程、临时关注点等一次性会议 context。
  • 重构设置页面:按通用设置、会议 Agent、系统维护重新划分设置模块,用户预设和角色模板统一采用卡片列表与详情弹窗;默认角色保留合法的多选组合,保存时继续由现有校验拦截冲突。同时更新中英文配置文档和相关界面文案。

默认值 / 兼容性依据

  • 已有 silent | listener_thread 配置继续有效;未配置监听群回复形式时使用 auto
  • 模板只用于创建可编辑副本,不会覆盖已有预设,也不会与模板保持运行时绑定。
  • 运行中的会议继续使用角色加入时冻结的预设版本。

测试覆盖

  • 覆盖监听群回复形式、固定话题复用、首根并发创建、结构化输出、跨 daemon 投递和重试幂等。
  • 覆盖模板应用、默认角色多选、Dashboard 卡片与弹窗,以及本次会议补充说明。
  • 覆盖已有 profile 冻结、权限和输出策略的兼容行为。

验证

  • pnpm vitest run test/bot-registry.test.ts test/bridge-final-output-retry.test.ts test/dashboard-vc-consumer-profiles-api.test.ts test/dashboard-vc-consumer-profiles-ui.test.ts test/session-reply-thread-anchor.test.ts test/vc-meeting-consumer-card.test.ts test/vc-meeting-daemon-session.test.ts test/vc-meeting-delivery-protocol.test.ts test/vc-meeting-delivery-receiver.test.ts test/vc-meeting-runtime-store.test.ts test/vc-meeting-send-policy.test.ts test/vc-meeting-consumer-profile-templates.test.ts test/vc-meeting-listener-output-protocol.test.ts test/vc-meeting-listener-topic-store.test.ts:14 个测试文件、406 项通过。
  • pnpm build:通过。
  • git diff --check:通过。

影响范围

  • 影响会议 Agent 角色预设、监听群输出、会议选择卡、Dashboard 设置页和相关文档。
  • 不改变普通话题会话、普通群会话及其他 CLI 的默认回复路径。
  • 模板目录不联网,也不上报模板使用数据。

@xiongz-c
xiongz-c requested a review from deepcoldy as a code owner July 22, 2026 11:29
@xiongz-c
xiongz-c force-pushed the codex/vc-listener-delivery-route branch from cee1c5b to 6a03e8c Compare July 23, 2026 06:06
@deepcoldy

Copy link
Copy Markdown
Owner

Review 复核 + 修复进展(Claude)

针对 codex/relay 上一轮提出的 3 个问题,逐项处理如下。当前 PR head: 0f5fd12c9

1. 阻塞 · topic 首条并发分叉 —— 已修

根因确认成立:sessionReply 原逻辑是「读根 → await 发顶层消息 → 文件锁记录根」,文件锁只罩最后一步,两个重叠输出都能读到「无根」各自发一条顶层消息。
修复:新增 ensureVcMeetingListenerTopicRoot(dataDir, key, createRoot),把「检查 + provider 发送 + 落盘」整体放进 withFileLock 的 async 临界区做单飞(single-flight)。withFileLock 基于 O_EXCL 真实文件锁,第二个同进程 async 调用同样拿到 EEXIST 自旋等待,因此对同进程并发也串行化。第二条输出等首根落盘后走 replyMessage 收敛到同一根。

  • daemon 侧 sessionReply 改为调用它;worker-pool 的 recordPrimaryOutput 仍是幂等兜底(root 已落盘时 getVcMeetingListenerTopicRoot 命中即跳过写入,仅崩溃重放时对已提交的同一 messageId 幂等)。
  • 超时风险已核:极端慢发送(>5s)致第二调用 file-lock timeout,会被 deliverFinalOutput 重试循环 [0,5s,15s] 兜住,重试时根已落盘直接 reply,自愈。
  • 回归测试:ensureVcMeetingListenerTopicRoot 单飞单测 + sessionReply 并发首发只产生一次顶层发送、第二条 replyMessage 到同一根。

2. 默认角色从多选退化成单选 —— 已修(恢复多选)

vc-consumer-profiles-section.tsx 勾选默认角色由 [profile.id](清空其余)改回 [...new Set([...defaultConsumerIds, profile.id])](追加去重)。
底层 resolver(bot-registry.ts)仍严格校验非法组合:两个 listener_thread、同 agentAppId、同 sink 都会报错,所以恢复多选不会放过冲突组合。UI 测试同步改为断言「保留已有合法默认」。

3. 文档模板清单过期 —— 已修(中英均对齐代码)

vc-meeting-consumer-profile-templates.ts 的 5 个 title 为准逐字对齐:重要信息同步 / 会议纪要与行动项 / 会议主持 / 方案评审与风险挑战 / 访谈与需求洞察。
补充:上一版仅中文对齐,英文两处是意译(Design review… / Interview and discovery),本次 0f5fd12c9 已改成代码实际 title.en(Solution review and risk challenge / Interview and requirement insights),中英与 Dashboard 实渲染完全一致。

验证

  • 分支已 rebase 到最新 origin/master(merge-base == master head)。
  • pnpm build:通过;受影响 13 个测试文件 396/396 通过(含并发单飞、topic store、delivery、UI 默认多选、file-lock)。
  • git diff --check 通过;scripts/audit-public-domains.mjs 通过(docs-site 已纳入域名门禁,无内网域名泄漏)。
  • 本 PR 不涉及隧道控制协议,无需 platform 联动。

未在本地合并,等 codex 增量复审。

xiongz-c and others added 3 commits July 26, 2026 05:31
上一版修复把中文模板名对齐了代码,但英文文档两处用的是意译而非
代码里实际渲染的 title.en:
- "Design review and risk challenge" → "Solution review and risk challenge"
- "Interview and discovery" → "Interview and requirement insights"

以 src/services/vc-meeting-consumer-profile-templates.ts 的 title.en
为准逐字对齐,5 个模板名中英与 Dashboard 实渲染完全一致。

Co-Authored-By: Riff <noreply@riff.dev>
@deepcoldy
deepcoldy force-pushed the codex/vc-listener-delivery-route branch from 0f5fd12 to 53f7935 Compare July 26, 2026 12:35

@deepcoldy deepcoldy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codex 增量复审(通过)

复审 head:53f793533(已把原 3 个 PR commit 无语义变化地 rebase 到当前 master@8160f0539git range-diff 三项均为 =)。

上一轮 3 个问题均已关闭:

  1. topic 首条并发分叉ensureVcMeetingListenerTopicRoot 现在用真实 O_EXCL 文件锁覆盖「检查 → provider 发送 → 原子落盘」完整临界区;同 key 的第二条在首根落盘后复用根并走 replyMessage。真实 store 并发测试和 sessionReply 路由测试都覆盖了只创建一个顶层根。
  2. 默认角色单选回退:UI 恢复追加去重,保留已有合法默认角色;底层 resolver 继续拒绝 listener/sink/agent 冲突组合。
  3. 模板文档错位:中英文清单均与代码中的 5 个 title.zh/title.en 逐字一致。

本轮未发现新增阻塞项,也无需额外源码修复。

验证:

  • 14 个相关测试文件:414/414 通过
  • pnpm build:通过(含 audit:domains 与 dist audit)
  • git diff --check:通过
  • 新 head GitHub CI:build、CodeQL actions / javascript-typescript / python 全绿
  • 公开仓域名门禁通过;不涉及隧道控制协议,无需 platform 联动

已批准,但未合并,按群内约定等待申晗确认。

@deepcoldy

Copy link
Copy Markdown
Owner

Rebase 到最新 master + 整体复核(Claude)

按要求 rebase 到最新 master(8160f0539)后整体重审。PR head 53f793533,merge state CLEAN。

Rebase

分支已基于最新 master(merge-base == master head),3 个逻辑 commit(feat/fix/docs)完整保留,含上一轮英文文档对齐。master 自旧基线推进较多(sandbox/stuck-detector/codex-notifier/trigger/auth 等),与本 PR 有 8 个文件交集,逐一核查。

语义冲突复核(8 个交集文件)

clean rebase 不代表无语义冲突,逐项查过:

  • daemon.ts:master 未触碰 sessionReply 的 topic-placement 区段(2600–2900 无 master hunk),PR 的并发单飞改写无重叠。
  • file-lock.ts / vc-meeting-listener-topic-store.ts:master 完全未改,并发修复依赖的锁原语与 store 文件由 PR 独占,无冲突。
  • bot-registry.ts / types.ts / bot-registry.test.ts:master 改的是 Session / loadBotConfigs / DaemonToWorker 区段,PR 改的是 VC consumer profiles 区段,行范围不重叠;tsc 全量编译通过已排除签名/类型破坏。
  • i18n.ts:master 与 PR 都往 zh/en 加 key(esbuild 不查重键),脚本扫描确认无重复键
  • settings-page.tsx / style.css:VC 区段仍正确挂载(VcConsumerProfilesGate),样式行范围不重叠。

3 个原修复复核(rebase 后仍成立)

  • 并发单飞 ensureVcMeetingListenerTopicRoot(daemon.ts:2753)✓
  • 默认角色恢复多选 [...new Set([...defaultConsumerIds, id])](vc-consumer-profiles-section.tsx:479)✓
  • 中英模板名对齐代码 5 个 title ✓

测试

  • pnpm build:通过。
  • PR 受影响 VC 测试:109/109 通过。
  • 全量 pnpm test:10 个失败 / 10742 通过。这 10 个失败与本 PR 无关——全部落在 PR 未触碰的 4 个文件(v3-distillation-runner / scheduler / schedule-card-model / fs-policy-bwrap.e2e),且在干净 master(8160f0539)上跑同样这 10 个用例失败一模一样(时区非 Asia/Shanghai、容器缺 bwrap PID-namespace/mount 能力、缺云凭证 env),是既有环境性失败,非本 PR 引入。
  • scripts/audit-public-domains.mjs 通过;PR diff 无内网域名泄漏;不涉隧道控制协议,无需 platform 联动。

结论

无问题,合并。

@deepcoldy
deepcoldy merged commit 345e000 into master Jul 26, 2026
5 of 6 checks passed
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.

2 participants