fix(chat): improve bot conversation usability - #159
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Greptile SummaryThis update improves chat usability with message reactions, replies, copy feedback, and document attachments across web and mobile surfaces. It also refines browser, sidebar, theme, overlay, and subscription-status behavior. The previously reported reaction-authorship concern was disproved: an authenticated group member submitting the responder bot ID produces a reaction attributed to that authenticated person, not to the bot. Confidence Score: 5/5No blocking failure remains. The exercised authenticated reaction flow emits and projects the signed-in person's identity rather than the client-selected bot identity.
What T-Rex did
Reviews (3): Last reviewed commit: "fix(chat): show reactions in bot convers..." | Re-trigger Greptile |
| @@ -1624,6 +1677,7 @@ const DispatchableClientOrchestrationCommand = Schema.Union([ | |||
| ThreadApprovalRespondCommand, | |||
| ThreadUserInputRespondCommand, | |||
| ThreadCheckpointRevertCommand, | |||
| ThreadMessageReactionSetCommand, | |||
There was a problem hiding this comment.
Client controls reaction authorship
When an authenticated group member submits thread.message.reaction.set, the client-selected botId is preserved and accepted for any active bot in the group, causing participants to add or remove reactions attributed to other bots. How this was verified: The client-dispatchable command was traced through unchanged authentication fields and group membership checks to the persisted event payload.
There was a problem hiding this comment.
This is Leo's agent.
Commit 18a14c4d1 blocks selection of another active bot, but the new review proves a remaining identity-model issue: an authenticated person can still submit a reaction under the trusted responder's bot identity. This needs another fix pass because prg1 permits only one pass per run.
There was a problem hiding this comment.
You're right. Commit 18a14c4d1 closes bot-to-bot selection, but not principal spoofing. In apps/server/src/orchestration/decider.ts:3051, the server only checks that the client-supplied command.botId equals the thread's trusted responder; it never binds the reaction to actor.personId. AuthenticatedCommand.ts also leaves reaction commands unchanged, so a group member can submit botId: responderBotId and the projector persists that bot as the author.
This needs an identity-model fix, not another bot-membership check: client-authenticated reactions must be person-authored, with the server stamping actor.personId and the payload/read model storing that principal. Bot-attributed reactions should be a separate trusted internal command with botId derived from the responder/runtime. The client must not be allowed to provide a bot author. Please update the contract, authenticated-command transformation, decider, projector/read model, and web reaction call sites, and add a regression test where a group member submits the responder's botId and verify the persisted reaction is person-authored (or the client command is rejected).
18a14c4 to
aa2bb3f
Compare
aa2bb3f to
d06524c
Compare
Bot chats did not expose common message actions, document attachments, or clear copy feedback. Several surrounding controls clipped, reported stale errors, or allowed accidental interaction with the docked browser.
This change adds copy, reply, and Apple emoji reactions to bot and group messages. The server now binds reactions from a signed-in client to that person. Only trusted internal bot calls can create bot-authored reactions. The composer accepts document attachments across web and mobile, and provider adapters receive the normalized files.
The UI keeps the docked browser passive until expansion, moves browser size controls to the bottom-right, centers the quit overlay, keeps sidebar footer actions visible, fixes Akeru Classic selection, aligns details-panel close controls, and clears stale subscription connection errors after a successful request.
Screenshots
Bot chat and details
Message actions now appear below each message. The details close control stays aligned with the control that opens the panel. The browser expand control sits in the bottom-right of the preview.
Apple emoji reactions
Reply and file attachment
The reply target and attached document stay visible above the composer.
The composer menu now names the file action directly.
Theme selection
Akeru Classic now owns the selected outline. Akeru Paper no longer receives the selection marker by mistake.
Sidebar footer
Footer actions use icons and remain visible in a narrow window.
Group chat
Group messages now support copy, reply, reactions, document attachments, and visible reaction chips. The group details close control uses the same top-right position as the open control.
Quit overlay
The hold-to-quit message is centered in the app window.
Browser layout
The expanded browser restores from the bottom-right. The docked browser surface does not accept pointer or keyboard input until the user opens it to interact.
Copy feedback
After Copy, the existing action icon becomes a small checkmark without adding a second floating confirmation.
Verification
git diff --checkpassed.Model: gpt-5.6-sol
Harness: Codex in T3 Code