后端: 1. 主动调度补齐 `unfinished_feedback` 定位闭环——用户补充信息先在滚动窗口内定位到可校验的日程块,定位失败则继续 ask_user,不再硬猜 target_id 或直接跑 graph。 2. 聊天占管重跑链路加并发保护——`waiting_user_reply -> rerunning` 改为 DB CAS 抢占,重复补充只返回可见等待提示,避免并发生成多份 preview。 3. rerun 结果回写继续收口——新 preview_id 同步回 trigger 审计指针,session 只在拿到新 preview 时更新当前预览,ready_preview 后清空追问状态并释放回普通聊天。 4. 主动调度事件校验放宽 unfinished_feedback 的空 target 场景,允许先触发、后定位,再进入 graph + preview 主链路。
69 lines
2.7 KiB
Go
69 lines
2.7 KiB
Go
package service
|
||
|
||
import (
|
||
"github.com/LoveLosita/smartflow/backend/dao"
|
||
outboxinfra "github.com/LoveLosita/smartflow/backend/infra/outbox"
|
||
"github.com/LoveLosita/smartflow/backend/inits"
|
||
"github.com/LoveLosita/smartflow/backend/service/agentsvc"
|
||
)
|
||
|
||
// AgentService 是 service 层对 agentsvc.AgentService 的兼容别名。
|
||
// 迁移目的:
|
||
// 1) 把 Agent 业务实现收拢到 service/agentsvc,提升目录整洁度;
|
||
// 2) 不破坏既有调用方(api/cmd 仍然可以引用 service.AgentService)。
|
||
type AgentService = agentsvc.AgentService
|
||
|
||
// NewAgentService 是迁移期兼容构造函数。
|
||
//
|
||
// 说明:
|
||
// 1) 继续保留 service 层入口形式,避免 api/cmd 侧直接感知 agentsvc 包路径;
|
||
// 2) 主动调度 session DAO 也在这里显式透传,避免聊天入口再去回查全局单例;
|
||
// 3) 真实构造逻辑已下沉到 service/agentsvc 包。
|
||
func NewAgentService(
|
||
aiHub *inits.AIHub,
|
||
repo *dao.AgentDAO,
|
||
taskRepo *dao.TaskDAO,
|
||
cacheDAO *dao.CacheDAO,
|
||
agentRedis *dao.AgentCache,
|
||
activeScheduleDAO *dao.ActiveScheduleDAO,
|
||
activeSessionDAO *dao.ActiveScheduleSessionDAO,
|
||
eventPublisher outboxinfra.EventPublisher,
|
||
) *AgentService {
|
||
return agentsvc.NewAgentService(aiHub, repo, taskRepo, cacheDAO, agentRedis, activeScheduleDAO, activeSessionDAO, eventPublisher)
|
||
}
|
||
|
||
// NewAgentServiceWithSchedule 在基础 AgentService 上注入排程依赖。
|
||
//
|
||
// 设计目的:
|
||
// 1) 通过函数注入避免 agentsvc 包直接依赖 service 层的 ScheduleService;
|
||
// 2) 排程依赖为可选:未注入时排程路由自动回退到普通聊天;
|
||
// 3) 主动调度 session DAO 仍沿用统一构造注入,避免排程分支自己拼装仓储。
|
||
func NewAgentServiceWithSchedule(
|
||
aiHub *inits.AIHub,
|
||
repo *dao.AgentDAO,
|
||
taskRepo *dao.TaskDAO,
|
||
cacheDAO *dao.CacheDAO,
|
||
agentRedis *dao.AgentCache,
|
||
activeScheduleDAO *dao.ActiveScheduleDAO,
|
||
activeSessionDAO *dao.ActiveScheduleSessionDAO,
|
||
eventPublisher outboxinfra.EventPublisher,
|
||
scheduleSvc *ScheduleService,
|
||
taskSvc *TaskService,
|
||
) *AgentService {
|
||
svc := agentsvc.NewAgentService(aiHub, repo, taskRepo, cacheDAO, agentRedis, activeScheduleDAO, activeSessionDAO, eventPublisher)
|
||
|
||
// 注入排程依赖:将 service 层方法包装为函数闭包,避免循环依赖。
|
||
if scheduleSvc != nil {
|
||
svc.SmartPlanningMultiRawFunc = scheduleSvc.SmartPlanningMultiRaw
|
||
svc.HybridScheduleWithPlanMultiFunc = scheduleSvc.HybridScheduleWithPlanMulti
|
||
svc.ResolvePlanningWindowFunc = scheduleSvc.ResolvePlanningWindowByTaskClasses
|
||
}
|
||
|
||
// 注入任务紧急性提升依赖:复用 TaskService 的统一提升 + outbox 投递链路。
|
||
if taskSvc != nil {
|
||
svc.GetTasksWithUrgencyPromotionFunc = taskSvc.GetTasksWithUrgencyPromotion
|
||
}
|
||
|
||
return svc
|
||
}
|