2026-02-03 20:07:02 -06:00
|
|
|
/**
|
|
|
|
|
* Builds HTTP Basic Auth header from environment variables.
|
|
|
|
|
*
|
|
|
|
|
* @returns Basic Auth header string, or undefined if OPENCODE_SERVER_PASSWORD is not set
|
|
|
|
|
*/
|
|
|
|
|
export function getServerBasicAuthHeader(): string | undefined {
|
|
|
|
|
const password = process.env.OPENCODE_SERVER_PASSWORD
|
|
|
|
|
if (!password) {
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const username = process.env.OPENCODE_SERVER_USERNAME ?? "opencode"
|
|
|
|
|
const token = Buffer.from(`${username}:${password}`, "utf8").toString("base64")
|
|
|
|
|
|
|
|
|
|
return `Basic ${token}`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Injects HTTP Basic Auth header into the OpenCode SDK client.
|
|
|
|
|
*
|
|
|
|
|
* This function accesses the SDK's internal `_client.setConfig()` method.
|
|
|
|
|
* While `_client` has an underscore prefix (suggesting internal use), this is actually
|
|
|
|
|
* a stable public API from `@hey-api/openapi-ts` generated client:
|
|
|
|
|
* - `setConfig()` MERGES headers (does not replace existing ones)
|
|
|
|
|
* - This is the documented way to update client config at runtime
|
|
|
|
|
*
|
|
|
|
|
* @see https://github.com/sst/opencode/blob/main/packages/sdk/js/src/gen/client/client.gen.ts
|
|
|
|
|
* @throws {Error} If OPENCODE_SERVER_PASSWORD is set but client structure is incompatible
|
|
|
|
|
*/
|
|
|
|
|
export function injectServerAuthIntoClient(client: unknown): void {
|
|
|
|
|
const auth = getServerBasicAuthHeader()
|
|
|
|
|
if (!auth) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-04 14:52:31 +09:00
|
|
|
try {
|
|
|
|
|
if (
|
|
|
|
|
typeof client !== "object" ||
|
|
|
|
|
client === null ||
|
|
|
|
|
!("_client" in client) ||
|
|
|
|
|
typeof (client as { _client: unknown })._client !== "object" ||
|
|
|
|
|
(client as { _client: unknown })._client === null
|
|
|
|
|
) {
|
|
|
|
|
throw new Error(
|
|
|
|
|
"[opencode-server-auth] OPENCODE_SERVER_PASSWORD is set but SDK client structure is incompatible. " +
|
|
|
|
|
"This may indicate an OpenCode SDK version mismatch."
|
|
|
|
|
)
|
|
|
|
|
}
|
2026-02-03 20:07:02 -06:00
|
|
|
|
2026-02-04 14:52:31 +09:00
|
|
|
const internal = (client as { _client: { setConfig?: (config: { headers: Record<string, string> }) => void } })
|
|
|
|
|
._client
|
2026-02-03 20:07:02 -06:00
|
|
|
|
2026-02-04 14:52:31 +09:00
|
|
|
if (typeof internal.setConfig !== "function") {
|
|
|
|
|
throw new Error(
|
|
|
|
|
"[opencode-server-auth] OPENCODE_SERVER_PASSWORD is set but SDK client._client.setConfig is not a function. " +
|
|
|
|
|
"This may indicate an OpenCode SDK version mismatch."
|
|
|
|
|
)
|
|
|
|
|
}
|
2026-02-03 20:07:02 -06:00
|
|
|
|
2026-02-04 14:52:31 +09:00
|
|
|
internal.setConfig({
|
|
|
|
|
headers: {
|
|
|
|
|
Authorization: auth,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
} catch (error) {
|
|
|
|
|
const message = error instanceof Error ? error.message : String(error)
|
|
|
|
|
console.warn(`[opencode-server-auth] Failed to inject server auth: ${message}`)
|
|
|
|
|
}
|
2026-02-03 20:07:02 -06:00
|
|
|
}
|