+
{t('settings.devWorkflow.lastOutput')}
@@ -619,10 +620,11 @@ const DevWorkflowPanel = () => {
)}
{runHistory.length > 0 && (
-
+
setHistoryExpanded(!historyExpanded)}
- className="text-xs text-sage-600 dark:text-sage-400 hover:text-sage-800 dark:hover:text-sage-200 transition-colors">
+ className="text-xs text-neutral-500 dark:text-neutral-400 hover:text-neutral-700 dark:hover:text-neutral-200 transition-colors">
{historyExpanded ? '▾' : '▸'} {t('settings.devWorkflow.recentRuns')} (
{runHistory.length})
@@ -631,6 +633,7 @@ const DevWorkflowPanel = () => {
{runHistory.map(run => (
setExpandedRunId(expandedRunId === run.id ? null : run.id)}
className="w-full flex items-center justify-between px-2 py-1.5 text-xs hover:bg-neutral-50 dark:hover:bg-neutral-750 rounded transition-colors">
@@ -673,38 +676,40 @@ const DevWorkflowPanel = () => {
)}
)}
-
+
)}
{/* Setup form — only shown when no active config exists */}
{!existingJob && (
<>
-
-
- {t('settings.devWorkflow.githubRepository')}
-
+
{reposError && (
-
+
{reposError}
)}
-
void onRepoSelect(e.target.value)}
- disabled={reposLoading}
- className="w-full rounded-md border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-800 px-3 py-2 text-sm text-neutral-900 dark:text-neutral-100 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 disabled:opacity-50">
-
- {reposLoading
- ? t('settings.devWorkflow.loadingRepositories')
- : t('settings.devWorkflow.selectRepository')}
-
- {repos.map(r => (
-
- {r.fullName} {r.private ? t('settings.devWorkflow.privateTag') : ''}
-
- ))}
-
-
+ void onRepoSelect(e.target.value)}
+ disabled={reposLoading}
+ className="w-full">
+
+ {reposLoading
+ ? t('settings.devWorkflow.loadingRepositories')
+ : t('settings.devWorkflow.selectRepository')}
+
+ {repos.map(r => (
+
+ {r.fullName} {r.private ? t('settings.devWorkflow.privateTag') : ''}
+
+ ))}
+
+ }
+ />
+
{/* Fork info */}
{forkLoading && (
@@ -736,29 +741,28 @@ const DevWorkflowPanel = () => {
{/* Branch selector */}
{branches.length > 0 && (
-
-
- {t('settings.devWorkflow.targetBranch')}
-
-
- {t('settings.devWorkflow.targetBranchNote')}
- {forkInfo ? ` on ${forkInfo.upstreamFullName}` : ''}.
-
-
{
- setTargetBranch(e.target.value);
- setSaveStatus('idle');
- }}
- disabled={branchesLoading}
- className="w-full rounded-md border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-800 px-3 py-2 text-sm text-neutral-900 dark:text-neutral-100 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 disabled:opacity-50">
- {branches.map(b => (
-
- {b.name}
-
- ))}
-
-
+
+ {
+ setTargetBranch(e.target.value);
+ setSaveStatus('idle');
+ }}
+ disabled={branchesLoading}
+ className="w-full">
+ {branches.map(b => (
+
+ {b.name}
+
+ ))}
+
+ }
+ />
+
)}
{branchesLoading && (
@@ -768,48 +772,46 @@ const DevWorkflowPanel = () => {
{/* Schedule */}
{selectedRepo && (
-
-
- {t('settings.devWorkflow.runFrequency')}
-
-
- {t('settings.devWorkflow.runFrequencyNote')}
-
-
{
- setSchedule(e.target.value);
- setSaveStatus('idle');
- }}
- className="w-full rounded-md border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-800 px-3 py-2 text-sm text-neutral-900 dark:text-neutral-100 focus:ring-2 focus:ring-primary-500 focus:border-primary-500">
- {SCHEDULE_PRESETS.map(p => (
-
- {t(p.labelKey)}
-
- ))}
-
-
+
+ {
+ setSchedule(e.target.value);
+ setSaveStatus('idle');
+ }}
+ className="w-full">
+ {SCHEDULE_PRESETS.map(p => (
+
+ {t(p.labelKey)}
+
+ ))}
+
+ }
+ />
+
)}
{/* Actions */}
{selectedRepo && (
-
-
+ void handleSave()}
- disabled={!canSave}
- className="px-4 py-2 rounded-md bg-primary-600 hover:bg-primary-500 text-white text-sm font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
+ disabled={!canSave}>
{t('settings.devWorkflow.saveConfiguration')}
-
- {saveStatus === 'saved' && (
-
- {t('settings.devWorkflow.saved')}
-
- )}
- {saveStatus === 'error' && (
-
- {t('settings.devWorkflow.cronSaveError')}
-
- )}
+
+
)}
>
diff --git a/app/src/components/settings/panels/DeveloperOptionsPanel.tsx b/app/src/components/settings/panels/DeveloperOptionsPanel.tsx
index 55a333088..e2c927961 100644
--- a/app/src/components/settings/panels/DeveloperOptionsPanel.tsx
+++ b/app/src/components/settings/panels/DeveloperOptionsPanel.tsx
@@ -1,3 +1,9 @@
+// [settings] Developer & Diagnostics panel — debug-only entries only.
+// User-facing routes (agents, autonomy, agent-access, sandbox-settings,
+// activity-level, tools, companion, screen-intelligence, voice, embeddings,
+// heartbeat, ledger-usage, cost-dashboard, task-sources, composio-routing,
+// webhooks-triggers, migration, security) have been moved to their canonical
+// section pages. Only genuine diagnostics remain here.
import { type ReactNode, useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
@@ -13,6 +19,7 @@ import { safeInvoke as invoke, isTauri } from '../../../utils/tauriCommands/comm
import { resetWalkthrough } from '../../walkthrough/AppWalkthrough';
import SettingsHeader from '../components/SettingsHeader';
import SettingsMenuItem from '../components/SettingsMenuItem';
+import { SettingsSection } from '../controls';
import { useSettingsNavigation } from '../hooks/useSettingsNavigation';
// ---------------------------------------------------------------------------
@@ -34,13 +41,28 @@ interface DevGroup {
}
// ---------------------------------------------------------------------------
-// 7 sub-sections per the IA redesign doc
+// Debug-only groups — genuine diagnostics that belong ONLY here.
+//
+// Removed from all groups (moved to canonical section pages):
+// agents, autonomy, agent-access, sandbox-settings, activity-level
+// → Settings → Agents
+// tools, companion, screen-intelligence
+// → Settings → Features
+// voice, embeddings, heartbeat, ledger-usage, cost-dashboard
+// → Settings → AI & Models
+// task-sources, composio-routing, webhooks-triggers
+// → Settings → Integrations
+// migration, security
+// → Settings → Account
+// persona
+// → Settings home (Assistant group)
// ---------------------------------------------------------------------------
const knowledgeMemoryGroup: DevGroup = {
labelKey: 'settings.devGroups.knowledgeMemory',
items: [
{
+ // intelligence appears only once here (Council duplicate removed).
id: 'intelligence',
titleKey: 'settings.developerMenu.intelligence.title',
descriptionKey: 'settings.developerMenu.intelligence.desc',
@@ -104,109 +126,12 @@ const knowledgeMemoryGroup: DevGroup = {
),
},
- {
- // Moved out of the layman Account group.
- id: 'migration',
- titleKey: 'settings.account.dataMigration',
- descriptionKey: 'settings.account.dataMigrationDesc',
- route: 'migration',
- icon: (
-
-
-
- ),
- },
],
};
-const agentsAutonomyGroup: DevGroup = {
+const agentDebugGroup: DevGroup = {
labelKey: 'settings.devGroups.agentsAutonomy',
items: [
- {
- id: 'agents',
- titleKey: 'settings.agents.title',
- descriptionKey: 'settings.agents.subtitle',
- route: 'agents',
- icon: (
-
-
-
- ),
- },
- {
- id: 'autonomy',
- titleKey: 'settings.developerMenu.autonomy.title',
- descriptionKey: 'settings.developerMenu.autonomy.desc',
- route: 'autonomy',
- icon: (
-
-
-
- ),
- },
- {
- id: 'agent-access',
- titleKey: 'settings.agentAccess.title',
- descriptionKey: 'settings.agentAccess.menuDesc',
- route: 'agent-access',
- icon: (
-
-
-
- ),
- },
- {
- id: 'sandbox-settings',
- titleKey: 'settings.sandbox.title',
- descriptionKey: 'settings.sandbox.menuDesc',
- route: 'sandbox-settings',
- icon: (
-
-
-
- ),
- },
- {
- id: 'heartbeat',
- titleKey: 'settings.heartbeat.title',
- descriptionKey: 'settings.heartbeat.desc',
- route: 'heartbeat',
- icon: (
-
-
-
- ),
- },
{
id: 'tool-policy-diagnostics',
titleKey: 'devOptions.diagnostics',
@@ -240,73 +165,17 @@ const agentsAutonomyGroup: DevGroup = {
),
},
{
- // Layman Permissions picker, moved out of the Assistant group.
- id: 'permissions',
- titleKey: 'settings.assistant.permissions',
- descriptionKey: 'settings.assistant.permissionsDesc',
- route: 'permissions',
+ id: 'agent-chat',
+ titleKey: 'settings.developerMenu.agentChat.title',
+ descriptionKey: 'settings.developerMenu.agentChat.desc',
+ route: 'agent-chat',
icon: (
-
- ),
- },
- {
- // Subconscious (activity level), moved out of the Assistant group.
- id: 'activity-level',
- titleKey: 'settings.assistant.backgroundActivity',
- descriptionKey: 'settings.assistant.backgroundActivityDesc',
- route: 'activity-level',
- icon: (
-
-
-
- ),
- },
- ],
-};
-
-const modelsInferenceGroup: DevGroup = {
- labelKey: 'settings.devGroups.modelsInference',
- items: [
- {
- id: 'ai',
- titleKey: 'settings.developerMenu.ai.title',
- descriptionKey: 'settings.developerMenu.ai.desc',
- route: 'ai',
- icon: (
-
-
-
- ),
- },
- {
- id: 'embeddings',
- titleKey: 'pages.settings.ai.embeddings',
- descriptionKey: 'pages.settings.ai.embeddingsDesc',
- route: 'embeddings',
- icon: (
-
-
),
@@ -327,6 +196,34 @@ const modelsInferenceGroup: DevGroup = {
),
},
+ {
+ id: 'skills-runner',
+ titleKey: 'settings.developerMenu.skillsRunner.title',
+ descriptionKey: 'settings.developerMenu.skillsRunner.desc',
+ route: 'skills-runner',
+ icon: (
+
+
+
+
+ ),
+ },
+ ],
+};
+
+const modelsDebugGroup: DevGroup = {
+ labelKey: 'settings.devGroups.modelsInference',
+ items: [
{
id: 'model-health',
titleKey: 'settings.modelHealth.title',
@@ -344,33 +241,49 @@ const modelsInferenceGroup: DevGroup = {
),
},
{
- id: 'search',
- titleKey: 'settings.search.title',
- descriptionKey: 'settings.search.menuDesc',
- route: 'search',
+ id: 'screen-awareness-debug',
+ titleKey: 'settings.developerMenu.screenAwareness.title',
+ descriptionKey: 'settings.developerMenu.screenAwareness.desc',
+ route: 'screen-awareness-debug',
icon: (
),
},
{
- id: 'agent-chat',
- titleKey: 'settings.developerMenu.agentChat.title',
- descriptionKey: 'settings.developerMenu.agentChat.desc',
- route: 'agent-chat',
+ id: 'voice-debug',
+ titleKey: 'settings.developerMenu.voiceDebug.title',
+ descriptionKey: 'settings.developerMenu.voiceDebug.desc',
+ route: 'voice-debug',
icon: (
+
+ ),
+ },
+ {
+ id: 'autocomplete-debug',
+ titleKey: 'settings.developerMenu.autocomplete.title',
+ descriptionKey: 'settings.developerMenu.autocomplete.desc',
+ route: 'autocomplete-debug',
+ icon: (
+
+
),
@@ -378,7 +291,7 @@ const modelsInferenceGroup: DevGroup = {
],
};
-const automationIntegrationsGroup: DevGroup = {
+const automationDebugGroup: DevGroup = {
labelKey: 'settings.devGroups.automationIntegrations',
items: [
{
@@ -414,10 +327,10 @@ const automationIntegrationsGroup: DevGroup = {
),
},
{
- id: 'webhooks-triggers',
- titleKey: 'settings.developerMenu.composeioTriggers.title',
- descriptionKey: 'settings.developerMenu.composeioTriggers.desc',
- route: 'webhooks-triggers',
+ id: 'composio-triggers',
+ titleKey: 'settings.developerMenu.composio.title',
+ descriptionKey: 'settings.developerMenu.composio.desc',
+ route: 'composio-triggers',
icon: (
),
},
- {
- id: 'task-sources',
- titleKey: 'settings.taskSources.title',
- descriptionKey: 'settings.taskSources.subtitle',
- route: 'task-sources',
- icon: (
-
-
-
- ),
- },
- {
- id: 'composio',
- titleKey: 'settings.developerMenu.composio.title',
- descriptionKey: 'settings.developerMenu.composio.desc',
- route: 'composio-routing',
- icon: (
-
-
-
- ),
- },
{
id: 'mcp-server',
titleKey: 'settings.developerMenu.mcpServer.title',
@@ -512,157 +393,6 @@ const automationIntegrationsGroup: DevGroup = {
],
};
-const toolsCapabilitiesGroup: DevGroup = {
- labelKey: 'settings.devGroups.toolsCapabilities',
- items: [
- {
- id: 'tools',
- titleKey: 'settings.developerMenu.tools.title',
- descriptionKey: 'settings.developerMenu.tools.desc',
- route: 'tools',
- icon: (
-
-
-
-
- ),
- },
- {
- id: 'screen-awareness-debug',
- titleKey: 'settings.developerMenu.screenAwareness.title',
- descriptionKey: 'settings.developerMenu.screenAwareness.desc',
- route: 'screen-awareness-debug',
- icon: (
-
-
-
- ),
- },
- {
- id: 'autocomplete',
- titleKey: 'settings.developerMenu.autocomplete.title',
- descriptionKey: 'settings.developerMenu.autocomplete.desc',
- route: 'autocomplete',
- icon: (
-
-
-
- ),
- },
- {
- id: 'voice-debug',
- titleKey: 'settings.developerMenu.voiceDebug.title',
- descriptionKey: 'settings.developerMenu.voiceDebug.desc',
- route: 'voice-debug',
- icon: (
-
-
-
- ),
- },
- {
- // Voice (TTS/STT) settings, moved out of the Assistant group.
- id: 'voice',
- titleKey: 'settings.assistant.voice',
- descriptionKey: 'settings.assistant.voiceDesc',
- route: 'voice',
- icon: (
-
-
-
- ),
- },
- {
- // Screen awareness, moved out of the Assistant group.
- id: 'screen-intelligence',
- titleKey: 'settings.assistant.screenAwareness',
- descriptionKey: 'settings.assistant.screenAwarenessDesc',
- route: 'screen-intelligence',
- icon: (
-
-
-
- ),
- },
- {
- // Desktop companion, moved out of the Assistant group.
- id: 'companion',
- titleKey: 'settings.assistant.desktopCompanion',
- descriptionKey: 'settings.assistant.desktopCompanionDesc',
- route: 'companion',
- icon: (
-
-
-
- ),
- },
- ],
-};
-
-const councilGroup: DevGroup = {
- labelKey: 'settings.devGroups.council',
- items: [
- // Council links to /intelligence?tab=council (the IS_DEV-gated tab).
- // We route through the embedded Intelligence page in settings.
- {
- id: 'council',
- titleKey: 'settings.devGroups.council',
- descriptionKey: 'settings.developerMenu.intelligence.desc',
- route: 'intelligence',
- icon: (
-
-
-
- ),
- },
- ],
-};
-
const diagnosticsLogsGroup: DevGroup = {
labelKey: 'settings.devGroups.diagnosticsLogs',
items: [
@@ -682,38 +412,6 @@ const diagnosticsLogsGroup: DevGroup = {
),
},
- {
- id: 'ledger-usage',
- titleKey: 'settings.ledgerUsage.title',
- descriptionKey: 'settings.ledgerUsage.desc',
- route: 'ledger-usage',
- icon: (
-
-
-
- ),
- },
- {
- id: 'cost-dashboard',
- titleKey: 'settings.costDashboard.title',
- descriptionKey: 'settings.costDashboard.desc',
- route: 'cost-dashboard',
- icon: (
-
-
-
- ),
- },
{
id: 'build-info',
titleKey: 'settings.buildInfo.title',
@@ -730,35 +428,15 @@ const diagnosticsLogsGroup: DevGroup = {
),
},
- {
- // Security (secret storage / keychain), moved out of the layman
- // Privacy & Security group.
- id: 'security',
- titleKey: 'settings.privacySecurity.security',
- descriptionKey: 'settings.privacySecurity.securityDesc',
- route: 'security',
- icon: (
-
-
-
- ),
- },
],
};
-/** All 7 dev groups in display order */
+/** All debug-only groups in display order */
const DEV_GROUPS: DevGroup[] = [
knowledgeMemoryGroup,
- agentsAutonomyGroup,
- modelsInferenceGroup,
- automationIntegrationsGroup,
- toolsCapabilitiesGroup,
- councilGroup,
+ agentDebugGroup,
+ modelsDebugGroup,
+ automationDebugGroup,
diagnosticsLogsGroup,
];
@@ -772,7 +450,7 @@ const CoreModeBadge = () => {
if (mode.kind === 'unset') {
return (
-
+
{t('devOptions.coreModeNotSet')}
@@ -785,7 +463,7 @@ const CoreModeBadge = () => {
if (mode.kind === 'local') {
return (
-
+
{t('devOptions.local')}
@@ -802,7 +480,7 @@ const CoreModeBadge = () => {
}
return (
-
+
{t('devOptions.cloud')}
@@ -852,7 +530,7 @@ const SentryTestRow = () => {
};
return (
-
+
@@ -916,24 +594,24 @@ const LogsFolderRow = () => {
if (!isTauri()) return null;
return (
-
+
-
+
{t('devOptions.appLogs')}
-
+
{t('devOptions.appLogsDesc')}
{path && (
-
+ className="shrink-0 px-3 py-1.5 rounded-md bg-neutral-700 hover:bg-neutral-600 text-white text-xs font-medium transition-colors">
{t('devOptions.openLogsFolder')}
@@ -949,18 +627,6 @@ const LogsFolderRow = () => {
);
};
-// ---------------------------------------------------------------------------
-// Group section header
-// ---------------------------------------------------------------------------
-
-const DevGroupHeader = ({ label }: { label: string }) => (
-
-
- {label}
-
-
-);
-
// ---------------------------------------------------------------------------
// Main panel
// ---------------------------------------------------------------------------
@@ -1001,12 +667,11 @@ const DeveloperOptionsPanel = () => {
breadcrumbs={breadcrumbs}
/>
- {/* 7 labeled sub-sections replacing the previous flat list */}
-
+ {/* Debug-only sub-sections */}
+
{DEV_GROUPS.map(group => (
-
-
+
{group.items.map((item, index) => (
{
isLast={index === group.items.length - 1}
/>
))}
-
+
))}
- {/* Restart Tour lives outside the 7 groups — utility action */}
-
+ {/* Restart Tour lives outside the groups — utility action */}
+
+
+
{/* Diagnostics callouts live outside the menu card so the spacing
and alignment don't clash with the SettingsMenuItem rows. */}
-
+
{showSentryTest &&
}
diff --git a/app/src/components/settings/panels/DevicesPanel.tsx b/app/src/components/settings/panels/DevicesPanel.tsx
index e123ec241..c489697b6 100644
--- a/app/src/components/settings/panels/DevicesPanel.tsx
+++ b/app/src/components/settings/panels/DevicesPanel.tsx
@@ -5,7 +5,15 @@ import { useT } from '../../../lib/i18n/I18nContext';
import { callCoreRpc } from '../../../services/coreRpcClient';
import type { ToastNotification } from '../../../types/intelligence';
import { ToastContainer } from '../../intelligence/Toast';
+import Button from '../../ui/Button';
import SettingsHeader from '../components/SettingsHeader';
+import {
+ SettingsBadge,
+ SettingsEmptyState,
+ SettingsListItem,
+ SettingsSection,
+ SettingsStatusLine,
+} from '../controls';
import { useSettingsNavigation } from '../hooks/useSettingsNavigation';
import PairPhoneModal from './devices/PairPhoneModal';
@@ -77,7 +85,8 @@ function PeerDot({ online }: { online: boolean | null }) {
return (
);
}
@@ -85,34 +94,28 @@ function PeerDot({ online }: { online: boolean | null }) {
function DeviceRow({
device,
onRevoke,
- isFirst,
- isLast,
}: {
device: PairedDevice;
onRevoke: (device: PairedDevice) => void;
- isFirst: boolean;
- isLast: boolean;
}) {
const { t } = useT();
+ const statusBadge = (
+
+
+
{truncateId(device.channel_id)}
+
+ {formatRelativeTime(relativeTime(device.last_seen_at), t)}
+
+
+ );
return (
-
-
-
-
{device.label}
-
{truncateId(device.channel_id)}
-
- {formatRelativeTime(relativeTime(device.last_seen_at), t)}
-
-
-
onRevoke(device)}
- className="text-xs text-coral-600 hover:text-coral-700 transition-colors flex-shrink-0 px-2 py-1 rounded hover:bg-coral-50"
- aria-label={t('devices.revokeAria').replace('{label}', device.label)}>
- {t('devices.revoke')}
-
-
+
onRevoke(device)}
+ removeLabel={t('devices.revoke')}
+ />
);
}
@@ -129,24 +132,26 @@ function ConfirmRevokeDialog({
return (
-
-
+
+
{t('devices.confirmRevokeTitle')}
-
+
{t('devices.confirmRevokeBody').replace('{label}', device.label)}
-
+
{t('common.cancel')}
-
-
+
+ className="flex-1"
+ data-testid="confirm-revoke-btn">
{t('devices.revoke')}
-
+
@@ -283,25 +288,22 @@ const DevicesPanel = () => {
onBack={navigateBack}
breadcrumbs={breadcrumbs}
action={
-
+
{t('devices.pairIphone')}
-
+
}
/>
-
- {t('devices.betaBadge')}
-
-
{t('devices.betaText')}
+ {/* Bespoke beta badge — intentional marketing chip */}
+
{t('devices.betaBadge')}
+
{t('devices.betaText')}
-
+
{loading && (
-
+
{
)}
- {!loading && error && (
-
- {error}
-
- )}
+ {!loading && error &&
}
{!loading && !error && devices.length === 0 && (
-
-
-
-
-
+
+
+
+
+
+ {t('devices.emptyState')}
+
+
+ {t('devices.pairIphone')}
+
- {t('devices.noPaired')}
- {t('devices.emptyState')}
-
- {t('devices.pairIphone')}
-
-
+
)}
{!loading && !error && devices.length > 0 && (
-
- {devices.map((device, idx) => (
- {
- log('[devices-ui] revoke requested channel_id=%s', d.channel_id);
- setRevokeTarget(d);
- }}
- isFirst={idx === 0}
- isLast={idx === devices.length - 1}
- />
- ))}
-
+
+
+ {devices.map(device => (
+ {
+ log('[devices-ui] revoke requested channel_id=%s', d.channel_id);
+ setRevokeTarget(d);
+ }}
+ />
+ ))}
+
+
)}
diff --git a/app/src/components/settings/panels/EmbeddingsPanel.tsx b/app/src/components/settings/panels/EmbeddingsPanel.tsx
index 0e7b4b423..878690a94 100644
--- a/app/src/components/settings/panels/EmbeddingsPanel.tsx
+++ b/app/src/components/settings/panels/EmbeddingsPanel.tsx
@@ -18,7 +18,16 @@ import {
testEmbeddingsConnection,
updateEmbeddingsSettings,
} from '../../../services/api/embeddingsApi';
+import Button from '../../ui/Button';
import SettingsHeader from '../components/SettingsHeader';
+import {
+ SettingsBadge,
+ SettingsRow,
+ SettingsSection,
+ SettingsSelect,
+ SettingsStatusLine,
+ SettingsTextField,
+} from '../controls';
import { useSettingsNavigation } from '../hooks/useSettingsNavigation';
type Status =
@@ -87,7 +96,7 @@ const EmbeddingsPanel = ({ embedded = false }: EmbeddingsPanelProps = {}) => {
/>
)}
-
+
{status.kind === 'loading'
? t('common.loading')
: status.kind === 'error'
@@ -334,72 +343,66 @@ const EmbeddingsPanel = ({ embedded = false }: EmbeddingsPanelProps = {}) => {
)}
-
+
{t('settings.embeddings.description')}
{/* Provider selection */}
-
- {settings.providers.map((entry, idx) => {
- const selected = entry.slug === selectedProvider;
- return (
- handleProviderClick(entry)}
- className={`w-full flex items-start gap-3 px-4 py-3 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 ${
- idx !== 0 ? 'border-t border-neutral-100 dark:border-neutral-800' : ''
- } ${
- selected
- ? 'bg-primary-50 dark:bg-primary-500/10'
- : 'hover:bg-neutral-50 dark:hover:bg-neutral-800/60'
- }`}>
-
-
-
- {entry.label}
-
- {entry.requires_api_key && (
-
- {entry.has_api_key
- ? t('settings.embeddings.statusConfigured')
- : t('settings.embeddings.statusNeedsKey')}
+