From 90e3ead5cb8a8453fedd98dc9dcb2fc894bfd14e Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:24:50 -0700 Subject: [PATCH] fix(native-chat): keep Claude option controls idle --- .../src/session/use-mobile-structured-session-options.ts | 6 ++++-- .../claude/claude-structured-journal-translation.test.ts | 9 +++++++++ src/main/claude/claude-structured-journal-translation.ts | 6 +++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/mobile/src/session/use-mobile-structured-session-options.ts b/mobile/src/session/use-mobile-structured-session-options.ts index b19b769700e..bb93daecf67 100644 --- a/mobile/src/session/use-mobile-structured-session-options.ts +++ b/mobile/src/session/use-mobile-structured-session-options.ts @@ -1,6 +1,9 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { getAgentSessionOptionCatalog } from '../../../src/shared/agent-session-option-catalog' -import type { AgentSessionOptionsResult } from '../../../src/shared/agent-session-wire' +import type { + AgentSessionOptionResult, + AgentSessionOptionsResult +} from '../../../src/shared/agent-session-wire' import type { SessionOptionValue } from '../../../src/shared/native-chat-session-options' import { applyStructuredAgentSessionOptions, @@ -9,7 +12,6 @@ import { createStructuredAgentSessionOptionState, structuredAgentSessionOptionSnapshot } from '../../../src/shared/structured-agent-session-options' -import type { AgentSessionOptionResult } from '../../../src/shared/agent-session-wire' import type { RpcClient } from '../transport/rpc-client' import type { MobileStructuredAgent } from './mobile-structured-session-create' import type { MobileNativeChatSessionOptionsController } from './use-mobile-native-chat-session-options' diff --git a/src/main/claude/claude-structured-journal-translation.test.ts b/src/main/claude/claude-structured-journal-translation.test.ts index 3546ec99b02..cf77988fdc6 100644 --- a/src/main/claude/claude-structured-journal-translation.test.ts +++ b/src/main/claude/claude-structured-journal-translation.test.ts @@ -173,6 +173,15 @@ describe('Claude structured journal translation', () => { }) }) + it('ignores empty user frames emitted by control-only requests', () => { + const state = sinkState() + const translator = createClaudeJournalTranslator({ sink: state.sink }) + + translator.handle(message('user', 'control-only', [])) + + expect(state.items).toEqual([]) + }) + it('creates addressable approval and multi-question cards and cancels them durably', () => { const state = sinkState() const bindings: unknown[][] = [] diff --git a/src/main/claude/claude-structured-journal-translation.ts b/src/main/claude/claude-structured-journal-translation.ts index fa97949e26a..3e5d8a4675c 100644 --- a/src/main/claude/claude-structured-journal-translation.ts +++ b/src/main/claude/claude-structured-journal-translation.ts @@ -195,7 +195,11 @@ export function createClaudeJournalTranslator( }) changed = true } - if (envelope.role === 'user' && message.parent_tool_use_id === null) { + if ( + envelope.role === 'user' && + envelope.content.length > 0 && + message.parent_tool_use_id === null + ) { if (currentTurn) { publishLifecycle(currentTurn.sessionId, currentTurn.turnId, false) }