diff --git a/agent-ops/rules/project/domain/edge/rules.md b/agent-ops/rules/project/domain/edge/rules.md index 691ff52..7e6b053 100644 --- a/agent-ops/rules/project/domain/edge/rules.md +++ b/agent-ops/rules/project/domain/edge/rules.md @@ -22,17 +22,23 @@ ## 주요 구성 요소 -- `transport.Server` — proto-socket TCP 서버 wrapper -- `node.Registry` — 연결된 node의 `NodeEntry` 저장/조회 +- `transport.Server` — proto-socket TCP 서버 wrapper; NodeStore와 Registry를 모두 주입받아 등록 흐름을 처리 +- `node.Registry` — 연결된 node의 `NodeEntry` 저장/조회 (ID·alias 이중 인덱스, 동시성 안전) - `node.NodeEntry` — node ID, alias, TCP client 정보 +- `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/`) ## 유지할 패턴 - edge는 사전 등록된 node 정의를 검증하고 연결 상태를 registry에 반영하는 역할을 먼저 안정화한다. - 외부 OpenAI-compatible HTTP API는 node/transport 안정화 이후 확장한다. - node가 연결 직후 RegisterRequest를 보내고 edge가 RegisterResponse로 중앙 설정을 응답하는 흐름을 유지한다. -- registry는 동시성 안전성을 유지하고 외부로 내부 map을 노출하지 않는다. +- Registry는 동시성 안전성을 유지하고 외부로 내부 map을 노출하지 않는다. +- NodeStore는 설정 파일에서 한 번 seed되며 런타임 중 변경하지 않는다; token 중복·빈 token은 LoadFromConfig에서 즉시 거부한다. +- adapter config 변환(mapper)은 `node.BuildConfigPayload()`에서만 수행하고 transport 레이어에 변환 로직을 두지 않는다. ## 다른 도메인과의 경계 diff --git a/agent-ops/rules/project/domain/node/rules.md b/agent-ops/rules/project/domain/node/rules.md index 7b01fe2..034d62a 100644 --- a/agent-ops/rules/project/domain/node/rules.md +++ b/agent-ops/rules/project/domain/node/rules.md @@ -28,16 +28,23 @@ - `runtime.Adapter` — 모델/CLI 실행 어댑터 계약 - `runtime.Router` — 실행 요청을 구체적인 `ExecutionSpec`으로 변환하는 계약 - `node.Node` — `transport.Handler` 구현체이자 실행 파이프라인 조정자 -- `transport.Session` — edge와 연결된 node 세션 및 실행 취소 함수 관리 -- `adapters.Registry` — 사용 가능한 node 어댑터 등록/조회 +- `node.runManager` — run ID 기준 `runHandle`(cancel, done) 등록/해제/취소 관리; `node.Node` 내부에서만 사용 +- `transport.Session` — edge와 연결된 node 세션 및 메시지 처리 +- `adapters.Registry` — 어댑터 등록/조회 및 `LifecycleAdapter` start/stop lifecycle 관리 (실패 시 역순 롤백) +- `adapters.LifecycleAdapter` — start/stop lifecycle이 필요한 어댑터의 optional 인터페이스 +- `adapters.BuildFromPayload()` — edge에서 받은 `NodeConfigPayload`로 `Registry`를 초기화하는 factory +- `adapters/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`를 구현하고 bootstrap registry에 등록한다. -- 실행 취소는 run ID 기준으로 세션에 등록하고 실행 종료 시 반드시 해제한다. +- 어댑터 추가 시 `runtime.Adapter`를 구현하고 `adapters.BuildFromPayload()` 또는 bootstrap registry에 등록한다. +- 실행 취소는 run ID 기준으로 `runManager`에 등록하고 실행 종료 시 반드시 `deregister`로 해제한다. +- `adapters.Registry`의 start/stop은 bootstrap lifecycle에서만 호출하고 개별 adapter에서 직접 호출하지 않는다. +- cli adapter의 출력 format별 파싱 로직은 `lineEmitter` 구현체로 분리하고 `node.Node`에 분기문으로 박지 않는다. - node 내부 변경은 가능한 대상 패키지 테스트를 먼저 추가하거나 갱신한다. ## 다른 도메인과의 경계