后端: 1.阶段 6 agent / memory 服务化收口 - 新增 cmd/agent 独立进程入口,承载 agent zrpc server、agent outbox relay / consumer 和运行时依赖初始化 - 补齐 services/agent/rpc 的 Chat stream 与 conversation meta/list/timeline、schedule-preview、context-stats、schedule-state unary RPC - 新增 gateway/client/agent 与 shared/contracts/agent,将 /api/v1/agent chat 和非 chat 门面切到 agent zrpc - 收缩 gateway 本地 AgentService 装配,双 RPC 开关开启时不再初始化本地 agent 编排、LLM、RAG 和 memory reader fallback - 将 backend/memory 物理迁入 services/memory,私有实现收入 internal,保留 module/model/observe 作为 memory 服务门面 - 调整 memory outbox、memory reader 和 agent 记忆渲染链路的 import 与服务边界,cmd/memory 独占 memory worker / consumer - 关闭 gateway 侧 agent outbox worker 所有权,agent relay / consumer 由 cmd/agent 独占,gateway 仅保留 HTTP/SSE 门面与迁移期开关回退 - 更新阶段 6 文档,记录 agent / memory 当前切流点、smoke 结果,以及 backend/client 与 gateway/shared 的目录收口口径
186 lines
6.1 KiB
Go
186 lines
6.1 KiB
Go
package events
|
||
|
||
import (
|
||
"errors"
|
||
|
||
"github.com/LoveLosita/smartflow/backend/dao"
|
||
outboxinfra "github.com/LoveLosita/smartflow/backend/infra/outbox"
|
||
"github.com/LoveLosita/smartflow/backend/services/memory"
|
||
sharedevents "github.com/LoveLosita/smartflow/backend/shared/events"
|
||
"github.com/LoveLosita/smartflow/backend/shared/ports"
|
||
)
|
||
|
||
// RegisterCoreOutboxHandlers 注册单体残留内仍由 agent 边界消费的 outbox handler。
|
||
//
|
||
// 职责边界:
|
||
// 1. 只负责聚合注册当前单体残留内仍归 agent 进程消费的 handler;
|
||
// 2. 不负责创建 eventBus/outboxRepo/DAO,也不负责启动或关闭事件总线。
|
||
// 3. 不改变单个 Register* 函数的职责;具体 payload 解析、幂等消费和业务落库仍由各自 handler 负责。
|
||
// 4. memory.extract.requested 已在阶段 6 CP1 迁往 cmd/memory,这里只登记其路由,不再注册消费 handler。
|
||
func RegisterCoreOutboxHandlers(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
memoryModule *memory.Module,
|
||
adjuster ports.TokenUsageAdjuster,
|
||
) error {
|
||
if err := validateCoreOutboxHandlerDeps(eventBus, outboxRepo, repoManager, agentRepo, cacheRepo); err != nil {
|
||
return err
|
||
}
|
||
if err := RegisterMemoryExtractRoute(); err != nil {
|
||
return err
|
||
}
|
||
|
||
return registerOutboxHandlerRoutes(coreOutboxHandlerRoutes(eventBus, outboxRepo, repoManager, agentRepo, cacheRepo, memoryModule, adjuster))
|
||
}
|
||
|
||
// RegisterAllOutboxHandlers 注册当前阶段所有 outbox handler。
|
||
//
|
||
// 职责边界:
|
||
// 1. 只负责把当前单体残留域的 core / active_scheduler 路由一次性接线;
|
||
// 2. 不负责创建依赖,也不负责启动事件总线;
|
||
// 3. notification 已独立到 cmd/notification,自有 outbox consumer 不再由单体注册;
|
||
// 4. 供当前启动流程在“总线启动前”统一完成显式路由注册。
|
||
func RegisterAllOutboxHandlers(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
memoryModule *memory.Module,
|
||
activeTriggerWorkflow ActiveScheduleTriggeredProcessor,
|
||
adjuster ports.TokenUsageAdjuster,
|
||
) error {
|
||
if err := validateAllOutboxHandlerDeps(eventBus, outboxRepo, repoManager, agentRepo, cacheRepo, memoryModule, activeTriggerWorkflow); err != nil {
|
||
return err
|
||
}
|
||
|
||
return registerOutboxHandlerRoutes(allOutboxHandlerRoutes(
|
||
eventBus,
|
||
outboxRepo,
|
||
repoManager,
|
||
agentRepo,
|
||
cacheRepo,
|
||
memoryModule,
|
||
activeTriggerWorkflow,
|
||
adjuster,
|
||
))
|
||
}
|
||
|
||
// validateCoreOutboxHandlerDeps 校验核心 outbox handler 聚合注册所需依赖。
|
||
//
|
||
// 职责边界:
|
||
// 1. 只做 nil 校验,不做数据库、Redis、Kafka 连通性探测,避免注册函数承担启动健康检查职责。
|
||
// 2. 返回 error 表示依赖缺失;返回 nil 表示可以安全进入逐项注册流程。
|
||
func validateCoreOutboxHandlerDeps(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
) error {
|
||
if eventBus == nil {
|
||
return errors.New("event bus is nil")
|
||
}
|
||
if outboxRepo == nil {
|
||
return errors.New("outbox repository is nil")
|
||
}
|
||
if repoManager == nil {
|
||
return errors.New("repo manager is nil")
|
||
}
|
||
if agentRepo == nil {
|
||
return errors.New("agent repo is nil")
|
||
}
|
||
if cacheRepo == nil {
|
||
return errors.New("cache repo is nil")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// validateAllOutboxHandlerDeps 在核心依赖基础上,额外校验 active_scheduler 相关依赖。
|
||
func validateAllOutboxHandlerDeps(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
memoryModule *memory.Module,
|
||
activeTriggerWorkflow ActiveScheduleTriggeredProcessor,
|
||
) error {
|
||
if err := validateCoreOutboxHandlerDeps(eventBus, outboxRepo, repoManager, agentRepo, cacheRepo); err != nil {
|
||
return err
|
||
}
|
||
if activeTriggerWorkflow == nil {
|
||
return errors.New("active schedule triggered processor is nil")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// coreOutboxHandlerRoutes 只描述 core 阶段的 outbox 路由。
|
||
func coreOutboxHandlerRoutes(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
memoryModule *memory.Module,
|
||
adjuster ports.TokenUsageAdjuster,
|
||
) []outboxHandlerRoute {
|
||
return []outboxHandlerRoute{
|
||
{
|
||
EventType: EventTypeChatHistoryPersistRequested,
|
||
Service: outboxHandlerServiceAgent,
|
||
Register: func() error {
|
||
return RegisterChatHistoryPersistHandler(eventBus, outboxRepo, repoManager, adjuster)
|
||
},
|
||
},
|
||
{
|
||
EventType: EventTypeChatTokenUsageAdjustRequested,
|
||
Service: outboxHandlerServiceAgent,
|
||
Register: func() error {
|
||
return RegisterChatTokenUsageAdjustHandler(eventBus, outboxRepo, repoManager, adjuster)
|
||
},
|
||
},
|
||
{
|
||
EventType: EventTypeAgentStateSnapshotPersist,
|
||
Service: outboxHandlerServiceAgent,
|
||
Register: func() error {
|
||
return RegisterAgentStateSnapshotHandler(eventBus, outboxRepo, repoManager)
|
||
},
|
||
},
|
||
{
|
||
EventType: EventTypeAgentTimelinePersistRequested,
|
||
Service: outboxHandlerServiceAgent,
|
||
Register: func() error {
|
||
return RegisterAgentTimelinePersistHandler(eventBus, outboxRepo, agentRepo, cacheRepo)
|
||
},
|
||
},
|
||
}
|
||
}
|
||
|
||
// allOutboxHandlerRoutes 把当前阶段所有 outbox 路由一次性展开,供启动入口统一接线。
|
||
func allOutboxHandlerRoutes(
|
||
eventBus OutboxBus,
|
||
outboxRepo *outboxinfra.Repository,
|
||
repoManager *dao.RepoManager,
|
||
agentRepo *dao.AgentDAO,
|
||
cacheRepo *dao.CacheDAO,
|
||
memoryModule *memory.Module,
|
||
activeTriggerWorkflow ActiveScheduleTriggeredProcessor,
|
||
adjuster ports.TokenUsageAdjuster,
|
||
) []outboxHandlerRoute {
|
||
routes := coreOutboxHandlerRoutes(eventBus, outboxRepo, repoManager, agentRepo, cacheRepo, memoryModule, adjuster)
|
||
routes = append(routes,
|
||
outboxHandlerRoute{
|
||
EventType: sharedevents.ActiveScheduleTriggeredEventType,
|
||
Service: outboxHandlerServiceActiveScheduler,
|
||
Register: func() error {
|
||
return RegisterActiveScheduleTriggeredHandler(eventBus, outboxRepo, activeTriggerWorkflow)
|
||
},
|
||
},
|
||
)
|
||
return routes
|
||
}
|