<!-- FILE: _St/RTC8790_8791/ai_read.md | ROLE: RTC8790/8791 현재 기준 -->

## 패키지 v322 동기화
- 실행/표시 버전은 `2.3.8.322 / v322`; 이번 Side 설정 전역 회귀 복원에서는 RTC8790/8791 기능 로직을 변경하지 않는다.

## 패키지 v321 동기화
- 실행/표시 버전은 `2.3.8.321 / v321`; 이번 Side 설정 톱니바퀴 복원에서는 RTC8790/8791 기능 로직을 변경하지 않는다.


## 패키지 v317 동기화
- 실행/표시 버전은 `2.3.8.317 / v317`; 이번 수동 다운로드 강조·편집폴더 1건 교정에서는 RTC8790/8791 기능 로직을 변경하지 않는다.

## 패키지 v316 동기화
- 실행/표시 버전은 `2.3.8.316 / v316`; 이번 편집폴더 GUI picker·수동 injection fallback 작업에서는 RTC8790/8791 기능 로직을 변경하지 않는다.

## 패키지 v314 동기화
- 실행/표시 버전은 `2.3.8.315 / v314`; 기존 시작 Tray 숨김·복원 기준은 그대로 유지한다.


최신 기준: v310 / 2026-08-08
포트: HTTP `127.0.0.1:8790`, WebSocket `127.0.0.1:8791`

## v310 시작 Tray 기준
- RTC는 실행 시 메인 Tk 창을 먼저 `withdraw()`하고 공용 프로젝트 Tray 아이콘을 생성한다.
- Tray 생성 성공 시 서비스 HTTP 8790 / WS 8791 / capture auto-start는 그대로 동작하면서 메인창만 숨긴다.
- Tray 생성 실패 시 `deiconify()`하여 메인창을 보여 주며 숨은 프로세스로 남기지 않는다.
- Tray 아이콘 클릭 시 메인창 복원, 메인 UI `.` 버튼은 다시 Tray 숨김, X는 기존 전체 RTC 종료다.
- Tray icon은 `_St/Shared/assets/ig_styellow_tray.ico`, 원본은 `_St/IG_StYellow/icons/logo.png`다.
- host/viewer 표시는 `2.3.8.310 / v310`으로 동기화한다.
- 실제 Windows 시작 숨김·Tray 클릭 복원은 `[검증대기]`.


## RTC8790_8791 책임

- HTTP viewer `8790` 제공.
- RTC/WebSocket frame stream `8791` 제공.
- 화면 캡처, viewer 표시, cursor screen/frame 변환.
- 원격 제어 허용 상태와 viewer control 이벤트 처리.
- 캡처 정보, 포인터 정보, 수동 스샷 저장 명령 처리.
- PY 실행 파일과 동일한 이름의 `.json` 파일에 UI 마지막 설정과 창 위치를 저장/복원한다.

## RTC8790_8791 금지

- IG DOM 해석 금지.
- IG 중복체크, 폴더명.json, `.md5` 판단 금지.
- WS8771 라우팅/Save Dialog 처리 금지.
- Chrome 원격 데스크톱 포인터 점유 문제를 RTC 내부에서 해결하려 하지 않는다.

## v135 현재 정상 구조

- PC에서는 기존 오른쪽 패널 고정 구조를 유지한다.
- 모바일/터치 환경에서는 기본을 터치패드 구조로 둔다.
  - 상단: 원격 화면 표시.
  - 중간: 터치패드.
  - 하단: 채팅/로그/제어 패널.
- 모바일 상단 중앙 floating 버튼:
  - `⛶`: 원격화면 전체보기 진입.
  - `×`: 전체보기 종료 후 터치패드/하단 패널 복귀.
- 패널의 `원격화면` 버튼은 전체보기로 진입한다.
- 모바일 기본 제어는 ON이다.
- 전체보기에서는 화면 표시를 우선하고, 실제 안정 제어는 터치패드 화면에서 수행한다.

## 모바일 터치패드 제어 기준

- 한 손가락 드래그: 원격 가상 포인터 이동.
- 한 번 탭: 현재 가상 포인터 위치 좌클릭.
- 더블탭: 현재 가상 포인터 위치 더블클릭.
- 길게 누름: 현재 가상 포인터 위치 우클릭.
- 터치패드 내부 버튼: 클릭 / 더블 / 우클릭 즉시 실행.
- 두 손가락 터치패드 상하 이동: 현재 가상 포인터 위치 기준 휠 스크롤.
- 원격화면 영역에서 맞춤·1:1 모드 두 손가락 드래그: viewer 화면 pan 이동.
- 원격화면 두 번 터치: 두 번째 터치 위치로 가상 십자와 실제 Windows 마우스를 이동한다.
- 두 번째 터치를 움직이지 않고 놓으면 click/dblclick 없이 포인터 이동만 유지한다.
- 두 번째 터치를 유지한 채 이동: 실제 마우스 down/drag/up.
- 가상 포인터는 `+` 커서 형태로 원격 frame 좌표 기준 표시한다.
- 클릭/더블클릭/우클릭 시 원격화면 위에 ripple 피드백을 표시한다.
- viewer pan 좌표와 원격 클릭 좌표는 분리한다.

