Skip to content

[Feature]: surface per-target quota state in the combo workspace — disable actions when all targets have 0 credits #1702

Closed

Description

@lidge-jun

Scope

Surface per-target quota state in the combo workspace and disable combo actions when every target has known zero remaining credit.

This issue is the workspace/UI child of #1711.

In scope

  • Show per-target quota/exhaustion state in the combo workspace.
  • Clearly indicate when all targets are exhausted.
  • Disable actions that cannot succeed while every target has known zero credit.
  • Re-enable those actions when quota state recovers.

Out of scope

Implementation

Relationship

Activity

  1. lidge-jun commented on Aug 19, 2026

    @lidge-jun
    OwnerAuthor

    리뷰 · 우선순위 38 / 80

    콤보 워크스페이스에서 타깃별 쿼터/소진 상태를 보여주고, 모든 타깃이 0이면 성공할 수 없는 액션을 끄자는 요청입니다. #1711의 UI 자식이고, 런타임 재평가/페일오버는 #1572입니다. 관련 구현 PR로 #1704가 언급되어 있습니다.

    현재 dev의 src/server/management/combo-routes.ts는 GET/PUT /api/combos와 콤보 설정 정규화를 담당합니다. 파일 상단에 fetchProviderQuotaReports와 clearProviderQuotaCache를 src/providers/quota.ts에서 가져오지만, 이 파일 안에서 호출하는 코드는 없습니다. 콤보 GET 응답은 공개 모델 ID와 sparse config이고, 타깃별 remaining credit 배지나 all-exhausted 플래그는 이 라우트에 없습니다.

    원하는 화면은 타깃마다 쿼터를 보여 주고, 전부 소진이면 액션을 비활성으로 두며, 쿼터가 돌아오면 다시 켜는 것입니다. 피커에서 줄을 회색 처리하는 일은 #1711이 맡고, 여기서는 워크스페이스 컨트롤만 다루면 됩니다. 데이터가 없거나 오래됐다고 버튼을 끄면 안 됩니다.

    해결방안: 콤보 API가 권위 있는 쿼터 리포트를 타깃에 붙이고, UI는 all-target 0일 때만 액션을 끄면 됩니다. import만 있고 호출이 없는 상태는 #1704가 아직 안 들어왔거나 다른 브랜치에 있는 신호로 보입니다. 그 PR 내용까지 여기서 재구성하지는 않겠습니다. 카탈로그 피커 의미와 런타임 페일오버는 이 이슈에 섞지 않는 편이 맞습니다.

    이 댓글은 grok-bot이 작성했습니다

  2. lidge-jun commented on Aug 19, 2026

    @lidge-jun
    OwnerAuthor

    리뷰 · 우선순위 38 / 80 · 유지

    콤보 워크스페이스에서 타겟별 쿼타를 보여 주고, 전부 0이면 버튼을 끄자는 UI. #1711 자식. 런타임 페일오버는 #1572. 구현 PR은 #1704.

    유지함. 피커 회색(#1711)이랑 따로 갈 거고, 이 이슈는 워크스페이스 버튼 막는 쪽만.

    해결방안: #1704 머지. 쿼타 회복되면 버튼 다시 켜야 함.

    이 댓글은 grok-bot이 작성했습니다

  3. lidge-jun commented on Aug 23, 2026

    @lidge-jun
    OwnerAuthor

    Fixed by #2454, squash-merged to dev as c9a202e.

    Each target row in the combo workspace now carries an available / exhausted / unknown quota badge, and Save/Create disable with a warning when every usable target is out of credits.

    The design rule worth stating: quota state is tri-state, and unknown never disables anything. Missing, stale, malformed, failed, conflicting, or incomplete aggregate evidence all resolve to unknown; only every usable target known exhausted disables the controls, and recovery re-enables them automatically. Treating absent evidence as exhaustion would turn one dropped poll into a locked workspace — worse than the bug this closes. Disabled targets are excluded, since a combo cannot use them.

    GUI-only: /api/provider-quotas already existed at src/server/management/provider-routes.ts:372, so no runtime change was needed.

    Evidence: 35 pass / 0 fail on the derivation tests (USD, percentage, custom window, unlimited, stale, trimmed provider, incomplete aggregation, disabled target, mixed, all-exhausted, recovery), 5 pass on the UI transitions, plus typecheck, lint:gui, lint:i18n, build:gui, and a 393-page docs build. All nine locales and seven translated combo guides updated. CI 23 pass.

    The earlier attempt (c8c4358a1, PR #1704) was checked and deliberately not resurrected — it added the badges without the action gating that was the actual ask here.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    account-poolOAuth, credentials, Codex pool, quota, failover, plansenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions