refactor: portal → client 앱 리팩토링 및 제어플랫폼 와이어 클라이언트 명명 변경

- apps/portal 디렉터리를 apps/client로 리팩터링
- ControlPlaneWireClient → WireClient 명명 변경
- 관련_proto import 정렬, struct protobuf 생성 제거
- README, docker-compose, 스크립트 등 일관성 개선
This commit is contained in:
toki 2026-05-28 20:24:45 +09:00
parent 95693f1cec
commit 1fe368ad2c
188 changed files with 4063 additions and 4173 deletions

View file

@ -1,4 +1,4 @@
.PHONY: all build build-local build-edge build-node build-node-target build-node-targets pack-node-target pack-edge archive-edge tidy test test-e2e test-openai-ollama proto proto-dart portal-test portal-build-web clean
.PHONY: all build build-local build-edge build-node build-node-target build-node-targets pack-node-target pack-edge archive-edge tidy test test-e2e test-openai-ollama proto proto-dart client-test client-build-web clean
GOFLAGS ?= -trimpath
BUILD_DIR ?= build
@ -98,25 +98,24 @@ ifeq ($(PROTOC_GEN_DART),)
@echo "Please install it by running: flutter pub global activate protoc_plugin"
@exit 1
endif
mkdir -p apps/portal/lib/gen
mkdir -p apps/client/lib/gen
protoc \
--plugin=protoc-gen-dart=$(PROTOC_GEN_DART) \
--dart_out=apps/portal/lib/gen \
--dart_out=apps/client/lib/gen \
--proto_path=. \
--proto_path=/config/.local/include \
/config/.local/include/google/protobuf/struct.proto \
proto/iop/runtime.proto \
proto/iop/node.proto \
proto/iop/control.proto \
proto/iop/job.proto
portal-test:
cd apps/portal && flutter test
client-test:
cd apps/client && flutter test
portal-build-web:
cd apps/portal && flutter build web \
client-build-web:
cd apps/client && flutter build web \
--dart-define=IOP_CONTROL_PLANE_HTTP_URL=http://localhost:9080 \
--dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/portal
--dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/client
clean:
rm -rf build

View file

@ -4,7 +4,7 @@ IOP(Inference Operations Platform)는 단순한 모델 라우터나 OpenAI API p
IOP는 **Control Plane - Edge - Node** 계층 구조를 기반으로, 여러 로컬 모델 런타임과 CLI Agent 실행 환경을 통합 관리하는 실행 오케스트레이션 플랫폼을 지향한다. 모델 서빙, CLI Agent 실행, shell/git/docker/code workspace 작업, node maintenance 작업을 같은 실행 파이프라인에서 다룰 수 있도록 만드는 것이 핵심 방향이다.
IOP는 NomadCode 전용 Agent Shell이 아니라, NomadCode와 외부 agent, 운영 CLI, Portal, 자동화 도구가 함께 소비할 수 있는 범용 추론/자동화 운영 엔진이다. NomadCode는 IOP의 중요한 소비자 중 하나지만, IOP의 프로토콜과 운영 계층은 특정 제품 UX에 종속되지 않는다.
IOP는 NomadCode 전용 Agent Shell이 아니라, NomadCode와 외부 agent, 운영 CLI, Client, 자동화 도구가 함께 소비할 수 있는 범용 추론/자동화 운영 엔진이다. NomadCode는 IOP의 중요한 소비자 중 하나지만, IOP의 프로토콜과 운영 계층은 특정 제품 UX에 종속되지 않는다.
모델 선택, 로컬/클라우드 라우팅, 모델별 profile, token/속도/품질 최적화, 모델 호출 로그와 품질 평가는 IOP 책임으로 둔다. RAG, context 구성/압축, web search, MCP 정책, tool policy, output validation, retry/fallback은 기본 모델 서빙과 부하 라우팅이 가능해진 뒤 확장하는 최적화 계층으로 본다.
@ -221,22 +221,22 @@ NomadCode
- 현재 실행 이력은 Node local SQLite store에서 검증 중이다. Edge 단위 이력 집계와 로컬 실행 그룹 상태 소유권은 로드맵에 따라 정리한다.
- `mock` adapter와 dummy/TODO 구현은 개발 단계에서 정상적인 구성이다.
- Ollama/vLLM 등 모델 runtime adapter는 단계적으로 확장한다.
- Control Plane은 향후 여러 Edge 관리와 Portal 제공을 위해 추가된다.
- Control Plane은 향후 여러 Edge 관리와 Client 제공을 위해 추가된다.
현재 앱 구성은 다음과 같다.
| 경로 | 현재 의미 |
|---|---|
| `apps/portal` | IOP Portal UI의 기준 구현인 Flutter 애플리케이션. Flutter Web 산출물이 compose `web` 서비스로 배포된다 |
| `apps/client` | IOP Client UI의 기준 구현인 Flutter 애플리케이션. Flutter Web 산출물이 compose `web` 서비스로 배포된다 |
| `apps/node` | Edge에 연결되어 adapter execution을 수행하는 Node agent |
| `apps/edge` | Node/domain agent registry, 설정 전달, bootstrap, routing, stream relay를 담당하는 Edge skeleton |
| `apps/control-plane` | 여러 Edge를 연결하고 Portal과 통신할 Go 기반 운영 제어 서버 스캐폴드 |
| `apps/control-plane` | 여러 Edge를 연결하고 Client과 통신할 Go 기반 운영 제어 서버 스캐폴드 |
| `apps/worker` | 현재 placeholder이며, Worker 구조는 우선 각 Go 서비스 내부 공통 모듈 방향으로 둔다 |
| `packages` | 설정, 인증, 정책, 작업, 관측성, 버전 등 공통 패키지 |
| `proto` | 앱 간 메시지 계약 원본과 생성물 |
| `configs` | 현재 개발용 설정 예시 |
Portal의 장기 UI 기준은 Flutter 앱이며, 필요한 웹 표면은 Flutter Web 산출물로 제공한다. `apps/control-plane`은 Go 기반 운영 제어 서버다. 주요 통신은 edge-node에서 사용 중인 proto-socket을 IOP Wire Protocol 기준으로 Portal-Control Plane, Control Plane-Edge, Edge-Node 방향으로 확장한다. Portal-Control Plane은 앱/브라우저 경계를 고려해 proto-socket WebSocket/WSS를 우선하고, `net/http`는 health/readiness/bootstrap 같은 보조 endpoint 용도로 유지한다.
Client의 장기 UI 기준은 Flutter 앱이며, 필요한 웹 표면은 Flutter Web 산출물로 제공한다. `apps/control-plane`은 Go 기반 운영 제어 서버다. 주요 통신은 edge-node에서 사용 중인 proto-socket을 IOP Wire Protocol 기준으로 Client-Control Plane, Control Plane-Edge, Edge-Node 방향으로 확장한다. Client-Control Plane은 앱/브라우저 경계를 고려해 proto-socket WebSocket/WSS를 우선하고, `net/http`는 health/readiness/bootstrap 같은 보조 endpoint 용도로 유지한다.
## Guide
@ -247,13 +247,13 @@ Portal의 장기 UI 기준은 Flutter 앱이며, 필요한 웹 표면은 Flutter
제품 방향, 단계, 마일스톤, 우선순위의 단일 기준 문서는 `agent-roadmap/ROADMAP.md`다.
일반 작업에서 AI가 읽어야 하는 현재 작업 기준은 `agent-roadmap/current.md`가 가리키는 기본 마일스톤 또는 요청에 맞는 활성 마일스톤 문서다.
로드맵의 큰 축은 Edge-Node 실행 기반, Edge input surface, CLI Automation runtime, remote terminal bridge, agent bootstrap/OTO enrollment, 모델 서빙과 부하 라우팅, RAG/web search/MCP/tool policy/검증 최적화, Control Plane/Portal, policy/history/audit, multi-edge operations로 관리한다.
로드맵의 큰 축은 Edge-Node 실행 기반, Edge input surface, CLI Automation runtime, remote terminal bridge, agent bootstrap/OTO enrollment, 모델 서빙과 부하 라우팅, RAG/web search/MCP/tool policy/검증 최적화, Control Plane/Client, policy/history/audit, multi-edge operations로 관리한다.
## Development Notes
- 기존 구조를 우선하며, 세부 구현은 각 작업의 domain rule과 현재 코드 경계를 먼저 확인한 뒤 진행한다.
- Edge-Node 내부 통신은 TCP/protobuf 기반 소켓 흐름을 우선한다.
- Portal-Control Plane처럼 앱/브라우저 표면이 필요한 경계는 proto-socket WebSocket/WSS를 사용할 수 있다. Edge-Node 기본 transport를 WebSocket으로 전환하거나 gRPC, actor/FSM/plugin framework를 도입하는 것은 현재 단계의 기본 방향이 아니다.
- Client-Control Plane처럼 앱/브라우저 표면이 필요한 경계는 proto-socket WebSocket/WSS를 사용할 수 있다. Edge-Node 기본 transport를 WebSocket으로 전환하거나 gRPC, actor/FSM/plugin framework를 도입하는 것은 현재 단계의 기본 방향이 아니다.
- OpenAI-compatible API 계층은 외부 모델 호출 호환을 위한 표면이며, 내부 실행 모델 전체를 대표하지 않는다.
- OpenAI-compatible API는 현재 chat completions baseline을 가지며, Responses API 호환 표면까지 지원하는 방향으로 확장한다.
- A2A API 계층은 agent 간 작업 위임과 상태 공유를 위한 표면이며, 단순 모델 호출 호환은 OpenAI-compatible API를 사용한다. NomadCode의 A2A 도입 시점은 아직 강제하지 않는다.

View file

@ -20,7 +20,7 @@ Edge는 terminal session broker가 되고, 대상에 도달 가능한 Node가 SS
- 결정 필요: 아래 체크리스트
- [ ] POC에서 우선 지원할 terminal transport를 local shell만으로 둘지, SSH/WinRM/serial 후보 중 일부를 포함할지 결정한다.
- [ ] target allowlist, credential 주입, session audit의 최소 보안 기준을 결정한다.
- [ ] 운영 CLI, Portal, Control Plane 중 어느 입력 표면을 POC에 포함할지 결정한다.
- [ ] 운영 CLI, Client, Control Plane 중 어느 입력 표면을 POC에 포함할지 결정한다.
## 범위
@ -35,7 +35,7 @@ Edge는 terminal session broker가 되고, 대상에 도달 가능한 Node가 SS
### Epic: [bridge-boundary] Remote Terminal Bridge Boundary
- [ ] [agentless-boundary] 원격 터미널 브리지는 완전 agentless 제어가 아니라 target device에 IOP agent를 설치하지 않는 운영 경로로 정의한다.
- [ ] [edge-broker] Control Plane/Portal/운영 CLI는 Edge에 terminal session을 요청하고, Node에 직접 붙지 않는다.
- [ ] [edge-broker] Control Plane/Client/운영 CLI는 Edge에 terminal session을 요청하고, Node에 직접 붙지 않는다.
- [ ] [node-transport] Node terminal transport는 adapter/profile 또는 별도 adapter 경계에서 실행된다.
- [ ] [terminal-events] stdin/stdout/stderr, resize, signal, close lifecycle과 adapter execution stream 경계를 IOP native protocol에서 표현한다. 검증: 허용된 target profile로 Edge remote shell session을 열고 입출력 relay가 되는지 확인한다.
- [ ] [security-boundary] target allowlist, credential, timeout, audit 보안 전제를 milestone 산출물에 포함한다.
@ -61,7 +61,7 @@ Edge는 terminal session broker가 되고, 대상에 도달 가능한 Node가 SS
## 작업 컨텍스트
- 관련 경로: `apps/edge`, `apps/node`, `README.md`, `agent-ops/rules/private/rules.md`
- 표준선(선택): Control Plane/Portal/운영 CLI는 Edge에 terminal session을 요청하고, Edge가 Node terminal transport로 중계한다. OpenAI-compatible/A2A payload에 terminal 제어를 싣지 않는다.
- 표준선(선택): Control Plane/Client/운영 CLI는 Edge에 terminal session을 요청하고, Edge가 Node terminal transport로 중계한다. OpenAI-compatible/A2A payload에 terminal 제어를 싣지 않는다.
- 선행 작업: Edge-Node 실행 스켈레톤, CLI Automation Runtime 안정화
- 후속 작업: 정책, 이력, 감사; Control Plane과 Portal의 terminal session 운영 표면
- 후속 작업: 정책, 이력, 감사; Control Plane과 Client의 terminal session 운영 표면
- 확인 필요: Agent Bootstrap과 OTO 등록과의 대상 구분. 설치 가능한 대상은 bootstrap/enrollment 경로로, 설치가 어렵거나 일회성 유지보수 대상은 remote terminal bridge 경로로 구분한다.

