Repository navigation
Conversation
POST /api/messages takes a pushedMessageId; one field covers both Push (bare repost, empty content) and Quote (repost with commentary). Adds the write path, the card actions, and the embedded original. - Models/NewMessage.cs — a request record for POST /api/messages. The endpoint has grown enough optional fields (reply, schedule, media, push/quote) that the positional overload in InterlinedApiClient.cs was out of room; that file is untouched (it is in open PR #130), so this is a new overload in the Messages partial. Optional keys the caller never set are omitted rather than posted as explicit nulls. - PushMessageAsync / QuoteMessageAsync hard-code publiclyVisible: true — pushes and quotes are always public per /help/messages, whatever the user's defaultPubliclyVisible preference says (it is false on the test account). - MessageItemViewModel: PushCount, the IsPush/IsQuote split, the quoted-original projection off the nested pushedMessage, and Push/Quote commands. A Posted event lets the feed re-fetch after publishing — the write envelopes are not parsed, per this codebase's read-after-write discipline. - Pushing a *bare push* targets the original rather than the push, so the result is a one-level quote that renders. Quoting a Quote still targets the quote, which carries its own commentary. Client-side call: no nested pushedMessage appeared anywhere in an 80-row live sample, so the server's chaining behaviour is unverified. - FeedView.xaml: "↻ Pushed" / "❝ Quoted" badge, the embedded original card (avatar, clickable author, time, body, images), pushCount beside digCount, and an inline Quote composer whose amber banner is the "this will be public" confirmation. The footer is now a WrapPanel — seven actions overflowed a narrow window. A per-card status line was added too: ErrorMessage had no renderer at all before, so a failed Report was silent. Live-verified read-only against the test account (80-message sample): 5 of 80 rows carry pushedMessageId + a full nested pushedMessage. Contrary to the note on the issue, 2 of those 5 have non-empty content — real Quotes, not only bare reposts — so the content-based IsQuote split is exercised by live data. All 5 are publiclyVisible: true, consistent with the always-public rule. No write path was exercised: posting, pushing or quoting from this account publishes publicly and syndicates to Mastodon/Bluesky. Closes #31 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 16, 2026
Member
Author
|
Auto-closed by GitHub when its base branch I've switched to merging without |
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.
Stacked PR — base is
issue-127-wire-types, notmainThis is the first of three stacked PRs (#31 → #32 → #33), all of which touch
FeedView.xaml/FeedViewModel.cs/MessageItemViewModel.cs.It is based on
issue-127-wire-types(open PR #131) because it depends onthe
Messagewire fields that branch adds —PushedMessageId,PushedMessage,PushCount, and theIsPushOrQuote/IsQuotehelpers. Merge #131 first, thenthis.
What this does
POST /api/messagestakes apushedMessageId. One field covers both productbehaviours: a Push is a repost with empty content, a Quote is the same
call with commentary. Both are always public per
/help/messages.Service —
Services/InterlinedApiClient.csis untouched (it is in openPR #130), so the write path is a new overload in the
Messagespartial:Models/NewMessage.cs— a request record forPOST /api/messages. Thepositional overload had run out of room (reply, schedule, media, cross-post,
and now push/quote and tags). Optional keys the caller never set are omitted
rather than posted as explicit nulls.
PostMessageAsync(NewMessage, …), plusPushMessageAsync/QuoteMessageAsyncwhich hard-codepubliclyVisible: true— that is a productrule, not the user's preference (
defaultPubliclyVisibleisfalseon thetest account, so this is a real difference).
ViewModel —
PushCount, theIsPush/IsQuotesplit, the quoted-originalprojection off the nested
pushedMessage, and the Push / Quote commands. APostedevent letsFeedViewModelre-fetch after publishing, since the writeenvelopes are not parsed (this codebase's read-after-write discipline).
View —
↻ Pushed/❝ Quotedbadge, the embedded original (avatar,clickable author → profile, time, body, images),
pushCountbesidedigCount,and an inline Quote composer whose amber banner is the "this will be public"
confirmation. Two incidental fixes fell out of it:
WrapPanel— seven actions overflowed a narrow window;MessageItemViewModel.ErrorMessagehad no renderer at all before this, so a failed action (or the "Reported.
Thanks…" acknowledgement) was silent.
One deliberate client-side decision
Pushing a bare push targets the original rather than the push, so the
result is a one-level quote that actually renders instead of a chain of empty
cards. Quoting a Quote still targets the quote, which carries its own
commentary. No nested
pushedMessageappeared anywhere in an 80-row livesample, so the server's own chaining behaviour is unverified — this is the
client picking the renderable option, and it is commented as such.
Live verification (read-only)
Sampled
GET /api/messages?limit=80against the test account:pushedMessageIdplus a full nestedpushedMessage(acomplete message object,
userincluded — no second fetch needed to render).real Quotes, not only bare reposts. So the content-based
IsQuotesplit isexercised by live data, not just theoretical.
publiclyVisible: true, consistent with the always-public rule.pushCountwas non-zero on 6 of 80 rows, so the counter has real values to show.Left unexercised, on purpose
No write path was run. Posting, pushing or quoting from this account
publishes publicly and syndicates to Mastodon/Bluesky, so
PushMessageAsync,QuoteMessageAsyncandPostMessageAsync(NewMessage)are built andlive-unverified — the usual pattern in this repo. The request body follows
the same field names the existing positional
PostMessageAsyncalready postssuccessfully, with
pushedMessageIdadded.Notes for other open branches
Views/MentionText.cs(PR #141) will need a small reconcile: this PR adds aVisibilitybinding to the card-bodyTextBlock(so a bare Push collapses itsempty body) on the same element PR #141 replaces the
Textbinding on. Theright rail in
MainWindow.xaml(PR #149) is untouched.Builds clean in both
-c Debugand-c Release.Closes #31
🤖 Generated with Claude Code