From f75f397705a3dc5e07a6a1f8c05f8ced98b2ea85 Mon Sep 17 00:00:00 2001 From: yovinchen Date: Mon, 14 Sep 2026 00:15:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(tunnel):=20=E4=BF=AE=E5=A4=8D=E5=85=AC?= =?UTF-8?q?=E5=BC=80=E5=9C=B0=E5=9D=80=E7=AB=AF=E5=8F=A3=E4=B8=8E=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=B5=84=E6=BA=90=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/server/tunnel_rewrite.go | 22 +-- .../internal/server/tunnel_rewrite_test.go | 6 +- .../internal/server/tunnel_runtime.js | 161 +++++++++++++++++ .../test/webui/tunnel-runtime.test.mjs | 171 ++++++++++++++++++ crates/agent-gui/src/pages/ChatPage.tsx | 12 +- .../src/pages/chat/runtime/useSendChatTurn.ts | 6 +- .../test/settings/gateway-public-url.test.mjs | 35 ++++ .../test/tools/tunnel-manager-tools.test.mjs | 21 +++ .../src/lib/shared/gatewayPublicUrl.ts | 20 ++ .../src/pages/settings/RemoteSection.tsx | 16 +- docs/architecture/gateway.md | 30 +++ .../tunnel-url-and-runtime-regression.png | Bin 0 -> 81451 bytes 12 files changed, 466 insertions(+), 34 deletions(-) create mode 100644 crates/agent-gateway/internal/server/tunnel_runtime.js create mode 100644 crates/agent-gateway/test/webui/tunnel-runtime.test.mjs create mode 100644 crates/agent-gui/test/settings/gateway-public-url.test.mjs create mode 100644 crates/agent-ui/src/lib/shared/gatewayPublicUrl.ts create mode 100644 docs/images/tunnel-url-and-runtime-regression.png diff --git a/crates/agent-gateway/internal/server/tunnel_rewrite.go b/crates/agent-gateway/internal/server/tunnel_rewrite.go index b30e4601c..9c8736efb 100644 --- a/crates/agent-gateway/internal/server/tunnel_rewrite.go +++ b/crates/agent-gateway/internal/server/tunnel_rewrite.go @@ -2,6 +2,7 @@ package server import ( "crypto/sha256" + _ "embed" "encoding/base64" "encoding/json" "io" @@ -18,6 +19,12 @@ import ( const tunnelRewriteBodyMaxBytes = 4 * 1024 * 1024 +// Keep the runtime as executable JavaScript so its DOM behavior can be tested +// directly. The very same bytes are used for HTML injection and CSP hashing. +// +//go:embed tunnel_runtime.js +var tunnelRuntimeScript string + type tunnelResponseRewriteKind int const ( @@ -220,20 +227,7 @@ func tunnelShimScriptBody(rw tunnelRewrite) string { if err != nil { return "" } - return `(function(config){` + - `if(window.__LIVEAGENT_TUNNEL__&&window.__LIVEAGENT_TUNNEL__.installed)return;` + - `var base=String(config.basePath||"").replace(/\/+$/,"");` + - `window.__LIVEAGENT_TUNNEL__={basePath:base,installed:true};` + - `function rw(input){if(input==null||!base)return input;var raw=input instanceof URL?input.href:String(input);var u;try{u=new URL(raw,location.href)}catch(_){return input}` + - `if(u.host!==location.host||!/^(http:|https:|ws:|wss:)$/i.test(u.protocol))return input;` + - `if(u.pathname===base||u.pathname.indexOf(base+"/")===0)return u.href;` + - `u.pathname=base+(u.pathname==="/"?"/":u.pathname);return u.href}` + - `function rwWs(input){var out=rw(input);try{var u=new URL(String(out),location.href);if(u.protocol==="http:")u.protocol="ws:";if(u.protocol==="https:")u.protocol="wss:";return u.href}catch(_){return out}}` + - `if(window.WebSocket){var NativeWebSocket=window.WebSocket;window.WebSocket=function(url,protocols){return new NativeWebSocket(rwWs(url),protocols)};window.WebSocket.prototype=NativeWebSocket.prototype;["CONNECTING","OPEN","CLOSING","CLOSED"].forEach(function(k){window.WebSocket[k]=NativeWebSocket[k]})}` + - `if(window.EventSource){var NativeEventSource=window.EventSource;window.EventSource=function(url,options){return new NativeEventSource(rw(url),options)};window.EventSource.prototype=NativeEventSource.prototype}` + - `if(window.fetch){var nativeFetch=window.fetch.bind(window);window.fetch=function(input,init){if(input instanceof Request)return nativeFetch(new Request(rw(input.url),input),init);return nativeFetch(rw(input),init)}}` + - `if(window.XMLHttpRequest){var open=window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open=function(method,url){arguments[1]=rw(url);return open.apply(this,arguments)}}` + - `})(` + string(config) + `);` + return strings.TrimSpace(tunnelRuntimeScript) + `(` + string(config) + `);` } func rewriteTunnelCSSURLToken(token string, rw tunnelRewrite) (string, bool) { diff --git a/crates/agent-gateway/internal/server/tunnel_rewrite_test.go b/crates/agent-gateway/internal/server/tunnel_rewrite_test.go index c318f43d7..99bb60f3b 100644 --- a/crates/agent-gateway/internal/server/tunnel_rewrite_test.go +++ b/crates/agent-gateway/internal/server/tunnel_rewrite_test.go @@ -221,9 +221,9 @@ func TestRewriteTunnelHTMLBodyInjectsRuntimeShimBeforeFirstScript(t *testing.T) t.Fatalf("runtime shim was not injected before app script:\n%s", output) } assertContains(t, output, `"basePath":"/t/test-slug"`) - assertContains(t, output, `window.WebSocket=function`) - assertContains(t, output, `window.fetch=function`) - assertContains(t, output, `window.EventSource=function`) + assertContains(t, output, `window.WebSocket = function`) + assertContains(t, output, `window.fetch = function`) + assertContains(t, output, `window.EventSource = function`) assertContains(t, output, `XMLHttpRequest.prototype.open`) } diff --git a/crates/agent-gateway/internal/server/tunnel_runtime.js b/crates/agent-gateway/internal/server/tunnel_runtime.js new file mode 100644 index 000000000..6f30e5590 --- /dev/null +++ b/crates/agent-gateway/internal/server/tunnel_runtime.js @@ -0,0 +1,161 @@ +(function (config) { + if (window.__LIVEAGENT_TUNNEL__ && window.__LIVEAGENT_TUNNEL__.installed) return; + var base = String(config.basePath || "").replace(/\/+$/, ""); + window.__LIVEAGENT_TUNNEL__ = { basePath: base, installed: true }; + + function rw(input) { + if (input == null || !base) return input; + var raw = input instanceof URL ? input.href : String(input); + var u; + try { + u = new URL(raw, location.href); + } catch (_) { + return input; + } + if (u.host !== location.host || !/^(http:|https:|ws:|wss:)$/i.test(u.protocol)) return input; + if (u.pathname === base || u.pathname.indexOf(base + "/") === 0) return u.href; + u.pathname = base + (u.pathname === "/" ? "/" : u.pathname); + return u.href; + } + + function rwWs(input) { + var out = rw(input); + try { + var u = new URL(String(out), location.href); + if (u.protocol === "http:") u.protocol = "ws:"; + if (u.protocol === "https:") u.protocol = "wss:"; + return u.href; + } catch (_) { + return out; + } + } + + if (window.WebSocket) { + var NativeWebSocket = window.WebSocket; + window.WebSocket = function (url, protocols) { + return new NativeWebSocket(rwWs(url), protocols); + }; + window.WebSocket.prototype = NativeWebSocket.prototype; + ["CONNECTING", "OPEN", "CLOSING", "CLOSED"].forEach(function (k) { + window.WebSocket[k] = NativeWebSocket[k]; + }); + } + if (window.EventSource) { + var NativeEventSource = window.EventSource; + window.EventSource = function (url, options) { + return new NativeEventSource(rw(url), options); + }; + window.EventSource.prototype = NativeEventSource.prototype; + } + if (window.fetch) { + var nativeFetch = window.fetch.bind(window); + window.fetch = function (input, init) { + if (input instanceof Request) return nativeFetch(new Request(rw(input.url), input), init); + return nativeFetch(rw(input), init); + }; + } + if (window.XMLHttpRequest) { + var open = window.XMLHttpRequest.prototype.open; + window.XMLHttpRequest.prototype.open = function (method, url) { + arguments[1] = rw(url); + return open.apply(this, arguments); + }; + } + + // Dynamic script/link requests are issued by the browser's resource loader, + // not window.fetch. Rewrite synchronously before invoking native setters; + // a MutationObserver runs too late to prevent a request to the gateway root. + function resourceURL(value) { + // Preserve relative URLs, external origins, non-HTTP schemes and typed + // values (e.g. TrustedScriptURL) instead of bypassing their native checks. + if (typeof value !== "string" || !base) return value; + var raw = value.trim(); + if (!/^(\/|https?:\/\/)/i.test(raw)) return value; + var u; + try { + u = new URL(raw, document.baseURI); + } catch (_) { + return value; + } + if (u.origin !== location.origin) return value; + if (u.pathname === base || u.pathname.indexOf(base + "/") === 0) return value; + return rw(u.href); + } + + function resourceAttribute(element) { + if (element.namespaceURI !== "http://www.w3.org/1999/xhtml") return ""; + if (element.localName === "script") return "src"; + if (element.localName === "link") return "href"; + return ""; + } + + function patchURLSetter(constructor, property) { + if (!constructor) return; + var prototype = constructor.prototype; + var descriptor = Object.getOwnPropertyDescriptor(prototype, property); + if (!descriptor || !descriptor.set || !descriptor.configurable) return; + var nativeSet = descriptor.set; + descriptor.set = function (value) { + return nativeSet.call(this, resourceURL(value)); + }; + Object.defineProperty(prototype, property, descriptor); + } + patchURLSetter(window.HTMLScriptElement, "src"); + patchURLSetter(window.HTMLLinkElement, "href"); + + var nativeSetAttribute = Element.prototype.setAttribute; + var nativeGetAttribute = Element.prototype.getAttribute; + Element.prototype.setAttribute = function (name, value) { + if (typeof name === "string" && name.toLowerCase() === resourceAttribute(this)) { + value = resourceURL(value); + } + return nativeSetAttribute.call(this, name, value); + }; + var nativeSetAttributeNS = Element.prototype.setAttributeNS; + Element.prototype.setAttributeNS = function (namespace, name, value) { + if ((namespace == null || namespace === "") && name === resourceAttribute(this)) { + value = resourceURL(value); + } + return nativeSetAttributeNS.call(this, namespace, name, value); + }; + + // Clones and nodes parsed in a detached fragment can bypass the setters. + // Normalize their resource attributes before insertion starts loading them. + function rewriteElement(element) { + var attribute = resourceAttribute(element); + if (!attribute) return; + var value = nativeGetAttribute.call(element, attribute); + var rewritten = resourceURL(value); + if (rewritten !== value) nativeSetAttribute.call(element, attribute, rewritten); + } + function rewriteTree(node) { + if (!node || typeof node !== "object") return; + if (node.nodeType === 1) rewriteElement(node); + if ((node.nodeType === 1 || node.nodeType === 11) && node.querySelectorAll) { + node.querySelectorAll("script[src],link[href]").forEach(rewriteElement); + } + } + function patchInsertion(prototype, name, allArguments) { + if (!prototype || typeof prototype[name] !== "function") return; + var native = prototype[name]; + prototype[name] = function () { + var count = allArguments ? arguments.length : Math.min(arguments.length, 1); + for (var i = 0; i < count; i++) rewriteTree(arguments[i]); + return native.apply(this, arguments); + }; + } + ["appendChild", "insertBefore", "replaceChild"].forEach(function (name) { + patchInsertion(Node.prototype, name, false); + }); + [Element.prototype, Document.prototype, DocumentFragment.prototype].forEach(function (prototype) { + ["append", "prepend", "replaceChildren"].forEach(function (name) { + patchInsertion(prototype, name, true); + }); + }); + [Element.prototype, CharacterData.prototype, DocumentType.prototype].forEach(function (prototype) { + ["before", "after", "replaceWith"].forEach(function (name) { + patchInsertion(prototype, name, true); + }); + }); + patchInsertion(Element.prototype, "insertAdjacentElement", true); +}) diff --git a/crates/agent-gateway/test/webui/tunnel-runtime.test.mjs b/crates/agent-gateway/test/webui/tunnel-runtime.test.mjs new file mode 100644 index 000000000..f0abfdd5b --- /dev/null +++ b/crates/agent-gateway/test/webui/tunnel-runtime.test.mjs @@ -0,0 +1,171 @@ +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { createServer } from "node:http"; +import { createRequire } from "node:module"; +import test from "node:test"; + +const require = createRequire(new URL("../../web/package.json", import.meta.url)); +const { JSDOM, VirtualConsole } = require("jsdom"); +const runtime = readFileSync(new URL("../../internal/server/tunnel_runtime.js", import.meta.url), "utf8"); +const prefix = "/t/runtime-test"; + +async function fixture(t) { + const requests = []; + const server = createServer((req, res) => { + requests.push(req.url); + if (!req.url.startsWith(`${prefix}/`)) { + res.writeHead(404).end("wrong root"); + } else if (req.url.includes(".js")) { + res.writeHead(200, { "Content-Type": "text/javascript" }); + res.end('window.executed = (window.executed || 0) + 1;'); + } else if (req.url.includes(".css")) { + res.writeHead(200, { "Content-Type": "text/css" }); + res.end("body { border-top-width: 7px; }"); + } else { + res.writeHead(200, { "Content-Type": "application/json" }).end('{"ok":true}'); + } + }); + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + t.after(() => new Promise((resolve) => server.close(resolve))); + const origin = `http://127.0.0.1:${server.address().port}`; + const dom = new JSDOM("", { + url: `${origin}${prefix}/`, + resources: "usable", + runScripts: "dangerously", + virtualConsole: new VirtualConsole(), + }); + t.after(() => dom.window.close()); + const { window } = dom; + const nativeSetAttribute = window.Element.prototype.setAttribute; + window.Request = Request; + window.fetch = fetch; + window.eval(`${runtime}(${JSON.stringify({ basePath: prefix })});`); + return { window, document: window.document, requests, origin, nativeSetAttribute }; +} + +function loaded(element) { + return new Promise((resolve, reject) => { + element.onload = resolve; + element.onerror = () => reject(new Error(`resource failed: ${element.src || element.href}`)); + }); +} + +test("dynamic scripts load and execute through the tunnel for native URL assignment paths", { timeout: 10000 }, async (t) => { + const { window, document, requests, origin } = await fixture(t); + const variants = [ + (script) => { script.src = "/property.js"; }, + (script) => { script.setAttribute("src", "/attribute.js?version=2"); }, + (script) => { script.setAttribute("SRC", "/uppercase.js"); }, + (script) => { script.setAttributeNS(null, "src", "/namespace.js"); }, + (script) => { script.src = `${origin}/absolute.js`; }, + (script) => { script.src = `//${new URL(origin).host}/protocol-relative.js`; }, + ]; + for (const connected of [false, true]) { + for (const assign of variants) { + const script = document.createElement("script"); + const done = loaded(script); + if (connected) document.head.append(script); + assign(script); + if (!connected) document.head.appendChild(script); + await done; + } + } + assert.equal(window.executed, variants.length * 2); + assert.equal(requests.length, variants.length * 2); + assert.ok(requests.every((url) => url.startsWith(`${prefix}/`)), requests.join("\n")); + assert.ok(requests.includes(`${prefix}/attribute.js?version=2`)); +}); + +test("dynamic stylesheets load via properties, attributes and detached HTML fragments", { timeout: 10000 }, async (t) => { + const { document, requests } = await fixture(t); + for (const useAttribute of [false, true]) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + const done = loaded(link); + document.head.append(link); + if (useAttribute) link.setAttribute("href", "/attribute.css"); + else link.href = "/property.css"; + await done; + assert.equal(link.sheet.cssRules.length, 1); + } + const template = document.createElement("template"); + template.innerHTML = ''; + const fragment = template.content.cloneNode(true); + const link = fragment.firstChild; + const done = loaded(link); + document.head.appendChild(fragment); + await done; + assert.equal(link.sheet.cssRules.length, 1); + assert.deepEqual(requests, [`${prefix}/property.css`, `${prefix}/attribute.css`, `${prefix}/fragment.css`]); +}); + +test("insertion APIs rewrite cloned resources before the first request", { timeout: 10000 }, async (t) => { + const { document, requests, nativeSetAttribute } = await fixture(t); + const insertions = [ + (node, anchor) => anchor.parentNode.appendChild(node), + (node, anchor) => anchor.parentNode.insertBefore(node, anchor), + (node, anchor) => anchor.parentNode.replaceChild(node, anchor), + (node, anchor) => anchor.parentNode.append(node), + (node, anchor) => anchor.parentNode.prepend(node), + (node, anchor) => anchor.parentNode.replaceChildren(node), + (node, anchor) => anchor.before(node), + (node, anchor) => anchor.after(node), + (node, anchor) => anchor.replaceWith(node), + (node, anchor) => anchor.insertAdjacentElement("afterend", node), + ]; + for (const [index, insert] of insertions.entries()) { + const container = document.createElement("div"); + const anchor = document.createElement("span"); + container.append(anchor); + document.body.append(container); + const source = document.createElement("script"); + nativeSetAttribute.call(source, "src", `/clone-${index}.js`); + const script = source.cloneNode(true); + const done = loaded(script); + insert(script, anchor); + await done; + } + assert.equal(requests.length, insertions.length); + assert.ok(requests.every((url) => url.startsWith(`${prefix}/clone-`)), requests.join("\n")); +}); + +test("resource rewriting preserves external, relative, typed and already-prefixed values", { timeout: 10000 }, async (t) => { + const { window, document, origin } = await fixture(t); + for (const value of [ + "./relative.js", "../relative.js", "https://cdn.example/lib.js", "//cdn.example/lib.js", + "data:text/javascript,void 0", "blob:https://example/id", `${prefix}/existing.js?v=1#fragment`, + `${origin}${prefix}/existing.js`, + ]) { + const script = document.createElement("script"); + script.src = value; + assert.equal(script.getAttribute("src"), value); + script.setAttribute("src", value); + assert.equal(script.getAttribute("src"), value); + } + const script = document.createElement("script"); + const typedValue = { toString: () => "/typed.js" }; + script.src = typedValue; + assert.equal(script.getAttribute("src"), "/typed.js"); + script.setAttribute("data-src", "/unrelated.js"); + assert.equal(script.getAttribute("data-src"), "/unrelated.js"); + const image = document.createElement("img"); + image.setAttribute("src", "/unchanged.png"); + assert.equal(image.getAttribute("src"), "/unchanged.png"); + const setter = Object.getOwnPropertyDescriptor(window.HTMLScriptElement.prototype, "src").set; + window.eval(`${runtime}(${JSON.stringify({ basePath: prefix })});`); + assert.equal(Object.getOwnPropertyDescriptor(window.HTMLScriptElement.prototype, "src").set, setter); +}); + +test("fetch Request and XHR still reach the target through the prefix", { timeout: 10000 }, async (t) => { + const { window, requests, origin } = await fixture(t); + const response = await window.fetch(new Request(`${origin}/api/health`)); + assert.deepEqual(await response.json(), { ok: true }); + await new Promise((resolve, reject) => { + const xhr = new window.XMLHttpRequest(); + xhr.onload = () => { assert.equal(xhr.status, 200); resolve(); }; + xhr.onerror = reject; + xhr.open("GET", "/api/xhr"); + xhr.send(); + }); + assert.deepEqual(requests, [`${prefix}/api/health`, `${prefix}/api/xhr`]); +}); diff --git a/crates/agent-gui/src/pages/ChatPage.tsx b/crates/agent-gui/src/pages/ChatPage.tsx index edaae4545..850dc01be 100644 --- a/crates/agent-gui/src/pages/ChatPage.tsx +++ b/crates/agent-gui/src/pages/ChatPage.tsx @@ -42,6 +42,7 @@ import { useMentionApps } from "@liveagent/ui/lib/chat/useMentionApps"; import { setPreferredMonacoNlsLocale } from "@liveagent/ui/lib/monacoNls"; import { releaseProjectToolFromDock } from "@liveagent/ui/lib/projectTools/releaseProjectToolFromDock"; import { useRightDockSettings } from "@liveagent/ui/lib/projectTools/useRightDockSettings"; +import { buildGatewayPublicBaseUrl } from "@liveagent/ui/lib/shared/gatewayPublicUrl"; import type { ConversationOpenOptions, ConversationOpenRequest, @@ -3679,7 +3680,10 @@ export function ChatPage(props: ChatPageProps) { gitWriteEnabled: true, tunnelEnabled, tunnelDisabledMessage, - tunnelPublicBaseUrl: settings.remote.gatewayUrl.trim(), + tunnelPublicBaseUrl: buildGatewayPublicBaseUrl( + settings.remote.gatewayUrl, + settings.remote.gatewayPort, + ), }, workspaceProjectRootClient: desktopWorkspaceProjectRootClient, workspaceRootRevision, @@ -3744,6 +3748,7 @@ export function ChatPage(props: ChatPageProps) { setSettings, setTerminalSessions, settings.customSettings, + settings.remote.gatewayPort, settings.remote.gatewayUrl, settings.ssh, tauriTunnelClient, @@ -4169,7 +4174,10 @@ export function ChatPage(props: ChatPageProps) { tunnelClient={isAgentMode ? tauriTunnelClient : null} tunnelEnabled={tunnelEnabled} tunnelDisabledMessage={tunnelDisabledMessage} - tunnelPublicBaseUrl={settings.remote.gatewayUrl.trim()} + tunnelPublicBaseUrl={buildGatewayPublicBaseUrl( + settings.remote.gatewayUrl, + settings.remote.gatewayPort, + )} workspaceActivityClient={tauriWorkspaceActivityClient} onWidthChange={handleRightDockWidthChange} onProjectStateChange={handleRightDockProjectStateChange} diff --git a/crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts b/crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts index 667181343..c3da9ffb7 100644 --- a/crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts +++ b/crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts @@ -13,6 +13,7 @@ import { } from "@liveagent/ui/lib/chat/uploadedFiles"; import { appendManagedSkillSelections } from "@liveagent/ui/lib/chat/useComposerActions"; import type { ScrollFollowHandle } from "@liveagent/ui/lib/chat-scroll/useScrollFollow"; +import { buildGatewayPublicBaseUrl } from "@liveagent/ui/lib/shared/gatewayPublicUrl"; import type { SidebarStore } from "@liveagent/ui/lib/sidebar/store"; import { buildSkillsSystemPrompt, @@ -1723,7 +1724,10 @@ export function useSendChatTurn(params: UseSendChatTurnParams) { ); }, remoteWebTunnelsEnabled: settings.remote.enableWebTunnels, - tunnelPublicBaseUrl: settings.remote.gatewayUrl.trim(), + tunnelPublicBaseUrl: buildGatewayPublicBaseUrl( + settings.remote.gatewayUrl, + settings.remote.gatewayPort, + ), sshHosts: settings.ssh.hosts, associatedSshHostIds: effectiveAssociatedSshHostIds, sshManagerRemoteAllowed: diff --git a/crates/agent-gui/test/settings/gateway-public-url.test.mjs b/crates/agent-gui/test/settings/gateway-public-url.test.mjs new file mode 100644 index 000000000..b5caf05a0 --- /dev/null +++ b/crates/agent-gui/test/settings/gateway-public-url.test.mjs @@ -0,0 +1,35 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { createTsModuleLoader } from "../helpers/load-ts-module.mjs"; + +const loader = createTsModuleLoader(); +const { buildGatewayPublicBaseUrl } = loader.loadModule( + "@liveagent/ui/lib/shared/gatewayPublicUrl.ts", +); +const { composePublicUrl } = loader.loadModule("@liveagent/ui/lib/tunnels/constants.ts"); + +for (const [name, address, port, expected] of [ + ["Docker published port", "http://127.0.0.1", 3000, "http://127.0.0.1:3000"], + ["custom TLS port", "https://gateway.example", 8443, "https://gateway.example:8443"], + ["default HTTP port", "http://gateway.example", 80, "http://gateway.example"], + ["default HTTPS port", "https://gateway.example", 443, "https://gateway.example"], + ["separate port wins", "http://127.0.0.1:8080", 3000, "http://127.0.0.1:3000"], + ["unspecified port", "http://127.0.0.1:3000/", undefined, "http://127.0.0.1:3000"], + ["zero port matches native fallback", "http://127.0.0.1:3000/", 0, "http://127.0.0.1:3000"], + ["IPv6", "http://[::1]", 3000, "http://[::1]:3000"], + ["proxy path", " https://gateway.example/agent/?q=1#old ", 8443, "https://gateway.example:8443/agent"], + ["WebSocket scheme", "wss://gateway.example/agent/", 443, "https://gateway.example/agent"], +]) { + test(`public tunnel URL preserves ${name}`, () => { + const base = buildGatewayPublicBaseUrl(address, port); + assert.equal(base, expected); + assert.equal(composePublicUrl(base, "/t/abc/"), `${expected}/t/abc/`); + }); +} + +test("invalid configuration cannot produce a clickable tunnel URL", () => { + for (const [address, port] of [["", 3000], ["not a URL", 3000], ["file:///tmp", 3000], + ["http://localhost", -1], ["http://localhost", 65536], ["http://localhost", 1.5]]) { + assert.equal(composePublicUrl(buildGatewayPublicBaseUrl(address, port), "/t/abc/"), ""); + } +}); diff --git a/crates/agent-gui/test/tools/tunnel-manager-tools.test.mjs b/crates/agent-gui/test/tools/tunnel-manager-tools.test.mjs index 8fc7bcce6..28f96ab65 100644 --- a/crates/agent-gui/test/tools/tunnel-manager-tools.test.mjs +++ b/crates/agent-gui/test/tools/tunnel-manager-tools.test.mjs @@ -77,6 +77,27 @@ test("TunnelManager is injected only when Remote Web Tunnels are enabled", async assert.equal(cronRegistry.hasTool("TunnelManager"), false); }); +test("TunnelManager public links use the configured gateway port, not the local target port", async () => { + const loader = createTsModuleLoader({ + mocks: { + "@tauri-apps/api/core": { + invoke: async () => createSnapshot([createTunnel({ targetUrl: "http://127.0.0.1:3099" })]), + }, + }, + }); + const { buildGatewayPublicBaseUrl } = loader.loadModule("@liveagent/ui/lib/shared/gatewayPublicUrl.ts"); + const { createTunnelManagerTools } = loader.loadModule("src/lib/tools/tunnelManagerTools.ts"); + const bundle = createTunnelManagerTools({ + enabled: true, + runtimeScope: "chat", + publicBaseUrl: buildGatewayPublicBaseUrl("http://127.0.0.1", 3000), + }); + const result = await bundle.executeToolCall(createToolCall({ action: "list" })); + assert.equal(result.isError, false); + assert.match(result.content[0].text, /public: http:\/\/127\.0\.0\.1:3000\/t\/abc123\//); + assert.match(result.content[0].text, /target: http:\/\/127\.0\.0\.1:3099/); +}); + test("TunnelManager list/create/close/check call gateway tunnel commands", async () => { const invocations = []; const tunnels = [createTunnel()]; diff --git a/crates/agent-ui/src/lib/shared/gatewayPublicUrl.ts b/crates/agent-ui/src/lib/shared/gatewayPublicUrl.ts new file mode 100644 index 000000000..607faf9f5 --- /dev/null +++ b/crates/agent-ui/src/lib/shared/gatewayPublicUrl.ts @@ -0,0 +1,20 @@ +// Match Desktop's build_ws_url: the separately configured port wins, and a +// reverse proxy's path prefix is retained. Default ports are normalized by URL. +export function buildGatewayPublicBaseUrl(gatewayUrl: string, gatewayPort?: number): string { + if (!gatewayUrl.trim()) return ""; + try { + const url = new URL(gatewayUrl.trim()); + if (url.protocol === "ws:") url.protocol = "http:"; + if (url.protocol === "wss:") url.protocol = "https:"; + if (url.protocol !== "http:" && url.protocol !== "https:") return ""; + if (gatewayPort !== undefined && gatewayPort !== 0) { + if (!Number.isInteger(gatewayPort) || gatewayPort < 1 || gatewayPort > 65_535) return ""; + url.port = String(gatewayPort); + } + url.search = ""; + url.hash = ""; + return url.toString().replace(/\/+$/, ""); + } catch { + return ""; + } +} diff --git a/crates/agent-ui/src/pages/settings/RemoteSection.tsx b/crates/agent-ui/src/pages/settings/RemoteSection.tsx index 3b2ca61f8..35db984e7 100644 --- a/crates/agent-ui/src/pages/settings/RemoteSection.tsx +++ b/crates/agent-ui/src/pages/settings/RemoteSection.tsx @@ -26,6 +26,7 @@ import { } from "@liveagent/ui/components/IconSet"; import { Input } from "@liveagent/ui/components/ui/input"; import { useLocale } from "@liveagent/ui/i18n/index"; +import { buildGatewayPublicBaseUrl } from "@liveagent/ui/lib/shared/gatewayPublicUrl"; import { cn } from "@liveagent/ui/lib/shared/utils"; import { normalizeIntegerDraftInput, @@ -205,20 +206,7 @@ function usePositiveIntegerDraft( } function buildGatewayEndpointPreview(settings: AppSettings["remote"]) { - const gatewayUrl = settings.gatewayUrl.trim(); - if (!gatewayUrl) return ""; - - try { - const url = new URL(gatewayUrl); - const port = String(settings.gatewayPort || 443); - url.port = port; - url.pathname = ""; - url.search = ""; - url.hash = ""; - return url.toString().replace(/\/$/, ""); - } catch { - return `${gatewayUrl}:${settings.gatewayPort || 443}`; - } + return buildGatewayPublicBaseUrl(settings.gatewayUrl, settings.gatewayPort); } function formatTimestamp(value?: number | null) { diff --git a/docs/architecture/gateway.md b/docs/architecture/gateway.md index 78898e90d..d1787e875 100644 --- a/docs/architecture/gateway.md +++ b/docs/architecture/gateway.md @@ -12,6 +12,36 @@ Gateway 是远程访问中继,不是 Agent 执行环境。它同时面对桌 | WebUI -> Gateway | WebSocket `/ws/v2`(Protobuf 帧) | 浏览器端发起 chat(command/subscribe)、直通 history/settings/skills/memory/cron 等请求,并订阅 `chat_event` 与同步广播。 | | WebUI -> Gateway | HTTP `/api/*` | 状态检查、文件上传、公网分享页、图片代理、静态资源。 | +## HTTP 隧道的公开地址与资源路径 + +HTTP 隧道通过 `/t//` 进入 Gateway,再沿 Agent 链路转发到桌面端配置的 +`targetUrl`。Gateway 返回的 `publicPath` 只包含路径,不猜测 Docker 发布端口或反代域名。 +Desktop 从 Remote 设置的 `gatewayUrl` **和** `gatewayPort` 统一生成公开基址;独立端口 +覆盖 URL 中的端口,与桌面端 WebSocket 连接规则一致。面板展示、复制、打开以及 +TunnelManager 工具输出使用同一基址。Gateway WebUI 则使用浏览器的 `window.location.origin`。 +例如 Gateway 宿主机端口为 `3000`、目标服务端口为 `3099` 时,公开链接是 +`http://127.0.0.1:3000/t//`,本地目标是 `http://127.0.0.1:3099/`。 + +Gateway 改写 HTML/CSS 和响应头中的资源路径,并在应用脚本前注入 +`internal/server/tunnel_runtime.js`。运行时处理 fetch/XHR/WebSocket/EventSource, +以及动态 `script.src`、`link.href`、`setAttribute`/`setAttributeNS` 和节点插入。 +资源地址必须在原生 DOM 操作之前改写,异步 MutationObserver 无法阻止首次错误请求。 +外部来源、相对资源地址、已带隧道前缀的地址保持原样。 + +此兼容层不等同于完整应用的 `basePath` 支持:原生 ES module 根路径导入、Worker、 +客户端路由及动态 HTML 字符串等机制仍需应用自行适配。绿色链路/中继/本地服务状态 +只证明对应连接或 HTTP 探测成功,不能替代实际浏览器中的资源加载和交互验证。 + +回归检查包括 `go test ./internal/server ./test/tunnel`(在 Gateway 目录执行)、 +`node --test crates/agent-gateway/test/webui/tunnel-runtime.test.mjs` 及 +`node --test crates/agent-gui/test/settings/gateway-public-url.test.mjs crates/agent-gui/test/tools/tunnel-manager-tools.test.mjs` +(后两条在仓库根目录执行)。 + +下图为最小复现页面的真实浏览器对照:端口行执行公开基址生成逻辑,动态脚本行使用 +原版和修复后的运行时请求同一 HTTP 服务;不是产品界面截图。 + +![隧道公开地址与动态脚本的修复前后对照](../images/tunnel-url-and-runtime-regression.png) + ## 入口与服务启动 | 文件 | 作用 | diff --git a/docs/images/tunnel-url-and-runtime-regression.png b/docs/images/tunnel-url-and-runtime-regression.png new file mode 100644 index 0000000000000000000000000000000000000000..5542f6a4bdeb10c96f3f909b96efd9dcfaa524a4 GIT binary patch literal 81451 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

7rSPSe#urX3_%8UM(FR9q)8i_4HB`YHNea%MT^e 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

    HQkfna(Hf;X#-`ipD^x7%vk{km^!bDIYM=gx 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 literal 0 HcmV?d00001