import { sqliteTable, text, integer, index, uniqueIndex } from "drizzle-orm/sqlite-core"; import { users } from "./auth"; // ============ AgentSession(agent 会话表)============ export const agentSessions = sqliteTable( "agent_sessions", { id: text("id").primaryKey(), 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").default(1).notNull(), enableTools: integer("enable_tools").default(1).notNull(), 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), ], ); // ============ 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), ], );