Skip to content

Bind Code Sessions to the exact Environment Work #192

Description

@arthur-zhang

Problem

创建 Code Session 时,代码已经持有准确的 EnvironmentWork,但该 work 的身份没有持久化到 code_sessions

当前 Sandbox 续期查询通过以下 JSON 字段反向推断 Environment Work:

work.data->>'type' = 'session'
and work.data->>'id' = code_session.session_external_id

随后从所有匹配 work 中选择最新的 running Sandbox。

如果同一个 Session 因重试、恢复或导入产生多个 Environment Work,就可能续期另一次执行遗留的 Sandbox,而不是创建该 Code Session 时绑定的 Sandbox。organization、workspace 和 environment 条件保证了租户隔离,但不能精确区分执行 attempt。

相关代码:

  • internal/codesessions/managed_agent_code_session.go
  • internal/db/environments.go

Proposed solution

  • 通过 goose migration 为 code_sessions 增加 environment_work_uuid,不创建 PostgreSQL 外键约束。
  • 创建 Code Session 时直接持久化当前 EnvironmentWork.UUID
  • 续期查询通过 environment_work_uuid 精确定位 Environment Work 及其 Sandbox。
  • 继续保留 organization_idworkspace_idenvironment_id 条件作为纵深约束。
  • 明确既有 Code Session 数据的兼容或迁移策略,避免长期保留有歧义的反向推断。

Acceptance criteria

  • 新创建的 Code Session 必须持久化准确的 environment_work_uuid
  • Sandbox 续期不再通过 Session external ID 和创建时间选择执行 attempt。
  • 查询同时校验 organization、workspace 和 environment 边界。
  • 增加回归测试:同一个 Session 存在两个 Environment Work,且两个 work 都有 running Sandbox;Code Session 只能续期自己绑定 work 的 Sandbox,而不能续期创建时间更新的另一个 Sandbox。
  • 更新对应的 Code Session / Environment Work 生命周期设计文档。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions