# Milestone: Workbench Provider Slot Composition

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/project-workspace-management-ux/PHASE.md`

## 목표

NomadCode Flutter 앱의 상단 titlebar와 우측 icon rail 기반 workbench shell을 유지하면서, IOP 전용 `iopContent` 같은 1회성 slot을 provider 기반 slot registry로 추상화한다. IOP와 OTO는 각각 provider adapter로 등록되어 우측 rail item과 중앙 content에 삽입될 수 있고, 기본 NomadCode client는 외부 제품 package 없이도 독립적으로 빌드되어야 한다.

## 상태

[계획]

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- NomadCode desktop/workbench shell의 상단 titlebar + 우측 icon rail + center content 구조 유지
- 기존 IOP 전용 slot을 provider slot registry와 provider descriptor/adapter 경계로 일반화
- IOP, OTO 같은 외부 Flutter console package를 선택적 provider로 등록하는 구조
- provider별 rail item, placeholder, center content, agent capability pack 조립 경계
- 기본 `apps/client`가 IOP/OTO package를 import하지 않고도 빌드되는 dependency boundary
- 포함 빌드 또는 별도 composition package가 IOP/OTO provider를 주입하는 방식

## 기능

### Epic: [workbench-shell] NomadCode right-rail workbench

NomadCode는 여러 도메인 관리 화면을 우측 icon rail과 중앙 content host로 전환하는 제품 shell을 소유한다.

- [x] [titlebar] NomadCode shell은 상단 titlebar 영역을 제공하고, 앱/워크스페이스/현재 컨텍스트 상태를 이 영역에서 표현한다.
- [x] [right-rail] NomadCode shell은 VS Code activity bar처럼 아이콘만 있는 우측 rail을 제공한다.
- [x] [center-content] 우측 rail item 선택에 따라 중앙 content가 Agent, Workflow, Web Context, Settings, provider slot 등으로 전환된다.
- [x] [layout-shape] 상단 titlebar와 우측 rail이 ㄱ자 구조를 만들고, 중앙 content는 host 도메인 화면을 침범 없이 표시한다. 검증: narrow/wide layout에서 titlebar, rail, center content가 겹치지 않는다.

### Epic: [provider-slots] Provider slot registry

Workbench는 IOP/OTO 같은 제품별 console을 하드코딩된 enum/field가 아니라 provider descriptor 목록으로 조립한다.

- [ ] [slot-contract] provider slot descriptor는 id, label, icon, center content builder, optional placeholder, optional agent capability pack 주입 지점을 갖는다.
- [ ] [slot-registry] NomadCode workbench shell은 기본 section과 provider slot을 하나의 rail model로 합성한다. 검증: IOP/OTO slot을 추가해도 shell enum과 switch에 제품별 분기가 늘어나지 않는다.
- [ ] [provider-adapter] 각 provider adapter는 외부 console package public API와 NomadCode slot contract 사이만 연결한다.
- [ ] [dependency-boundary] 기본 `apps/client` dependency graph에는 IOP/OTO package import가 없다. 검증: provider package가 없는 환경에서도 기본 client analyze/build가 실패하지 않는다.

### Epic: [agent-surface] Shared agent shell composition

채팅형 agent shell은 NomadCode, IOP, OTO가 함께 쓰는 공통 package로 두고, 각 제품은 capability pack만 등록한다.

- [ ] [agent-shell-package] 메시지, tool call, 승인 UI, capability registry를 포함한 공통 `agent_shell` package를 NomadCode 제품 shell에서 사용할 수 있다.
- [ ] [nomad-agent] NomadCode agent capability는 WebView 화면 관찰/조작, workflow/task/workspace, project context 같은 NomadCode 책임 범위만 제공한다.
- [ ] [provider-agent-pack] IOP/OTO 포함 빌드는 같은 agent shell registry에 각 provider의 agent capability pack을 추가 등록할 수 있다.

### Epic: [provider-embeds] IOP and OTO native Flutter embeds

IOP와 OTO 관리는 webview나 별도 앱이 아니라 각 repository의 embeddable Flutter console package를 provider slot으로 삽입한다.

- [ ] [iop-provider] IOP 포함 빌드는 `iop_console` 또는 동등한 IOP-owned package를 provider slot으로 등록하고, 기존 IOP placeholder를 native Flutter console로 대체한다.
- [ ] [oto-provider] OTO 포함 빌드는 `oto_console` package를 provider slot으로 등록하고, 우측 rail에 OTO slot을 추가해 중앙 content에 OTO console을 표시한다.
- [ ] [host-config] NomadCode는 provider별 endpoint/auth/token reference/theme/navigation callback을 주입하고, provider package 내부 state와 NomadCode 제품 state를 느슨하게 연결한다.
- [ ] [remove-cleanly] IOP 또는 OTO provider를 제거해도 NomadCode Agent, Workflow, Web Context, Settings rail item과 중앙 content 전환은 유지된다.

## 완료 리뷰

- 상태: 없음
- 요청일: 없음
- 완료 근거: 모든 기능 Task와 Task 안에 명시된 검증이 아직 충족되지 않았다.
- 리뷰 필요:
  - [ ] 사용자가 완료 결과를 확인했다
  - [ ] archive 이동을 승인했다
- 리뷰 코멘트: 없음

## 범위 제외

- IOP/OTO 관리 UI 자체 구현과 각 제품의 Control Plane/Runner/Edge 운영 책임
- IOP/OTO 내부 모델 라우팅, adapter/target 실행 정책, runtime 최적화 구현
- NomadCode default app에 IOP/OTO package를 직접 의존시키는 구조
- 런타임 동적 plugin framework 도입
- WebView를 통해 IOP/OTO 화면을 띄우는 대체 구현

## 작업 컨텍스트

- 관련 경로: `apps/client/`, `packages/contracts/`, `services/core/`
- 외부 관련 경로: `../iop/apps/client/`, `../iop/packages/flutter/iop_console/`, `../oto/apps/client/`, `../oto/packages/flutter/oto_console/`, `../agent-shell/`
- 표준선(선택): NomadCode shell은 상단 titlebar + 우측 icon rail + center content 구조를 소유한다.
- 표준선(선택): 외부 제품 UI는 provider adapter/composition layer에서만 import하고, default build는 외부 제품 package 없이 빌드 가능해야 한다.
- 표준선(선택): Agent shell은 공통 package, NomadCode/IOP/OTO는 각각 capability pack으로 조립한다.
- 완료 근거(2026-06-07): `[workbench-shell]`은 `apps/client/lib/src/app/nomadcode_workbench_shell.dart`와 `apps/client/test/widget_test.dart`의 right rail, Agent dock, IOP/Workflow section 전환, narrow/wide layout rect 검증으로 확인했다. 검증: `cd apps/client && flutter test` PASS.
- 선행 작업: Client Integration Standardization, Project Workspace Management UX
- 선행 확인 대상: `../iop/packages/flutter/iop_console/`, `../oto/packages/flutter/oto_console/`
- 후속 작업: 실제 desktop/mobile project workspace 화면 구현, workflow/provider 관리 탭별 세부 content 구현
- 확인 필요: 후속 구현 계획에서 app/flavor/package 중 어떤 optional composition 방식을 택할지 확정한다.
