# 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`)와 별개.** - 렌더: 썸네일 `` + 제거 `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·무효선택) → 아무 상태 변화 없음.