Repository navigation
feat: persist quota state across restarts and add TUI account reorder - #4
Closed
rlawjdghksdlqslek wants to merge 2 commits into
Closed
rlawjdghksdlqslek wants to merge 2 commits into
rlawjdghksdlqslek wants to merge 2 commits into
Conversation
Member
|
Thanks for this — both ideas were good. Superseding it with two focused changes rather than merging directly, since the branch predates a lot of churn (org-aware accounts, rotation priority) and is conflicting.
Really appreciate the contribution. |
MagicalTux
added a commit
that referenced
this pull request
Jun 18, 2026
Quota learned passively from upstream responses was lost on every restart, forcing the proxy to re-probe and mis-rotate until it re-learned each account's window. It now persists that state and restores it on startup — no API calls, fully consistent with the passive-only design. - config.js: getStatePath/loadState/saveState — a `teamclaude.state.json` sibling of the config, so volatile runtime state stays out of the hand-editable config and config isn't rewritten on every save. - account-manager.js: exportQuotaState/restoreQuotaState keyed by account identity (sameIdentity), persisting only utilization + reset windows (PERSISTED_QUOTA_FIELDS); transient state and credentials are excluded. Restored accounts with a known weekly window are no longer marked "probing". - index.js: restore on startup; persist every 60s (unref'd) and once more on SIGINT/SIGTERM/quit. Stale windows are cleared on first use by the existing _clearExpiredQuotas, so a long downtime can't restore an expired window. - Tests: round-trip, identity-keyed (not positional) matching, stale-window clearing, bad-payload guard, state-path derivation. Adapted from the quota-persistence half of #4, reworked to a separate state file; the account-reorder half of #4 is dropped as superseded by `priority`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MagicalTux
added a commit
that referenced
this pull request
Jun 18, 2026
Quota learned passively from upstream responses was lost on every restart, forcing the proxy to re-probe and mis-rotate until it re-learned each account's window. It now persists that state and restores it on startup — no API calls, fully consistent with the passive-only design. - config.js: getStatePath/loadState/saveState — a `teamclaude.state.json` sibling of the config, so volatile runtime state stays out of the hand-editable config and config isn't rewritten on every save. - account-manager.js: exportQuotaState/restoreQuotaState keyed by account identity (sameIdentity), persisting only utilization + reset windows (PERSISTED_QUOTA_FIELDS); transient state and credentials are excluded. Restored accounts with a known weekly window are no longer marked "probing". - index.js: restore on startup; persist every 60s (unref'd) and once more on SIGINT/SIGTERM/quit. Stale windows are cleared on first use by the existing _clearExpiredQuotas, so a long downtime can't restore an expired window. - Tests: round-trip, identity-keyed (not positional) matching, stale-window clearing, bad-payload guard, state-path derivation. Adapted from the quota-persistence half of #4, reworked to a separate state file; the account-reorder half of #4 is dropped as superseded by `priority`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two related quality-of-life improvements for TeamClaude's account management:
1. Persist quota state across server restarts
Previously, quota counters (5h/7d unified usage, token limits, reset timestamps)
were reset to zero every time the server restarted. This made it impossible to
track remaining quota accurately after a restart.
exportQuota()toAccountManagerto serialize quota fields safe for config storagesavedQuotain the config file every 60 seconds via a periodicinterval
2. TUI account reorder with
okeyAdds an interactive reorder mode to the TUI so users can reorganize the account
list without manually editing the config file.
oin normal mode to enter reorder mode↑/↓(orj/k), pressEnterto grab an accountEnterto confirm orEscto cancelcurrentIndexcorrectly when accounts are moved aroundFiles Changed
src/account-manager.js—exportQuota(),moveAccount(), quota restore on initsrc/index.js— periodic quota save, flush on shutdownsrc/tui.js—reordermode,_keyReorder(),_doSaveReorder(), footer hint updateTest Plan
values are preserved in TUI
o, reorder accounts, confirm — verify new order persists after restarto, reorder, pressEsc— verify order is revertedcurrentIndexstays on the correct account after reordering