diff --git a/src/apps/officer-web/Screens/Dashboard/CapabilityPage.tsx b/src/apps/officer-web/Screens/Dashboard/CapabilityPage.tsx index 841b82f7..22c948dc 100644 --- a/src/apps/officer-web/Screens/Dashboard/CapabilityPage.tsx +++ b/src/apps/officer-web/Screens/Dashboard/CapabilityPage.tsx @@ -279,20 +279,20 @@ export const CapabilityChat = ({ ? (description ?? `Help me create the content for this new ${kind} file`) : `Help me understand and improve this ${kind} file`; - const pi = useChat(undefined, undefined, { replaceUrl: false }); + const chat = useChat(undefined, undefined, { replaceUrl: false }); const onResponseEndRef = useRef(onResponseEnd); onResponseEndRef.current = onResponseEnd; const wasGenerating = useRef(false); useEffect(() => { - if (wasGenerating.current && !pi.isGenerating) { + if (wasGenerating.current && !chat.isGenerating) { onResponseEndRef.current?.(); } - wasGenerating.current = pi.isGenerating; - }, [pi.isGenerating]); + wasGenerating.current = chat.isGenerating; + }, [chat.isGenerating]); - return ; + return ; }; export const FrontmatterBlock = ({ yaml }: { yaml: string }) => { diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/AISettings.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/AISettings.tsx index 0d9719e1..42530835 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/AISettings.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/AISettings.tsx @@ -251,7 +251,7 @@ function MemberModelsSection() { const refreshModels = async () => { setRefreshing(true); try { - await client.post('/server-settings/pi-mono/local-providers/refresh'); + await client.post('/server-settings/chat-providers/local-providers/refresh'); queryClient.invalidateQueries({ queryKey: ['CHAT_MODELS'] }); toast.success('Models refreshed'); } catch { diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/ProfileSettings/TaskDefaults.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/ProfileSettings/TaskDefaults.tsx index bd1443fb..33e3caa0 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/ProfileSettings/TaskDefaults.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/ProfileSettings/TaskDefaults.tsx @@ -16,7 +16,7 @@ import { useUserVisibleModels, type ModelOption } from 'state/useModels'; export const TaskDefaults = () => { const { settings, saveSettings } = useSettings(); - const piModels = useUserVisibleModels(); + const models = useUserVisibleModels(); const [isSaving, setIsSaving] = useState(false); const [model, setModel] = useState(settings.tasks.defaultModel); @@ -37,13 +37,13 @@ export const TaskDefaults = () => { .map(([provider, models]) => ({ provider, models: models.sort((a, b) => a.name.localeCompare(b.name)) })); }; - const piGroups = useMemo(() => buildGroups(piModels, 'Pi'), [piModels]); + const modelGroups = useMemo(() => buildGroups(models, 'Chat'), [models]); const handleSave = async () => { if (isSaving) return; setIsSaving(true); try { - await saveSettings({ ...settings, tasks: { defaultProvider: 'pi', defaultModel: model } }); + await saveSettings({ ...settings, tasks: { defaultProvider: 'chat', defaultModel: model } }); toast.success('Task defaults saved'); } catch { toast.error('Failed to save settings'); @@ -61,7 +61,7 @@ export const TaskDefaults = () => { - {piGroups.map(({ provider, models }) => ( + {modelGroups.map(({ provider, models }) => ( {provider} {models.map((m) => ( diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx index 6df8faff..52f85b01 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx @@ -33,7 +33,7 @@ type ProbeResult = { error?: string; }; -type PiProvider = { key: string; piId: string }; +type ChatProvider = { key: string; providerId: string }; type ProbeState = { step: 'url' } | { step: 'probing' } | { step: 'auth'; probe: ProbeResult } | { step: 'saving' }; @@ -42,31 +42,31 @@ export const AIHarnessesSection = () => { const queryClient = useQueryClient(); const [installing, setInstalling] = useState(false); - const { data: PI_PROVIDERS = [] as PiProvider[] } = useQuery({ - queryKey: ['PI_MONO_PROVIDERS'], - queryFn: () => client.get('/server-settings/pi-mono/providers'), + const { data: CHAT_PROVIDERS = [] as ChatProvider[] } = useQuery({ + queryKey: ['CHAT_PROVIDERS_PROVIDERS'], + queryFn: () => client.get('/server-settings/chat-providers/providers'), }); const { data: piMonoVersion, isLoading: piMonoLoading } = useQuery({ - queryKey: ['PI_MONO_VERSION'], - queryFn: () => client.get('/server-settings/pi-mono/version'), + queryKey: ['CHAT_PROVIDERS_VERSION'], + queryFn: () => client.get('/server-settings/chat-providers/version'), }); const { data: piMonoKeys } = useQuery({ - queryKey: ['PI_MONO_API_KEYS'], - queryFn: () => client.get('/server-settings/pi-mono/api-keys'), + queryKey: ['CHAT_PROVIDERS_API_KEYS'], + queryFn: () => client.get('/server-settings/chat-providers/api-keys'), enabled: !!piMonoVersion?.version, }); const { data: localProviders = [] as LocalProviderEntry[] } = useQuery({ - queryKey: ['PI_MONO_LOCAL_PROVIDERS'], - queryFn: () => client.get('/server-settings/pi-mono/local-providers'), + queryKey: ['CHAT_PROVIDERS_LOCAL_PROVIDERS'], + queryFn: () => client.get('/server-settings/chat-providers/local-providers'), enabled: !!piMonoVersion?.version, }); const { data: localHealth = {} as Record } = useQuery({ - queryKey: ['PI_MONO_LOCAL_HEALTH'], - queryFn: () => client.get>('/server-settings/pi-mono/local-providers/health'), + queryKey: ['CHAT_PROVIDERS_LOCAL_HEALTH'], + queryFn: () => client.get>('/server-settings/chat-providers/local-providers/health'), enabled: localProviders.length > 0, refetchInterval: 15_000, }); @@ -96,31 +96,31 @@ export const AIHarnessesSection = () => { }; const storedKeys: StoredApiKeys['keys'] = piMonoKeys?.keys ?? []; - const storedPiIds = new Set(storedKeys.map((k) => k.provider)); - const connectedProviders = PI_PROVIDERS.filter((p) => storedPiIds.has(p.piId)); - const unconnectedProviders = PI_PROVIDERS.filter((p) => !storedPiIds.has(p.piId)); + const storedProviderIds = new Set(storedKeys.map((k) => k.provider)); + const connectedProviders = CHAT_PROVIDERS.filter((p) => storedProviderIds.has(p.providerId)); + const unconnectedProviders = CHAT_PROVIDERS.filter((p) => !storedProviderIds.has(p.providerId)); const { data: remoteHealth = {} as Record } = useQuery({ - queryKey: ['PI_MONO_REMOTE_HEALTH'], - queryFn: () => client.get>('/server-settings/pi-mono/api-keys/health'), + queryKey: ['CHAT_PROVIDERS_REMOTE_HEALTH'], + queryFn: () => client.get>('/server-settings/chat-providers/api-keys/health'), enabled: connectedProviders.length > 0, refetchInterval: 30_000, }); - const getStoredMasked = (piId: string) => storedKeys.find((k) => k.provider === piId)?.value ?? ''; + const getStoredMasked = (providerId: string) => storedKeys.find((k) => k.provider === providerId)?.value ?? ''; - const saveApiKey = async (piId: string) => { - const value = keyInputs[piId]; + const saveApiKey = async (providerId: string) => { + const value = keyInputs[providerId]; if (value === undefined) return; - setSavingKey(piId); + setSavingKey(providerId); try { - await client.put('/server-settings/pi-mono/api-keys', { provider: piId, value }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_API_KEYS'] }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_REMOTE_HEALTH'] }); + await client.put('/server-settings/chat-providers/api-keys', { provider: providerId, value }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_API_KEYS'] }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_REMOTE_HEALTH'] }); queryClient.invalidateQueries({ queryKey: ['CHAT_MODELS'] }); setKeyInputs((prev) => { const next = { ...prev }; - delete next[piId]; + delete next[providerId]; return next; }); setEditingProvider(null); @@ -129,19 +129,19 @@ export const AIHarnessesSection = () => { } }; - const disconnectProvider = async (provider: (typeof PI_PROVIDERS)[number]) => { - await client.put('/server-settings/pi-mono/api-keys', { provider: provider.piId, value: '' }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_API_KEYS'] }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_REMOTE_HEALTH'] }); + const disconnectProvider = async (provider: (typeof CHAT_PROVIDERS)[number]) => { + await client.put('/server-settings/chat-providers/api-keys', { provider: provider.providerId, value: '' }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_API_KEYS'] }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_REMOTE_HEALTH'] }); queryClient.invalidateQueries({ queryKey: ['CHAT_MODELS'] }); if (editingProvider === provider.key) setEditingProvider(null); }; - const installPiMono = async () => { + const installAgent = async () => { setInstalling(true); try { - const result = await client.post('/server-settings/pi-mono/install'); - queryClient.setQueryData(['PI_MONO_VERSION'], result); + const result = await client.post('/server-settings/chat-providers/install'); + queryClient.setQueryData(['CHAT_PROVIDERS_VERSION'], result); } finally { setInstalling(false); } @@ -152,7 +152,7 @@ export const AIHarnessesSection = () => { ) => { setProbeState({ step: 'probing' }); try { - const result = await client.post('/server-settings/pi-mono/local-providers/probe', { + const result = await client.post('/server-settings/chat-providers/local-providers/probe', { url: localUrl.trim(), auth, }); @@ -182,7 +182,7 @@ export const AIHarnessesSection = () => { // Re-probe with credentials to verify they work setProbeState({ step: 'probing' }); try { - const result = await client.post('/server-settings/pi-mono/local-providers/probe', { + const result = await client.post('/server-settings/chat-providers/local-providers/probe', { url: localUrl.trim(), auth, }); @@ -209,14 +209,14 @@ export const AIHarnessesSection = () => { ) => { setProbeState({ step: 'saving' }); try { - await client.post('/server-settings/pi-mono/local-providers', { + await client.post('/server-settings/chat-providers/local-providers', { url: localUrl.trim(), name: localName.trim() || probe.name, apiType: probe.apiType, auth, }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_LOCAL_PROVIDERS'] }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_LOCAL_HEALTH'] }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_LOCAL_PROVIDERS'] }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_LOCAL_HEALTH'] }); queryClient.invalidateQueries({ queryKey: ['CHAT_MODELS'] }); toast.success(`Connected to ${probe.name}`); resetLocalForm(); @@ -227,9 +227,9 @@ export const AIHarnessesSection = () => { }; const removeLocalProvider = async (id: string) => { - await client.delete(`/server-settings/pi-mono/local-providers/${id}`); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_LOCAL_PROVIDERS'] }); - queryClient.invalidateQueries({ queryKey: ['PI_MONO_LOCAL_HEALTH'] }); + await client.delete(`/server-settings/chat-providers/local-providers/${id}`); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_LOCAL_PROVIDERS'] }); + queryClient.invalidateQueries({ queryKey: ['CHAT_PROVIDERS_LOCAL_HEALTH'] }); queryClient.invalidateQueries({ queryKey: ['CHAT_MODELS'] }); }; @@ -245,7 +245,7 @@ export const AIHarnessesSection = () => { {piMonoVersion.version}