Skip to content

feat(subagent): add management and transcript inspection - #1484

Open
CATMIAOZHI wants to merge 5 commits into
AAswordman:devfrom
CATMIAOZHI:feat/chat-subagent-interface-current
Open

CATMIAOZHI wants to merge 5 commits into
AAswordman:devfrom
CATMIAOZHI:feat/chat-subagent-interface-current

Conversation

@CATMIAOZHI

@CATMIAOZHI CATMIAOZHI commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

feat(subagent): add management and transcript inspection

变更说明 / Description

为普通子代理提供任务卡、管理列表和只读记录查看入口,保留往返主聊天的位置,并改善长过程的加载与展示。只有归档任务时默认显示“已归档”,空切换列表显示明确提示。

背景与动机 / Context and motivation

该层补齐 V2 协作功能的用户界面:用户可以从主聊天查看子代理任务、工具细节和用量,再返回原位置。堆叠在 #1483 之上,目标为 dev,因此当前差异包含 #1481、#1482 和 #1483 的父层内容。父层合并后将重放本层,缩小差异。

改动范围 / Changes

  • 子代理任务卡、状态和详情、管理与切换列表;区分阶段文字和最终返回结果。
  • 只读子聊天允许查看工具参数、结果、token、上下文和费用估算,发送及修改权限继续受限。
  • 过程结构先读元数据,展开后分批读取正文;长正文惰性显示,以消息/分块锚点恢复位置。
  • 浮窗采集附件时固定目标,提交时再次检查只读边界,避免切换页面后误写入子聊天。
  • 归档满足条件的旧代理、释放名字并分段保存;保护运行任务和待收消息,保留旧记录及身份隔离。
  • 按目标模型能力映射显式思考强度,未指定时继承模型配置。
  • 只有归档记录时默认选择对应筛选;用户手动选择保持不变。切换列表为空时使用已有提示文案。
  • 编辑按会话和消息时间戳定位,异步加载旧消息不会使保存落到另一条消息。等待授权和运行中的工具不会提前显示成功;浮窗卡片遵守详情开关。

兼容性与风险 / Compatibility and risks

当前层包含 Room 23→24 迁移,为子代理记录保存外部归属及模型轮次数。迁移只修改数据库结构并创建待恢复检查点,不读取外部协作文件,避免损坏或缺失的文件阻断普通聊天数据库打开。服务初始化后独立恢复归属,仅按运行 ID 与子会话 ID 双重匹配填写空归属;更新和清除检查点在同一事务内完成。失败保留原文件与检查点并显示错误,修复存储后重启可重试;成功后不在后续冷启动重复读取归档。协作存储引入分段格式,保留旧版读取。
最新 dev 经 #1478 恢复为 Room 21。本分支已适配 ca968ce95,按 21→23→24 迁移,保留 group 并移除已撤回的文件夹依赖。维护者已在协调回复中确认本次改动不受此前对话树层级问题影响。PR 已转为 Ready,仍按父层依赖顺序审阅;该回复不代替数据库升级及备份导入验证。 不支持覆盖安装到旧文件夹预览版。
普通聊天不加入 Orbit 自动唤醒、时间/关系信封、权限自动审核后台或自动记忆学习后台。本层也不提供普通聊天归档功能。

关联 Issue / Related issue

Refs #573。该讨论包含子代理和 Goal;本层只补齐普通子代理管理与查看体验,不自动关闭整个讨论。
#1380 要求普通会话归档,与本层子代理记录归档不同,不宣称修复该 issue。

验证方式 / Verification

  • 本轮修复前的全量基线:Windows、JDK 21、Android debug,:app:testDebugUnitTest 成功,1944 项中 1935 通过、9 跳过,0 失败。
  • 本轮修复的编译及聚焦测试::app:testDebugUnitTest,筛选 SubagentOwnerRestorationTest、ChatFeatureMigrationTest、ChatHistoryManagerPersistenceTest、CollaborationStoreTest,19 项全部通过。覆盖纯结构迁移、损坏/缺失文件、失败后重试、身份匹配、已有归属保护、取消和跨 repository 的一次性恢复。
  • 当前差异的逻辑、性能、界面三项独立静态审计通过。未运行本地 Lint。
  • 真机待验证:任务卡授权状态、主聊天与子代理往返、长过程分批展开、编辑保存、归档筛选和空列表提示。因数据库预览版本不兼容,本轮没有覆盖用户手机。

证据 / Evidence

范围与验证说明:docs/TODO/subagent-collaboration/01-parity.md、02-list-feedback.md、docs/TODO/subagent-owner-restoration/index.md。
逻辑、性能、界面静态审计均通过;静态审计不代替真机体验。提交前补充任务卡、只读工具详情、长会话返回、归档筛选和空状态记录。

检查清单 / Checklist

  • 我已记录可复现验证和未运行项原因 / Reproducible verification and reasons for unrun checks are recorded
  • 日常开发 PR 的目标分支为 dev / The target branch is dev
  • 我已确认 Candidate checks 覆盖改动范围,并会处理技术失败项 / Candidate checks covers the change scope and technical failures will be addressed
  • 最终 diff 无无关、临时、生成、二进制或敏感内容 / Final diff has no unrelated, temporary, generated, binary, or secret content
  • 已提供对应的回归、UI、文档/字符串或兼容性证据 / Relevant regression, UI, docs/strings, or compatibility evidence is provided

@CATMIAOZHI CATMIAOZHI left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

审计结论:❌ 请求修改

自审:本 PR 作者为 CATMIAOZHI(本人),本次为自审。

