# 파일 ✨/mnt/d/D/_NR_/__AIWK_COMM_St/aiwk/AIWK_PC/aiwk_mypc_plan.md
# AIWK MyPC / MyP2P 전체 세부계획 v123-plugin-market-mnt-root-anchor



## v123 final goal MVP 추가 기준

PC1은 AIWK 전체 구조의 root identity / DNS anchor다. 목표는 PC1 아래에 Chrome profile, EXT4 tab, Node-RED, 향후 P2P/파일전송 상태를 묶어 Relay에서 한눈에 보이게 하는 것이다.

PC Agent는 EXT4 배포 확인, Chrome 프로필별 실행/재시작, Local/Extension Storage 점검, Node-RED 상태 확인을 담당한다. EXT4는 브라우저 내부 자동화에 집중하고, 로컬 OS 권한이 필요한 작업은 PC Agent가 WSS 명령을 받아 수행한다.

`pc001`은 실제 URL md5가 아니라 PC Agent route_key다. `url5` 필드에 남아 있어도 하위 호환용이며 공식 해석은 `route_key=pc001`이다. endpoint는 `aiwk_pc`를 현재 기준으로 한다.

## 전체 목표
AIWK를 Chrome EXT 단독 구조에서 PC 실행환경까지 포함하는 로컬 관제 구조로 확장한다.

최종 목표는 다음을 한 화면에서 보는 것이다.

```text
어느 외부 IP인가
어느 컴퓨터인가
어느 Chrome 프로필인가
어느 탭인가
어느 client_id인가
Node-RED가 살아 있는가
Chrome이 살아 있는가
WSS가 연결됐는가
P2P 파일 송수신이 가능한가
```

## 최종 구성요소
```text
aiwk_mypc_agent.py
= PC 로컬 관제센터

현재 v127 기준에서는 Relay endpoint를 `aiwk_pc`로 사용한다.
기존 문서의 `mypc` 표기는 과거 초안 명칭이며, 실제 라우팅 기준은 다음과 같다.

```text
client_id = PC1
url5 = pc001
endpoint = aiwk_pc
tab_id = vtab_aiwk_pc_pc001
address = aiwk://ROOM@home.IG_CRM.PC1:pc001#aiwk_pc
```

aiwk_myp2p_agent.py
= P2P 파일 송수신 센터

ai_ws8767_hub.py
= WSS 중앙 중계/승인/상태지도

AIWK_EXT4
= Chrome 탭 내부 자동화

AIWK_RELAY
= 연결지도/채팅/디버그 UI

Node-RED
= 플로우 실행/외부 연동
```

## 저장/식별 구조
```text
remote_ip
= https://i.yjm.kr/ip/ 조회값

device_name
= 사용자 표시용 컴퓨터명

device_instance_id
= PC 고유 ID

chrome_profile_instance_id
= Chrome 프로필별 AIWK 고유 ID

tab_id
= 실제 탭 또는 가상 탭

client_id
= 역할명

endpoint
= 기능 끝점
```

## WSS register 예시
```json
{
  "type": "register",
  "room_id": "RE5ay2jRmY",
  "group": "home",
  "project": "IG_CRM",
  "client_id": "PC1",
  "url5": "pc001",
  "endpoint": "aiwk_pc",
  "tab_kind": "pc-agent",
  "tab_id": "vtab_aiwk_pc_pc001",
  "device_name": "사무실PC1",
  "device_instance_id": "dev_office_pc_01_xxxxx",
  "remote_ip": "123.123.123.123"
}
```

## v121 EXT4 로드 테스트
```text
pc_ext4_check
= config의 ext4.extension_dir와 manifest.json 확인

pc_chrome_load_ext4
= Chrome을 --load-extension=EXT4_DIR 방식으로 실행
```

테스트 BAT:
```text
run_ext4_check.bat
run_chrome_load_ext4.bat
```

## 진행률
```text
[10%] v103 문서/폴더/용어 확정
[20%] v104 mypc.py v001 로컬 상태 확인 완료
[35%] v105 WSS register/status
[50%] v107 floating UI
[65%] v107 Node-RED 제어
[75%] v108 Chrome 실행/URL 제어
[85%] v109 탭 맵/닫기/재실행
[92%] v110 Relay 연결지도 통합
[100%] v111 myp2p.py 설계 시작점 확정
```

