- Initialized in-memory settings in the repro issue test by resetting settings before theme setup.
- Reduced the UI/TUI CI test bucket chunk size from 10 to 5 to avoid cumulative Bun GC heap aborts.
Conforms to the repo Bun-over-Node guidance in AGENTS.md: 'NEVER use new Promise(r => setTimeout(r, ms))'. Drains the .then(applyCustomMessageDisplay) microtask chain via 'await Bun.sleep(0)' in the issue #1955 regression test.
ExtensionUiController.#applyCustomMessageDisplay rebuilt the chat from the freshly-persisted session entry as soon as the extension's session_start handler fired sendMessage({display:true}). main.ts then called mode.renderInitialMessages(undefined, {preserveExistingChat:true}), which snapshotted the chat children, cleared, re-rendered from session entries (adding the same custom message again), and re-appended the snapshot — leaving the message visible twice.
Gate the rebuild on a new InteractiveModeContext.initialChatRendered flag that UiHelpers.renderInitialMessages flips on first run. Before the initial transcript render, applyCustomMessageDisplay skips: renderInitialMessages will pick up the new session entry once. After it, the rebuild runs as today, so post-init extension sends (tool_result, agent_end, …) still surface immediately.
Fixes#1955