From 46720a39dd3632d1a6cd6a8a966bcaf15ccaa156 Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Thu, 9 Jul 2026 13:24:45 -0700 Subject: [PATCH] Release: Copy conversation link copies an openable URL (#5478) (#5851) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Was copying the internal session:// reference (not browser-openable); now copies an absolute origin + /session/ URL (verified single-origin, no doubling — _sessionUrlForSid returns a relative path, the caller prepends origin once), tracking params stripped. Product/UX parity with major chat apps (Anchor C). Nathan-approved. 17 copy-link regression tests green. Co-authored-by: t Co-authored-by: djsavvy --- CHANGELOG.md | 2 ++ static/sessions.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d531217..cf5cba77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ ### Fixed +- **"Copy conversation link" now copies an openable URL instead of a `session://` reference.** The copy action produced the internal `session://` reference (not openable in a browser); it now copies an absolute `origin + /session/` URL — the same shape used elsewhere in the app, with tracking query params stripped. Thanks @djsavvy. (#5478) + - **The model picker now marks the active model with a "Selected" badge.** The currently-selected conversation model shows a distinct **Selected** pill (separate from the "Configured" state), and the picker opens with that model's provider group expanded and scrolled into view — so it's obvious at a glance which model is in use. Thanks @rodboev. (#5757, #5748) - **Transparent Stream no longer briefly renders a duplicate of the answer.** A live-token prose snapshot that was a strict prefix of the final answer escaped the existing dedupe guards (which only fired on near-complete matches) and rendered as a visible duplicate. A new provenance-gated guard suppresses only the ephemeral live-token accumulator row (role `prose` / kind `process_prose` / `token` source / `live-prose:*` id) when it's a strict shorter prefix of the settled answer and sits after the last tool row — so genuine intermediate narration is never suppressed. Thanks @rodboev. (#5758, #5749) diff --git a/static/sessions.js b/static/sessions.js index c0fafcb4..a4b0ba20 100644 --- a/static/sessions.js +++ b/static/sessions.js @@ -3976,7 +3976,7 @@ async function _copyTextToClipboard(text){ async function _copySessionLink(session){ const sid=session&&session.session_id; if(!sid) return; - const ref=_sessionInternalReferenceForSession(session); + const ref=(window.location.origin||'')+_sessionUrlForSid(sid); try{ await _copyTextToClipboard(ref); showToast(t('session_link_copied'));