Skip to content

Commit 3e7bf89

Browse files
Cascade Botclaude
andcommitted
fix: address code review feedback
- Use array index as React key in claude-code-limits.tsx to avoid reconciliation bugs when tokens share the same trailing 4 chars; suppress noArrayIndexKey lint rule with explanation - Fix contradictory JSDoc on cacheByToken — remove false claim that raw tokens are not stored as cache keys - Remove unused createMockUser import in claudeCodeLimits.test.ts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 890d224 commit 3e7bf89

3 files changed

Lines changed: 28 additions & 28 deletions

File tree

src/anthropic/client.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ interface CacheEntry {
1818
}
1919

2020
/**
21-
* Per-token cache. Keyed by masked token representation to avoid storing raw
22-
* tokens as cache keys. Uses a Map keyed by full token for lookup; only the
23-
* masked value is surfaced in returned data.
21+
* Per-token cache. Keyed by full token for lookup; only the masked value is
22+
* surfaced in returned data.
2423
*/
2524
const cacheByToken = new Map<string, CacheEntry>();
2625

tests/unit/api/routers/claudeCodeLimits.test.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import { beforeEach, describe, expect, it, vi } from 'vitest';
2-
import {
3-
createMockContext,
4-
createMockSuperAdmin,
5-
createMockUser,
6-
} from '../../../helpers/factories.js';
2+
import { createMockContext, createMockSuperAdmin } from '../../../helpers/factories.js';
73
import { createCallerFor, expectTRPCError } from '../../../helpers/trpcTestHarness.js';
84

95
const { mockListAllClaudeCodeCredentials, mockFetchClaudeSubscriptionLimits } = vi.hoisted(() => ({

web/src/components/global/claude-code-limits.tsx

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,32 @@ export function ClaudeCodeLimitsSection() {
3636
Limits
3737
</div>
3838
<div className="flex flex-col gap-2 px-3 py-1">
39-
{data.map((limits) => (
40-
<div key={limits.tokenMasked} className="rounded-md bg-sidebar-accent/30 p-2 text-xs">
41-
<div className="font-medium text-sidebar-foreground truncate mb-1">
42-
{limits.tokenMasked}
43-
</div>
44-
<div className="text-muted-foreground mb-0.5 capitalize">{limits.plan}</div>
45-
{limits.messagesLimit > 0 && (
46-
<div className="text-muted-foreground">
47-
Msgs: {formatNumber(limits.messagesUsed)} / {formatNumber(limits.messagesLimit)}
48-
</div>
49-
)}
50-
{limits.tokensLimit > 0 && (
51-
<div className="text-muted-foreground">
52-
Tokens: {formatNumber(limits.tokensUsed)} / {formatNumber(limits.tokensLimit)}
39+
{data.map((limits, i) => {
40+
return (
41+
// biome-ignore lint/suspicious/noArrayIndexKey: tokenMasked is not guaranteed unique (tokens may share trailing 4 chars); index is safe here as list order is server-determined and stable
42+
<div key={i} className="rounded-md bg-sidebar-accent/30 p-2 text-xs">
43+
<div className="font-medium text-sidebar-foreground truncate mb-1">
44+
{limits.tokenMasked}
5345
</div>
54-
)}
55-
{limits.resetsAt && (
56-
<div className="text-muted-foreground">Resets {formatResetDate(limits.resetsAt)}</div>
57-
)}
58-
</div>
59-
))}
46+
<div className="text-muted-foreground mb-0.5 capitalize">{limits.plan}</div>
47+
{limits.messagesLimit > 0 && (
48+
<div className="text-muted-foreground">
49+
Msgs: {formatNumber(limits.messagesUsed)} / {formatNumber(limits.messagesLimit)}
50+
</div>
51+
)}
52+
{limits.tokensLimit > 0 && (
53+
<div className="text-muted-foreground">
54+
Tokens: {formatNumber(limits.tokensUsed)} / {formatNumber(limits.tokensLimit)}
55+
</div>
56+
)}
57+
{limits.resetsAt && (
58+
<div className="text-muted-foreground">
59+
Resets {formatResetDate(limits.resetsAt)}
60+
</div>
61+
)}
62+
</div>
63+
);
64+
})}
6065
</div>
6166
</div>
6267
);

0 commit comments

Comments
 (0)