From 31d156d7685c900598253f1b0c10df5b77f9a3ea Mon Sep 17 00:00:00 2001 From: Hikari Date: Wed, 11 Mar 2026 11:40:21 -0700 Subject: [PATCH] feat: display per-agent model override in agent monitor tree Parse the model field from Agent/Task tool input and surface it in the agent monitor panel as a purple subtitle, so users can immediately see which agents are running on a non-default model. Closes #207 --- src-tauri/src/types.rs | 2 ++ src-tauri/src/wsl_bridge.rs | 10 ++++++++-- src/lib/components/AgentMonitorPanel.svelte | 7 +++++++ src/lib/stores/agents.test.ts | 16 ++++++++++++++++ src/lib/tauri.ts | 2 ++ src/lib/types/agents.ts | 2 ++ 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/types.rs b/src-tauri/src/types.rs index 8fa1a9e..93fcf27 100644 --- a/src-tauri/src/types.rs +++ b/src-tauri/src/types.rs @@ -292,6 +292,8 @@ pub struct AgentStartEvent { pub conversation_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub parent_tool_use_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub model: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src-tauri/src/wsl_bridge.rs b/src-tauri/src/wsl_bridge.rs index 7fffbda..38bacd3 100644 --- a/src-tauri/src/wsl_bridge.rs +++ b/src-tauri/src/wsl_bridge.rs @@ -1301,14 +1301,19 @@ fn process_json_line( .and_then(|v| v.as_str()) .unwrap_or("unknown") .to_string(); + let model = input + .get("model") + .and_then(|v| v.as_str()) + .filter(|s| !s.is_empty()) + .map(|s| s.to_string()); let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap_or_default() .as_millis() as u64; tracing::debug!( - "Emitting agent-start: id={}, desc={}, type={}, parent={:?}", - id, description, subagent_type, parent_tool_use_id + "Emitting agent-start: id={}, desc={}, type={}, model={:?}, parent={:?}", + id, description, subagent_type, model, parent_tool_use_id ); let _ = app.emit( @@ -1318,6 +1323,7 @@ fn process_json_line( agent_id: None, // Will be updated when SubagentStart hook is received description, subagent_type, + model, started_at: now, conversation_id: conversation_id.clone(), parent_tool_use_id: parent_tool_use_id.clone(), diff --git a/src/lib/components/AgentMonitorPanel.svelte b/src/lib/components/AgentMonitorPanel.svelte index dd30635..db6eac6 100644 --- a/src/lib/components/AgentMonitorPanel.svelte +++ b/src/lib/components/AgentMonitorPanel.svelte @@ -309,6 +309,13 @@ {agent.description}

+ + {#if agent.model} +

+ ✦ {agent.model} +

+ {/if} +
{#if agent.status === "running"} diff --git a/src/lib/stores/agents.test.ts b/src/lib/stores/agents.test.ts index d9f5dd1..e6afa9e 100644 --- a/src/lib/stores/agents.test.ts +++ b/src/lib/stores/agents.test.ts @@ -43,6 +43,22 @@ describe("agents store", () => { expect(agents[0]).toMatchObject(agent); }); + it("preserves model field when provided", () => { + const agent = createMockAgent({ model: "claude-opus-4-6" }); + agentStore.addAgent(conversationId, agent); + + const agents = get(getAgentsForConversation(conversationId)); + expect(agents[0].model).toBe("claude-opus-4-6"); + }); + + it("leaves model undefined when not provided", () => { + const agent = createMockAgent(); + agentStore.addAgent(conversationId, agent); + + const agents = get(getAgentsForConversation(conversationId)); + expect(agents[0].model).toBeUndefined(); + }); + it("assigns a character name and avatar to added agents", () => { const agent = createMockAgent(); agentStore.addAgent(conversationId, agent); diff --git a/src/lib/tauri.ts b/src/lib/tauri.ts index cb0c501..ad1f434 100644 --- a/src/lib/tauri.ts +++ b/src/lib/tauri.ts @@ -515,6 +515,7 @@ export async function initializeTauriListeners() { agent_id, description, subagent_type, + model, started_at, conversation_id, parent_tool_use_id, @@ -526,6 +527,7 @@ export async function initializeTauriListeners() { agentId: agent_id, description, subagentType: subagent_type, + model, startedAt: started_at, status: "running", parentToolUseId: parent_tool_use_id, diff --git a/src/lib/types/agents.ts b/src/lib/types/agents.ts index 1803cbb..caf572c 100644 --- a/src/lib/types/agents.ts +++ b/src/lib/types/agents.ts @@ -6,6 +6,7 @@ export interface AgentInfo { agentType?: string; description: string; subagentType: string; + model?: string; startedAt: number; endedAt?: number; status: AgentStatus; @@ -21,6 +22,7 @@ export interface AgentStartPayload { agent_id?: string; description: string; subagent_type: string; + model?: string; started_at: number; conversation_id?: string; parent_tool_use_id?: string;