From 088018e40cee365825c63793864b576ef9ac6cd9 Mon Sep 17 00:00:00 2001 From: Pouri Date: Thu, 10 Sep 2026 18:22:58 +0330 Subject: [PATCH] changelog: 2.0.0 ships on the tenth, with the two fixes that landed after it The 2.0.0 entry was written on the fourth and dated the fourth, and then nothing tagged it. Two fixes have merged into `main` since, both of them user-visible and neither of them in the changelog, because the entry was already closed: `daemon status` answering `{}` for a stopped daemon, and `chat.list` repeating its first page because the dialog cursor carried `access_hash=0`. Since 2.0.0 was never published, the honest form is one entry rather than a 2.0.0 nobody could install and a 2.0.1 the next day. Both fixes are in `### Fixed` and the heading carries the date the tag is actually cut. This is the last commit before `git tag -a v2.0.0`. --- CHANGELOG.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10ab158..6c7e17d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to tlgr are recorded here. The format follows semantic versioning at the CLI surface, which means the JSON shapes and exit codes documented in `AGENT.md` are the public API. -## [2.0.0] — 2026-09-04 +## [2.0.0] — 2026-09-10 **Every command tlgr has is generated from the operation registry.** There is no hand-written command left, no v1 route left and no `ClientWrapper` left; @@ -554,6 +554,25 @@ Two more, outside the documented output shapes: ### Fixed +- **`daemon status` could not say the daemon was down.** `DaemonStatus` + inherited `omit_defaults=True`, and for a stopped daemon every field equals + its default, so the result encoded to `{}`: human mode printed nothing, + `--json` printed an empty object, and `status["running"]` raised a KeyError + for the one caller the flag exists for. The offline result now fills in the + socket it asked and the Telethon layer, so "not running" also says where it + looked. `HealthSummary` behind `tlgr status` had the same shape and the same + fix. +- **`chat.list` repeated its first page instead of paging.** + `messages.getDialogs` resolves its cursor against `offset_peer`, and both + places that built one used `access_hash=0`. A hashless peer does not + resolve, so the server answered from the top of the list rather than from + the cursor. `fetch_dialogs` now returns the entity map that every reply + already carries, and both cursor builders use it. Measured on a live + 936-dialog account at 100 rows per page: 34 rows in one page before, 600+ + across six pages after. Two related enumeration limits remain and are noted + in the code: the `fetch_all` walk in `_all_dialogs` has a separate stall, + and `has_more` is computed after the type filter, so a filtered page can + read as the last one. - **A paginated operation with no rows answers `[]`, not `{}`.** `Page.items` defaults to an empty list and models omit defaults, so an empty page encoded to `{}` and the envelope left `result` as an empty *object* — `for row in