using AcDream.Core.Net; namespace AcDream.Runtime.Session; public sealed record LiveSessionCharacterSelector( int? ActiveIndex = null, uint? CharacterId = null, string? CharacterName = null); public sealed record LiveSessionConnectOptions( bool Enabled, string Host, int Port, string User, string Password, LiveSessionCharacterSelector? Character = null, /// /// Campaign LA slice LA2: short-circuits /// 's connect transaction right after /// the roster report (before TrySelectCharacter/ /// ApplySelectedCharacter/EnterWorld) — connect, receive /// CharacterList, report the roster, gracefully disconnect via the /// same StopCore teardown the /// path already uses, and return /// . The pinned launch /// contract (docs/plans/2026-08-14-launcher-campaign.md LA1's /// mode field) requires a probe session to omit both /// and its policy entirely, but the controller /// itself does not enforce that pairing — the headless config loader /// does, before a is ever built. /// bool Probe = false, /// /// Keep the connected transport in Runtime's pre-world selection state /// instead of applying the legacy first-available fallback. Graphical /// composition enables this only when no explicit selector was supplied; /// direct/headless callers retain the existing default behavior. /// bool AwaitCharacterSelection = false); public interface IRuntimeLiveSessionFramePhase { void Tick(); } public interface ILiveSessionEventRouting : IDisposable { void Attach(); } public interface ILiveSessionCommandRouting : IDisposable { void Activate(); }