{#if searchType === 'message'}
{#if showFilters}
{/if} {/if} { selectedIdx = null; messages = null; }} onKeydown={(e) => { console.log('e', e); if (e.code === 'Enter' && (chatList ?? []).length > 0) { const item = document.querySelector(`[data-arrow-selected="true"]`); if (item) { item?.click(); } show = false; return; } else if (e.code === 'ArrowDown') { selectedIdx = Math.min(selectedIdx + 1, (chatList ?? []).length - 1 + actions.length); } else if (e.code === 'ArrowUp') { selectedIdx = Math.max(selectedIdx - 1, 0); } else { selectedIdx = 0; } const item = document.querySelector(`[data-arrow-selected="true"]`); item?.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' }); }} />
{$i18n.t('Actions')}
{#each actions as action, idx (action.label)} {/each} {#if searchType === 'chat'} {#if chatList}
{#if chatList.length === 0}
{$i18n.t('No results found')}
{/if} {#each chatList as chat, idx (chat.id)} {#if idx === 0 || (idx > 0 && chat.time_range !== chatList[idx - 1].time_range)}
{$i18n.t(chat.time_range)}
{/if} { selectedIdx = idx + actions.length; }} on:click={async () => { await goto(`/c/${chat.id}`); show = false; onClose(); }} >
{chat?.title}
{dayjs(chat?.updated_at * 1000).calendar()}
{/each} {#if !allChatsLoaded} { if (!chatListLoading) { loadMoreChats(); } }} >
{$i18n.t('Loading...')}
{/if} {:else}
{/if} {:else if searchType === 'message'} {#if messageSearchResponse}
{#if messageSearchResponse.hits.length === 0}
{$i18n.t('No results found')}
{:else}
Message Results {messageSearchResponse.estimatedTotalHits || messageSearchResponse.totalHits} {messageSearchResponse.estimatedTotalHits ? ' ~' : ''} hits in {messageSearchResponse.processingTimeMs}ms
{#if groupByConversation} {@const groupedResults = displayedMessageResults.reduce((groups, item) => { const key = item.chatId; if (!groups[key]) { groups[key] = { chatId: key, chatTitle: item.chatTitle || 'Untitled Chat', messages: [] }; } groups[key].messages.push(item); return groups; }, {})} {@const groupsSortedByFirstMessage = Object.values(groupedResults).sort((a, b) => { // When sorting by date, use the timestamp; otherwise use score // Groups are ordered by their first message (backend already sorted) const firstA = a.messages[0]; const firstB = b.messages[0]; if (sortBy === 'date') { return firstB.timestamp - firstA.timestamp; // Newest first } return firstB._rankingScore - firstA._rankingScore; // Best match first })} {#each groupsSortedByFirstMessage as group (group.chatId)} {@const sortedMessages = group.messages} {/each} {:else} {#each displayedMessageResults as item, idx (item.id)} { selectedIdx = actions.length + idx; if (showPreview) { loadMessageChatPreview(item.chatId, item.messageId); } }} on:click={() => { show = false; onClose(); }} data-arrow-selected={selectedIdx === actions.length + idx ? 'true' : undefined} >
{item.chatTitle || 'Untitled Chat'}
{@html item._formatted?.content || ''}
{item.role === 'user' ? 'You' : 'AI'} • {new Date(item.timestamp * 1000).toLocaleDateString()} Score: {item._rankingScore.toFixed(2)}
{/each} {#if hasMoreResults} {/if} {/if} {/if} {:else}
{/if} {/if}
{#if messages === null}
{$i18n.t('Select a conversation to preview')}
{:else}
{}} continueResponse={() => {}} regenerateResponse={() => {}} />
{/if}