{"content":"feat: bind the WeChat bot from the PWA (Me > WeChat Bot) — 4afcfe32 on feat/pwa-weixin-bind (cut from main 4e419f76).\n\nWhat: new Me-page entry + WeixinBindPage that drives the weixin iLink QR authorization remotely over the C2 gateway, so a cloud tenant can bind its WeChat bot straight from the phone (pay → headless deploy → scan → chat with the Twin bot inside WeChat).\n\nHow: feature-detect the im facade (mock/SSR degrade to a not-available note) → pin config.weixin.metabotId to the Twin bot BEFORE binding (first inbound message after scan-confirm reads it; late write could create a null-metabot session) → im.weixinLoginStart returns the iLink QR content, rendered client-side with the qrcode lib (no large payload crosses the gateway's 4000-char sanitize cap) → poll im.getStatus + im.weixinCheckCredentials every 2s; on scan-confirm the main process auto-enables and auto-starts the channel (imGatewayManager.startWeixinLogin) → done view with disable action. Poll classification is a pure exported helper: the status only reports idle|wait|scanned, so a quiet loginPending:false poll with no credentials reads as QR-dead. Mid-binding unmount cancels the pending QR.\n\nContract: zero frozen-contract change — every channel used is already allowlist tier P2 (im:config:get/set, im:status:get, im:gateway:stop, im:weixin:login:start/cancel, im:weixin:credentials:check).\n\nVerification: tsc --noEmit green; full test:mobile gate green (registry pins updated to seven entries + SSR pin + classifier cases in mobileMeIa); compile:electron run for dist-electron-dependent suites.\n\nFollow-ups: real-device acceptance of WeChat long-press QR recognition (save-screenshot fallback copy is in the page), e2e spec on a real-gateway harness, and the pay→provision→entry-URL bridge on the control-plane/Metaso side.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}