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' })
);
});
});