refactor(gateway): shared exec-approval/picker formatting cores in base adapter
- base._format_exec_approval(command, description, smart_denied): shared
header/fence/reason/smart-deny assembly driven by _EA_* template attrs and
an _ea_escape() hook; base._format_choice_page(options, page, per_page):
shared pagination core returning (page_options, meta) incl. the
' (N-M of T)' page_info suffix; base._truncate_preview: the shared
truncate-with-ellipsis idiom.
- telegram (HTML attrs + _html.escape hook), feishu (card markdown attrs),
matrix (head-only; local reaction-legend tail) rewired; telegram's
provider/model keyboard pagination and slash-confirm preview use the
shared cores. All user-visible strings byte-identical (parity-tested).
- slack/discord/teams left untouched: their formatting interleaves
platform-specific budget arithmetic (Slack 3000-char section budget
subtraction, Discord mention-prefix + dual content/embed budgets, Teams
adaptive-card blocks) beyond template params.
- tests/gateway/test_interactive_prompt_base.py covers the cores + parity.