Skip to content

feat(usage): subscriptionUsageProviders 전역 허용 목록으로 USAGE 그룹 제한 - #356

Merged
dmae97 merged 1 commit into
mainfrom
usage-allowlist-20261106
Nov 6, 2026
Merged

dmae97 merged 1 commit into
mainfrom
usage-allowlist-20261106

Conversation

@dmae97

@dmae97 dmae97 commented Nov 6, 2026

Copy link
Copy Markdown
Owner

요약

전역 설정 subscriptionUsageProviders로 고정 레일 USAGE에 보일 사용량 그룹과, 실제로 요청을 보낼 그룹을 제한합니다.

  • 설정 값
    • 생략: 지금처럼 설정된 그룹을 모두 보여 줍니다.
    • []: 전부 숨기고 usage 요청도 보내지 않습니다.
  • global 설정에서만 읽습니다. 프로젝트의 .omk/settings.json으로는 바꿀 수 없습니다.
  • 잘못된 값(비어 있지 않은 provider ID 배열이 아닌 경우)은 렌더 중에 예외를 내지 않고 []로 처리합니다(fail closed). 레일이 매 frame 이 값을 읽기 때문입니다.
    • 원래 작업에서는 이 경우 예외를 던졌습니다. 그대로 두면 설정이 잘못됐을 때 사이드바 렌더가 깨질 수 있어서 바꿨습니다.
  • 공급자 source 표와 판정 함수를 provider-usage-sources.ts로 옮기고 허용 목록을 적용했습니다.
    • 옮긴 함수: getSubscriptionUsageSource, supportsSubscriptionUsage, getConfiguredSubscriptionUsageProviders
    • provider-usage.ts는 같은 이름을 다시 export하므로 import 경로는 그대로입니다.
    • 허용 목록에 없는 활성 공급자는 맨 앞에 끼워 넣지 않습니다.
  • settings-manager.ts 모듈 크기 ratchet 때문에 목록 값 파서(parseDefaultActiveSkills 포함)를 settings-list-values.ts로 그대로 옮겼습니다.
  • 문서: docs/settings.md, CHANGELOG.md.

원래 체크아웃의 미커밋 작업에서 이 부분만 골라 main 기준으로 옮겼습니다. 다음은 넣지 않았습니다.

  • Meta 공급자: 별도 PR, 이 브랜치 위에 쌓습니다.
  • 같은 파일에 섞여 있던 Kimi User-Agent 변경

검증 (로컬, 커밋 25eaff6)

  • subscription-usage.test.ts 새 테스트 4개
    • 원래 작업의 테스트 2개: 제외된 활성 공급자가 끼어들지 않는지, []이면 모두 숨기는지. 구현 전에는 둘 다 실패했습니다.
    • 새로 쓴 테스트 2개
      • 잘못된 값이면 fail closed하는지: try/catch를 빼면 실패하는 것을 확인했습니다.
      • global 설정만 읽고 project 설정은 무시하는지
  • 세션 mock 3개 파일(sidebar-endpoint, status-sidebar, subscription-footer)에 getSubscriptionUsageProviders를 추가했습니다.
  • npx vitest --run: provider-usage, SettingsManager, StatusSidebarComponent, statusPanelModel, InteractiveMode를 쓰는 87개 파일. 946개 통과, 13개 skip
  • 종료 0: npx tsgo --noEmit, npx biome check --error-on-warnings ., check:module-size, check:import-cycles, check:ts-imports, check:doc-links, check:feature-claims, check:release-surface
  • 실제 TUI 확인은 하지 않았습니다. 허용 목록 효과를 보려면 실제 공급자 인증이 있는 global 설정을 바꿔야 해서, 단위 테스트로만 확인했습니다.

- settings: subscriptionUsageProviders(global only). 생략하면 설정된 그룹 전부, []이면 전부 숨기고
  요청도 보내지 않는다. 잘못된 값은 render 중 예외 대신 []로 fail closed.
- 공급자 source 표와 판정(getSubscriptionUsageSource, supportsSubscriptionUsage,
  getConfiguredSubscriptionUsageProviders)을 provider-usage-sources.ts로 옮기고 허용 목록을 적용한다.
  provider-usage.ts는 같은 이름을 다시 export한다.
- settings-manager 모듈 크기를 지키려고 목록 값 파서를 settings-list-values.ts로 옮겼다(동작 동일).
- settings 문서, CHANGELOG 갱신.
@dmae97

dmae97 commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

OMK Community

Thanks for opening this pull request. Mention @omk-community with reproduction steps, a question, or the review help you need.

Automated response. No code changes or merges are performed.

@dmae97
dmae97 merged commit c423e02 into main Nov 6, 2026
2 of 4 checks passed
@dmae97
dmae97 deleted the usage-allowlist-20261106 branch November 6, 2026 08:14

@dmae97 dmae97 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

25eaff6의 소스 검토에서 허용 목록의 요청 차단 범위를 확인할 부분을 찾았습니다. 아래처럼 next-suggestion 사용량 조회는 새 필터를 거치지 않습니다. 이번 확인은 소스 검토이며 새 전체 테스트 실행은 아닙니다.

CI run 42183145300, attempt 2도 Test 단계에서 실패했습니다. test/verified-run-journal-read-retry.test.ts:246의 cancel's journal read outlasts a burst of appends longer than the strict retry window에서 failures가 [] 대신 ['journal_truncated']였습니다. Build, Check와 secret-scan은 통과했습니다. 이 실패가 허용 목록 변경 때문에 생겼다고 확인한 것은 아니지만, 원인 확인과 통과한 CI가 필요하므로 병합은 보류합니다.

export function getConfiguredSubscriptionUsageProviders(session: UsageSession): readonly string[] {
const activeProvider = session.state.model?.provider;
const activeSource = getSubscriptionUsageSource(activeProvider);
const allowed = session.settingsManager.getSubscriptionUsageProviders();

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 허용 목록을 공통 조회 경로에서도 적용해 주세요. 현재 필터는 사이드바 목록 생성에만 적용됩니다. OMK_NEXT_SUGGESTIONS를 켜면 next-suggestion-controller.ts의 activeQuotaUsage()가 활성 공급자로 reader.read()를 직접 호출하고, SubscriptionUsageReader.refresh() → loadSubscriptionUsage()는 getSubscriptionUsageProviders()를 확인하지 않아 []이거나 잘못된 설정으로 fail closed한 경우에도 사용량 요청이 나갈 수 있습니다. 이는 문서의 [] ... sends no usage requests 보장과 다릅니다. 공통 조회 경로에서 제외된 그룹의 요청을 차단하고, 빈/제한된/잘못된 목록에서 suggestion 경로의 fetch·CLI probe가 호출되지 않는 테스트를 추가해 주세요. 의도적으로 rail 전용 설정이라면 문서와 변경 설명에서 요청 차단 범위를 명확히 제한해야 합니다.

dmae97 commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

상태 정정: 검토 도중 08:13:25 UTC에 이 PR이 c423e02로 이미 병합된 것을 확인했습니다. 위 리뷰의 '병합 보류'는 현재 상태에 맞지 않습니다. 허용 목록을 우회하는 next-suggestion 조회 경로는 병합 후 수정 항목으로 봐 주세요. CI 실패는 attempt 2의 결과이며, 이후 main 검사 결과와는 별개입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant