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) }