Telegram-iOS/docs/superpowers/plans
isaac e7662a3de5 Add typing-draft send delay
Delay outgoing messages while the peer in the same (peerId, threadId)
chat is live-typing an incoming message, gated via a new per-account
Postbox `.allTypingDrafts` view feeding a synchronous Set membership
check inside PendingMessageManager.

Postbox:
- Add `AllTypingDraftsView` tracking `Set<PeerAndThreadId>` of active
  typing drafts; expose via `PostboxViewKey.allTypingDrafts`.
- Disambiguate `PostboxViewKey` hash arms for `.typingDrafts` (constant
  prefix 23) and `.contacts` (16 → 24) to avoid runtime collisions
  with peerId-only arms and `.combinedReadState`. Hash values are
  runtime-only, so this is safe.

PendingMessageManager:
- Add `.waitingForSendGate(groupId:content:)` parking state for single
  messages and albums whose upload finished but are gated on a
  typing-draft-clearing event; update `groupId` accessor and
  `dataForPendingMessageGroup` so partially-parked albums drain on
  gate open.
- Add `.waitingForForwardSendGate` parking state for forwards (no
  associated values) so drain section (1) routes single non-grouped
  messages via `commitSendingSingleMessage` and section (3) routes
  forwards via `sendGroupMessagesContent`, avoiding the double-dispatch
  that occurred when forwards reused `.waitingForSendGate`.
- Subscribe to `.allTypingDrafts`; wire the gate at single-message,
  album, and forward send paths and at drain.
- Cleanup parked forwards on pending-message removal; snapshot
  Dictionary keys before iterating to avoid mutation during iteration.

Specs and plan documents are included under `docs/superpowers/`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 12:15:55 +04:00
..
2026-04-16-postbox-to-telegramengine-refactor-wave-1.md Postbox → TelegramEngine refactor: wave 1 2026-04-16 23:16:45 +02:00
2026-04-17-listview-pin-to-edge.md Display/ListView: pin first pinToEdgeWithInset item to bottom edge 2026-04-19 23:45:13 +02:00
2026-04-17-mediaresource-to-enginemediaresource-wave-2.md MediaResource → EngineMediaResource refactor: wave 2 2026-04-17 09:07:54 +02:00
2026-04-18-postbox-to-telegramengine-wave-3.md Postbox -> TelegramEngine wave 3: MediaBox fetch/status/data facades + SaveToCameraRoll 2026-04-19 23:45:34 +02:00
2026-04-18-postbox-to-telegramengine-wave-4.md Postbox -> TelegramEngine wave 4: TelegramEngine.Stickers.uploadSticker 2026-04-19 23:45:48 +02:00
2026-04-18-postbox-to-telegramengine-wave-5.md Postbox -> TelegramEngine wave 5: uploadSecureIdFile + SecureId context 2026-04-19 23:45:59 +02:00
2026-04-19-postbox-to-telegramengine-wave-6.md Postbox -> TelegramEngine wave 6: unused import Postbox batch sweep 2026-04-19 23:46:13 +02:00
2026-04-20-decrypt-match-python-port.md DecryptMatch: pure-Python port of fastlane match decrypt.rb 2026-04-20 18:45:34 +02:00
2026-04-20-postbox-to-telegramengine-wave-7.md Postbox -> TelegramEngine wave 7: last TelegramEngine.* facade leaks 2026-04-20 00:25:28 +02:00
2026-04-20-postbox-to-telegramengine-wave-8.md Postbox -> TelegramEngine wave 8: StorageUsageScreen domain-type migration 2026-04-20 00:39:19 +02:00
2026-04-20-postbox-to-telegramengine-wave-9.md Postbox -> TelegramEngine wave 9: StorageUsageScreen preferences-view rewrite 2026-04-20 01:11:50 +02:00
2026-04-20-postbox-to-telegramengine-wave-10.md Postbox -> TelegramEngine wave 10: StorageFileListPanelComponent drop 2026-04-20 01:46:18 +02:00
2026-04-21-swifttl-layered-schema-generation.md SwiftTL: plan for layered schema generation 2026-04-21 15:25:19 +04:00
2026-04-21-textstyleeditscreen-caret-tracking.md docs: TextStyleEditScreen caret-tracking plan 2026-04-21 23:58:07 +04:00
2026-04-24-contactlistpeer-engine-peer-migration.md Postbox -> TelegramEngine waves 27-36 2026-04-24 11:24:13 +04:00
2026-04-24-foundpeer-engine-peer-migration.md Postbox -> TelegramEngine waves 27-36 2026-04-24 11:24:13 +04:00
2026-04-24-makeChatQrCodeScreen-recentActions-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-makePeerInfoController-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-peerinfoscreen-helpers-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-peerinfoscreendata-peer-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-peertokentitle-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-rcp-peers-engine-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-renderedchannelparticipant-peer-engine-peer-migration.md Postbox -> TelegramEngine waves 37-43 + wave 44 design/plan (squashed) 2026-04-24 23:19:43 +04:00
2026-04-24-sendaspeer-engine-peer-migration.md Postbox -> TelegramEngine waves 27-36 2026-04-24 11:24:13 +04:00
2026-04-25-clearpeerhistory-openclearhistory-engine-peer.md Postbox -> TelegramEngine waves 46-93 (squashed) 2026-04-25 20:48:15 +04:00
2026-04-25-peerinfo-enclosingpeer-engine-peer.md Postbox -> TelegramEngine waves 46-93 (squashed) 2026-04-25 20:48:15 +04:00
2026-04-25-peerinfoscreendata-linked-peers-engine-peer.md Postbox -> TelegramEngine waves 46-93 (squashed) 2026-04-25 20:48:15 +04:00
2026-04-25-peerinfoscreendata-savedmessagespeer-engine-peer.md Postbox -> TelegramEngine waves 46-93 (squashed) 2026-04-25 20:48:15 +04:00
2026-04-25-phn-peer-stored-field-engine-peer.md Postbox -> TelegramEngine waves 46-93 (squashed) 2026-04-25 20:48:15 +04:00
2026-04-26-postbox-wave-103-chat-recent-actions-controller-node.md Postbox -> TelegramEngine waves 103-105 (squashed) 2026-04-26 16:57:55 +04:00
2026-04-26-postbox-wave-103-retry-account-manager-store-resource-data-drain.md Postbox -> TelegramEngine waves 103-105 (squashed) 2026-04-26 16:57:55 +04:00
2026-04-26-postbox-wave-104-account-manager-resource-data-drain-3-sites.md Postbox -> TelegramEngine waves 103-105 (squashed) 2026-04-26 16:57:55 +04:00
2026-04-26-postbox-wave-105-device-contact-info-subject-engine-peer.md Postbox -> TelegramEngine waves 103-105 (squashed) 2026-04-26 16:57:55 +04:00
2026-04-26-postbox-wave-106-import-drop-sweep.md docs: plan for postbox wave 106 — speculative import Postbox drop sweep round 2 2026-04-26 22:21:14 +04:00
2026-04-26-postbox-wave-106-pivot-engine-data-incremental.md docs: plan for postbox wave 106 pivot — engine data(incremental:) facade + drain 2026-04-26 22:43:53 +04:00
2026-04-30-typing-draft-send-delay.md Add typing-draft send delay 2026-04-30 12:15:55 +04:00