diff --git a/src/renderer/pages/home/shared/controls.tsx b/src/renderer/pages/home/shared/controls.tsx
index e049e02..b8bb572 100644
--- a/src/renderer/pages/home/shared/controls.tsx
+++ b/src/renderer/pages/home/shared/controls.tsx
@@ -678,6 +678,7 @@ export function EndpointTitleBar({
const statusLabel = running ? t("running") : t("not running");
const value = endpoint.trim() || t("Not configured");
const loopbackEndpoint = loopbackEndpointFromStatus(value, config);
+ const loopbackBaseUrl = gatewayBaseUrlFromEndpoint(loopbackEndpoint);
const networkEndpoints = running ? gatewayStatus.networkEndpoints ?? [] : [];
async function copyEndpoint(valueToCopy: string, key: string) {
@@ -764,21 +765,24 @@ export function EndpointTitleBar({
>
void copyEndpoint(valueToCopy, `loopback:${loopbackEndpoint}`)}
+ value={loopbackBaseUrl}
+ onCopy={(valueToCopy) => void copyEndpoint(valueToCopy, `loopback:${loopbackBaseUrl}`)}
/>
- {networkEndpoints.map((entry, index) => (
- void copyEndpoint(valueToCopy, `network:${entry.interfaceName}:${entry.address}`)}
- />
- ))}
+ {networkEndpoints.map((entry, index) => {
+ const baseUrl = gatewayBaseUrlFromEndpoint(entry.endpoint);
+ return (
+ void copyEndpoint(valueToCopy, `network:${entry.interfaceName}:${entry.address}`)}
+ />
+ );
+ })}
@@ -845,6 +849,29 @@ function loopbackEndpointFromStatus(endpoint: string, config: AppConfig): string
}
}
+function gatewayBaseUrlFromEndpoint(endpoint: string): string {
+ try {
+ const parsed = new URL(endpoint);
+ parsed.pathname = appendGatewayBasePath(parsed.pathname);
+ parsed.search = "";
+ parsed.hash = "";
+ return parsed.toString().replace(/\/$/, "");
+ } catch {
+ return `${endpoint.replace(/\/+$/, "")}/v1`;
+ }
+}
+
+function appendGatewayBasePath(pathname: string): string {
+ const normalized = pathname.replace(/\/+$/, "");
+ if (!normalized || normalized === "/") {
+ return "/v1";
+ }
+ if (normalized.endsWith("/v1")) {
+ return normalized;
+ }
+ return `${normalized}/v1`;
+}
+
async function copyEndpointTextToClipboard(value: string): Promise {
if (navigator.clipboard?.writeText) {
try {