Memradar 를 "보는 툴"에서 "다시 찾는 아카이브"로 바꾸는 기능
버전: v0.2.12 · 갱신일: 2026-04-19
현재 상태: Phase A(풀텍스트)와 Phase B(필터·정렬·역할/모델/도구/프로젝트/날짜) 전부 구현 완료. 남은 것은 Phase C(IndexedDB 역색인·Web Worker·그룹핑 고도화)와 URL 쿼리 동기화. 상세 로드맵은 ROADMAP.md §2.2 참고.
사용자가 쌓아둔 AI 대화 기록 안에서 원하는 작업·질문·파일·도구 사용 흔적을 빠르게 다시 찾을 수 있게 한다.
Code Report 가 처음의 "와"를 만드는 기능이라면, Search 는 계속 돌아오게 만드는 기능이다.
- 특정 작업을 했던 세션을 빠르게 다시 찾기
- 예전에 어떤 프롬프트/질문/도구 조합을 썼는지 회고하기
- "이거 전에 어디서 했지?"를 해결하는 기본 탐색 도구 만들기
- 세션 전체와 메시지 텍스트를 대상으로 검색
- 사용자 메시지와 assistant 메시지 모두 검색 대상
- 도구 사용 이름은 필터로 지원 (텍스트 자체에 포함되면 풀텍스트로도 히트)
cwd·모델·파일명이 메시지 본문에 나타나면 그대로 매칭됨
예시:
zustanduseEffectvercel deployread_file~/projects/my-app
검색 결과를 아래 기준으로 좁힐 수 있다. 모두 SearchFilters 인터페이스에 반영되고 SearchBar 패널에서 조작 가능.
- 모델 (
model드롭다운, facets 기반) - 툴 사용명 (
tool단일 선택 드롭다운, facets 기반) - 프로젝트 경로 (
cwd드롭다운, facets 기반, 표시는shortenCwd로 마지막 2세그먼트) - 날짜 범위 (
dateFrom/dateTo,YYYY-MM-DD비교) - 역할
- user만
- assistant만
- 전체
각 결과는 아래 정보를 포함한다.
- 세션 첫 메시지 스니펫 (세션 제목 대용)
- 매칭된 문장 스니펫(양쪽 80자 컨텍스트, 시작/끝 잘림 시
...) - 일치 개수(
matchCount) — 관련도 정렬 기준 - 타임스탬프(월/일/시:분,
ko-KR로케일) - 모델
cwd(최대 150px 말줄임)- 사용 도구 최대 3개 + 나머지 개수
- 결과 클릭 시
onSelectResult(session, messageIndex)로 세션 상세로 전환 - 해당 메시지 위치로 스크롤 및 검색어 하이라이트는 세션 상세 렌더링에서 수행
세 가지 정렬 모드를 지원 (SearchSort).
- 관련도순 (
relevance, 기본) —matchCount내림차순 - 최신순 (
newest) —timestamp내림차순 - 오래된순 (
oldest) —timestamp오름차순
- Ctrl+K 또는 해시 라우트
#search로 검색 뷰 진입 - 검색 입력창 자동 포커스, 키워드 입력 (200ms debounce)
- 결과 리스트 즉시 갱신 (최대 100건)
- 필터 패널 토글 후 모델/도구/프로젝트/날짜/역할 적용
- 정렬 변경
- 결과 클릭 → 세션 상세에서 해당 맥락 확인
- Esc 로 뒤로 나가기
- 메인 입력 placeholder:
메시지 검색... - autoFocus, Esc → 필터 패널 닫기 또는 뷰 종료
- 입력 내용 있으면 X 버튼으로 즉시 clear
- 200ms debounce (
SearchView내부에서 관리) - 오른쪽에 필터 토글 버튼과 닫기 버튼 배치
- 발신자 토글: 전체 / User / Claude
- 모델 드롭다운 (facets.models 기반, 값 있을 때만 노출)
- 도구 드롭다운 (facets.tools 기반, 값 있을 때만 노출) — 현재 단일 선택
- 프로젝트 드롭다운 (facets.cwds 기반)
- 날짜 범위:
from/to<input type="date"> - 필터 초기화 버튼 (쿼리는 유지)
- 역할 아이콘 (User / Bot), 초록 vs accent 색 구분
- 스니펫:
<mark>로 매치 하이라이트, 최대 3줄line-clamp - 메타 정보 한 줄: 타임스탬프, 모델, 프로젝트 경로, 사용 도구 목록
- 세션 첫 메시지 preview(60자) — 세션 식별 보조
- 대소문자 구분 없음 (
toLowerCase비교) - 부분 일치 허용 (
String.includes) - 현재는 단일 토큰 매칭 — 여러 단어는 하나의 substring 으로 취급
- AND 검색, 정규식 검색, boolean 문법 미지원 (제외 범위)
- 첫 매치 기준 앞뒤 80자 컨텍스트 추출
- 잘린 쪽에
...부착 - 매치 개수는 전체 텍스트 기준으로 계산 (하이라이트는 스니펫 구간만)
- 특수문자 이스케이프 처리(
escapeRegex)
- 현재는 메시지 단위로 평면 리스트 (최대 100건)
- 같은 세션 결과 시각적 그룹핑은 Phase C 항목
세션 파싱 후 buildSearchRecords(sessions) 로 메시지 단위 레코드를 만든다.
interface SearchRecord {
sessionId: string
messageIndex: number
text: string
role: 'user' | 'assistant'
model?: string
cwd?: string
timestamp: string
tools: string[]
}extractFacets(sessions) 는 드롭다운용 모델/도구/cwd 집합을 뽑는다.
- 현재는 메모리 내 배열 선형 스캔 (
search()함수) - 값싼 필터(role/model/tool/cwd/date) 먼저 적용, 텍스트 매칭 마지막
- Phase C 에서 IndexedDB + 역색인 전환 검토
SearchView 로컬 상태로 관리:
filters: SearchFilters(query 포함)debouncedQuerysort: SearchSort
URL 쿼리 스트링 연동은 미구현 — 현재 진입점은 #search 해시와 Ctrl+K 핫키만. 향후 확장:
/search?q=zustand/search?q=deploy&model=claude-sonnet&tool=bash
App.tsx에서Ctrl+K단축키로search뷰 토글- 해시 라우트
#search로 직접 진입 - Esc 로 대시보드 복귀
- 검색어 기준으로 문자열 분리 후
<mark>렌더링 (HighlightedSnippet) - 정규식 이스케이프 처리 (
escapeRegex)
- debounce 200ms 적용 중
- 현재 결과 상한 100건으로 대용량 세션 UI 멈춤 방지
- 값싼 필터 → 텍스트 매칭 순서로 최적화
- Web Worker 분리는 Phase C (후순위)
현재 구현에서 다루지 않는 기능:
- 벡터 검색
- 자연어 의미 검색
- AI 기반 검색어 추천
- 복잡한 쿼리 문법 (AND/OR/NOT)
- 정규식 검색
- 저장된 검색
- 검색 결과 공유 링크의 완전한 재현성 보장
- 사용자가 예전 작업 세션을 10초 안에 다시 찾을 수 있다
- 특정 키워드로 원하는 메시지 문맥을 바로 열 수 있다
- Memradar가 단순 시각화가 아니라 "기록 도구"처럼 느껴진다
- 검색 입력창 (
SearchBar.tsx) - 풀텍스트 검색 (
src/lib/search.ts) - 메시지 단위 결과 (
SearchResults.tsx) - 세션 이동 + 검색어 하이라이트
- Ctrl+K /
#search진입점
- 모델 / 툴 / 프로젝트(cwd) / 날짜 범위 / 역할 필터 — 모두
SearchFilters에 반영 - 정렬 옵션 3종 (relevance / newest / oldest)
- 도구·모델·프로젝트 드롭다운은
extractFacets결과로 자동 채움
- URL 쿼리 스트링 동기화 (
/search?q=...&model=...) — 미구현 - 도구 다중 선택 (현재 단일 선택 드롭다운)
- IndexedDB 기반 검색 캐시 / 역색인
- 결과 그룹핑 고도화 (세션 단위 묶기)
- Web Worker 분리 및 대용량 세션 성능 최적화