Search runs a free-text search across saved sessions.
(_ context.Context, query string, limit int)
| 27 | |
| 28 | // Search runs a free-text search across saved sessions. |
| 29 | func (a *sessionPluginAdapter) Search(_ context.Context, query string, limit int) (string, error) { |
| 30 | if a.cli == nil || a.cli.sessionManager == nil { |
| 31 | return "", fmt.Errorf("%s", i18n.T("session.tool.unavailable")) |
| 32 | } |
| 33 | hits, err := a.cli.sessionManager.SearchSessions(query, limit) |
| 34 | if err != nil { |
| 35 | return "", err |
| 36 | } |
| 37 | if len(hits) == 0 { |
| 38 | return i18n.T("session.tool.no_match", query), nil |
| 39 | } |
| 40 | |
| 41 | var b strings.Builder |
| 42 | b.WriteString(i18n.T("session.tool.match_header", query)) |
| 43 | b.WriteByte('\n') |
| 44 | for _, h := range hits { |
| 45 | fmt.Fprintf(&b, "\n• %s (%s)\n", h.Session, i18n.T("session.tool.match_count", h.Matches)) |
| 46 | for _, sn := range h.Snippets { |
| 47 | sn = strings.TrimSpace(sn) |
| 48 | if sn != "" { |
| 49 | b.WriteString(" … " + sn + "\n") |
| 50 | } |
| 51 | } |
| 52 | } |
| 53 | return strings.TrimRight(b.String(), "\n"), nil |
| 54 | } |
| 55 | |
| 56 | // List returns the saved session names. |
| 57 | func (a *sessionPluginAdapter) List(_ context.Context) (string, error) { |