## v104에서 만든 파일
```text
aiwk/AIWK_PC/aiwk_mypc_agent.py
aiwk/AIWK_PC/aiwk_mypc_config.example.json
aiwk/AIWK_PC/aiwk_mypc_state.example.json
aiwk/AIWK_PC/aiwk_mypc_config.json은 사용자가 example을 복사해서 생성
```

## v104 최소 기능
```text
1. Python 상단 경로/버전 주석
2. 컴퓨터명 읽기
3. device_instance_id 생성/저장
4. https://i.yjm.kr/ip/ 조회
5. Node-RED 1880 포트 체크
6. Chrome 프로세스 체크
7. JSON 상태 출력
8. 로그 20줄 유지
```

## v104에서 아직 하지 않는 것
```text
1. Node-RED 실행/종료/재시작
2. Chrome 강제 실행
3. WSS 명령 수신
4. P2P 파일 전송
5. Phone 연동
```

## myp2p.py 분리 원칙
P2P는 mypc.py에 섞지 않는다.

```text
mypc.py
= 상태/실행/관제

myp2p.py
= 파일 송수신

WSS
= 승인/상대 찾기/전송 요청 전달
```

## 적용 위치
이 계획 문서는 AIWK 루트 내부의 `AIWK_PC/`에 둔다.

```text
aiwk/AIWK_PC/ai_read.md
aiwk/AIWK_PC/aiwk_mypc_plan.md
```

이 위치는 `AIWK_COMMON/domains/` 하위가 아니므로 URL 기준 도메인 폴더 규칙과 충돌하지 않는다.


## v104 완료 기준
```text
1. aiwk_mypc_agent.py 생성
2. aiwk_mypc_config.example.json 생성
3. aiwk_mypc_state.example.json 생성
4. config 누락 시 fail-fast 오류 출력
5. state 없으면 device_instance_id 생성 저장
6. https://i.yjm.kr/ip/ 조회 결과를 상태 JSON에 포함
7. Node-RED 1880 포트 체크 결과를 상태 JSON에 포함
8. Chrome 프로세스 체크 결과를 상태 JSON에 포함
9. 최근 로그 20줄을 state에 유지
```

## v105 예정
```text
1. WSS URL/token 설정 추가
2. PC1/#mypc register packet 생성
3. 5~10초 status loop
4. WSS 끊김/재연결 로그
5. Relay 연결지도에 mypc endpoint 표시
```


## v107 WSS register

- `/opt/venv` 기준 Windows 실행을 유지한다.
- `wss_enabled`가 true이면 `wss_url`로 PC1/#mypc register를 시도한다.
- register 필수값: `client_id`, `group`, `project`, `room_id`, `tab_id`, `profile_instance_id`, `device_instance_id`, `remote_ip`, `endpoint=mypc`, `tab_kind=pc-agent`.
- `token`이 비어 있으면 Hub 정책에 따라 anonymous_limited가 될 수 있다. 실행/제어는 token 설정 이후 단계에서 연다.


## v107 추가 계획 확정
```text
[25%] mypc.py Root Identity Agent 확정
- device_instance_id 고정
- device_secret 생성/보관
- device_auth_hash 출력
- room_id/group/project/client_id fail-fast
- WSS register packet에 root_identity/address/default_room 포함
```

다음 후보:
```text
v108: Node-RED가 mypc 기준 device_instance_id/default_room_id를 따라 vtab_nodered_*로 등록/응답
v109: EXT room_id fail-fast 및 mypc 기준 연결지도 비교
v110: Relay 연결지도에서 IP → device → PC1/N1/Chrome profile/tab 계층 표시
```


## v145-floating-pc-json-safe 변경 기준 (2026-06-14)

- EXT4 floating control의 client_id 표시는 WSS/NR 재시작 상태에 흔들리지 않고 현재 탭 route/profile identity를 우선 표시한다.
- floating control의 `AIWK ... client_id` 라벨은 native button이 아닌 selectable 영역으로 렌더링하여 더블클릭 시 전체 라벨 텍스트가 선택되도록 한다.
- AIWK_PC local_ws 모드는 주기 상태 로그를 기본 출력하지 않는다. 외부 local_ws 요청이 들어올 때만 act/id/from을 표시한다.
- AIWK_PC state JSON 저장은 동일 `.tmp` 파일 공유를 금지하고, process/thread별 임시 파일을 `os.replace()`로 교체한다.
- state JSON 끝에 `}5"` 같은 찌꺼기가 붙어 Extra data 오류가 나면, 첫 JSON object를 백업 후 자동 복구한다.