改动(本层提交 309f22967,105 文件,+6979/−1267;对 dev 全量 diff 为 241 文件,+23383/−2268,因本 PR 堆叠在 #1481、#1482、#1483 之上):为普通子代理补齐任务卡、管理列表与只读记录查看入口,含长过程分批加载、归档与名字复用、思考强度映射、浮窗只读边界、按会话+时间戳定位的记忆编辑、对话费用估算,以及 Room 21→24 迁移(父层 21→23,本层 23→24)。

审计范围说明:本次重点审计本层提交 309f22967 及全量 diff 中的数据库迁移链;父层 #1481、#1483 的内容由各自 PR 的审计覆盖(#1482 已有 COMMENT 复审记录)。

通过的检查:

  • 目标分支为 dev,无合并冲突(mergeable_state: clean)。
  • 只读边界完整:浮窗发送前按捕获到的目标会话校验 chatKind == SUBAGENT,命中则 toast 提示并拒绝发送,且目标取自发送时刻捕获的快照,不随后续界面切换改变;只读记录的发送/修改入口继续受限。
  • 归档逻辑严密:archiveOverflow 归档时保护运行中、待收信、待取信、正在创建子任务、名字被预留的代理及整条子树;归档后名字可复用,但按 ID 寻址(target())时归档代理会明确报错而不会误指到同名新代理;归档时丢弃的提示词/信件/终稿有注释说明且其聊天记录本身保留。
  • 迁移链自洽:21→23 建 subagent_runs 表,23→24 追加 externalOwnerType/externalOwnerId/modelRoundCount 三列,与实体定义一致;回填按持久化运行 ID(agent.runId = subagent_runs.id)匹配、不按用户可改的任务标题;旧版备份 JSON 缺新字段时有默认值,导入不受影响;dev 当前为 Room 21,与本栈的 21→23→24 衔接,无 MIGRATION_21_22 冲突。
  • 协程与线程:新增的 catch (e: Exception) 处基本都先 rethrow CancellationException;磁盘/数据库 IO 均在 Dispatchers.IO/Default;runBlocking 只出现在测试。
  • 记忆编辑落点:saveMemoryEdit 在保存前校验当前会话 == expectedChatId 且被编消息仍在当前历史中,写回时重新绑定保存那一刻的会话;片段缺失时先报错、后不执行任何删除/写入。
  • 费用估算诚实标注不完整:零用量、按次计费、Claude 相关、汇率估算都会置 incomplete,界面有"部分未知/暂不可用/正在估算"三态。
  • 字符串中英双语对齐:本次新增 30 条 key,values 与 values-en 完全一致;新增代码中无硬编码用户可见文案(仅模型提示词与日志)。
  • 测试:本层新增/改动 23 个测试文件(约 +1753 行),覆盖归档分段存储、思考强度映射、转录结构、费用估算、只读浮窗等;作者称 Windows 上 :app:testDebugUnitTest 1944 项中 1935 通过、9 跳过、0 失败(本机未复跑)。

问题:

  1. [P1] SubagentPresentationMigration(23→24)在 Room 迁移内直接读协作存储文件且无任何容错:migrateSchema 调用 CollaborationStore(context).load(),而 load() 在 manifest/树文件损坏、版本不支持时会抛 IllegalArgumentException(require)或 JSON 解析异常。迁移抛异常 → Room 升级失败;本项目未配 fallbackToDestructiveMigration,升级后应用打不开数据库。回填只是尽力而为的辅助数据(三列本身有默认值/可空),不应让它决定升级成败。建议用 runCatching 包住 load(),失败时跳过回填、仅完成加列(可记一条日志)。
  2. [P1] 合并协调未完成,暂不能合:作者在 PR 正文明确写"Operit2 导入器对新数据库版本的支持尚需协调,解决前不能合并";且按项目规则,涉及 Room 迁移版本号与合并顺序的 PR 须经 owner(@AAswordman)确认。在导入器协调完成、owner 确认 21→24 版本顺序前,不应合并。
  3. [P2] CollaborationModelParameters.overrideConfig 对非法配置直接抛原始异常:thinkingConfigurations 为空串或非法 JSON 时,explicitActions 抛 org.json.JSONException;模型不支持 reasoning 时抛 IllegalArgumentException。调用链 MultiServiceManager.acquireServiceForConfig → EnhancedAIService.getModelExecutionSnapshot 沿途无 try/catch,异常会直接打断子代理的模型调用。建议在函数内把解析失败转为明确的配置错误(默认值为 "[]",只有存量非法配置会触发)。
  4. [P2] SubagentManagement 中 if (chosenFilter == null && runs.isNotEmpty()) chosenFilter = initialFilter 在组合期间写 state;当前不会死循环(写一次后条件即不成立),但不规范,建议移到 LaunchedEffect 中。
  5. [P3] MessageEditor.kt:304 渲染 COLLABORATION part 时用 memoryFragments.first { it.timestamp == part.sourceTimestamp };当前流程下 fragments 编辑中只做 map、时间戳不会消失,实际安全,但换 firstOrNull + 跳过可防未来重构引入组合期崩溃。
  6. [question] PR 状态与正文矛盾:正文称"仍保持 Draft",但 GitHub 上 draft=false、mergeable_state=clean,可直接合入。请确认是应转回 draft,还是更新正文。

后续可跟进(不阻塞):作者已在正文列出真机待验证清单(任务卡授权状态、主聊天与子代理往返、长过程分批展开、编辑保存、归档筛选和空列表提示),因数据库预览版本不兼容本轮未覆盖用户手机;Lint 未运行。

由 水晴喵的muse 审计

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