refactor: portal → client 앱 리팩토링 및 제어플랫폼 와이어 클라이언트 명명 변경
- apps/portal 디렉터리를 apps/client로 리팩터링 - ControlPlaneWireClient → WireClient 명명 변경 - 관련_proto import 정렬, struct protobuf 생성 제거 - README, docker-compose, 스크립트 등 일관성 개선
17
Makefile
|
|
@ -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
|
||||
|
|
|
|||
14
README.md
|
|
@ -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 도입 시점은 아직 강제하지 않는다.
|
||||
|
|
|
|||
|
|
@ -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 경로로 구분한다.
|
||||
|
|
|
|||
|
|
@ -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 운영면을 구축한다.
|
||||
|
||||
- [계획] 정책, 이력, 감사
|
||||
|
|
|
|||
|
|
@ -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 운영
|
||||
|
|
|
|||
|
|
@ -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 반영 범위
|
||||
|
|
@ -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, 정책/이력/감사
|
||||
- 후속 작업: 없음
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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` |
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.example.iop_portal
|
||||
package com.example.iop_client
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 721 B |
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
|
@ -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;
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 295 B |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 704 B |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
|
|
@ -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>
|
||||
|
|
@ -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',
|
||||
);
|
||||
}
|
||||
421
apps/client/lib/gen/proto/iop/control.pb.dart
Normal 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');
|
||||
11
apps/client/lib/gen/proto/iop/control.pbenum.dart
Normal 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
|
||||
|
|
@ -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==');
|
||||
|
||||
|
|
@ -11,4 +11,3 @@
|
|||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
export 'control.pb.dart';
|
||||
|
||||
338
apps/client/lib/gen/proto/iop/job.pb.dart
Normal 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');
|
||||
49
apps/client/lib/gen/proto/iop/job.pbenum.dart
Normal 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');
|
||||
|
|
@ -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==');
|
||||
|
||||
|
|
@ -11,4 +11,3 @@
|
|||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
export 'job.pb.dart';
|
||||
|
||||
280
apps/client/lib/gen/proto/iop/node.pb.dart
Normal 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');
|
||||
43
apps/client/lib/gen/proto/iop/node.pbenum.dart
Normal 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');
|
||||
|
|
@ -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');
|
||||
|
||||
|
|
@ -11,4 +11,3 @@
|
|||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
export 'node.pb.dart';
|
||||
|
||||
2041
apps/client/lib/gen/proto/iop/runtime.pb.dart
Normal file
100
apps/client/lib/gen/proto/iop/runtime.pbenum.dart
Normal 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');
|
||||
|
|
@ -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=');
|
||||
|
||||
|
|
@ -11,4 +11,3 @@
|
|||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
export 'runtime.pb.dart';
|
||||
|
||||
|
|
@ -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,
|
||||
9
apps/client/lib/iop_wire/parser_map.dart
Normal 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,
|
||||
};
|
||||
|
|
@ -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(
|
||||
|
|
@ -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.
|
||||
|
|
@ -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);
|
||||