fix(mobile): keep pending messages in the chat timeline - #10449
Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds a user-facing pending-message timeline and edit workflow, backed by new acknowledgement, draft, and outbox coordination across multiple production components. It also changes existing feed anchoring, insets, and scroll-animation behavior, making the runtime blast radius broader than a straightforward bug fix. Not approved because:
Review your spending limits in Billing settings. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Upstream pingdotgg#10449 keeps pending messages in the mobile chat timeline, which overlaps the fork's own queued-message UI. Both are kept rather than one replacing the other: - ThreadFeed `renderFeedEntry` takes upstream's `PendingThreadFeedEntry` item and the union of both prop lists (upstream's dispatchingMessageId / onEditPendingMessage plus the fork's editableMessageId / onEditMessage). - The row footer keeps the fork's Queued + Cancel controls and its "Edited" label, and takes upstream's "Pending" timestamp substitution. The fork's explicit `text-neutral-600 dark:text-neutral-400` is kept over upstream's `text-adaptive-neutral-600-400` (fork theme divergence). - Both edit affordances render: the fork's "Edit message" for a sent message and upstream's "Edit pending message" for one not yet acknowledged. They are different actions on different rows. - ThreadDetailScreen/ThreadRouteScreen take both prop sets; the keep-both had duplicated the `Alert` import, which both sides added. Verification: every package typechecks; guard script passes; formatting clean. Mobile suite has 5 failures, all previously documented as pre-existing (4 threadActivity buildThreadFeed cases, thread-outbox attachGoal v4), plus the known rolldown "Flow is not supported" parse errors in files this merge does not touch (scripts/, src/lib/, src/widgets/). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## What's Changed * fix(mobile): keep pending messages in the chat timeline by @juliusmarminge in pingdotgg/t3code#10449 * fix(mobile): show connection status in the floating pill instead of a second one by @juliusmarminge in pingdotgg/t3code#10440 * fix: use Pierre icons consistently for attachments by @juliusmarminge in pingdotgg/t3code#10475 * feat(mobile): open the thread screen as soon as a new task is submitted by @juliusmarminge in pingdotgg/t3code#10435 * fix(devcontainer): make repository setup work by @saphid in pingdotgg/t3code#7875 * fix(projects): prevent invalid script IDs from crashing threads by @saphid in pingdotgg/t3code#10019 * fix(mobile): hide changed-files navigator and restore refresh in raw diff fallback by @lnieuwenhuis in pingdotgg/t3code#9828 * fix(ios): scroll short source files from blank space by @juliusmarminge in pingdotgg/t3code#10178 * feat(mobile): start a new thread on an existing branch by @StiensWout in pingdotgg/t3code#10359 * fix(mobile): improve font-size slider performance and prevent maximum update depth errors by @bbernag in pingdotgg/t3code#7138 * fix(web): keep composer toolbar controls anchored during transitions by @juliusmarminge in pingdotgg/t3code#10478 * fix(web): resize the floating preview from any edge by @juliusmarminge in pingdotgg/t3code#10467 * fix(mobile): prevent chat from disappearing when scrolling by @juliusmarminge in pingdotgg/t3code#10479 * fix(mobile): smooth composer status pill resizing by @juliusmarminge in pingdotgg/t3code#10484 * fix(mobile): release initial scroll target after dragging by @juliusmarminge in pingdotgg/t3code#10483 * fix(mobile): animate thread lifecycle transitions consistently by @juliusmarminge in pingdotgg/t3code#10487 * fix(mobile): restore assistant message bottom padding by @juliusmarminge in pingdotgg/t3code#10491 * fix(mobile): preserve chat rows when toggling commands by @juliusmarminge in pingdotgg/t3code#10492 ## New Contributors * @bbernag made their first contribution in pingdotgg/t3code#7138 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260907.1332...v0.0.40-nightly.20260907.1346 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.40-nightly.20260907.1346
Pending mobile sends previously appeared only as a count under the composer, then disappeared from that state before reaching the chat. Render them at the bottom of the timeline with a Pending label and an edit action that restores the message to the composer without losing an existing draft.
Keep the same row identity through delivery, retain acknowledged messages until their timeline echo arrives, and avoid competing scroll and row animations during the handoff. Editing takes ownership before delivery and persists the draft before removing the queued message.
Verification: mobile typecheck and 51 focused tests pass. Verified offline queueing, app reload persistence, edit-to-composer, and reconnect delivery on an iPhone 17e simulator. Targeted lint has warnings but no errors. This changes the React Native client; web, desktop, contracts, and provider adapters are unchanged. Android was not exercised.
Before and after use the same persisted queue, conversation, iOS viewport, and bottom-following state. Before was captured from the actual base implementation.
Delivery handoff at normal speed:
Edit a pending message back into the composer
Prepared with GPT-6 in Codex.