fix: restore variant restoration for OpenCode 1.4.0 (#871)

OpenCode 1.4.0 moved `UserMessage.variant` from the top-level to
`UserMessage.model.variant`. OpenChamber still read the legacy location,
so variant selection silently stopped being restored on sessions served
by OpenCode 1.4.0+.

Read `model.variant` first and fall back to the legacy top-level field
so both pre-1.4 and 1.4+ OpenCode servers keep working.
This commit is contained in:
Gyumin Lee
2026-04-11 23:50:13 +03:00
committed by GitHub
parent 291d00de8b
commit e6ac6badde
2 changed files with 10 additions and 4 deletions
@@ -655,7 +655,10 @@ const TurnBlock: React.FC<TurnBlockProps> = ({
const turnGroupingContextBase = React.useMemo(() => {
const userCreatedAt = (turn.userMessage.info.time as { created?: number } | undefined)?.created;
const rawVariant = (turn.userMessage.info as { variant?: unknown } | undefined)?.variant;
// OpenCode 1.4.0 moved variant from top-level to model.variant on UserMessage.
// Prefer the new location, fall back to the legacy one for older servers.
const info = turn.userMessage.info as { variant?: unknown; model?: { variant?: unknown } } | undefined;
const rawVariant = info?.model?.variant ?? info?.variant;
const userMessageVariant = typeof rawVariant === 'string' && rawVariant.trim().length > 0
? rawVariant
: undefined;
@@ -581,7 +581,7 @@ export const ModelControls: React.FC<ModelControlsProps> = ({
const latestLoadedUserChoice = React.useMemo(() => {
for (let i = currentSessionMessagesFromSync.length - 1; i >= 0; i -= 1) {
const message = currentSessionMessagesFromSync[i] as typeof currentSessionMessagesFromSync[number] & {
model?: { providerID?: string; modelID?: string };
model?: { providerID?: string; modelID?: string; variant?: string };
variant?: string;
mode?: string;
};
@@ -598,8 +598,11 @@ export const ModelControls: React.FC<ModelControlsProps> = ({
const agent = typeof message.agent === 'string' && message.agent.trim().length > 0
? message.agent
: (typeof message.mode === 'string' && message.mode.trim().length > 0 ? message.mode : undefined);
const variant = typeof message.variant === 'string' && message.variant.trim().length > 0
? message.variant
// OpenCode 1.4.0 moved variant from top-level to model.variant.
// Prefer the new location, fall back to the legacy one for older servers.
const variantCandidate = message.model?.variant ?? message.variant;
const variant = typeof variantCandidate === 'string' && variantCandidate.trim().length > 0
? variantCandidate
: undefined;
return { id: message.id, agent, providerID, modelID, variant };