From a102ba520b3102bcc7d13987654068287d8a2bb0 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 15 Jan 2025 08:20:20 +1100 Subject: [PATCH] feat: add pkce --- src/core/webview/ClineProvider.ts | 27 +++++++++++++++++++ src/extension.ts | 8 ++++++ .../src/components/settings/ApiOptions.tsx | 17 ++++++++---- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 4d8706b..0518bac 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1273,6 +1273,33 @@ export class ClineProvider implements vscode.WebviewViewProvider { return cacheDir } + async handleGlamaCallback(code: string) { + let apiKey: string + try { + const response = await axios.post("https://glama.ai/api/gateway/v1/auth/exchange-code", { code }) + if (response.data && response.data.apiKey) { + apiKey = response.data.apiKey + } else { + throw new Error("Invalid response from Glama API") + } + } catch (error) { + console.error("Error exchanging code for API key:", error) + throw error + } + + const glama: ApiProvider = "glama" + await this.updateGlobalState("apiProvider", glama) + await this.storeSecret("glamaApiKey", apiKey) + await this.postStateToWebview() + if (this.cline) { + this.cline.api = buildApiHandler({ + apiProvider: glama, + glamaApiKey: apiKey, + }) + } + // await this.postMessageToWebview({ type: "action", action: "settingsButtonClicked" }) // bad ux if user is on welcome + } + async readGlamaModels(): Promise | undefined> { const glamaModelsFilePath = path.join( await this.ensureCacheDirectoryExists(), diff --git a/src/extension.ts b/src/extension.ts index c6dd9c2..31ba8a7 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -139,6 +139,14 @@ export function activate(context: vscode.ExtensionContext) { return } switch (path) { + case "/glama": { + const code = query.get("code") + if (code) { + await visibleProvider.handleGlamaCallback(code) + } + break + } + case "/openrouter": { const code = query.get("code") if (code) { diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index cc30ae9..d726357 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -209,11 +209,12 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) = Glama API Key {!apiConfiguration?.glamaApiKey && ( - - You can get an Glama API key by signing up here. - + + Get Glama API Key + )}