68baba82d2
Before this change, every navigateTree → renderInitialMessages call path performed two independent O(N) session-tree walks: 1. agent-session.ts:6586 buildDisplaySessionContext() [inside navigateTree] 2. ui-helpers.ts:402 sessionManager.buildSessionContext() [inside renderInitialMessages] Changes: - agent-session.ts: navigateTree() now calls sessionManager.buildSessionContext() once, derives the display (deobfuscated) context from the raw result, and returns the raw SessionContext in the result object. - ui-helpers.ts: renderInitialMessages() accepts an optional prebuiltContext parameter; reuses it when provided, falls back to buildSessionContext() otherwise. - interactive-mode.ts: forwards prebuiltContext through the wrapper. - modes/types.ts: updates InteractiveModeContext interface to match. - selector-controller.ts: passes result.sessionContext from navigateTree into renderInitialMessages(), closing the deduplication loop. Bench (100-msg session, 200 iterations): two walks [BEFORE]: 0.0702ms/op one walk [AFTER]: 0.0298ms/op Saved: 0.0404ms/navigation (57.5% reduction per navigate) Tests: render-initial-messages-dedupe.test.ts asserts buildSessionContext is called 0 times when a prebuilt context is passed, 1 time as fallback.