Files
superwork/vscode/src/webhook/eventOwnership.ts
T

25 lines
1.2 KiB
TypeScript

/**
* 多人协作事件门禁: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'
}