diff --git a/src/main/services/team/TeamAgentToolsInstaller.ts b/src/main/services/team/TeamAgentToolsInstaller.ts index 7e32207e..018540fe 100644 --- a/src/main/services/team/TeamAgentToolsInstaller.ts +++ b/src/main/services/team/TeamAgentToolsInstaller.ts @@ -282,7 +282,7 @@ function createTask(paths, flags) { description: String(description || subject), activeForm: activeForm ? String(activeForm) : undefined, owner, - createdBy: from || undefined, + createdBy: from, status, blocks: [], blockedBy: [], diff --git a/src/renderer/components/team/members/MemberCard.tsx b/src/renderer/components/team/members/MemberCard.tsx index 369a8589..963461bd 100644 --- a/src/renderer/components/team/members/MemberCard.tsx +++ b/src/renderer/components/team/members/MemberCard.tsx @@ -29,7 +29,7 @@ export const MemberCard = ({ return (
+
- {members.map((member, index) => ( + {members.map((member) => ( onMemberClick?.(member)} onSendMessage={() => onSendMessage?.(member)} diff --git a/src/renderer/components/team/members/MemberLogsTab.tsx b/src/renderer/components/team/members/MemberLogsTab.tsx index dce232d7..fd889a45 100644 --- a/src/renderer/components/team/members/MemberLogsTab.tsx +++ b/src/renderer/components/team/members/MemberLogsTab.tsx @@ -41,10 +41,14 @@ export const MemberLogsTab = ({ void (async () => { try { + if (taskId == null && !memberName) { + if (!cancelled) setLogs([]); + return; + } const result = taskId != null ? await api.teams.getLogsForTask(teamName, taskId) - : await api.teams.getMemberLogs(teamName, memberName ?? ''); + : await api.teams.getMemberLogs(teamName, memberName!); if (!cancelled) { setLogs(result); } diff --git a/src/shared/constants/memberColors.ts b/src/shared/constants/memberColors.ts index c86684a4..901672f0 100644 --- a/src/shared/constants/memberColors.ts +++ b/src/shared/constants/memberColors.ts @@ -8,3 +8,12 @@ export const MEMBER_COLOR_PALETTE = ['blue', 'green', 'yellow', 'cyan', 'magenta export function getMemberColor(index: number): string { return MEMBER_COLOR_PALETTE[index % MEMBER_COLOR_PALETTE.length]; } + +/** Derive a stable fallback color from a member name (position-independent). */ +export function getMemberColorByName(name: string): string { + let hash = 0; + for (let i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return MEMBER_COLOR_PALETTE[Math.abs(hash) % MEMBER_COLOR_PALETTE.length]; +} diff --git a/test/main/services/team/TeamDataService.test.ts b/test/main/services/team/TeamDataService.test.ts index 16ff76af..daf62c0e 100644 --- a/test/main/services/team/TeamDataService.test.ts +++ b/test/main/services/team/TeamDataService.test.ts @@ -160,7 +160,7 @@ describe('TeamDataService', () => { expect(result.status).toBe('pending'); expect(createTaskMock).toHaveBeenCalledWith( 'my-team', - expect.objectContaining({ status: 'pending', owner: 'alice' }) + expect.objectContaining({ status: 'pending', owner: 'alice', createdBy: 'user' }) ); }); });