## v135 설정 저장 기준

- 설정 파일은 실행 PY 파일과 동일한 이름의 `.json`을 사용한다.
  - 일반 실행 기준: `rtc8790_8791_main.py` → `rtc8790_8791_main.json`
- 구버전 `rtc8790_8791_config.json`이 있고 새 설정 파일이 없으면 1회 읽어 호환한다.
- 설정 파일 오류/저장 실패는 프로그램 실행을 막지 않는다.
- 저장/복원 대상:
  - 메인 창 위치/크기와 zoomed 상태.
  - 캡처 대상 모드, 디스플레이 번호, 창 고정.
  - 원격 제어 허용, 파일전송 허용, 클립보드 수동 전송 허용.
  - FPS, JPEG 품질, max_width, 빨간 테두리.
  - AI 스냅샷 설정.
- `run_RTC8790_8791.bat`은 `--control`, `--source`를 강제하지 않고 저장값을 따른다.

## 주요 파일

- `rtc8790_8791_main.py` — RTC8790_8791 단독 진입점.
- `rtc8790_8791_main.json` — 실행 파일 동일명 설정 저장 파일.
- `yjm_settings.py` — AppSettings/SnapshotSettings/UiSettings 저장/로드.
- `yjm_win2rtc_capture.py` — RTC 캡처/viewer 본체. build tag `v310`.
- `web/viewer.html` — RTC viewer UI, 모바일 터치패드/전체보기/pan/가상 포인터/CDP 테스트 패널 담당.
- `host/protocol.py` — RTC viewer/host 메시지 공통 protocol.
- `run_RTC8790_8791.bat` — RTC8790_8791 단독 실행 bat.

## 폐기/주의

- 모바일에서 오른쪽 패널 고정 340px 구조를 그대로 쓰면 원격화면이 사라진다.
- 모바일에서 손가락 위치를 곧바로 원격 클릭으로 쓰는 방식은 흔들리므로 기본값이 아니다.
- Chrome 원격 데스크톱 포인터 점유 상태에서는 IG 자동화 검증에 사용할 수 없다. RTC 자체 viewer를 우선 사용한다.

## 다음 작업 원칙

- RTC 기능 패치는 이 폴더 안에서만 한다.
- 원점찾기/마커/OCR 개선은 WS8771 또는 IG Extension 쪽에서 따로 진행한다.
- 모바일 RTC 문제는 viewer 레이아웃/터치 이벤트부터 확인한다.

## v135 패치 기준 - RTC CDP 테스트 2단계

- RTC viewer 상단 조작부에 `CDP 테스트` 버튼을 추가했다.
- 버튼을 누르면 RTC panel 안에서 CDP 테스트 패널이 열리고 닫힌다.
- 패널에는 Auto8700 API 주소, 상태/탭목록/title/url/JS 실행 버튼, 결과 표시 영역을 배치했다.
- 2단계는 UI 골격만 추가한다. 실제 Auto8700 `/api/cdp/...` 호출 연결은 3단계에서 수행한다.
- RTC는 CDP WebSocket에 직접 붙지 않는다. CDP 실행 엔진은 계속 Auto8700이 담당한다.
- 기존 화면 송출, 터치패드, 원격 제어, WS 통신 로직은 변경하지 않는다.

## v136 패치 기준 - RTC CDP 테스트 3단계

- RTC CDP 테스트 패널을 Auto8700 CDP API에 실제 연결했다.
- 원격 모바일 브라우저에서 `127.0.0.1:8707`을 직접 호출하면 모바일 자기 자신을 보게 되므로 실패한다.
- 따라서 RTC HTTP 서버에 Auto8700 CDP 프록시를 추가했다.
- viewer 기본 API 주소는 `/api/auto8700/cdp` 이다.
- RTC 프록시 경로:
  - `GET /api/auto8700/cdp/status` → Auto8700 `GET /api/cdp/status`
  - `GET /api/auto8700/cdp/targets` → Auto8700 `GET /api/cdp/targets`
  - `POST /api/auto8700/cdp/evaluate` → Auto8700 `POST /api/cdp/evaluate`
  - `POST /api/auto8700/cdp/bring_to_front` → Auto8700 `POST /api/cdp/bring_to_front`
- viewer 기능:
  - CDP 상태 확인
  - target 목록 조회
  - target 선택
  - Page.bringToFront
  - `document.title` 읽기
  - `location.href` 읽기
  - `document.readyState` 읽기
  - Runtime.evaluate 직접 실행
