Skip to content

【架构优化】合并 prepareWorkbenchContext 中 6 处重复的会话读取为 storedAssistantSession - #776

Open
fx-kurumi wants to merge 2 commits into
Tencent:mainfrom
fx-kurumi:refactor/workbench-stored-session-774
Open

fx-kurumi wants to merge 2 commits into
Tencent:mainfrom
fx-kurumi:refactor/workbench-stored-session-774

Conversation

@fx-kurumi

Copy link
Copy Markdown
Collaborator

Closes #774

改了什么

  • internal/httpapi/assistant_shared.go:新增 (*assistantHandlers).storedAssistantSession(id, userID),空 ID 直接返回未找到,其余统一经 assistantStorageOwner 找到存储槽位后读取,把「共享/项目会话按创建者归属存储」这条规则收在一处。
  • internal/httpapi/assistant_workbench.go:prepareWorkbenchContext 开头读一次会话存入 stored, hasStored,后续「会话属于其他项目」校验、关联需求上下文、讨论分支提示、附件作者回退、子 Agent resume 复用全部复用这份结果;原 6 处重复查询收敛为 1 处。历史附件收集抽成纯函数 historicalAttachmentIDs(session, found, projectID)。workspaceTurnContext 同步改用新 helper。
  • 新增 internal/httpapi/assistant_workbench_session_test.go。

为什么

同一次请求里把同一个会话从库里读 5–6 次,每处再各自判空,读起来像 6 件不同的事;归属规则散落各调用点,容易漏改。

怎么验证

  • gofmt -l internal/httpapi/ 无输出;go vet ./internal/httpapi/ 通过。
  • go test ./internal/httpapi/ -count=1 全部通过,包含新增用例:空 ID / 未知 ID 返回未找到、其他用户读不到私有会话、历史附件只继承同项目非共享会话。
  • 行为不变:错误文案、判断顺序、附件覆盖规则与共享会话不继承附件的语义均原样保留。

🤖 Generated with Claude Code

…Tencent#774)

按存储归属读取当前会话的写法在 assistant_workbench.go 里重复了 6 次,
新增 (*assistantHandlers).storedAssistantSession 收拢这条归属规则,
prepareWorkbenchContext 开头只读一次并复用结果;历史附件收集抽成
historicalAttachmentIDs 纯函数。错误文案、判断顺序与附件覆盖语义不变。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@fx-kurumi

Copy link
Copy Markdown
Collaborator Author

全量 go test ./internal/httpapi/ -count=1 结果:仅 2 个用例失败,均为本容器没有 Chromium 导致(与本次改动无关):

  • TestMainBotBrowserStartsAndDrivesRunBrowser:Agent 浏览器启动失败:当前运行环境不支持,或 Chromium 不可用
  • TestBrowserStreamPushesFramesAndRunsCommands:同一原因

其余全部通过,包括新增的 TestStoredAssistantSessionReadsCallerSlotAndTreatsEmptyIDAsMissing、TestHistoricalAttachmentIDsKeepsOnlyThisProjectsUnownedAttachments,以及所有 Workbench 用例。gofmt -l internal/httpapi/ 无输出,go vet ./internal/httpapi/ 通过。

… issue checks

Co-Authored-By: Claude Code <noreply@anthropic.com>
@fx-kurumi

Copy link
Copy Markdown
Collaborator Author

补测试(自动检查,head 63bb1a5 → d4b9428)

补了什么:新增 internal/httpapi/assistant_workbench_stored_session_guard_test.go(只加测试文件,没改实现):

  • TestPrepareWorkbenchContextRefusesConversationOfAnotherProject:存在 workbench 项目的会话拿到 other 项目里续聊要返回「会话属于其他项目」;同项目续聊、未保存过的新会话 ID 不受影响。
  • TestPrepareWorkbenchContextValidatesAndInjectsStoredSessionIssue:会话绑定的主需求要注入「当前会话关联的主需求」上下文;需求移到别的项目后,下一轮要返回「需求不存在或不属于当前项目」。

为什么:这次把 6 处会话读取合并成一次 storedAssistantSession,我对改动点做了 9 个变异,原有测试漏了 2 个:

变异 原测试 补测后
去掉 hasStored && stored.ProjectID != req.ProjectID 跨项目拦截 漏 发现
跳过 stored.IssueID 的校验与注入 漏 发现
storedAssistantSession 不按存储 owner 读 / workspaceTurnContext 不按 owner 读 / 共享会话继承附件 / 历史附件丢弃 / 附件 owner 不取历史作者 / 跳过分支会话提示 / 不复用角色 Agent 发现 发现

本地验证(Go 1.26.11):gofmt -l internal/httpapi 无输出;go vet ./internal/httpapi/ 通过;go test ./internal/httpapi/ -count=1 -skip Browser → ok agentflow/internal/httpapi 152.408s。不加 -skip 时只有 TestMainBotBrowserStartsAndDrivesRunBrowser、TestBrowserStreamPushesFramesAndRunsCommands 失败,原 head 上同样失败,是本地没有可用 Chromium,与本 PR 无关。

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.

【架构优化】合并 prepareWorkbenchContext 中 6 处重复的会话读取为 storedAssistantSession

1 participant