<!-- task=m-node-multi-target-serving-foundation/06+02,04_commands_caps plan=1 tag=REVIEW_API -->

# Plan - REVIEW_API

## 이 파일을 읽는 구현 에이전트에게

이 plan은 직전 코드리뷰 `code_review_local_G07_0.log`의 Required 지적만 해결한다. 구현 중 사용자에게 직접 묻지 말고, 사용자 전용 blocker가 있으면 `CODE_REVIEW-local-G08.md`의 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 기록한 뒤 멈춘다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/node-multi-target-serving-foundation.md`
- Task ids:
  - `commands-caps`: `CAPABILITIES`, `SESSION_LIST`, `USAGE_STATUS`, provider passthrough command가 여러 adapter/profile/model target에서 모호하지 않은 결과를 반환한다.
- Completion mode: check-on-pass

## 배경

직전 구현은 service DTO 일부에 identity를 추가했지만, 두 표면에서 여전히 command result identity가 손실된다.

- OpenAI-compatible `/api/*` Ollama passthrough가 target을 채우지 않아 provider command가 어느 model target에 대한 것인지 보존하지 못한다.
- ops console `/status` 결과 header가 adapter를 표시하지 않아 usage status 결과가 같은 target/session 조합에서 모호하다.

## 범위 결정 근거

- proto/runtime 구조 변경은 하지 않는다. 기존 `OllamaAPIRequest.Target`, `NodeCommandRequest.Target`, `UsageStatusView.Adapter`를 끝까지 사용하는 보완이다.
- Ollama `context_size` 우선순위 변경과 node domain rule 변경은 이 follow-up 범위가 아니다.
- concurrency scheduling, long command 비동기화, provider API body 재작성은 별도 task 범위다.

## 구현 체크리스트

- [ ] `/api/*` Ollama passthrough가 resolved target identity를 `OllamaAPIRequest.Target`과 `NodeCommandRequest.Target`까지 보존한다.
- [ ] usage status console result header가 adapter/target/session identity를 함께 표시하고 테스트가 이를 검증한다.
- [ ] 관련 edge/openai/service/opsconsole 테스트를 갱신한다.
- [ ] 최종 검증 명령을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_API-1] Ollama Passthrough Target Identity

- 문제: `apps/edge/internal/openai/ollama_passthrough.go:21`이 `OllamaAPIRequest.Target`을 채우지 않는다. 그 결과 `apps/edge/internal/service/node_command.go:153`의 provider passthrough `NodeCommandRequest.Target`도 빈 값이 된다.
- 해결 방법: `/api/*` passthrough에서도 OpenAI server의 configured target을 resolved target으로 전달한다. configured target이 비어 있는 legacy passthrough에서는 빈 target을 유지해 기존 동작을 깨지 않는다. route catalog 기반 target을 적용할 수 있는 입력 정보가 없으면 이 plan에서는 configured `openai.target` 보존까지만 다룬다.
- 수정 파일:
  - `apps/edge/internal/openai/ollama_passthrough.go`
  - `apps/edge/internal/openai/server_test.go`
  - 필요 시 `apps/edge/internal/service/service_test.go`
- 테스트 작성:
  - `TestOllamaAPIPassthrough` 또는 신규 테스트에서 `EdgeOpenAIConf{Adapter: "ollama", Target: "gemma4:26b"}`일 때 fake service가 받은 `OllamaAPIRequest.Target == "gemma4:26b"`인지 검증한다.
  - service level 테스트가 부족하면 `OllamaAPI`가 `NodeCommandRequest.Target`을 보존하는 assertion을 추가한다.
- 중간 검증:
  - `go test -count=1 ./apps/edge/internal/openai ./apps/edge/internal/service`

### [REVIEW_API-2] Usage Status Console Identity

- 문제: `apps/edge/internal/opsconsole/status.go:44`가 `UsageStatusView.Adapter`를 버리고, `FormatUsageStatus` header는 `target/session`만 표시한다.
- 해결 방법: `FormatUsageStatus` 호출부와 signature를 adapter 포함 형태로 바꾸고 header를 예를 들어 `[node-status] adapter=cli@dgx target=claude session=default`처럼 출력한다.
- 수정 파일:
  - `apps/edge/internal/opsconsole/status.go`
  - `apps/edge/internal/opsconsole/events_test.go`
  - 필요 시 `apps/edge/internal/opsconsole/console_test.go`
- 테스트 작성:
  - 기존 `FormatUsageStatus` 테스트 중 최소 1개 이상에서 header에 `adapter=... target=... session=...`이 포함되는지 검증한다.
  - `SendStatus`가 `result.Adapter`를 renderer에 전달하는 경로를 단위 테스트로 확인할 수 있으면 추가한다.
- 중간 검증:
  - `go test -count=1 ./apps/edge/internal/opsconsole`

## 최종 검증

```bash
go test -count=1 ./apps/edge/internal/openai ./apps/edge/internal/service ./apps/edge/internal/opsconsole
go test -count=1 ./apps/node/... ./apps/edge/internal/service/...
```

edge service/console/HTTP command 표면에 닿으므로 로컬 smoke가 가능하면 `./scripts/e2e-smoke.sh`로 command 응답을 확인한다. 실행하지 못하면 `CODE_REVIEW-local-G08.md`의 검증 결과에 정확한 미실행 사유를 남긴다.

