1107 Commits

Author SHA1 Message Date
Supra4E8C 0eeb747cdc feat(apiKeyStrength): implement API key strength meter and evaluation logic v1.22.0 2026-08-06 18:40:47 +08:00
Supra4E8C cfa8f616a3 feat(apiKey): add secure API key generation utility and tests 2026-08-06 18:07:35 +08:00
Supra4E8C 6e550fbe4e fix(config): discard drafts without reloading 2026-08-06 03:32:43 +08:00
Supra4E8C 125cdbd843 fix(config): announce tab validation state 2026-08-06 03:30:50 +08:00
Supra4E8C c7fe030cd3 fix(config): share status across page chrome 2026-08-06 03:30:13 +08:00
Supra4E8C 437fa820ff fix(config): allow visual retry after yaml repair 2026-08-06 03:29:07 +08:00
Supra4E8C 00f34bc3e5 refactor(config): motion polish and reduced-motion coverage pass 2026-08-06 03:02:02 +08:00
Supra4E8C 38ee01c0e0 feat(config)!: route /config to the redesigned page and retire the legacy editor 2026-08-06 02:58:13 +08:00
Supra4E8C 77ec68bd97 feat(config): assemble new config page with document/save orchestration 2026-08-06 02:56:44 +08:00
Supra4E8C 40749f00c4 feat(config): port section editors and blocks into feature folder 2026-08-06 02:49:36 +08:00
Supra4E8C c2feeac1ca feat(config): scaffold config feature shell (constants, uiState, tabs, header, save bar) 2026-08-06 02:34:09 +08:00
Supra4E8C 30478c539c feat(quota): enhance KimiQuotaBody to display concrete reset time and integrate QuotaResetLabel component v1.21.4 2026-08-03 22:43:02 +08:00
Supra4E8C afee40ec23 feat(quota): replace soonest recovery logic with urgent recovery emphasis 2026-08-03 22:39:06 +08:00
Supra4E8C f50f9b0f64 feat(quota): add initialOffset prop to QuotaTimeline for test flexibility 2026-08-03 22:25:51 +08:00
Supra4E8C 001e1308cf feat(quota): add a soonest-recovery-first sort to the quota page
Card order was fixed: provider grouping, then whatever order the backend
listed files in. With more than a handful of credentials, "which one is
usable next" meant reading every card.

The new sort ranks credentials by their nearest upcoming reset, across
windows and reset credits alike, and it runs before pagination so the
answer is global rather than per-page.

Quota is click-to-fetch, so most of the list has no instant to sort by.
Those credentials sink to the bottom keeping their provider-grouped
order — the unloaded tail still reads like the default view — and slot
into place as their data arrives. The comparator takes the instant as an
injected resolver, which keeps it store-free and directly testable.

writeQuotaUiState now merges. It previously wrote the whole object, so
adding a second preference would have made changing a tab silently reset
the sort.

The Select sits inside the existing tabs reveal node rather than beside
it: useRevealGroup staggers every [data-reveal] descendant, and a
sibling would have added a cascade step. Reordering relies on stable
card keys, so React moves nodes instead of remounting them — no FLIP and
no replayed entrance, because a re-sort triggered by a minute tick
should not move things with fanfare.
2026-08-02 01:54:20 +08:00
Supra4E8C c277ad353c feat(quota): highlight the row that recovers first on each card
A card lists several limits at once — a 5-hour window, a weekly one, a
handful of manual reset credits — and only the one that recovers first
governs what the credential can do next. Finding it meant reading five
timestamps.

That row now carries a warning-tinted rule and a bolder countdown, with
a title attribute so the state is not conveyed by colour alone. The
emphasis is ranked across windows and credits together: a credit
expiring tonight outranks a weekly window resetting on Friday.

Only genuine capacity-return events are ranked. The Codex subscription
renewal date and xAI's monthly billing rollover are excluded — a spend
cap turning over is not a rate limit lifting — though both still render
their own countdown.

resetCreditRowId is exported and used for both the React key and the
highlight comparison, so the two cannot drift and put the emphasis on
the wrong row. Antigravity ranks against its own server-corrected clock
so the highlight and the countdown beside it always agree.

No transition on the highlight: it moves to another row the moment a
window resets, and cross-fading a jumping target reads as flicker.

