refactor: migrate packages to packages/go/ structure

This commit is contained in:
toki 2026-06-01 10:03:55 +09:00
parent e4d22b3383
commit c6baac391c
82 changed files with 99 additions and 97 deletions

View file

@ -238,7 +238,8 @@ NomadCode
| `apps/edge` | Node/domain agent registry, 설정 전달, bootstrap, routing, stream relay를 담당하는 Edge skeleton |
| `apps/control-plane` | 여러 Edge를 연결하고 Client과 통신할 Go 기반 운영 제어 서버 스캐폴드 |
| `apps/worker` | 현재 placeholder이며, Worker 구조는 우선 각 Go 서비스 내부 공통 모듈 방향으로 둔다 |
| `packages` | Go 공통 패키지와 언어별 재사용 패키지 root. Flutter 패키지는 `packages/flutter/` 아래에 둔다 |
| `packages/go` | 설정, 인증, 정책, 작업, 관측성, 버전 등 Go 공통 패키지 |
| `packages/flutter` | Flutter 재사용 패키지 root. 현재 `iop_console` package를 둔다 |
| `proto` | 앱 간 메시지 계약 원본과 생성물 |
| `configs` | 현재 개발용 설정 예시 |

View file

@ -35,7 +35,7 @@ IOP의 공식 Flutter client UI/UX 영역이다. Control Plane HTTP/WS endpoint
- `apps/control-plane/` — Client가 연결하는 Control Plane server와 wire endpoint 구현 영역
- `apps/edge/` — Edge-local 실행 그룹과 node registry/operation 소유자
- `apps/node/` — adapter execution과 runtime session 소유자
- `packages/*` — Go 공통 설정/관측성/정책 helper 영역. 단, `packages/flutter/iop_console/`은 client domain에 포함한다.
- `packages/go/**` — Go 공통 설정/관측성/정책 helper 영역.
- `proto/iop/` — protobuf 계약 원본
- `proto/gen/iop/` — Go protobuf 생성물
- `scripts/dev/` — repo 내부 개발 실행 helper 영역

View file

@ -23,7 +23,7 @@ last_rule_updated_at: 2026-06-01
- `apps/client/` — Control Plane을 소비하는 Flutter client UI/UX 영역
- `apps/node/` — 실제 adapter execution과 runtime session의 소유자
- `apps/worker/` — 비동기 작업 처리 예정 영역
- `packages/` — 여러 앱이 공유하는 공통 패키지
- `packages/go/` — 여러 앱이 공유하는 Go 공통 패키지
- `proto/` — 메시지 계약 원본과 생성물
- `configs/` — 앱별 설정 예시와 공통 설정 계약 확인 영역

View file

@ -30,7 +30,7 @@ last_rule_updated_at: 2026-06-01
- `apps/control-plane/` — 여러 Edge 연결 관리와 운영 제어 API 제공 영역
- `apps/client/` — Control Plane을 소비하는 Flutter client UI/UX 영역
- `apps/worker/` — 비동기 작업 처리 예정 영역
- `packages/` — 공통 설정/관측성/인증 패키지
- `packages/go/` — 공통 설정/관측성/인증 Go 패키지
- `proto/` — 메시지 계약 원본과 생성물
## 주요 구성 요소

View file

@ -27,7 +27,7 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
- `apps/edge/` — Node를 관리하는 실행 그룹 컨트롤러 영역
- `apps/control-plane/` — 여러 Edge 연결 관리와 운영 제어 API 제공 영역
- `apps/worker/` — 비동기 작업 처리 예정 영역
- `packages/` — 여러 앱이 공유하는 공통 패키지
- `packages/go/` — 여러 앱이 공유하는 Go 공통 패키지
- `proto/` — 앱 간 메시지 계약
## 주요 구성 요소
@ -77,7 +77,7 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
## 다른 도메인과의 경계
- **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이다.
- **platform-common**: node는 `packages/go/config`, `packages/go/events`, `packages/go/observability`, `proto/gen/iop` 등을 사용하지만 공통 타입/설정/event helper 자체의 소유자는 platform-common이다.
- **control-plane**: control-plane은 Node가 아니라 Edge를 통해 시스템을 제어한다. node는 control-plane 직접 연결/직접 스케줄링을 전제로 하지 않는다.
## 금지 사항

View file

