BarkFluff // Логи разработки
7 subscribers
2.37K links
Download Telegram
📦 Liis17/BarkFluff [dev]
👤 claude

feat(messages): send replies by reference and forward several messages at once

SendMessage now distinguishes the two actions instead of funnelling both through
one field:

- reply_to_message_id is validated and stored on Message.ReplyToMessageId. No
snapshot is taken, so the quote stays live.
- forwarded_message_ids accepts up to 20 originals and keeps the client's order
in ForwardedOrder. Each snapshot now records the original's chat, sender and
send time.
...

📂 Backend
└ BarkFluff.Messages 2 ✏️5
📂 Shared
└ BarkFluff.Shared.Exceptions 2
📦 Liis17/BarkFluff [dev]
👤 claude

feat(messages): resolve reply previews on read instead of snapshotting them

A reply now carries only a reference, so the quote has to be built when the
message is read. ReplyPreviewResolver does that for a whole page at once: one
database query for the originals and one Users batch for the names, regardless
of how many replies the page contains.

This is what the split buys. Editing the original updates every quote of it, and
deleting the original hides its text — previously the snapshot inside the
replying message outlived the deletion and kept the content visible.
...

📂 Backend
└ BarkFluff.Messages 1 ✏️10
📂 Tests
└ BarkFluff.Messages.Tests ✏️6
📦 Liis17/BarkFluff [dev]
👤 claude

feat(federation): replicate replies and forwards across nodes

NewMessagePayload carried only text and attachments, so a reply or a forward
sent in a federated DM arrived on the partner node as a bare message with the
quote silently dropped.

A reply travels as the origin's federated uuid, not the local id — each node
assigns its own Messages.Id to its copy. On import the uuid is resolved back to
a local id. If the original has not been imported yet, the message is stored
without the quote rather than retried: a gap in the history is for catch-up to
...

📂 Backend
├ BarkFluff.Federation 1 ✏️2
└ BarkFluff.Messages 1 ✏️4
📂 Shared
├ BarkFluff.Shared.Exceptions 1
├ BarkFluff.Proto ✏️2
└ BarkFluff.Shared.Queue ✏️1
📦 Liis17/BarkFluff [dev]
👤 claude

test(messages): cover the reply/forward split

The forward branch of SendMessage had no direct coverage before this change, so
the split went in on top of untested code. These tests pin both the new
behaviour and the compatibility promise.

- Reply stores a reference: no snapshot attachment is produced.
- Replying across chats or to a deleted message is rejected, indistinguishably,
so message ids cannot be probed.
- The preview follows the original: it shows edited text, and a deleted original
...

📂 Tests
└ BarkFluff.Messages.Tests 4 ✏️1
📦 Liis17/BarkFluff [dev]
👤 claude

feat(android): render replies from the server field, forward in batches

MessageAdapter decided whether a quote was a reply or a forward by asking
whether the original happened to be in the currently loaded page. Scrolling the
history away turned a reply into a forward, and forwarding inside the same chat
looked like a reply. That guess is gone: the server now says which it is.

- MessageItem carries replyTo; the quote is bound from it.
- A deleted original renders as "message deleted" with no text, no author and no
jump target, matching what the server withholds.
...

📂 Android
├ Barkfluff.Client.Android ✏️5
└ core ✏️1
📦 Liis17/BarkFluff [dev]
👤 claude

feat(web): render replies from the server field, forward in batches

messages.js decided reply-vs-forward by asking whether the original was in the
set of currently loaded message ids, so a reply became a forward once the
history scrolled away. The renderer now reads msg.replyTo.

- api.js maps ReplyInfo and the enriched forward snapshot, and sends
reply_to_message_id / forwarded_message_ids instead of the old single field.
- A deleted original renders as "message deleted" with no text and no jump
target, matching what the server withholds.
...

📂 Backend
└ BarkFluff.Web ✏️6
📦 Liis17/BarkFluff [dev]
👤 claude

feat(winui): render replies from the server field, forward in batches

Client.Core computed IsReplyQuote by intersecting the quote's original id with
the ids currently loaded, so a reply turned into a forward once the history
scrolled past it. ApplyReplyQuoteState is gone; the reply comes from the server.

- MessageModel carries ReplyTo, mapped in WebApi.Core.
- MessageItemViewModel gains Reply (a separate type from ForwardedContentViewModel,
because a reply is resolved live rather than snapshotted) and Forwards, since a
message can now carry several.
...

📂 Windows
├ BarkFluff.WebApi.Core 1 ✏️4
├ BarkFluff.Client.Core ✏️4
├ BarkFluff.Client.WinUI ✏️3
└ BarkFluff.ClientV2.WPF ✏️2
📂 Tests
└ BarkFluff.Client.WinUI.Tests ✏️2
📦 Liis17/BarkFluff [dev]
👤 claude

docs: list what the reply/forward split could not be verified against

Records which checks passed here, which could not run and why, and the exact
steps and risk areas for someone with a full environment.

The gaps are environmental, not optional: the Android build needs
dl.google.com, which the network policy rejects; the WinUI app project needs
the Windows-only XAML compiler; ClientV2.WPF tests need the WindowsDesktop
runtime; and repository rules keep Docker out of verification, so the migration
and the end-to-end flows were never exercised against a real database.
...

📂 docs
reply-forward-verification.md 1
📦 Liis17/BarkFluff [dev]
👤 claude

docs(obsidian): record that reply and forward are no longer the same thing

Messages.md stated "Reply ≡ Forward на бэке" as the governing fact, and the
Android note documented the loaded-history heuristic as the intended design.
Both are now wrong.

