export interface AssigneeSelection { assigneeAgentId: string | null; assigneeUserId: string | null; } export interface AssigneeOption { id: string; label: string; searchText?: string; } interface CommentAssigneeSuggestionInput { assigneeAgentId?: string | null; assigneeUserId?: string | null; } interface CommentAssigneeSuggestionComment { authorAgentId?: string | null; authorUserId?: string | null; } export function assigneeValueFromSelection(selection: Partial): string { if (selection.assigneeAgentId) return `agent:${selection.assigneeAgentId}`; if (selection.assigneeUserId) return `user:${selection.assigneeUserId}`; return ""; } export function suggestedCommentAssigneeValue( issue: CommentAssigneeSuggestionInput, comments: CommentAssigneeSuggestionComment[] | null | undefined, currentUserId: string | null | undefined, currentAgentId?: string | null | undefined, ): string { if (comments && comments.length > 0 && (currentUserId || currentAgentId)) { for (let i = comments.length - 1; i >= 0; i--) { const comment = comments[i]; if (comment.authorAgentId && comment.authorAgentId !== currentAgentId) { return assigneeValueFromSelection({ assigneeAgentId: comment.authorAgentId }); } if (comment.authorUserId && comment.authorUserId !== currentUserId) { return assigneeValueFromSelection({ assigneeUserId: comment.authorUserId }); } } } return assigneeValueFromSelection(issue); } export function parseAssigneeValue(value: string): AssigneeSelection { if (!value) { return { assigneeAgentId: null, assigneeUserId: null }; } if (value.startsWith("agent:")) { const assigneeAgentId = value.slice("agent:".length); return { assigneeAgentId: assigneeAgentId || null, assigneeUserId: null }; } if (value.startsWith("user:")) { const assigneeUserId = value.slice("user:".length); return { assigneeAgentId: null, assigneeUserId: assigneeUserId || null }; } // Backward compatibility for older drafts/defaults that stored a raw agent id. return { assigneeAgentId: value, assigneeUserId: null }; } export function currentUserAssigneeOption(currentUserId: string | null | undefined): AssigneeOption[] { if (!currentUserId) return []; return [{ id: assigneeValueFromSelection({ assigneeUserId: currentUserId }), label: "Me", searchText: currentUserId === "local-board" ? "me board human local-board" : `me human ${currentUserId}`, }]; } export function formatAssigneeUserLabel( userId: string | null | undefined, currentUserId: string | null | undefined, ): string | null { if (!userId) return null; if (currentUserId && userId === currentUserId) return "Me"; if (userId === "local-board") return "Board"; return userId.slice(0, 5); }