d5d3086b41
The board listed every model while the composer honoured the user's Edit Models shortlist, because visibility arrived as a prop each caller opted into. Curation is one stored preference, so a per-caller opt-in guarantees the two surfaces eventually disagree about what "my models" means — the exact drift extracting the menu was meant to end. ModelCatalogMenu now reads $visibleModels itself and renders the Edit Models row, so every picker shows the same shortlist and offers the same way to change it. The composer's footer keeps only Refresh Models. No plugin surface is involved: the menu is core and the plugin just mounts it. Also restores the session-scoped catalog fetch the extraction dropped. The composer's query key must carry its session id — the app invalidates the session-scoped key on model changes, so a global key would have gone stale mid-conversation.