update agent-ops domain and project rules
This commit is contained in:
parent
2cff29f87a
commit
cd72a054e0
5 changed files with 82 additions and 27 deletions
|
|
@ -2,15 +2,20 @@
|
|||
|
||||
## 목적 / 책임
|
||||
|
||||
여러 Node를 하나의 로컬 실행 그룹으로 묶는 백엔드 실행 그룹 컨트롤러 영역이다. 현재는 node 연결을 수락하고 token 기반 등록을 검증한 뒤 adapter/runtime 설정을 내려주며, console 기반 실행 요청과 run event relay를 검증한다.
|
||||
여러 Node를 하나의 로컬 실행 그룹으로 묶는 백엔드 실행 그룹 컨트롤러 영역이다. node 연결을 수락하고 token 기반 등록을 검증한 뒤 adapter/runtime 설정을 내려주며, ops console, OpenAI-compatible HTTP, A2A JSON-RPC 입력을 내부 `adapter + target` 실행 요청으로 수렴시킨다.
|
||||
|
||||
## 포함 경로
|
||||
|
||||
- `apps/edge/cmd/edge/` — edge CLI 진입점과 serve 커맨드
|
||||
- `apps/edge/internal/bootstrap/` — fx 의존성 주입과 서버 시작/종료 lifecycle
|
||||
- `apps/edge/internal/events/` — run/node event in-process fanout bus
|
||||
- `apps/edge/internal/input/` — OpenAI-compatible/A2A 입력 서버 lifecycle 관리
|
||||
- `apps/edge/internal/node/` — 연결된 node registry와 node 선택
|
||||
- `apps/edge/internal/openai/` — OpenAI-compatible HTTP 입력 표면
|
||||
- `apps/edge/internal/opsconsole/` — edge-local 운영 콘솔
|
||||
- `apps/edge/internal/service/` — console/HTTP 입력 표면이 공유하는 실행·명령 application service
|
||||
- `apps/edge/internal/transport/` — node 연결 수락, RegisterRequest/Response 처리, run event 수신
|
||||
- `apps/edge/README.md` — edge 계획과 현재 placeholder 범위
|
||||
- `apps/edge/README.md` — edge 실행 흐름과 운영 표면 설명
|
||||
|
||||
## 제외 경로
|
||||
|
||||
|
|
@ -28,31 +33,45 @@
|
|||
- `node.NodeStore` — 사전 등록된 `NodeRecord`를 token/ID로 조회; 설정 파일에서 seed
|
||||
- `node.NodeRecord` — 사전 등록된 node 정의 (ID, alias, token, adapter/runtime config)
|
||||
- `node.BuildConfigPayload()` — `NodeRecord`의 adapter 설정을 proto `NodeConfigPayload`로 변환하는 mapper
|
||||
- `bootstrap.Module` — edge 서버와 metrics lifecycle 구성
|
||||
- `consoleEventRouter` — console 모드에서 run event를 표준 출력으로 라우팅 (`cmd/edge/`)
|
||||
- `bootstrap.Module` — fx lifecycle에 `bootstrap.Runtime` start/stop을 연결
|
||||
- `bootstrap.Runtime` — logger, registry, node store, event bus, service, transport server, input manager를 묶는 실행 조립체
|
||||
- `events.Bus` — `RunEvent`와 `EdgeNodeEvent` subscriber fanout 및 bounded replay
|
||||
- `service.Service` — node 선택, run dispatch, cancel/terminate-session, node command 요청을 표면 중립 DTO로 제공
|
||||
- `service.RunHandle` — foreground run event stream과 dispatch metadata를 함께 들고 있는 handle
|
||||
- `input.Manager` — OpenAI-compatible 서버와 A2A 서버 lifecycle 소유자
|
||||
- `openai.Server` — `/v1/models`, `/v1/chat/completions`, SSE stream을 `service.SubmitRun()`으로 연결하는 HTTP 표면
|
||||
- `a2a.Server` / `a2a.TaskStore` — A2A `message/send`, `tasks/get`, `tasks/cancel`과 task 상태 보관
|
||||
- `opsconsole.Run` — edge-local console loop와 slash command 처리
|
||||
- `opsconsole.EventRouter` — run/node event를 edge console 출력으로 라우팅
|
||||
|
||||
## 유지할 패턴
|
||||
|
||||
- edge는 사전 등록된 node 정의를 검증하고 연결 상태를 registry에 반영하는 역할을 먼저 안정화한다.
|
||||
- edge는 단순 gateway가 아니라 Node registry, adapter/profile configuration, routing, stream relay의 소유자다.
|
||||
- 외부 OpenAI-compatible HTTP API는 node/transport 안정화 이후 확장하며, 내부 실행 모델 전체를 대표하지 않는다.
|
||||
- 외부 OpenAI-compatible HTTP API는 입력 표면일 뿐이며, 내부 실행 모델 전체를 대표하지 않는다.
|
||||
- node가 연결 직후 RegisterRequest를 보내고 edge가 RegisterResponse로 중앙 설정을 응답하는 흐름을 유지한다.
|
||||
- Registry는 동시성 안전성을 유지하고 외부로 내부 map을 노출하지 않는다.
|
||||
- NodeStore는 설정 파일에서 한 번 seed되며 런타임 중 변경하지 않는다; token 중복·빈 token은 LoadFromConfig에서 즉시 거부한다.
|
||||
- adapter config 변환(mapper)은 `node.BuildConfigPayload()`에서만 수행하고 transport 레이어에 변환 로직을 두지 않는다.
|
||||
- 내부 실행 요청은 `adapter + target`으로 표현한다. 외부 API 호환 경계의 `model` 표현을 edge 내부 책임 전체로 확장하지 않는다.
|
||||
- `apps/edge/cmd/edge/**`, `apps/edge/internal/bootstrap/**`, `apps/edge/internal/transport/**`, `apps/edge/internal/service/**`, `apps/edge/internal/node/**`, console 입출력/명령 처리, run event relay를 바꾼 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
- ops console과 HTTP 입력 표면은 `apps/edge/internal/service`를 호출하는 얇은 어댑터로 유지한다. node 선택, run dispatch, command request 생성은 service 계층에서 공유한다.
|
||||
- OpenAI-compatible 경계의 `model`과 A2A 경계의 `Task`/JSON-RPC 표현은 입력 표면 안에서만 유지하고, edge 내부 실행은 `service.SubmitRun()`의 `adapter + target` 요청으로 변환한다.
|
||||
- run/node event fanout은 `events.Bus`를 통해 수행하고, transport handler에서 console/HTTP 표면으로 직접 출력하거나 응답하지 않는다.
|
||||
- 입력 서버 lifecycle은 `input.Manager`가 소유하며, bootstrap runtime이 transport server와 함께 시작/종료한다.
|
||||
- `apps/edge/cmd/edge/**`, `apps/edge/internal/bootstrap/**`, `apps/edge/internal/transport/**`, `apps/edge/internal/service/**`, `apps/edge/internal/events/**`, `apps/edge/internal/input/**`, `apps/edge/internal/openai/**`, `apps/edge/internal/opsconsole/**`, `apps/edge/internal/node/**`, console/HTTP 입출력, run/node event relay를 바꾼 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
|
||||
## 다른 도메인과의 경계
|
||||
|
||||
- **node**: edge는 node 내부 adapter를 직접 실행하지 않는다. edge는 사전 등록 정보와 연결 registry를 기반으로 요청을 보낼 대상과 실행 설정을 관리한다.
|
||||
- **node**: edge는 node 내부 adapter를 직접 실행하지 않는다. edge는 사전 등록 정보와 연결 registry를 기반으로 요청을 보낼 대상과 실행 설정을 관리하고, TCP/protobuf로 `RunRequest`/`CancelRequest`/`NodeCommandRequest`를 보낸다.
|
||||
- **platform-common**: edge 설정, metrics, protobuf 타입은 platform-common 계약을 따른다.
|
||||
- **external input surfaces**: OpenAI-compatible HTTP와 A2A JSON-RPC는 edge inbound adapter이며, 내부 transport/protobuf 경계를 대체하지 않는다.
|
||||
- **control-plane 후보**: control-plane은 Edge를 통해 시스템을 제어한다. Node 직접 연결/직접 스케줄링을 control-plane 책임으로 굳히지 않는다.
|
||||
|
||||
## 금지 사항
|
||||
|
||||
- edge를 구현하면서 node adapter 실행 로직을 복제하지 않는다.
|
||||
- OpenAI-compatible HTTP API를 추가할 때 내부 TCP/protobuf 경계를 우회하지 않는다.
|
||||
- A2A/OpenAI/console 입력 표면에서 registry client에 직접 `RunRequest`를 조립·전송하지 않는다. 공유 로직은 `service.Service`에 둔다.
|
||||
- Control Plane 구현 전이라도 Node를 Control Plane에 직접 연결하는 경로를 edge 도메인에 추가하지 않는다.
|
||||
- gRPC 또는 WebSocket을 기본 내부 transport로 바꾸지 않는다.
|
||||
- `proto/gen/iop/*.pb.go` 생성 파일을 직접 수정하지 않는다.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## 목적 / 책임
|
||||
|
||||
Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이전트 영역이다. edge에서 들어온 실행 요청을 runtime 요청으로 변환하고, 라우팅된 어댑터를 실행하며, 실행 이벤트와 현재 단계의 로컬 실행 이력을 관리한다.
|
||||
Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이전트 영역이다. edge에서 들어온 실행·취소·조회성 명령을 runtime 요청으로 변환하고, 라우팅된 어댑터를 실행하며, 실행 이벤트와 현재 단계의 로컬 실행 이력을 관리한다.
|
||||
|
||||
## 포함 경로
|
||||
|
||||
|
|
@ -14,11 +14,13 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
- `apps/node/internal/transport/` — edge와의 TCP/protobuf 세션 및 메시지 처리
|
||||
- `apps/node/internal/adapters/` — mock/ollama/vllm/cli 실행 어댑터
|
||||
- `apps/node/internal/store/` — SQLite 실행 이력 저장
|
||||
- `apps/node/README.md` — node 실행 흐름과 adapter/session 경계 설명
|
||||
|
||||
## 제외 경로
|
||||
|
||||
- `apps/edge/` — Node를 관리하는 실행 그룹 컨트롤러 영역
|
||||
- `apps/control-plane/` — 여러 Edge 연결 관리와 운영 제어 API 제공 예정 영역
|
||||
- `apps/web/` — Web Portal 앱 영역
|
||||
- `apps/worker/` — 비동기 작업 처리 예정 영역
|
||||
- `packages/` — 여러 앱이 공유하는 공통 패키지
|
||||
- `proto/` — 앱 간 메시지 계약
|
||||
|
|
@ -27,12 +29,16 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
|
||||
- `runtime.Adapter` — adapter target 실행 계약
|
||||
- `runtime.Router` — 실행 요청을 구체적인 `ExecutionSpec`으로 변환하는 계약
|
||||
- `runtime.CommandHandler` — adapter별 `NodeCommandRequest` 처리 optional 계약
|
||||
- `runtime.SessionTerminator` — logical session 종료를 지원하는 optional 계약
|
||||
- `node.Node` — `transport.Handler` 구현체이자 실행 파이프라인 조정자
|
||||
- `node.runManager` — run ID 기준 `runHandle`(cancel, done) 등록/해제/취소 관리; `node.Node` 내부에서만 사용
|
||||
- `node.sessionSink` — adapter `RuntimeEvent`를 proto `RunEvent`로 변환해 edge session으로 보내는 sink
|
||||
- `transport.Session` — edge와 연결된 node 세션 및 메시지 처리
|
||||
- `adapters.Registry` — 어댑터 등록/조회 및 `LifecycleAdapter` start/stop lifecycle 관리 (실패 시 역순 롤백)
|
||||
- `adapters.LifecycleAdapter` — start/stop lifecycle이 필요한 어댑터의 optional 인터페이스
|
||||
- `adapters.BuildFromPayload()` — edge에서 받은 `NodeConfigPayload`로 `Registry`를 초기화하는 factory
|
||||
- `adapters/cli.CLI` — one-shot, persistent TUI, codex-exec, opencode-sse profile을 실행하는 CLI adapter
|
||||
- `adapters/cli/status` — claude/codex/gemini CLI 상태 파서 (사용량 한도, reset 시각 등)
|
||||
- `adapters/cli.lineEmitter` — stdout 한 줄을 파싱해 `RuntimeEvent`를 반환하는 내부 인터페이스; `emitters.go`에서 format별로 등록
|
||||
- `store.Store` — 실행 상태와 결과 저장
|
||||
|
|
@ -44,15 +50,18 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
- 내부 실행 식별자는 `adapter + target`을 사용한다. 외부 OpenAI-compatible API나 legacy placeholder를 제외하고 `model`을 내부 실행 대표 용어로 되돌리지 않는다.
|
||||
- 어댑터 추가 시 `runtime.Adapter`를 구현하고 `adapters.BuildFromPayload()` 또는 bootstrap registry에 등록한다.
|
||||
- 실행 취소는 run ID 기준으로 `runManager`에 등록하고 실행 종료 시 반드시 `deregister`로 해제한다.
|
||||
- `CancelAction_CANCEL_RUN`은 현재 run 취소, `CancelAction_TERMINATE_SESSION`은 logical session 종료로 구분한다.
|
||||
- `NodeCommandRequest`는 실행 요청과 분리해 `USAGE_STATUS`, `CAPABILITIES`, `SESSION_LIST`, `TRANSPORT_STATUS` 같은 조회/제어성 명령으로 처리한다.
|
||||
- `adapters.Registry`의 start/stop은 bootstrap lifecycle에서만 호출하고 개별 adapter에서 직접 호출하지 않는다.
|
||||
- cli adapter의 출력 format별 파싱 로직은 `lineEmitter` 구현체로 분리하고 `node.Node`에 분기문으로 박지 않는다.
|
||||
- CLI profile mode별 세부 실행(`persistent-lazy`, `codex-exec`, `opencode-sse`)은 `adapters/cli` 내부에 두고, `runtime.Adapter` 계약 밖으로 새 transport를 노출하지 않는다.
|
||||
- node 내부 변경은 가능한 대상 패키지 테스트를 먼저 추가하거나 갱신한다.
|
||||
- `apps/node/cmd/node/**`, `apps/node/internal/bootstrap/**`, `apps/node/internal/transport/**`, `apps/node/internal/node/**`, `apps/node/internal/router/**`, `apps/node/internal/adapters/**`의 실행 요청/응답/stream/cancel/status 경로를 바꾼 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
- `apps/node/cmd/node/**`, `apps/node/internal/bootstrap/**`, `apps/node/internal/transport/**`, `apps/node/internal/node/**`, `apps/node/internal/router/**`, `apps/node/internal/adapters/**`, `apps/node/internal/store/**`의 실행 요청/응답/stream/cancel/status/session 경로를 바꾼 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
|
||||
## 다른 도메인과의 경계
|
||||
|
||||
- **edge**: edge는 node 연결 등록, adapter/runtime 설정 전달, 라우팅 진입, stream relay를 담당한다. node는 edge가 보낸 실행 요청을 처리하고 이벤트를 돌려준다.
|
||||
- **platform-common**: node는 `packages/config`, `packages/observability`, `proto/gen/iop` 등을 사용하지만 공통 타입/설정 자체의 소유자는 platform-common이다.
|
||||
- **edge**: edge는 node 연결 등록, adapter/runtime 설정 전달, 라우팅 진입, stream relay를 담당한다. node는 edge가 보낸 실행/취소/명령 요청을 처리하고 이벤트와 명령 응답을 돌려준다.
|
||||
- **platform-common**: node는 `packages/config`, `packages/events`, `packages/observability`, `proto/gen/iop` 등을 사용하지만 공통 타입/설정/event helper 자체의 소유자는 platform-common이다.
|
||||
- **control-plane 후보**: control-plane은 Node가 아니라 Edge를 통해 시스템을 제어한다. node는 control-plane 직접 연결/직접 스케줄링을 전제로 하지 않는다.
|
||||
|
||||
## 금지 사항
|
||||
|
|
@ -60,4 +69,5 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
- node 도메인 내부에서 gRPC, WebSocket 기본 transport, actor/FSM/plugin framework를 새 기본 구조로 도입하지 않는다.
|
||||
- `proto/gen/iop/*.pb.go` 생성 파일을 직접 수정하지 않는다.
|
||||
- 새 어댑터 구현을 `node.Node`에 직접 분기문으로 박아 넣지 않는다.
|
||||
- edge-local console, OpenAI-compatible HTTP, A2A 같은 입력 표면 책임을 node로 끌어오지 않는다.
|
||||
- placeholder 상태인 control-plane/worker 책임을 node에 임시로 흡수하지 않는다.
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@
|
|||
|
||||
## 목적 / 책임
|
||||
|
||||
여러 앱이 공유하는 설정, 인증, 정책, 메타데이터, 작업 상태, 관측성, 버전, protobuf 계약을 관리한다. 앱별 구현보다 안정적인 공통 계약과 작은 유틸리티를 제공하며, 내부 실행 계약은 `adapter + target` 방향을 우선한다.
|
||||
여러 앱이 공유하는 설정, 인증, 이벤트 helper, host setup, 정책, 메타데이터, 작업 상태, 관측성, 버전, protobuf 계약을 관리한다. 앱별 구현보다 안정적인 공통 계약과 작은 유틸리티를 제공하며, 내부 실행 계약은 `adapter + target` 방향을 우선한다.
|
||||
|
||||
## 포함 경로
|
||||
|
||||
- `packages/auth/` — mTLS 인증 설정 helper
|
||||
- `packages/config/` — 앱 설정 struct, 기본값, YAML 로딩
|
||||
- `packages/events/` — 공통 EdgeNodeEvent 생성 helper와 lifecycle 상수
|
||||
- `packages/hostsetup/` — edge/node systemd 설치 준비와 기본 설정 템플릿
|
||||
- `packages/jobs/` — 작업 상태와 작업 메타데이터 타입
|
||||
- `packages/metadata/` — 공통 metadata map helper
|
||||
- `packages/observability/` — zap logger와 Prometheus health/metrics 서버
|
||||
|
|
@ -22,12 +24,17 @@
|
|||
- `apps/node/` — node 실행 파이프라인과 adapter 관리
|
||||
- `apps/edge/` — 실행 그룹 컨트롤러와 node registry
|
||||
- `apps/control-plane/` — control-plane 앱 구현 예정 영역
|
||||
- `apps/web/` — Next.js Web Portal 앱 영역
|
||||
- `apps/worker/` — worker 앱 구현 예정 영역
|
||||
|
||||
## 주요 구성 요소
|
||||
|
||||
- `config.NodeConfig` / `config.EdgeConfig` — 앱 설정 계약
|
||||
- `config.NodeConfig` / `config.EdgeConfig` — node/edge 앱 설정 계약
|
||||
- `config.EdgeOpenAIConf` / `config.EdgeA2AConf` / `config.EdgeConsoleConf` — edge 입력 표면과 console 기본 설정 계약
|
||||
- `config.CLIProfileConf` / `config.CompletionMarkerConf` — CLI adapter profile과 completion marker 설정 계약
|
||||
- `auth.LoadServerTLS` / `auth.LoadClientTLS` — mTLS TLS config 생성
|
||||
- `events.NewEdgeNodeEvent()` — node/edge lifecycle event envelope 생성
|
||||
- `hostsetup.Run()` / `hostsetup.EdgeSpec()` / `hostsetup.NodeSpec()` — systemd unit, 설정 파일, 데이터 디렉터리 준비
|
||||
- `observability.NewLogger` / `observability.ServeMetrics` — 공통 로깅/메트릭
|
||||
- `policy.Engine` — 정책 적용/검증 계약
|
||||
- `jobs.Job` — 비동기 작업 상태 placeholder; 내부 실행 대상은 `target`으로 표현
|
||||
|
|
@ -37,22 +44,25 @@
|
|||
|
||||
- 공통 패키지는 특정 앱의 내부 패키지를 import하지 않는다.
|
||||
- 설정 struct 필드 변경 시 YAML tag, mapstructure tag, default, `configs/*.yaml` 예시를 함께 확인한다.
|
||||
- host setup 기본 템플릿을 바꿀 때는 `packages/hostsetup`의 `EdgeSpec`/`NodeSpec`, 기본 경로, systemd unit, 관련 CLI `setup` 옵션과 함께 확인한다.
|
||||
- protobuf 계약 변경은 `proto/iop/*.proto`에서 시작하고 `make proto`로 생성물을 갱신한다.
|
||||
- 생성 파일(`proto/gen/iop/*.pb.go`)은 사람이 직접 편집하지 않는다.
|
||||
- 공통 패키지는 작고 명확한 계약을 유지하고 앱별 정책을 과도하게 끌어올리지 않는다.
|
||||
- 공통 event helper는 envelope 생성과 상수 정의까지만 담당하고, edge 내부 fanout/replay/store 정책은 edge 도메인에 둔다.
|
||||
- `RunRequest`, `ExecutionSpec`, `NodeCommandRequest`, job/history 계열 계약을 변경할 때 내부 실행 용어는 `target`을 우선하고, `model`은 외부 호환 경계인지 확인한다.
|
||||
- `packages/config/**`, `configs/**`, `proto/iop/**`처럼 edge-node 실행 설정이나 메시지 계약에 영향을 주는 작업을 한 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
- `packages/config/**`, `packages/events/**`, `packages/hostsetup/**`, `configs/**`, `proto/iop/**`처럼 edge-node 실행 설정, setup, lifecycle event, 메시지 계약에 영향을 주는 작업을 한 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
|
||||
|
||||
## 다른 도메인과의 경계
|
||||
|
||||
- **node**: node가 필요로 하는 설정/타입/계약을 제공하지만 실행 파이프라인의 소유자는 node이다.
|
||||
- **edge**: edge가 필요로 하는 설정/관측성/protobuf 계약을 제공하지만 실행 그룹 제어와 node registry 동작의 소유자는 edge이다.
|
||||
- **control-plane/worker 후보**: 두 앱이 구현되면 필요한 공통 타입만 이 영역으로 승격하고 앱 내부 책임은 각 도메인에 둔다.
|
||||
- **control-plane/web/worker 후보**: 앱별 구현이 진행될 때 필요한 공통 타입만 이 영역으로 승격하고 앱 내부 책임은 각 도메인에 둔다.
|
||||
|
||||
## 금지 사항
|
||||
|
||||
- `packages`에서 `apps/*/internal` 패키지를 import하지 않는다.
|
||||
- 앱 하나만을 위한 임시 타입을 충분한 근거 없이 공통 패키지로 승격하지 않는다.
|
||||
- edge fanout bus, web UI state, control-plane session 관리처럼 특정 앱의 운영 상태를 공통 패키지로 끌어올리지 않는다.
|
||||
- 내부 실행 계약을 확장하면서 `model` 중심 명명을 되살리지 않는다. 외부 API 호환이 필요한 경우 경계와 변환 위치를 명시한다.
|
||||
- protobuf 생성물을 직접 수정하지 않는다.
|
||||
- 설정 파일만 바꾸고 `packages/config`의 로딩/default와 불일치하게 두지 않는다.
|
||||
|
|
|
|||
|
|
@ -9,11 +9,16 @@
|
|||
- `Makefile` — 공식 test target과 보조 smoke target을 선언하는 위치이다.
|
||||
- `bin/edge.sh` — 사용자가 edge console/server를 실행하는 shell entrypoint이며 bin shell 사용자 흐름 검증의 기준 대상이다.
|
||||
- `bin/node.sh` — 사용자가 node를 edge에 연결하는 shell entrypoint이며 bin shell 사용자 흐름 검증의 기준 대상이다.
|
||||
- `bin/web.sh` — 사용자가 Web Portal dev server를 실행하는 shell entrypoint이다.
|
||||
- `bin/build/field-binaries.sh` — field 배포용 edge/node 바이너리 build entrypoint이다.
|
||||
- `scripts/e2e-smoke.sh` — mock/real profile 기반 보조 edge-node smoke 검증이다.
|
||||
- `scripts/e2e-openai-ollama.sh` — OpenAI-compatible Ollama 입력 표면 보조 smoke 검증이다.
|
||||
|
||||
## 제외 경로
|
||||
|
||||
- `apps/node/` — node 실행 구현의 소유자는 node 도메인이다. testing 도메인은 작업 후 검증 기준만 정의한다.
|
||||
- `apps/edge/` — edge 실행 구현의 소유자는 edge 도메인이다. testing 도메인은 작업 후 검증 기준만 정의한다.
|
||||
- `apps/web/` — Web Portal 구현의 소유자는 별도 후보 도메인이다. testing 도메인은 entrypoint와 검증 기준만 정의한다.
|
||||
- `packages/` 및 `proto/` — 공통 계약의 소유자는 platform-common 도메인이다. testing 도메인은 해당 변경 후 필요한 검증 기준만 정의한다.
|
||||
|
||||
## 주요 구성 요소
|
||||
|
|
@ -22,6 +27,8 @@
|
|||
- `go test ./...` — 저장소 전체 Go 테스트 회귀 검증이다.
|
||||
- bin shell 사용자 흐름 검증 — 사용자가 하듯이 `bin/edge.sh`와 `bin/node.sh`를 각각 실행하고, edge console에서 메시지 2회와 command 명령을 직접 보내 결과가 edge 화면에 도착하는지 확인하는 기준 검증이다.
|
||||
- 보조 E2E smoke — 임시 설정과 mock adapter로 최소 생존을 빠르게 확인하는 보조 검증이다. 이 결과만으로 완료 처리하지 않는다.
|
||||
- OpenAI-compatible Ollama smoke — `scripts/e2e-openai-ollama.sh`로 OpenAI HTTP 입력 표면이 edge service와 node adapter 경로로 수렴하는지 확인하는 보조 검증이다.
|
||||
- Web Portal verify — `apps/web` 변경 시 `npm run verify --prefix apps/web` 기준으로 TypeScript check와 production build를 확인한다.
|
||||
- full-cycle 실제 구동 — 비효율적이어도 관련 사용자 명령과 실행 cycle을 한 번씩 실제 entrypoint로 통과시키는 검증이다.
|
||||
- 실제 외부 CLI 검증 — `claude`, `gemini`, `codex`, `opencode`처럼 외부 CLI 설치와 계정/환경이 필요한 기준 profile을 실제 호출하는 검증이다.
|
||||
|
||||
|
|
@ -29,7 +36,7 @@
|
|||
|
||||
- 테스트는 테스트 파일 변경 여부가 아니라 작업 영향 범위로 결정한다.
|
||||
- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 일반 Go 테스트와 `bin/edge.sh` + `bin/node.sh` 기반 bin shell 사용자 흐름을 반드시 검증한다. 보조 E2E smoke는 추가로 수행할 수 있지만 완료 기준이 아니다.
|
||||
- 사용자 실행 파이프라인에는 `bin/**`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/config/**`, 관련 protobuf 계약 변경이 포함된다.
|
||||
- 사용자 실행 파이프라인에는 `bin/**`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry/input surface, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/config/**`, `packages/hostsetup/**`, 관련 protobuf 계약 변경이 포함된다.
|
||||
- bin shell 사용자 흐름 검증은 `bin/edge.sh`와 `bin/node.sh`를 별도 프로세스로 직접 실행하고, edge console prompt에 명령을 한 줄씩 입력한 뒤 기대 출력이 도착한 것을 확인하고 다음 입력으로 넘어간다.
|
||||
- 메시지 검증 기준은 edge console에서 같은 session으로 메시지 2회를 보내고, 각 요청마다 `[edge] sent`, `[node-*-event] start`, 비어 있지 않은 `[node-*-message]`, `[node-*-event] complete`가 edge 화면에 표시되는 것이다.
|
||||
- 완료 이벤트만으로 정상 판정하지 않는다. node 로컬 출력에 생성된 `[node-message]` payload가 edge console의 `[node-*-message]` 출력에 모두 표시되어야 하며, complete event는 모든 message payload가 edge에 도착한 뒤의 마감 신호로 본다.
|
||||
|
|
@ -38,7 +45,9 @@
|
|||
- 보조 E2E smoke에서는 최소한 node 등록, `/nodes` 확인, console 메시지 전송, delta/message 출력, complete event를 확인한다.
|
||||
- full-cycle 실제 구동에서는 startup/register, foreground run, session 변경, background run, terminate-session, status, 관련 routing/cancel/timeout/persistent session cycle을 실제 entrypoint로 한 번씩 통과시킨다.
|
||||
- 상세 수행 절차와 기능별 체크리스트는 `agent-ops/skills/project/e2e-smoke/SKILL.md`를 따른다.
|
||||
- `make test-e2e` 또는 `scripts/e2e-smoke.sh`는 보조 smoke 명령이다. 실행할 수 있으면 보조 확인으로 기록하되, bin shell 사용자 흐름을 대체하지 않는다.
|
||||
- `make test-e2e`, `scripts/e2e-smoke.sh`, `scripts/e2e-openai-ollama.sh`는 보조 smoke 명령이다. 실행할 수 있으면 보조 확인으로 기록하되, bin shell 사용자 흐름을 대체하지 않는다.
|
||||
- `bin/build/field-binaries.sh` 변경 시 최소 현재 host target build를 실행하고 산출물 위치와 checksum 생성을 확인한다.
|
||||
- `bin/web.sh` 또는 `apps/web/**` 변경 시 `npm run verify --prefix apps/web`를 실행하고, dev server entrypoint 변경이면 `./bin/web.sh` 기동 가능 여부도 확인한다.
|
||||
- 풀테스트에서는 실제 외부 CLI profile 검증을 필수로 수행한다. 환경, 계정, provider, 원격 endpoint 문제로 호출할 수 없거나 실패한 profile은 누락하지 말고 profile별 실패 또는 blocker로 보고한다.
|
||||
- 작업 최종 보고에는 실행한 테스트 명령, bin shell 사용자 흐름 수행 여부, 보조 E2E smoke 수행 여부, full-cycle 실제 구동 수행 여부를 명시한다. 수행하지 못한 필수 검증은 이유와 남은 위험을 함께 적는다.
|
||||
|
||||
|
|
@ -90,13 +99,14 @@ terminated session default node=test-node
|
|||
## 다른 도메인과의 경계
|
||||
|
||||
- **node**: node는 adapter 실행과 edge 연결 구현을 소유한다. testing은 node 변경 후 어떤 검증을 거칠지 정한다.
|
||||
- **edge**: edge는 registry, service, transport, console 구현을 소유한다. testing은 edge 변경 후 사용자 실행 흐름을 어떻게 확인할지 정한다.
|
||||
- **edge**: edge는 registry, service, transport, console, HTTP/A2A input surface 구현을 소유한다. testing은 edge 변경 후 사용자 실행 흐름을 어떻게 확인할지 정한다.
|
||||
- **platform-common**: platform-common은 config/proto 계약을 소유한다. testing은 해당 계약 변경이 edge-node 실행 흐름에 닿을 때 필요한 검증을 정한다.
|
||||
- **web 후보**: Web Portal 구현 자체는 testing 도메인이 소유하지 않는다. testing은 web entrypoint와 verify 명령 기준만 다룬다.
|
||||
|
||||
## 금지 사항
|
||||
|
||||
- 사용자 실행 파이프라인에 닿는 변경을 하고 유닛/패키지 테스트만으로 완료 처리하지 않는다.
|
||||
- `make test-e2e`, `scripts/e2e-smoke.sh`, 또는 smoke 통과 출력만으로 완료 처리하지 않는다.
|
||||
- `make test-e2e`, `scripts/e2e-smoke.sh`, `scripts/e2e-openai-ollama.sh`, 또는 smoke 통과 출력만으로 완료 처리하지 않는다.
|
||||
- 관련 작업 후 full-cycle 실제 구동을 비용이 크다는 이유만으로 생략하지 않는다.
|
||||
- 보조 E2E smoke를 외부 CLI 설치, 로그인, 네트워크 계정 상태에 의존하게 만들지 않는다.
|
||||
- 검증을 위해 기본 `configs/*.yaml`을 임시값으로 오염시키지 않는다. 임시 설정 파일이나 환경 변수 override를 사용한다.
|
||||
|
|
|
|||
|
|
@ -7,22 +7,25 @@
|
|||
|
||||
## 프로젝트 개요
|
||||
|
||||
- IOP(Inference Operations Platform)는 Control Plane - Edge - Node 계층 구조를 기반으로 모델 서빙과 CLI Agent/Automation 실행을 함께 다루는 Go 실행 오케스트레이션 모노레포이다.
|
||||
- IOP(Inference Operations Platform)는 Control Plane - Edge - Node 계층 구조를 기반으로 모델 서빙과 CLI Agent/Automation 실행을 함께 다루는 실행 오케스트레이션 모노레포이다. 핵심 서비스는 Go이고 Web Portal은 Next.js 스캐폴드로 둔다.
|
||||
- 내부 실행 개념은 model 중심이 아니라 `adapter + target` 중심으로 정리한다. 외부 OpenAI-compatible 경계나 외부 CLI 인자에서는 호환성을 위해 `model` 표현이 남을 수 있다.
|
||||
- 현재 1차 구현 중심은 `apps/node`와 `apps/edge`의 Edge-Node 실행 스켈레톤이며, CLI adapter와 node 등록/레지스트리/transport가 우선 검증되고 있다.
|
||||
- `apps/control-plane`과 `apps/worker`는 README와 CLI placeholder 수준이므로, 본격 구현 전 별도 domain rule을 만들거나 갱신한다.
|
||||
- 현재 1차 구현 중심은 `apps/node`와 `apps/edge`의 Edge-Node 실행 스켈레톤이며, CLI adapter, node 등록/레지스트리/transport, edge input surface가 우선 검증되고 있다.
|
||||
- `apps/control-plane`은 health/readiness HTTP와 wire endpoint 예약을 가진 scaffold이고, `apps/web`은 Next.js Portal scaffold이다. 본격 구현 전 별도 domain rule을 만들거나 갱신한다.
|
||||
- `apps/worker`는 CLI placeholder 수준이므로 본격 구현 전 별도 domain rule을 만들거나 갱신한다.
|
||||
|
||||
## 주요 구조
|
||||
|
||||
- `apps/node/` — Edge에 연결되는 실행자. 런타임 라우팅, adapter execution, CLI/model runtime 실행, 현재 단계의 로컬 실행 이력 저장을 담당한다.
|
||||
- `apps/edge/` — 여러 Node를 묶는 백엔드 실행 그룹 컨트롤러. token 기반 등록, node registry, node 설정 전달, routing, stream relay를 담당한다.
|
||||
- `apps/control-plane/` — 향후 여러 Edge를 연결하고 상태 조회/설정 변경/명령 전달/이벤트 수신/운영 제어 API 제공을 담당할 Go 기반 중앙 관리 서버이다. 현재 placeholder이다.
|
||||
- `apps/edge/` — 여러 Node를 묶는 백엔드 실행 그룹 컨트롤러. token 기반 등록, node registry, node 설정 전달, routing, stream relay, ops console, OpenAI-compatible/A2A 입력 표면을 담당한다.
|
||||
- `apps/control-plane/` — 향후 여러 Edge를 연결하고 상태 조회/설정 변경/명령 전달/이벤트 수신/운영 제어 API 제공을 담당할 Go 기반 중앙 관리 서버 scaffold이다.
|
||||
- `apps/web/` — IOP 전체 Web Portal을 위한 Next.js scaffold이다.
|
||||
- `apps/worker/` — 비동기 작업 처리 예정 영역이다. 현재 placeholder이다.
|
||||
- `packages/` — 설정, 인증, 정책, 메타데이터, 작업, 관측성, 버전 등 공통 패키지이다.
|
||||
- `packages/` — 설정, 인증, 이벤트 helper, host setup, 정책, 메타데이터, 작업, 관측성, 버전 등 공통 패키지이다.
|
||||
- `proto/iop/` — IOP 메시지 계약 원본이다.
|
||||
- `proto/gen/iop/` — protobuf 생성물이다.
|
||||
- `configs/` — 앱별 YAML 설정 예시이다.
|
||||
- `bin/` — 사용자가 직접 실행하는 edge/node shell entrypoint이다.
|
||||
- `bin/` — 사용자가 직접 실행하는 edge/node/web shell entrypoint와 field binary build entrypoint이다.
|
||||
- `scripts/` — 보조 E2E smoke와 입력 표면 검증 스크립트이다.
|
||||
- `Makefile` — 빌드와 테스트 진입점을 정의한다.
|
||||
- `docs/` — 아키텍처 및 운영 방향 문서이다.
|
||||
- `agent-ops/roadmap/` — 제품 목표, 단계, 마일스톤의 단일 기준 문서이다.
|
||||
|
|
@ -30,6 +33,7 @@
|
|||
## 기술 스택
|
||||
|
||||
- 언어/모듈: Go `1.24`, module `iop`
|
||||
- Web Portal: Next.js `16`, React `19`, TypeScript, Tailwind CSS
|
||||
- CLI: `github.com/spf13/cobra`
|
||||
- 설정: `github.com/spf13/viper`, YAML
|
||||
- DI: `go.uber.org/fx`
|
||||
|
|
@ -77,11 +81,13 @@
|
|||
| `proto/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
|
||||
| `configs/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
|
||||
| `bin/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `scripts/e2e-*.sh` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `Makefile` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
|
||||
## 도메인 후보
|
||||
|
||||
- `control-plane`: `apps/control-plane/**`가 placeholder를 넘어 여러 Edge 연결 관리, Edge 상태 조회, Edge 설정 변경, Edge 명령 전달, 이벤트 수신, 운영 제어 API 제공을 구현하기 시작할 때 생성한다.
|
||||
- `control-plane`: `apps/control-plane/**`가 scaffold를 넘어 여러 Edge 연결 관리, Edge 상태 조회, Edge 설정 변경, Edge 명령 전달, 이벤트 수신, 운영 제어 API 제공을 구현하기 시작할 때 생성한다.
|
||||
- `web`: `apps/web/**`가 Portal scaffold를 넘어 노드/모델/작업/운영 화면과 Control Plane 통신을 본격 구현하기 시작할 때 생성한다.
|
||||
- `worker`: `apps/worker/**`가 placeholder를 넘어 작업 큐 소비/재시도/결과 저장을 구현하기 시작할 때 생성한다.
|
||||
|
||||
## 스킬 라우팅
|
||||
|
|
|
|||
Loading…
Reference in a new issue