+
(
- () => (isPast24Hours ? merged.hourly : merged.daily).toReversed(),
- [isPast24Hours, merged.daily, merged.hourly],
- );
+ // The hourly window is small enough to render every period: the table then
+ // reads chronologically like the chart, instead of jumping between the hours
+ // that happened to have activity. Daily windows can run 90 periods, so those
+ // stay newest-first with the interesting end on top.
+ const breakdownPeriods = useMemo(() => {
+ if (!isPast24Hours) return merged.daily.toReversed();
+ const byHour = new Map(merged.hourly.map((entry) => [entry.hourStart, entry]));
+ return hours.map((hourStart) => byHour.get(hourStart) ?? zeroHour(hourStart));
+ }, [isPast24Hours, merged.daily, merged.hourly, hours]);
const selectWindow = (days: number) => {
setWindowSelection({
@@ -441,6 +444,17 @@ export function UsagePage() {
);
}
+/** A zero-filled hourly period so the breakdown lists every hour in the window. */
+function zeroHour(hourStart: string): HourlyTotals {
+ return {
+ day: "",
+ hourStart,
+ costUsd: 0,
+ totalTokens: 0,
+ byProvider: new Map(),
+ };
+}
+
/** Brand mark for the harness a row belongs to. */
function ProviderMark({
provider,
diff --git a/apps/web/src/openVsxThemes.test.ts b/apps/web/src/openVsxThemes.test.ts
index 4775a0188..b4794f619 100644
--- a/apps/web/src/openVsxThemes.test.ts
+++ b/apps/web/src/openVsxThemes.test.ts
@@ -293,6 +293,11 @@ describe("Open VSX themes", () => {
it("downloads a verified VSIX, reads JSONC includes, and pairs contributed variants", async () => {
const zip = new JSZip();
zip.file("extension/.gitkeep", "");
+ // Theme extensions sometimes publish their development dependencies too.
+ // Those unused files should not prevent importing the small theme payload.
+ for (let index = 0; index < 3_000; index += 1) {
+ zip.file(`extension/node_modules/package-${index}.js`, "");
+ }
zip.file(
"extension/themes/base.jsonc",
`{
diff --git a/apps/web/src/openVsxThemes.ts b/apps/web/src/openVsxThemes.ts
index 90d0d62ce..8b03d8486 100644
--- a/apps/web/src/openVsxThemes.ts
+++ b/apps/web/src/openVsxThemes.ts
@@ -17,8 +17,8 @@ const MAX_DETAIL_BYTES = 256 * 1024;
const MAX_MANIFEST_BYTES = 256 * 1024;
const SEARCH_REQUEST_TIMEOUT_MS = 10_000;
const MAX_THEME_BYTES = 256 * 1024;
-const MAX_ZIP_ENTRIES = 2_000;
-const MAX_UNCOMPRESSED_BYTES = 50 * 1024 * 1024;
+const MAX_ZIP_ENTRIES = 5_000;
+const MAX_UNCOMPRESSED_BYTES = 100 * 1024 * 1024;
const MAX_COMPRESSION_RATIO = 200;
const MAX_THEMES_PER_EXTENSION = 40;
const MAX_INCLUDE_DEPTH = 8;
diff --git a/apps/web/src/timestampFormat.test.ts b/apps/web/src/timestampFormat.test.ts
index f35c1c1fd..7cc61e02c 100644
--- a/apps/web/src/timestampFormat.test.ts
+++ b/apps/web/src/timestampFormat.test.ts
@@ -197,12 +197,10 @@ describe("formatDayAwareTimestamp", () => {
describe("invalid timestamp inputs", () => {
it("returns an empty timestamp instead of throwing", () => {
- expect(() => formatTimestamp("not-a-date", "12-hour")).not.toThrow();
expect(formatTimestamp("not-a-date", "12-hour")).toBe("");
});
it("returns an empty short timestamp instead of throwing", () => {
- expect(() => formatShortTimestamp("not-a-date", "12-hour")).not.toThrow();
expect(formatShortTimestamp("not-a-date", "12-hour")).toBe("");
});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 34499402e..bc5b5c937 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -46,8 +46,8 @@ overrides:
'@clerk/clerk-js>@solana/wallet-adapter-react': '-'
'@clerk/clerk-js>@solana/wallet-standard': '-'
'@clerk/clerk-js>@wallet-standard/core': '-'
- '@clerk/electron': 0.0.34-canary.v20260819050620
- '@clerk/electron-passkeys': 0.0.4-canary.v20260819050620
+ '@clerk/electron': 0.0.34
+ '@clerk/electron-passkeys': 0.0.3
'@clerk/expo': 4.2.0
'@clerk/react': 6.14.4
'@clerk/shared': 4.29.2
@@ -118,11 +118,11 @@ importers:
apps/desktop:
dependencies:
'@clerk/electron':
- specifier: 0.0.34-canary.v20260819050620
- version: 0.0.34-canary.v20260819050620(@clerk/electron-passkeys@0.0.4-canary.v20260819050620)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ specifier: 0.0.34
+ version: 0.0.34(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@clerk/electron-passkeys':
- specifier: 0.0.4-canary.v20260819050620
- version: 0.0.4-canary.v20260819050620
+ specifier: 0.0.3
+ version: 0.0.3
'@effect/platform-node':
specifier: 4.0.0-beta.103
version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6)
@@ -524,8 +524,8 @@ importers:
specifier: ^1.4.1
version: 1.5.0(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@clerk/electron':
- specifier: 0.0.34-canary.v20260819050620
- version: 0.0.34-canary.v20260819050620(@clerk/electron-passkeys@0.0.4-canary.v20260819050620)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ specifier: 0.0.34
+ version: 0.0.34(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@clerk/react':
specifier: 6.14.4
version: 6.14.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -1748,35 +1748,35 @@ packages:
resolution: {integrity: sha512-4i4RE+ZQ0hKDDFSRKCISQPBy07SfFeFAhBUhNj2j01Nx2n4pqV+5iyg2Vf27+NKFNkgq7kdmZGvtug24D++8WQ==}
engines: {node: '>=20.9.0'}
- '@clerk/electron-passkeys-darwin-arm64@0.0.4-canary.v20260819050620':
- resolution: {integrity: sha512-avxygtEfWBD3YPkxws4lB5mL/75SQvVBMQCg+b1gjFsQInnVOgAqAv4wHR8wgUsEbXY2zEkvqaYjFSnEveC0VA==}
+ '@clerk/electron-passkeys-darwin-arm64@0.0.3':
+ resolution: {integrity: sha512-oAlrd+GLqP0oREP3hNRc6yNZhXGaQgJss9iCWRQqXjpw1yZD1ZU+L+E2Gfg84vMj/NSUhxbU0Djy0RXhmeUwgg==}
cpu: [arm64]
os: [darwin]
- '@clerk/electron-passkeys-darwin-x64@0.0.4-canary.v20260819050620':
- resolution: {integrity: sha512-clShldbwDcC2ek6gJT85QKsMfaPyOhEgfz61u2n3YKivbeui33XjJu261d+LO20mqDjXZy3flLGPTIh/Kii80g==}
+ '@clerk/electron-passkeys-darwin-x64@0.0.3':
+ resolution: {integrity: sha512-0UPAWQEni7o8gjWwd2sP97fPshJmT2w5b8eV/jOPVSP8NqIcFCm5yIFSEx1SfB53LGfzB01A4iEGi2pxiCHqyQ==}
cpu: [x64]
os: [darwin]
- '@clerk/electron-passkeys-win32-arm64-msvc@0.0.4-canary.v20260819050620':
- resolution: {integrity: sha512-alIfXJSxyeulnNeHoT4X7+qO0o9/EBhiRWMhCXwKJIbWfwzqnnVrRH1P7HfYRnDepKhqRzsUaBuYTqQzisHG+A==}
+ '@clerk/electron-passkeys-win32-arm64-msvc@0.0.3':
+ resolution: {integrity: sha512-bbRvifm9A/gfPkwC1UyMyF9sYGEs0aen7J2kCcaOIW3K0PXcAbHtsR/gnx4dT0bjFdd21vSa2zlIdERvHc1BiA==}
cpu: [arm64]
os: [win32]
- '@clerk/electron-passkeys-win32-x64-msvc@0.0.4-canary.v20260819050620':
- resolution: {integrity: sha512-QSKKMCdV9AhOt74ls8ExdwR+2ikoLGgN2LdWIjBgNk6epJVs2L1FXVZOM0ZqfVHFSl5y7vLmlOACR6WyJ2eoLg==}
+ '@clerk/electron-passkeys-win32-x64-msvc@0.0.3':
+ resolution: {integrity: sha512-gFaVqKlOKTF2SJ3lMwkZ0oonycQn93p1qSrp5kzzeZBeQ+tGB3gQnjXecrhQy21AzDUyWqVJJ8KrP2HRAwifWg==}
cpu: [x64]
os: [win32]
- '@clerk/electron-passkeys@0.0.4-canary.v20260819050620':
- resolution: {integrity: sha512-zOoFEsvOrArv7p4ERNAdkGbYoD86ragDhysLG1NdxJm2jnfw+AfwxUv0FkOPZ7iNuQ0rbJaR/urxdvEwVcuKRA==}
+ '@clerk/electron-passkeys@0.0.3':
+ resolution: {integrity: sha512-OHhIe88qDL+FxyBalXdXNHAS5eEramr6Rerp+6iNkfkjqT8rx4hHNmfpmjg5/T1/am8QfknbOBZkqoXZlCrjPg==}
engines: {node: '>=20.9.0'}
- '@clerk/electron@0.0.34-canary.v20260819050620':
- resolution: {integrity: sha512-sfKWkH2SigKcxtR+h36G1NGnmMI5xOlwvqHpr3JYcacS/uokQbeAjCCQzEeV/9zqWYtRL4et5wCD13+gWv4b6w==}
+ '@clerk/electron@0.0.34':
+ resolution: {integrity: sha512-ZY6v8G1ArieIWvutMEt5HBJtpHN4ys4F4newNlOTElv//cpW29zaeZ65M8WuKttKr7fB+MH6wzzCoX/Ha+fiSg==}
engines: {node: '>=20.9.0'}
peerDependencies:
- '@clerk/electron-passkeys': 0.0.4-canary.v20260819050620
+ '@clerk/electron-passkeys': 0.0.3
electron: '>=28'
electron-store: ^8.2.0
react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0
@@ -11869,26 +11869,26 @@ snapshots:
- react
- react-dom
- '@clerk/electron-passkeys-darwin-arm64@0.0.4-canary.v20260819050620':
+ '@clerk/electron-passkeys-darwin-arm64@0.0.3':
optional: true
- '@clerk/electron-passkeys-darwin-x64@0.0.4-canary.v20260819050620':
+ '@clerk/electron-passkeys-darwin-x64@0.0.3':
optional: true
- '@clerk/electron-passkeys-win32-arm64-msvc@0.0.4-canary.v20260819050620':
+ '@clerk/electron-passkeys-win32-arm64-msvc@0.0.3':
optional: true
- '@clerk/electron-passkeys-win32-x64-msvc@0.0.4-canary.v20260819050620':
+ '@clerk/electron-passkeys-win32-x64-msvc@0.0.3':
optional: true
- '@clerk/electron-passkeys@0.0.4-canary.v20260819050620':
+ '@clerk/electron-passkeys@0.0.3':
optionalDependencies:
- '@clerk/electron-passkeys-darwin-arm64': 0.0.4-canary.v20260819050620
- '@clerk/electron-passkeys-darwin-x64': 0.0.4-canary.v20260819050620
- '@clerk/electron-passkeys-win32-arm64-msvc': 0.0.4-canary.v20260819050620
- '@clerk/electron-passkeys-win32-x64-msvc': 0.0.4-canary.v20260819050620
+ '@clerk/electron-passkeys-darwin-arm64': 0.0.3
+ '@clerk/electron-passkeys-darwin-x64': 0.0.3
+ '@clerk/electron-passkeys-win32-arm64-msvc': 0.0.3
+ '@clerk/electron-passkeys-win32-x64-msvc': 0.0.3
- '@clerk/electron@0.0.34-canary.v20260819050620(@clerk/electron-passkeys@0.0.4-canary.v20260819050620)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
+ '@clerk/electron@0.0.34(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@clerk/clerk-js': 6.29.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@clerk/react': 6.14.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -11897,7 +11897,7 @@ snapshots:
react: 19.2.6
tslib: 2.8.1
optionalDependencies:
- '@clerk/electron-passkeys': 0.0.4-canary.v20260819050620
+ '@clerk/electron-passkeys': 0.0.3
electron-store: 8.2.0
react-dom: 19.2.6(react@19.2.6)
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 2b243c8c4..c1a88e9a1 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -25,8 +25,8 @@ allowBuilds:
catalog:
"@clerk/backend": 3.14.0
"@clerk/clerk-js": 6.29.2
- "@clerk/electron": 0.0.34-canary.v20260819050620
- "@clerk/electron-passkeys": 0.0.4-canary.v20260819050620
+ "@clerk/electron": 0.0.34
+ "@clerk/electron-passkeys": 0.0.3
"@clerk/expo": 4.2.0
"@clerk/react": 6.14.4
"@clerk/shared": 4.29.2
@@ -56,8 +56,7 @@ catalog:
minimumReleaseAgeExclude:
- "@clerk/backend@3.14.0"
- "@clerk/clerk-js@6.29.2"
- - "@clerk/electron@0.0.34-canary.v20260819050620"
- - "@clerk/electron-passkeys@0.0.4-canary.v20260819050620"
+ - "@clerk/electron@0.0.34"
- "@clerk/expo@4.2.0"
- "@clerk/react@6.14.4"
- "@clerk/shared@4.29.2"
@@ -79,10 +78,6 @@ minimumReleaseAgeExclude:
- alchemy@2.0.0-beta.70
- effect@4.0.0-beta.103
- "@legendapp/list@3.3.5"
- - "@clerk/electron-passkeys-darwin-arm64@0.0.4-canary.v20260819050620"
- - "@clerk/electron-passkeys-darwin-x64@0.0.4-canary.v20260819050620"
- - "@clerk/electron-passkeys-win32-arm64-msvc@0.0.4-canary.v20260819050620"
- - "@clerk/electron-passkeys-win32-x64-msvc@0.0.4-canary.v20260819050620"
overrides:
"@clerk/backend": "catalog:"