package handler // resolveToWorkspace 决定一封邮件落库与投递时用的 `to_workspace`。 // // # 它要解决的问题 // // `to_workspace` 是插件唯一能知道「这个任务该在哪个目录干活」的入口。而 Agent // 之间的回信、以及人在对话页里点回复,三维地址里通常**没有 path 位** —— 平台 // 下发的 `reply_address` 就是这个形状。空着传下去的后果是可观测的: // // - 插件只能自己拼一个临时目录,于是**每封邮件落在一个不同的空目录**里; // - DSH / opencode 按 cwd 给会话分组,界面上就成了「每处理一封邮件就多出 // 一条未分组会话」; // - 模型在那个空目录里什么项目文件也看不到,却照样开工。 // // 会话的 workspace 才是权威来源(见 models.SessionWorkspace 的注释):回信本来 // 就是回给**那条会话**的,而那条会话知道自己属于哪个项目。 // // # 三条规则,顺序不能换 // // 1. 地址里写了 path → **照用**。那是人的明确意图,会话的 workspace 只是兜底。 // 2. 没写、且收件方是**人** → 保持空。人只有名字,没有工作目录; // 给人类也填 path,前端与 agent_discovery 会拼出 `gui-lab@/root/proj.别名` // 这种错地址(`ToHuman` 字段就是为避开这件事加的)。 // 3. 没写、且收件方是 **Agent** → 用会话的 workspace(可能仍为空串, // 那表示这条会话确实没有工作目录,此时行为与从前一致)。 // // 抽成纯函数是为了能直接对规则本身做判断:上面第 2 条是**反向对照**, // 少了它,把「一律填 path」写错成看起来也合理。 func resolveToWorkspace(addrPath, sessionWorkspace string, toIsHuman bool) string { if addrPath != "" { return addrPath } if toIsHuman { return "" } return sessionWorkspace }