From cb8b668aea8457791abf21ecb882dc9915389e95 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 22 Apr 2026 00:35:48 -0400 Subject: [PATCH 1/4] feat: update codex plugin to support 5.5 (#23789) --- packages/opencode/src/plugin/codex.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts index a0ff0002f48e..b7dc4d85ca9b 100644 --- a/packages/opencode/src/plugin/codex.ts +++ b/packages/opencode/src/plugin/codex.ts @@ -374,6 +374,7 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", + "gpt-5.5", ]) for (const [modelId, model] of Object.entries(provider.models)) { if (modelId.includes("codex")) continue From 8cbdba66688de370f3618ee3137378fe3cbe5839 Mon Sep 17 00:00:00 2001 From: Jacopo Binosi Date: Sun, 19 Apr 2026 15:11:16 +0200 Subject: [PATCH 2/4] fix(provider): auto-refresh AWS SSO credentials on expiry When fromNodeProviderChain throws CredentialsProviderError (expired or uninitialized SSO session), spawn 'aws sso login [--profile ]', await successful exit, then retry credential resolution transparently. The AI SDK never sees an error and the session continues uninterrupted. Detects by error .name (stable SDK contract) not message string. --- packages/opencode/src/provider/provider.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index fc835cf5ee00..0198d95c93df 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1,4 +1,5 @@ import os from "os" +import { spawn } from "child_process" import fuzzysort from "fuzzysort" import { Config } from "@/config/config" import { mapValues, mergeDeep, omit, pickBy, sortBy } from "remeda" @@ -309,7 +310,23 @@ function custom(dep: CustomDep): Record { // Build credential provider options (only pass profile if specified) const credentialProviderOptions = profile ? { profile } : {} - providerOptions.credentialProvider = fromNodeProviderChain(credentialProviderOptions) + const rawProvider = fromNodeProviderChain(credentialProviderOptions) + providerOptions.credentialProvider = async () => { + try { + return await rawProvider() + } catch (e) { + if (e instanceof Error && e.name === "CredentialsProviderError") { + await new Promise((resolve, reject) => { + const args = ["sso", "login", ...(profile ? ["--profile", profile] : [])] + const child = spawn("aws", args, { stdio: "pipe" }) + child.on("exit", (code) => (code === 0 ? resolve() : reject(e))) + child.on("error", () => reject(e)) + }) + return await rawProvider() + } + throw e + } + } } // Add custom endpoint if specified (endpoint takes precedence over baseURL) From 78690ebc047d94e04e77be07ed0b17746072639e Mon Sep 17 00:00:00 2001 From: bainos Date: Wed, 29 Apr 2026 15:40:40 +0200 Subject: [PATCH 3/4] feat(provider): notify user via toast when AWS SSO re-authentication triggers --- packages/opencode/src/provider/provider.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 0198d95c93df..fc0ad1c19414 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -29,6 +29,8 @@ import { withStatics } from "@/util/schema" import * as ProviderTransform from "./transform" import { ModelID, ProviderID } from "./schema" +import { Bus } from "@/bus" +import { TuiEvent } from "@/cli/cmd/tui/event" const log = Log.create({ service: "provider" }) @@ -316,10 +318,24 @@ function custom(dep: CustomDep): Record { return await rawProvider() } catch (e) { if (e instanceof Error && e.name === "CredentialsProviderError") { + void Bus.publish(TuiEvent.ToastShow, { + variant: "warning", + message: "AWS SSO session expired — re-authenticating...", + }) await new Promise((resolve, reject) => { const args = ["sso", "login", ...(profile ? ["--profile", profile] : [])] const child = spawn("aws", args, { stdio: "pipe" }) - child.on("exit", (code) => (code === 0 ? resolve() : reject(e))) + child.on("exit", (code) => { + if (code === 0) { + void Bus.publish(TuiEvent.ToastShow, { + variant: "success", + message: "AWS SSO re-authentication successful", + }) + resolve() + } else { + reject(e) + } + }) child.on("error", () => reject(e)) }) return await rawProvider() From 7dfa96dd9a7768f962f93f3745879912418b64e6 Mon Sep 17 00:00:00 2001 From: bainos Date: Thu, 30 Apr 2026 18:48:19 +0200 Subject: [PATCH 4/4] fix(provider): add required duration field to SSO toast notifications --- packages/opencode/src/provider/provider.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index fc0ad1c19414..c2c18471ddfa 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -321,6 +321,7 @@ function custom(dep: CustomDep): Record { void Bus.publish(TuiEvent.ToastShow, { variant: "warning", message: "AWS SSO session expired — re-authenticating...", + duration: 5000, }) await new Promise((resolve, reject) => { const args = ["sso", "login", ...(profile ? ["--profile", profile] : [])] @@ -330,6 +331,7 @@ function custom(dep: CustomDep): Record { void Bus.publish(TuiEvent.ToastShow, { variant: "success", message: "AWS SSO re-authentication successful", + duration: 5000, }) resolve() } else {