diff --git a/docs/app/brand.css b/docs/app/brand.css new file mode 100644 index 00000000..6394995b --- /dev/null +++ b/docs/app/brand.css @@ -0,0 +1,22 @@ +/* + * Navbar brand mark. The docs app has no Tailwind build of its own (Nextra + * ships its utilities under an `x:` prefix and generates no `dark:` variants), + * so the light/dark swap of the monochrome logo is done here. Nextra's + * next-themes setup toggles `.dark` on . + */ +.brand-logo { + height: 28px; + width: auto; +} + +.brand-logo-dark { + display: none; +} + +html.dark .brand-logo-light { + display: none; +} + +html.dark .brand-logo-dark { + display: block; +} diff --git a/docs/app/layout.jsx b/docs/app/layout.jsx index 040d1781..1f83ef09 100644 --- a/docs/app/layout.jsx +++ b/docs/app/layout.jsx @@ -1,4 +1,3 @@ -import Image from 'next/image'; import { Analytics } from '@vercel/analytics/react'; import { Banner, Head } from 'nextra/components'; import { getPageMap } from 'nextra/page-map'; @@ -6,9 +5,10 @@ import { Footer, Layout, Navbar } from 'nextra-theme-docs'; import 'nextra-theme-docs/style.css'; import { DocsGPTChatWidget } from '../components/DocsGPTChatWidget'; -import CuteLogo from '../public/cute-docsgpt.png'; import themeConfig from '../theme.config'; +import './brand.css'; + const github = 'https://github.com/arc53/DocsGPT'; export const metadata = { @@ -24,7 +24,12 @@ const navbar = ( - DocsGPT logo + DocsGPT logo + DocsGPT Docs } @@ -54,14 +59,21 @@ export default async function RootLayout({ children }) { return ( + + + - - - + + diff --git a/docs/public/apple-touch-icon.png b/docs/public/apple-touch-icon.png new file mode 100644 index 00000000..a27aacb8 Binary files /dev/null and b/docs/public/apple-touch-icon.png differ diff --git a/docs/public/favicon-96x96.png b/docs/public/favicon-96x96.png new file mode 100644 index 00000000..5a3a5669 Binary files /dev/null and b/docs/public/favicon-96x96.png differ diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 00000000..66717231 Binary files /dev/null and b/docs/public/favicon.ico differ diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 00000000..43ffa4ca --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1 @@ +DocsGPT diff --git a/docs/public/favicons/apple-touch-icon.png b/docs/public/favicons/apple-touch-icon.png deleted file mode 100644 index 1ab5b76c..00000000 Binary files a/docs/public/favicons/apple-touch-icon.png and /dev/null differ diff --git a/docs/public/favicons/favicon-16x16.png b/docs/public/favicons/favicon-16x16.png deleted file mode 100644 index 8084681d..00000000 Binary files a/docs/public/favicons/favicon-16x16.png and /dev/null differ diff --git a/docs/public/favicons/favicon-32x32.png b/docs/public/favicons/favicon-32x32.png deleted file mode 100644 index 58cc2919..00000000 Binary files a/docs/public/favicons/favicon-32x32.png and /dev/null differ diff --git a/docs/public/favicons/site.webmanifest b/docs/public/favicons/site.webmanifest deleted file mode 100644 index b20abb7c..00000000 --- a/docs/public/favicons/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/docs/public/logo-b.svg b/docs/public/logo-b.svg new file mode 100644 index 00000000..0b2cec5b --- /dev/null +++ b/docs/public/logo-b.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/public/logo-w.svg b/docs/public/logo-w.svg new file mode 100644 index 00000000..bfbe31f1 --- /dev/null +++ b/docs/public/logo-w.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/public/site.webmanifest b/docs/public/site.webmanifest new file mode 100644 index 00000000..8c3e9b79 --- /dev/null +++ b/docs/public/site.webmanifest @@ -0,0 +1,15 @@ +{ + "name": "DocsGPT Documentation", + "short_name": "DocsGPT Docs", + "description": "Documentation for DocsGPT, the open-source private AI assistant and self-hosted RAG platform.", + "start_url": "/", + "scope": "/", + "display": "standalone", + "theme_color": "#ffffff", + "background_color": "#ffffff", + "icons": [ + { "src": "/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, + { "src": "/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }, + { "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" } + ] +} diff --git a/docs/public/web-app-manifest-192x192.png b/docs/public/web-app-manifest-192x192.png new file mode 100644 index 00000000..c72fe962 Binary files /dev/null and b/docs/public/web-app-manifest-192x192.png differ diff --git a/docs/public/web-app-manifest-512x512.png b/docs/public/web-app-manifest-512x512.png new file mode 100644 index 00000000..aff5b210 Binary files /dev/null and b/docs/public/web-app-manifest-512x512.png differ diff --git a/docsgpt/core/models/alibaba.yaml b/docsgpt/core/models/alibaba.yaml new file mode 100644 index 00000000..02285f00 --- /dev/null +++ b/docsgpt/core/models/alibaba.yaml @@ -0,0 +1,15 @@ +provider: openai_compatible +display_provider: alibaba +api_key_env: DASHSCOPE_API_KEY +base_url: https://dashscope-intl.aliyuncs.com/compatible-mode/v1 + +defaults: + supports_tools: true + attachments: [image] + context_window: 262144 + +models: + - id: qwen3.8-max + display_name: Qwen 3.8-Max + description: Alibaba's largest Qwen 3.8 model for complex reasoning, coding and multilingual work + supports_structured_output: true diff --git a/docsgpt/core/models/anthropic.yaml b/docsgpt/core/models/anthropic.yaml index 4e253396..14fb881f 100644 --- a/docsgpt/core/models/anthropic.yaml +++ b/docsgpt/core/models/anthropic.yaml @@ -21,3 +21,9 @@ models: display_name: Claude Haiku 4.5 description: Fastest Claude model with near-frontier intelligence supports_structured_output: true + + - id: claude-fable-5 + display_name: Claude Fable 5 + description: Anthropic's frontier tier above Opus for the most demanding reasoning and long-horizon agentic work + context_window: 1000000 + supports_structured_output: true diff --git a/docsgpt/core/models/openai.yaml b/docsgpt/core/models/openai.yaml index e0f209c5..4adc8c98 100644 --- a/docsgpt/core/models/openai.yaml +++ b/docsgpt/core/models/openai.yaml @@ -18,3 +18,9 @@ models: - id: gpt-5.4-nano display_name: GPT-5.4 Nano description: Cheapest GPT-5.4-class model, optimized for simple high-volume tasks where speed and cost matter most + - id: gpt-5.6-sol + display_name: GPT-5.6 Sol + description: Latest GPT-5.6 generation flagship for long-horizon reasoning and agentic work + context_window: 1050000 + api_flavor: responses + reasoning_effort: medium diff --git a/docsgpt/core/models/zai.yaml b/docsgpt/core/models/zai.yaml new file mode 100644 index 00000000..0baa5287 --- /dev/null +++ b/docsgpt/core/models/zai.yaml @@ -0,0 +1,15 @@ +provider: openai_compatible +display_provider: zai +api_key_env: ZAI_API_KEY +base_url: https://api.z.ai/api/paas/v4 + +defaults: + supports_tools: true + attachments: [] + context_window: 200000 + +models: + - id: glm-5.3 + display_name: GLM 5.3 + description: Z.ai's GLM 5.3 flagship for agentic coding and reasoning + supports_structured_output: true diff --git a/frontend/index.html b/frontend/index.html index 28ce3fa1..f694dfdb 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -24,7 +24,12 @@ })(); DocsGPT - + + + + + + diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png new file mode 100644 index 00000000..a27aacb8 Binary files /dev/null and b/frontend/public/apple-touch-icon.png differ diff --git a/frontend/public/favicon-96x96.png b/frontend/public/favicon-96x96.png new file mode 100644 index 00000000..5a3a5669 Binary files /dev/null and b/frontend/public/favicon-96x96.png differ diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index ab909109..66717231 100644 Binary files a/frontend/public/favicon.ico and b/frontend/public/favicon.ico differ diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 00000000..43ffa4ca --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1 @@ +DocsGPT diff --git a/frontend/public/site.webmanifest b/frontend/public/site.webmanifest new file mode 100644 index 00000000..8a984748 --- /dev/null +++ b/frontend/public/site.webmanifest @@ -0,0 +1,15 @@ +{ + "name": "DocsGPT", + "short_name": "DocsGPT", + "description": "Open-source private AI assistant and self-hosted RAG platform over your own documents, with cited answers.", + "start_url": "/", + "scope": "/", + "display": "standalone", + "theme_color": "#fbfbfb", + "background_color": "#fbfbfb", + "icons": [ + { "src": "/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, + { "src": "/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }, + { "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" } + ] +} diff --git a/frontend/public/web-app-manifest-192x192.png b/frontend/public/web-app-manifest-192x192.png new file mode 100644 index 00000000..c72fe962 Binary files /dev/null and b/frontend/public/web-app-manifest-192x192.png differ diff --git a/frontend/public/web-app-manifest-512x512.png b/frontend/public/web-app-manifest-512x512.png new file mode 100644 index 00000000..aff5b210 Binary files /dev/null and b/frontend/public/web-app-manifest-512x512.png differ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index da9a493d..0cf65dc6 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -8,7 +8,8 @@ import { Outlet, Route, Routes, useLocation } from 'react-router-dom'; import Admin from './admin'; import Agents from './agents'; import SharedAgentGate from './agents/SharedAgentGate'; -import DocsGPT3 from './assets/cute_docsgpt3.svg'; +import DocsGPTMark from './assets/logo-b.svg'; +import DocsGPTMarkWhite from './assets/logo-w.svg'; import ActionButtons from './components/ActionButtons'; import AdminRoute from './components/AdminRoute'; import ErrorBoundary from './components/ErrorBoundary'; @@ -39,6 +40,7 @@ function AuthWrapper({ children }: { children: React.ReactNode }) { retryOidcLogin, } = useTokenAuth(); useDataInitializer(isAuthLoading); + const [isDarkTheme] = useDarkTheme(); if (oidcFailed) { const message = @@ -49,7 +51,11 @@ function AuthWrapper({ children }: { children: React.ReactNode }) { : t('auth.signInToContinue'); return (
- DocsGPT + DocsGPT

{message}

diff --git a/frontend/src/Hero.tsx b/frontend/src/Hero.tsx index 3ebf46ef..acdd4648 100644 --- a/frontend/src/Hero.tsx +++ b/frontend/src/Hero.tsx @@ -3,7 +3,8 @@ import { useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; import modelService from './api/services/modelService'; -import DocsGPT3 from './assets/cute_docsgpt3.svg'; +import DocsGPTLogo from './assets/full-logo-b.svg'; +import DocsGPTLogoWhite from './assets/full-logo-w.svg'; import { Select, SelectContent, @@ -11,6 +12,7 @@ import { SelectTrigger, SelectValue, } from './components/ui/select'; +import { useDarkTheme } from './hooks'; import { selectAvailableModels, selectSelectedModel, @@ -129,6 +131,7 @@ export default function Hero({ }) => void; }) { const { t } = useTranslation(); + const [isDarkTheme] = useDarkTheme(); const demos = t('demo', { returnObjects: true }) as Array<{ header: string; query: string; @@ -138,9 +141,12 @@ export default function Hero({
{/* Header Section */}
-
- DocsGPT - docsgpt +
+ DocsGPT
{/* Model Selector */}
diff --git a/frontend/src/admin/AdminUI.tsx b/frontend/src/admin/AdminUI.tsx index e62ab82b..89066f44 100644 --- a/frontend/src/admin/AdminUI.tsx +++ b/frontend/src/admin/AdminUI.tsx @@ -118,7 +118,7 @@ const EVENT_LABELS: Record = { admin_sessions_revoked: 'Sessions revoked', scim_created: 'Provisioned', scim_deactivated: 'Deactivated (SCIM)', - scim_activated: 'Activated (SCIM)', + scim_reactivated: 'Activated (SCIM)', }; export function eventLabel(event: string): string { diff --git a/frontend/src/agents/SharedAgentCard.tsx b/frontend/src/agents/SharedAgentCard.tsx index d5fb8e42..a7102cd7 100644 --- a/frontend/src/agents/SharedAgentCard.tsx +++ b/frontend/src/agents/SharedAgentCard.tsx @@ -28,6 +28,8 @@ export default function SharedAgentCard({
diff --git a/frontend/src/assets/cute_docsgpt3.svg b/frontend/src/assets/cute_docsgpt3.svg deleted file mode 100644 index 53f7cac1..00000000 --- a/frontend/src/assets/cute_docsgpt3.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/src/assets/full-logo-b.svg b/frontend/src/assets/full-logo-b.svg new file mode 100644 index 00000000..54fc9a2b --- /dev/null +++ b/frontend/src/assets/full-logo-b.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/full-logo-w.svg b/frontend/src/assets/full-logo-w.svg new file mode 100644 index 00000000..d4ba6cfa --- /dev/null +++ b/frontend/src/assets/full-logo-w.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/full-logo.svg b/frontend/src/assets/full-logo.svg new file mode 100644 index 00000000..af581fc9 --- /dev/null +++ b/frontend/src/assets/full-logo.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/logo-b.svg b/frontend/src/assets/logo-b.svg new file mode 100644 index 00000000..0b2cec5b --- /dev/null +++ b/frontend/src/assets/logo-b.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/logo-w.svg b/frontend/src/assets/logo-w.svg new file mode 100644 index 00000000..bfbe31f1 --- /dev/null +++ b/frontend/src/assets/logo-w.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/logo.svg b/frontend/src/assets/logo.svg new file mode 100644 index 00000000..1b70c736 --- /dev/null +++ b/frontend/src/assets/logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/teams/TeamSwitcher.tsx b/frontend/src/teams/TeamSwitcher.tsx index 8da43be2..d5c4e1bc 100644 --- a/frontend/src/teams/TeamSwitcher.tsx +++ b/frontend/src/teams/TeamSwitcher.tsx @@ -11,7 +11,11 @@ import { Users, } from 'lucide-react'; -import DocsGPT3 from '../assets/cute_docsgpt3.svg'; +import DocsGPTLogo from '../assets/full-logo-b.svg'; +import DocsGPTLogoWhite from '../assets/full-logo-w.svg'; +import DocsGPTMark from '../assets/logo-b.svg'; +import DocsGPTMarkWhite from '../assets/logo-w.svg'; +import { useDarkTheme } from '../hooks'; import { selectToken } from '../preferences/preferenceSlice'; import { AppDispatch } from '../store'; import { @@ -58,6 +62,7 @@ export default function TeamSwitcher({ const token = useSelector(selectToken); const teams = useSelector(selectTeams); const currentTeamId = useSelector(selectCurrentTeamId); + const [isDarkTheme] = useDarkTheme(); // Populate the switcher on mount so it works before visiting settings. useEffect(() => { @@ -75,16 +80,13 @@ export default function TeamSwitcher({ const currentName = currentTeam ? currentTeam.name : t('teams.switcher.personal'); - // The header trigger shows the brand ("DocsGPT") in a personal context rather - // than "Personal account" — the dropdown still labels the switch entry - // "Personal account". - const triggerLabel = currentTeam ? currentTeam.name : 'DocsGPT'; const teamInitial = currentTeam ? currentTeam.name.charAt(0).toUpperCase() : ''; - // The morphing brand identity shown in the trigger: the DocsGPT logo for a - // personal context, or an initial avatar for a team. + // The morphing brand identity shown in the trigger: the DocsGPT mark for a + // personal context, or an initial avatar for a team. Expanded, a personal + // context upgrades this to the full lockup below. const triggerIcon = currentTeam ? ( // A solid square reads heavier than the dino, so keep the team avatar a // touch smaller (with a little margin to align with the wordmark). @@ -92,7 +94,33 @@ export default function TeamSwitcher({ {teamInitial} ) : ( - DocsGPT Logo + DocsGPT Logo + ); + + // Expanded brand row. In a personal context the full lockup replaces the + // mark-plus-label pair outright — the wordmark is part of the artwork, so a + // separate "DocsGPT" text label would repeat it. `mr-auto` keeps the chevron + // pinned right, the job the label's `flex-1` used to do, and `ml-4` lines the + // logo's left edge up with the "Agents"/"Chats" section headings below it + // (those sit 32px in: `mx-4` on their row plus `ml-4` on the label; the + // header strip and this button contribute 8px of padding each). + const expandedBrand = currentTeam ? ( + <> + {triggerIcon} + + {currentTeam.name} + + + ) : ( + DocsGPT ); // Open the active team's detail directly (not just the list). @@ -132,10 +160,7 @@ export default function TeamSwitcher({ aria-label={t('teams.switcher.ariaLabel')} className="hover:bg-muted dark:hover:bg-accent text-foreground flex w-full items-center gap-1.5 rounded-lg px-2 py-1 text-left transition-colors" > - {triggerIcon} - - {triggerLabel} - + {expandedBrand}