|
|
@@ -142,7 +142,7 @@ to its grants.
|
|
|
- **0.5.0b10: DM rooms keep deleted participants in `member_user_ids`.** Since 0.5.0-beta.10, `RoomWithViewerState.member_user_ids` on a DM includes participants whose accounts were deleted (the directory no longer prunes them); clients render those as deleted users. Channel rooms still carry an empty list. The wire shape is unchanged (same field, same number) and `RoomWithViewerState.parse` already copies the full list — so no code change was needed, but code that resolves every `member_user_ids` entry to a `User` must tolerate users that `get_user` no longer returns.
|
|
|
- **0.5.0b14: pinning is gated by a dedicated `message.pin` permission (server-side behavior change; no wire change).** `RoomService.CreatePinnedMessage`/`DeletePinnedMessage` required `room.manage` until 0.5.0-beta.13; since 0.5.0-beta.14 they require the new `message.pin` permission instead. The RPCs, their request/response messages, and chattolib's `pin_message`/`unpin_message`/`list_pinned_messages` wrappers are unchanged — but a bot/role that pinned via `room.manage` must now hold `message.pin` (or the server returns `PERMISSION_DENIED`). Same release added an additive `livekit` (`AdminLiveKitStatus`) field 6 to admin `GetSystemInfoResponse` (LiveKit setup/config state, server-API reachability as `AdminLiveKitConnectionState`, webhook receipt times; never the API/webhook secrets) — `admin_get_system_info()` returns it raw in `data["livekit"]` with no client change.
|
|
|
- **Never regenerate protos from `chattocorp/chatto@main`.** `scripts/generate_pb.sh` defaults to a tag derived from `pyproject.toml`: `v<base>` for finals, and `v<base>-<kind>.<n>` for PEP 440 pre-releases (`0.5.0b6` → `v0.5.0-beta.6`), probing candidates with `git ls-remote` (exact ref match; the REST `/tags/{name}` endpoint 404s on lightweight tags). Override with `CHATTO_REF=<tag>` only when you know the deployed server has caught up. chattolib 0.4.19 shipped once from `main` and broke realtime for every downstream client because Chatto's main had a protocol-v2 rewrite that the deployed 0.4.19 server did not speak.
|
|
|
-- **0.5.0b15.post1: the protoc plugin's `_method_name` is acronym-aware.** The old splitter inserted `_` before *every* capital, so `StartDM` generated `start_d_m` — while `client.py` called `start_dm`, making `start_dm()` an `AttributeError` at call time (shipped broken since the 0.5.x ConnectRPC regeneration; `StartDM` is the only RPC in the current proto set with an acronym run, so nothing else changed). Fixed in `src/chattolib/_protoc_plugin.py` (`StartDM` → `start_dm`; `GetRoomDMStats` → `get_room_dm_stats`); regenerate to pick it up. Note the server side: a **bot key cannot call `StartDM` at all** (`PERMISSION_DENIED` — DMs are human-initiated; a bot can only answer inside a DM room a human already opened), so the wrapper is kept for human-login-style use but is not exercised by bot integration tests.
|
|
|
+- **0.5.0b15.post1: the protoc plugin's `_method_name` is acronym-aware.** The old splitter inserted `_` before *every* capital, so `StartDM` generated `start_d_m` — while `client.py` called `start_dm`, making `start_dm()` an `AttributeError` at call time (shipped broken since the 0.5.x ConnectRPC regeneration; `StartDM` is the only RPC in the current proto set with an acronym run, so nothing else changed). Fixed in `src/chattolib/_protoc_plugin.py` (`StartDM` → `start_dm`; `GetRoomDMStats` → `get_room_dm_stats`); regenerate to pick it up. Note the server side: a **bot key cannot call `StartDM` at all** (`PERMISSION_DENIED` — DMs are human-initiated; a bot can only answer inside a DM room a human already opened), so the wrapper is kept for human-login-style use but is not exercised by bot integration tests. `types._snake_case` (the same bug class, used for timeline/notification `kind` names) was hardened the same way in 0.5.0b15.post2 — latent today: no oneof field in the current proto set has an acronym run, so its output is unchanged.
|
|
|
|
|
|
### Known bugs
|
|
|
|