Skip to content

fix(chat): merge Matrix m.replace edits into existing timeline row - #2152

Merged
alexprate merged 6 commits into
mainfrom
cursor/fix-matrix-edit-timeline-merge-ef7a
Apr 13, 2026
Merged

fix(chat): merge Matrix m.replace edits into existing timeline row#2152
alexprate merged 6 commits into
mainfrom
cursor/fix-matrix-edit-timeline-merge-ef7a

Conversation

@webguru-hypha

@webguru-hypha webguru-hypha commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Problem (PR #2145)

Edits send a new m.room.message with m.relates_to m.replace, but the timeline listener always emitted message.id === the new event id. The UI then appended a second row (often showing the literal * … fallback body) instead of updating the original message.

Fix

In matrix-provider.tsx:

  1. getRoomMessageReplaceTargetEventId — Detects m.replace room messages.
  2. RoomEvent.Timeline handler — When a replacement event arrives, resolve the target event, run messageFromRoomMessageEvent on that (so getContent() reflects applied edits), attach reactions, and notify listeners with Message.id = original event id so HumanRightPanel replaces the existing row.
  3. getRoomMessages — Skips standalone replacement events so the initial load list does not show duplicate “edit” rows.

Testing

  • pnpm run format:fix
  • pnpm --filter @hypha-platform/core test
  • pnpm --filter @hypha-platform/epics check-types

Relation to #2145

This branch is based on pull/2145/head and adds the commit above. You can merge it instead of #2145 once reviewed, or cherry-pick the fix commit onto #2145 if you prefer to keep that PR’s thread.

Open in Web Open in Cursor 

Summary by CodeRabbit

  • New Features

    • Users can edit previously sent text messages via an "Edit" action; an edit preview appears with excerpt, auto-focus, and a cancel button.
  • Behavior

    • Edits replace the original message in the timeline (edits don’t appear as separate messages).
    • Editing is limited to plain-text messages (no attachments/media); attachments are disallowed when editing.
    • Reactions and redactions are preserved/updated appropriately with edits.
  • Internationalization

    • Added edit-related labels in English, German, Spanish, French, and Portuguese.

@coderabbitai

coderabbitai Bot commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Warning

Rate limit exceeded

@cursor[bot] has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 15 minutes and 1 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 15 minutes and 1 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4b012c66-a3c1-444b-8ff1-f9f2bdeb3f2d

📥 Commits

Reviewing files that changed from the base of the PR and between 0d8d6fc and c9daa45.

📒 Files selected for processing (3)
  • packages/core/src/matrix/client/providers/matrix-provider.tsx
  • packages/core/src/matrix/rich-reply.ts
  • packages/epics/src/common/human-right-panel.tsx

Walkthrough

Adds message-editing: provider exposes edit API and handles Matrix "replace" events in timelines; UI gains edit controls, edit state in right panel, composer wiring for edits, and i18n entries for edit actions.

Changes

Cohort / File(s) Summary
Matrix Provider & Edit API
packages/core/src/matrix/client/providers/matrix-provider.tsx
Adds EditRoomMessageInput and editRoomMessage() (validations, resolves pending target events, author/msgtype checks, builds m.new_content or rich-reply, sends m.room.message with m.relates_to.rel_type: Replace). Adds noop fallback that throws when Matrix is unavailable. Also updates timeline handling to consume/merge replace events.
Replace Detection Helper
packages/core/src/matrix/rich-reply.ts
Adds getMessageReplaceTargetEventId(event) to extract the referenced event_id when m.relates_to.rel_type === RelationType.Replace.
Timeline / Message Handling for Replaces
packages/core/src/matrix/client/providers/matrix-provider.tsx
Filters out replacement events from message lists; intercepts replace events on the timeline, resolves the referenced target event (including pending), marks target replaced (makeReplaced/clear on redaction), reconstructs merged message content, attaches reactions, and invokes message listeners with the patched message.
Right Panel: Edit State & Send Flow
packages/epics/src/common/human-right-panel.tsx
Adds editDraft state and handlers to start/clear edits; extracts plain-text excerpt via stripMatrixReplyFallback; syncs editDraft with local-echo id replacements; modifies send flow to call matrixRef.current.editRoomMessage(...) when editing (attachments disallowed) and restores edit state on failures.
UI: Message Bubble, Messages List, Chat Bar
packages/epics/src/common/human-chat-panel/human-chat-panel-message-bubble.tsx, packages/epics/src/common/human-chat-panel/human-chat-panel-messages.tsx, packages/epics/src/common/human-chat-panel/human-chat-panel-chat-bar.tsx
Message bubble: adds optional onEdit prop and Pencil action (disabled for pending/media). Messages list: adds onEditMessage prop and conditionally wires onEdit for editable messages. Chat bar: accepts editPreview (excerpt + onDismiss), focuses composer when edit starts, and renders edit preview with dismiss control.
Localization
packages/i18n/src/messages/en.json, .../de.json, .../es.json, .../fr.json, .../pt.json
Adds HumanChatPanel.editButton, HumanChatPanel.editingMessage, HumanChatPanel.editDismiss, and HumanChatPanel.editAttachmentsNotSupported translations.

Sequence Diagram

sequenceDiagram
    actor User
    participant ChatUI as Chat UI
    participant RightPanel as Right Panel
    participant MatrixProvider as Matrix Provider
    participant MatrixServer as Matrix Server

    User->>ChatUI: Click edit on message
    ChatUI->>RightPanel: onEditMessage(messageId)
    RightPanel->>RightPanel: validate & extract excerpt\nset editDraft, populate composer
    RightPanel->>ChatUI: show editPreview & input text
    User->>ChatUI: send edited text
    ChatUI->>RightPanel: handleSend()
    RightPanel->>MatrixProvider: editRoomMessage({roomId, targetEventId, message})
    MatrixProvider->>MatrixProvider: validate target & load room/event
    MatrixProvider->>MatrixServer: send m.room.message with m.relates_to.rel_type="m.replace"
    MatrixServer-->>MatrixProvider: ack
    MatrixProvider->>ChatUI: timeline receives replace event
    MatrixProvider->>ChatUI: merge m.new_content into original message
    ChatUI->>User: display edited message
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • alexprate
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title follows conventional commits format with valid type 'fix', scope 'chat', and a clear description of the change.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/fix-matrix-edit-timeline-merge-ef7a

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 770-780: Replace the hardcoded English error thrown when editing
with a translated string: use the i18n translator (t) to throw new
Error(t('editAttachmentsNotSupported')) in the block that checks
editTargetEventId and savedAttachments (around the savedAttachments.length > 0
check and before calling matrixRef.current.editRoomMessage). Add the
"editAttachmentsNotSupported" key to the i18n resource files with the provided
message so translations are available.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ffef5306-b968-4305-b957-68f5d9e8f217

📥 Commits

Reviewing files that changed from the base of the PR and between 9bdc39e and 44b694e.

📒 Files selected for processing (10)
  • packages/core/src/matrix/client/providers/matrix-provider.tsx
  • packages/epics/src/common/human-chat-panel/human-chat-panel-chat-bar.tsx
  • packages/epics/src/common/human-chat-panel/human-chat-panel-message-bubble.tsx
  • packages/epics/src/common/human-chat-panel/human-chat-panel-messages.tsx
  • packages/epics/src/common/human-right-panel.tsx
  • packages/i18n/src/messages/de.json
  • packages/i18n/src/messages/en.json
  • packages/i18n/src/messages/es.json
  • packages/i18n/src/messages/fr.json
  • packages/i18n/src/messages/pt.json

Comment thread packages/epics/src/common/human-right-panel.tsx
cursoragent and others added 3 commits April 13, 2026 02:39
Wire m.replace edits for own plain text messages: pencil between react and
reply, composer edit preview, and editRoomMessage on the Matrix provider.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>
Timeline listener now maps replacement events to the target message id
and re-emits the parent row; initial room load skips standalone replace
events so the list does not duplicate edits.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>
When the SDK attaches a replacingEvent before the parent wire updates,
merge m.new_content into the root message payload so the first edit
reflects in the timeline without a second send.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>
@alexprate
alexprate force-pushed the cursor/fix-matrix-edit-timeline-merge-ef7a branch from 3f813a7 to 92433e9 Compare April 13, 2026 00:39

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
packages/epics/src/common/human-right-panel.tsx (1)

834-838: ⚠️ Potential issue | 🟡 Minor

Move this edit error into i18n.

This message is surfaced back to the composer via sendFailedWithReason, so the raw English string leaks into the UI. Use a translation key here like the other composer errors. As per coding guidelines "i18n: all user-facing text uses translation keys".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/epics/src/common/human-right-panel.tsx` around lines 834 - 838,
Replace the hard-coded English error thrown when editTargetEventId &&
savedAttachments.length > 0 with a translated message key (follow existing
composer error keys pattern) and pass the translated string into
sendFailedWithReason instead of the raw text; update human-right-panel.tsx to
use the project's i18n utility (e.g., useTranslation/t or i18n.t) and a key like
"composer.errors.attachmentsNotSupportedWhenEditing" (or the matching existing
composer errors namespace) so the UI receives a localized message rather than
the raw English string.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/core/src/matrix/client/providers/matrix-provider.tsx`:
- Around line 882-908: The redaction path must treat redacted edit events like
the incoming-edit branch: when handling a RoomRedaction, detect if the redacted
event is an edit (use getRoomMessageReplaceTargetEventId on the redacted event
or inspect its content.relates_to.rel_type === 'm.replace'), then find the
original target event via room.findEventById(targetId) and rebuild the message
using messageFromRoomMessageEvent (pass pinned status from
getPinnedMessageIds(roomId)), attachReactionsToMessage(room, message,
client.getUserId()), and call messageListener(message) with the rebuilt edit
mapped onto the original event id; otherwise fall back to the existing
redaction-to-plain-message behavior. Ensure you reference RoomRedaction handling
code, use client.getUserId(), and preserve the existing early return logic.

In `@packages/core/src/matrix/rich-reply.ts`:
- Around line 249-260: When applying a partial edit (see replacingEv,
newContent, and content), avoid preserving stale rich HTML metadata by ensuring
that if newContent does not include 'format' or 'formatted_body' we do not carry
those keys from rootContent into the merged content; modify the merge so you
build the final content from rootContent plus newContent but explicitly remove
or omit rootContent.format and rootContent.formatted_body when those keys are
absent in newContent so formattedContentHtml cannot render pre-edit HTML after a
plain-text edit.

---

Duplicate comments:
In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 834-838: Replace the hard-coded English error thrown when
editTargetEventId && savedAttachments.length > 0 with a translated message key
(follow existing composer error keys pattern) and pass the translated string
into sendFailedWithReason instead of the raw text; update human-right-panel.tsx
to use the project's i18n utility (e.g., useTranslation/t or i18n.t) and a key
like "composer.errors.attachmentsNotSupportedWhenEditing" (or the matching
existing composer errors namespace) so the UI receives a localized message
rather than the raw English string.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 91b4f2f8-3391-41ef-8307-12323af415f1

📥 Commits

Reviewing files that changed from the base of the PR and between 44b694e and 92433e9.

📒 Files selected for processing (11)
  • packages/core/src/matrix/client/providers/matrix-provider.tsx
  • packages/core/src/matrix/rich-reply.ts
  • packages/epics/src/common/human-chat-panel/human-chat-panel-chat-bar.tsx
  • packages/epics/src/common/human-chat-panel/human-chat-panel-message-bubble.tsx
  • packages/epics/src/common/human-chat-panel/human-chat-panel-messages.tsx
  • packages/epics/src/common/human-right-panel.tsx
  • packages/i18n/src/messages/de.json
  • packages/i18n/src/messages/en.json
  • packages/i18n/src/messages/es.json
  • packages/i18n/src/messages/fr.json
  • packages/i18n/src/messages/pt.json

Comment thread packages/core/src/matrix/client/providers/matrix-provider.tsx Outdated
Comment thread packages/core/src/matrix/rich-reply.ts Outdated
Port PR #2139 behavior: getMessageReplaceTargetEventId in rich-reply,
timeline calls targetEv.makeReplaced before mapping, pending edit target
lookup, and editRoomMessage builds m.new_content like replaceMessage
(including rich-reply preservation). Revert manual m.new_content merge in
messageFromRoomMessageEvent so getContent() drives display after makeReplaced.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
packages/core/src/matrix/client/providers/matrix-provider.tsx (1)

903-930: ⚠️ Potential issue | 🟠 Major

Mirror the new edit-remap logic in the redaction path.

Line 917 rewrites incoming edits onto the original message id, but the RoomRedaction branch still rebuilds a redacted edit as messageFromRoomMessageEvent(redacted). If an edit is later redacted, that emits the edit event id instead of refreshing the original row, so the UI can keep the edited body stuck or surface a new placeholder row. Please route redacted m.replace events through the same target lookup used here before falling back to the generic m.room.message handling.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/core/src/matrix/client/providers/matrix-provider.tsx`:
- Around line 644-718: The code sends an m.replace relation using the
potentially-provisional targetEventId (from room.getPendingEvent / targetEv)
which may start with '~' and be rejected by the server; update the relation to
reference the server-assigned event ID before calling client.sendEvent: detect
provisional IDs (e.g., targetEventId.startsWith('~') or targetEv.isPending/local
echo), then either await the Matrix SDK LocalEventIdReplaced event for that
local ID (listen for LocalEventIdReplaced and capture the final eventId) or call
the SDK helper updateAssociatedId to map the local ID to the final server ID;
replace the value used in 'm.relates_to.event_id' with the resolved
server-assigned ID (use the same symbols targetEventId, targetEv,
client.sendEvent and updateAssociatedId/LocalEventIdReplaced) before sending.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: dc53f33d-ed18-42be-a0c1-48f1c8325474

📥 Commits

Reviewing files that changed from the base of the PR and between 92433e9 and 9a9a66c.

📒 Files selected for processing (2)
  • packages/core/src/matrix/client/providers/matrix-provider.tsx
  • packages/core/src/matrix/rich-reply.ts

Comment thread packages/core/src/matrix/client/providers/matrix-provider.tsx
Localize edit-with-attachments error for composer display. When a
replacement message is redacted, refresh the original timeline row via
makeReplaced(undefined) and messageFromRoomMessageEvent.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>
@alexprate
alexprate self-requested a review April 13, 2026 01:15
@alexprate
alexprate enabled auto-merge April 13, 2026 01:19
coderabbitai[bot]
coderabbitai Bot previously requested changes Apr 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
packages/core/src/matrix/client/providers/matrix-provider.tsx (1)

644-718: ⚠️ Potential issue | 🟠 Major

Resolve local-echo target IDs before sending m.replace.

Line 646 makes pending events editable, but Line 716 still forwards targetEventId verbatim into m.relates_to.event_id. If the target is still a local echo, the edit can be sent against a provisional ~... id and be rejected by the homeserver. Resolve the server event id first, or wait for the SDK to remap the association before calling sendEvent.

According to the Matrix message-editing spec and matrix-js-sdk, can an `m.replace` event reference a provisional/local-echo event id in `m.relates_to.event_id`, or must it use the server-assigned event id?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/matrix/client/providers/matrix-provider.tsx` around lines
644 - 718, The edit currently sends the original targetEventId into
m.relates_to.event_id which can be a provisional/local-echo id and will be
rejected by the homeserver; ensure the edit references the server-assigned event
id (or waits for the SDK to remap the local echo) before calling
client.sendEvent. Update the logic around targetEventId/targetEv (the value
derived via room.findEventById / room.getPendingEvent) to detect a
provisional/local-echo id, resolve it to the server event id (e.g. by polling
the room or using the SDK’s remapping API / helper you already use for replies
such as resolveReplyTargetForSend) or await the SDK’s remap, then use that
resolved server id when building 'm.relates_to.event_id' passed into
client.sendEvent; keep all other content-building (buildRichReplyMatrixContent,
matrixTextEventContentWithOptionalFormatting) unchanged.
packages/epics/src/common/human-right-panel.tsx (1)

834-842: ⚠️ Potential issue | 🟡 Minor

Surface the edit-attachment constraint directly.

Throwing on Line 836 still falls through the generic sendFailedWithReason path, so the composer shows a prefixed send failure instead of the dedicated edit-mode constraint message.

💡 Proposed fix
       if (editTargetEventId) {
         if (savedAttachments.length > 0) {
-          throw new Error(t('editAttachmentsNotSupported'));
+          setSendingPending(null);
+          setComposerError(t('editAttachmentsNotSupported'));
+          setInput(text);
+          setReplyDraft(savedDraft);
+          setEditDraft(savedEditDraft);
+          setDraftAttachments(savedAttachments);
+          sendOperationTokenRef.current = null;
+          return;
         }
         await matrixRef.current.editRoomMessage({
           roomId,
           targetEventId: editTargetEventId,
           message: text,

As per coding guidelines, "Ensure message editing components reference these exact keys (and don’t reuse unrelated reply keys) so the composer/edit preview and edit constraint message render correctly."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/epics/src/common/human-right-panel.tsx` around lines 834 - 842, When
editTargetEventId is set and savedAttachments.length > 0, do not throw an Error
(which falls into the generic sendFailedWithReason path); instead surface the
edit-mode constraint directly by invoking the composer/edit-preview failure path
with the exact key 'editAttachmentsNotSupported' and return early. Replace the
throw in the block that references editTargetEventId and savedAttachments with a
call that signals the edit constraint (e.g., call sendFailedWithReason or the
component method that accepts a reason key) using 'editAttachmentsNotSupported',
then exit before calling matrixRef.current.editRoomMessage.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 530-531: When tearing down edit state (where you currently call
setReplyDraft(null) and setEditDraft(null)), also clear the composer input so
the previous message body doesn't persist across rooms: call the input-clearing
setter (e.g., setInput('') or the appropriate composer state reset) alongside
setReplyDraft and setEditDraft in the same places (the blocks around the
setReplyDraft/setEditDraft calls referenced in this diff, and the analogous
spots at the other two occurrences) so switching rooms won't leave the old draft
in the composer.

---

Duplicate comments:
In `@packages/core/src/matrix/client/providers/matrix-provider.tsx`:
- Around line 644-718: The edit currently sends the original targetEventId into
m.relates_to.event_id which can be a provisional/local-echo id and will be
rejected by the homeserver; ensure the edit references the server-assigned event
id (or waits for the SDK to remap the local echo) before calling
client.sendEvent. Update the logic around targetEventId/targetEv (the value
derived via room.findEventById / room.getPendingEvent) to detect a
provisional/local-echo id, resolve it to the server event id (e.g. by polling
the room or using the SDK’s remapping API / helper you already use for replies
such as resolveReplyTargetForSend) or await the SDK’s remap, then use that
resolved server id when building 'm.relates_to.event_id' passed into
client.sendEvent; keep all other content-building (buildRichReplyMatrixContent,
matrixTextEventContentWithOptionalFormatting) unchanged.

In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 834-842: When editTargetEventId is set and savedAttachments.length
> 0, do not throw an Error (which falls into the generic sendFailedWithReason
path); instead surface the edit-mode constraint directly by invoking the
composer/edit-preview failure path with the exact key
'editAttachmentsNotSupported' and return early. Replace the throw in the block
that references editTargetEventId and savedAttachments with a call that signals
the edit constraint (e.g., call sendFailedWithReason or the component method
that accepts a reason key) using 'editAttachmentsNotSupported', then exit before
calling matrixRef.current.editRoomMessage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8027a395-8878-4e38-a89c-87820b1fdae7

📥 Commits

Reviewing files that changed from the base of the PR and between 9a9a66c and 0d8d6fc.

📒 Files selected for processing (7)
  • packages/core/src/matrix/client/providers/matrix-provider.tsx
  • packages/epics/src/common/human-right-panel.tsx
  • packages/i18n/src/messages/de.json
  • packages/i18n/src/messages/en.json
  • packages/i18n/src/messages/es.json
  • packages/i18n/src/messages/fr.json
  • packages/i18n/src/messages/pt.json

Comment thread packages/epics/src/common/human-right-panel.tsx
…om switch

Wait for LocalEventIdReplaced before sending m.replace so relates_to uses a
server id. Extract awaitNonProvisionalMatrixEventId for reuse with reply targets.
Clear composer input and errors when tearing down chat state across modes.

Co-authored-by: webguru-hypha <webguru-hypha@users.noreply.github.com>
@alexprate
alexprate added this pull request to the merge queue Apr 13, 2026
Merged via the queue into main with commit 41929c1 Apr 13, 2026
8 checks passed
@alexprate
alexprate deleted the cursor/fix-matrix-edit-timeline-merge-ef7a branch April 13, 2026 01:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants