Repository navigation
Replies: 1 comment
|
I have created a plugin to work around this issue. It simply needs to be installed. https://www.npmjs.com/package/@exagone313/dsh-trusted-host-is-loopback Note: It was published using NPM provenance from GitHub Actions on my repository, for increased transparency and security. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
dsh webserved through Cloudflare Tunnel (or any reverse proxy + Access) loses theentire settings UI: Settings → Models fails with
even though the page authority is declared via
--trusted-hostand every API andwebsocket RPC works. The agent itself is unaffected (models come from the
environment). This looks like a bug rather than a policy: the
/apitrust fence andthe settings mirror are fed by the same
trustedHostsdeclaration, but they makeopposite decisions.
Reproduction
dsh web --host 127.0.0.1 --no-open --trusted-host example.comhttps://example.com/?token=...Loading the provider directory failed: settings are unavailable in this browserthe settings UI work.
Current behavior
packages/client/ui-settings/src/client/index.ts(verified atdsh-v0.1.6-alpha.2;same line exists in
dsh-v0.1.5-rc.2):On any non-loopback page the settings mirror is
'memory'.settings-mirror.tsdocuments
'unavailable'as "the terminal non-loopback state" andensure()short-circuits in memory mode, so the Models store's
describeFace.getSnapshot().viewstays
undefinedand it renders that fallback string(
packages/client/ui-settings-models/src/client/store.ts).This contradicts the deployment's own trust declaration:
--trusted-host <authority...>(packages/bundle/web-app/src/startup.ts) declares authorities to the/apitrust fence, and theconnectionrow wires it through(
trustedHosts: !!js ctx.webRuntime.trustedHostsinweb-app/cordis.patch.yml).The fence accepts the page; the settings mirror does not — the same authority list
produces two different trust decisions.
Not a broken deployment:
dsh web --dump-configshowssettings → @deepseek-ai/dsh-settings-filemounted, Settings → General renders (so the providerworks), and the Models page's
llm/listProviders/llm/listConfigurableProvidersRPCs return
ok:truewith the full directory — only the describe-mirror path fails.Expected behavior
A page loaded from a declared
--trusted-hostauthority should get'host'persistence, same as the
/apifence grants. Undeclared non-loopback authoritiescan stay
'memory'/unavailable. (Or, if remote settings are intentionally out ofscope, an explicit opt-in flag such as
--allow-remote-settings— but the currentsilent split between the fence and the mirror reads as an oversight.)
Environment
0.1.6-alpha.2(also present in0.1.5-rc.2), Linux arm64, Node 22.23.2dsh web --host 127.0.0.1 --no-open --trusted-host dsh.petr.iebehind aCloudflare Tunnel with Access in front
$DSH_HOME/settings.yamlnever created)Workaround
SSH port-forward to the loopback page, or edit
$DSH_HOME/settings.yamldirectly(hot-reloaded). Both work today; the UI is simply unreachable for remote deployments.
PRs are disabled on this repository, so no code is attached — the fix is a one-line
change to the
persistenceselection (honor the page authority's presence in thedeclared
trustedHosts), happy to provide a fork commit if you'd like one.All reactions