Skip to content

Fix quota accuracy and proxy lifetime; add model picker, Proxy page and easier plugins (AI finder) - #357

Open
timrmcclain wants to merge 15 commits into
router-for-me:mainfrom
timrmcclain:custom/account-dashboard
Open

timrmcclain wants to merge 15 commits into
router-for-me:mainfrom
timrmcclain:custom/account-dashboard

Conversation

@timrmcclain

@timrmcclain timrmcclain commented Oct 7, 2026 •

Copy link
Copy Markdown

Summary

Fixes

  • Quota colors reflect real availability. A window with healthy remaining % is no longer shown green when the account is blocked by a different, exhausted window (e.g. 5-hour at 100% while the 7-day cap is at 0%).
  • Stuck "Querying quota..." fix. pruneQuotaCache compared only key counts, so resetting an orphaned loading entry to idle was silently dropped whenever no accounts were added or removed.
  • Kimi quota. A brand-new, zero-usage account legitimately returns {}; that is now treated as "no data yet" instead of an "unrecognized format" error. Payloads with real but wrong-shaped content still error. The empty reply also records its check time, so the card no longer says "not checked yet" next to "no usage limits reported".
  • Proxy survives the GUI. The core process is no longer tied to the GUI's lifetime (Windows kill-on-close job object and Linux PR_SET_PDEATHSIG removed; normal exit records state instead of killing the core). Closing, crashing, or updating the GUI no longer drops active proxy connections. The existing adopt_existing_core_processes path reattaches on next launch; explicit Stop/Restart still stop the core.
  • desktop_mapping_error row fix. Error matching now skips rows that has_mapping() excludes, so a config error is no longer attributed to an inert row that shares a source model.
  • App Version row. getVersion() was always denied without core:app:allow-version, so the row stayed on "Detecting" unless the update check supplied a value.

Features

  • Claude Desktop model picker. "Pick from catalog" adds models from already-discovered accounts in bulk instead of one typed row at a time.
  • "Just reset" indicator. A quota window whose remaining % climbs between two successful fetches is flagged as just reset (Accounts panel, dashboard cards and Quota Lookup).
  • Proxy page. Proxy controls and connection details move from Overview to their own page; Overview keeps a one-line status that links there. The page stays reachable while the proxy is stopped so it can be started from it.
  • Easier plugins.
    • Advanced settings → Extensions shows a short guide with an "Open Plugins" button; the raw native-plugin form sits behind "Show advanced settings".
    • The plugin store has a "Recommended for you" section matched to the connected account types, with one plain sentence per plugin and a third-party / proxy-restart warning. Only entries from the official store listing are recommended.
  • AI plugin finder. In the plugin store, the user describes a goal in a sentence. The GUI sends that plus a trimmed public catalog as one chat request through the local proxy (new Tauri command ask_plugin_finder), using the GUI's own client key on the Rust side so it never reaches the webview. A small, fast model is picked automatically.
    • The reply is treated as untrusted: only ids present in the loaded store are shown (official listing preferred, at most three). Each match shows why it fits, what changes, and what to watch out for.
    • Installing still goes through the normal install dialog.

Merge with current main

