Enable automatic web search by default; improve toggle behavior and search planning.
CI / check (22) (push) Successful in 9m35s
CI / check (24) (push) Successful in 9m34s

This commit is contained in:
2026-10-06 08:50:03 +02:00
parent 674abf78f6
commit 7be654af11
17 changed files with 300 additions and 54 deletions
+2 -2
View File
@@ -292,8 +292,8 @@
<path d="m3 17 5-5 4 4 4-6 5 7" />
</svg>
</button>
<button id="webSearch" class="icon-button" type="button" aria-label="Search the web"
title="Search the web" aria-pressed="false">
<button id="webSearch" class="icon-button" type="button" aria-label="Automatic web search on — click to disable"
title="Automatic web search on — click to disable" aria-pressed="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.6" aria-hidden="true">
<circle cx="12" cy="12" r="9" />
+3 -1
View File
@@ -64,12 +64,14 @@ function toggleChatDrawer() {
function handleDisclosureToggle(event) {
const disclosure = event.target;
if (!(disclosure instanceof HTMLDetailsElement) || !chatDrawer?.contains(disclosure)) return;
// Nested disclosures must not close their parent or lose their expanded state.
if (!disclosure.matches(".chat-drawer-body > details")) return;
if (disclosure.matches(".chat-drawer-more, .chat-drawer-danger")) {
const hint = disclosure.querySelector(":scope > summary .chat-drawer-row-hint");
if (hint) hint.textContent = disclosure.open ? "Hide" : "Show";
}
if (disclosure.open) {
chatDrawer.querySelectorAll("details[open]").forEach((other) => {
chatDrawer.querySelectorAll(".chat-drawer-body > details[open]").forEach((other) => {
if (other !== disclosure) other.open = false;
});
}
+1 -1
View File
@@ -153,7 +153,7 @@ export function createComposerController({
if (loadingMsg?.isConnected) loadingMsg.replaceWith(addMessage(reply, false, false, {detached: true}));
else addMessage(reply);
} else loadingMsg?.remove();
webSearchToggle.reset(); reasoningToggle.reset();
reasoningToggle.reset();
if (visible()) {
const followOutput = messagesDiv.scrollHeight - messagesDiv.scrollTop - messagesDiv.clientHeight < 100;
const previousScrollTop = messagesDiv.scrollTop;
+1 -1
View File
@@ -103,6 +103,7 @@ export function createMessageActions({conversation, setNotice, promptPopup, conf
chatId: sourceChatId,
message: content,
model: modelSelect.value,
webSearch: webSearchToggle.enabled,
confirmed: true
}, {timeoutMs: 660000});
if (res.error) return setNotice(res.error, "error");
@@ -185,7 +186,6 @@ export function createMessageActions({conversation, setNotice, promptPopup, conf
card.replaceChildren(...rendered.childNodes);
}
});
webSearchToggle.reset();
reasoningToggle.reset();
setNotice("Reply regenerated.", "success");
} catch (error) {
+3 -7
View File
@@ -6,14 +6,10 @@
/** @typedef {{role: string, content: string, thinking?: string, sources?: WebSource[]}} ChatMessage */
export function createWebSearchToggle(button) {
let enabled = false;
const reset = () => {
enabled = false;
render();
};
let enabled = true;
const render = () => {
button.setAttribute("aria-pressed", String(enabled));
button.title = enabled ? "Web search enabled" : "Search the web";
button.title = enabled ? "Automatic web search on — click to disable" : "Web search off — click to enable";
button.setAttribute("aria-label", button.title);
};
button.addEventListener("click", () => {
@@ -21,7 +17,7 @@ export function createWebSearchToggle(button) {
render();
});
render();
return {get enabled() { return enabled; }, reset};
return {get enabled() { return enabled; }};
}
/** @param {HTMLElement} container @param {WebSource[] | undefined} sources */