diff --git a/internal/database/database.go b/internal/database/database.go index d71c0c94..20754537 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -325,6 +325,7 @@ func (db *DB) initTables() error { session_key TEXT PRIMARY KEY, conversation_id TEXT NOT NULL, role_name TEXT NOT NULL DEFAULT '默认', + agent_mode TEXT NOT NULL DEFAULT 'eino_single', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE );` @@ -750,6 +751,9 @@ func (db *DB) initTables() error { if _, err := db.Exec(createRobotUserSessionsTable); err != nil { return fmt.Errorf("创建robot_user_sessions表失败: %w", err) } + if err := db.migrateRobotUserSessionsTable(); err != nil { + return fmt.Errorf("迁移robot_user_sessions表失败: %w", err) + } if _, err := db.Exec(createProjectsTable); err != nil { return fmt.Errorf("创建projects表失败: %w", err) @@ -873,6 +877,18 @@ func (db *DB) initTables() error { return nil } +func (db *DB) migrateRobotUserSessionsTable() error { + var count int + if err := db.QueryRow("SELECT COUNT(*) FROM pragma_table_info('robot_user_sessions') WHERE name='agent_mode'").Scan(&count); err != nil { + return err + } + if count == 0 { + _, err := db.Exec("ALTER TABLE robot_user_sessions ADD COLUMN agent_mode TEXT NOT NULL DEFAULT 'eino_single'") + return err + } + return nil +} + // migrateMessagesTable 迁移 messages 表,补充 updated_at 字段。 // 语义:updated_at 表示该条消息最后一次被写入/更新的时间(例如助手占位消息在任务结束时更新正文)。 func (db *DB) migrateMessagesTable() error { diff --git a/internal/database/robot_session.go b/internal/database/robot_session.go index b7631260..cd855f8b 100644 --- a/internal/database/robot_session.go +++ b/internal/database/robot_session.go @@ -12,6 +12,7 @@ type RobotSessionBinding struct { SessionKey string ConversationID string RoleName string + AgentMode string UpdatedAt time.Time } @@ -24,9 +25,9 @@ func (db *DB) GetRobotSessionBinding(sessionKey string) (*RobotSessionBinding, e var b RobotSessionBinding var updatedAt string err := db.QueryRow( - "SELECT session_key, conversation_id, role_name, updated_at FROM robot_user_sessions WHERE session_key = ?", + "SELECT session_key, conversation_id, role_name, agent_mode, updated_at FROM robot_user_sessions WHERE session_key = ?", sessionKey, - ).Scan(&b.SessionKey, &b.ConversationID, &b.RoleName, &updatedAt) + ).Scan(&b.SessionKey, &b.ConversationID, &b.RoleName, &b.AgentMode, &updatedAt) if err != nil { if err == sql.ErrNoRows { return nil, nil @@ -43,28 +44,36 @@ func (db *DB) GetRobotSessionBinding(sessionKey string) (*RobotSessionBinding, e if strings.TrimSpace(b.RoleName) == "" { b.RoleName = "默认" } + if strings.TrimSpace(b.AgentMode) == "" { + b.AgentMode = "eino_single" + } return &b, nil } // UpsertRobotSessionBinding 写入或更新机器人会话绑定(包含角色)。 -func (db *DB) UpsertRobotSessionBinding(sessionKey, conversationID, roleName string) error { +func (db *DB) UpsertRobotSessionBinding(sessionKey, conversationID, roleName, agentMode string) error { sessionKey = strings.TrimSpace(sessionKey) conversationID = strings.TrimSpace(conversationID) roleName = strings.TrimSpace(roleName) + agentMode = strings.TrimSpace(agentMode) if sessionKey == "" || conversationID == "" { return nil } if roleName == "" { roleName = "默认" } + if agentMode == "" { + agentMode = "eino_single" + } _, err := db.Exec(` - INSERT INTO robot_user_sessions (session_key, conversation_id, role_name, updated_at) - VALUES (?, ?, ?, ?) + INSERT INTO robot_user_sessions (session_key, conversation_id, role_name, agent_mode, updated_at) + VALUES (?, ?, ?, ?, ?) ON CONFLICT(session_key) DO UPDATE SET conversation_id = excluded.conversation_id, role_name = excluded.role_name, + agent_mode = excluded.agent_mode, updated_at = excluded.updated_at - `, sessionKey, conversationID, roleName, time.Now()) + `, sessionKey, conversationID, roleName, agentMode, time.Now()) if err != nil { return fmt.Errorf("写入机器人会话绑定失败: %w", err) }