You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Feature]: surface per-target quota state in the combo workspace — disable actions when all targets have 0 credits #1702
콤보 워크스페이스에서 타깃별 쿼터/소진 상태를 보여주고, 모든 타깃이 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 내용까지 여기서 재구성하지는 않겠습니다. 카탈로그 피커 의미와 런타임 페일오버는 이 이슈에 섞지 않는 편이 맞습니다.
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.
Activity
lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 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이 작성했습니다
lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 38 / 80 · 유지
콤보 워크스페이스에서 타겟별 쿼타를 보여 주고, 전부 0이면 버튼을 끄자는 UI. #1711 자식. 런타임 페일오버는 #1572. 구현 PR은 #1704.
유지함. 피커 회색(#1711)이랑 따로 갈 거고, 이 이슈는 워크스페이스 버튼 막는 쪽만.
해결방안: #1704 머지. 쿼타 회복되면 버튼 다시 켜야 함.
이 댓글은 grok-bot이 작성했습니다
lidge-jun commentedon Aug 23, 2026
Fixed by #2454, squash-merged to
devas 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-quotasalready existed atsrc/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.