diff --git a/tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessageAgenticContent.svelte b/tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessageAgenticContent.svelte
index 5137e261f8..ea9428e071 100644
--- a/tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessageAgenticContent.svelte
+++ b/tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessageAgenticContent.svelte
@@ -46,49 +46,44 @@
isLastAssistantMessage ? !!agenticStore.getLastError(message.convId) : false
);
- let permissionDismissed = $state(false);
-
const pendingPermission = $derived(
isStreaming && isLastAssistantMessage
? agenticStore.getPendingPermissionRequest(message.convId)
: null
);
- let prevPendingRef: typeof pendingPermission = null;
- $effect(() => {
- if (pendingPermission !== prevPendingRef) {
- prevPendingRef = pendingPermission;
+ // dismissal applies to the request object, so the next request ( new
+ // identity ) shows the card again without any reset bookkeeping
+ let dismissedPermission: typeof pendingPermission = $state(null);
- if (pendingPermission) {
- permissionDismissed = false;
- }
- }
- });
+ const visiblePermission = $derived(
+ pendingPermission && dismissedPermission !== pendingPermission ? pendingPermission : null
+ );
function handlePermission(decision: ToolPermissionDecision) {
- permissionDismissed = true;
+ dismissedPermission = pendingPermission;
agenticStore.resolvePermission(message.convId, decision);
}
- let continueDismissed = $state(false);
-
const pendingContinue = $derived(
isStreaming && isLastAssistantMessage
? agenticStore.getPendingContinueRequest(message.convId)
: false
);
- let prevContinueRef = false;
- $effect(() => {
- if (pendingContinue !== prevContinueRef) {
- prevContinueRef = pendingContinue;
+ let continueDismissed = $state(false);
- if (pendingContinue) {
- continueDismissed = false;
- }
+ // the continue request is a plain boolean, so there is no identity to
+ // compare against; clear the dismissal whenever no request is pending so
+ // the next one starts from a clean state
+ $effect(() => {
+ if (!pendingContinue) {
+ continueDismissed = false;
}
});
+ const showContinue = $derived(Boolean(pendingContinue) && !continueDismissed);
+
function handleContinue(shouldContinue: boolean) {
continueDismissed = true;
agenticStore.resolveContinue(message.convId, shouldContinue);
@@ -238,15 +233,15 @@
{/each}
{/if}
- {#if pendingPermission && !permissionDismissed}
+ {#if visiblePermission}
{/if}
- {#if pendingContinue && !continueDismissed}
+ {#if showContinue}
{/if}
diff --git a/tools/ui/src/lib/components/app/content/MarkdownContent/MarkdownContent.svelte b/tools/ui/src/lib/components/app/content/MarkdownContent/MarkdownContent.svelte
index 5eda49645c..c217a769a6 100644
--- a/tools/ui/src/lib/components/app/content/MarkdownContent/MarkdownContent.svelte
+++ b/tools/ui/src/lib/components/app/content/MarkdownContent/MarkdownContent.svelte
@@ -7,7 +7,6 @@
getMdastNodeHash,
isAppendMode
} from './markdown-utils';
- import { browser } from '$app/environment';
import {
ActionIconCopyToClipboard,
CodeBlockActions,
@@ -153,8 +152,6 @@
* @param isDark - Whether to load the dark theme (true) or light theme (false)
*/
function loadHighlightTheme(isDark: boolean) {
- if (!browser) return;
-
document
.querySelectorAll(`style[${UI_DATA_ATTRS.HIGHLIGHT_THEME_PREVIEW}]`)
.forEach((style) => style.remove());