Skip to content

feat(native-chat): edit a queued message's images on desktop: remove, paste, drop or attach - #30815

Merged
brennanb2025 merged 18 commits into
mainfrom
brennanb2025/queued-edit-images
Oct 20, 2026
Merged

brennanb2025 merged 18 commits into
mainfrom
brennanb2025/queued-edit-images

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 10 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​602 $\color{#cf222e}{\Huge{\mathbf{−}}}$​36 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​566
Prod 48 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1292 $\color{#cf222e}{\Huge{\mathbf{−}}}$​311 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​981

ELI5

A queued follow-up message can hold images, but editing it in place only let you change its text. Now, on desktop, editing a queued message also lets you remove its images and add new ones by pasting, dropping or attaching, and Save keeps everything together in the same spot in the queue.

What Changed

Before: since #28655 a queued message can hold images, and since #26886 you can edit a queued message in place. But the edit only changed the text: the editor showed "N images, which saving the text keeps", with no way to remove a wrong screenshot or add another. The only fix was to delete the message and send it again, which loses its place in the queue.

After, on desktop:

  • While editing a queued message, its images show as thumbnails with a remove ✕, the same thumbnails the chat box uses.
  • You can add images the ways the chat box accepts them: paste (Cmd/Ctrl+V), drop onto the message being edited, or the Attach button. While you drag a file over the message being edited, it shows the chat box's drop overlay, scoped to that message: "Drop to attach to this message".
  • While an edit that takes images is open, any paste with focus inside that message (its text field, Attach, ✕, Save or Cancel), by keyboard, Edit > Paste or the chat's right-click Paste, goes to that edit: images and files attach, text goes into its field at the cursor. Outside the message, and for older hosts or agents without image input, paste works exactly as before. A quiet hint reads "Paste or drop images"; when the edit is empty it reads "Add text or an image to save" and Save is off.
  • Removing an image only takes effect when you press Save; Cancel discards text and image changes together.
  • Removing an image also fixes the [Image #N] references in the text (the chat box writes these since feat(native-chat): mark each attached image as [Image #N] where it sits in the prompt #28736): the removed image's reference goes and later ones renumber.
  • Adding an image doesn't change the text you're editing; on Save the message's text gets an [Image #N] reference for each added image, numbered in the order the images are saved, so the saved message matches what the agent receives. Adding and then removing an image leaves the text exactly as it was.
  • Dropping a non-image file onto the edit adds a file reference to the text, as the chat box does. This works for files dragged from Finder/Explorer and from Orca's own file tree.
  • If the message leaves the queue or the edit can't be saved, unsaved text and the images you added move to the chat box, as unsaved text already does. If the message changed underneath an edit that had nothing to move (for example only an image removal), the notice says the edit wasn't saved instead of pointing at the chat box.
  • If a newly added image's upload expired before Save, the notice now reads "This attachment expired. Your edit wasn't saved. Remove it and attach it again." (it used to say "The command didn't run"). The phone's queued-edit refusals use the same wording.
  • For agents that can't take images, Attach and the hint are hidden and image pastes are ignored; removing an image still works.
  • The queue list allows a taller box while an editor with thumbnails is open, so they fit. An older host's editor keeps today's height.

Mechanism:

  • The edit contract used to model "the text"; it now models the message body's user-editable parts. agentSession.queuedMessageUpdate takes a new optional images field: the complete ordered set of images the message should hold. Absent means "keep the images" (what every older client sends). The edit stays a compare-and-set on the body's fingerprint, so a resent Save whose answer was lost reads as unchanged, never as a double add.
  • One shared function (queuedMessageWithEdit in src/shared/queued-message-edit.ts) builds the edited body for the client's Save button and the host's decision alike, with the same block and size limits as a fresh send.
  • The host claims newly added uploads in the same transaction as the edit, so an upload that was cleaned up in between refuses the Save with the existing "attachment expired" message. Images the message already had are claimed best effort and never block a text fix. The host refuses images from a client that can't display queued image messages.
  • The edit's images live in in-memory edit state (what the message had, plus what you added), not in the chat box's saved draft store, and reuse the chat box's own paste, drop and attach code with the edit as their destination.

Known limits (intended):

  • Added images' [Image #N] references appear when you Save, not while you type (the chat box shows them as you attach). The thumbnails show what you've added in the meantime.
  • Text pasted with focus on the editing message's buttons goes into that message's text field (before, it went to the chat box); a paste into a message that's mid-save is refused with the existing notice instead of going to the chat box.
  • In the browser client over plain HTTP, the browser can't read the clipboard for Orca's own right-click Paste; keyboard paste still works. Saving a pasted image there was already unsupported before this PR.
  • While a question or approval takes the chat box's place, dragging an image from Orca's own file tree onto the editing message does nothing (the cursor shows not-allowed); Finder/Explorer drops, paste and Attach still work. On main that drop never reached the edit either.
  • An image still uploading when the message leaves the queue is not moved to the chat box (finished ones are).
  • If a remote host's feature check fails after a reconnect while you've changed images (already the behavior on main: a failed check reads as "not supported" until the next reconnect), the thumbnails hide and Save waits instead of saving only the text; Cancel still works, and everything returns when the host answers again.
  • A text-only Save now claims any upload newly named in the edited text, the same as a fresh send, so an expired one refuses the Save instead of going out with a dead path. Older clients get this too.

Mixed versions: a new capability, agent-session.queued-message-image-edit.v1, gates the image editing. An older host gets exactly today's text-only editor, and an older client never sends images, so the host keeps the images as today. The phone is unchanged in this PR: it still doesn't advertise queued image messages, so it never sees them, and its text edits keep images. The phone part follows in a separate PR. Until it lands, a text-only message that gains an image on desktop leaves the phone's queue view (the host shows image messages only to clients that can display them), and a phone editing that message at that moment loses its unsaved edit. It reappears once the phone PR ships.

Why

A queued message's images should be editable (remove, replace, add by paste) the same way its text is. The common pattern sends the message's full new content on Save rather than add/remove steps, keeps removals local until Save, uploads images when they're added, drops references to removed images from the text, and claims new uploads in the same write as the edit; this does the same. Intended differences from the common pattern: the editor stays inline in the queued message instead of taking over the chat box, because Orca's queued edit must keep working while a question or approval holds the chat box; the one-line hint is Orca-only, because the inline editor is a plain field with no other cue that it takes images.

Linked Issue

Maintainer PR; follow-up to #28655 and #26886.

Visual Proof

Desktop QA with real agents, run against main for comparison. Head f9f9914 on the M4Air (macOS) unless noted.

  • Edit a queued message: remove one image, add by drop and by a real clipboard paste; three thumbnails in order (head f9f9914, M4Air):
    Editing a queued message with three images
  • After Save, the message keeps its place in the queue with three images (head f9f9914, M4Air):
    Saved queued message with three images
  • Real Claude receives the edited message with [Image #1] [Image #2] [Image #3] and names Blue square, Green triangle, Purple diamond in order (head f9f9914, M4Air):
    Claude reply naming the edited images in order
  • Real Codex names the same three images in order (head f9f9914, M4Air):
    Codex reply naming the edited images in order
  • Edit > Paste of a PNG with focus on the edit's Attach button lands in the edit, not the chat box (head f9f9914, M4Air):
    Menu paste of an image into the edit with Attach focused
  • Text pasted with focus on the edit's Attach button goes into the edit's text field at the cursor (intended change: before, it went to the chat box) (head f9f9914, M4Air):
    Text paste into the edit with Attach focused
  • Dragging a file over the message being edited shows "Drop to attach to this message" on that message only (head 0132404, M4Air; the drop code is unchanged since):
    Drop overlay scoped to the editing message

Windows (Windows high-spec box, head f9f9914): every paste flow passed — Ctrl+V and Shift+Insert with focus on Attach, ✕, Save and Cancel (22 paste records), replacing a selected word keeps the cursor, and paste outside the message is unchanged; real Claude and real Codex each named the edited images in order. Report kept on the QA machine (no screenshots copied).

Testing

  • Host test of the compare-and-set with images: replacing the set, a resend reads unchanged, a stale fingerprint reads changed, a cleaned-up new upload is refused, a text fix still saves when an old image's upload is gone, and a client that can't show image messages is refused.
  • Editor test of the round trip (remove the first image, the text's [Image #N] references renumber, paste a new one with focus on Attach, Save sends the new set) and the older-host editor (today's count, no images sent).
  • Pane drop test: a file dragged from Orca's file tree onto the editing message reaches the edit, not the chat box, with no chat-box overlay.
  • Editor test: an image edit is never saved as text only when the host stops reporting image editing.
  • Paste routing test: with focus on the editing message's Attach button, keyboard and menu paste both land in the edit, keeping the cursor; an older host's paste goes to the chat box.
  • Review loop: 8 rounds (Codex reviewers and fixers from round 6), two design-panel rulings (where added images' references go; who owns a paste) (host and wire, desktop editor, architecture against the common pattern, main-vs-branch trace); findings fixed in this PR.
  • Desktop QA on head f9f9914, macOS (M4Air) and Windows, against main: the main path with real Claude and real Codex (remove an image, add by drop and paste, Save, the agent names the images in order); every paste route (Edit > Paste and the keyboard on macOS, Ctrl+V and Shift+Insert on Windows, right-click Paste, refusal while Save is pending, text on Attach, replacing a selected word, mixed content, a copied file); paste in the chat box, split panes and question boxes unchanged from main; this PR's app paired with a main-build host falls back to today's text-only editor.
  • Not exercised: the browser client (the host doesn't offer native chat to it, on main either), an agent without image input (the provider rejected the only candidate on both builds), a released older Orca binary as host (a main-build host stood in), and SSH.

Review

Author: Brennan Benson (@BrennanKB5)

@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e03ad054-5515-48a1-8b0d-c210b14a4d2b
📥 Commits

Reviewing files that changed from the base of the PR and between ec527bc and 4f33b4a.

📒 Files selected for processing: 2
  • src/main/native-chat/agent-session-journal/journal-queued-messages.ts
  • src/renderer/src/i18n/locales/en.json
🚧 Files skipped from review as they are similar to previous changes: 1
  • src/renderer/src/i18n/locales/en.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

📝 Walkthrough

Queued-message edits now support image references when the host advertises the image-edit capability. The update path validates edited text and images, checks image-card access, and claims newly named uploads. The renderer adds image attachment, paste, and drop handling, and reconciles edit state with queue and submission state. Mobile host support reports the capability. The change also adds queued-edit save notices and translations.

Priority: ➖ Normal

Merge Risk: 🟡 Moderate · up to 4f33b

Images can be lost when a queued card leaves during upload, and a removal made during Save can be discarded. These narrow but concrete image-edit failures should be addressed before merging.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 40.63% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 64 functions across 43 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed The title clearly summarizes the primary change: desktop queued-message image editing through removal, paste, drop, and attachment.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The pull request description is complete and directly matches the template. It includes ELI5, user-facing changes, rationale, linked prior issues, extensive visual proof, testing details, compatibilit…
Full details: Description check

Explanation

The pull request description is complete and directly matches the template. It includes ELI5, user-facing changes, rationale, linked prior issues, extensive visual proof, testing details, compatibility limits, and review information. The AI Disclosure, Agent skill upstream boundary, Notes, and checklist sections are not explicitly completed, but these omissions are non-critical because the author identifies this as a maintainer PR and provides detailed testing and review context.

Full details: Docstring Coverage

Explanation

Docstring coverage is 40.63% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 64 functions across 43 files. (1 skipped: 1 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

  • Fix all pre-merge checks with AI
✨ Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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 its wire takes a full image set

An expired upload refused on Save read "The command didn't run": the queued
message update fell through to the command write kind. It now has its own
kind whose sentence is "Your edit wasn't saved." The images param caps at
MAX_BLOCKS, matching the shared edit rule that counts them with the text.
…ops and pastes on its card

- Removing a kept image drops its [Image #k] marker from the edit's text and
  renumbers the later ones (shared rule, reused by the phone), so the agent
  never reads a marker that names the wrong image.
- A file dragged from Orca's own tree onto the editing card goes to the edit,
  like a Finder/Explorer drop; the chat box overlay no longer covers the card.
- Cmd/Ctrl+V with focus on the card's buttons goes to the edit, not the chat box.
- A "changed" answer says "Your edit is in the chat box" only when something
  went there; otherwise it says the edit wasn't saved.
- The empty hint counts an uploading image as content and is not shown for
  agents without image input; the list grows only while thumbnails show.
- Every hand-off releases the edit's preview URLs.
… chat box's owner check

The edit no longer runs its own copy of the in-app drop check, which resolved
the target host through a path that can read the Active Server setting. The
chat box's claim checks the drop and routes it by the chat's owner as before,
then hands the files to the editing card's sink when the drop landed on it.
Also: the kept-image id list is readonly where it is read, and the marker
rule looks up the remaining images in a Set.
…tes, and no drop joins a Save in flight

The pane paste bridge no longer skips every paste inside a queued editor: the
card's own paste handler already claims image and file pastes, which the bridge
respects. A menu paste is left to the card only when the edit takes images (the
card is a drop owner), so an older host or an agent without image input behaves
as before, and text pasted with focus on the card's buttons goes to the chat box.
An in-app drop handed to the card while its Save is in flight adds nothing.

@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


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3653a1a6-0bcc-4476-be3c-002ccb9810f0
📥 Commits

Reviewing files that changed from the base of the PR and between fd52a0a and 7cf516a.

📒 Files selected for processing: 26
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageCard.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageEditor.test.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageEditor.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageList.tsx
  • src/renderer/src/components/native-chat/agent-session-write-notice-text.ts
  • src/renderer/src/components/native-chat/native-chat-pane-file-drop.test.tsx
  • src/renderer/src/components/native-chat/native-chat-pane-file-drop.ts
  • src/renderer/src/components/native-chat/queued-message-edit-notices.ts
  • src/renderer/src/components/native-chat/structured-agent-session-queued-edit-images.ts
  • src/renderer/src/components/native-chat/use-native-chat-paste-bridge.ts
  • src/renderer/src/components/native-chat/use-native-chat-queued-edit-image-intake.ts
  • src/renderer/src/components/native-chat/use-native-chat-workspace-file-drop.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-queued-edit.ts
  • src/renderer/src/i18n/en-runtime-required.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/shared/agent-session-refusal-notice.test.ts
  • src/shared/agent-session-refusal-notice.ts
  • src/shared/agent-session-write-failure.ts
  • src/shared/agent-session-write-notice-copy.ts
  • src/shared/queued-message-edit.ts
  • src/shared/rpc-contract/structured-agent-session-queued-edit-params.ts
🚧 Files skipped from review as they are similar to previous changes: 7
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageCard.tsx
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/locales/ja.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.

…answer, and an edit takes no files before its lease

A re-check after regained contact that failed wrote "unknown" over a known
answer for the same host, so features the host had reported (such as editing
a queued message's images) vanished on a connection blip, mid-edit. A failed
check now keeps the last answer; a different host still starts at unknown.
Paste, Attach and OS or in-app drops into a queued edit are now blocked while
it acquires its lease, as typing already is.

@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.

🔇 Additional comments: 3
src/renderer/src/runtime/structured-agent-session-host-capability.test.tsx: 1

93-111: LGTM!

src/renderer/src/components/native-chat/use-native-chat-queued-edit-image-intake.ts: 1

109-109: 🎯 Functional Correctness

captureExternalDrop retains the destination, but the retained handler checks the live disabledRef.current before processing. Local uploads recheck it before attachment, and runtime-session uploads pass the same live predicate to attachNativeChatSessionAttachmentPaths, which drops the upload when it becomes abandoned. A stale busy closure cannot append images through this path.

src/renderer/src/runtime/structured-agent-session-host-capability.ts-59-61: 1

59-61: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.

Keep failed-probe answers separate for each capability.

If a caller changes capability while keeping the same host, a failed probe retains the previous capability's answer. For example, supported for queued-message editing can become a false supported result for image editing. Store the capability with the answer, and retain an answer only when both the host key and capability match.


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6dd22c54-bbf5-47c3-ab75-04fb00de2421
📥 Commits

Reviewing files that changed from the base of the PR and between 7cf516a and 0fbe654.

📒 Files selected for processing: 3
  • src/renderer/src/components/native-chat/use-native-chat-queued-edit-image-intake.ts
  • src/renderer/src/runtime/structured-agent-session-host-capability.test.tsx
  • src/renderer/src/runtime/structured-agent-session-host-capability.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.

…he host stops reading as taking images

Reverts the shared capability hook to keep main's behavior: a failed re-check
reads as unknown. Instead the queued edit derives from live state that an edit
whose image set changed can't be saved while the host doesn't read as taking
images, so a connection blip never saves renumbered markers over the old
images or drops added ones. Save comes back once the host answers again.
…dit-images

# Conflicts:
#	src/renderer/src/components/native-chat/use-structured-agent-session-queued-edit.test.tsx
#	src/renderer/src/components/native-chat/use-structured-agent-session-queued-edit.ts
#	src/shared/native-chat-image-transcript-markers.test.ts
@brennanb2025

brennanb2025 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor Author

Review loop status: done on f9f9914

The problem. A message sent while the agent is busy waits in a queue, and since #28655 it can carry images. Editing it in place (#26886) changed only its text, so a wrong screenshot could only be fixed by deleting the message and sending it again, which loses its place in the queue.

What changes for the user (desktop). While editing a queued message you can remove its images and add new ones by paste, drop (Finder/Explorer or Orca's file tree) or Attach. Save keeps the message in its place. On Save, added images get [Image #N] references in the message's text, numbered in the order the agent receives them. Removing an image renumbers the remaining references. While an edit that takes images is open, any paste with focus inside that message goes to the edit. Older hosts get today's text-only editor; the phone is unchanged (its part follows separately).

Fixed during review (8 rounds; Claude reviewers in rounds 1-5, Codex reviewers and fixers from round 6; two design-panel rulings):

  • Removing an image left [Image #N] references pointing at the wrong image; added images had no reference. References now renumber on remove and are added for new images on Save.
  • Images dragged from Orca's file tree went to the chat box; dragging over the edit showed no drop target. Both now go to, and show on, the message being edited.
  • Paste with focus on the edit's buttons went to the chat box. The fix took four attempts, because routing by clipboard content broke a different paste path each time. The panel ruled for one owner: the message being edited owns every paste made with focus inside it. The chat box's own paste code is unchanged from main.
  • Smaller fixes: the older host's list height; an accurate notice when the message changed during an edit; "Your edit wasn't saved" instead of "The command didn't run" on an expired upload; the wire's image limit; nothing can be added while the edit opens or saves; an image edit is never saved as text only.

Deferred (known limits, in the PR body):

  • An image still uploading when the message leaves the queue isn't moved to the chat box.
  • A removed image's upload is kept until the chat is deleted, the same as deleting a queued message today.
  • A failed feature check after a reconnect hides features until the next reconnect. This is already the case on main, and the proper fix belongs in the remote-connection layer.
  • Until the phone PR lands, a message that gains an image on desktop leaves the phone's queue view.
  • A typed zero-padded [Image #01] can copy unchanged wording into the chat box on hand-off.
  • ✕ on an image stays clickable during the brief moment a Save is in flight; a removal made then is lost when the Save completes (the text field is already read-only then).

Verified:

  • CI: all checks green on f9f9914.
  • Desktop QA on f9f9914 against main, on macOS (M4Air) and Windows, with real Claude and real Codex:
    • The main path: each agent named the edited images in order.
    • Every paste route on both platforms.
    • Paste outside the edit unchanged from main.
    • This PR's app paired with a main-build host falls back to the text-only editor.
  • The drop overlay was QA'd on 0132404, and the drop code hasn't changed since.

Not verified:

  • The browser client: the host doesn't offer native chat to it, on main either.
  • An agent without image input: the provider rejected it on both builds.
  • A released older Orca binary as host.
  • SSH.

For Brennan's review

Branch screenshots. Main-vs-branch comparisons are in the QA reports; on main, none of these flows exists.

  • Edited message with three images; real Claude names them in order:
    edited
    Claude reply
  • Edit > Paste of a PNG with focus on Attach lands in the edit:
    menu paste
  • Drop target scoped to the message being edited (head 0132404):
    drop overlay

Three places where a human judgment matters:

  1. src/shared/queued-message-edit.ts:138: added images' [Image #N] references are created on Save, not shown while typing. This is intended, so they can't corrupt the text you're editing; the thumbnails show the additions meanwhile.
  2. src/renderer/src/lib/native-chat-paste-request.ts:12: the message being edited owns every paste made with focus inside it. As a result, text pasted with focus on its buttons now goes into the edit (before: the chat box). This replaced an earlier agent ruling, not one of yours.
  3. src/main/native-chat/agent-session-attachments/agent-session-attachment-claims.ts:114: Save requires uploads the message didn't already name and keeps existing ones best effort, in the same write as the edit. So an expired new image refuses the Save, but an old image can never block a text fix.

@brennanb2025
brennanb2025 merged commit d406e0c into main Oct 20, 2026
44 checks passed
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.

1 participant