Replies: 5 comments
|
I source-checked the reported chain against rc.2 commit A high-confidence attribution to the typed UUID path needs all four observations:
That combination matches the source order: both event pumps start, typed The safest bounded recovery remains loopback (including SSH local forwarding) or an authenticated HTTPS gateway; adding a UUID fallback would repair compatibility but would not make direct remote exposure authenticated. I added the source-linked flow and decision gate to this independent community runbook: https://sandbaseai.github.io/deepseek-harness-handbook/remote-web-secure-context.html |
Source baseline: b150a55 Reproduction
Implementation
Verification
Scope
|
|
Comprehensive rc.2 follow-up, extending the narrower RPC-only reference above. Baseline: Complete apply-ready patch: https://gist.github.com/0x4007/1529e9fb2535a772c5981ec859c004e8 Additional scope covered
Verification
This patch changes browser compatibility only. It does not enable |
|
Source-checked the full gist patch against rc.2 ( Coverage verification. The patch hits exactly the browser-runnable call sites and nothing else:
Every remaining One consolidation suggestion. The patch introduces the same A simpler home consistent with the repo layout is a tiny shared package under Great work on the e2e scenario — the |
|
Terminal status: this is fixed natively in Verified against the current tree:
So the single-util-package home that the gist's three duplicated |
Uh oh!
There was an error while loading. Please reload this page.
What happens. A browser served the web app over plain HTTP from any non-loopback address never gets a live page. Sign-in and every other unary call succeed; sessions, workspaces, and the model picker never arrive, and the console repeats
[web-runtime] connection lost, retry #Nforever. The same page works athttps://or on127.0.0.1.Cause.
crypto.randomUUIDis[SecureContext]in WebCrypto: browsers expose it over HTTPS and onlocalhost, nowhere else.AbstractApiClient.mintRpcIdcalls it on the hot path of every unary RPC —packages/host/apiproxy/src/fetch/client.ts:298:The comment is right that it is a Web API and wrong that being one makes it available. On an insecure origin it is
undefinedand the call throws.The failure lands in
ConnectionController.loop's readiness handshake (packages/client/connection/src/client/connection.ts):this.api.host.describe({})throws, the catch aborts the generation, and bothevents.muxandevents.host— which hold that generation's abort signal — are closed while still CONNECTING. The supervisor backs off and retries indefinitely. Unary RPCs appear to work because a thrown mint is indistinguishable from a transport failure at the call site, which is what makes this look like proxy or WebSocket damage rather than the page closing its own sockets.Already half-fixed.
ede278d0c7("fix(connection): mint RPC ids on insecure origins") addedpackages/client/connection/src/client/random-uuid.tsfor exactly this, with a doc comment naming insecure origins. In the shipped bundle it is reachable only fromclient/fixture.tsandclient/rpc.ts; the carrier every real unary call goes through was not changed. Two further browser call sites still use the secure-context API directly:packages/client/ui-conversation/src/client/service.ts:66—crypto.randomUUID() as DraftAttachmentIdcreateMessage—MessageId(crypto.randomUUID())Repro. Serve the web app from a LAN address over plain HTTP and open it in any browser. Confirmed against
0.1.1-rc.2source and the published0.1.0-rc.7and0.1.1-rc.1bundles. Verified in headless Chrome on such an origin thatisSecureContextisfalseandcrypto.randomUUIDisundefined, whilecrypto.getRandomValuesis present.Suggested fix. Reuse the helper that already exists —
crypto.getRandomValuescarries no secure-context requirement, so it works everywhererandomUUIDdoes and in the places it does not.apiproxysits belowclient/connectionin the dependency graph, so it needs its own copy or a shared one.Related, same root shape.
ConnectionHandle.isLoopbackis derived from the address bar —pageLocation === undefined || isLoopbackHostname(pageLocation.hostname)inpackages/client/connection/src/client/index.ts:132. An authenticated reverse proxy in front of the harness can carry the configuration plane safely, but has no way to say so: the client creates the settings mirror with memory persistence and never sends the calls, andui-deliverablesdisablescanOpenPathon the same signal. A host-supplied hint — awebserver/index-injectglobal row, or a field onhost.describe— would let the process that actually knows answer the question, rather than inferring it from a hostname the host never sees.Context: both of these surfaced while building
dsh-relay, an authenticated remote-access plugin that fronts an untouched loopback harness.All reactions