Deliberately not merged with buildTimelineLane, which reads the same
five shapes to pick one window per credential — the longest that fits
the visible span. Same inputs, opposite selection rules.
2026-08-02 01:54:20 +08:00
Supra4E8C 0272e9b455 feat(quota): show relative time beside every absolute quota date
Cards stated `08-13 14:30` and left the arithmetic to the reader, while
Antigravity and Kimi showed only a countdown — three readings of time on
one page. Every absolute date on a Claude, Codex or xAI card now carries
its own countdown: window resets, reset-credit expiry, and the Codex
renewal date.

The renewal date was also the one value rendered as a full toLocaleString;
it is reformatted from its instant so it reads like the rest, falling back
to the old rendering when the payload has no parseable timestamp.

Absolute labels baked at fetch time are kept rather than recomputed —
formatCodexResetLabel resolves reset_after_seconds against the fetch-time
clock and cannot be reproduced at render. A store entry cached without
resetAtMs therefore renders exactly as before.

Relative magnitudes are truncated rather than rounded up. Rounding up
crossed the unit thresholds, rendering "24 hours" just under a day and
"60 minutes" just under an hour, and overstated the time left before a
deadline.

Adds a QuotaClassMap key, so both hosts gain the class in this commit —
bindQuotaClasses throws at module init, which white-screens the app
rather than degrading one row. A test now asserts both stylesheets
define every contract key.
2026-08-02 01:54:20 +08:00
Supra4E8C 3eb9f3cc71 refactor(quota): unify Codex reset-credit expiry on browser-local time
Reset-credit expiry was formatted in a hardcoded Asia/Shanghai while
every other timestamp on the page — window resets, the timeline — used
the browser's timezone. The same credit therefore appeared twice on one
screen in two different timezones: GMT+8 on the card, local in the
timeline tooltip.

Credits now use the same local MM-DD HH:mm shape as every other reset
label, and the "(GMT+8)" that was baked into the heading in all four
locales becomes a runtime-resolved offset, so the timezone is stated
rather than assumed.

The offset is computed arithmetically rather than via Intl's
timeZoneName: 'shortOffset' — that is ES2022-only, needs its locale
pinned to stay ASCII across the four UI languages, and disagrees at UTC
itself (GMT+0 vs GMT).
2026-08-02 01:54:20 +08:00
Supra4E8C ddabc99e24 feat(quota): add a shared minute clock and signed relative-time formatting
Relative time goes stale on its own — nothing re-renders when a minute
passes, so a long-lived tab silently lies. The naive fix is a timer per
component, which on the quota page means one per card body.

Adds one app-wide clock instead, started on the first subscriber and
cleared on the last, exposed through useNow(). QuotaTimeline drops its
private interval and joins it, so the chart and the cards above it tick
in lockstep.

Also extracts the timeline's private relative-time formatter into a
shared, testable one. It is now signed: the old version clamped with
Math.max(0, …), so a credit that expired last week read "in 1 minute".

