40 lines
1.3 KiB
Go
40 lines
1.3 KiB
Go
package application
|
|
|
|
import (
|
|
"context"
|
|
"git.cin.su/m/Assistant/contracts/work"
|
|
"git.cin.su/m/Assistant/modules/work/domain"
|
|
"git.cin.su/m/Assistant/modules/work/ports"
|
|
"time"
|
|
)
|
|
|
|
func DecideSolutionSearch(input work.SolutionSearchInput) (work.SolutionSearchDecision, error) {
|
|
return domain.DecideSolutionSearch(input)
|
|
}
|
|
|
|
func OrchestrateSolutionSearch(ctx context.Context, store ports.GraphStore, request work.SolutionSearchWaveRequest) (work.SolutionSearchWaveResult, error) {
|
|
decision, err := domain.DecideSolutionSearch(request.Input)
|
|
if err != nil {
|
|
return work.SolutionSearchWaveResult{}, err
|
|
}
|
|
result := work.SolutionSearchWaveResult{Decision: decision}
|
|
if !decision.ContinueSearching || decision.State == work.OrchestrationExecuting {
|
|
return result, nil
|
|
}
|
|
graph, intents, err := domain.BuildSolutionSearchWave(decision, request)
|
|
if err != nil {
|
|
return work.SolutionSearchWaveResult{}, err
|
|
}
|
|
if request.NowUnixMillis < 1 {
|
|
request.NowUnixMillis = time.Now().UnixMilli()
|
|
}
|
|
graph, ready, err := AdmitAndSchedule(ctx, store, GraphScheduleRequest{Graph: graph, Intents: intents, Now: request.NowUnixMillis})
|
|
if err != nil {
|
|
return work.SolutionSearchWaveResult{}, err
|
|
}
|
|
result.Graph = graph
|
|
result.ScheduledNodeIDs = ready
|
|
result.GraphMaterialized = true
|
|
return result, nil
|
|
}
|