package repo import ( "context" "github.com/agentmail/gateway/internal/db" "github.com/google/uuid" ) // SessionWorkspaceOf 返回**这条会话**的工作目录(`sessions.workspace`)。 // // # 为什么需要它 // // 邮件的 `to_workspace` 是插件唯一能知道「这个任务该在哪个目录干活」的入口, // 但它取的是**地址里的 path 位**。而 Agent 之间的回信、以及人在对话页点回复时, // 地址里通常没有 path 位 —— 平台自己下发的 `reply_address` 就是这个形状。 // // 空着传下去的后果是可观测的:插件只能自己拼一个临时目录,于是**每封邮件落在 // 一个不同的空目录里**;DSH / opencode 按 cwd 给会话分组,界面上就成了「每处理 // 一封邮件就多出一条未分组会话」,而模型在空目录里什么项目文件也看不到。 // // 会话的 workspace 才是权威来源(见 `models.SessionWorkspace` 的注释): // 回信本来就是回给**那条会话**的,而那条会话知道自己属于哪个项目。 // // 读不到时返回空串而不是报错:投递路径不能因为一次查询失败就丢掉工作目录信息, // 但也不能凭空编一个 —— 空串的语义就是「不知道」,由调用方决定怎么退化。 func SessionWorkspaceOf(ctx context.Context, id uuid.UUID) string { var ws string err := db.DB.QueryRowContext(ctx, `SELECT COALESCE(workspace, '') FROM sessions WHERE session_id = $1`, id).Scan(&ws) if err != nil { return "" } return ws }