diff --git a/adapters/postgres/continuity_repository.go b/adapters/postgres/continuity_repository.go index edb6da2..8b70b73 100644 --- a/adapters/postgres/continuity_repository.go +++ b/adapters/postgres/continuity_repository.go @@ -214,7 +214,7 @@ func (r *ContinuityRepository) AttentionByOwner(ctx context.Context, owner ident } func (r *ContinuityRepository) ResponseCandidates(ctx context.Context, owner identity.PrincipalID, limit int) ([]continuitydomain.ResponseCandidate, error) { - if owner == "" || limit < 1 || limit > 10 { + if owner == "" || limit < 1 || limit > 50 { return nil, fmt.Errorf("invalid response candidate query") } rows, err := r.pool.Query(ctx, `SELECT diff --git a/cmd/continuity-runtime/human_response.go b/cmd/continuity-runtime/human_response.go index 9e4bdcb..8abd45a 100644 --- a/cmd/continuity-runtime/human_response.go +++ b/cmd/continuity-runtime/human_response.go @@ -42,7 +42,7 @@ func registerCreatorResponseRoute(mux *http.ServeMux, identityClient creatorIden http.Error(w, "human response unavailable", http.StatusServiceUnavailable) return } - candidates, err := repository.ResponseCandidates(r.Context(), session.PrincipalID, 3) + candidates, err := repository.ResponseCandidates(r.Context(), session.PrincipalID, 20) if err != nil { http.Error(w, "response candidates unavailable", http.StatusInternalServerError) return diff --git a/modules/continuity/domain/human_response.go b/modules/continuity/domain/human_response.go index ccae0c0..845e108 100644 --- a/modules/continuity/domain/human_response.go +++ b/modules/continuity/domain/human_response.go @@ -153,6 +153,9 @@ func candidateSummary(candidates []ResponseCandidate) string { parts := make([]string, 0, len(candidates)) for _, candidate := range candidates { text := strings.TrimSpace(candidate.Attention.Summary) + if text == "" { + text = strings.TrimSpace(candidate.Prospective.Summary) + } if text == "" { text = "ожидание" } diff --git a/modules/continuity/domain/human_response_test.go b/modules/continuity/domain/human_response_test.go index 649d35c..a44aa1e 100644 --- a/modules/continuity/domain/human_response_test.go +++ b/modules/continuity/domain/human_response_test.go @@ -53,6 +53,19 @@ func TestInterpretHumanResponseResolvesArmedProspectiveByNaturalSummaryReference } } +func TestInterpretHumanResponseResolvesSummaryReferenceBeyondFirstThreeCandidates(t *testing.T) { + candidates := []ResponseCandidate{ + responseCandidate("a1", "p1", "первое ожидание"), + responseCandidate("a2", "p2", "второе ожидание"), + responseCandidate("a3", "p3", "третье ожидание"), + {Prospective: continuity.ProspectiveItem{ID: "p4", OwnerPrincipalID: "principal-1", ScopeID: "scope-1", Summary: "встретить курьера", State: continuity.ProspectiveArmed, Revision: 1}}, + } + result := interpretResponseForTest(t, "Отмени встретить курьера", candidates) + if !result.Handled || result.Response.ResolutionState != continuity.ResponseResolved || result.Response.TargetProspectiveID != "p4" { + t.Fatalf("expected target resolution beyond first three candidates, got %#v", result) + } +} + func TestInterpretHumanResponseAmbiguousTargetAsksClarificationWithoutResolvedMutation(t *testing.T) { result := interpretResponseForTest(t, "Готово", []ResponseCandidate{responseCandidate("a1", "p1", "первое"), responseCandidate("a2", "p2", "второе")}) if !result.Handled || result.Response.ResolutionState != continuity.ResponseAmbiguous || result.Response.Outcome != continuity.ResponseOutcomeClarificationNeeded || !strings.Contains(result.Reply, "несколько") {