Upstream main is merged in (19 conflicted files). Where both sides built the same surface:

  • Kept both where they coexist (Home overview cards alongside the account dashboard; upstream's AgentClientList).
  • Upstream wins where its refactor supersedes the branch's inline version (usage token composition; events view split into UsageEventsView).
  • Fork-only dashboard components now use the renamed /credentials endpoints (they still called /auth-files, so the dashboard showed no accounts after the merge).
  • Quota Lookup row markup was replaced by the merge; the blocked and just-reset row states were restored on top of upstream's version.
  • xAI quota checks keep the branch's behavior of not sending a paid inference request as a fallback when billing returns empty.

Note for reviewers

This branch comes from a personal fork and also carries fork-specific customization alongside the fixes above:

  • branding
  • a custom account dashboard
  • personal docs and preview images
  • a personal build version string, 0.3.12+personal-desk.26

Happy to split the fixes into a smaller PR if that's preferred. The plugin recommendations are a hand-curated list of store ids; that list may be better kept fork-only.

Test plan

  • tsc --noEmit: clean
  • cargo test: 764 passed, 0 failed, 8 ignored
  • bun test: 780 passed, 4 failed. The same 4 also fail on unmodified upstream main (authFileUsageSummary, operationFeedback, textContrast, uiLocalization). In one full run a fifth, timing-sensitive quota test (keeps both secondary pages consistent with Overview for resetDue) failed; it passed 3/3 when run alone.
  • Built and installed locally: GUI swapped while the proxy kept the same PID, port 8317 stayed up, and live client connections continued through the swap.
  • Plugin guide, recommendations and AI finder checked in the browser-mock dev build.
  • Finder request path exercised against a live local proxy: model auto-selected, 200 response.
  • Visual review of the merged Home, Agents, Usage, and Version pages
  • AI finder end to end inside the installed desktop app: a live search through the local proxy returned matches named by display name.

🤖 Generated with Claude Code

Tim McClain and others added 13 commits October 6, 2026 18:47
…el picker

- Quota panels: a window's color now reflects whether the account is actually
  blocked by a different, already-exhausted window, instead of showing green
  just because that window's own percentage looks fine.
- Fix pruneQuotaCache silently dropping a stuck-loading reset when no auth
  files were added or removed (length-only change detection missed it).
- Fix Kimi quota parsing treating a genuinely empty (zero-usage) response as
  an unrecognized-format error.
- Decouple the proxy kernel process from the GUI's lifetime: it no longer
  dies with the GUI on exit, crash, or force-kill (Windows Job Object
  kill-on-close removed, Linux PR_SET_PDEATHSIG removed), so closing or
  updating the GUI no longer interrupts active proxy connections. The GUI
  already had dormant logic to adopt an existing running kernel on launch;
  this makes that path load-bearing instead of dead code.
- Fix desktop_mapping_error misattributing a config error to an inert row
  that shares a source model with the real offending row.
- Add a "pick from catalog" flow for Claude Desktop model aliases: select
  from already-discovered models instead of typing each one by hand.
- Flag a quota window as "just reset" when its remaining% climbs between
  two successful fetches, since that only happens on an actual reset.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Resolve 19 conflicted files. Where the fork and upstream built parallel
versions of the same surface, both are kept when they coexist (Home keeps
the account dashboard alongside upstream's overview cards; Agents adopts
upstream's AgentClientList and keeps the personal-context banner). Where
upstream's refactor supersedes the fork's inline version (usage token
composition, events view split into UsageEventsView), upstream wins.

xAI quota checks keep the fork's behavior of never sending a paid
inference request as a billing fallback.

Post-merge fixes: duplicate/missing imports, and version-page controls
that referenced the in-app updater the personal edition removed.

Verified: tsc clean; cargo test 762 passed, 0 failed; bun test 770
passed, 4 failed -- the same 4 tests fail on clean upstream main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Version of the merged build currently installed locally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream renamed the management API from /auth-files to /credentials; the
fork-only dashboard components still called the old paths, so the account
dashboard showed no accounts after the merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
getVersion() was always denied without core:app:allow-version, so the App
Version row stayed on "Detecting" unless the update check supplied a value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Overview now focuses on accounts and quota, with a one-line proxy status
that links to the new Proxy page. The Proxy page stays reachable while the
proxy is stopped so it can be started from there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The button and the "Core {action} failed" notice shared one key, so the
button showed lowercase "start". Notices now use their own lowercase verbs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The upstream merge replaced this page's row markup, dropping the gray
'blocked by another window' treatment and the 'just reset' note that the
Accounts panel and dashboard cards still show.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Advanced settings > Extensions now shows a short guide with an Open Plugins
  button; the raw native-plugin form sits behind Show advanced settings.
- Plugin store shows a Recommended for you section matched to connected
  account types, with one plain sentence per plugin and a third-party/restart
  warning. Only entries from the official store listing are recommended.
- Bump to 0.3.12+personal-desk.24.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Describe the goal in a sentence; the GUI sends that plus a trimmed public
store catalog as one chat request through the local proxy, using the GUI's
own client key on the Rust side so it never reaches the webview. A small,
fast model is picked automatically. Replies are parsed as untrusted: only
ids present in the loaded store are shown (official listing preferred, max
three), each with why / what changes / watch out, and installing still goes
through the normal install dialog.

Bump to 0.3.12+personal-desk.25.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@timrmcclain timrmcclain changed the title Fix quota display accuracy, decouple proxy lifetime from GUI, add model picker Fix quota accuracy and proxy lifetime; add model picker, Proxy page and easier plugins (AI finder) Oct 7, 2026
Tim McClain and others added 2 commits October 7, 2026 10:41
Ask the model to name plugins by their catalog name, and replace any
catalog ids it still echoes in why/changes/risk/note with the display
name. Bump to 0.3.12+personal-desk.26.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An empty Kimi usage reply was recorded as a successful check without a
check time, so the account card said "Quota has not been checked yet"
next to "The provider did not report usage limits".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant