Repository navigation
feat(dashboard): Compact queued messages and let readers edit them - #2419
Merged
Merged
Conversation
Show the author avatar, image thumbnails, and one truncated line for each queued message. Add an edit action on the reader's own queued web messages that takes the message out of the queue and puts its text and images back in the composer. Co-Authored-By: adm <aditya.mathur@sentry.io>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
|
14 screenshot changes — 12 changed · 2 added · 0 removed Review screenshots in Frameshift |
Leave the message queued when the reader leaves during the image read. If the reader leaves during the cancel, put the text in the saved draft. Do not add a leading newline when an image-only message comes back. Co-Authored-By: adm <aditya.mathur@sentry.io>
Check that the queued images fit in the draft before the cancel. After the cancel, images that do not fit are lost. An image read that finishes after an edit restore now adds to the restored images instead of replacing them. A second click during the image read no longer starts a second edit. The author avatar has an img role so screen readers announce its name. Co-Authored-By: adm <aditya.mathur@sentry.io>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 0ea4484. Configure here.
Queued rows are one line now, so the stack shows up to five rows. With six or more, desktop shows four rows and a control for the rest. Co-Authored-By: Aditya Mathur <aditya.mathur@sentry.io>
A drop or paste during the edit cancel can fill the draft after the fit check. The queued images already left the queue, so they now win. Draft images that no longer fit are dropped with an error.
MathurAditya724
approved these changes
Oct 30, 2026
The image size check and the data URL for local previews were written out in several places. Keep one helper for each so the composer, the queue, and the transcript count and show images the same way. Co-Authored-By: Aditya Mathur <aditya.mathur@sentry.io>
MathurAditya724
added a commit
that referenced
this pull request
Oct 30, 2026
Stacked on #2419. Adds a steer action to the reader's own queued web messages in the dashboard. Steering marks the message as an interrupt. When the running web Turn belongs to the same author, it reads the message at its next model boundary, in the same Turn, with its images. When another person's Turn is running, the message does not join it, so it never runs with that person's credentials. It starts the next Turn ahead of other queued input. If Junior already read the message, steering does nothing. Before this change, the worker did not let a message that was pending at attempt start join that attempt. So a message steered mid-Turn would not arrive. Now a message that is steered after the attempt starts can join it. API: `POST /api/conversations/:id/pending-messages/steer`. Only the author can steer their own queued web messages. Also replaces the queue's remove (×) action with a delete (trash) action. The new integration eval `Dashboard Turn Steering` has no recording yet. CI records it on its first run. <!-- junior-request-attribution:start --> via **adm**. <!-- junior-request-attribution:end --> <!-- junior-session-footer:start --> <!-- junior-conversation-id:local%3Aweb%3A6574fc16dd6453b581112066 --> -- [View Session in Sentry](https://sentry.sentry.io/explore/conversations/local%3Aweb%3A6574fc16dd6453b581112066/?project=4510944073809921) <!-- junior-session-footer:end --> --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: adm <aditya.mathur@sentry.io>
MathurAditya724
added a commit
that referenced
this pull request
Oct 30, 2026
…r send (#2423) Stacked on #2422 (which is stacked on #2419). When Junior is idle and the queue is empty, a dashboard send used to show in the queue stack first. Then it jumped into the transcript once Junior read it. That jump looked laggy. **A. Inline send.** If no Turn is running and no queued rows are waiting, the send now goes straight to the transcript tail. It stays there until history has the same message id, so it does not flash back into the queue when the mailbox copy arrives. - A failed send moves to the queue, which owns Retry. A retry stays in the queue. - Conversations without available history (for example, expired history) keep the queue path. Otherwise the transcript could not show the send. - First messages of new conversations and forks are inline. - Inline rows have no fork action (they use the existing `pending` transcript rows). **B. Fast poll after send.** For 6 seconds after the latest send, the detail query polls every 500ms. After that it uses the normal 2s / 10s interval. Changes: - `conversationOutbox.ts`: `inline` flag on outbox rows, `isInlineOutboxMessage`, `splitInlineMailboxMessages` (server copy wins). - `queries.ts`: fast poll window, inline cleanup waits for history, returns `inlineMessages` apart from `pendingMessages`. - `ConversationPage.tsx`, `TranscriptView.tsx`, `ConversationTranscript.tsx`: decide inline at send time and pass inline rows to the transcript. Tests: - `e2e/conversation-send.spec.ts`: the queue-to-history handoff test now expects the send in the transcript, never in the queue, through mailbox and history changes. The expired-history test keeps the queue assertions. - `tests/conversation-outbox.test.ts`: inline split and failure-to-queue. - `pnpm --filter @sentry/junior-dashboard typecheck`, `pnpm lint`, dashboard vitest (322 tests), and `conversation-send` + `conversations` Playwright specs (20 tests) pass locally. <!-- junior-request-attribution:start --> via **adm**. <!-- junior-request-attribution:end --> <!-- junior-session-footer:start --> <!-- junior-conversation-id:local%3Aweb%3A6574fc16dd6453b581112066 --> -- [View Session in Sentry](https://sentry.sentry.io/explore/conversations/local%3Aweb%3A6574fc16dd6453b581112066/?project=4510944073809921) <!-- junior-session-footer:end --> --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: adm <aditya.mathur@sentry.io>
This branch was successfully deployed
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.

The queued message stack above the composer used a full email heading and up to three lines of text per row, so a few queued messages took a lot of space.
Each row is now one line:
There is also a new Edit action. It shows only on the reader's own accepted web messages. Edit reads the message images first, then cancels the message in the queue, then puts the text ahead of the current draft and adds the images back to the composer. Edit uses the existing cancel endpoint, so:
The Steer action (send a queued message into the running turn now) is in the stacked follow-up #2422.
via adm.
--
View Session in Sentry