feat(archive): rich metadata in semantic search — username/channel/guild context + guild filter

Archive payload now stores username, channel_id, guild_id, thread_id and the
real message created_at (not embed time). Backend searchArray accepts an
optional guildId and applies a Qdrant payload filter so results can be scoped
to the guild being viewed. API/frontend expose the new fields and the
semantic results card shows who said it, in which channel, and when —
turning bare text blobs into contextual results. Old points fall back to
analyzed_at and omit the new fields gracefully.
This commit is contained in:
asepharyana
2026-09-01 18:56:14 +07:00
parent c704fbf7a5
commit 26a690943d
8 changed files with 84 additions and 8 deletions
+11 -3
View File
@@ -212,13 +212,21 @@ export function useMessageSearch(query: string, enabled: boolean) {
// ── Semantic Search (public archive, Qdrant) ──────
export function useSemanticSearch(query: string, enabled: boolean) {
export function useSemanticSearch(
query: string,
enabled: boolean,
guildId?: string | null,
) {
return useSWR<SemanticSearchResult[]>(
enabled && query.trim().length >= 2
? ["semantic-search", query.trim()]
? ["semantic-search", query.trim(), guildId ?? ""]
: null,
async () => {
const res = await messagesApi.semanticSearch(query.trim(), 10);
const res = await messagesApi.semanticSearch(
query.trim(),
10,
guildId ?? undefined,
);
return res.results;
},
{ keepPreviousData: true },