# 메모리 훅 시스템

## 아키텍처
SQLite (better-sqlite3) + sqlite-vec(벡터) + FTS5(키워드) 하이브리드 검색.
Gemini API로 임베딩(3072차원) + 요약. 429 시 raw excerpt fallback.

## 훅 매핑
- `search.mjs` (UserPromptSubmit, sync) — 질문 시 관련 메모리 자동 검색
- `save.mjs` (Stop, async) — 세션 종료 시 JSONL 파싱 → daily/ 저장
- `capture-insight.mjs` (Stop, async) — 인사이트 추출
- `reindex.mjs` (PostToolUse Write|Edit, async) — memory/ 파일 변경 시 재인덱싱
- `compact.mjs` (PreCompact, sync) — 컨텍스트 압축 전 상태 보존 + promote 트리거
- `session-restore.mjs` (SessionStart, sync) — 장기/단기 기억 복구
- `checkpoint.mjs` (UserPromptSubmit, async) — 경량 체크포인트
- `promote.mjs` (CLI/compact 트리거) — 단기→장기 승격

## DB 스키마
- `chunks`: id, path, text, embedding(BLOB), source, project, importance, access_count
- `chunks_vec`: vec0 가상 테이블 (float[3072])
- `chunks_fts`: FTS5 가상 테이블
- `files`: path, hash (변경 감지용)
- `embedding_cache`: 임베딩 캐시

## 단기/장기 기억
- 단기: `memory/daily/YYYY-MM-DD.md` (importance 3~5, 14일 만료)
- 장기: `memory/long-term/promoted.md` (importance 7~8, 영구)
- 인사이트: DB에만 저장 (importance 8, source=insight)
- 승격 기준: importance >= 7 OR access_count >= 5

## 설정
`.env` 파일에서 모든 파라미터 조정. 코드 수정 불필요.

## 주의사항
- EMBED_MODEL 변경 시 EMBED_DIMS도 변경하고 DB 재생성 필요
- Gemini 무료 티어 한도 주의: save.mjs는 429 시 raw fallback 작동
- `PROJECT_ROOT`는 lib/db.mjs에서 4단계 상위 (`hooks/memory/lib/` → starian/)
