Skip to content

Commit 9d1f891

Browse files
committed
fix(computer-use): hide device settings until the permission group is known
Also gives the local-files e2e settings fixture a QueryClient now that the Desktop page reads the permission config.
1 parent 4dbdcb9 commit 9d1f891

3 files changed

Lines changed: 15 additions & 5 deletions

File tree

‎apps/desktop/e2e/local-files.spec.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ test('native file tools remember folder consent across chats and restarts until
6060
stdin: {
6161
contents: `import { createRoot } from 'react-dom/client';
6262
import { ToastProvider } from '@sim/emcn';
63+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
6364
import { AppRouterContext } from 'next/dist/shared/lib/app-router-context.shared-runtime';
6465
import { PathParamsContext } from 'next/dist/shared/lib/hooks-client-context.shared-runtime';
6566
import { Desktop } from '@/app/workspace/[workspaceId]/settings/components/desktop/desktop';
@@ -70,11 +71,11 @@ const router = { bfcacheId: 'fixture', back: () => history.back(), forward: () =
7071
createRoot(document.getElementById('settings')).render(
7172
<AppRouterContext.Provider value={router}>
7273
<PathParamsContext.Provider value={{ workspaceId: 'fixture' }}>
73-
<ToastProvider><SettingsHeaderProvider><SettingsHeaderShell>
74+
<QueryClientProvider client={new QueryClient({ defaultOptions: { queries: { retry: false } } })}><ToastProvider><SettingsHeaderProvider><SettingsHeaderShell>
7475
<FeatureFlagsProvider flags={{ dashboards: false, 'workflow-tests': false, 'mothership-model-selector': false, 'mothership-plan-mode': false }}>
7576
<SettingsSectionProvider plane='workspace' section='desktop'><Desktop /></SettingsSectionProvider>
7677
</FeatureFlagsProvider>
77-
</SettingsHeaderShell></SettingsHeaderProvider></ToastProvider>
78+
</SettingsHeaderShell></SettingsHeaderProvider></ToastProvider></QueryClientProvider>
7879
</PathParamsContext.Provider>
7980
</AppRouterContext.Provider>
8081
);`,

‎apps/sim/app/workspace/[workspaceId]/settings/components/desktop/computer-use.test.tsx‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ const native = vi.hoisted(() => ({
2020
cancel: vi.fn<() => Promise<void>>(),
2121
onActivity: vi.fn<(listener: (activity: ComputerUseActivity | null) => void) => () => void>(),
2222
}))
23-
const permission = vi.hoisted(() => ({ config: {} as Record<string, unknown> }))
23+
const permission = vi.hoisted(() => ({ config: {} as Record<string, unknown>, ready: true }))
2424
vi.mock('@/hooks/use-permission-config', () => ({
25-
usePermissionConfig: () => ({ config: permission.config }),
25+
usePermissionConfig: () => ({ config: permission.config, isPermissionReady: permission.ready }),
2626
}))
2727
vi.mock('@/lib/desktop', () => libDesktopMock)
2828

@@ -38,6 +38,7 @@ let container: HTMLDivElement
3838

3939
beforeEach(() => {
4040
permission.config = { ...DEFAULT_PERMISSION_GROUP_CONFIG }
41+
permission.ready = true
4142
permissions = [...initialPermissions]
4243
activity = null
4344
listeners = new Set()
@@ -85,6 +86,13 @@ it.each(['disableComputerUse', 'hideCopilot'])(
8586
}
8687
)
8788

89+
it('withholds the device controls until the permission read succeeds', async () => {
90+
permission.ready = false
91+
await act(async () => renderSettings())
92+
expect(appRow('com.example.First')).toBeUndefined()
93+
expect(container.querySelector('[role="switch"]')).toBeNull()
94+
})
95+
8896
function appRow(bundleId: string) {
8997
return container.querySelector<HTMLElement>(`[title="${bundleId}"]`)?.parentElement
9098
}

‎apps/sim/app/workspace/[workspaceId]/settings/components/desktop/computer-use.tsx‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function ComputerUseSettings() {
2222
function ComputerUseSettingsControls() {
2323
const requestVersion = useRef(0)
2424
const bridge = getDesktopBridge()?.computerUse
25-
const { config: permissionConfig } = usePermissionConfig()
25+
const { config: permissionConfig, isPermissionReady } = usePermissionConfig()
2626
const { status, setStatus, refresh, error } = useComputerUseStatus()
2727
const [apps, setApps] = useState<ComputerUseAppPermission[]>([])
2828
const [pending, setPending] = useState(false)
@@ -44,6 +44,7 @@ function ComputerUseSettingsControls() {
4444
}, [refreshApps, status?.activeAction])
4545
if (
4646
!bridge ||
47+
!isPermissionReady ||
4748
CAPABILITY_RULES['computer_use.use'].deniedBy(permissionConfig) ||
4849
status?.supported === false
4950
)

0 commit comments

Comments
 (0)