/** * botmux callback-button ownership marker. * * WHY: botmux reply/session/config cards carry callback buttons (🔊 语音总结 / * 关闭会话 / 重启 / 配置 …). When another bot reads such a card (history / * cross-bot relay / quote), a plain-text flattening renders them as * `[🔊 语音总结]` chrome it can never click — prompt pollution. The parser * strips any button it can PROVE is botmux's own callback; proof must not * depend on a hand-maintained action wordlist, because every new botmux * button added later would silently leak again until someone updates the list. * * HOW: every card botmux sends is stamped at the single egress choke point * (client.ts send/reply/ephemeral/update — all interactive traffic flows * through those four). Each `tag:'button'` gets a `__bm_cb:1` marker on its * callback payload — both real payload shapes: legacy top-level `value` and * v2 `behaviors:[{type:'callback', value}]`. Jump buttons (open_url) are left * unmarked so their URLs keep surfacing in flattened text. * * The marker round-trips to card-handler on click as an unknown key and is * ignored there; it is additive only. Cards sent by older botmux builds have * no marker — the parser's legacy action wordlist covers those. */ export declare const BOTMUX_CALLBACK_MARKER_KEY = "__bm_cb"; /** * Stamp every callback button in an interactive card's JSON. Idempotent and * total: on any JSON anomaly the input string is returned unchanged (a stamp * failure must never block an outbound message). Non-interactive content * should not be passed here at all (callers gate on msgType === 'interactive'), * but a non-card JSON body is tolerated harmlessly. */ export declare function stampBotmuxCallbackMarkers(cardJson: string): string; /** True when `el` is a button stamped by stampBotmuxCallbackMarkers. */ export declare function hasBotmuxCallbackMarker(el: any): boolean; //# sourceMappingURL=callback-button-marker.d.ts.map