settings: Atelier providers under Integrations, per plugin decision

decision 2 of the atelier extraction: providers (which adapter, which model, whose key) becomes an
Officer settings screen rather than a panel, since it is owner-level configuration in the same shape
as the Apify token beside it. Talks to /api/atelier/providers over HTTP through useClient() — no
import from plugins/atelier/ in either direction.

recorded in BLOCKERS.md: this goes against IntegrationsSettings' own comment from the email
extraction five days earlier ("a plugin contributes panels, not settings sections"). Followed the
pre-made decision anyway per the kickoff prompt's own instructions, and wrote down the
contradiction rather than picking one silently.
This commit is contained in:
2026-08-20 04:02:29 +00:00
parent c8686ff191
commit 6d0b2743a5
2 changed files with 247 additions and 1 deletions
@@ -1,6 +1,6 @@
import { useMemo } from 'react';
import { useNavigate, useParams } from 'react-router';
import { Puzzle, KeyRound, Globe, Wrench, CalendarDays } from 'lucide-react';
import { Puzzle, KeyRound, Globe, Wrench, CalendarDays, Palette } from 'lucide-react';
import type { LayoutNode, PanelComponents } from 'officerdev';
import { WorkspaceLayout } from 'officerdev';
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
@@ -10,6 +10,7 @@ import { GoogleOAuthConfig } from './GoogleOAuthConfig';
// import { GoogleAccount } from './GoogleAccount'; // hidden — email uses IMAP app password now
import { BrowserRelay } from './BrowserRelay';
import { ApifyConfig } from './ApifyConfig';
import { AtelierProviders } from './AtelierProviders';
import { DavAppPasswords } from './DavAppPasswords';
import { ApiKeys } from './ApiKeys';
@@ -30,6 +31,13 @@ const enterpriseSections: SettingsSection[] = [
description: 'API token for web scraping actors',
content: <ApifyConfig />,
},
{
key: 'atelier',
icon: Palette,
title: 'Atelier',
description: 'Image generation providers — adapter, model and API key',
content: <AtelierProviders />,
},
];
const personalSections: SettingsSection[] = [