import { sqliteTable, text, integer, index, uniqueIndex } from "drizzle-orm/sqlite-core"; import { users } from "./auth"; import { agentTools } from "./agent-tool"; // ============ Agent(agent 定义表)============ export const agents = sqliteTable( "agents", { id: integer("id").primaryKey({ autoIncrement: true }), slug: text("slug", { length: 50 }).notNull().unique(), name: text("name", { length: 100 }).notNull(), description: text("description"), systemPrompt: text("system_prompt").notNull().default(""), defaultModelId: integer("default_model_id"), titleModelId: integer("title_model_id"), titleStrategy: text("title_strategy", { length: 20 }).notNull().default("llm"), enableThinking: integer("enable_thinking").notNull().default(0), enableTools: integer("enable_tools").notNull().default(1), maxStepCount: integer("max_step_count").notNull().default(6), isDefault: integer("is_default").notNull().default(0), isCallable: integer("is_callable").notNull().default(0), sortOrder: integer("sort_order").notNull().default(0), enabled: integer("enabled").notNull().default(1), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }, (table) => [ index("agents_enabled_idx").on(table.enabled), index("agents_sort_order_idx").on(table.sortOrder), ], ); // ============ AgentToolAssociation(agent 与工具关联表)============ export const agentToolAssociations = sqliteTable( "agent_tool_associations", { id: integer("id").primaryKey({ autoIncrement: true }), agentId: integer("agent_id") .notNull() .references(() => agents.id, { onDelete: "cascade" }), toolId: text("tool_id") .notNull() .references(() => agentTools.id, { onDelete: "cascade" }), needsApproval: integer("needs_approval"), sortOrder: integer("sort_order").notNull().default(0), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), }, (table) => [ uniqueIndex("agent_tool_assoc_uniq").on(table.agentId, table.toolId), ], ); // ============ AgentSession(agent 会话表)============ export const agentSessions = sqliteTable( "agent_sessions", { id: text("id").primaryKey(), agentId: integer("agent_id").references(() => agents.id, { onDelete: "set null" }), userId: integer("user_id").references(() => users.id, { onDelete: "cascade" }), tempToken: text("temp_token", { length: 64 }), title: text("title", { length: 100 }).notNull().default("新对话"), modelId: integer("model_id"), enableThinking: integer("enable_thinking"), enableTools: integer("enable_tools"), systemPrompt: text("system_prompt"), lastActiveAt: integer("last_active_at", { mode: "timestamp_ms" }).defaultNow().notNull(), expiresAt: integer("expires_at", { mode: "timestamp_ms" }), deletedAt: integer("deleted_at", { mode: "timestamp_ms" }), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }, (table) => [ index("idx_agent_sessions_user_deleted").on(table.userId, table.deletedAt), index("idx_agent_sessions_temp_token").on(table.tempToken), index("idx_agent_sessions_agent").on(table.agentId), ], ); // ============ AgentMessage(agent 消息表)============ export const agentMessages = sqliteTable( "agent_messages", { id: text("id").primaryKey(), sessionId: text("session_id") .notNull() .references(() => agentSessions.id, { onDelete: "cascade" }), role: text("role", { length: 20 }).notNull(), content: text("content").notNull().default(""), parts: text("parts"), modelId: integer("model_id"), inputTokens: integer("input_tokens"), outputTokens: integer("output_tokens"), sortOrder: integer("sort_order").notNull(), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), }, (table) => [ index("idx_agent_messages_session_sort").on(table.sessionId, table.sortOrder), ], ); // ============ AgentMessageFeedback(agent 消息反馈表)============ export const agentMessageFeedback = sqliteTable( "agent_message_feedback", { id: integer("id").primaryKey({ autoIncrement: true }), messageId: text("message_id") .notNull() .references(() => agentMessages.id, { onDelete: "cascade" }), userId: integer("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), feedback: text("feedback", { length: 10 }).notNull(), comment: text("comment"), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }, (table) => [ uniqueIndex("idx_agent_feedback_message_user").on(table.messageId, table.userId), ], );