Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { GlobalSettings } from '../../../../shared/global-settings-types'
import { AGENT_SESSION_QUEUED_MESSAGES_RUNTIME_CAPABILITY } from '../../../../shared/protocol-version'
import { setLocalRuntimeCapabilitiesForTests } from '@/runtime/local-runtime-capabilities'
import { ChatBehaviorSetting } from './ChatBehaviorSetting'
import { TooltipProvider } from '../ui/tooltip'

afterEach(() => {
cleanup()
Expand All @@ -18,11 +19,13 @@ const SHELL_ENV_TOGGLE = '[aria-label="Toggle using your shell environment"]'
const NAME_INPUT = '#settings-native-chat-shell-environment-name'

function renderSetting(overrides: Partial<GlobalSettings>, updateSettings = vi.fn()) {
// The wrapper also covers rerender: the permission picker's tooltip needs the app's provider.
return render(
<ChatBehaviorSetting
settings={{ ...getDefaultSettings('/tmp'), ...overrides }}
updateSettings={updateSettings}
/>
/>,
{ wrapper: TooltipProvider }
)
}

Expand Down Expand Up @@ -221,3 +224,17 @@ describe('ChatBehaviorSetting resume after restart', () => {
expect(updateSettings).toHaveBeenCalledWith({ nativeChatResumeWorkOnRestart: true })
})
})

describe('ChatBehaviorSetting permissions', () => {
it('shows the new-chat permission picker as the first Behavior row', () => {
const { container } = renderSetting({ nativeChatPermissionMode: 'full-access' })
const rows = container.querySelectorAll('.divide-y > *')
expect(rows[0]?.id).toBe('chat-permissions')
expect(container.querySelector('button[aria-label="Permissions Full access"]')).not.toBeNull()
})

it('leaves the row out when the host has no value', () => {
const { container } = renderSetting({ nativeChatPermissionMode: undefined })
expect(container.querySelector('#chat-permissions')).toBeNull()
})
})
8 changes: 8 additions & 0 deletions src/renderer/src/components/settings/ChatBehaviorSetting.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import type { RuntimeClientTarget } from '../../../../shared/runtime-client-targ
import { useStructuredAgentSessionHostQueuesMessages } from '@/runtime/structured-agent-session-host-capability'
import { useAppStore } from '../../store'
import { Card, CardContent } from '../ui/card'
import { ChatPermissionSetting } from './ChatPermissionSetting'
import { NativeChatShellEnvironmentSetting } from './NativeChatShellEnvironmentSetting'
import { SearchableSetting } from './SearchableSetting'
import { SettingsSubsectionHeader, SettingsSwitchRow } from './SettingsFormControls'
import { getChatBehaviorEntriesByKey, getChatBehaviorTitle } from './chat-behavior-search'
import { getChatPermissionSearchEntry } from './chat-permission-search'
import { matchesSettingsSearch } from './settings-search'

// This screen edits this machine's settings, so it asks this machine's runtime; a paired host that
Expand All @@ -30,6 +32,7 @@ export function ChatBehaviorSetting({
const hostQueuesMessages = useStructuredAgentSessionHostQueuesMessages(STRUCTURED_CHAT_HOST)
const entries = getChatBehaviorEntriesByKey()
const rows = [
...(settings.nativeChatPermissionMode !== undefined ? [getChatPermissionSearchEntry()] : []),
entries.resumeOnRestart,
...(hostQueuesMessages ? [entries.queueFollowUps] : []),
entries.shellEnvironment
Expand All @@ -45,6 +48,11 @@ export function ChatBehaviorSetting({
<Card>
<CardContent>
<div className="divide-y divide-border/40">
<ChatPermissionSetting
settings={settings}
updateSettings={updateSettings}
forceVisible={forceVisible}
/>
<SearchableSetting
{...entries.resumeOnRestart}
id={entries.resumeOnRestart.targetSectionId}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { GlobalSettings } from '../../../../shared/global-settings-types'
import { AGENT_CHAT_PERMISSION_MODES } from '../../../../shared/agent-chat-permission-mode'
import { NativeChatPermissionModePicker } from '../native-chat/NativeChatPermissionModePicker'
import { SettingsSubsectionHeader } from './SettingsFormControls'
import { SettingsRow } from './SettingsFormControls'
import { SearchableSetting } from './SearchableSetting'
import { getChatPermissionSearchEntry } from './chat-permission-search'

Expand All @@ -27,10 +27,10 @@ export function ChatPermissionSetting({
forceVisible={forceVisible}
className="max-w-none"
>
<SettingsSubsectionHeader
title={entry.title}
<SettingsRow
label={entry.title}
description={entry.description}
action={
control={
<NativeChatPermissionModePicker
current={current}
modes={AGENT_CHAT_PERMISSION_MODES}
Expand Down
6 changes: 0 additions & 6 deletions src/renderer/src/components/settings/ChatSettingsSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { translate } from '@/i18n/i18n'
import { AppearanceChatSection } from './AppearanceChatSection'
import { ChatBehaviorSetting } from './ChatBehaviorSetting'
import { ChatNamingSetting } from './ChatNamingSetting'
import { ChatPermissionSetting } from './ChatPermissionSetting'
import { NativeChatInlineVisualsSetting } from './NativeChatInlineVisualsSetting'
import { SettingsSection } from './SettingsSection'
import { SettingsSubsectionHeader } from './SettingsFormControls'
Expand Down Expand Up @@ -57,11 +56,6 @@ export function ChatSettingsSection({
>
{isMounted ? (
<div className="space-y-5">
<ChatPermissionSetting
settings={settings}
updateSettings={updateSettings}
forceVisible={matchesSettingsSearch(query, [{ title }])}
/>
{matchesSettingsSearch(query, [{ title }, ...getChatAppearanceSearchEntries()]) ? (
<section id="chat-appearance" className="space-y-3">
<SettingsSubsectionHeader title={appearanceTitle} />
Expand Down
Loading