Repository navigation
FEAT GUI: Import a dataset example into a chat draft #2751
Description
Is your feature request related to a problem? Please describe.
After inspecting a dataset example, users should be able to try it in chat without copying text and reattaching media manually. The destination must be explicit, and importing must not make a model call.
Work item 7 of 17 in #2744. Technical prerequisites: items 4-6. Keep not ready yet until promoted in the parent sequence.
Describe the solution you'd like
For exactly one selected prompt or linked multimodal example, add these actions:
- Import to new attack.
- Import to current conversation within the current attack.
- Import to new conversation within the current attack.
Use the shared draft handoff and existing attack/conversation creation APIs. A new attack starts a new draft context; it must not unexpectedly clone the previous conversation's history. Preserve associated text/media, stable source references, and the normal input validation path.
Show the destination clearly. Confirm before replacing a nonempty draft. Keep existing objective/system-prompt/converter settings unless the user explicitly changes them. Explain unavailable actions when there is no current attack, the destination is locked/stale, the target is unresolved, or modalities are unsupported. Preserve the selection while the user configures a required target.
Treat unsupported multi-turn/template/simulated shapes explicitly instead of flattening or executing them. Multiple independent examples belong to the later scenario workflow.
Consume the shipped #2748/#2989 contract: retain selection_key together with example_id and original member IDs so importing does not widen a dataset-scoped example to every seed with the same group ID. Fetch full detail rather than importing a truncated or safe-label preview. Detail members are stored SeedRecord projections; preserve values, IDs/hashes, nullable roles/order, typed objective conditions and provenance. They are not execution-ready seeds, and simulated configuration fields remain in raw JSON value.
Validate importability through the existing input/attachment path only when the user explicitly imports. Do not construct executable seed objects or open template files to inspect a selection. Do not infer that missing template flags or parameters make a record safe to execute. Missing media or unsupported/unfilled configuration must produce a clear explanation without silently dropping a member or importing a partial example.
Acceptance criteria:
- All three destinations receive the selected example in an editable draft and focus the composer.
- No import action sends to a target, appends fake conversation history, or runs converters automatically.
- Dataset-scoped membership, full stored text and related multimedia are retained; safe-label previews are never imported as content, and unsupported/missing-file members cannot silently disappear.
- Replacing/cancelling a dirty draft has deliberate behavior and no data loss.
- Existing mutation locks and single-turn/target capability restrictions are respected.
- Failed creation shows an error; it never silently imports into a different conversation.
- Tests cover the three destinations, no active attack/target, media, cancellation, and stale/failing requests.
Describe alternatives you've considered, if relevant
Do not add bulk chat sending, a new attack executor, or a separate import persistence service when existing creation and draft APIs suffice. Importing is different from branching an existing transcript.
Additional context
Start with ChatWindow's copy-to-input/new-conversation handlers, App's attack/conversation navigation callbacks, ChatInputArea's draft interface, and the existing attacks API. Reuse concepts, not existing timer-based or silent-fallback behavior. Follow the parent scope and frontend/backend test instructions.
Activity