fluid-telegram/internal/tg
tegwick 7347bd6302 Implement the avatar and a preflight dry run
The avatar is now applied rather than deferred: BotFather's /setuserpic is a
conversation in which you send a photo, so the file is uploaded and sent as
a message. It is content addressed -- replacing the file is what triggers an
update, and the digest is recorded only after BotFather confirms, so a failed
upload retries rather than being remembered as done. The image is validated
before the conversation starts, because an image rejected halfway leaves the
bot registered without a picture.

Adds `provision preflight`: spec, avatar, OpenBao reachability, credentials,
session presence, salt and the resulting plan, checked in one run that writes
nothing and never contacts Telegram. Every failure it reports is one that
would otherwise surface after a phone number had been spent.

Two bugs it found immediately. The avatar path is documented as repo-relative
but resolved against the spec's own directory, so the real campaign spec
failed to find its own asset. And the OpenBao error named both variables when
only one was missing, sending the reader to check the one already set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0172sgCZEEDJcnQmr4SGDvKa

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1361245@bnt-lap001
Assistant-Session: b3b428ef-f3e6-4688-b091-01f71461d66a
2026-09-04 22:12:56 +02:00
..
botfather.go Implement the avatar and a preflight dry run 2026-09-04 22:12:56 +02:00
botfather_test.go Implement the MTProto client, session bootstrap and apply 2026-09-04 21:39:30 +02:00
channels.go Implement the MTProto client, session bootstrap and apply 2026-09-04 21:39:30 +02:00
client.go Implement the MTProto client, session bootstrap and apply 2026-09-04 21:39:30 +02:00
live.go Implement the MTProto client, session bootstrap and apply 2026-09-04 21:39:30 +02:00