From 4b01e5b1639d1f56f177b0fc5bba59864a1b667f Mon Sep 17 00:00:00 2001 From: Chris Scott <99081550+chriswritescode-dev@users.noreply.github.com> Date: Mon, 4 May 2026 21:53:16 +0000 Subject: [PATCH 1/2] feat: per-agent model selection and UI refinements - Add agentModels store with setAgentModel/getAgentModel - PromptInput uses session model priority and stores agent model on change - useContextUsage derives model from assistant message instead of global - Migrate sub-agent/subtask badges from purple to blue with refined styling - Fix MoreDrawer sentinel to skip history-back on navigation --- .../src/components/message/MessagePart.tsx | 2 +- .../src/components/message/PromptInput.tsx | 33 ++++++++++++------- .../src/components/message/ToolCallPart.tsx | 14 +++++--- .../src/components/navigation/MoreDrawer.tsx | 8 +++-- frontend/src/hooks/useContextUsage.ts | 18 ++++++---- frontend/src/stores/modelStore.ts | 19 +++++++++++ 6 files changed, 69 insertions(+), 25 deletions(-) diff --git a/frontend/src/components/message/MessagePart.tsx b/frontend/src/components/message/MessagePart.tsx index 0534d1fd..223fc0f4 100644 --- a/frontend/src/components/message/MessagePart.tsx +++ b/frontend/src/components/message/MessagePart.tsx @@ -177,7 +177,7 @@ export const MessagePart = memo(function MessagePart({ part, role, allParts, par case 'subtask': { const label = part.description || part.prompt || 'Sub-agent task' return ( -
+
{label} sub-agent diff --git a/frontend/src/components/message/PromptInput.tsx b/frontend/src/components/message/PromptInput.tsx index 3faeac4d..3f97faaa 100644 --- a/frontend/src/components/message/PromptInput.tsx +++ b/frontend/src/components/message/PromptInput.tsx @@ -243,7 +243,9 @@ export const PromptInput = memo(forwardRef( queued: true }) setStoredAgent(sessionID, agentUsed) - if (model) { + if (sessionModel) { + setStoredModel({ providerID: sessionModel.providerID, modelID: sessionModel.modelID }) + } else if (model) { setStoredModel({ providerID: model.providerID, modelID: model.modelID }) } setPrompt('') @@ -297,7 +299,9 @@ export const PromptInput = memo(forwardRef( }) setStoredAgent(sessionID, agentUsed) - if (model) { + if (sessionModel) { + setStoredModel({ providerID: sessionModel.providerID, modelID: sessionModel.modelID }) + } else if (model) { setStoredModel({ providerID: model.providerID, modelID: model.modelID }) } setPrompt('') @@ -429,9 +433,13 @@ export const PromptInput = memo(forwardRef( setMentionRange(null) } - const handleAgentChange = (agent: string) => { - setLocalMode(agent) - setStoredAgent(sessionID, agent) + const handleAgentChange = (agentName: string) => { + setLocalMode(agentName) + setStoredAgent(sessionID, agentName) + const agent = agents.find(a => a.name === agentName) + if (agent?.model) { + setStoredModel({ providerID: agent.model.providerID, modelID: agent.model.modelID }) + } } const startVoiceRecording = async () => { @@ -1013,17 +1021,20 @@ if (isIOS && isSecureContext && navigator.clipboard && navigator.clipboard.read) } }, [clearStoreVariant, sessionAgent.model, sessionAgent.variant, sessionModelSyncKey, setActiveModel, setStoreVariant]) - const currentModel = modelString || '' + const sessionModel = sessionAgent.model + const sessionModelString = sessionModel ? `${sessionModel.providerID}/${sessionModel.modelID}` : null + const currentModel = sessionModelString || modelString || '' const displayModelName = useMemo(() => { - if (!model) { + const activeModel = sessionModel || model + if (!activeModel) { return currentModel } - const provider = providersData?.providers.find((item) => item.id === model.providerID) - const modelData = provider?.models?.[model.modelID] + const provider = providersData?.providers.find((item) => item.id === activeModel.providerID) + const modelData = provider?.models?.[activeModel.modelID] - return modelData ? formatModelName(modelData) : model.modelID || currentModel - }, [currentModel, model, providersData]) + return modelData ? formatModelName(modelData) : activeModel.modelID || currentModel + }, [currentModel, sessionModel, model, providersData]) const isMobile = useMobile() const { setShowDialog, hasForSession: hasPermissionsForSession } = usePermissions() const hasPendingPermissionForSession = hasPermissionsForSession(sessionID) diff --git a/frontend/src/components/message/ToolCallPart.tsx b/frontend/src/components/message/ToolCallPart.tsx index 0b2a7111..617a2480 100644 --- a/frontend/src/components/message/ToolCallPart.tsx +++ b/frontend/src/components/message/ToolCallPart.tsx @@ -158,11 +158,15 @@ export function ToolCallPart({ part, onFileClick, onChildSessionClick }: ToolCal const content = (
{isRunning ? ( - +
+ + + +
) : null} {description} sub-agent - {sessionId && } + {sessionId && }
) @@ -170,7 +174,7 @@ export function ToolCallPart({ part, onFileClick, onChildSessionClick }: ToolCal return (