Repository navigation
Conversation
The overview carried enough to render a read-only page and not enough to
build an editor. Four gaps, each of which made a whole section of the
config unreachable from the UI.
**Proxies were a list of names.** `proxies: Vec<String>` — so the
dropdown on an upstream could reference a proxy but nothing could create
one, and anyone who had not hand-edited `config.yaml` saw a menu holding
only `direct` and `system`. `ProxyView` carries name, kind, address, and
how many upstreams use it, which is what you need before deleting one.
**The password does not travel.** `ProxyAuth.pass` is the same class of
thing as an upstream key, and this view reaches logs, diagnostic bundles
and screenshots people paste into issues. `has_auth` says whether there
is one; the test asserts neither the password nor the username appears in
the serialised view.
**`client_probes` had no representation at all**, and its absence was
compounding: a routing rule's `when.intent` condition can only match when
the corresponding probe class is set to `route`, so any rule written with
`intent` was silently dead and nothing said why. The five classes now
come through with their mode, along with a sentence each describing what
that class of request is. That list lives on `ClientProbes` rather than
in the frontend — adding a sixth class is this struct's business, and a
list hard-coded in the UI silently loses a row that day.
**`limits` was likewise invisible**, as were a key's `route`, its
`allow`, and its concurrency ceiling.
## One real bug
`listen.bind` was rendered with `format!("{:?}").to_lowercase()`. That
happens to produce the right word for `Loopback` and `All`, and produces
`addr(192.168.1.5)` for a concrete interface — which the UI then compares
against its three choices and never matches. It uses `Display` now, which
exists precisely for this.
Co-Authored-By: Claude Opus 5 <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.
Why
The overview carried enough to render a read-only page and not enough to build an editor. Four gaps, each of which made a whole section of the configuration unreachable from the UI.
Proxies were a list of names
proxies: Vec<String>. The dropdown on an upstream could reference a proxy, but nothing could create one — so anyone who had not hand-editedconfig.yamlsaw a menu holding onlydirectandsystem.ProxyViewnow carries name, kind, address, and how many upstreams use it, which is what you need to know before deleting one.The password does not travel.
ProxyAuth.passis the same class of thing as an upstream key, and this view reaches logs, diagnostic bundles, and screenshots people paste into issues.has_authsays whether there is one. The test asserts that neither the password nor the username appears in the serialised view — the username is half a credential.client_probeshad no representation at allAnd its absence was compounding: a routing rule's
when.intentcondition can only match when the corresponding probe class is set toroute, so any rule written withintentwas silently dead and nothing said why.The five classes now come through with their mode and a sentence each describing what that class of request is. That list lives on
ClientProbesrather than in the frontend — adding a sixth class is this struct's business, and a list hard-coded in the UI silently loses a row on the day that happens.Also newly visible
limits, and per key: its boundroute, itsallowlist, its concurrency ceiling.One real bug
listen.bindwas rendered withformat!("{:?}").to_lowercase(). That happens to produce the right word forLoopbackandAll— and producesaddr(192.168.1.5)for a concrete interface, which the UI then compares against its three choices and never matches. It usesDisplaynow, which exists for exactly this.Verification
cargo fmt --all -- --check,cargo clippy --workspace --all-targets -- -D warnings, 1089 tests, andscripts/smoke.sh— 46 checks, 0 failures.🤖 Generated with Claude Code