@ -12,15 +12,15 @@ last_rule_updated_at: 2026-06-01
## 포함 경로
- `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 서버
- `packages/policy/` — 정책 엔진 인터페이스와 passthrough 구현
- `packages/version/` — 앱 버전 상수
- `packages/go/auth/` — mTLS 인증 설정 helper
- `packages/go/config/` — 앱 설정 struct, 기본값, YAML 로딩
- `packages/go/events/` — 공통 EdgeNodeEvent 생성 helper와 lifecycle 상수
- `packages/go/hostsetup/` — edge/node systemd 설치 준비와 기본 설정 템플릿
- `packages/go/jobs/` — 작업 상태와 작업 메타데이터 타입
- `packages/go/metadata/` — 공통 metadata map helper
- `packages/go/observability/` — zap logger와 Prometheus health/metrics 서버
- `packages/go/policy/` — 정책 엔진 인터페이스와 passthrough 구현
- `packages/go/version/` — 앱 버전 상수
- `proto/iop/` — protobuf 메시지 계약 원본
- `proto/gen/iop/` — protobuf 생성물
- `configs/` — 앱별 설정 예시
@ -57,7 +57,7 @@ last_rule_updated_at: 2026-06-01
- 공통 패키지는 특정 앱의 내부 패키지를 import하지 않는다.
- 설정 struct 필드 변경 시 YAML tag, mapstructure tag, default, `configs/*.yaml` 예시를 함께 확인한다.
- host setup 기본 템플릿을 바꿀 때는 `packages/hostsetup`의 `EdgeSpec`/`NodeSpec`, 기본 경로, systemd unit, 관련 CLI `setup` 옵션과 함께 확인한다.
- host setup 기본 템플릿을 바꿀 때는 `packages/go/hostsetup`의 `EdgeSpec`/`NodeSpec`, 기본 경로, systemd unit, 관련 CLI `setup` 옵션과 함께 확인한다.
- protobuf 계약 변경은 `proto/iop/*.proto`에서 시작하고 `make proto`로 Go 생성물을 갱신한다.
- Client가 소비하는 proto 계약을 변경하면 `make proto-dart``apps/client/lib/gen/proto/iop/*.dart` 생성물도 갱신한다.
- 생성 파일(`proto/gen/iop/*.pb.go`)은 사람이 직접 편집하지 않는다.
@ -66,7 +66,7 @@ last_rule_updated_at: 2026-06-01
- `RunRequest`, `ExecutionSpec`, `NodeCommandRequest`, `CLIProfileConfig`, job/history 계열 계약을 변경할 때 내부 실행 용어는 `target`을 우선하고, `model`은 외부 호환 경계인지 확인한다.
- Control Plane hello 계열 proto는 Edge/Node scheduling 계약으로 확장하지 않는다.
- Control Plane-Edge status proto는 Edge-owned snapshot을 표현한다. Node address, token, direct scheduling 필드를 싣지 않는다.
- `packages/config/**`, `packages/events/**`, `packages/hostsetup/**`, `configs/**`, `proto/iop/**`처럼 edge-node 실행 설정, setup, lifecycle event, 메시지 계약에 영향을 주는 작업을 한 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
- `packages/go/config/**`, `packages/go/events/**`, `packages/go/hostsetup/**`, `configs/**`, `proto/iop/**`처럼 edge-node 실행 설정, setup, lifecycle event, 메시지 계약에 영향을 주는 작업을 한 뒤에는 `testing` domain rule의 작업 후 검증 기준을 따른다.
## 다른 도메인과의 경계
@ -76,10 +76,10 @@ last_rule_updated_at: 2026-06-01
## 금지 사항
- `packages`에서 `apps/*/internal` 패키지를 import하지 않는다.
- `packages/go`에서 `apps/*/internal` 패키지를 import하지 않는다.
- 앱 하나만을 위한 임시 타입을 충분한 근거 없이 공통 패키지로 승격하지 않는다.
- edge fanout bus, web UI state, control-plane session 관리처럼 특정 앱의 운영 상태를 공통 패키지로 끌어올리지 않는다.
- 내부 실행 계약을 확장하면서 `model` 중심 명명을 되살리지 않는다. 외부 API 호환이 필요한 경우 경계와 변환 위치를 명시한다.
- protobuf 생성물을 직접 수정하지 않는다.
- Client Dart protobuf 생성물을 proto 원본과 불일치하게 두지 않는다.
- 설정 파일만 바꾸고 `packages/config`의 로딩/default와 불일치하게 두지 않는다.
- 설정 파일만 바꾸고 `packages/go/config`의 로딩/default와 불일치하게 두지 않는다.

View file

@ -27,7 +27,7 @@ last_rule_updated_at: 2026-06-01
- `apps/edge/` — edge 실행 구현의 소유자는 edge 도메인이다. testing 도메인은 작업 후 검증 기준만 정의한다.
- `apps/control-plane/` — Control Plane 구현의 소유자는 control-plane 도메인이다. testing 도메인은 작업 후 검증 기준만 정의한다.
- `apps/client/` — Flutter client 구현과 client test 파일의 소유자는 client 도메인이다. testing 도메인은 작업 후 검증 기준만 정의한다.
- `packages/` 및 `proto/` — 공통 계약의 소유자는 platform-common 도메인이다. testing 도메인은 해당 변경 후 필요한 검증 기준만 정의한다.
- `packages/go/` 및 `proto/` — 공통 계약의 소유자는 platform-common 도메인이다. testing 도메인은 해당 변경 후 필요한 검증 기준만 정의한다.
## 주요 구성 요소
@ -49,7 +49,7 @@ last_rule_updated_at: 2026-06-01
- 테스트는 테스트 파일 변경 여부가 아니라 작업 영향 범위로 결정한다.
- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 일반 Go 테스트와 변경 범위에 맞는 full-cycle 실제 구동을 검증한다. repo 내부 edge-node 진단에는 `scripts/dev/edge.sh` + `scripts/dev/node.sh`를 사용할 수 있지만, field 사용자 기본 UX는 bootstrap 명령으로 확인한다.
- 사용자 실행 파이프라인에는 `scripts/dev/**`, `scripts/e2e-*.sh`, `Makefile`, `docker-compose.yml`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry/input surface, Control Plane wire endpoint, client wire surface, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/config/**`, `packages/hostsetup/**`, 관련 protobuf 계약 변경이 포함된다.
- 사용자 실행 파이프라인에는 `scripts/dev/**`, `scripts/e2e-*.sh`, `Makefile`, `docker-compose.yml`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry/input surface, Control Plane wire endpoint, client wire surface, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/go/config/**`, `packages/go/hostsetup/**`, 관련 protobuf 계약 변경이 포함된다.
- edge-node 개발 진단 흐름 검증은 `scripts/dev/edge.sh``scripts/dev/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에 도착한 뒤의 마감 신호로 본다.

View file

@ -20,7 +20,8 @@
- `apps/control-plane/` — 여러 Edge를 연결하고 상태 조회/설정 변경/명령 전달/이벤트 수신/운영 제어 API 제공을 담당할 Go 기반 중앙 관리 서버이다.
- `apps/client/` — Control Plane을 통해 Edge/Node 운영 상태를 보여주는 Flutter client이다.
- `apps/worker/` — 비동기 작업 처리 예정 영역이다. 현재 placeholder이다.
- `packages/` — 설정, 인증, 이벤트 helper, host setup, 정책, 메타데이터, 작업, 관측성, 버전 등 Go 공통 패키지와 언어별 재사용 패키지 root이다. Flutter 재사용 패키지는 `packages/flutter/` 아래에 둔다.
- `packages/go/` — 설정, 인증, 이벤트 helper, host setup, 정책, 메타데이터, 작업, 관측성, 버전 등 Go 공통 패키지이다.
- `packages/flutter/` — Flutter 재사용 패키지 root이다. 현재 `packages/flutter/iop_console`이 IOP-owned console package이다.
- `proto/iop/` — IOP 메시지 계약 원본이다.
- `proto/gen/iop/` — protobuf 생성물이다.
- `configs/` — 앱별 YAML 설정 예시이다.
@ -57,7 +58,7 @@
- 바이너리 배포 UX는 repo checkout 위치에 묶이지 않아야 한다. `iop-edge`/`iop-node`는 아무 작업 디렉터리에서 실행 가능해야 하며, 로컬/dev bundle에서는 Edge 설정을 바이너리와 같은 디렉터리의 `edge.yaml` 같은 구조화된 config에 모으는 방향을 우선한다. Node 쪽은 별도 사용자 config 파일이 아니라 Edge가 제공하는 bootstrap으로 연결한다.
- Edge-Node 내부 통신은 TCP 기반 protobuf 메시지 흐름을 우선한다. 브라우저/앱 표면이 필요한 경계는 proto-socket WebSocket/WSS를 사용할 수 있다. gRPC 도입, Edge-Node 기본 transport의 WebSocket 전환, actor/FSM/plugin framework 도입은 금지한다.
- protobuf 계약 변경 시 `proto/iop/*.proto`를 먼저 수정하고 `make proto``proto/gen/iop/*.pb.go`를 갱신한다. 생성 파일은 직접 수정하지 않는다.
- Edge/Node 앱 설정 구조 변경 시 `packages/config`의 struct/default와 `configs/*.yaml` 예시를 함께 확인한다. Control Plane 로컬 설정 구조 변경 시 `apps/control-plane`의 config loader와 `configs/control-plane.yaml` 예시를 함께 확인한다.
- Edge/Node 앱 설정 구조 변경 시 `packages/go/config`의 struct/default와 `configs/*.yaml` 예시를 함께 확인한다. Control Plane 로컬 설정 구조 변경 시 `apps/control-plane`의 config loader와 `configs/control-plane.yaml` 예시를 함께 확인한다.
- 테스트는 변경 범위에 맞춰 `go test ./...` 또는 대상 패키지 테스트를 실행한다.
- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 `agent-ops/rules/project/domain/testing/rules.md`의 검증 기준을 따른다.
- field/bootstrap 작업은 `testing` domain rule을 따르고, 실제 local 환경값이 필요하면 `agent-test/local/rules.md`를 따른다.
@ -78,8 +79,8 @@
| `apps/edge/**` | edge | `agent-ops/rules/project/domain/edge/rules.md` |
| `apps/control-plane/**` | control-plane | `agent-ops/rules/project/domain/control-plane/rules.md` |
| `apps/client/**` | client | `agent-ops/rules/project/domain/client/rules.md` |
| `packages/flutter/iop_console/**` | client | `agent-ops/rules/project/domain/client/rules.md` |
| `packages/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
| `packages/flutter/**` | client | `agent-ops/rules/project/domain/client/rules.md` |
| `packages/go/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
| `proto/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
| `configs/**` | platform-common | `agent-ops/rules/project/domain/platform-common/rules.md` |
| `scripts/dev/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |

View file

@ -14,7 +14,7 @@ repo 내부 edge-node 진단이 필요할 때 `scripts/dev/edge.sh`와 `scripts/
- 사용자 실행 파이프라인에 닿는 작업을 완료한 뒤 검증 단계에 들어갈 때
- `scripts/dev/**`, `Makefile`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry, adapter 실행/stream/cancel/status 경로를 변경했을 때
- `configs/**`, `packages/config/**`, 관련 protobuf 계약 변경이 edge-node 실행 방식에 영향을 줄 때
- `configs/**`, `packages/go/config/**`, 관련 protobuf 계약 변경이 edge-node 실행 방식에 영향을 줄 때
- `make test-e2e` 또는 보조 E2E smoke 스크립트를 만들거나 갱신할 때
## 입력

View file

@ -60,7 +60,7 @@
## 작업 컨텍스트
- 관련 경로: `apps/edge`, `apps/node`, `apps/control-plane`, `packages/auth`, `packages/jobs`
- 관련 경로: `apps/edge`, `apps/node`, `apps/control-plane`, `packages/go/auth`, `packages/go/jobs`
- 표준선(선택): Edge는 로컬 실행 이력 원본을 유지하고, Control Plane은 필요한 범위에서 조회/집계한다.
- 선행 작업: 원격 터미널 브리지 POC, Agent Bootstrap과 OTO 등록, Control Plane과 Client
- 후속 작업: Multi-Edge 운영

View file

@ -63,7 +63,7 @@ Ollama 실테스트에서 안정화한 모델 조회, non-streaming/streaming ch
## 작업 컨텍스트
- 관련 경로: `apps/edge`, `apps/node`, `packages/config`, `proto/iop`, `configs`, `bin/edge.sh`, `bin/node.sh`, `agent-test/local/edge-smoke.md`, `agent-test/local/node-smoke.md`, `agent-test/local/platform-common-smoke.md`
- 관련 경로: `apps/edge`, `apps/node`, `packages/go/config`, `proto/iop`, `configs`, `bin/edge.sh`, `bin/node.sh`, `agent-test/local/edge-smoke.md`, `agent-test/local/node-smoke.md`, `agent-test/local/platform-common-smoke.md`
- 표준선(선택): 내부 실행 계약은 `adapter + target`을 유지하고, OpenAI-compatible API는 외부 호환 입력 표면으로 둔다.
- 표준선(선택): Ollama provider에서 안정화한 field smoke 기준을 SGLang provider에도 그대로 적용한다.
- 선행 작업: Ollama 실테스트와 후속 안정화

View file

@ -59,7 +59,7 @@ NomadCode는 이 계층의 소비자 중 하나이며, 이 Milestone은 특정 A
## 작업 컨텍스트
- 관련 경로: `apps/edge`, `apps/node`, `apps/control-plane`, `packages/policy`, `packages/observability`, `proto/iop`, `README.md`, `agent-roadmap/archive/phase/serving-routing-optimization/milestones/model-serving-load-routing.md`
- 관련 경로: `apps/edge`, `apps/node`, `apps/control-plane`, `packages/go/policy`, `packages/go/observability`, `proto/iop`, `README.md`, `agent-roadmap/archive/phase/serving-routing-optimization/milestones/model-serving-load-routing.md`
- 표준선(선택): 기본 모델 serving/load routing이 먼저 안정화된 뒤 최적화 계층을 붙인다.
- 선행 작업: Ollama 서빙 안정화, Control Plane과 Client 운영
- 후속 작업: 정책/이력/감사와 품질 기반 routing/fallback 고도화

View file

@ -16,7 +16,7 @@ import (
"gopkg.in/yaml.v3"
"iop/apps/control-plane/internal/wire"
"iop/packages/observability"
"iop/packages/go/observability"
)
var cfgFile string

View file

@ -5,7 +5,7 @@ import (
"io"
"iop/apps/edge/internal/opsconsole"
"iop/packages/config"
"iop/packages/go/config"
)
func runConsole(ctx context.Context, cfg *config.EdgeConfig, in io.Reader, out io.Writer) error {

View file

@ -25,9 +25,9 @@ import (
"iop/apps/edge/internal/bootstrap"
"iop/apps/edge/internal/node"
"iop/packages/config"
"iop/packages/hostsetup"
"iop/packages/version"
"iop/packages/go/config"
"iop/packages/go/hostsetup"
"iop/packages/go/version"
)
var cfgFile string

View file

@ -10,8 +10,8 @@ import (
"testing"
"gopkg.in/yaml.v3"
"iop/packages/config"
"iop/packages/version"
"iop/packages/go/config"
"iop/packages/go/version"
)
func TestRootCmdIncludesOperationalCommands(t *testing.T) {

View file

@ -5,7 +5,7 @@ import (
"go.uber.org/fx"
"iop/packages/config"
"iop/packages/go/config"
)
func Module(cfg *config.EdgeConfig) fx.Option {

View file

@ -14,9 +14,9 @@ import (
edgenode "iop/apps/edge/internal/node"
edgeservice "iop/apps/edge/internal/service"
"iop/apps/edge/internal/transport"
"iop/packages/config"
"iop/packages/observability"
"iop/packages/version"
"iop/packages/go/config"
"iop/packages/go/observability"
"iop/packages/go/version"
)
// Runtime is the shared edge runtime assembly used by both `serve` and

View file

@ -10,7 +10,7 @@ import (
"testing"
"time"
"iop/packages/config"
"iop/packages/go/config"
)
func newTestConfig() *config.EdgeConfig {

View file

@ -15,7 +15,7 @@ import (
edgeevents "iop/apps/edge/internal/events"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -12,7 +12,7 @@ import (
edgeevents "iop/apps/edge/internal/events"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -13,7 +13,7 @@ import (
"go.uber.org/zap"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
)
type runService interface {

View file

@ -12,7 +12,7 @@ import (
"iop/apps/edge/internal/input/a2a"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -9,7 +9,7 @@ import (
"iop/apps/edge/internal/input/a2a"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -9,7 +9,7 @@ import (
edgea2a "iop/apps/edge/internal/input/a2a"
edgeopenai "iop/apps/edge/internal/openai"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
)
// Manager owns the lifecycle of all Edge inbound input servers (OpenAI-compatible and A2A).

View file

@ -6,7 +6,7 @@ import (
edgeinput "iop/apps/edge/internal/input"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
"go.uber.org/zap"
)

View file

@ -5,7 +5,7 @@ import (
"google.golang.org/protobuf/types/known/structpb"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -4,7 +4,7 @@ import (
"testing"
edgenode "iop/apps/edge/internal/node"
"iop/packages/config"
"iop/packages/go/config"
)
func TestBuildConfigPayload_OllamaEnabled(t *testing.T) {

View file

@ -5,7 +5,7 @@ import (
"sync"
"github.com/google/uuid"
"iop/packages/config"
"iop/packages/go/config"
)
// NodeRecord is the pre-registered node definition stored in edge.

View file

@ -4,7 +4,7 @@ import (
"testing"
edgenode "iop/apps/edge/internal/node"
"iop/packages/config"
"iop/packages/go/config"
)
func TestLoadFromConfig_Success(t *testing.T) {

View file

@ -16,7 +16,7 @@ import (
"go.uber.org/zap"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
)
type runService interface {

View file

@ -10,7 +10,7 @@ import (
"time"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -10,7 +10,7 @@ import (
"iop/apps/edge/internal/bootstrap"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/config"
"iop/packages/go/config"
)
// TargetState holds the current console target: node selection, adapter execution

View file

@ -10,7 +10,7 @@ import (
"go.uber.org/zap"
edgenode "iop/apps/edge/internal/node"
eventpkg "iop/packages/events"
eventpkg "iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -7,7 +7,7 @@ import (
"time"
edgenode "iop/apps/edge/internal/node"
eventpkg "iop/packages/events"
eventpkg "iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -11,7 +11,7 @@ import (
edgeevents "iop/apps/edge/internal/events"
edgenode "iop/apps/edge/internal/node"
eventpkg "iop/packages/events"
eventpkg "iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -14,8 +14,8 @@ import (
edgenode "iop/apps/edge/internal/node"
"iop/apps/edge/internal/transport"
"iop/packages/config"
eventpkg "iop/packages/events"
"iop/packages/go/config"
eventpkg "iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -12,7 +12,7 @@ import (
"google.golang.org/protobuf/proto"
edgenode "iop/apps/edge/internal/node"
"iop/packages/events"
"iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -7,7 +7,7 @@ import (
"google.golang.org/protobuf/proto"
edgenode "iop/apps/edge/internal/node"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -1,7 +1,7 @@
# node — Node Agent
디바이스당 1개 실행되는 IOP 노드 에이전트.
Edge에 연결되어 `adapter + target` 실행을 수행하고, TCP/protobuf 소켓을 통해 요청, 명령, 이벤트 스트림을 처리한다. mTLS helper는 `packages/auth`에 있지만 현재 Edge-Node transport에는 아직 연결하지 않았다.
Edge에 연결되어 `adapter + target` 실행을 수행하고, TCP/protobuf 소켓을 통해 요청, 명령, 이벤트 스트림을 처리한다. mTLS helper는 `packages/go/auth`에 있지만 현재 Edge-Node transport에는 아직 연결하지 않았다.
## 내부 구조 (Hexagonal Architecture)

View file

@ -9,9 +9,9 @@ import (
"gopkg.in/yaml.v3"
"iop/apps/node/internal/bootstrap"
"iop/packages/config"
"iop/packages/hostsetup"
"iop/packages/version"
"iop/packages/go/config"
"iop/packages/go/hostsetup"
"iop/packages/go/version"
)
var cfgFile string

View file

@ -6,7 +6,7 @@ import (
"strings"
"testing"
"iop/packages/version"
"iop/packages/go/version"
)
func TestRootCmdIncludesOperationalCommands(t *testing.T) {

View file

@ -7,7 +7,7 @@ import (
"regexp"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
var antigravityConversationPatterns = []*regexp.Regexp{

View file

@ -12,7 +12,7 @@ import (
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func TestCLIExecuteAntigravityPrintResumesLogicalSession(t *testing.T) {

View file

@ -21,7 +21,7 @@ import (
"iop/apps/node/internal/adapters/cli/status"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
const Name = "cli"

View file

@ -9,7 +9,7 @@ import (
"iop/apps/node/internal/adapters/cli/status"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
// --- driveJSONLines tests ---

View file

@ -7,7 +7,7 @@ import (
"regexp"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
var (

View file

@ -12,7 +12,7 @@ import (
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func TestCLIStartSkipsCodexExecPersistentStartup(t *testing.T) {

View file

@ -14,7 +14,7 @@ import (
"iop/apps/node/internal/adapters/cli/internal/testutil"
"iop/apps/node/internal/adapters/cli/status"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func TestCLIStartPersistentReturnsErrorWhenProcessExitsDuringStartup(t *testing.T) {

View file

@ -11,7 +11,7 @@ import (
"time"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func (c *CLI) executeOneShot(ctx context.Context, spec runtime.ExecutionSpec, profile config.CLIProfileConf, sink runtime.EventSink) error {

View file

@ -11,7 +11,7 @@ import (
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func TestCLIExecuteOneShotPassesPromptAsArg(t *testing.T) {

View file

@ -18,7 +18,7 @@ import (
"go.uber.org/zap"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
// opencodeSSESession tracks a logical session backed by an OpenCode server.

View file

@ -17,7 +17,7 @@ import (
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
// opencodeFakeServer is a minimal stand-in for the OpenCode HTTP/SSE server.

View file

@ -15,7 +15,7 @@ import (
"go.uber.org/zap"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
const (

View file

@ -14,7 +14,7 @@ import (
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
func TestCLIExecutePersistentWaitsForSlowFirstOutput(t *testing.T) {

View file

@ -7,7 +7,7 @@ import (
"unicode"
"iop/apps/node/internal/adapters/cli/status"
"iop/packages/config"
"iop/packages/go/config"
)
type persistentOutputFilter interface {

View file

@ -4,7 +4,7 @@ import (
"strings"
"testing"
"iop/packages/config"
"iop/packages/go/config"
)
func TestClaudeTUIOutputFilterExtractsAssistantMessageOnly(t *testing.T) {

View file

@ -6,7 +6,7 @@ import (
"path/filepath"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
// UsageStatus represents the parsed usage limits of a CLI target.

View file

@ -5,7 +5,7 @@ import (
"strings"
"testing"
"iop/packages/config"
"iop/packages/go/config"
)
func TestNewChecker_CodexUsesProfileCommand(t *testing.T) {

View file

@ -10,7 +10,7 @@ import (
"iop/apps/node/internal/adapters/mock"
"iop/apps/node/internal/adapters/ollama"
"iop/apps/node/internal/adapters/vllm"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -15,7 +15,7 @@ import (
"go.uber.org/zap"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
const Name = "ollama"

View file

@ -12,7 +12,7 @@ import (
"go.uber.org/zap"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
type fakeSink struct {

View file

@ -14,7 +14,7 @@ import (
"go.uber.org/zap"
"iop/apps/node/internal/runtime"
"iop/packages/config"
"iop/packages/go/config"
)
const Name = "vllm"

View file

@ -9,7 +9,7 @@ import (
"go.uber.org/zap"
"iop/packages/config"
"iop/packages/go/config"
)
func TestVllmCapabilitiesQueryModels(t *testing.T) {

View file

@ -16,9 +16,9 @@ import (
"iop/apps/node/internal/router"
"iop/apps/node/internal/store"
"iop/apps/node/internal/transport"
"iop/packages/config"
"iop/packages/events"
"iop/packages/observability"
"iop/packages/go/config"
"iop/packages/go/events"
"iop/packages/go/observability"
iop "iop/proto/gen/iop"
)

View file

@ -15,7 +15,7 @@ import (
"google.golang.org/protobuf/types/known/structpb"
"iop/apps/node/internal/bootstrap"
"iop/packages/config"
"iop/packages/go/config"
iop "iop/proto/gen/iop"
)

View file

@ -13,7 +13,7 @@ import (
toki "git.toki-labs.com/toki/proto-socket/go"
"iop/apps/node/internal/transport"
eventpkg "iop/packages/events"
eventpkg "iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -8,7 +8,7 @@ import (
"go.uber.org/zap"
"google.golang.org/protobuf/proto"
"iop/packages/events"
"iop/packages/go/events"
iop "iop/proto/gen/iop"
)

View file

@ -6,7 +6,7 @@ import (
"strings"
"testing"
"iop/packages/config"
"iop/packages/go/config"
)
func TestLoadEdge_EdgeIdentity(t *testing.T) {

View file

@ -6,7 +6,7 @@ import (
"strings"
"testing"
"iop/packages/observability"
"iop/packages/go/observability"
)
func TestNewLoggerWithFile_EmptyPathFallsBackToStderr(t *testing.T) {