Repository navigation
feat(client)!: Integrate cached messaging and configurable TUI - #45
Merged
Merged
Conversation
Run dialog, history, send, link, button and read requests in a bounded JoinSet while one coordinator owns worker state. Preserve the in-flight update future across command and completion branches, and abort child tasks when their owner exits. Protect history and dialog snapshots against newer live changes. Start the update stream before the initial dialog request and stop truncating catch-up payloads. Validation: cargo fmt --all -- --check; cargo clippy --locked --all-targets --all-features -- -D warnings; cargo test --locked --all-targets --all-features (151 tests). Live Telegram latency has not been measured.
Follow Telegram startup recovery guidance: begin with the common difference and let channel gap notifications request targeted recovery. Preserve a known local channel PTS when updateChannelTooLong carries a newer remote PTS. Patch grammers-session 0.10.0 at upstream 5c6d44ff30e02d6c9295bcf1fcb51403ad77c981. Keep the original recovery engine and upstream tests; adjust the connection-flow assertion. Validation: fmt, strict all-targets clippy, and all-feature tests (153 tests), including a 500-channel startup and local-cursor gap regression.
Keep account-local messages, dialogs, attachment locations and complete update checkpoints in SQLite. Serve cached histories while the network worker connects and reconcile history snapshots without undoing newer edits or deletions. Clear cache content when the authenticated account changes or Telegram invalidates an old message range. Use libSQL already present in the dependency graph and retain rollback journaling. Vendor grammers-client 0.10.0 at 5c6d44ff30e02d6c9295bcf1fcb51403ad77c981 to expose whole update batches, restore application-owned cursors and report too-long differences. Preserve original licenses and record adaptations in vendor/README.md. Validation: formatting, strict Clippy and all-target/all-feature tests (156 tests), including restart, rollback, account isolation, complete-batch delivery and offline application navigation.
Keep startup commands bounded until authentication completes, clear stale account state and queued operations on identity changes, and consistently settle failed requests. Persist the initial update checkpoint even when a session receives no live messages. Drive active group recovery through a watch channel and the existing Grammers message-box engine. Respect the server timeout, stop short polling on focus changes, and never advance a known cursor when activating a group. Validation: strict Clippy, formatting, 157 application/integration tests and all 20 upstream grammers-session library tests. No logged-in latency benchmark was performed.
Reuse Yazi key parsing with declarative mlua configuration, message counts, chords, stable chat aliases and effective-binding help. Fetch older history pages on demand and cache only explicitly complete page boundaries. Derive configurable composer ghost text from the active bindings and remove repeated composer labels. Include bilingual configuration documentation. Validation: formatting, strict all-target/all-feature Clippy, 157 tests. BREAKING CHANGE: j/k navigate messages; use arrows for rendered rows. Use gg/Home for the oldest loaded message and G/End for the latest page.
Cache folder rules and order per account, retain pinned ordering, and navigate folders without losing conversation drafts. Refresh metadata after remote changes and apply incoming unread counts. Reuse Grammers raw API methods and follow Telegram Desktop membership precedence. Validation: formatting, strict Clippy, and 159 tests.
Add scoped local search, cancellable bounded background scans, result pagination, cache coverage and validated cached context. Preserve queries, drafts and unread state during historical navigation. Document the controls in English and Simplified Chinese. Validation: formatting, strict Clippy, and 161 tests.
Add a named ANSI color picker, terminal-default chat foreground and stable folder colors. Keep Lua defaults and managed per-account overrides separate, and reuse the atomic settings writer. Preserve preferences across cache resets and document precedence in both languages. Validation: formatting, strict Clippy, and 163 tests.
Bind O to reveal originals, reusing full previews or downloading before reveal. Track media IDs and request generations so edits and deletes reject stale transfers. Reuse tempfile for partial-file cleanup and preserve account cache ownership through background tasks. Bound completed media and cache metadata retention. Document platform behavior, cache paths and the O to g o binding migration in English and Simplified Chinese. Validation: formatting, strict Clippy, and 167 tests.
Track the actual last-message ID instead of deriving previews from a bounded history window. Clear deleted previews, refresh authoritative dialog state, and preserve intervening changes across slower snapshots. Seed startup watermarks and count cached incoming messages only once. Validation: formatting, strict Clippy, and 169 tests.
Support fixed Lua navigation counts and restore QR login key routing. Derive controls from effective bindings, preserve composer state when toggling overlays, and keep primary search controls visible on narrow terminals. Validation: formatting, strict all-target Clippy, and all-target/all-feature tests (172 passed).
Move detailed setup, configuration, keybindings, workflows, terminal behavior, releases, and architecture into matching English and Simplified Chinese Wiki sources. Add a small flat-page exporter and CI link/parity validation. Validation: 27 source pages, 28 exported pages, internal links and all 48 actions checked in both languages. No runtime code changes.
Keep main, archive, and custom-folder pin orders independent, persist server pins, and add native pin/reorder and archive/restore actions. Preserve chat selection and resolve aliases through the correct folder. Apply custom-filter edits to fresh server objects and preserve explicit membership when unpinning, following Telegram Desktop 4d4da471fbee771c10e173a83c003ba1728989f1 data/data_chat_filters.cpp. Archived chats live in Archive and are excluded from All chats. Validation: 174 tests pass, strict Clippy, cargo fmt, Wiki language/link validation and git diff --check. Live Telegram mutations were not exercised.
Add cached pinned-message pages, a compact conversation banner, and navigation to pinned context without marking unseen history read. Keep private-chat and group pin options explicit, support unpin/all, and coalesce background refreshes alongside live updates. Preserve live unpins, edits and deletions across stale requests, keep account/cache retention boundaries, and document contextual Lua actions in English and Simplified Chinese. Follow Telegram Desktop 4d4da471fbee771c10e173a83c003ba1728989f1 pin-message dialog behavior. Validation: 178 tests, strict Clippy, formatting and 29-page bilingual Wiki validation passed; cache regressions passed again after retention integration. Live account mutations were not exercised.
Discard pin-page and context revisions when Telegram invalidates cached history. Clear stale previews and confirmations, reload open pin lists, and invalidate worker metadata refreshes before recovery starts. Keep drafts, unrelated chats and in-flight mutations intact. Validate with 180 tests, including channel/global invalidation and stale read results, strict Clippy, formatting and bilingual Wiki checks.
Add an opt-in glyph adapter for chats, folders, pins and attachments. Keep semantic labels and default plain-font output, and reuse existing Unicode cell layout. Document terminal font selection in both languages. Validate with 181 tests, strict Clippy, formatting and Wiki parity/link checks. No font assets or additional dependencies are included.
Document one Cargo Git command for Linux, macOS and Windows, including pinned toolchains, native build prerequisites, install roots and updates. Make vendored Lua explicit and report commit-height versions for Git builds. Install and package each CI release through Cargo from a clean Git revision, exercising repository patches, locked dependencies and installation tracking on all six native platforms. Retain release version and credential overrides. Validate with 181 tests, strict Clippy, formatting and bilingual Wiki checks.
A Git install using the workspace target directory reused an older release build-script executable. Keep installation artifacts in target/cargo-install so cached workspace metadata cannot enter the Git installation pipeline. Validate workflow syntax and bilingual documentation.
Cargo creates an untracked .cargo-ok marker in fetched Git checkouts. Ignore that generated marker so an unmodified source installation is not labeled dirty, and document that the checkout branch can differ from the requested Git branch.
Windows ARM64 fails the multi-process session check before native Cargo installation, but the existing assertion discards subprocess output and exit status. Capture both output streams and report every failed writer after reaping all children so platform failures are actionable. Validation: the session concurrency integration test, targeted strict Clippy, formatting and diff whitespace checks pass on macOS arm64.
Native Windows ARM64 installation validation exposed a session writer access violation (0xc0000005). libSQL 0.9.30 closes its local SQLite handle twice through nested destructors, matching upstream issue #2251. Vendor the published Rust crate and backport upstream PR #2282 at 0070ff3331cd6d09425b812e1cd3ebe32e1d4206, including its focused ownership regression. Preserve licenses, source formatting and dependency versions. The PR Git revision would otherwise require the unrelated 0.10.0-pre.4 database engine upgrade. Document removal once a stable release contains the fix. Validation: 181 application tests and the upstream close-once regression pass on macOS arm64; strict application Clippy, formatting, actionlint and Wiki checks pass. CI now runs the upstream regression in addition to native multi-process session checks. Original vendored whitespace is retained.
Register composer hit regions, restore the last usable chat per Telegram account, and leave input mode when mouse focus moves. Preserve drafts and existing reply targets. Reuse the asynchronous media renderer for expanded previews. Keep effective preview/reply/close hints and prevent deleted preview targets from redirecting replies. Document the interaction changes in both Wiki languages. Validation: 185 tests, strict all-target Clippy, formatting and Wiki parity/link checks passed. BREAKING CHANGE: o previews media; g n and g p cycle message actions. i replies to an explicit conversation selection; Escape clears selection before leaving the conversation.
Move application, account and connection state to an ordered Lua statusline. Preserve mode and contextual actions in narrow windows, and keep long errors readable above the bar. Observe the primary DC and optional Ping on the existing Grammers client. Use a five-second display deadline while retaining at most one in-flight probe; terminate observations with the worker. Invalidate latency on disconnect, expiry and account changes. Document both languages and the example configuration. Validation: 187 tests, strict all-target Clippy, formatting and Wiki parity/link checks passed.
Use Ratatui Table for stable time and unread columns with independent terminal colors, preserving per-chat colors and optional Nerd Font icons. Align the composer below the conversation and expose sidebar width and colors in Lua. Add F4 toggle with repeat suppression, draft preservation and hidden-region cleanup. Returning to Chats reveals the sidebar; narrow layouts show one pane. Update both Wiki languages. Validation: 189 tests, strict all-target Clippy, focused table-cell recheck, formatting and Wiki parity/link checks passed.
Replace the fixed transcript prefix with author headers and right-aligned metadata. Keep default body colors and align replies, attachments and media to a small selection gutter. Reduce repeated file instructions and isolate message presentation. Make the current action visible, prioritize reply-row hit targets, and retain the anchored message during reflow without landing on a trailing separator. Document both Wiki languages and remove temporary render scaffolding. Validation: 191 tests, strict all-target Clippy, formatting, Wiki parity/link checks, and synthetic render inspection at 120/70/40 columns.
Remove default separator rows and redundant inline image labels. Shade alternating message rows relative to the terminal background reported by the existing Yazi reader, with Lua density and color controls. Preserve full author names and wrap them independently of metadata. Show inspected message time, delivery, pins, media state and effective preview/reveal/reply keys in the configurable bottom bar. Require an explicit attachment selection for file-manager reveal. Use Grammers full user names for authors, accounts and direct-chat titles. Validation: fmt, strict Clippy, all 192 application/binary/integration tests and bilingual Wiki checks passed. Rendering regression covers long Unicode authors, compact adjacency and full-row backgrounds on dark/light themes.
Replace unknown-author-only reply rows with indented two-line original-message excerpts. Resolve visible targets from memory and SQLite first, then batch missing targets through the existing RPC worker. Keep preview arrivals out of the timeline until explicitly opened and preserve live edits and deletion tombstones over late responses. Clicking a quote opens its exact target; Enter defaults to the reply action and media clicks still select media. Reply identifiers and loading/unavailable details are shown in the statusline. Include bilingual guides. Validation: strict Clippy, formatting, Wiki validation and all 196 tests passed. Regression coverage includes batch deduplication, cache restart, edits/deletions during fetch, excerpt row limits and mouse/keyboard navigation.
Parse Lua actions at the configuration boundary and dispatch typed actions in the application. Keep effective key hints and default help descriptions in the same action vocabulary for the upcoming command line. Validation: all 196 tests pass; cargo check and strict Clippy pass.
Open a discoverable command line with descriptions, argument completion, effective shortcuts and bounded account-local history. Retain stable operation targets across live list changes and keep errors in the editor. Reuse existing actions and terminal input; expose explicit pin/archive state and a read-only status view. Resolve explicit chat navigation by identity so returning to latest messages also works inside Archive and reordered pinned lists. Add English and Simplified Chinese command guides. Validation: all 199 tests, strict Clippy, formatting and 31-page Wiki link/parity checks pass. No live Telegram mutations were used for validation.
Keep text, reply context and Unicode cursor position together under Telegram user, chat and topic identities. Restore drafts before displaying cached conversations and retain them across account switches. SQLite stores user-authored state separately from discardable message caches. Coalesce writes on a background thread, keep failed transactions intact, retry failures and flush the latest snapshot on normal exit. Only modified loaded accounts are written, and stale reloads cannot replace newer in-memory edits. Validation: all 202 tests and strict Clippy pass, including restart/rollback, account and topic isolation, Unicode cursors, stale snapshots and shutdown flushing. Bilingual Wiki checks pass.
Add persistent attachment review with format selection, local previews and reveal. Reuse Yazi platform argument parsing. Validate reviewed content before uploading a private copy; share bounded transfer permits and queue. BREAKING CHANGE: pasted paths stay text by default. Use :attach or attachments.auto_attach_paths to stage files, then send from the composer. Attachment drafts upgrade the separate user-state database to schema 2. Validation: 203 tests, strict Clippy, formatting and 31-page bilingual Wiki checks pass. Includes source-chat completion, copy cleanup, mutation rejection, persistence, retries and narrow/wide review.
Use arboard file lists, RGBA bitmaps and text with explicit send. Retain owned PNG assets across draft restoration and quick account switches; clean abandoned results and released files without deleting original references. Bound preparation and time out stale clipboard results without admitting another blocked reader. Add WSL PowerShell fallback with JSON, output limits and child cleanup. Preserve same-chat attachment admission order. Validation: 205 tests, strict Clippy and bilingual Wiki checks pass. Actual desktop clipboard access is environment-dependent; no user clipboard data or Telegram messages were used for tests.
A send can fail locally and later reconcile through Telegram updates. Release the retry asset when that echo confirms success, as with a direct upload response. Clippy and existing reconciliation tests pass.
Opening a chat and receiving a push previously cleared unread state before rendering and used the SDK all-history read request. Submit a positive incoming message boundary after successful, focused conversation frames instead. Coalesce per-chat receipts, back off failures, and persist monotonic inbox boundaries. Fetch remaining counts with a bounded single-peer request. Preserve newer arrivals against late acknowledgements and suppress receipts for obscured or hidden content. Validate with 207 tests, strict Clippy, formatting, and 31 bilingual Wiki pages.
Open unread chats after the cached inbox boundary and verify provisional local pages before automatic receipts. Keep the separator fixed, page forward through accumulated history, and prevent live arrivals and edits from introducing gaps in that window. Add Lua actions and colon commands for unread navigation, explicit whole-chat reads, and Telegram unread reminders. Keep reminder flags separate from actual counts and clear reminders when reopening a displayed chat without unbounded receipts. Validation: 210 tests, strict Clippy, formatting, and 31 bilingual Wiki pages. Live account mutations were not exercised.
Reuse the pinned Yazi parser, clipboard formatter and terminal lifecycle. Preserve bounded OSC 5522 request IDs across cancellation and timeouts, keep encoded image bytes and reject remote file URLs. Include bilingual Wiki guidance. Validate 213 application tests, the vendored parser regression, strict Clippy, formatting and Wiki checks.
Fetch and verify the original server revision before saving text or captions. Keep failed edits separately from normal composition, retain supported UTF-16 entity ranges and use the SDK ordered update stream. Include bilingual usage and schema 3 draft persistence. Validate 216 tests, strict Clippy, formatting and Wiki checks.
Review the exact peer, current message and Telegram deletion permissions, start on Cancel and recheck the captured revision before submitting. Keep failures visible and invalidate stale reviews without deleting locally. Retain common deletion IDs in Grammers own-RPC updates before their durable PTS checkpoint. Validate TL constructors when recovering original requests, including channel deletion and short-send decoding. Vendor published 0.10.0 at 5c6d44ff30e02d6c9295bcf1fcb51403ad77c981 with licenses and provenance. Validate with 218 app/integration tests, the sender regression, strict Clippy, formatting and 31 bilingual Wiki pages. No real messages deleted.
Capture the explicit message for y/Y and :copy text/link. Fetch current contents and protection before copying text; export server message links instead of constructing invalid links for account-scoped message IDs. Reuse arboard on a bounded worker and retain its Linux owner. Serialize native clipboard access, pass WSL text through stdin and use Yazi OSC 52 on the main TTY writer for SSH/tmux/fallback. Distinguish native success from best-effort terminal requests and document platform behavior. Validate 220 app/integration tests, strict Clippy, fmt and 31 Wiki pages. No real clipboard contents were read or replaced during validation.
Reuse chat completion for explicit forwarding targets and preview source, destination and account before sending. Keep attribution and drafts, check exact-peer content protection and invalidate changed originals. Retain a forwarding intent's random ID across failed-send retries. Expose caller-owned random IDs on the existing Grammers forward method without duplicating its request builder or result mapping. Use getrandom 0.4.3 from the existing dependency graph. Resolve Saved Messages from the authenticated identity even when absent from recent dialogs. Validate 223 app/integration tests, strict Clippy, fmt and 31 Wiki pages. No real messages forwarded. Specific topics and durable outbox recovery remain in their planned changes; reviews currently live in this process.
Add :search --cloud to the existing search panel with sender, UTC date and media filters, bounded paging, and exact-peer context navigation. Keep local regex arguments verbatim and preserve chat targets, resolved sender identity, drafts and read boundaries while results load. Reuse Grammers SearchIter with a small sent_by setter, Yazi platform quoting and the existing Clap version. Cancel obsolete RPC tasks, reconcile snapshots with live edits/deletion tombstones before display and persistence, and reject results invalidated by resync. Update English and Simplified Chinese Wiki. Validation: 227 application/integration tests; locked all-target/all-feature strict Clippy; cargo fmt; 31 bilingual Wiki pages and links. No live Telegram account queries were issued during validation.
Add :mute [1h|8h|2d|forever] and :unmute with stable chat targeting, configurable Lua actions, sidebar markers and a notifications status item. Preserve unrelated Telegram notification overrides when changing mute time. Read the authoritative server setting after writes, retain confirmed state on errors, and refresh after partial failures. Track notification updates while RPCs run so an older result cannot reverse another client's change. Cache confirmed settings and keep folder membership in sync. Validation: 230 application/integration tests, strict locked Clippy on all targets/features, cargo fmt and 33 bilingual Wiki pages. No live account settings were modified in validation.
Add :mentions and g m using Telegram's unread-mention iterator and the existing paged search/context UI. Keep the captured chat and drafts, remove read/deleted results on updates, and expose mention state in the sidebar and message statusline. Acknowledge only text mentions whose ends were drawn in a focused conversation. Keep voice, round-video and TTL consumption separate. Preserve common receipt IDs with their ordered PTS in the vendored SDK; channel Bool acknowledgements use their channel namespace. Commit flags with checkpoints and protect in-flight snapshots, including uncached IDs. Reuse Grammers 0.10.0 IterBuffer at revision 5c6d44ff30e02d6c9295bcf1fcb51403ad77c981; follow Desktop visibility and unread-media behavior at 4d4da471fbee771c10e173a83c003ba1728989f1. Validation: 233 application/integration tests; focused SDK payload/PTS regression; strict Clippy; rustfmt; 33 bilingual Wiki pages. No live account message consumption was used for validation.
Notify for fresh unseen incoming messages after a rendered frame, with bounded per-chat grouping and asynchronous inherited Telegram settings. Honor mute, mention-sender exceptions, preview privacy and silent messages. Read/delete/settings/account/exit changes cancel pending delivery tokens; startup and reconnection do not replay messages from before their boundary. Reuse notify-rust 4.18.0 for native platforms, quick-xml for literal XDG bodies, and Yazi TTY/detection/tmux passthrough for OSC 9 and BEL. Follow Codex 78245b47af2a7aafcabe025828ceecca69db4df1 and Desktop 4d4da471fbee771c10e173a83c003ba1728989f1 behavior without copying source. One bounded native worker and at most two timed settings RPCs keep alerts off the terminal input/rendering path. Lua controls backend, visibility, previews, sound and the grouping delay. Validation: 235 application/integration tests, strict Clippy, rustfmt and 33 bilingual Wiki pages. Tests cover replay/deduplication, actual read boundaries, settings races, muted mentions, privacy, grouping and pending account cancellation; they do not display real OS notifications.
Preserve Telegram UTF-16 entities through terminal sanitization and cache round trips. Render nested text styles, indented code with whitespace, and expandable quotes through Ratatui and the existing grapheme wrapper, now returning source ranges instead of losing offsets during wrapping. Click or Enter reveals spoilers and expands quotes; :spoiler and :quote share the configurable actions and contextual footer. Bounded local reveal state belongs to an account and text revision. Summary surfaces mask spoilers, including replies, search, pins, chat previews and notifications; link rows remain hidden until reveal. Explicit copy/edit retains originals. Reviewed Codex 78245b47af2a7aafcabe025828ceecca69db4df1 wrapping and Markdown rendering; no upstream runtime was copied. Document behavior in both Wiki languages. Validate 237 tests, strict Clippy, fmt and 33 Wiki pages, covering UTF-16/control/grapheme conversion, actual narrow/wide frame interactions, remote edit invalidation and persisted summary masking.
Render poll questions, stable choices, quiz explanations and result states through the existing transcript and entity renderer. Add a keyboard/mouse voting panel with local selection, explicit submission, retraction, fresh server validation and bounded visible refresh. Merge minimal Telegram results without losing the current account's choice. Journal concurrent updates across history RPCs, preserve cached copies and mark snapshots stale when the bounded journal overflows. Reuse the existing Grammers update stream and single terminal event loop. Behavior reference: Telegram Desktop 4d4da471fbee771c10e173a83c003ba1728989f1, data/data_poll.cpp and api/api_polls.cpp; no upstream source copied. Validation: 243 tests, strict Clippy, cargo fmt and 35 bilingual Wiki pages. No real votes were sent. Media polls remain explicitly read-only.
Show compact reaction counters and the current account's choices. Add :react and g e with server-provided emoji, permissions and limits. Re-fetch the exact message before changing reactions, preserve other chosen IDs in order, and require refresh after conflicts or uncertain results. Reuse Grammers send_reactions, Ratatui and the single event loop. Polls and reactions share a bounded cache journal; partial updates and live edits keep private choices while late snapshots cannot roll back newer counts. Batch visible refreshes and surface failures after closing a pending operation. Behavior reference: Telegram Desktop 4d4da471fbee771c10e173a83c003ba1728989f1, data/data_message_reactions.cpp; no source copied. Validation: 247 tests, strict Clippy, cargo fmt and 37 bilingual Wiki pages. No live reactions were sent. Custom and paid reaction creation, reactor lists and Saved Messages tag editing remain outside this increment.
Add :open @username and Telegram chat/message links using the existing Grammers resolver and navigation path. Validate targets before leaving the command editor, bound lookups with a timeout, and keep existing drafts. Match completion and failure to the requested link, cancel pending navigation when composing or opening a cached chat, and preserve dialog counters and folder state when a lookup returns only basic peer metadata. Remember newly resolved chat metadata in the local cache. Validation: 249 tests, strict Clippy, cargo fmt and 37 Wiki pages pass. No Telegram messages were sent.
Open web and tg invite links in a cancellable preview with explicit Join or Request to join confirmation. Recheck the invitation before submitting and distinguish membership, pending approval and external verification. Preserve navigation on late results and keep capability hashes out of request logs. Use typed CheckChatInvite/ImportChatInvite RPCs and the SDK ordered update stream, including modern ChatInviteJoinResult. Broadcast and subscription invites retain the documented unsupported scope. Validation: 251 application/integration tests, strict Clippy, fmt, and 37 bilingual wiki pages. No real account membership was changed in tests.
Add a scrollable :info view with full identity, description, role, members, notification mute, text/media permissions and slow mode. Refresh only visible chat details with one bounded request, rejecting invalidated snapshots. Known restrictions keep drafts intact and appear in the composer/statusline; server write errors now explain common permission and slow-mode failures. Follow Telegram Desktop's administrator/default/personal restriction and boost exemption policy (4d4da471fbee771c10e173a83c003ba1728989f1). Validation: 253 tests, strict Clippy, fmt, 37 bilingual Wiki pages.
Add :config reload, :reload and a bindable reload_config action. Validate a bounded file on one background worker, then install the whole snapshot between frames. Errors preserve the old configuration and drafts. Coordinate MIME paste through the existing terminal owner and settle pending paste requests. Cancel queued alerts when notification policy changes. Propagate latency-probe preferences through a coalescing watch to the existing worker without reconnecting. Expand help from the shared command registry and make help/status scrolling use actual wrapped rows. Status includes config path/revision/error, clipboard capability, alert policy and build identity. Validation: 254 tests, strict Clippy, fmt and 37 bilingual Wiki pages.
Give username discovery, invitation confirmation and chat permissions their own linked guide. Document all 45 registered commands and the new overlay keys, and distinguish startup config fallback from failed live reloads. Correct persistent-draft onboarding and explain installing the Wiki source revision while dependent PRs remain under review. State the supported scope and update ownership guidance for commands, clipboard and draft storage. Validation: 39 bilingual Wiki pages and local links pass the export check; all registered commands appear in both reference tables; documented source paths and git diff whitespace were checked. No application code changed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merge the complete reviewed Termgram feature stack into main, preserving the original atomic commits. Every head in #4–#45 is an ancestor of 478ccc7, and the merge tree exactly matches that tested source revision.
The resulting client starts from cached conversations, synchronizes in the background, supports native folders/pins/archive, and uses a configurable Lua-driven TUI with compact messages and navigable reply previews. It adds contextual commands, persistent drafts and media paste, bounded read receipts, editing/deletion/sharing, filtered cloud search, notification controls, entities/polls/reactions, chat discovery and sending restrictions, plus atomic configuration reload and bilingual guides. The cancelled C-group features are not included.
Validation: all 42 component PRs have eight successful checks; the final source passed 254 application/integration tests, strict Clippy, formatting and six native Cargo installation/packaging targets. The installed macOS release build and published Wiki both use the final source revision. Local merge-tree validation found no conflicts or additional content changes.
The component PRs are retargeted to main so GitHub can record their existing commits as merged when this complete ancestry lands. This uses a merge commit and preserves existing commit IDs.
Component review history:
BREAKING CHANGE: navigation, contextual bindings and attachment sending follow the new documented defaults. Use the bilingual keybinding/configuration guides for migration; pasted attachments are reviewed in drafts before explicit sending.