This commit is contained in:
@ -1,88 +1,11 @@
|
||||
---
|
||||
issueRef: "#155"
|
||||
version: 4
|
||||
version: 6
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedAt: 1786007117827
|
||||
updatedAt: 1786034876664
|
||||
---
|
||||
## Objective
|
||||
Allow the user to paste an image directly from the clipboard into the custom agent chat composer (for example after a screenshot) and send it as a proper attachment.
|
||||
|
||||
## Dependency
|
||||
This ticket depends on #154 because clipboard image paste must reuse the durable agent/chat attachment pipeline rather than reintroduce a local-only workaround.
|
||||
|
||||
## User expectation
|
||||
The experience should feel close to Codex / Claude Code:
|
||||
- user focuses the custom chat composer;
|
||||
- presses paste after taking a screenshot or copying an image;
|
||||
- sees an attachment chip and, if practical, a lightweight preview;
|
||||
- sends the message normally;
|
||||
- the target agent can actually access the attached image in its sandbox.
|
||||
|
||||
## Product constraints
|
||||
- This is for the custom structured chat UI, not the raw PTY/TUI path.
|
||||
- The feature must ride on first-class attachments, not on embedding base64 in the prompt or on temporary browser-only objects.
|
||||
- If the message text is empty but an image attachment is present, product behavior should be explicitly decided: either allow send with attachment-only or require text. Recommendation: allow attachment-only send.
|
||||
|
||||
## UX scope
|
||||
Recommended MVP:
|
||||
- intercept paste on the custom chat composer textarea;
|
||||
- detect image MIME types from clipboard data (`image/png`, `image/jpeg`, potentially `image/webp` if stable);
|
||||
- materialize the image through the foundation pipeline from #154;
|
||||
- show an attachment chip with filename, MIME, and size if available;
|
||||
- show a thumbnail preview when cheap and reliable;
|
||||
- allow removing the pasted attachment before send;
|
||||
- send through the same structured attachment contract as picked files.
|
||||
|
||||
Possible follow-ups, not required in this ticket unless cheap:
|
||||
- multiple pasted images in one operation;
|
||||
- drag-and-drop onto the composer;
|
||||
- richer preview lightbox;
|
||||
- file progress UI for large payloads.
|
||||
|
||||
## Edge cases
|
||||
- clipboard contains both text and image;
|
||||
- clipboard contains unsupported binary data;
|
||||
- paste permission / browser-webview limitations;
|
||||
- pasted image too large;
|
||||
- rapid repeated pastes;
|
||||
- session recovery / resend after structured session NOT_FOUND;
|
||||
- removing/replacing an attachment before send.
|
||||
|
||||
## Expected technical direction
|
||||
### Frontend
|
||||
- handle `onPaste` on the composer;
|
||||
- inspect clipboard items and prefer image payloads when present;
|
||||
- route pasted binary data through the attachment creation/import API from #154;
|
||||
- keep attachment state typed and separate from message text;
|
||||
- render attachment chip/preview in the composer area;
|
||||
- keep keyboard behavior intact: Enter sends, Shift+Enter newline.
|
||||
|
||||
### Backend
|
||||
- no bespoke clipboard-only path; use the generic attachment pipeline from #154;
|
||||
- if a dedicated import endpoint is needed for raw bytes from the frontend, it should still create the same attachment entity/store record as picked files.
|
||||
|
||||
### Sandbox / runtime
|
||||
- the agent must read the resulting stored image through the managed attachment location;
|
||||
- no dependence on the clipboard source continuing to exist after paste.
|
||||
|
||||
## Acceptance criteria
|
||||
- Pasting an image into the custom chat composer creates a real attachment entry.
|
||||
- The composer shows the attachment before send and lets the user remove it.
|
||||
- Sending the turn makes the attachment available to the target agent through the first-class attachment pipeline.
|
||||
- The feature works for a typical screenshot flow on supported desktop targets.
|
||||
- Failure states are explicit and recoverable (unsupported clipboard content, too large, import failed).
|
||||
|
||||
## QA expectations
|
||||
- verify screenshot paste on the supported desktop platform(s);
|
||||
- verify pasted image is readable by the agent in practice, not just visible in UI;
|
||||
- verify send with attachment-only if product accepts it;
|
||||
- verify no regression on plain text send, picked-file attach, and session recovery.
|
||||
|
||||
## Quality bar
|
||||
No workaround such as:
|
||||
- adding a fake path string to the prompt without importing the file;
|
||||
- storing only a browser blob URL;
|
||||
- embedding the whole image inline in prompt text;
|
||||
- relying on arbitrary external paths that the sandbox may or may not read.
|
||||
|
||||
This ticket is considered done only if the UX is good and the underlying file-access model is solid.
|
||||
## 2026-08-06 — Reopened from user validation on AppImage
|
||||
- User reports that clipboard paste in the custom CLI chat still does not work in practice.
|
||||
- Suspected historical scope was around #154/#155; this cycle treats #155 as the user-visible clipboard UX bug and keeps the #154 attachment foundation dependency in view.
|
||||
- Scope for this cycle: verify whether the regression is frontend paste interception, attachment import, backend routing, or AppImage/runtime mismatch; restore end-to-end paste of clipboard image/file into the custom chat composer.
|
||||
- Main reopened the ticket and assigned frontend/backend ownership before architecture arbitration.
|
||||
|
||||
@ -2,16 +2,16 @@
|
||||
id: "620bc08f-835c-483c-a9f1-59690ebf8ab5"
|
||||
number: 155
|
||||
title: "Custom chat: paste image from clipboard into composer"
|
||||
status: "closed"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#154","kind":"dependsOn"}]
|
||||
agentRefs: []
|
||||
agentRefs: [{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"},{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}]
|
||||
attachments: []
|
||||
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
createdAt: 1785964740363
|
||||
updatedAt: 1786007117827
|
||||
version: 4
|
||||
updatedAt: 1786034876664
|
||||
version: 6
|
||||
---
|
||||
Allow pasting an image from the clipboard (for example a screenshot) directly into the custom agent chat composer, with preview/attachment behavior comparable to Codex and Claude Code. This ticket should rely on a proper attachment foundation rather than a prompt-only hack.
|
||||
La custom CLI ne permet toujours pas de coller une image/fichier depuis le presse-papiers dans le chat. Après un test utilisateur du 2026-08-06, le collage attendu ne crée aucun attachment utilisable dans le composer. Il faut rétablir le support de collage clipboard dans le chat custom, sur la base du pipeline d'attachments, puis valider end-to-end sur l'AppImage réelle.
|
||||
Reference in New Issue
Block a user