Add custom headers to direct connections (#2922)

* Add custom headers to direct connections

* Address custom header review feedback

* Fix direct connection header integration

* Fix desktop relay E2E transport setup

---------

Co-authored-by: Claude <claude@Claudes-Mac-mini.local>
Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
Claude
2026-08-06 11:05:40 +02:00
committed by GitHub
co-authored by Claude Mohamed Boudra
parent 098122be8d
commit 73ba37a07a
38 changed files with 1190 additions and 125 deletions
@@ -2998,7 +2998,7 @@ describe("HostRuntimeStore", () => {
}
});
it("upsertDirectConnection stores SSL and password settings", async () => {
it("upsertDirectConnection stores SSL, password, and custom header settings", async () => {
const store = new HostRuntimeStore({
deps: {
createClient: () => new FakeDaemonClient() as unknown as DaemonClient,
@@ -3016,6 +3016,7 @@ describe("HostRuntimeStore", () => {
endpoint: "example.paseo.test:7443",
useTls: true,
password: "shared-secret",
headers: { "X-Tenant": "acme" },
label: "tls host",
});
@@ -3027,6 +3028,7 @@ describe("HostRuntimeStore", () => {
endpoint: "example.paseo.test:7443",
useTls: true,
password: "shared-secret",
headers: { "X-Tenant": "acme" },
},
]);
+10
View File
@@ -36,6 +36,7 @@ import {
import {
buildLocalDaemonTransportUrl,
createDesktopLocalDaemonTransportFactory,
createDesktopWebSocketTransportFactory,
} from "@/desktop/daemon/desktop-daemon-transport";
import { getDesktopHost } from "@/desktop/host";
import { CLIENT_CAPS } from "@getpaseo/protocol/client-capabilities";
@@ -477,6 +478,7 @@ function createDefaultDeps(): HostRuntimeControllerDeps {
return {
createClient: ({ host, connection, clientId, runtimeGeneration }) => {
const localTransportFactory = createDesktopLocalDaemonTransportFactory();
const webSocketTransportFactory = createDesktopWebSocketTransportFactory();
const base = {
suppressSendErrors: true,
clientId,
@@ -499,10 +501,12 @@ function createDefaultDeps(): HostRuntimeControllerDeps {
if (connection.type === "directTcp") {
return new DaemonClient({
...base,
...(webSocketTransportFactory ? { transportFactory: webSocketTransportFactory } : {}),
url: buildDaemonWebSocketUrl(connection.endpoint, {
useTls: connection.useTls ?? false,
}),
...(connection.password ? { password: connection.password } : {}),
...(connection.headers ? { headers: connection.headers } : {}),
});
}
return new DaemonClient({
@@ -1640,6 +1644,7 @@ export class HostRuntimeStore {
endpoint: string;
useTls?: boolean;
password?: string;
headers?: Record<string, string>;
label?: string;
existingClient?: DaemonClient;
}): Promise<HostProfile> {
@@ -1654,6 +1659,7 @@ export class HostRuntimeStore {
endpoint,
useTls: input.useTls ?? false,
...(password ? { password } : {}),
...(input.headers ? { headers: input.headers } : {}),
},
existingClient: input.existingClient,
});
@@ -1695,6 +1701,7 @@ export class HostRuntimeStore {
endpoint: string;
useTls?: boolean;
password?: string;
headers?: Record<string, string>;
label?: string;
}): Promise<{ profile: HostProfile; serverId: string; hostname: string | null }> {
const endpoint = normalizeHostPort(input.endpoint);
@@ -1707,6 +1714,7 @@ export class HostRuntimeStore {
endpoint,
useTls: input.useTls ?? false,
...(password ? { password } : {}),
...(input.headers ? { headers: input.headers } : {}),
},
});
}
@@ -2431,12 +2439,14 @@ export interface HostMutations {
endpoint: string;
useTls?: boolean;
password?: string;
headers?: Record<string, string>;
label?: string;
}) => Promise<HostProfile>;
probeAndUpsertDirectConnection: (input: {
endpoint: string;
useTls?: boolean;
password?: string;
headers?: Record<string, string>;
label?: string;
}) => Promise<{ profile: HostProfile; serverId: string; hostname: string | null }>;
upsertRelayConnection: (input: {