Files
CODE_ASSISTANT/specs/002-capture-to-chat/data-model.md
T
2026-09-16 17:22:14 +09:00

40 lines
2.1 KiB
Markdown

# Data Model: 화면 캡쳐 → 챗 첨부 (Phase 1)
캡쳐 이미지는 저장소 없이 메모리→data URL로만 흐른다. v1 영속 없음.
## 엔티티
### 캡쳐 이미지 (Capture Image)
선택 영역의 화면 스냅샷 한 장.
| 표현 | 형태 | 설명 |
|---|---|---|
| C# 내부 | `Bitmap` → PNG `byte[]` | `CopyFromScreen` 결과 |
| 전달 | `dataUrl: string` | `data:image/png;base64,...` |
| 프론트 첨부 | `string`(dataUrl) | Composer `imageAttachments` 배열의 한 항목 |
- v1엔 파일/DB 영속 없음. 챗 첨부 상태로만 존재.
## 프론트 상태
### Composer 이미지 첨부 (`Composer.tsx`)
- 신규 상태: `imageAttachments: string[]` — 각 항목은 PNG data URL. **텍스트 첨부(`attachments`)와 별개.**
- 렌더: 썸네일 `<img>` + 제거 `X` 버튼(칩). 텍스트 첨부 칩 옆/위.
- 추가 규칙:
- 마운트 시 `consumePendingCaptureImage()` 값 있으면 push(누락 방지).
- `bridge:captureImage` 이벤트 수신 시 push(누적 — 여러 번 캡쳐 = 여러 첨부, FR-008).
- X → 해당 항목 제거(FR-007).
- **전송 시(v1)**: 텍스트만 전송(기존 그대로). 이미지 첨부는 **전송하지 않고**, 전송 후 `imageAttachments`는 비운다(텍스트 첨부와 동일하게 정리 — 안 쓰지만 쌓이지 않게). ← FR-009. 백엔드 붙으면 이 지점에서 payload에 실어 보내도록 확장.
## 브릿지 모듈 상태 (`bridgeNavigate.ts`)
- `pendingCaptureImage: string`("" = 없음) — 마지막 수신 캡쳐 dataUrl(마운트 레이스 대비).
- `consumePendingCaptureImage(): string` — 값 반환 후 `""`로 비움(read-once).
- `capture.image` 수신 시: `pendingCaptureImage = dataUrl` + `bridge:captureImage`(detail: `{dataUrl}`) 발생.
- (참고) pasteTarget은 "지속 표시"라 get, 캡쳐는 "1회 소비"라 consume — 세만틱만 다름.
## 상태 전이
캡쳐 없음 → (핫키·드래그·확정) → dataUrl 생성/전달 → Composer 이미지 첨부 1개 추가 → (X 제거 | 전송 시 정리) → 없음.
취소(Esc·무효선택) → 아무 상태 변화 없음.