Version: 0.9.75.dev.260505

后端:
1.收口阶段 6 agent 结构迁移,将 newAgent 内核与 agentsvc 编排层迁入 services/agent
- 切换 Agent 启动装配与 HTTP handler 直连 agent sv,移除旧 service agent bridge
- 补齐 Agent 对 memory、task、task-class、schedule 的 RPC 适配与契约字段
- 扩展 schedule、task、task-class RPC/contract 支撑 Agent 查询、写入与 provider 切流
- 更新迁移文档、README 与相关注释,明确 agent 当前切流点和剩余 memory 迁移面
This commit is contained in:
Losita
2026-05-05 16:00:57 +08:00
parent e1819c5653
commit d7184b776b
174 changed files with 2189 additions and 1236 deletions

View File

@@ -5,6 +5,7 @@ import (
"errors"
rootmodel "github.com/LoveLosita/smartflow/backend/model"
"github.com/LoveLosita/smartflow/backend/respond"
"github.com/LoveLosita/smartflow/backend/services/schedule/core/applyadapter"
schedulecontracts "github.com/LoveLosita/smartflow/backend/shared/contracts/schedule"
)
@@ -30,6 +31,26 @@ func (ss *ScheduleService) GetScheduleFactsByWindow(ctx context.Context, req sch
return ss.scheduleDAO.GetScheduleFactsByWindow(ctx, req)
}
// GetAgentWeekSchedule 为 agent provider 暴露原始周日程槽位事实。
//
// 职责边界:
// 1. 只读取 schedule 服务拥有的 schedules / schedule_events 数据;
// 2. 保留 embedded_task_id 和 can_be_embedded避免 agent 用前端 DTO 还原时丢语义;
// 3. 不做缓存、不做前端展示聚合,调用侧负责组装 ScheduleState。
func (ss *ScheduleService) GetAgentWeekSchedule(ctx context.Context, req schedulecontracts.AgentScheduleWeekRequest) (schedulecontracts.AgentScheduleWeekResponse, error) {
if ss == nil || ss.scheduleDAO == nil {
return schedulecontracts.AgentScheduleWeekResponse{}, errors.New("schedule agent week service 未初始化")
}
if req.Week < 0 || req.Week > 25 {
return schedulecontracts.AgentScheduleWeekResponse{}, respond.WeekOutOfRange
}
schedules, err := ss.scheduleDAO.GetUserWeeklySchedule(ctx, req.UserID, req.Week)
if err != nil {
return schedulecontracts.AgentScheduleWeekResponse{}, err
}
return schedulesToAgentWeekContract(schedules), nil
}
// GetFeedbackSignal 暴露主动调度 unfinished_feedback 的日程目标定位事实。
func (ss *ScheduleService) GetFeedbackSignal(ctx context.Context, req schedulecontracts.FeedbackRequest) (schedulecontracts.FeedbackFact, bool, error) {
if ss == nil || ss.scheduleDAO == nil {
@@ -83,6 +104,92 @@ func toAdapterApplyRequest(req schedulecontracts.ApplyActiveScheduleRequest) app
}
}
func schedulesToAgentWeekContract(schedules []rootmodel.Schedule) schedulecontracts.AgentScheduleWeekResponse {
out := make([]schedulecontracts.AgentScheduleSlot, 0, len(schedules))
for _, item := range schedules {
out = append(out, schedulecontracts.AgentScheduleSlot{
ID: item.ID,
EventID: item.EventID,
UserID: item.UserID,
Week: item.Week,
DayOfWeek: item.DayOfWeek,
Section: item.Section,
EmbeddedTaskID: cloneIntPtr(item.EmbeddedTaskID),
Status: item.Status,
Event: scheduleEventToAgentContract(item.Event),
EmbeddedTask: scheduleTaskItemToAgentContract(item.EmbeddedTask),
})
}
return schedulecontracts.AgentScheduleWeekResponse{Schedules: out}
}
func scheduleEventToAgentContract(event *rootmodel.ScheduleEvent) *schedulecontracts.AgentScheduleEvent {
if event == nil {
return nil
}
return &schedulecontracts.AgentScheduleEvent{
ID: event.ID,
UserID: event.UserID,
Name: event.Name,
Location: cloneStringPtr(event.Location),
Type: event.Type,
RelID: cloneIntPtr(event.RelID),
TaskSourceType: event.TaskSourceType,
CanBeEmbedded: event.CanBeEmbedded,
StartTime: event.StartTime,
EndTime: event.EndTime,
}
}
func scheduleTaskItemToAgentContract(item *rootmodel.TaskClassItem) *schedulecontracts.AgentScheduleTaskItem {
if item == nil {
return nil
}
return &schedulecontracts.AgentScheduleTaskItem{
ID: item.ID,
CategoryID: cloneIntPtr(item.CategoryID),
Order: cloneIntPtr(item.Order),
Content: derefString(item.Content),
EmbeddedTime: scheduleTargetTimeToAgentContract(item.EmbeddedTime),
Status: cloneIntPtr(item.Status),
}
}
func scheduleTargetTimeToAgentContract(value *rootmodel.TargetTime) *schedulecontracts.AgentScheduleTargetTime {
if value == nil {
return nil
}
return &schedulecontracts.AgentScheduleTargetTime{
Week: value.Week,
DayOfWeek: value.DayOfWeek,
SectionFrom: value.SectionFrom,
SectionTo: value.SectionTo,
}
}
func cloneIntPtr(value *int) *int {
if value == nil {
return nil
}
copied := *value
return &copied
}
func cloneStringPtr(value *string) *string {
if value == nil {
return nil
}
copied := *value
return &copied
}
func derefString(value *string) string {
if value == nil {
return ""
}
return *value
}
func toAdapterSlotSpan(span *schedulecontracts.SlotSpan) *applyadapter.SlotSpan {
if span == nil {
return nil