- 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>
41 lines
1.7 KiB
TypeScript
41 lines
1.7 KiB
TypeScript
import {
|
|
type AnyPgColumn,
|
|
pgTable,
|
|
uuid,
|
|
text,
|
|
integer,
|
|
timestamp,
|
|
jsonb,
|
|
index,
|
|
} from "drizzle-orm/pg-core";
|
|
import { companies } from "./companies.js";
|
|
|
|
export const agents = pgTable(
|
|
"agents",
|
|
{
|
|
id: uuid("id").primaryKey().defaultRandom(),
|
|
companyId: uuid("company_id").notNull().references(() => companies.id),
|
|
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"),
|
|
adapterType: text("adapter_type").notNull().default("process"),
|
|
adapterConfig: jsonb("adapter_config").$type<Record<string, unknown>>().notNull().default({}),
|
|
runtimeConfig: jsonb("runtime_config").$type<Record<string, unknown>>().notNull().default({}),
|
|
budgetMonthlyCents: integer("budget_monthly_cents").notNull().default(0),
|
|
spentMonthlyCents: integer("spent_monthly_cents").notNull().default(0),
|
|
permissions: jsonb("permissions").$type<Record<string, unknown>>().notNull().default({}),
|
|
lastHeartbeatAt: timestamp("last_heartbeat_at", { withTimezone: true }),
|
|
metadata: jsonb("metadata").$type<Record<string, unknown>>(),
|
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
},
|
|
(table) => ({
|
|
companyStatusIdx: index("agents_company_status_idx").on(table.companyId, table.status),
|
|
companyReportsToIdx: index("agents_company_reports_to_idx").on(table.companyId, table.reportsTo),
|
|
}),
|
|
);
|