From 868c90c8965f726809280fcb3174a7fb6e57638c Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Thu, 12 Feb 2026 18:33:05 +0300 Subject: [PATCH] fix memo selection --- internal/memos/client.go | 12 ----------- internal/search/selector.go | 41 +++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/internal/memos/client.go b/internal/memos/client.go index f48d9db..f9c695d 100644 --- a/internal/memos/client.go +++ b/internal/memos/client.go @@ -103,15 +103,3 @@ func (c *Client) DownloadAttachment(ctx context.Context, att Attachment) ([]byte } return data, nil } - -// GetRandomMemo fetches a single memo without any filter (for full fallback). -func (c *Client) GetRandomMemo(ctx context.Context) (*Memo, error) { - resp, err := c.ListMemos(ctx, "", 1, "") - if err != nil { - return nil, err - } - if len(resp.Memos) == 0 { - return nil, nil - } - return resp.Memos[0], nil -} diff --git a/internal/search/selector.go b/internal/search/selector.go index df19f1d..b831d3c 100644 --- a/internal/search/selector.go +++ b/internal/search/selector.go @@ -201,17 +201,50 @@ func (s *Selector) fetchRanges(ctx context.Context, ranges []DateRange) ([]*memo } func (s *Selector) fullFallback(ctx context.Context) (*Memory, error) { - memo, err := s.client.GetRandomMemo(ctx) + resp, err := s.client.ListMemos(ctx, "", s.cfg.PageSize, "") if err != nil { return nil, fmt.Errorf("full fallback: %w", err) } - if memo == nil { + + allMemos := resp.GetMemos() + if len(allMemos) == 0 { return nil, nil } + + // Try to apply relaxed cooldown + cooldownSet, err := s.store.GetCooldownMemoNames(ctx, s.cfg.RelaxedCooldownDays) + if err != nil { + return nil, fmt.Errorf("full fallback cooldown: %w", err) + } + + var filtered []*memos.Memo + for _, m := range allMemos { + if _, blocked := cooldownSet[m.Name]; !blocked { + filtered = append(filtered, m) + } + } + + // If nothing survives cooldown, use all memos + if len(filtered) == 0 { + filtered = allMemos + } + + candidates := make([]candidate, len(filtered)) + for i, m := range filtered { + candidates[i] = candidate{memo: m} + } + + picked := weightedSelect(candidates, false, 0) + if picked == nil { + return nil, nil + } + + s.logger.Info("selected memory via full fallback", "memo", picked.memo.Name) + return &Memory{ - Memo: memo, + Memo: picked.memo, Tier: 0, - Date: memo.DisplayTime, + Date: picked.memo.DisplayTime, }, nil }