View file

@ -13,9 +13,9 @@
완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다.
완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다.
- [완료] Flutter-first Portal 마이그레이션
- [완료] Flutter-first Client 마이그레이션
- 경로: `agent-roadmap/archive/phase/control-plane-portal-ops/milestones/flutter-first-portal-migration.md`
- 요약: Next.js `apps/web` scaffold를 제거하고 `apps/portal` Flutter 앱, Flutter Web compose 배포 흐름, Portal-Control Plane proto-socket WS hello 기반을 세웠다.
- 요약: Next.js `apps/web` scaffold를 제거하고 `apps/client` Flutter 앱, Flutter Web compose 배포 흐름, Client-Control Plane proto-socket WS hello 기반을 세웠다.
- [완료] Edge-local Dev Config와 바이너리 중심 실행 루프
- 경로: `agent-roadmap/archive/phase/control-plane-portal-ops/milestones/edge-local-dev-config-runtime.md`
@ -26,7 +26,7 @@
- 요약: NomadCode client 표준을 IOP client에 복제하기 위한 모듈명, bootstrap, proto-socket, Mattermost push host integration 기준을 정리한다.
- [계획] Control Plane과 Client
- 경로: `agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-portal.md`
- 경로: `agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-client.md`
- 요약: 여러 Edge를 연결하고 관찰하며 Edge 설정 변경, 명령 전달, 이벤트 수신을 담당하는 중앙 제어면과 Flutter client 운영면을 구축한다.
- [계획] 정책, 이력, 감사

View file

@ -18,7 +18,7 @@ NomadCode의 `Client Integration Standardization` 결과를 IOP Flutter client
- 상태: 잠금
- 결정 필요: 아래 체크리스트
- [ ] NomadCode client 표준화 산출물을 받은 뒤 IOP client에 복제할 파일/구조/설정 범위를 확정한다.
- [ ] 기존 `apps/portal` 경로를 `apps/client`로 전환할지, 호환 경로를 둘지 결정한다.
- [x] 이전 Flutter 앱 경로는 `apps/client`로 전환하고 호환 경로는 두지 않는다.
- [ ] IOP client에서 Mattermost push routing을 내부 화면, 외부 링크, 운영 이벤트 중 어디로 연결할지 결정한다.
## 범위
@ -37,7 +37,7 @@ NomadCode의 `Client Integration Standardization` 결과를 IOP Flutter client
NomadCode client 표준을 IOP client에 맞게 복제한다.
- [ ] [module-name] IOP Flutter host 경로와 모듈명은 `client` 기준 모듈/문서 표준을 따른다.
- [x] [module-name] IOP Flutter host 경로와 모듈명은 `client` 기준 모듈/문서 표준을 따른다.
- [ ] [bootstrap] Web + Android 우선 bootstrap과 platform-specific initialization guard를 반영한다.
- [ ] [folder-layout] `src/app`, `src/integrations`, `src/features` 기준의 client skeleton을 정리한다.
@ -54,7 +54,7 @@ NomadCode client 표준을 IOP client에 맞게 복제한다.
NomadCode 표준과 IOP 차이를 추적 가능하게 남긴다.
- [ ] [clone-checklist] NomadCode에서 가져올 항목과 IOP에서 치환할 항목을 checklist로 남긴다.
- [ ] [naming] IOP 제품 표면에서는 Portal 명칭을 강조하지 않고 client/product surface 기준으로 정리한다.
- [x] [naming] IOP 제품 표면에서는 client/product surface 기준으로 정리한다.
- [ ] [related-locks] 기존 Control Plane client milestone과 충돌하는 범위는 이 milestone의 표준 적용 범위가 확정되기 전까지 잠금 또는 후속 작업으로 정리한다.
## 완료 리뷰
@ -77,8 +77,8 @@ NomadCode 표준과 IOP 차이를 추적 가능하게 남긴다.
## 작업 컨텍스트
- 관련 경로: `apps/portal/`, `apps/control-plane/`, `docs/`, `bin/web.sh`, `../nomadcode/apps/client`, `../mattermost-push-plugin/`
- 표준선(선택): IOP 제품 표면은 client로 부르고, 기존 Portal 명칭은 legacy 경로 또는 wire endpoint 명칭에 남은 경우에만 제한적으로 다룬다.
- 관련 경로: `apps/client/`, `apps/control-plane/`, `docs/`, `scripts/dev/web.sh`, `../nomadcode/apps/client`, `../mattermost-push-plugin/`
- 표준선(선택): IOP 제품 표면은 client로 부르고, 이전 UI 명칭은 roadmap/archive history나 외부 tool API 고정명에만 제한한다.
- 표준선(선택): NomadCode에서 가져올 것은 client skeleton, integration boundary, bootstrap convention, handoff 문서이며 제품 feature는 복제하지 않는다.
- 선행 작업: NomadCode `Client Integration Standardization`
- 후속 작업: Control Plane과 Client, Multi-Edge 운영

View file

@ -40,14 +40,14 @@ Client는 NomadCode 전용 화면이 아니라 IOP가 독립적으로 운영되
- [ ] [edge-mediated] Control Plane은 Node를 직접 연결하거나 직접 스케줄링하지 않는다.
- [ ] [edge-status] Control Plane은 하나 이상의 Edge 연결 상태를 조회할 수 있다. 검증: Edge 연결 상태 조회 경로가 동작하는지 확인한다.
- [ ] [edge-command-events] Edge 명령 전달과 이벤트 수신 흐름이 IOP Wire Protocol 기준으로 문서화된다.
- [ ] [portal-via-cp] Client는 Control Plane을 통해 Edge 운영 상태를 조회한다.
- [ ] [client-via-cp] Client는 Control Plane을 통해 Edge 운영 상태를 조회한다.
### Epic: [portal-wire-surface] Client Wire Surface
### Epic: [client-wire-surface] Client Wire Surface
- [x] [portal-boundary] Flutter client는 IOP 자체 운영 UI/UX이며 NomadCode에 맞춘 전용 shell로 만들지 않는다.
- [x] [client-boundary] Flutter client는 IOP 자체 운영 UI/UX이며 NomadCode에 맞춘 전용 shell로 만들지 않는다.
- [ ] [client-status] Client는 Edge/Node/agent 상태를 사용자에게 보여줄 수 있다. 검증: Client 상태 화면 또는 상태 표시 경로를 확인한다.
- [x] [server-bridge] 브라우저 직접 TCP가 어려운 구간은 Control Plane server-side bridge를 둔다.
- [x] [portal-wire-hello] Client-Control Plane proto-socket WebSocket hello handshake scaffold가 구현되고 테스트되어 있다. 검증: Control Plane과 client 테스트에서 hello handshake가 통과한다.
- [x] [client-wire-hello] Client-Control Plane proto-socket WebSocket hello handshake scaffold가 구현되고 테스트되어 있다. 검증: Control Plane과 client 테스트에서 hello handshake가 통과한다.
- [x] [http-boundary] `net/http`는 health/readiness/bootstrap 같은 보조 endpoint 용도로 유지한다.
- [x] [deploy-docs] Control Plane과 Flutter client의 배포/검증 절차가 `README.md`의 운영 경계와 private local testing rule의 환경 기준에 맞게 정리되어 있다.
@ -71,9 +71,9 @@ Client는 NomadCode 전용 화면이 아니라 IOP가 독립적으로 운영되
## 작업 컨텍스트
- 관련 경로: `apps/control-plane`, `apps/portal`, `apps/control-plane/README.md`, `apps/portal/README.md`, `agent-ops/rules/private/rules.md`, `docker-compose.yml`, `bin/web.sh`
- 관련 경로: `apps/control-plane`, `apps/client`, `apps/control-plane/README.md`, `apps/client/README.md`, `agent-ops/rules/private/rules.md`, `docker-compose.yml`, `scripts/dev/web.sh`
- 표준선(선택): Control Plane은 Node를 직접 스케줄링하지 않고 Edge를 통해 관찰/제어한다.
- 표준선(선택): Client-Control Plane의 첫 wire surface는 기존 `/portal` WebSocket hello handshake를 유지할 수 있으며, Edge 운영 조회와 명령 전달은 후속 IOP Wire Protocol 확장에서 붙인다.
- 선행 작업: Flutter-first Portal 마이그레이션, Client Integration Clone Adoption, Agent Bootstrap과 OTO 등록, 정책/이력/감사 일부 기준
- 표준선(선택): Client-Control Plane의 첫 wire surface는 `/client` WebSocket hello handshake를 기준으로 둔다.
- 선행 작업: Flutter-first Client 마이그레이션, Client Integration Clone Adoption, Agent Bootstrap과 OTO 등록, 정책/이력/감사 일부 기준
- 후속 작업: Multi-Edge 운영
- 확인 필요: Client 첫 화면 범위, Control Plane-Edge wire 우선순위, NomadCode 전용 UX 제외 기준, client 표준 clone 반영 범위

View file

@ -60,7 +60,7 @@ Multi-edge scheduling과 fleet-wide state ownership은 Control Plane과 IOP nati
## 작업 컨텍스트
- 관련 경로: `apps/control-plane`, `apps/portal`, `apps/edge`, `README.md`
- 관련 경로: `apps/control-plane`, `apps/client`, `apps/edge`, `README.md`
- 표준선(선택): Edge는 로컬 런타임 상태와 registry 소유권을 유지하고, Control Plane은 관찰/집계 계층으로 시작한다.
- 선행 작업: Control Plane과 Client, 정책/이력/감사
- 후속 작업: 없음

View file

