feat: add agent icons with picker and collapsible sidebar section

- Add `icon` text column to agents DB schema with migration
- Add icon field to shared Agent type and validators
- Create AgentIconPicker component with 40+ curated lucide icons and search
- Show clickable icon next to agent name on detail page header
- Replace static Agents nav item with collapsible AGENTS section in sidebar
- Each agent shows its icon (defaulting to Bot) with truncated name

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Forgotten
2026-02-23 12:25:13 -06:00
parent 5b8708eae9
commit cf237d2e7f
9 changed files with 369 additions and 38 deletions

View File

@@ -0,0 +1 @@
ALTER TABLE "agents" ADD COLUMN "icon" text;

View File

@@ -113,6 +113,13 @@
"when": 1771865100000,
"tag": "0015_project_color_archived",
"breakpoints": true
},
{
"idx": 16,
"version": "7",
"when": 1771955900000,
"tag": "0016_agent_icon",
"breakpoints": true
}
]
}

View File

@@ -18,6 +18,7 @@ export const agents = pgTable(
name: text("name").notNull(),
role: text("role").notNull().default("general"),
title: text("title"),
icon: text("icon"),
status: text("status").notNull().default("idle"),
reportsTo: uuid("reports_to").references((): AnyPgColumn => agents.id),
capabilities: text("capabilities"),

View File

@@ -14,6 +14,7 @@ export interface Agent {
name: string;
role: AgentRole;
title: string | null;
icon: string | null;
status: AgentStatus;
reportsTo: string | null;
capabilities: string | null;

View File

@@ -27,6 +27,7 @@ export const createAgentSchema = z.object({
name: z.string().min(1),
role: z.enum(AGENT_ROLES).optional().default("general"),
title: z.string().optional().nullable(),
icon: z.string().optional().nullable(),
reportsTo: z.string().uuid().optional().nullable(),
capabilities: z.string().optional().nullable(),
adapterType: z.enum(AGENT_ADAPTER_TYPES).optional().default("process"),