- RTC는 여전히 CDP WebSocket에 직접 붙지 않는다. CDP 엔진은 Auto8700에만 둔다.
- 위험 명령은 아직 넣지 않는다.

## v137 패치 기준 - RTC CDP 테스트 4단계

- RTC CDP 패널에 IG 전용 테스트 버튼을 추가했다.
- 추가 버튼:
  - IG 상태
  - IG 앞으로
  - 예약 storage
  - IG 이벤트 테스트
  - Side 열기 요청
- RTC는 계속 CDP WebSocket에 직접 붙지 않고 `/api/auto8700/cdp/...` 프록시만 호출한다.
- 추가 프록시 경로:
  - `GET /api/auto8700/cdp/ig/status`
  - `GET /api/auto8700/cdp/ig/schedule_storage`
  - `POST /api/auto8700/cdp/ig/bring_to_front`
  - `POST /api/auto8700/cdp/ig/send_event`
  - `POST /api/auto8700/cdp/ig/side_open`
- IG 이벤트 테스트와 Side 열기 요청은 자동다운로드를 시작하지 않는 안전 테스트 경로다.


## v138 패치 기준 - RTC CDP 프록시 토큰 보정

- RTC CDP 패널은 기존 RTC viewer URL의 `token`을 그대로 사용한다.
- `/api/auto8700/cdp/*` 프록시 요청에는 query `token`과 `X-RTC-Token` 헤더를 함께 붙인다.
- RTC 서버 프록시는 기존 query token뿐 아니라 `X-RTC-Token` 헤더도 인정한다.
- 새 HMAC/peer_auth 체계는 추가하지 않는다.
- Auto8700/IG에는 별도 토큰 로직을 추가하지 않는다.
- IG는 외부 원격 수신자가 아니므로 side-open/start 이벤트 이름과 action만 처리한다.

## v139 패치 기준 - _St.token 다중 토큰 인증

- RTC viewer token은 `D:\_St\_St.token`에서 읽는다.
- `_St.token`이 없으면 RTC 시작 시 자동 생성한다.
- `_St.token`은 배포 ZIP에 포함하지 않는다.
- 파일 형식은 한 줄에 토큰 1개이며, 토큰 뒤에 선택 이름/comment를 둘 수 있다.
- 여러 토큰 중 하나라도 query `token` 또는 `X-RTC-Token`과 일치하면 `/api/auto8700/cdp/*` 프록시를 허용한다.
- 기존 v138의 `NameError: token is not defined` 문제는 `token` 변수를 쓰지 않고 `_St.token` 목록을 기준으로 검증하도록 수정했다.


## 과거 v140 패치 기준 - 모바일 pan·포인터 찾기·더블터치 드래그 (v141에서 버튼/무이동 더블클릭 폐기)

- 맞춤 보기와 1:1 보기 모두 원격화면 두 손가락 pan을 지원한다.
- pan은 stage/canvas 크기 기준 경계 안에서만 이동한다.
- v140 당시 모바일 패널과 전체화면에 `⌖ 포인터 찾기` 버튼을 제공했다. 이 버튼은 v141에서 제거했다.
- `/cursor` 응답의 `frame_x/frame_y/inside_capture`를 가상 십자와 1:1 화면 위치에 반영한다.
- 캡처 밖 Windows 포인터는 오류로 표시하고 화면 안으로 위조하지 않는다.
- v140 당시 원격화면 더블터치 무이동은 더블클릭, 이동은 drag였다. 무이동 더블클릭은 v141에서 폐기했다.
- touchcancel, 제어 OFF, disconnect, 페이지 숨김/종료에서 mouse release를 수행하며 Host disconnect에서도 실제 mouse UP을 강제한다.
- 터치패드 두 손가락 휠은 기존 동작을 유지한다.
- 자동 테스트는 OK이며 실제 모바일/Windows 제어는 `[검증대기]`다.

## v141 패치 기준 - 두 번 터치 포인터 이동·유지 드래그

- 패널과 전체화면의 포인터 찾기 버튼, 명령 버튼의 포인터 항목을 제거한다.
- 첫 터치 종료 후 같은 위치의 두 번째 터치 시작 시 즉시 해당 frame 좌표로 `move`를 보낸다.
- 두 번째 터치를 움직이지 않고 놓으면 추가 click/dblclick을 실행하지 않는다.
- 두 번째 터치를 유지한 채 8px 이상 움직이면 시작 위치에서 `mouse_down`, 이동마다 `drag_move`, 종료 시 `mouse_up/release_all`을 보낸다.
- 맞춤·1:1 두 손가락 pan과 터치패드 두 손가락 휠은 유지한다.
- `/cursor` Host 명령은 진단용 내부 경로로 남기되 사용자 버튼은 제공하지 않는다.
- 자동 테스트는 OK이며 실제 모바일/터치 PC Windows 제어는 `[검증대기]`다.

