Skip to content

Commit e2afd84

Browse files
committed
fix(share): make tool calls and results toggle-able
1 parent 99a34fa commit e2afd84

2 files changed

Lines changed: 108 additions & 2 deletions

File tree

src-rust/crates/core/src/share_export/template.css

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,66 @@ nav {
124124
width: 4px; height: 4px; background: var(--accent); border-radius: 50%; display: inline-block;
125125
}
126126

127+
/* Header-level toggles (e.g. show/hide tool calls) */
128+
.hero-controls {
129+
margin-top: 1rem;
130+
display: flex;
131+
flex-wrap: wrap;
132+
gap: 0.5rem 1rem;
133+
}
134+
.toggle {
135+
display: inline-flex;
136+
align-items: center;
137+
gap: 0.55rem;
138+
font-size: 0.78rem;
139+
color: var(--text-secondary);
140+
cursor: pointer;
141+
user-select: none;
142+
padding: 0.3rem 0.6rem;
143+
border: 1px solid var(--surface-border);
144+
border-radius: 999px;
145+
background: rgba(255, 255, 255, 0.02);
146+
transition: border-color 0.15s, color 0.15s, background 0.15s;
147+
}
148+
.toggle:hover { border-color: rgba(233, 30, 99, 0.4); color: var(--text-primary); }
149+
.toggle input { position: absolute; opacity: 0; pointer-events: none; }
150+
.toggle-swatch {
151+
width: 26px;
152+
height: 14px;
153+
border-radius: 999px;
154+
background: rgba(255, 255, 255, 0.08);
155+
position: relative;
156+
transition: background 0.15s;
157+
flex-shrink: 0;
158+
}
159+
.toggle-swatch::after {
160+
content: '';
161+
position: absolute;
162+
top: 2px;
163+
left: 2px;
164+
width: 10px;
165+
height: 10px;
166+
border-radius: 50%;
167+
background: var(--text-secondary);
168+
transition: left 0.15s, background 0.15s;
169+
}
170+
.toggle input:checked + .toggle-swatch { background: var(--accent-shy); }
171+
.toggle input:checked + .toggle-swatch::after {
172+
left: 14px;
173+
background: var(--accent);
174+
}
175+
.toggle input:focus-visible + .toggle-swatch {
176+
outline: 2px solid var(--accent);
177+
outline-offset: 2px;
178+
}
179+
180+
/* Hide tool calls/results/thinking entirely when the user toggles them off. */
181+
#messages.hide-tools details.tool-call,
182+
#messages.hide-tools details.tool-result,
183+
#messages.hide-tools details.thinking {
184+
display: none;
185+
}
186+
127187
/* Messages container */
128188
#messages { padding: 0; }
129189

src-rust/crates/core/src/share_export/template.js

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@
3838
var title = meta.title || ('Session ' + (meta.session_id || ''));
3939
document.title = title + ' — Claurst Session';
4040

41+
var msgsEl = document.getElementById('messages');
42+
43+
// Tool-call visibility preference, persisted across reloads. Default: shown.
44+
var TOOLS_PREF_KEY = 'claurst.share.showTools';
45+
var showTools = true;
46+
try {
47+
var stored = localStorage.getItem(TOOLS_PREF_KEY);
48+
if (stored === '0') showTools = false;
49+
} catch (_) { /* localStorage may be unavailable in sandboxed contexts */ }
50+
applyShowTools(showTools);
51+
4152
var hero = document.getElementById('hero');
4253
if (hero) {
4354
var heroBody = document.createElement('div');
@@ -67,12 +78,46 @@
6778
metaDiv.appendChild(s);
6879
});
6980
heroBody.appendChild(metaDiv);
81+
82+
// Tool-call visibility toggle. Tool calls, tool results and thinking
83+
// blocks are shown by default; this lets the reader hide them for a
84+
// cleaner prompts/responses-only view.
85+
var controls = document.createElement('div');
86+
controls.className = 'hero-controls';
87+
var toolToggle = document.createElement('label');
88+
toolToggle.className = 'toggle';
89+
var cb = document.createElement('input');
90+
cb.type = 'checkbox';
91+
cb.checked = showTools;
92+
cb.addEventListener('change', function () {
93+
showTools = cb.checked;
94+
applyShowTools(showTools);
95+
try { localStorage.setItem(TOOLS_PREF_KEY, showTools ? '1' : '0'); } catch (_) {}
96+
});
97+
toolToggle.appendChild(cb);
98+
var swatch = document.createElement('span');
99+
swatch.className = 'toggle-swatch';
100+
toolToggle.appendChild(swatch);
101+
var lbl = document.createElement('span');
102+
lbl.className = 'toggle-label';
103+
lbl.textContent = 'Show tool calls & thinking';
104+
toolToggle.appendChild(lbl);
105+
controls.appendChild(toolToggle);
106+
heroBody.appendChild(controls);
107+
70108
hero.appendChild(heroBody);
71109
}
72110

73-
var msgsEl = document.getElementById('messages');
74111
messages.forEach(function (m) { msgsEl.appendChild(renderMessage(m)); });
75112

113+
function applyShowTools(on) {
114+
if (on) {
115+
msgsEl.classList.remove('hide-tools');
116+
} else {
117+
msgsEl.classList.add('hide-tools');
118+
}
119+
}
120+
76121
function renderMessage(m) {
77122
var div = document.createElement('div');
78123
div.className = 'msg ' + (m.role || '');
@@ -193,6 +238,7 @@
193238
function renderToolCall(block) {
194239
var d = document.createElement('details');
195240
d.className = 'tool-call';
241+
d.open = true;
196242
var s = document.createElement('summary');
197243

198244
var badge = document.createElement('span');
@@ -219,7 +265,7 @@
219265
var isError = !!block.is_error;
220266
var d = document.createElement('details');
221267
d.className = 'tool-result' + (isError ? ' error' : '');
222-
d.open = isError;
268+
d.open = true;
223269
var s = document.createElement('summary');
224270

225271
var badge = document.createElement('span');

0 commit comments

Comments
 (0)