47ed5e4964
Slack's Agents & AI Apps feature ships a native streaming surface that renders a live-typing message instead of the edit-based progressive updates the adapter used until now. The adapter now implements the existing draft-streaming interface: - supports_draft_streaming() opts in whenever the app is connected and native streaming hasn't been detected as unavailable. - send_draft() starts a stream on the first frame (chat.startStream, anchored to the resolved thread_ts, with recipient_team_id/user_id for channel streams) and appends only the delta on subsequent frames (chat.appendStream is append-only). The consumer's trailing cursor glyph is stripped before delta computation. - Unlike Telegram drafts (ephemeral, replaced by a real sendMessage), a Slack stream IS the final message. send() therefore intercepts the turn-final delivery for a chat with an active stream whose streamed text is a prefix of the final content, and seals it via chat.stopStream with the remaining delta instead of posting a duplicate. Rich Block Kit (when enabled) is applied to the sealed message via chat_update, mirroring the finalize path in edit_message. - Feature-gate errors from chat.startStream (not_allowed, missing_scope, unknown_method, ...) are cached on the adapter so subsequent runs skip straight to edit-based streaming with a single warning naming the fix (enable Agents & AI Apps for the app); transient errors only disable drafts for the current run via the consumer's existing send_draft failure handling. - Segment breaks (new draft_id) and disconnect() seal any open stream so chats are never left with a dangling live-typing indicator. No consumer or config changes: streaming.transport auto/draft now lights up native streaming on Slack through the same interface Telegram drafts use, and the edit-based path remains the fallback.