- Messages.md: the split itself, reply as a live reference vs forward as a
snapshot, the legacy field and why old rows were not migrated, the new
columns, ReplyPreviewResolver and ReplyTargetValidator, and why
ReplyToMessageId deliberately has no foreign key.
...

📂 Obsidian
└ ClaudeVault ✏️7
📦 Liis17/BarkFluff [dev]
👤 web-flow

feat(messages): separate reply from forward in schema and contracts (#342)

Reply and forward were the same thing on the backend: both travelled
through
OutgoingMessage.forwarded_message_id and were stored as a
ForwardedMessage
attachment holding a snapshot of the original. Clients told them apart
with a
heuristic ("is the original in the currently loaded page?"), which
misrenders a
...

📂 Backend
├ BarkFluff.Federation 1 ✏️2
├ BarkFluff.Messages 6 ✏️19
└ BarkFluff.Web ✏️6
📂 Shared
├ BarkFluff.Shared.Exceptions 3
├ BarkFluff.Proto ✏️3
└ BarkFluff.Shared.Queue ✏️1
📂 Tests
├ BarkFluff.Messages.Tests 4 ✏️7
└ BarkFluff.Client.WinUI.Tests ✏️2
📂 Windows
├ BarkFluff.WebApi.Core 1 ✏️4
├ BarkFluff.Client.Core ✏️4
├ BarkFluff.Client.WinUI ✏️3
└ BarkFluff.ClientV2.WPF ✏️2
📂 docs
reply-forward-verification.md 1
📂 Android
├ Barkfluff.Client.Android ✏️5
└ core ✏️3
📂 Obsidian
└ ClaudeVault ✏️7
📦 Liis17/BarkFluff [dev]
👤 claude

Android: доверие CA сервера обновлений и своя загрузка APK

storage.barkfluff.com отдаётся за Cloudflare Origin CA, которого нет в
системном хранилище Android, поэтому проверка обновлений и скачивание APK
не проходили TLS в release-сборке. В CI этот CA уже есть — секрет
CLOUDFLARE_ORIGIN_CA_BUNDLE_B64, которым воркфлоу ходит на storage через
curl --cacert.

Теперь тот же секрет уезжает в APK строкой BuildConfig.STORAGE_CA_PEM_B64,
а UpdateServerTls разворачивает её в SSLSocketFactory + X509TrustManager.
...

📂 Android
└ Barkfluff.Client.Android 1 ✏️4
📂 .github
└ workflows ✏️1
📂 Obsidian
└ ClaudeVault ✏️3
📦 Liis17/BarkFluff [dev]
👤 web-flow

Android: доверие CA сервера обновлений и своя загрузка APK (#343)

storage.barkfluff.com отдаётся за Cloudflare Origin CA, которого нет в
системном хранилище Android, поэтому проверка обновлений и скачивание
APK
не проходили TLS в release-сборке. В CI этот CA уже есть — секрет
CLOUDFLARE_ORIGIN_CA_BUNDLE_B64, которым воркфлоу ходит на storage через
curl --cacert.

Теперь тот же секрет уезжает в APK строкой
...

📂 Android
└ Barkfluff.Client.Android 1 ✏️4
📂 .github
└ workflows ✏️1
📂 Obsidian
└ ClaudeVault ✏️3
Сборка успешна

📦 WPF Client v0.0.0.2087
📌 Ветка: dev
🔗 Коммит: 697a3e9fc7a9113b3e6e7c1bdb1dfc0b55cd765a
👤 Автор: Liis17
🏷️ Тег: dev-20260812150130-697a3e9-8764

Скачать релиз
Сборка успешна

🐳 BarkFluff.Messages
📌 Ветка: dev
🔗 Коммит: 697a3e9fc7a9113b3e6e7c1bdb1dfc0b55cd765a
👤 Автор: Liis17
🏷️ Тег: docker.barkfluff.com/barkfluff-messages-dev:1.0.19
Сборка успешна

🐳 BarkFluff.Federation
📌 Ветка: dev
🔗 Коммит: 697a3e9fc7a9113b3e6e7c1bdb1dfc0b55cd765a
👤 Автор: Liis17
🏷️ Тег: docker.barkfluff.com/barkfluff-federation-dev:1.0.15
Сборка успешна

🐋 BarkFluff.Web
📌 Ветка: dev
🔗 Коммит: 697a3e9fc7a9113b3e6e7c1bdb1dfc0b55cd765a
👤 Автор: Liis17
🏷️ Тег: docker.barkfluff.com/barkfluff-web-dev:1.0.37
Сборка успешна

📱 Android Client v0.0.115 beta
📌 Ветка: dev
🔗 Коммит: 697a3e9fc7a9113b3e6e7c1bdb1dfc0b55cd765a
👤 Автор: Liis17
Сборка успешна

📱 Android Client v0.0.115 beta
📌 Ветка: dev
🔗 Коммит: 372f1b88fbb35a75cb341fae79da4e6fb06e1384
👤 Автор: Liis17
📦 Liis17/BarkFluff [dev]
👤 Liis17

android: add localization and accessibility checks

📂 Android
├ tools 1
└ Barkfluff.Client.Android ✏️14
📦 Liis17/BarkFluff [dev]
👤 Liis17

android: localize remaining user-facing strings

📂 Android
└ Barkfluff.Client.Android ✏️74
📦 Liis17/BarkFluff [dev]
👤 Liis17

android: add TalkBack semantics

📂 Android
└ Barkfluff.Client.Android ✏️50