Duration constants and the MM-DD HH:mm shape are deduplicated into
utils/time/durations.ts and formatInstantShort, which the existing
formatQuotaResetTime / formatUnixSeconds now delegate to.
2026-08-02 01:54:19 +08:00
Supra4E8C 285d9e6753 feat(quotaTimeline): add manual reset credit handling and related UI updates 2026-08-01 23:45:30 +08:00
Supra4E8C b1aefecf94 feat(excludedModels): enhance autoFocus handling in ExcludedModelsPanel v1.21.3 2026-08-01 17:33:46 +08:00
Supra4E8C 648a3d4af4 feat(sheet): add bodyRef to manage scroll position and enhance focus handling 2026-08-01 17:24:03 +08:00
Supra4E8C 6394584b99 feat(authFiles): add disable cooling feature with related UI and logic updates 2026-08-01 17:18:56 +08:00
Supra4E8C 7976b16f6c feat(lmuAI): add LMU AI provider support with related configurations and resources v1.21.2 2026-07-31 20:48:51 +08:00
Supra4E8C b2bd48e58b feat(kimi): add 'week' as a valid time unit and update related functions v1.21.1 2026-07-31 12:54:55 +08:00
Supra4E8C 8038469a2d feat(quota): enhance QuotaTimeline with empty state handling and initial zoom configuration 2026-07-31 12:47:17 +08:00
Supra4E8C 7c072c4ab4 feat(authFiles): enhance identity handling and search functionality
- Introduced deriveAuthFileIdentity to manage display of account email and project ID.
- Updated search logic to include account email and project ID in search criteria.
- Improved styling for file names and account display in AuthFileCard.
- Normalized email and project ID fields in API responses.
- Added tests for new identity logic and search functionalities.
v1.21.0
2026-07-31 12:23:00 +08:00
Supra4E8C f3713c5382 fix(quota): update page size to 20 and adjust pagination tests accordingly 2026-07-31 11:16:37 +08:00
Supra4E8C 66d52992e8 fix(quota): clear usage after reported reset 2026-07-31 11:07:29 +08:00
Supra4E8C ea0652c51c fix(quota): keep xAI period metadata atomic 2026-07-31 11:06:44 +08:00
Supra4E8C 01ab01d388 fix(quota): only project real five-hour windows 2026-07-31 11:06:10 +08:00
Supra4E8C ea107fded0 feat: add quota window management and reset instant handling
- Introduced new localization strings for quota windows in English, Russian, Simplified Chinese, and Traditional Chinese.
- Enhanced quota types to include reset timestamps and period lengths for various providers (Claude, Antigravity, Codex, Kimi, Xai).
- Implemented utility functions for parsing reset instants from different formats (ISO, Unix, and offsets).
- Developed tests for new reset instant parsing utilities and timeline functionalities.
- Updated quota builders to utilize new reset instant logic and ensure accurate timeline projections.
2026-07-31 10:49:20 +08:00
Supra4E8C 31afcffd99 fix(quota): keep Antigravity reset countdown current 2026-07-31 10:03:14 +08:00
Supra4E8C 66d24c053c fix(quota): block refresh while Codex reset runs 2026-07-31 10:01:40 +08:00
Supra4E8C fb6d94788b chore(i18n): drop retired quota view-mode and too-many-files strings 2026-07-31 09:21:03 +08:00
Supra4E8C 1705246ed1 feat(quota): add entrance choreography and data-arrival motion 2026-07-31 09:20:25 +08:00
Supra4E8C 46ffeba5dd feat(quota)!: route /quota to the redesigned page and retire the section shell 2026-07-31 09:17:42 +08:00
Supra4E8C 54af5fb3e3 feat(quota): build the redesigned quota feature shell (unrouted) 2026-07-31 09:16:07 +08:00
Supra4E8C 9ecd89b136 refactor(quota): replace string styleMap renderers with typed JSX quota bodies 2026-07-31 08:56:16 +08:00
Supra4E8C 572da189bc refactor(quota): split provider data layer out of quotaConfigs 2026-07-31 08:50:02 +08:00
Supra4E8C 7345e99059 test(quota): extract resolvePlanTier and cover the elite/premium order contract 2026-07-31 08:43:17 +08:00
Supra4E8C 826ea3c0d0 docs(excluded-models): clarify rule module consolidation v1.20.4 2026-07-31 07:44:16 +08:00
Supra4E8C 4abd41f947 refactor: streamline excluded models management and enhance localization
- Removed deprecated localization keys related to excluded models in zh-TW.json.
- Introduced a new structure for excluded models with improved UI components.
- Refactored AuthFilesOAuthExcludedEditPage to utilize ExcludedModelsPicker for better handling of model exclusions.
- Consolidated styles in AuthFilesOAuthExcludedEditPage.module.scss by removing unused classes.
- Added comprehensive tests for excluded model rules and their matching logic.
- Deleted obsolete tests for OAuth excluded rules and replaced them with more relevant tests for the new structure.
- Ensured that the disabled state of providers is correctly managed and reflected in the UI.
2026-07-31 07:42:56 +08:00
Supra4E8C 20bb8559d4 feat(auth-files): implement excluded models selection with UI support and backend integration 2026-07-31 04:53:01 +08:00
Supra4E8C afd7da059d feat(auth-files): add excluded models field with normalization and UI support 2026-07-31 04:25:35 +08:00
Supra4E8C 13a22da082 fix(dashboard): adjust heroPeriod styles for improved spacing and letter spacing v1.20.3 2026-07-31 03:24:58 +08:00
Supra4E8C 6cda18a852 feat(quota): update Codex Pro 20x badge styles and animations for improved visual consistency 2026-07-31 03:22:39 +08:00
Supra4E8C fe93db0941 fix(quota): restore Codex reset button visibility 2026-07-31 01:16:05 +08:00
Supra4E8C 530b585bd0 feat(interactions): add support for Interactions API, including endpoints, payloads, and configuration management v1.20.2 2026-07-30 08:05:30 +08:00
Supra4E8C 90971e8f6a feat(auth-files): add WRR weight management and update priority handling 2026-07-30 07:45:55 +08:00