diff --git a/pyproject.toml b/pyproject.toml
index 6146f37..028a3bb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "ratatoskr"
-version = "0.20.15"
+version = "0.20.16"
description = "Worldtree Conversation API debug TUI — multi-pane observability dashboard"
readme = "README.md"
requires-python = ">=3.12"
diff --git a/src/ratatoskr/web/static/index.html b/src/ratatoskr/web/static/index.html
index 0a32c25..b949369 100644
--- a/src/ratatoskr/web/static/index.html
+++ b/src/ratatoskr/web/static/index.html
@@ -309,7 +309,18 @@ body[data-theme="light"] #theme-toggle .i-moon { display: inline; }
.md-body .md-speech { color: var(--md-speech); }
.md-body em.md-action { color: var(--md-action); }
.md-body code { font-family: var(--font-mono); font-size: .86em; background: var(--rk-well); color: var(--aus-bright-cyan); border: 1px solid var(--border-subtle); padding: 1px 6px; border-radius: 4px; }
-.md-body pre.md-code { font-family: var(--font-mono); font-size: 12px; background: var(--rk-well); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 10px 13px; overflow-x: auto; color: var(--fg-1); margin: 8px 0; }
+.md-body pre.md-code { font-family: var(--font-mono); font-size: 12px; background: var(--rk-well); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 10px 13px; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--fg-1); margin: 8px 0; }
+/* per-code-block copy affordance (hover-revealed, top-right) */
+.md-body .md-code-wrap { position: relative; }
+.md-body .md-code-wrap .code-copy { position: absolute; top: 6px; right: 6px; font-family: var(--font-mono); font-size: 9px; background: var(--rk-well); border: 1px solid var(--border-default); border-radius: var(--radius-sm); color: var(--fg-3); padding: 1px 7px; cursor: pointer; opacity: 0; transition: opacity .12s; z-index: 2; }
+.md-body .md-code-wrap:hover .code-copy { opacity: .75; }
+.md-body .md-code-wrap .code-copy:hover { opacity: 1; background: var(--bg-2); color: var(--fg-0); }
+/* per-turn copy affordance */
+.turn { position: relative; }
+.turn .turn-copy { font-family: var(--font-mono); font-size: 9px; background: none; border: 1px solid var(--border-default); border-radius: var(--radius-sm); color: var(--fg-3); padding: 1px 7px; cursor: pointer; opacity: 0; transition: opacity .12s; }
+.turn:hover .turn-copy { opacity: .7; }
+.turn .turn-copy:hover { opacity: 1; background: var(--bg-2); color: var(--fg-0); }
+.turn > .turn-copy { position: absolute; top: 4px; right: 0; z-index: 2; }
.md-body ul, .md-body ol { margin: 4px 0 10px; padding-left: 22px; }
.md-body li ul, .md-body li ol { margin: 2px 0 2px; } /* nested lists: tighter */
.md-body li { margin: 2px 0; }
@@ -875,7 +886,7 @@ function markdownSafe(raw) {
flushPara(); closeAllLists();
let html = out.join("");
html = html.replace(/ IC(\d+) /g, (m, i) => `${ic[+i]}`);
- html = html.replace(/ CB(\d+) /g, (m, i) => `
${cb[+i]}`);
+ html = html.replace(/ CB(\d+) /g, (m, i) => ``);
return html;
}
@@ -1630,6 +1641,9 @@ async function loadTranscript(sessionId) {
b.className = "response md-body";
b.innerHTML = markdownSafe(m.content || "");
turn.appendChild(b);
+ const cp = document.createElement("button");
+ cp.className = "turn-copy"; cp.type = "button"; cp.title = "Copy response"; cp.textContent = "copy";
+ turn.appendChild(cp);
TW().appendChild(turn);
} else if (m.role === "user") {
const e = document.createElement("div");
@@ -1678,6 +1692,7 @@ async function submitPrompt() {
const no = String(state.turnNo).padStart(2, "0");
turn.innerHTML =
`${esc(no)}`
+ + ``
+ `● LIVE
`
+ ``;
turn.querySelector(".prompt-echo").textContent = content;
@@ -1951,6 +1966,35 @@ $("start-btn").addEventListener("click", startSession);
$("send-btn").addEventListener("click", submitPrompt);
$("cancel-btn").addEventListener("click", cancelTurn);
+// clipboard copy with a fallback for non-secure LAN contexts (navigator.clipboard is
+// undefined over plain http off-localhost); flash the button to confirm.
+function copyText(t) {
+ if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(t).catch(() => {}); return; }
+ const ta = document.createElement("textarea");
+ ta.value = t; ta.style.position = "fixed"; ta.style.opacity = "0";
+ document.body.appendChild(ta); ta.select();
+ try { document.execCommand("copy"); } catch (_) { /* best-effort */ }
+ document.body.removeChild(ta);
+}
+function flashCopied(btn) {
+ const prev = btn.textContent; btn.textContent = "✓ copied";
+ setTimeout(() => { btn.textContent = prev; }, 1100);
+}
+// delegated: per-code-block + per-turn copy (works across live / historical / think renders)
+TW().addEventListener("click", (ev) => {
+ const codeBtn = ev.target.closest(".code-copy");
+ if (codeBtn) {
+ const pre = codeBtn.parentElement.querySelector("pre.md-code");
+ if (pre) { copyText(pre.textContent || ""); flashCopied(codeBtn); }
+ return;
+ }
+ const turnBtn = ev.target.closest(".turn-copy");
+ if (turnBtn) {
+ const resp = turnBtn.closest(".turn") && turnBtn.closest(".turn").querySelector(".response");
+ if (resp) { copyText(resp.textContent || ""); flashCopied(turnBtn); }
+ }
+});
+
// brand mark + favicon — the transparent aurora squirrel (one data URI, wired to
// the tab icon + both brand marks; replaces the ᛯ rune).
const SQUIRREL = "data:image/png;base64,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";
diff --git a/uv.lock b/uv.lock
index afc8973..6a3d47e 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1052,7 +1052,7 @@ wheels = [
[[package]]
name = "ratatoskr"
-version = "0.20.15"
+version = "0.20.16"
source = { editable = "." }
dependencies = [
{ name = "httpx" },