/** * 多人协作事件门禁:Gitea webhook 广播到每位开发者的机器,写状态、触发 * codex 审查、注入终端这类副作用只允许"责任人机器"执行,其余机器只做 * UI 刷新。归属以 Gitea 原生 assignee 为准;存量无 assignee 的工单退回 * 本地证据(本机是否开着该工单的实施/测试终端)。 */ export type EventOwnership = 'own' | 'observe' export function decideEventOwnership(opts: { /** 工单 assignee 的 login 列表,空数组表示未指派。 */ assignees: string[] /** 本机 token 对应的 Gitea login;身份解析失败时为 undefined。 */ me: string | undefined /** 本机是否存在该工单的实施/测试终端(存量工单的兜底证据)。 */ hasLocalSessionEvidence: boolean }): EventOwnership { // ① 有 assignee → 指派即真相,本地终端不作数(重新指派会转移责任); // 身份未知时无法自证归属,宁可不动作也不重复动作。 if (opts.assignees.length > 0) return opts.me !== undefined && opts.assignees.includes(opts.me) ? 'own' : 'observe' // ② 无 assignee(存量工单)→ 本地终端在,说明实施发生在这台机器。 return opts.hasLocalSessionEvidence ? 'own' : 'observe' }