4.1 KiB
4.1 KiB
node
목적 / 책임
디바이스당 1개 실행되는 IOP 노드 에이전트 영역이다. edge에서 들어온 실행 요청을 runtime 요청으로 변환하고, 라우팅된 어댑터를 실행하며, 실행 이벤트와 이력을 관리한다.
포함 경로
apps/node/cmd/node/— node CLI 진입점과 서브커맨드apps/node/internal/bootstrap/— fx 의존성 주입과 adapter registry 구성apps/node/internal/node/— transport handler 구현과 실행 오케스트레이션apps/node/internal/runtime/— node 도메인 타입과 핵심 인터페이스apps/node/internal/router/— RunRequest를 ExecutionSpec으로 해석하는 라우팅apps/node/internal/transport/— edge와의 TCP/protobuf 세션 및 메시지 처리apps/node/internal/adapters/— mock/ollama/vllm/cli 실행 어댑터apps/node/internal/store/— SQLite 실행 이력 저장
제외 경로
apps/edge/— node를 받아들이는 gateway 서버 영역apps/control-plane/— 노드 등록/정책/스케줄링 예정 영역apps/worker/— 비동기 작업 처리 예정 영역packages/— 여러 앱이 공유하는 공통 패키지proto/— 앱 간 메시지 계약
주요 구성 요소
runtime.Adapter— 모델/CLI 실행 어댑터 계약runtime.Router— 실행 요청을 구체적인ExecutionSpec으로 변환하는 계약node.Node—transport.Handler구현체이자 실행 파이프라인 조정자node.runManager— run ID 기준runHandle(cancel, done) 등록/해제/취소 관리;node.Node내부에서만 사용transport.Session— edge와 연결된 node 세션 및 메시지 처리adapters.Registry— 어댑터 등록/조회 및LifecycleAdapterstart/stop lifecycle 관리 (실패 시 역순 롤백)adapters.LifecycleAdapter— start/stop lifecycle이 필요한 어댑터의 optional 인터페이스adapters.BuildFromPayload()— edge에서 받은NodeConfigPayload로Registry를 초기화하는 factoryadapters/cli/status— claude/codex/gemini CLI 상태 파서 (사용량 한도, reset 시각 등)adapters/cli.lineEmitter— stdout 한 줄을 파싱해RuntimeEvent를 반환하는 내부 인터페이스;emitters.go에서 format별로 등록store.Store— 실행 상태와 결과 저장
유지할 패턴
runtime패키지에는 도메인 타입과 인터페이스를 두고 구체 구현 의존성을 넣지 않는다.- transport/proto 타입은
node.Node경계에서 runtime 타입으로 변환한다. - 어댑터 추가 시
runtime.Adapter를 구현하고adapters.BuildFromPayload()또는 bootstrap registry에 등록한다. - 실행 취소는 run ID 기준으로
runManager에 등록하고 실행 종료 시 반드시deregister로 해제한다. adapters.Registry의 start/stop은 bootstrap lifecycle에서만 호출하고 개별 adapter에서 직접 호출하지 않는다.- cli adapter의 출력 format별 파싱 로직은
lineEmitter구현체로 분리하고node.Node에 분기문으로 박지 않는다. - node 내부 변경은 가능한 대상 패키지 테스트를 먼저 추가하거나 갱신한다.
다른 도메인과의 경계
- edge: edge는 node 연결 등록과 중앙 설정 전달, 라우팅 진입을 담당한다. node는 edge가 보낸 실행 요청을 처리하고 이벤트를 돌려준다.
- platform-common: node는
packages/config,packages/observability,proto/gen/iop등을 사용하지만 공통 타입/설정 자체의 소유자는 platform-common이다. - control-plane 후보: 정책/스케줄링의 시스템 단위 결정은 control-plane에서 다루고, node는 전달받은 실행 단위 수행에 집중한다.
금지 사항
- node 도메인 내부에서 gRPC, WebSocket 기본 transport, actor/FSM/plugin framework를 새 기본 구조로 도입하지 않는다.
proto/gen/iop/*.pb.go생성 파일을 직접 수정하지 않는다.- 새 어댑터 구현을
node.Node에 직접 분기문으로 박아 넣지 않는다. - placeholder 상태인 control-plane/worker 책임을 node에 임시로 흡수하지 않는다.