diff --git a/movie_editor/frontend/composer.js b/movie_editor/frontend/composer.js index 4008bd9d..9886678c 100644 --- a/movie_editor/frontend/composer.js +++ b/movie_editor/frontend/composer.js @@ -1195,6 +1195,17 @@ thread.append(b); }); } + // The last word is yours: say when the reply comes, or two comments with no answer + // read as a broken chat (the model only answers inside a generation). + else if (rounds.length) { + const running = ["queuing", "running", "pending"].includes(st.gen?.state); + const w = el("div", "enh-bubble enh-bubble-model enh-bubble-latest enh-bubble-wait"); + w.append(el("div", "enh-bubble-who", "Enhancer"), + el("div", "enh-bubble-text", running + ? "Writing its reply now, inside this generation." + : "Replies when you press Generate — to everything since its last rewrite.")); + thread.append(w); + } if (thread.childNodes.length) { box.append(thread); requestAnimationFrame(() => { thread.scrollTop = thread.scrollHeight; }); // newest in view diff --git a/movie_editor/frontend/styles.css b/movie_editor/frontend/styles.css index 7c7a9101..1d6a02b5 100644 --- a/movie_editor/frontend/styles.css +++ b/movie_editor/frontend/styles.css @@ -2142,6 +2142,7 @@ body.tour-mode { overflow: hidden; } .enh-bubble-model { align-self: flex-start; background: var(--ink-2); } .enh-bubble-user { align-self: flex-end; border-color: var(--teal); } .enh-bubble-latest { border-style: dashed; } +.enh-bubble-wait .enh-bubble-text { color: var(--muted); font-style: italic; } .enh-chat .btn:disabled { opacity: 0.42; pointer-events: none; cursor: default; } .enh-bubble-who { font-size: 10px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase; color: var(--muted); margin-bottom: 3px; } .enh-bubble-text { font-size: 12px; line-height: 1.5; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; user-select: text; }