# IOP Client

IOP(Inference Operations Platform)의 공식 Client UI 애플리케이션입니다. Flutter를 사용하여 다중 플랫폼(Web, Desktop, Mobile)을 단일 코드베이스로 지원합니다.

## Nexo 알림 통합

이 client는 Nexo messaging plugin(`nexo_messaging`)을 통해 push notification을 구독합니다. Client는 상위 폴더의 `../nexo`가 제공하는 notification 기능만 사용하며, Mattermost-compatible 인증/등록/서버 통합 책임은 Nexo 쪽 경계에서 담당합니다. Client는 `NexoNotificationHostIntegration`을 통해 notification stream을 구독하고 UI에 표시됩니다.

## Console Shell 구성

이 client는 IOP-owned Flutter package인 `packages/flutter/iop_console`을 path dependency로 사용합니다. `iop_console`은 `IopConsoleShell`과 `IopConsoleOverview`를 제공하며, IOP Control Plane 기반 model/provider/device 운영/유지보수 화면을 단독 IOP 앱과 외부 임베딩 소비자에서 같은 위젯 경계로 조립하기 위한 시작점입니다.

IOP client는 Control Plane을 통한 model/provider/device 운영 및 상태 조회 UI만 소유합니다. 외부 orchestration loop, workspace, tool, terminal/PTY 및 원격 제어 UI 책임은 소유하지 않으며 해당 bridge/connection을 연결하지 않습니다. NomadCode 같은 소비자는 `iop_console` 또는 향후 IOP console package를 자신의 shell 안에 선택적으로 mount합니다.

## 개발 및 검증 명령

### 의존성 설치
```bash
flutter pub get
```

### 테스트 실행
```bash
flutter test
```

### Dart Protobuf 생성
이 프로젝트는 Go/Dart 등 다중 언어 환경의 메시지 계약을 공유하기 위해 protobuf를 사용합니다.
Dart proto 코드를 새로 생성하려면 루트 `Makefile`에서 `make proto-dart`를 실행하세요.
Client-Control Plane wire 계약 원문은 repo root의 `agent-contract/inner/client-control-plane-wire.md`를 기준으로 합니다.

필요 조건:
1. `protoc` 설치
2. `protoc_plugin` 글로벌 설치:
   ```bash
   flutter pub global activate protoc_plugin
   ```
   *참고: `protoc-gen-dart`가 시스템 `PATH`에 등록되어 있지 않더라도, `Makefile`이 자동으로 `~/.pub-cache/bin` 및 `/config/.pub-cache/bin` 경로를 검색해 컴파일을 수행하므로 수동 PATH 설정이 필수적이지는 않습니다.*

### Web 빌드
```bash
flutter build web \
  --dart-define=IOP_CONTROL_PLANE_HTTP_URL=http://localhost:18000 \
  --dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/client
```

## 환경 변수 및 설정 정의

본 앱은 빌드 시점에 `--dart-define` 인자를 사용해 설정을 주입받습니다.

| 변수명 | 설명 | 기본값 |
|--------|------|--------|
| `IOP_CONTROL_PLANE_HTTP_URL` | Control Plane HTTP API 주소 | `http://localhost:18000` |
| `IOP_CONTROL_PLANE_WIRE_URL` | Control Plane WebSocket 연결 주소 | `ws://localhost:19080/client` |
