后端: 1. 会话历史接口切换为统一时间线读取,并兼容 extra.resume 恢复协议 - api/agent.go:新增 resume->confirm_action 映射(approve/reject/cancel),恢复请求缺 conversation_id 时拦截;GetConversationHistory 改为 GetConversationTimeline - routers/routers.go:路由从 GET /conversation-history 切换为 GET /conversation-timeline - model/agent.go:删除 GetConversationHistoryItem 旧 DTO 2. 新增会话时间线持久化链路(MySQL + Redis) - 新增 model/agent_timeline.go:定义 timeline kind、AgentTimelineEvent、持久化/返回结构 - 新增 dao/agent_timeline.go:写入事件、按 seq 查询、查询 max seq - inits/mysql.go:AutoMigrate 增加 AgentTimelineEvent - dao/cache.go:新增 timeline list/seq key,支持 incr/set seq、append/list、全量回填与删除 - 新增 service/agentsvc/agent_timeline.go:时间线读写编排(Redis 优先、DB 回源、seq 分配与冲突重试、extra 事件映射) 3. 聊天主链路改为写入 timeline,旧 history 服务下线 - service/agentsvc/agent.go:普通聊天用户/助手消息改为 appendConversationTimelineEvent - service/agentsvc/agent_newagent.go:透传 resume_interaction_id;注入 emitter extra hook 持久化卡片事件;正文写入 timeline - 删除 service/agentsvc/agent_history.go:下线 conversation-history 旧缓存编排 4. newAgent 恢复与确认防串单增强 - newAgent/model/graph_run_state.go:AgentGraphRequest 新增 ResumeInteractionID - newAgent/node/agent_nodes.go:透传 ResumeInteractionID - newAgent/node/chat.go:增加 stale_resume 校验;accept/reject 兼容 approve/cancel;非法动作返回 invalid_confirm_action - newAgent/stream/emitter.go:新增 extraEventHook / SetExtraEventHook,在 extra-only 与 confirm 事件触发 5. 日程暂存后同步刷新预览缓存,避免读到拖拽前旧数据 - service/agentsvc/agent_schedule_state.go:Save 后重建并覆盖 preview 缓存,保留 trace/candidate 等字段 6. 缓存失效策略调整到 timeline 口径 - middleware/cache_deleter.go:移除 conversation-history 失效逻辑;ChatHistory/AgentChat/AgentTimelineEvent 加入忽略集合 前端: 7. 新增时间线接口与类型定义 - frontend/src/api/schedule_agent.ts:新增 TimelineEvent/TimelineToolPayload/TimelineConfirmPayload 与 getConversationTimeline 8. AssistantPanel 全面对接 timeline 重建消息与卡片 - frontend/src/components/dashboard/AssistantPanel.vue:移除旧 history merge/normalize,新增 rebuildStateFromTimeline;支持 execution mode(always_execute);支持 resume-only 发送;修复 confirm 弹层手动关闭后重复弹出;会话标题显示放宽;流式中隐藏 action bar 9. 精排弹窗健壮性与交互动效优化 - frontend/src/components/assistant/ScheduleFineTuneModal.vue:previewData 支持 nullable,新增 visible 控制与 watch 初始化,补齐空值保护并调整弹窗动画 仓库: 10. 新增前端时间线接入说明文档 - docs/frontend/newagent_timeline_对接说明.md:接口、kind、payload、刷新重建与迁移建议
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package inits
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/LoveLosita/smartflow/backend/model"
|
|
"github.com/spf13/viper"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func autoMigrateModels(db *gorm.DB) error {
|
|
models := []any{
|
|
&model.User{},
|
|
&model.AgentChat{},
|
|
&model.ChatHistory{},
|
|
&model.AgentTimelineEvent{},
|
|
&model.Task{},
|
|
&model.TaskClass{},
|
|
&model.TaskClassItem{},
|
|
&model.ScheduleEvent{},
|
|
&model.Schedule{},
|
|
&model.AgentOutboxMessage{},
|
|
&model.AgentScheduleState{},
|
|
&model.AgentStateSnapshotRecord{},
|
|
&model.MemoryItem{},
|
|
&model.MemoryJob{},
|
|
&model.MemoryAuditLog{},
|
|
&model.MemoryUserSetting{},
|
|
}
|
|
|
|
for _, m := range models {
|
|
if err := db.AutoMigrate(m); err != nil {
|
|
return fmt.Errorf("auto migrate failed for %T: %w", m, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ConnectDB() (*gorm.DB, error) {
|
|
host := viper.GetString("database.host")
|
|
port := viper.GetString("database.port")
|
|
user := viper.GetString("database.user")
|
|
password := viper.GetString("database.password")
|
|
dbname := viper.GetString("database.dbname")
|
|
|
|
dsn := fmt.Sprintf(
|
|
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
|
|
user, password, host, port, dbname,
|
|
)
|
|
|
|
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = autoMigrateModels(db); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
log.Println("Database connected successfully")
|
|
log.Println("Database auto migration completed")
|
|
return db, nil
|
|
}
|