@ -3,20 +3,20 @@
FROM ghcr.io/cirruslabs/flutter:stable AS builder
ARG IOP_CONTROL_PLANE_HTTP_URL=http://localhost:9080
ARG IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/portal
ARG IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/client
WORKDIR /workspace/iop/apps/portal
WORKDIR /workspace/iop/apps/client
# docker-compose builds this Dockerfile with /config/workspace as context so the
# sibling proto-socket/dart path dependency declared in pubspec.yaml resolves to
# /workspace/proto-socket/dart inside the image. Copy its manifest first so pub
# get can cache, then copy full source before the build step.
COPY proto-socket/dart/pubspec.yaml proto-socket/dart/pubspec.lock /workspace/proto-socket/dart/
COPY iop/apps/portal/pubspec.yaml iop/apps/portal/pubspec.lock ./
COPY iop/apps/client/pubspec.yaml iop/apps/client/pubspec.lock ./
RUN flutter pub get
COPY proto-socket/dart/ /workspace/proto-socket/dart/
COPY iop/apps/portal/ ./
COPY iop/apps/client/ ./
RUN flutter build web \
--release \
--dart-define=IOP_CONTROL_PLANE_HTTP_URL=$IOP_CONTROL_PLANE_HTTP_URL \
@ -24,8 +24,8 @@ RUN flutter build web \
FROM nginx:1.27-alpine AS runner
COPY --from=builder /workspace/iop/apps/portal/build/web /usr/share/nginx/html
COPY iop/apps/portal/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /workspace/iop/apps/client/build/web /usr/share/nginx/html
COPY iop/apps/client/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 3000

View file

@ -1,6 +1,6 @@
# IOP Portal
# IOP Client
IOP(Inference Operations Platform)의 공식 Portal UI 애플리케이션입니다. Flutter를 사용하여 다중 플랫폼(Web, Desktop, Mobile)을 단일 코드베이스로 지원합니다.
IOP(Inference Operations Platform)의 공식 Client UI 애플리케이션입니다. Flutter를 사용하여 다중 플랫폼(Web, Desktop, Mobile)을 단일 코드베이스로 지원합니다.
## 개발 및 검증 명령
@ -30,7 +30,7 @@ Dart proto 코드를 새로 생성하려면 루트 `Makefile`에서 `make proto-
```bash
flutter build web \
--dart-define=IOP_CONTROL_PLANE_HTTP_URL=http://localhost:9080 \
--dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/portal
--dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/client
```
## 환경 변수 및 설정 정의
@ -40,4 +40,4 @@ flutter build web \
| 변수명 | 설명 | 기본값 |
|--------|------|--------|
| `IOP_CONTROL_PLANE_HTTP_URL` | Control Plane HTTP API 주소 | `http://localhost:9080` |
| `IOP_CONTROL_PLANE_WIRE_URL` | Control Plane WebSocket 연결 주소 | `ws://localhost:19080/portal` |
| `IOP_CONTROL_PLANE_WIRE_URL` | Control Plane WebSocket 연결 주소 | `ws://localhost:19080/client` |

View file

