1e69c12b64
Cherry-picked from PR #101542 by @sohomsahaun. Two-step drill-down: provider static_select → model static_select, with Back/Cancel buttons. Resolves through the same gateway callback as Discord/Telegram, so persistence and failed-switch rollback semantics come for free. Changes: - send_model_picker() posts Block Kit provider/model picker via chat_postMessage - _handle_model_picker_action() dispatches provider/model/back/cancel actions - _model_picker_state bounded dict (cap=100, workspace-scoped keys) - Expired-state UX: missing state rewrites message to expiry notice - Failure header: both exception and gateway error-prefix get 'Failed' header - Index-based option values avoid Slack's 75-char value cap - 21 tests covering send, action dispatch, gateway integration Co-authored-by: Sohom Sahaun <ssahaun19@gmail.com>