diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 04ec4673ec4..4c354910856 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -246,7 +246,20 @@ export namespace Server { }, ) .use(async (c, next) => { - const directory = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd() + const rawDirectory = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd() + const directory = (() => { + const prefix = "opencode-uri:" + if (!rawDirectory.startsWith(prefix)) return rawDirectory + try { + return decodeURIComponent(rawDirectory.slice(prefix.length)) + } catch (error) { + log.warn("Failed to decode opencode-uri directory, falling back to process.cwd()", { + rawDirectory, + error, + }) + return process.cwd() + } + })() return Instance.provide({ directory, init: InstanceBootstrap, diff --git a/packages/sdk/js/src/client.ts b/packages/sdk/js/src/client.ts index 806ad26e55a..00f2466def5 100644 --- a/packages/sdk/js/src/client.ts +++ b/packages/sdk/js/src/client.ts @@ -5,6 +5,8 @@ import { type Config } from "./gen/client/types.gen.js" import { OpencodeClient } from "./gen/sdk.gen.js" export { type Config as OpencodeClientConfig, OpencodeClient } +const OPENCODE_DIRECTORY_HEADER_PREFIX = "opencode-uri:" + export function createOpencodeClient(config?: Config & { directory?: string }) { if (!config?.fetch) { const customFetch: any = (req: any) => { @@ -19,9 +21,22 @@ export function createOpencodeClient(config?: Config & { directory?: string }) { } if (config?.directory) { - config.headers = { - ...config.headers, - "x-opencode-directory": config.directory, + const directoryHeader = OPENCODE_DIRECTORY_HEADER_PREFIX + encodeURIComponent(config.directory) + if (config.headers instanceof Headers || Array.isArray(config.headers)) { + const headers = new Headers(config.headers) + headers.set("x-opencode-directory", directoryHeader) + config = { + ...config, + headers, + } + } else { + config = { + ...config, + headers: { + ...(config.headers ?? {}), + "x-opencode-directory": directoryHeader, + }, + } } } diff --git a/packages/sdk/js/src/v2/client.ts b/packages/sdk/js/src/v2/client.ts index 806ad26e55a..00f2466def5 100644 --- a/packages/sdk/js/src/v2/client.ts +++ b/packages/sdk/js/src/v2/client.ts @@ -5,6 +5,8 @@ import { type Config } from "./gen/client/types.gen.js" import { OpencodeClient } from "./gen/sdk.gen.js" export { type Config as OpencodeClientConfig, OpencodeClient } +const OPENCODE_DIRECTORY_HEADER_PREFIX = "opencode-uri:" + export function createOpencodeClient(config?: Config & { directory?: string }) { if (!config?.fetch) { const customFetch: any = (req: any) => { @@ -19,9 +21,22 @@ export function createOpencodeClient(config?: Config & { directory?: string }) { } if (config?.directory) { - config.headers = { - ...config.headers, - "x-opencode-directory": config.directory, + const directoryHeader = OPENCODE_DIRECTORY_HEADER_PREFIX + encodeURIComponent(config.directory) + if (config.headers instanceof Headers || Array.isArray(config.headers)) { + const headers = new Headers(config.headers) + headers.set("x-opencode-directory", directoryHeader) + config = { + ...config, + headers, + } + } else { + config = { + ...config, + headers: { + ...(config.headers ?? {}), + "x-opencode-directory": directoryHeader, + }, + } } }