@ -6,7 +6,7 @@ plugins {
}
android {
namespace = "com.example.iop_portal"
namespace = "com.example.iop_client"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
@ -21,7 +21,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.iop_portal"
applicationId = "com.example.iop_client"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion

View file

@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="iop_portal"
android:label="iop_client"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity

View file

@ -1,4 +1,4 @@
package com.example.iop_portal
package com.example.iop_client
import io.flutter.embedding.android.FlutterActivity

View file

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 544 B

View file

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 442 B

View file

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 721 B

View file

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -372,7 +372,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@ -388,7 +388,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -405,7 +405,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -420,7 +420,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -551,7 +551,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -573,7 +573,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopPortal;
PRODUCT_BUNDLE_IDENTIFIER = com.example.iopClient;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;

View file

@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Iop Portal</string>
<string>Iop Client</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -15,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>iop_portal</string>
<string>iop_client</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>

View file

@ -1,4 +1,4 @@
class PortalConfig {
class ClientConfig {
static const String controlPlaneHttpUrl = String.fromEnvironment(
'IOP_CONTROL_PLANE_HTTP_URL',
defaultValue: 'http://localhost:9080',
@ -6,6 +6,6 @@ class PortalConfig {
static const String controlPlaneWireUrl = String.fromEnvironment(
'IOP_CONTROL_PLANE_WIRE_URL',
defaultValue: 'ws://localhost:19080/portal',
defaultValue: 'ws://localhost:19080/client',
);
}

View file

@ -0,0 +1,421 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/control.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
/// PolicyRule is a placeholder for future edge-level routing/resource constraints.
class PolicyRule extends $pb.GeneratedMessage {
factory PolicyRule({
$core.String? name,
$core.String? expression,
$core.Iterable<$core.MapEntry<$core.String, $core.String>>? params,
}) {
final result = create();
if (name != null) result.name = name;
if (expression != null) result.expression = expression;
if (params != null) result.params.addEntries(params);
return result;
}
PolicyRule._();
factory PolicyRule.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory PolicyRule.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'PolicyRule',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..aOS(2, _omitFieldNames ? '' : 'expression')
..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'params',
entryClassName: 'PolicyRule.ParamsEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OS,
packageName: const $pb.PackageName('iop'))
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
PolicyRule clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
PolicyRule copyWith(void Function(PolicyRule) updates) =>
super.copyWith((message) => updates(message as PolicyRule)) as PolicyRule;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static PolicyRule create() => PolicyRule._();
@$core.override
PolicyRule createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static PolicyRule getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<PolicyRule>(create);
static PolicyRule? _defaultInstance;
@$pb.TagNumber(1)
$core.String get name => $_getSZ(0);
@$pb.TagNumber(1)
set name($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasName() => $_has(0);
@$pb.TagNumber(1)
void clearName() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get expression => $_getSZ(1);
@$pb.TagNumber(2)
set expression($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasExpression() => $_has(1);
@$pb.TagNumber(2)
void clearExpression() => $_clearField(2);
@$pb.TagNumber(3)
$pb.PbMap<$core.String, $core.String> get params => $_getMap(2);
}
/// ScheduleRequest is a legacy placeholder for future Control Plane orchestration.
/// It must not be treated as an active contract for direct Node scheduling.
class ScheduleRequest extends $pb.GeneratedMessage {
factory ScheduleRequest({
$core.String? jobId,
$core.String? target,
$core.Iterable<PolicyRule>? policies,
$core.Iterable<$core.MapEntry<$core.String, $core.String>>? metadata,
}) {
final result = create();
if (jobId != null) result.jobId = jobId;
if (target != null) result.target = target;
if (policies != null) result.policies.addAll(policies);
if (metadata != null) result.metadata.addEntries(metadata);
return result;
}
ScheduleRequest._();
factory ScheduleRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ScheduleRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ScheduleRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'jobId')
..aOS(2, _omitFieldNames ? '' : 'target')
..pPM<PolicyRule>(3, _omitFieldNames ? '' : 'policies',
subBuilder: PolicyRule.create)
..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'metadata',
entryClassName: 'ScheduleRequest.MetadataEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OS,
packageName: const $pb.PackageName('iop'))
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ScheduleRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ScheduleRequest copyWith(void Function(ScheduleRequest) updates) =>
super.copyWith((message) => updates(message as ScheduleRequest))
as ScheduleRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ScheduleRequest create() => ScheduleRequest._();
@$core.override
ScheduleRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ScheduleRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ScheduleRequest>(create);
static ScheduleRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get jobId => $_getSZ(0);
@$pb.TagNumber(1)
set jobId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasJobId() => $_has(0);
@$pb.TagNumber(1)
void clearJobId() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get target => $_getSZ(1);
@$pb.TagNumber(2)
set target($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasTarget() => $_has(1);
@$pb.TagNumber(2)
void clearTarget() => $_clearField(2);
@$pb.TagNumber(3)
$pb.PbList<PolicyRule> get policies => $_getList(2);
@$pb.TagNumber(4)
$pb.PbMap<$core.String, $core.String> get metadata => $_getMap(3);
}
/// ScheduleResponse is a legacy placeholder. Future scheduling should be
/// reworked around Edge-owned runtime state instead of bypassing Edge.
class ScheduleResponse extends $pb.GeneratedMessage {
factory ScheduleResponse({
$core.String? nodeId,
$core.String? address,
$core.String? token,
}) {
final result = create();
if (nodeId != null) result.nodeId = nodeId;
if (address != null) result.address = address;
if (token != null) result.token = token;
return result;
}
ScheduleResponse._();
factory ScheduleResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ScheduleResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ScheduleResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'nodeId')
..aOS(2, _omitFieldNames ? '' : 'address')
..aOS(3, _omitFieldNames ? '' : 'token')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ScheduleResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ScheduleResponse copyWith(void Function(ScheduleResponse) updates) =>
super.copyWith((message) => updates(message as ScheduleResponse))
as ScheduleResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ScheduleResponse create() => ScheduleResponse._();
@$core.override
ScheduleResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ScheduleResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ScheduleResponse>(create);
static ScheduleResponse? _defaultInstance;
@$pb.TagNumber(1)
$core.String get nodeId => $_getSZ(0);
@$pb.TagNumber(1)
set nodeId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasNodeId() => $_has(0);
@$pb.TagNumber(1)
void clearNodeId() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get address => $_getSZ(1);
@$pb.TagNumber(2)
set address($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasAddress() => $_has(1);
@$pb.TagNumber(2)
void clearAddress() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get token => $_getSZ(2);
@$pb.TagNumber(3)
set token($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasToken() => $_has(2);
@$pb.TagNumber(3)
void clearToken() => $_clearField(3);
}
class ClientHelloRequest extends $pb.GeneratedMessage {
factory ClientHelloRequest({
$core.String? clientId,
$core.String? clientVersion,
}) {
final result = create();
if (clientId != null) result.clientId = clientId;
if (clientVersion != null) result.clientVersion = clientVersion;
return result;
}
ClientHelloRequest._();
factory ClientHelloRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ClientHelloRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ClientHelloRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'clientId')
..aOS(2, _omitFieldNames ? '' : 'clientVersion')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ClientHelloRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ClientHelloRequest copyWith(void Function(ClientHelloRequest) updates) =>
super.copyWith((message) => updates(message as ClientHelloRequest))
as ClientHelloRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ClientHelloRequest create() => ClientHelloRequest._();
@$core.override
ClientHelloRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ClientHelloRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ClientHelloRequest>(create);
static ClientHelloRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get clientId => $_getSZ(0);
@$pb.TagNumber(1)
set clientId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasClientId() => $_has(0);
@$pb.TagNumber(1)
void clearClientId() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get clientVersion => $_getSZ(1);
@$pb.TagNumber(2)
set clientVersion($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasClientVersion() => $_has(1);
@$pb.TagNumber(2)
void clearClientVersion() => $_clearField(2);
}
class ClientHelloResponse extends $pb.GeneratedMessage {
factory ClientHelloResponse({
$core.bool? ready,
$core.String? protocol,
$fixnum.Int64? serverTimeUnixNano,
$core.String? message,
}) {
final result = create();
if (ready != null) result.ready = ready;
if (protocol != null) result.protocol = protocol;
if (serverTimeUnixNano != null)
result.serverTimeUnixNano = serverTimeUnixNano;
if (message != null) result.message = message;
return result;
}
ClientHelloResponse._();
factory ClientHelloResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ClientHelloResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ClientHelloResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'ready')
..aOS(2, _omitFieldNames ? '' : 'protocol')
..aInt64(3, _omitFieldNames ? '' : 'serverTimeUnixNano')
..aOS(4, _omitFieldNames ? '' : 'message')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ClientHelloResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ClientHelloResponse copyWith(void Function(ClientHelloResponse) updates) =>
super.copyWith((message) => updates(message as ClientHelloResponse))
as ClientHelloResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ClientHelloResponse create() => ClientHelloResponse._();
@$core.override
ClientHelloResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ClientHelloResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ClientHelloResponse>(create);
static ClientHelloResponse? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get ready => $_getBF(0);
@$pb.TagNumber(1)
set ready($core.bool value) => $_setBool(0, value);
@$pb.TagNumber(1)
$core.bool hasReady() => $_has(0);
@$pb.TagNumber(1)
void clearReady() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get protocol => $_getSZ(1);
@$pb.TagNumber(2)
set protocol($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasProtocol() => $_has(1);
@$pb.TagNumber(2)
void clearProtocol() => $_clearField(2);
@$pb.TagNumber(3)
$fixnum.Int64 get serverTimeUnixNano => $_getI64(2);
@$pb.TagNumber(3)
set serverTimeUnixNano($fixnum.Int64 value) => $_setInt64(2, value);
@$pb.TagNumber(3)
$core.bool hasServerTimeUnixNano() => $_has(2);
@$pb.TagNumber(3)
void clearServerTimeUnixNano() => $_clearField(3);
@$pb.TagNumber(4)
$core.String get message => $_getSZ(3);
@$pb.TagNumber(4)
set message($core.String value) => $_setString(3, value);
@$pb.TagNumber(4)
$core.bool hasMessage() => $_has(3);
@$pb.TagNumber(4)
void clearMessage() => $_clearField(4);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,11 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/control.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports

View file

@ -1,13 +1,15 @@
// This is a generated file - do not edit.
//
// Generated code. Do not modify.
// source: proto/iop/control.proto
//
// @dart = 2.12
// Generated from proto/iop/control.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
@ -19,7 +21,14 @@ const PolicyRule$json = {
'2': [
{'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
{'1': 'expression', '3': 2, '4': 1, '5': 9, '10': 'expression'},
{'1': 'params', '3': 3, '4': 3, '5': 11, '6': '.iop.PolicyRule.ParamsEntry', '10': 'params'},
{
'1': 'params',
'3': 3,
'4': 3,
'5': 11,
'6': '.iop.PolicyRule.ParamsEntry',
'10': 'params'
},
],
'3': [PolicyRule_ParamsEntry$json],
};
@ -47,8 +56,22 @@ const ScheduleRequest$json = {
'2': [
{'1': 'job_id', '3': 1, '4': 1, '5': 9, '10': 'jobId'},
{'1': 'target', '3': 2, '4': 1, '5': 9, '10': 'target'},
{'1': 'policies', '3': 3, '4': 3, '5': 11, '6': '.iop.PolicyRule', '10': 'policies'},
{'1': 'metadata', '3': 4, '4': 3, '5': 11, '6': '.iop.ScheduleRequest.MetadataEntry', '10': 'metadata'},
{
'1': 'policies',
'3': 3,
'4': 3,
'5': 11,
'6': '.iop.PolicyRule',
'10': 'policies'
},
{
'1': 'metadata',
'3': 4,
'4': 3,
'5': 11,
'6': '.iop.ScheduleRequest.MetadataEntry',
'10': 'metadata'
},
],
'3': [ScheduleRequest_MetadataEntry$json],
};
@ -86,34 +109,39 @@ final $typed_data.Uint8List scheduleResponseDescriptor = $convert.base64Decode(
'ChBTY2hlZHVsZVJlc3BvbnNlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBIYCgdhZGRyZXNzGA'
'IgASgJUgdhZGRyZXNzEhQKBXRva2VuGAMgASgJUgV0b2tlbg==');
@$core.Deprecated('Use portalHelloRequestDescriptor instead')
const PortalHelloRequest$json = {
'1': 'PortalHelloRequest',
@$core.Deprecated('Use clientHelloRequestDescriptor instead')
const ClientHelloRequest$json = {
'1': 'ClientHelloRequest',
'2': [
{'1': 'client_id', '3': 1, '4': 1, '5': 9, '10': 'clientId'},
{'1': 'client_version', '3': 2, '4': 1, '5': 9, '10': 'clientVersion'},
],
};
/// Descriptor for `PortalHelloRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List portalHelloRequestDescriptor = $convert.base64Decode(
'ChJQb3J0YWxIZWxsb1JlcXVlc3QSGwoJY2xpZW50X2lkGAEgASgJUghjbGllbnRJZBIlCg5jbG'
/// Descriptor for `ClientHelloRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List clientHelloRequestDescriptor = $convert.base64Decode(
'ChJDbGllbnRIZWxsb1JlcXVlc3QSGwoJY2xpZW50X2lkGAEgASgJUghjbGllbnRJZBIlCg5jbG'
'llbnRfdmVyc2lvbhgCIAEoCVINY2xpZW50VmVyc2lvbg==');
@$core.Deprecated('Use portalHelloResponseDescriptor instead')
const PortalHelloResponse$json = {
'1': 'PortalHelloResponse',
@$core.Deprecated('Use clientHelloResponseDescriptor instead')
const ClientHelloResponse$json = {
'1': 'ClientHelloResponse',
'2': [
{'1': 'ready', '3': 1, '4': 1, '5': 8, '10': 'ready'},
{'1': 'protocol', '3': 2, '4': 1, '5': 9, '10': 'protocol'},
{'1': 'server_time_unix_nano', '3': 3, '4': 1, '5': 3, '10': 'serverTimeUnixNano'},
{
'1': 'server_time_unix_nano',
'3': 3,
'4': 1,
'5': 3,
'10': 'serverTimeUnixNano'
},
{'1': 'message', '3': 4, '4': 1, '5': 9, '10': 'message'},
],
};
/// Descriptor for `PortalHelloResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List portalHelloResponseDescriptor = $convert.base64Decode(
'ChNQb3J0YWxIZWxsb1Jlc3BvbnNlEhQKBXJlYWR5GAEgASgIUgVyZWFkeRIaCghwcm90b2NvbB'
/// Descriptor for `ClientHelloResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List clientHelloResponseDescriptor = $convert.base64Decode(
'ChNDbGllbnRIZWxsb1Jlc3BvbnNlEhQKBXJlYWR5GAEgASgIUgVyZWFkeRIaCghwcm90b2NvbB'
'gCIAEoCVIIcHJvdG9jb2wSMQoVc2VydmVyX3RpbWVfdW5peF9uYW5vGAMgASgDUhJzZXJ2ZXJU'
'aW1lVW5peE5hbm8SGAoHbWVzc2FnZRgEIAEoCVIHbWVzc2FnZQ==');

View file

@ -11,4 +11,3 @@
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'control.pb.dart';

View file

@ -0,0 +1,338 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/job.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb;
import 'job.pbenum.dart';
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'job.pbenum.dart';
class Job extends $pb.GeneratedMessage {
factory Job({
$core.String? jobId,
$core.String? runId,
$core.String? nodeId,
$core.String? adapter,
$core.String? target,
JobStatus? status,
$fixnum.Int64? createdAt,
$fixnum.Int64? startedAt,
$fixnum.Int64? finishedAt,
$core.String? error,
$core.Iterable<$core.MapEntry<$core.String, $core.String>>? metadata,
}) {
final result = create();
if (jobId != null) result.jobId = jobId;
if (runId != null) result.runId = runId;
if (nodeId != null) result.nodeId = nodeId;
if (adapter != null) result.adapter = adapter;
if (target != null) result.target = target;
if (status != null) result.status = status;
if (createdAt != null) result.createdAt = createdAt;
if (startedAt != null) result.startedAt = startedAt;
if (finishedAt != null) result.finishedAt = finishedAt;
if (error != null) result.error = error;
if (metadata != null) result.metadata.addEntries(metadata);
return result;
}
Job._();
factory Job.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Job.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Job',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'jobId')
..aOS(2, _omitFieldNames ? '' : 'runId')
..aOS(3, _omitFieldNames ? '' : 'nodeId')
..aOS(4, _omitFieldNames ? '' : 'adapter')
..aOS(5, _omitFieldNames ? '' : 'target')
..aE<JobStatus>(6, _omitFieldNames ? '' : 'status',
enumValues: JobStatus.values)
..aInt64(7, _omitFieldNames ? '' : 'createdAt')
..aInt64(8, _omitFieldNames ? '' : 'startedAt')
..aInt64(9, _omitFieldNames ? '' : 'finishedAt')
..aOS(10, _omitFieldNames ? '' : 'error')
..m<$core.String, $core.String>(11, _omitFieldNames ? '' : 'metadata',
entryClassName: 'Job.MetadataEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OS,
packageName: const $pb.PackageName('iop'))
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Job clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Job copyWith(void Function(Job) updates) =>
super.copyWith((message) => updates(message as Job)) as Job;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Job create() => Job._();
@$core.override
Job createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Job getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Job>(create);
static Job? _defaultInstance;
@$pb.TagNumber(1)
$core.String get jobId => $_getSZ(0);
@$pb.TagNumber(1)
set jobId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasJobId() => $_has(0);
@$pb.TagNumber(1)
void clearJobId() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get runId => $_getSZ(1);
@$pb.TagNumber(2)
set runId($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasRunId() => $_has(1);
@$pb.TagNumber(2)
void clearRunId() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get nodeId => $_getSZ(2);
@$pb.TagNumber(3)
set nodeId($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasNodeId() => $_has(2);
@$pb.TagNumber(3)
void clearNodeId() => $_clearField(3);
@$pb.TagNumber(4)
$core.String get adapter => $_getSZ(3);
@$pb.TagNumber(4)
set adapter($core.String value) => $_setString(3, value);
@$pb.TagNumber(4)
$core.bool hasAdapter() => $_has(3);
@$pb.TagNumber(4)
void clearAdapter() => $_clearField(4);
@$pb.TagNumber(5)
$core.String get target => $_getSZ(4);
@$pb.TagNumber(5)
set target($core.String value) => $_setString(4, value);
@$pb.TagNumber(5)
$core.bool hasTarget() => $_has(4);
@$pb.TagNumber(5)
void clearTarget() => $_clearField(5);
@$pb.TagNumber(6)
JobStatus get status => $_getN(5);
@$pb.TagNumber(6)
set status(JobStatus value) => $_setField(6, value);
@$pb.TagNumber(6)
$core.bool hasStatus() => $_has(5);
@$pb.TagNumber(6)
void clearStatus() => $_clearField(6);
@$pb.TagNumber(7)
$fixnum.Int64 get createdAt => $_getI64(6);
@$pb.TagNumber(7)
set createdAt($fixnum.Int64 value) => $_setInt64(6, value);
@$pb.TagNumber(7)
$core.bool hasCreatedAt() => $_has(6);
@$pb.TagNumber(7)
void clearCreatedAt() => $_clearField(7);
@$pb.TagNumber(8)
$fixnum.Int64 get startedAt => $_getI64(7);
@$pb.TagNumber(8)
set startedAt($fixnum.Int64 value) => $_setInt64(7, value);
@$pb.TagNumber(8)
$core.bool hasStartedAt() => $_has(7);
@$pb.TagNumber(8)
void clearStartedAt() => $_clearField(8);
@$pb.TagNumber(9)
$fixnum.Int64 get finishedAt => $_getI64(8);
@$pb.TagNumber(9)
set finishedAt($fixnum.Int64 value) => $_setInt64(8, value);
@$pb.TagNumber(9)
$core.bool hasFinishedAt() => $_has(8);
@$pb.TagNumber(9)
void clearFinishedAt() => $_clearField(9);
@$pb.TagNumber(10)
$core.String get error => $_getSZ(9);
@$pb.TagNumber(10)
set error($core.String value) => $_setString(9, value);
@$pb.TagNumber(10)
$core.bool hasError() => $_has(9);
@$pb.TagNumber(10)
void clearError() => $_clearField(10);
@$pb.TagNumber(11)
$pb.PbMap<$core.String, $core.String> get metadata => $_getMap(10);
}
class JobListRequest extends $pb.GeneratedMessage {
factory JobListRequest({
JobStatus? statusFilter,
$core.int? limit,
$core.String? cursor,
}) {
final result = create();
if (statusFilter != null) result.statusFilter = statusFilter;
if (limit != null) result.limit = limit;
if (cursor != null) result.cursor = cursor;
return result;
}
JobListRequest._();
factory JobListRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory JobListRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'JobListRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aE<JobStatus>(1, _omitFieldNames ? '' : 'statusFilter',
enumValues: JobStatus.values)
..aI(2, _omitFieldNames ? '' : 'limit')
..aOS(3, _omitFieldNames ? '' : 'cursor')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
JobListRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
JobListRequest copyWith(void Function(JobListRequest) updates) =>
super.copyWith((message) => updates(message as JobListRequest))
as JobListRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static JobListRequest create() => JobListRequest._();
@$core.override
JobListRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static JobListRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<JobListRequest>(create);
static JobListRequest? _defaultInstance;
@$pb.TagNumber(1)
JobStatus get statusFilter => $_getN(0);
@$pb.TagNumber(1)
set statusFilter(JobStatus value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasStatusFilter() => $_has(0);
@$pb.TagNumber(1)
void clearStatusFilter() => $_clearField(1);
@$pb.TagNumber(2)
$core.int get limit => $_getIZ(1);
@$pb.TagNumber(2)
set limit($core.int value) => $_setSignedInt32(1, value);
@$pb.TagNumber(2)
$core.bool hasLimit() => $_has(1);
@$pb.TagNumber(2)
void clearLimit() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get cursor => $_getSZ(2);
@$pb.TagNumber(3)
set cursor($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasCursor() => $_has(2);
@$pb.TagNumber(3)
void clearCursor() => $_clearField(3);
}
class JobListResponse extends $pb.GeneratedMessage {
factory JobListResponse({
$core.Iterable<Job>? jobs,
$core.String? next,
}) {
final result = create();
if (jobs != null) result.jobs.addAll(jobs);
if (next != null) result.next = next;
return result;
}
JobListResponse._();
factory JobListResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory JobListResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'JobListResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..pPM<Job>(1, _omitFieldNames ? '' : 'jobs', subBuilder: Job.create)
..aOS(2, _omitFieldNames ? '' : 'next')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
JobListResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
JobListResponse copyWith(void Function(JobListResponse) updates) =>
super.copyWith((message) => updates(message as JobListResponse))
as JobListResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static JobListResponse create() => JobListResponse._();
@$core.override
JobListResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static JobListResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<JobListResponse>(create);
static JobListResponse? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<Job> get jobs => $_getList(0);
@$pb.TagNumber(2)
$core.String get next => $_getSZ(1);
@$pb.TagNumber(2)
set next($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasNext() => $_has(1);
@$pb.TagNumber(2)
void clearNext() => $_clearField(2);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,49 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/job.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class JobStatus extends $pb.ProtobufEnum {
static const JobStatus JOB_STATUS_UNSPECIFIED =
JobStatus._(0, _omitEnumNames ? '' : 'JOB_STATUS_UNSPECIFIED');
static const JobStatus JOB_STATUS_PENDING =
JobStatus._(1, _omitEnumNames ? '' : 'JOB_STATUS_PENDING');
static const JobStatus JOB_STATUS_RUNNING =
JobStatus._(2, _omitEnumNames ? '' : 'JOB_STATUS_RUNNING');
static const JobStatus JOB_STATUS_COMPLETED =
JobStatus._(3, _omitEnumNames ? '' : 'JOB_STATUS_COMPLETED');
static const JobStatus JOB_STATUS_FAILED =
JobStatus._(4, _omitEnumNames ? '' : 'JOB_STATUS_FAILED');
static const JobStatus JOB_STATUS_CANCELLED =
JobStatus._(5, _omitEnumNames ? '' : 'JOB_STATUS_CANCELLED');
static const $core.List<JobStatus> values = <JobStatus>[
JOB_STATUS_UNSPECIFIED,
JOB_STATUS_PENDING,
JOB_STATUS_RUNNING,
JOB_STATUS_COMPLETED,
JOB_STATUS_FAILED,
JOB_STATUS_CANCELLED,
];
static final $core.List<JobStatus?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 5);
static JobStatus? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const JobStatus._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -1,13 +1,15 @@
// This is a generated file - do not edit.
//
// Generated code. Do not modify.
// source: proto/iop/job.proto
//
// @dart = 2.12
// Generated from proto/iop/job.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
@ -41,12 +43,26 @@ const Job$json = {
{'1': 'node_id', '3': 3, '4': 1, '5': 9, '10': 'nodeId'},
{'1': 'adapter', '3': 4, '4': 1, '5': 9, '10': 'adapter'},
{'1': 'target', '3': 5, '4': 1, '5': 9, '10': 'target'},
{'1': 'status', '3': 6, '4': 1, '5': 14, '6': '.iop.JobStatus', '10': 'status'},
{
'1': 'status',
'3': 6,
'4': 1,
'5': 14,
'6': '.iop.JobStatus',
'10': 'status'
},
{'1': 'created_at', '3': 7, '4': 1, '5': 3, '10': 'createdAt'},
{'1': 'started_at', '3': 8, '4': 1, '5': 3, '10': 'startedAt'},
{'1': 'finished_at', '3': 9, '4': 1, '5': 3, '10': 'finishedAt'},
{'1': 'error', '3': 10, '4': 1, '5': 9, '10': 'error'},
{'1': 'metadata', '3': 11, '4': 3, '5': 11, '6': '.iop.Job.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 11,
'4': 3,
'5': 11,
'6': '.iop.Job.MetadataEntry',
'10': 'metadata'
},
],
'3': [Job_MetadataEntry$json],
};
@ -76,7 +92,14 @@ final $typed_data.Uint8List jobDescriptor = $convert.base64Decode(
const JobListRequest$json = {
'1': 'JobListRequest',
'2': [
{'1': 'status_filter', '3': 1, '4': 1, '5': 14, '6': '.iop.JobStatus', '10': 'statusFilter'},
{
'1': 'status_filter',
'3': 1,
'4': 1,
'5': 14,
'6': '.iop.JobStatus',
'10': 'statusFilter'
},
{'1': 'limit', '3': 2, '4': 1, '5': 5, '10': 'limit'},
{'1': 'cursor', '3': 3, '4': 1, '5': 9, '10': 'cursor'},
],
@ -101,4 +124,3 @@ const JobListResponse$json = {
final $typed_data.Uint8List jobListResponseDescriptor = $convert.base64Decode(
'Cg9Kb2JMaXN0UmVzcG9uc2USHAoEam9icxgBIAMoCzIILmlvcC5Kb2JSBGpvYnMSEgoEbmV4dB'
'gCIAEoCVIEbmV4dA==');

View file

@ -11,4 +11,3 @@
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'job.pb.dart';

View file

@ -0,0 +1,280 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/node.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
import 'node.pbenum.dart';
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'node.pbenum.dart';
/// NodeInfo is a legacy placeholder for node snapshots.
/// Current Edge-Node registration uses RegisterRequest/RegisterResponse in
/// runtime.proto, and Control Plane should observe nodes through Edge.
class NodeInfo extends $pb.GeneratedMessage {
factory NodeInfo({
$core.String? nodeId,
$core.String? name,
$core.String? address,
$core.String? version,
NodeStatus? status,
$core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels,
}) {
final result = create();
if (nodeId != null) result.nodeId = nodeId;
if (name != null) result.name = name;
if (address != null) result.address = address;
if (version != null) result.version = version;
if (status != null) result.status = status;
if (labels != null) result.labels.addEntries(labels);
return result;
}
NodeInfo._();
factory NodeInfo.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory NodeInfo.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'NodeInfo',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'nodeId')
..aOS(2, _omitFieldNames ? '' : 'name')
..aOS(3, _omitFieldNames ? '' : 'address')
..aOS(4, _omitFieldNames ? '' : 'version')
..aE<NodeStatus>(5, _omitFieldNames ? '' : 'status',
enumValues: NodeStatus.values)
..m<$core.String, $core.String>(6, _omitFieldNames ? '' : 'labels',
entryClassName: 'NodeInfo.LabelsEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OS,
packageName: const $pb.PackageName('iop'))
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeInfo clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeInfo copyWith(void Function(NodeInfo) updates) =>
super.copyWith((message) => updates(message as NodeInfo)) as NodeInfo;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static NodeInfo create() => NodeInfo._();
@$core.override
NodeInfo createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static NodeInfo getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NodeInfo>(create);
static NodeInfo? _defaultInstance;
@$pb.TagNumber(1)
$core.String get nodeId => $_getSZ(0);
@$pb.TagNumber(1)
set nodeId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasNodeId() => $_has(0);
@$pb.TagNumber(1)
void clearNodeId() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get name => $_getSZ(1);
@$pb.TagNumber(2)
set name($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasName() => $_has(1);
@$pb.TagNumber(2)
void clearName() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get address => $_getSZ(2);
@$pb.TagNumber(3)
set address($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasAddress() => $_has(2);
@$pb.TagNumber(3)
void clearAddress() => $_clearField(3);
@$pb.TagNumber(4)
$core.String get version => $_getSZ(3);
@$pb.TagNumber(4)
set version($core.String value) => $_setString(3, value);
@$pb.TagNumber(4)
$core.bool hasVersion() => $_has(3);
@$pb.TagNumber(4)
void clearVersion() => $_clearField(4);
@$pb.TagNumber(5)
NodeStatus get status => $_getN(4);
@$pb.TagNumber(5)
set status(NodeStatus value) => $_setField(5, value);
@$pb.TagNumber(5)
$core.bool hasStatus() => $_has(4);
@$pb.TagNumber(5)
void clearStatus() => $_clearField(5);
@$pb.TagNumber(6)
$pb.PbMap<$core.String, $core.String> get labels => $_getMap(5);
}
/// NodeRegisterRequest is a legacy placeholder and is not the active startup
/// contract. Nodes connect to Edge, not directly to Control Plane.
class NodeRegisterRequest extends $pb.GeneratedMessage {
factory NodeRegisterRequest({
NodeInfo? info,
}) {
final result = create();
if (info != null) result.info = info;
return result;
}
NodeRegisterRequest._();
factory NodeRegisterRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory NodeRegisterRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'NodeRegisterRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOM<NodeInfo>(1, _omitFieldNames ? '' : 'info',
subBuilder: NodeInfo.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeRegisterRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeRegisterRequest copyWith(void Function(NodeRegisterRequest) updates) =>
super.copyWith((message) => updates(message as NodeRegisterRequest))
as NodeRegisterRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static NodeRegisterRequest create() => NodeRegisterRequest._();
@$core.override
NodeRegisterRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static NodeRegisterRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<NodeRegisterRequest>(create);
static NodeRegisterRequest? _defaultInstance;
@$pb.TagNumber(1)
NodeInfo get info => $_getN(0);
@$pb.TagNumber(1)
set info(NodeInfo value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasInfo() => $_has(0);
@$pb.TagNumber(1)
void clearInfo() => $_clearField(1);
@$pb.TagNumber(1)
NodeInfo ensureInfo() => $_ensure(0);
}
/// NodeRegisterResponse is a legacy placeholder retained until the
/// Control Plane contracts are redesigned around Edge.
class NodeRegisterResponse extends $pb.GeneratedMessage {
factory NodeRegisterResponse({
$core.bool? accepted,
$core.String? token,
$core.String? reason,
}) {
final result = create();
if (accepted != null) result.accepted = accepted;
if (token != null) result.token = token;
if (reason != null) result.reason = reason;
return result;
}
NodeRegisterResponse._();
factory NodeRegisterResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory NodeRegisterResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'NodeRegisterResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'iop'),
createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'accepted')
..aOS(2, _omitFieldNames ? '' : 'token')
..aOS(3, _omitFieldNames ? '' : 'reason')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeRegisterResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
NodeRegisterResponse copyWith(void Function(NodeRegisterResponse) updates) =>
super.copyWith((message) => updates(message as NodeRegisterResponse))
as NodeRegisterResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static NodeRegisterResponse create() => NodeRegisterResponse._();
@$core.override
NodeRegisterResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static NodeRegisterResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<NodeRegisterResponse>(create);
static NodeRegisterResponse? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get accepted => $_getBF(0);
@$pb.TagNumber(1)
set accepted($core.bool value) => $_setBool(0, value);
@$pb.TagNumber(1)
$core.bool hasAccepted() => $_has(0);
@$pb.TagNumber(1)
void clearAccepted() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get token => $_getSZ(1);
@$pb.TagNumber(2)
set token($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasToken() => $_has(1);
@$pb.TagNumber(2)
void clearToken() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get reason => $_getSZ(2);
@$pb.TagNumber(3)
set reason($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasReason() => $_has(2);
@$pb.TagNumber(3)
void clearReason() => $_clearField(3);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,43 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/node.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class NodeStatus extends $pb.ProtobufEnum {
static const NodeStatus NODE_STATUS_UNSPECIFIED =
NodeStatus._(0, _omitEnumNames ? '' : 'NODE_STATUS_UNSPECIFIED');
static const NodeStatus NODE_STATUS_ONLINE =
NodeStatus._(1, _omitEnumNames ? '' : 'NODE_STATUS_ONLINE');
static const NodeStatus NODE_STATUS_OFFLINE =
NodeStatus._(2, _omitEnumNames ? '' : 'NODE_STATUS_OFFLINE');
static const NodeStatus NODE_STATUS_DRAINING =
NodeStatus._(3, _omitEnumNames ? '' : 'NODE_STATUS_DRAINING');
static const $core.List<NodeStatus> values = <NodeStatus>[
NODE_STATUS_UNSPECIFIED,
NODE_STATUS_ONLINE,
NODE_STATUS_OFFLINE,
NODE_STATUS_DRAINING,
];
static final $core.List<NodeStatus?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 3);
static NodeStatus? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const NodeStatus._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -1,13 +1,15 @@
// This is a generated file - do not edit.
//
// Generated code. Do not modify.
// source: proto/iop/node.proto
//
// @dart = 2.12
// Generated from proto/iop/node.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
@ -38,8 +40,22 @@ const NodeInfo$json = {
{'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
{'1': 'address', '3': 3, '4': 1, '5': 9, '10': 'address'},
{'1': 'version', '3': 4, '4': 1, '5': 9, '10': 'version'},
{'1': 'status', '3': 5, '4': 1, '5': 14, '6': '.iop.NodeStatus', '10': 'status'},
{'1': 'labels', '3': 6, '4': 3, '5': 11, '6': '.iop.NodeInfo.LabelsEntry', '10': 'labels'},
{
'1': 'status',
'3': 5,
'4': 1,
'5': 14,
'6': '.iop.NodeStatus',
'10': 'status'
},
{
'1': 'labels',
'3': 6,
'4': 3,
'5': 11,
'6': '.iop.NodeInfo.LabelsEntry',
'10': 'labels'
},
],
'3': [NodeInfo_LabelsEntry$json],
};
@ -89,4 +105,3 @@ const NodeRegisterResponse$json = {
final $typed_data.Uint8List nodeRegisterResponseDescriptor = $convert.base64Decode(
'ChROb2RlUmVnaXN0ZXJSZXNwb25zZRIaCghhY2NlcHRlZBgBIAEoCFIIYWNjZXB0ZWQSFAoFdG'
'9rZW4YAiABKAlSBXRva2VuEhYKBnJlYXNvbhgDIAEoCVIGcmVhc29u');

View file

@ -11,4 +11,3 @@
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'node.pb.dart';

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,100 @@
// This is a generated file - do not edit.
//
// Generated from proto/iop/runtime.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class RunSessionMode extends $pb.ProtobufEnum {
static const RunSessionMode RUN_SESSION_MODE_UNSPECIFIED =
RunSessionMode._(0, _omitEnumNames ? '' : 'RUN_SESSION_MODE_UNSPECIFIED');
static const RunSessionMode RUN_SESSION_MODE_CREATE_IF_MISSING =
RunSessionMode._(
1, _omitEnumNames ? '' : 'RUN_SESSION_MODE_CREATE_IF_MISSING');
static const RunSessionMode RUN_SESSION_MODE_REQUIRE_EXISTING =
RunSessionMode._(
2, _omitEnumNames ? '' : 'RUN_SESSION_MODE_REQUIRE_EXISTING');
static const $core.List<RunSessionMode> values = <RunSessionMode>[
RUN_SESSION_MODE_UNSPECIFIED,
RUN_SESSION_MODE_CREATE_IF_MISSING,
RUN_SESSION_MODE_REQUIRE_EXISTING,
];
static final $core.List<RunSessionMode?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 2);
static RunSessionMode? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const RunSessionMode._(super.value, super.name);
}
class CancelAction extends $pb.ProtobufEnum {
static const CancelAction CANCEL_ACTION_UNSPECIFIED =
CancelAction._(0, _omitEnumNames ? '' : 'CANCEL_ACTION_UNSPECIFIED');
static const CancelAction CANCEL_ACTION_CANCEL_RUN =
CancelAction._(1, _omitEnumNames ? '' : 'CANCEL_ACTION_CANCEL_RUN');
static const CancelAction CANCEL_ACTION_TERMINATE_SESSION = CancelAction._(
2, _omitEnumNames ? '' : 'CANCEL_ACTION_TERMINATE_SESSION');
static const $core.List<CancelAction> values = <CancelAction>[
CANCEL_ACTION_UNSPECIFIED,
CANCEL_ACTION_CANCEL_RUN,
CANCEL_ACTION_TERMINATE_SESSION,
];
static final $core.List<CancelAction?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 2);
static CancelAction? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const CancelAction._(super.value, super.name);
}
class NodeCommandType extends $pb.ProtobufEnum {
static const NodeCommandType NODE_COMMAND_TYPE_UNSPECIFIED =
NodeCommandType._(
0, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_UNSPECIFIED');
static const NodeCommandType NODE_COMMAND_TYPE_USAGE_STATUS =
NodeCommandType._(
1, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_USAGE_STATUS');
static const NodeCommandType NODE_COMMAND_TYPE_CAPABILITIES =
NodeCommandType._(
2, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_CAPABILITIES');
static const NodeCommandType NODE_COMMAND_TYPE_SESSION_LIST =
NodeCommandType._(
3, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_SESSION_LIST');
static const NodeCommandType NODE_COMMAND_TYPE_TRANSPORT_STATUS =
NodeCommandType._(
4, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_TRANSPORT_STATUS');
static const NodeCommandType NODE_COMMAND_TYPE_OLLAMA_API = NodeCommandType._(
5, _omitEnumNames ? '' : 'NODE_COMMAND_TYPE_OLLAMA_API');
static const $core.List<NodeCommandType> values = <NodeCommandType>[
NODE_COMMAND_TYPE_UNSPECIFIED,
NODE_COMMAND_TYPE_USAGE_STATUS,
NODE_COMMAND_TYPE_CAPABILITIES,
NODE_COMMAND_TYPE_SESSION_LIST,
NODE_COMMAND_TYPE_TRANSPORT_STATUS,
NODE_COMMAND_TYPE_OLLAMA_API,
];
static final $core.List<NodeCommandType?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 5);
static NodeCommandType? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const NodeCommandType._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -1,13 +1,15 @@
// This is a generated file - do not edit.
//
// Generated code. Do not modify.
// source: proto/iop/runtime.proto
//
// @dart = 2.12
// Generated from proto/iop/runtime.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
@ -54,6 +56,7 @@ const NodeCommandType$json = {
{'1': 'NODE_COMMAND_TYPE_CAPABILITIES', '2': 2},
{'1': 'NODE_COMMAND_TYPE_SESSION_LIST', '2': 3},
{'1': 'NODE_COMMAND_TYPE_TRANSPORT_STATUS', '2': 4},
{'1': 'NODE_COMMAND_TYPE_OLLAMA_API', '2': 5},
],
};
@ -62,7 +65,8 @@ final $typed_data.Uint8List nodeCommandTypeDescriptor = $convert.base64Decode(
'Cg9Ob2RlQ29tbWFuZFR5cGUSIQodTk9ERV9DT01NQU5EX1RZUEVfVU5TUEVDSUZJRUQQABIiCh'
'5OT0RFX0NPTU1BTkRfVFlQRV9VU0FHRV9TVEFUVVMQARIiCh5OT0RFX0NPTU1BTkRfVFlQRV9D'
'QVBBQklMSVRJRVMQAhIiCh5OT0RFX0NPTU1BTkRfVFlQRV9TRVNTSU9OX0xJU1QQAxImCiJOT0'
'RFX0NPTU1BTkRfVFlQRV9UUkFOU1BPUlRfU1RBVFVTEAQ=');
'RFX0NPTU1BTkRfVFlQRV9UUkFOU1BPUlRfU1RBVFVTEAQSIAocTk9ERV9DT01NQU5EX1RZUEVf'
'T0xMQU1BX0FQSRAF');
@$core.Deprecated('Use runRequestDescriptor instead')
const RunRequest$json = {
@ -72,12 +76,40 @@ const RunRequest$json = {
{'1': 'adapter', '3': 2, '4': 1, '5': 9, '10': 'adapter'},
{'1': 'target', '3': 3, '4': 1, '5': 9, '10': 'target'},
{'1': 'workspace', '3': 4, '4': 1, '5': 9, '10': 'workspace'},
{'1': 'policy', '3': 5, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'policy'},
{'1': 'input', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'input'},
{
'1': 'policy',
'3': 5,
'4': 1,
'5': 11,
'6': '.google.protobuf.Struct',
'10': 'policy'
},
{
'1': 'input',
'3': 6,
'4': 1,
'5': 11,
'6': '.google.protobuf.Struct',
'10': 'input'
},
{'1': 'timeout_sec', '3': 7, '4': 1, '5': 5, '10': 'timeoutSec'},
{'1': 'metadata', '3': 8, '4': 3, '5': 11, '6': '.iop.RunRequest.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 8,
'4': 3,
'5': 11,
'6': '.iop.RunRequest.MetadataEntry',
'10': 'metadata'
},
{'1': 'session_id', '3': 9, '4': 1, '5': 9, '10': 'sessionId'},
{'1': 'session_mode', '3': 10, '4': 1, '5': 14, '6': '.iop.RunSessionMode', '10': 'sessionMode'},
{
'1': 'session_mode',
'3': 10,
'4': 1,
'5': 14,
'6': '.iop.RunSessionMode',
'10': 'sessionMode'
},
{'1': 'background', '3': 11, '4': 1, '5': 8, '10': 'background'},
],
'3': [RunRequest_MetadataEntry$json],
@ -115,7 +147,14 @@ const RunEvent$json = {
{'1': 'message', '3': 4, '4': 1, '5': 9, '10': 'message'},
{'1': 'error', '3': 5, '4': 1, '5': 9, '10': 'error'},
{'1': 'usage', '3': 6, '4': 1, '5': 11, '6': '.iop.Usage', '10': 'usage'},
{'1': 'metadata', '3': 7, '4': 3, '5': 11, '6': '.iop.RunEvent.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 7,
'4': 3,
'5': 11,
'6': '.iop.RunEvent.MetadataEntry',
'10': 'metadata'
},
{'1': 'timestamp', '3': 8, '4': 1, '5': 3, '10': 'timestamp'},
{'1': 'session_id', '3': 9, '4': 1, '5': 9, '10': 'sessionId'},
{'1': 'background', '3': 10, '4': 1, '5': 8, '10': 'background'},
@ -156,7 +195,14 @@ const EdgeNodeEvent$json = {
{'1': 'node_id', '3': 4, '4': 1, '5': 9, '10': 'nodeId'},
{'1': 'alias', '3': 5, '4': 1, '5': 9, '10': 'alias'},
{'1': 'reason', '3': 6, '4': 1, '5': 9, '10': 'reason'},
{'1': 'metadata', '3': 7, '4': 3, '5': 11, '6': '.iop.EdgeNodeEvent.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 7,
'4': 3,
'5': 11,
'6': '.iop.EdgeNodeEvent.MetadataEntry',
'10': 'metadata'
},
{'1': 'timestamp', '3': 8, '4': 1, '5': 3, '10': 'timestamp'},
],
'3': [EdgeNodeEvent_MetadataEntry$json],
@ -204,8 +250,8 @@ const Heartbeat$json = {
};
/// Descriptor for `Heartbeat`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List heartbeatDescriptor = $convert.base64Decode(
'CglIZWFydGJlYXQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXA=');
final $typed_data.Uint8List heartbeatDescriptor = $convert
.base64Decode('CglIZWFydGJlYXQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXA=');
@$core.Deprecated('Use cancelRequestDescriptor instead')
const CancelRequest$json = {
@ -215,7 +261,14 @@ const CancelRequest$json = {
{'1': 'adapter', '3': 2, '4': 1, '5': 9, '10': 'adapter'},
{'1': 'target', '3': 3, '4': 1, '5': 9, '10': 'target'},
{'1': 'session_id', '3': 4, '4': 1, '5': 9, '10': 'sessionId'},
{'1': 'action', '3': 5, '4': 1, '5': 14, '6': '.iop.CancelAction', '10': 'action'},
{
'1': 'action',
'3': 5,
'4': 1,
'5': 14,
'6': '.iop.CancelAction',
'10': 'action'
},
],
};
@ -230,12 +283,26 @@ const NodeCommandRequest$json = {
'1': 'NodeCommandRequest',
'2': [
{'1': 'request_id', '3': 1, '4': 1, '5': 9, '10': 'requestId'},
{'1': 'type', '3': 2, '4': 1, '5': 14, '6': '.iop.NodeCommandType', '10': 'type'},
{
'1': 'type',
'3': 2,
'4': 1,
'5': 14,
'6': '.iop.NodeCommandType',
'10': 'type'
},
{'1': 'adapter', '3': 3, '4': 1, '5': 9, '10': 'adapter'},
{'1': 'target', '3': 4, '4': 1, '5': 9, '10': 'target'},
{'1': 'session_id', '3': 5, '4': 1, '5': 9, '10': 'sessionId'},
{'1': 'timeout_sec', '3': 6, '4': 1, '5': 5, '10': 'timeoutSec'},
{'1': 'metadata', '3': 7, '4': 3, '5': 11, '6': '.iop.NodeCommandRequest.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 7,
'4': 3,
'5': 11,
'6': '.iop.NodeCommandRequest.MetadataEntry',
'10': 'metadata'
},
],
'3': [NodeCommandRequest_MetadataEntry$json],
};
@ -265,13 +332,34 @@ const NodeCommandResponse$json = {
'1': 'NodeCommandResponse',
'2': [
{'1': 'request_id', '3': 1, '4': 1, '5': 9, '10': 'requestId'},
{'1': 'type', '3': 2, '4': 1, '5': 14, '6': '.iop.NodeCommandType', '10': 'type'},
{
'1': 'type',
'3': 2,
'4': 1,
'5': 14,
'6': '.iop.NodeCommandType',
'10': 'type'
},
{'1': 'adapter', '3': 3, '4': 1, '5': 9, '10': 'adapter'},
{'1': 'target', '3': 4, '4': 1, '5': 9, '10': 'target'},
{'1': 'session_id', '3': 5, '4': 1, '5': 9, '10': 'sessionId'},
{'1': 'usage_status', '3': 6, '4': 1, '5': 11, '6': '.iop.AgentUsageStatus', '10': 'usageStatus'},
{
'1': 'usage_status',
'3': 6,
'4': 1,
'5': 11,
'6': '.iop.AgentUsageStatus',
'10': 'usageStatus'
},
{'1': 'error', '3': 7, '4': 1, '5': 9, '10': 'error'},
{'1': 'result', '3': 8, '4': 3, '5': 11, '6': '.iop.NodeCommandResponse.ResultEntry', '10': 'result'},
{
'1': 'result',
'3': 8,
'4': 3,
'5': 11,
'6': '.iop.NodeCommandResponse.ResultEntry',
'10': 'result'
},
],
'3': [NodeCommandResponse_ResultEntry$json],
};
@ -305,7 +393,14 @@ const AgentUsageStatus$json = {
{'1': 'daily_reset_time', '3': 3, '4': 1, '5': 9, '10': 'dailyResetTime'},
{'1': 'weekly_limit', '3': 4, '4': 1, '5': 9, '10': 'weeklyLimit'},
{'1': 'weekly_reset_time', '3': 5, '4': 1, '5': 9, '10': 'weeklyResetTime'},
{'1': 'metadata', '3': 6, '4': 3, '5': 11, '6': '.iop.AgentUsageStatus.MetadataEntry', '10': 'metadata'},
{
'1': 'metadata',
'3': 6,
'4': 3,
'5': 11,
'6': '.iop.AgentUsageStatus.MetadataEntry',
'10': 'metadata'
},
],
'3': [AgentUsageStatus_MetadataEntry$json],
};
@ -351,8 +446,8 @@ const RegisterRequest$json = {
};
/// Descriptor for `RegisterRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List registerRequestDescriptor = $convert.base64Decode(
'Cg9SZWdpc3RlclJlcXVlc3QSFAoFdG9rZW4YASABKAlSBXRva2Vu');
final $typed_data.Uint8List registerRequestDescriptor = $convert
.base64Decode('Cg9SZWdpc3RlclJlcXVlc3QSFAoFdG9rZW4YASABKAlSBXRva2Vu');
@$core.Deprecated('Use registerResponseDescriptor instead')
const RegisterResponse$json = {
@ -362,7 +457,14 @@ const RegisterResponse$json = {
{'1': 'node_id', '3': 2, '4': 1, '5': 9, '10': 'nodeId'},
{'1': 'alias', '3': 3, '4': 1, '5': 9, '10': 'alias'},
{'1': 'reason', '3': 4, '4': 1, '5': 9, '10': 'reason'},
{'1': 'config', '3': 5, '4': 1, '5': 11, '6': '.iop.NodeConfigPayload', '10': 'config'},
{
'1': 'config',
'3': 5,
'4': 1,
'5': 11,
'6': '.iop.NodeConfigPayload',
'10': 'config'
},
],
};
@ -376,8 +478,22 @@ final $typed_data.Uint8List registerResponseDescriptor = $convert.base64Decode(
const NodeConfigPayload$json = {
'1': 'NodeConfigPayload',
'2': [
{'1': 'adapters', '3': 1, '4': 3, '5': 11, '6': '.iop.AdapterConfig', '10': 'adapters'},
{'1': 'runtime', '3': 2, '4': 1, '5': 11, '6': '.iop.NodeRuntimeConfig', '10': 'runtime'},
{
'1': 'adapters',
'3': 1,
'4': 3,
'5': 11,
'6': '.iop.AdapterConfig',
'10': 'adapters'
},
{
'1': 'runtime',
'3': 2,
'4': 1,
'5': 11,
'6': '.iop.NodeRuntimeConfig',
'10': 'runtime'
},
],
};
@ -393,10 +509,41 @@ const AdapterConfig$json = {
'2': [
{'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},
{'1': 'enabled', '3': 2, '4': 1, '5': 8, '10': 'enabled'},
{'1': 'settings', '3': 3, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'settings'},
{'1': 'cli', '3': 4, '4': 1, '5': 11, '6': '.iop.CLIAdapterConfig', '9': 0, '10': 'cli'},
{'1': 'ollama', '3': 5, '4': 1, '5': 11, '6': '.iop.OllamaAdapterConfig', '9': 0, '10': 'ollama'},
{'1': 'vllm', '3': 6, '4': 1, '5': 11, '6': '.iop.VllmAdapterConfig', '9': 0, '10': 'vllm'},
{
'1': 'settings',
'3': 3,
'4': 1,
'5': 11,
'6': '.google.protobuf.Struct',
'10': 'settings'
},
{
'1': 'cli',
'3': 4,
'4': 1,
'5': 11,
'6': '.iop.CLIAdapterConfig',
'9': 0,
'10': 'cli'
},
{
'1': 'ollama',
'3': 5,
'4': 1,
'5': 11,
'6': '.iop.OllamaAdapterConfig',
'9': 0,
'10': 'ollama'
},
{
'1': 'vllm',
'3': 6,
'4': 1,
'5': 11,
'6': '.iop.VllmAdapterConfig',
'9': 0,
'10': 'vllm'
},
],
'8': [
{'1': 'config'},
@ -415,7 +562,14 @@ final $typed_data.Uint8List adapterConfigDescriptor = $convert.base64Decode(
const CLIAdapterConfig$json = {
'1': 'CLIAdapterConfig',
'2': [
{'1': 'profiles', '3': 1, '4': 3, '5': 11, '6': '.iop.CLIAdapterConfig.ProfilesEntry', '10': 'profiles'},
{
'1': 'profiles',
'3': 1,
'4': 3,
'5': 11,
'6': '.iop.CLIAdapterConfig.ProfilesEntry',
'10': 'profiles'
},
],
'3': [CLIAdapterConfig_ProfilesEntry$json],
};
@ -425,7 +579,14 @@ const CLIAdapterConfig_ProfilesEntry$json = {
'1': 'ProfilesEntry',
'2': [
{'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
{'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.iop.CLIProfileConfig', '10': 'value'},
{
'1': 'value',
'3': 2,
'4': 1,
'5': 11,
'6': '.iop.CLIProfileConfig',
'10': 'value'
},
],
'7': {'7': true},
};
@ -446,10 +607,29 @@ const CLIProfileConfig$json = {
{'1': 'env', '3': 3, '4': 3, '5': 9, '10': 'env'},
{'1': 'persistent', '3': 4, '4': 1, '5': 8, '10': 'persistent'},
{'1': 'terminal', '3': 5, '4': 1, '5': 8, '10': 'terminal'},
{'1': 'response_idle_timeout_ms', '3': 6, '4': 1, '5': 5, '10': 'responseIdleTimeoutMs'},
{'1': 'startup_idle_timeout_ms', '3': 7, '4': 1, '5': 5, '10': 'startupIdleTimeoutMs'},
{
'1': 'response_idle_timeout_ms',
'3': 6,
'4': 1,
'5': 5,
'10': 'responseIdleTimeoutMs'
},
{
'1': 'startup_idle_timeout_ms',
'3': 7,
'4': 1,
'5': 5,
'10': 'startupIdleTimeoutMs'
},
{'1': 'output_format', '3': 8, '4': 1, '5': 9, '10': 'outputFormat'},
{'1': 'completion_marker', '3': 9, '4': 1, '5': 11, '6': '.iop.CLICompletionMarker', '10': 'completionMarker'},
{
'1': 'completion_marker',
'3': 9,
'4': 1,
'5': 11,
'6': '.iop.CLICompletionMarker',
'10': 'completionMarker'
},
{'1': 'mode', '3': 10, '4': 1, '5': 9, '10': 'mode'},
{'1': 'resume_args', '3': 11, '4': 3, '5': 9, '10': 'resumeArgs'},
],
@ -519,4 +699,3 @@ const NodeRuntimeConfig$json = {
final $typed_data.Uint8List nodeRuntimeConfigDescriptor = $convert.base64Decode(
'ChFOb2RlUnVudGltZUNvbmZpZxIgCgtjb25jdXJyZW5jeRgBIAEoBVILY29uY3VycmVuY3kSJQ'
'oOd29ya3NwYWNlX3Jvb3QYAiABKAlSDXdvcmtzcGFjZVJvb3Q=');

View file

@ -11,4 +11,3 @@
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'runtime.pb.dart';

View file

@ -2,35 +2,33 @@ import 'package:proto_socket/proto_socket.dart';
import '../gen/proto/iop/control.pb.dart';
import 'parser_map.dart';
class PortalWireClient extends WsProtobufClient {
PortalWireClient(
class ClientWireClient extends WsProtobufClient {
ClientWireClient(
dynamic ws, {
int heartbeatIntervalTime = 5000,
int heartbeatWaitTime = 5000,
}) : super(
ws,
heartbeatIntervalTime,
heartbeatWaitTime,
Map.from(portalParserMap),
);
ws,
heartbeatIntervalTime,
heartbeatWaitTime,
Map.from(clientParserMap),
);
/// Connect to the Control Plane Wire endpoint and return a PortalWireClient.
static Future<PortalWireClient> connect(
/// Connect to the Control Plane Wire endpoint and return a ClientWireClient.
static Future<ClientWireClient> connect(
String host,
int port, {
String path = '/portal',
String path = '/client',
bool secure = false,
}) async {
final ws = secure
? await WsProtobufClient.connectSecure(host, port, path: path)
: await WsProtobufClient.connect(host, port, path: path);
return PortalWireClient(ws);
return ClientWireClient(ws);
}
/// Parse a full WebSocket URL and connect.
static Future<PortalWireClient> connectToUrl(
String urlString,
) async {
static Future<ClientWireClient> connectToUrl(String urlString) async {
final uri = Uri.parse(urlString);
final host = uri.host.isEmpty ? 'localhost' : uri.host;
final isSecure = uri.scheme == 'wss';
@ -41,17 +39,17 @@ class PortalWireClient extends WsProtobufClient {
final ws = isSecure
? await WsProtobufClient.connectSecure(host, port, path: path)
: await WsProtobufClient.connect(host, port, path: path);
return PortalWireClient(ws);
return ClientWireClient(ws);
}
/// Sends a Hello request to the Control Plane.
Future<PortalHelloResponse> hello({
Future<ClientHelloResponse> hello({
required String clientId,
required String clientVersion,
Duration timeout = const Duration(seconds: 3),
}) async {
return await sendRequest<PortalHelloRequest, PortalHelloResponse>(
PortalHelloRequest()
return await sendRequest<ClientHelloRequest, ClientHelloResponse>(
ClientHelloRequest()
..clientId = clientId
..clientVersion = clientVersion,
timeout: timeout,

View file

@ -0,0 +1,9 @@
import 'package:protobuf/protobuf.dart';
import '../gen/proto/iop/control.pb.dart';
final Map<String, GeneratedMessage Function(List<int>)> clientParserMap = {
'iop.ClientHelloRequest': ClientHelloRequest.fromBuffer,
'iop.ClientHelloResponse': ClientHelloResponse.fromBuffer,
'ClientHelloRequest': ClientHelloRequest.fromBuffer,
'ClientHelloResponse': ClientHelloResponse.fromBuffer,
};

View file

@ -1,19 +1,19 @@
import 'package:flutter/material.dart';
import 'portal_config.dart';
import 'iop_wire/portal_wire_client.dart';
import 'client_config.dart';
import 'iop_wire/client_wire_client.dart';
void main() {
runApp(const IopPortalApp());
runApp(const IopClientApp());
}
class IopPortalApp extends StatelessWidget {
final PortalWireClient? testClient;
const IopPortalApp({super.key, this.testClient});
class IopClientApp extends StatelessWidget {
final ClientWireClient? testClient;
const IopClientApp({super.key, this.testClient});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'IOP Portal',
title: 'IOP Client',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark(useMaterial3: true).copyWith(
colorScheme: ColorScheme.fromSeed(
@ -24,26 +24,27 @@ class IopPortalApp extends StatelessWidget {
),
scaffoldBackgroundColor: const Color(0xFF0F172A),
),
home: PortalHomePage(testClient: testClient),
home: ClientHomePage(testClient: testClient),
);
}
}
class PortalHomePage extends StatefulWidget {
final PortalWireClient? testClient;
const PortalHomePage({super.key, this.testClient});
class ClientHomePage extends StatefulWidget {
final ClientWireClient? testClient;
const ClientHomePage({super.key, this.testClient});
@override
State<PortalHomePage> createState() => _PortalHomePageState();
State<ClientHomePage> createState() => _ClientHomePageState();
}
class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProviderStateMixin {
class _ClientHomePageState extends State<ClientHomePage>
with SingleTickerProviderStateMixin {
late AnimationController _pulseController;
late Animation<double> _pulseAnimation;
String _wireStatus = 'Disconnected';
String _statusMessage = 'Not connected';
PortalWireClient? _client;
ClientWireClient? _client;
@override
void initState() {
@ -52,7 +53,7 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true);
_pulseAnimation = Tween<double>(begin: 0.6, end: 1.0).animate(
CurvedAnimation(parent: _pulseController, curve: Curves.easeInOut),
);
@ -74,20 +75,25 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
if (!mounted) return;
setState(() {
_wireStatus = 'Connecting';
_statusMessage = 'Connecting to ${PortalConfig.controlPlaneWireUrl}...';
_statusMessage = 'Connecting to ${ClientConfig.controlPlaneWireUrl}...';
});
try {
PortalWireClient client;
ClientWireClient client;
if (widget.testClient != null) {
client = widget.testClient!;
} else {
client = await PortalWireClient.connectToUrl(PortalConfig.controlPlaneWireUrl);
client = await ClientWireClient.connectToUrl(
ClientConfig.controlPlaneWireUrl,
);
}
_client = client;
// Hello handshake
final response = await client.hello(clientId: 'portal-ui', clientVersion: '1.0.0');
final response = await client.hello(
clientId: 'client-ui',
clientVersion: '1.0.0',
);
if (!mounted) return;
setState(() {
@ -123,15 +129,15 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFF0F172A),
Color(0xFF1E1B4B),
],
colors: [Color(0xFF0F172A), Color(0xFF1E1B4B)],
),
),
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 32.0),
padding: const EdgeInsets.symmetric(
horizontal: 24.0,
vertical: 32.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -143,7 +149,7 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'IOP Portal',
'IOP Client',
style: TextStyle(
fontSize: 32.0,
fontWeight: FontWeight.w800,
@ -167,12 +173,19 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
animation: _pulseAnimation,
builder: (context, child) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
decoration: BoxDecoration(
color: const Color(0xFF10B981).withOpacity(0.15 * _pulseAnimation.value),
color: const Color(
0xFF10B981,
).withOpacity(0.15 * _pulseAnimation.value),
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: const Color(0xFF10B981).withOpacity(0.5 * _pulseAnimation.value),
color: const Color(
0xFF10B981,
).withOpacity(0.5 * _pulseAnimation.value),
width: 1.5,
),
),
@ -204,7 +217,7 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
],
),
const SizedBox(height: 48),
// Dashboard Cards Section
Expanded(
child: ListView(
@ -215,9 +228,15 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
icon: Icons.cloud_queue_rounded,
accentColor: const Color(0xFF6366F1),
children: [
_buildConfigRow('Control Plane HTTP Endpoint', PortalConfig.controlPlaneHttpUrl),
_buildConfigRow(
'Control Plane HTTP Endpoint',
ClientConfig.controlPlaneHttpUrl,
),
const SizedBox(height: 12),
_buildConfigRow('Control Plane Wire WebSocket Endpoint', PortalConfig.controlPlaneWireUrl),
_buildConfigRow(
'Control Plane Wire WebSocket Endpoint',
ClientConfig.controlPlaneWireUrl,
),
const SizedBox(height: 16),
const Divider(color: Colors.white10),
const SizedBox(height: 12),
@ -238,15 +257,12 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
],
),
),
// Footer
Center(
child: Text(
'© 2026 Antigravity & Toki Labs. All rights reserved.',
style: TextStyle(
fontSize: 12,
color: Colors.grey[600],
),
style: TextStyle(fontSize: 12, color: Colors.grey[600]),
),
),
],
@ -300,7 +316,9 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
height: 12,
child: CircularProgressIndicator(
strokeWidth: 1.5,
valueColor: AlwaysStoppedAnimation<Color>(Color(0xFFF59E0B)),
valueColor: AlwaysStoppedAnimation<Color>(
Color(0xFFF59E0B),
),
),
)
else
@ -365,10 +383,7 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
decoration: BoxDecoration(
color: const Color(0xFF1E293B).withOpacity(0.6),
borderRadius: BorderRadius.circular(24),
border: Border.all(
color: Colors.white.withOpacity(0.08),
width: 1,
),
border: Border.all(color: Colors.white.withOpacity(0.08), width: 1),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(24),
@ -385,11 +400,7 @@ class _PortalHomePageState extends State<PortalHomePage> with SingleTickerProvid
color: accentColor.withOpacity(0.15),
borderRadius: BorderRadius.circular(12),
),
child: Icon(
icon,
color: accentColor,
size: 24,
),
child: Icon(icon, color: accentColor, size: 24),
),
const SizedBox(width: 16),
Text(

View file

@ -4,10 +4,10 @@ project(runner LANGUAGES CXX)
# The name of the executable created for the application. Change this to change
# the on-disk name of your application.
set(BINARY_NAME "iop_portal")
set(BINARY_NAME "iop_client")
# The unique GTK application identifier for this application. See:
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
set(APPLICATION_ID "com.example.iop_portal")
set(APPLICATION_ID "com.example.iop_client")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.

View file

@ -45,11 +45,11 @@ static void my_application_activate(GApplication* application) {
if (use_header_bar) {
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
gtk_widget_show(GTK_WIDGET(header_bar));
gtk_header_bar_set_title(header_bar, "iop_portal");
gtk_header_bar_set_title(header_bar, "iop_client");
gtk_header_bar_set_show_close_button(header_bar, TRUE);
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
} else {
gtk_window_set_title(window, "iop_portal");
gtk_window_set_title(window, "iop_client");
}
gtk_window_set_default_size(window, 1280, 720);

Some files were not shown because too many files have changed in this diff Show more