# Contract: 캡쳐 이미지 브릿지 + 챗 첨부 ## C#→JS 메시지 (신규) 기존 `SendToWeb`(`CoreWebView2.PostWebMessageAsJson`) 채널 재사용. | 방향 | 메시지 | 처리 | |---|---|---| | C#→JS | `{type:"capture.image", path, dataUrl}` | 프론트가 캡쳐 이미지를 지정된 챗 입력창 첨부로 받음 | - `path`: 캡쳐를 받을 route(`/snap/new` 또는 `/snap/s/:id`). - `dataUrl`: `data:image/png;base64,...` (PNG). - App 캡쳐 완료 순서: 창 소환 → 대상 route로 이동 → `{type:"capture.image", path, dataUrl}` 전송. - 기존 메시지(navigate·paste.target·window.*·snippets.* 등)와 같은 리스너 허브에서 `type`으로 분기. ## C# 표면 (신규/확장) - `Shell/Platform/ScreenCapture.cs` — `static byte[] CapturePng(int x, int y, int width, int height)`: 물리 좌표 영역을 `CopyFromScreen`으로 PNG 바이트. (좌표 변환은 호출측=오버레이 몫.) - `Views/CaptureOverlayWindow` — 드래그 선택 + DIP→물리 변환 + `ScreenCapture.CapturePng` 호출 → `event Action Captured`(base64 dataUrl) / `event Action Cancelled`. - `App.xaml.cs` — 핫키 id `0x1002`(Ctrl+Shift+9) → 오버레이 표시. `Captured` → 위 순서 실행. `Cancelled` → 무시. - `PaletteWindow.SendCaptureImage(string dataUrl) => Web.SendToWeb(new { type = "capture.image", dataUrl });` ## 프론트 계약 (`bridgeNavigate.ts`) ```ts // path가 일치하는 마지막 캡쳐 이미지를 1회 소비하고, 다르면 pending을 유지함. export function consumePendingCaptureImage(path: string): string // capture.image 수신 → {path, dataUrl} 보관 + bridge:captureImage 이벤트 발생 ``` ## 프론트 계약 (`Composer.tsx`) - `capturePath`와 메시지 `path`가 같은 Composer만 pending 이미지를 소비함. 네비게이션 직전의 다른 Composer가 이미지를 훔치지 않는다. - 새 대화와 기존 대화 모두 캡쳐 이미지를 누적하고 X로 제거할 수 있다. - v1 전송: 텍스트만. 이미지 첨부는 미전송 + 전송 후 정리. ## 순수 브라우저(dev) `SendToWeb`/`chrome.webview` 없음 → capture.image 안 옴, 캡쳐 기능 비활성(데스크톱 전용). 기존 챗은 그대로.