From c3534a9954b783444fcdb4e3298366d2919cd8a1 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Sat, 7 Nov 2026 12:37:16 -0800 Subject: [PATCH] feat(settings): show each settings group as a titled card (#39253) * feat(settings): group settings into titled cards so section boundaries are clear Each settings group now shows its title above its own card, with hairlines between rows, replacing one shared card where group headers looked like rows. Adds SettingsGroup; SettingsSection drops its outer card when a pane is built from groups, and SettingsRow/SearchableSetting mark rows for the dividers. * fix(settings): use status-warning tokens for the task sources banner * fix(settings): avoid subtree-restyling :has() spacing and keep orchestration search copy * fix(settings): keep agent catalog rows mounted when an agent moves from available to installed * fix(settings): hide groups that search empties and divide rows inside multi-row wrappers * fix(settings): drop pane-wide :has scans, keep group headers when search empties a card Ruling D2/E2/S3 on #39253 review: outermost rows own dividers, only an empty card hides (direct-child selector) so header actions like Remove Project stay, and panes declare grouped statically. Also restores the whole-header Alt-click for the release channel, gives App Icon and the Windows admin row stable cards, and removes wrapper divs that kept emptied cards visible. * test(settings): Option-clicking the Updates version line reveals the release channel switcher * test(settings): stub the updater API without a type assertion --- .../AgentDashboardExperimentalSetting.tsx | 2 +- .../settings/accounts/AccountsPane.tsx | 2 +- .../claude/accounts-pane-claude-section.tsx | 581 +++++++++--------- .../claude-running-session-switch-setting.tsx | 2 +- .../codex/accounts-pane-codex-section.tsx | 488 ++++++++------- .../providers/AntigravityAccountsSection.tsx | 380 ++++++------ .../providers/CursorAccountsSection.tsx | 331 +++++----- .../providers/GrokAccountsSection.tsx | 295 ++++----- .../providers/ManagedDataAccountsSection.tsx | 110 ++-- ...ccounts-pane-provider-setting-sections.tsx | 375 +++++------ .../scope/accounts-pane-location-section.tsx | 7 +- .../accounts/usage/MiniMaxAccountsSection.tsx | 314 +++++----- .../usage/ZcodePlanAccountsSection.tsx | 551 +++++++++-------- .../accounts-pane-minimax-credentials.tsx | 4 +- .../accounts-pane-opencode-credentials.tsx | 2 +- .../settings/advanced/AdvancedPane.tsx | 40 +- .../settings/advanced/DevToolsPane.tsx | 58 +- .../settings/advanced/ExperimentalPane.tsx | 386 ++++++------ .../AdvancedNetworkSettingsSection.tsx | 2 +- .../components/settings/agents/AgentsPane.tsx | 62 +- .../agents/behavior/AgentAwakeSetting.tsx | 64 +- .../behavior/AgentCacheTimerSection.tsx | 31 +- .../agents/launch/AgentDefaultSetting.tsx | 22 +- .../agents/launch/AgentDetectionCatalog.tsx | 154 ++--- .../launch/AgentLaunchSettingsCatalog.tsx | 55 +- .../launch/AgentLaunchSettingsLoading.tsx | 14 +- .../agents/runtime/AgentRuntimeSetting.tsx | 144 +++-- .../CodexTerminalServerIsolationSetting.tsx | 50 +- .../surfaces/AgentDefaultSurfaceSection.tsx | 93 +-- .../settings/appearance/AppearancePane.tsx | 39 +- .../artifacts/ArtifactsSettingsPane.tsx | 213 ++++--- .../automations/AutomationsSettingsPane.tsx | 230 +++---- .../browser/BrowserDefaultZoomSetting.tsx | 2 +- .../browser/BrowserHomePageSetting.tsx | 2 +- .../settings/browser/BrowserPane.tsx | 233 ++++--- .../browser/BrowserSearchEngineSetting.tsx | 2 +- .../browser/BrowserSitePermissionsSetting.tsx | 2 +- .../BrowserExtensionsExperimentalSetting.tsx | 2 +- .../extensions/BrowserExtensionsSection.tsx | 2 +- .../passwords/BrowserPasswordsSection.tsx | 2 +- .../profiles/BrowserSessionCookiesSection.tsx | 2 +- .../routing/BrowserLinkRoutingSetting.tsx | 2 +- .../BrowserTerminalLinkActionsSetting.tsx | 82 ++- .../settings/browser/use/BrowserUsePane.tsx | 4 +- .../settings/cli/install/CliSection.tsx | 273 ++++---- .../cli/install/WslCliRegistration.tsx | 14 +- .../settings/computer-use/ComputerUsePane.tsx | 134 ++-- .../ComputerUseSkillSetupPanel.tsx | 1 + .../DeveloperPermissionsPane.tsx | 43 +- .../LocalNetworkConnectionTest.tsx | 2 +- .../CollapseUnchangedRegionsSetting.tsx | 2 +- .../editor/DiffShowWhitespaceSetting.tsx | 2 +- .../settings/editor/EditorWordWrapSetting.tsx | 2 +- .../editor/GeneralEditorSettingsSection.tsx | 40 +- .../editor/MarkdownDefaultViewSetting.tsx | 2 +- .../form-controls/SettingsFormControls.tsx | 1 + .../settings/general/GeneralPane.tsx | 36 +- .../general/GeneralSupportSection.tsx | 23 +- .../GeneralWorkspaceSettingsSection.tsx | 31 +- .../general/WorkspaceDirectorySetting.tsx | 2 +- .../integrations/IntegrationsPane.tsx | 97 +-- .../mobile/MobileAutoRestoreFitSection.tsx | 2 +- .../components/settings/mobile/MobilePane.tsx | 156 ++--- .../settings/mobile/MobileSettingsPane.tsx | 129 ++-- .../MobileEmulatorAgentControlRow.tsx | 33 +- .../emulator/MobileEmulatorSettingsPane.tsx | 157 ++--- .../orchestration/OrchestrationPane.tsx | 123 ++-- .../settings-advanced-section-renderers.tsx | 3 + .../settings-capability-section-renderers.tsx | 5 + .../settings-git-task-section-renderers.tsx | 2 + ...gs-interface-primary-section-renderers.tsx | 3 + ...-interface-secondary-section-renderers.tsx | 1 + .../settings-project-section-renderer.tsx | 1 + ...ings-remote-security-section-renderers.tsx | 1 + ...tings-setup-workflow-section-renderers.tsx | 7 + .../repository/RepositoryFormatterSection.tsx | 9 +- .../RepositoryGitHubAccountSection.tsx | 2 +- .../RepositoryJiraProjectSection.tsx | 2 +- .../settings/repository/RepositoryPane.tsx | 52 +- .../RepositoryRemoveProjectButton.tsx | 2 +- .../execution/RepositoryForkSyncSection.tsx | 2 +- .../execution/RepositoryHooksSection.tsx | 312 +++++----- .../execution/RepositoryHostSetupsSection.tsx | 2 +- .../RepositoryWorktreeDefaultsSection.tsx | 6 +- .../execution/SparsePresetSettingsSection.tsx | 203 +++--- .../execution/WorktreeSymlinksSection.tsx | 299 +++++---- .../execution/sparse-preset-settings-row.tsx | 2 +- .../repository/mcp/McpConfigFileRow.tsx | 2 +- .../repository/mcp/McpConfigSection.tsx | 107 ++-- .../repository/mcp/McpMissingConfigList.tsx | 2 +- .../RepositorySourceControlAiActionRows.tsx | 2 +- ...RepositorySourceControlAiCustomCommand.tsx | 2 +- .../RepositorySourceControlAiEnablement.tsx | 5 +- ...orySourceControlAiHostedReviewDefaults.tsx | 2 +- .../RepositorySourceControlAiSection.tsx | 100 +-- .../updates/GeneralRemoteServerUpdates.tsx | 2 +- .../section-layout/SearchableSetting.tsx | 2 +- .../settings/section-layout/SettingsGroup.tsx | 72 +++ .../section-layout/SettingsSection.tsx | 8 +- .../section-layout/SettingsSectionStack.tsx | 19 +- .../SessionHistoryComputerRow.tsx | 3 +- .../SessionHistorySettingsPane.tsx | 10 +- .../SessionSearchAdvancedSection.tsx | 2 +- .../skills/linear/LinearAgentSkillGuide.tsx | 35 +- .../skills/linear/LinearAgentSkillNotes.tsx | 31 +- .../skills/linear/LinearAgentSkillPane.tsx | 4 +- .../sharing/ShareSkillsSettingsPane.tsx | 290 ++++----- .../AutoRenameBranchFromWorkSetting.tsx | 2 +- .../source-control/CommitMessageAiPane.tsx | 30 +- .../settings/source-control/GitPane.tsx | 13 +- .../GitProviderApiBudgetPane.tsx | 7 +- .../HostedReviewCreationDefaults.tsx | 2 +- .../SourceControlAiActionRecipeDefaults.tsx | 2 +- .../settings/tasks/TaskSourceProviderCard.tsx | 6 +- .../components/settings/tasks/TasksPane.tsx | 237 ++++--- .../terminal/TerminalAdvancedSection.tsx | 454 +++++++------- .../terminal/TerminalInteractionSection.tsx | 555 ++++++++--------- .../settings/terminal/TerminalPane.tsx | 38 +- .../appearance/TerminalRenderingSection.tsx | 212 ++++--- .../platform/TerminalWindowsShellSection.tsx | 220 ++++--- .../ManageSessionsSection.tsx | 31 +- .../GeneralUpdateSettingsSection.test.tsx | 44 ++ .../updates/GeneralUpdateSettingsSection.tsx | 44 +- .../updates/ReleaseChannelSection.tsx | 11 +- .../settings/updates/UpdateDelaySetting.tsx | 2 +- .../EphemeralVmsExperimentalSetting.tsx | 2 +- .../wsl/hosts/WslHostsExperimentalSetting.tsx | 2 +- .../examples/SkillUsageExamplesSection.tsx | 10 +- .../skills/setup/AgentSkillSetupPanel.tsx | 12 +- 129 files changed, 5248 insertions(+), 5047 deletions(-) create mode 100644 src/renderer/src/components/settings/section-layout/SettingsGroup.tsx create mode 100644 src/renderer/src/components/settings/updates/GeneralUpdateSettingsSection.test.tsx diff --git a/src/renderer/src/components/dashboard/AgentDashboardExperimentalSetting.tsx b/src/renderer/src/components/dashboard/AgentDashboardExperimentalSetting.tsx index 0d87a50538c..c3eebc3c1ed 100644 --- a/src/renderer/src/components/dashboard/AgentDashboardExperimentalSetting.tsx +++ b/src/renderer/src/components/dashboard/AgentDashboardExperimentalSetting.tsx @@ -32,7 +32,7 @@ export function AgentDashboardExperimentalSetting({ 'Kanban board for monitoring agents across worktrees, in-window or as a pop-out.' )} keywords={getExperimentalSearchEntry().agentDashboard.keywords} - className="space-y-3 py-2" + className="space-y-3 py-3" id="experimental-agent-dashboard" >
- {translate( - 'auto.components.settings.AccountsPane.72b36ea174', - 'Optional. Orca can use your normal Claude login; add accounts only if you want quick switching without moving chat sessions.' - )} -
-- {isRemoteAccountScope - ? translate( - 'accounts.remoteScopeAccountsAddHere', - 'Showing accounts managed by {{value0}}. New accounts sign in there; you finish in this device’s browser.', - { value0: accountRuntimeSentenceLabel } - ) - : translate( - 'auto.components.settings.AccountsPane.c0a52abfc5', - 'Showing accounts for {{value0}}. New accounts are added there.', - { value0: accountRuntimeSentenceLabel } - )} -
-- {translate( - 'accounts.claude.systemDefaultIsSaved', - 'System default is signed in as {{value0}}, which is also a saved account. An earlier Orca version may have copied that login there. If it is not your own login, select System default and run claude /login.', - { value0: systemDefaultEmail } - )} + {isRemoteAccountScope + ? translate( + 'accounts.remoteScopeAccountsAddHere', + 'Showing accounts managed by {{value0}}. New accounts sign in there; you finish in this device’s browser.', + { value0: accountRuntimeSentenceLabel } + ) + : translate( + 'auto.components.settings.AccountsPane.c0a52abfc5', + 'Showing accounts for {{value0}}. New accounts are added there.', + { value0: accountRuntimeSentenceLabel } + )}
-+ {translate( + 'accounts.claude.systemDefaultIsSaved', + 'System default is signed in as {{value0}}, which is also a saved account. An earlier Orca version may have copied that login there. If it is not your own login, select System default and run claude /login.', + { value0: systemDefaultEmail } + )} +
+- {translate( - 'auto.components.settings.AccountsPane.cedfab35ab', - 'Optional. Orca can use your normal Codex login; add accounts only if you want quick switching in Orca.' - )} -
-- {isRemoteAccountScope - ? translate( - 'auto.components.settings.AccountsPane.remoteScopeAuthContext', - 'Each account keeps its own sign-in context on {{value0}}.', - { value0: accountRuntimeSentenceLabel } - ) - : translate( - 'auto.components.settings.AccountsPane.340d6f7a85', - 'Each account keeps its own local sign-in context in Orca. Account auth stays on this device.' +
+ {isRemoteAccountScope ? translate( - 'accounts.remoteScopeAccountsAddHere', - 'Showing accounts managed by {{value0}}. New accounts sign in there; you finish in this device’s browser.', + 'auto.components.settings.AccountsPane.remoteScopeAuthContext', + 'Each account keeps its own sign-in context on {{value0}}.', { value0: accountRuntimeSentenceLabel } ) : translate( - 'auto.components.settings.AccountsPane.c0a52abfc5', - 'Showing accounts for {{value0}}. New accounts are added there.', - { value0: accountRuntimeSentenceLabel } + 'auto.components.settings.AccountsPane.340d6f7a85', + 'Each account keeps its own local sign-in context in Orca. Account auth stays on this device.' )} -
-+ {isRemoteAccountScope + ? translate( + 'accounts.remoteScopeAccountsAddHere', + 'Showing accounts managed by {{value0}}. New accounts sign in there; you finish in this device’s browser.', + { value0: accountRuntimeSentenceLabel } + ) + : translate( + 'auto.components.settings.AccountsPane.c0a52abfc5', + 'Showing accounts for {{value0}}. New accounts are added there.', + { value0: accountRuntimeSentenceLabel } + )} +
+- {translate( - 'accounts.antigravity.signIn', - 'Start agy on this host and complete its browser sign-in, then save the current account. To add a different account, use /logout in agy and sign in again.' - )}{' '} - - {translate('accounts.antigravity.docs', 'Sign-in instructions')} - -
- {error && ( -- {error} -
- )} - {!state && error && ( -- {state.currentAccount - ? (state.currentAccount.email ?? - translate('accounts.antigravity.identityUnknown', 'Signed-in identity unavailable')) - : translate('accounts.antigravity.signedOut', 'No native agy account is signed in.')} +
+ {translate( + 'accounts.antigravity.signIn', + 'Start agy on this host and complete its browser sign-in, then save the current account. To add a different account, use /logout in agy and sign in again.' + )}{' '} + + {translate('accounts.antigravity.docs', 'Sign-in instructions')} +
- {state.selectedAccountId && state.activeAccountId !== state.selectedAccountId && ( -- {windowsHost - ? translate( - 'accounts.antigravity.windowsChanged', - 'The host default account changed. Select a saved account to apply it again.' - ) - : translate( - 'accounts.antigravity.changed', - 'The native account changed. Select a saved account again before launching agy.' - )} + {error && ( +
+ {error}
)} -- {usage.error ?? formatUsageReading(usage)} -
)} - {state.accounts.map((account) => ( -- {account.email ?? translate('accounts.antigravity.saved', 'Saved Google account')} + {state && ( +
+ {state.currentAccount + ? (state.currentAccount.email ?? + translate( + 'accounts.antigravity.identityUnknown', + 'Signed-in identity unavailable' + )) + : translate( + 'accounts.antigravity.signedOut', + 'No native agy account is signed in.' + )} +
+ {state.selectedAccountId && state.activeAccountId !== state.selectedAccountId && ( ++ {windowsHost + ? translate( + 'accounts.antigravity.windowsChanged', + 'The host default account changed. Select a saved account to apply it again.' + ) + : translate( + 'accounts.antigravity.changed', + 'The native account changed. Select a saved account again before launching agy.' + )}
- {account.usage !== undefined && ( -- {account.usage - ? translate( - 'accounts.antigravity.lastReading', - '{{reading}} · Read {{time}}', - { - reading: formatUsageReading(account.usage), - time: formatTimeAgo(account.usage.updatedAt) - } - ) - : translate('accounts.antigravity.noReading', 'Usage unknown: not read yet')} -
- )} - {state.activeAccountId === account.id && ( -- {windowsHost - ? translate( - 'accounts.antigravity.windowsSessions', - 'Select applies and verifies the host default agy credential. Command choices and later account changes are handled by agy. Existing sessions may keep their previous account.' - ) - : translate( - 'accounts.antigravity.sessions', - 'Selection applies to new agy sessions on this host. Existing sessions may keep their previous account.' - )} -
- {chats && chatRuntime.kind === 'active' ? ( -- {translate('settings.agents.chatRuntime', 'Chat runtime')} -
-+ {usage.error ?? formatUsageReading(usage)} +
+ )} + {state.accounts.map((account) => ( ++ {account.email ?? + translate('accounts.antigravity.saved', 'Saved Google account')} +
+ {account.usage !== undefined && ( ++ {account.usage + ? translate( + 'accounts.antigravity.lastReading', + '{{reading}} · Read {{time}}', + { + reading: formatUsageReading(account.usage), + time: formatTimeAgo(account.usage.updatedAt) + } + ) + : translate( + 'accounts.antigravity.noReading', + 'Usage unknown: not read yet' + )} +
+ )} + {state.activeAccountId === account.id && ( ++ {windowsHost + ? translate( + 'accounts.antigravity.windowsSessions', + 'Select applies and verifies the host default agy credential. Command choices and later account changes are handled by agy. Existing sessions may keep their previous account.' + ) + : translate( + 'accounts.antigravity.sessions', + 'Selection applies to new agy sessions on this host. Existing sessions may keep their previous account.' + )} +
+ {chats && chatRuntime.kind === 'active' ? ( ++ {translate('settings.agents.chatRuntime', 'Chat runtime')} +
+- {translate( - 'auto.components.settings.CursorAccountsSection.subtitle', - 'Shows your Cursor plan usage from the sign-in already on this computer. Orca only reads it — it never changes your Cursor login.' - )} -
-- {translate('auto.components.settings.CursorAccountsSection.loading', 'Loading…')} -
- ) : signedIn ? ( - <> -- {status?.email ?? - status?.displayName ?? - translate('auto.components.settings.CursorAccountsSection.signedIn', 'Signed in')} -
+- {tokenFresh - ? sourceLabel - ? translate( - 'auto.components.settings.CursorAccountsSection.signedInFrom', - 'Signed in. Orca reads the session stored in {{source}}.', - { source: sourceLabel } - ) - : translate( - 'auto.components.settings.CursorAccountsSection.signedInGeneric', - 'Signed in. Orca reads the Cursor session stored on this computer.' - ) - : translate( - 'auto.components.settings.CursorAccountsSection.expired', - 'Sign-in expired — run cursor-agent login on the computer running Orca, then click Refresh usage.' + {translate('auto.components.settings.CursorAccountsSection.loading', 'Loading…')} +
+ ) : signedIn ? ( + <> ++ {status?.email ?? + status?.displayName ?? + translate( + 'auto.components.settings.CursorAccountsSection.signedIn', + 'Signed in' )} -
- > - ) : ( - <> -- {translate( - 'auto.components.settings.CursorAccountsSection.signedOut', - 'No Cursor sign-in found on this computer' - )} -
-- {translate( - 'auto.components.settings.CursorAccountsSection.signedOutHelp', - 'Sign in with Cursor IDE, or run cursor-agent login in a terminal, then click Refresh usage here.' - )} -
- > - )} - {status?.error ?{status.error}
: null} -- {translate( - 'auto.components.settings.CursorAccountsSection.resets', - 'Resets {{when}}', - { when: (monthly ?? pools[0])?.resetDescription ?? '' } - )} -
- ) : null} - {staleUsageError ? ( -- {translate( - 'auto.components.settings.CursorAccountsSection.staleUsage', - 'Last known usage — the latest refresh failed: {{reason}}', - { reason: staleUsageError } - )} -
- ) : null} + ++ {tokenFresh + ? sourceLabel + ? translate( + 'auto.components.settings.CursorAccountsSection.signedInFrom', + 'Signed in. Orca reads the session stored in {{source}}.', + { source: sourceLabel } + ) + : translate( + 'auto.components.settings.CursorAccountsSection.signedInGeneric', + 'Signed in. Orca reads the Cursor session stored on this computer.' + ) + : translate( + 'auto.components.settings.CursorAccountsSection.expired', + 'Sign-in expired — run cursor-agent login on the computer running Orca, then click Refresh usage.' + )} +
+ > + ) : ( + <> ++ {translate( + 'auto.components.settings.CursorAccountsSection.signedOut', + 'No Cursor sign-in found on this computer' + )} +
++ {translate( + 'auto.components.settings.CursorAccountsSection.signedOutHelp', + 'Sign in with Cursor IDE, or run cursor-agent login in a terminal, then click Refresh usage here.' + )} +
+ > + )} + {status?.error ?{status.error}
: null}{unavailableReason}
-+ {translate( + 'auto.components.settings.CursorAccountsSection.resets', + 'Resets {{when}}', + { when: (monthly ?? pools[0])?.resetDescription ?? '' } + )} +
+ ) : null} + {staleUsageError ? ( ++ {translate( + 'auto.components.settings.CursorAccountsSection.staleUsage', + 'Last known usage — the latest refresh failed: {{reason}}', + { reason: staleUsageError } + )} +
+ ) : null} +{unavailableReason}
+- {translate( - 'auto.components.settings.GrokAccountsSection.f6e5d4c3b2', - 'Shows weekly credit usage from your Grok CLI sign-in (session file ~/.grok/auth.json).' - )} -
-- {translate('auto.components.settings.GrokAccountsSection.ad47a33f72', 'Loading…')} -
- ) : signedIn ? ( - <> -- {status?.email ?? - translate('auto.components.settings.GrokAccountsSection.b2c3d4e5f6', 'Signed in')} -
+- {tokenFresh - ? translate( - 'auto.components.settings.GrokAccountsSection.b36fa2c908', - 'Signed in. Orca reads the Grok CLI session stored on disk.' - ) - : translate( - 'auto.components.settings.GrokAccountsSection.f08c41de73', - 'Session expired — run grok on the computer running Orca and wait for it to start. If prompted, complete sign-in, then click Refresh usage. No chat message is needed.' + {translate('auto.components.settings.GrokAccountsSection.ad47a33f72', 'Loading…')} +
+ ) : signedIn ? ( + <> ++ {status?.email ?? + translate( + 'auto.components.settings.GrokAccountsSection.b2c3d4e5f6', + 'Signed in' )} -
- > - ) : ( - <> -- {translate( - 'auto.components.settings.GrokAccountsSection.e5f6a7b8c9', - 'Not signed in to Grok CLI' - )} -
-- {translate( - 'auto.components.settings.GrokAccountsSection.f6a7b8c9d0', - 'In a terminal, run grok login, then click Refresh usage here.' - )} -
- > - )} - {status?.error ?{status.error}
: null} -+ {tokenFresh + ? translate( + 'auto.components.settings.GrokAccountsSection.b36fa2c908', + 'Signed in. Orca reads the Grok CLI session stored on disk.' + ) + : translate( + 'auto.components.settings.GrokAccountsSection.f08c41de73', + 'Session expired — run grok on the computer running Orca and wait for it to start. If prompted, complete sign-in, then click Refresh usage. No chat message is needed.' + )} +
+ > + ) : ( + <> ++ {translate( + 'auto.components.settings.GrokAccountsSection.e5f6a7b8c9', + 'Not signed in to Grok CLI' + )} +
++ {translate( + 'auto.components.settings.GrokAccountsSection.f6a7b8c9d0', + 'In a terminal, run grok login, then click Refresh usage here.' + )} +
+ > + )} + {status?.error ?{status.error}
: null}{unavailableReason}
-{unavailableReason}
+- {translate( - 'accounts.managedData.description', - 'Add accounts by running this command in a terminal on the Orca host. Selection applies to new explicit agent launches on that host; direct SSH relay and Windows-hosted WSL launches use their own credentials.' + : translate('auto.lib.agent.catalog.fc80296033', 'Devin') + } + description={translate( + 'accounts.managedData.description', + 'Add accounts by running this command in a terminal on the Orca host. Selection applies to new explicit agent launches on that host; direct SSH relay and Windows-hosted WSL launches use their own credentials.' + )} + > +
{command}
+ + {translate( + 'accounts.managedData.upgrade', + 'If accounts do not appear, update or restart the Orca host.' + )} +
+ )} + {error && ( ++ {error} +
)} - -{command}
- - {translate( - 'accounts.managedData.upgrade', - 'If accounts do not appear, update or restart the Orca host.' - )} -
- )} - {error && ( -- {error} -
- )} {state && ( <> -{account.integrations.join(', ')}
@@ -232,6 +238,6 @@ export function ManagedDataAccountsSection({ - + ) } diff --git a/src/renderer/src/components/settings/accounts/providers/accounts-pane-provider-setting-sections.tsx b/src/renderer/src/components/settings/accounts/providers/accounts-pane-provider-setting-sections.tsx index bef390de34c..3c971a225e1 100644 --- a/src/renderer/src/components/settings/accounts/providers/accounts-pane-provider-setting-sections.tsx +++ b/src/renderer/src/components/settings/accounts/providers/accounts-pane-provider-setting-sections.tsx @@ -7,216 +7,217 @@ import { SearchableSetting } from '../../section-layout/SearchableSetting' import type { AccountsPaneSectionModel } from '../accounts-pane-types' import { OpenCodeGoCredentials } from '../usage/accounts-pane-opencode-credentials' import { DebouncedSettingsTextInput } from '../../form-controls/DebouncedSettingsTextInput' +import { SettingsGroup } from '../../section-layout/SettingsGroup' export function renderGeminiAccountsSection(model: AccountsPaneSectionModel): React.JSX.Element { const { localAccountRuntimeSentenceLabel, recordFeatureInteraction, settings, updateSettings } = model return ( -- {translate( - 'auto.components.settings.AccountsPane.973741a871', - 'Keep existing Gemini CLI sessions available. Gemini credentials do not sign you into Antigravity.' - )} -
-- {translate( - 'auto.components.settings.AccountsPane.ea631977b5', - 'Configure OpenCode Go provider settings.' - )} -
-
- {translate(
- 'auto.components.settings.AccountsPane.62ab430f94',
- "Paste the full Cookie header from your browser's DevTools → Network → any opencode.ai request, including __Host-console_session (e.g."
- )}{' '}
-
- {translate(
- 'auto.components.settings.AccountsPane.37b4b4a3f7',
- 'auth=…; __Host-console_session=…'
- )}
-
- {translate(
- 'auto.components.settings.AccountsPane.d5267cce63',
- '). The auth cookie still covers workspace discovery; auth alone is not enough for usage. OpenCode Go auth is web-based and shared across Windows and WSL terminals.'
- )}
-
- {translate(
- 'auto.components.settings.AccountsPane.51c9104e13',
- 'Find this in the URL after logging into opencode.ai (e.g.'
- )}{' '}
-
+ description={translate(
+ 'auto.components.settings.AccountsPane.0335bd31d5',
+ 'Paste the full opencode.ai Cookie header, including __Host-console_session, for rate limit fetching.'
+ )}
+ keywords={['opencode', 'cookie', 'session', 'console', 'rate limit', 'status bar']}
+ className="space-y-2 py-3"
+ >
+
- ).
-
+ {translate(
+ 'auto.components.settings.AccountsPane.62ab430f94',
+ "Paste the full Cookie header from your browser's DevTools → Network → any opencode.ai request, including __Host-console_session (e.g."
+ )}{' '}
+
+ {translate(
+ 'auto.components.settings.AccountsPane.37b4b4a3f7',
+ 'auth=…; __Host-console_session=…'
+ )}
+
+ {translate(
+ 'auto.components.settings.AccountsPane.d5267cce63',
+ '). The auth cookie still covers workspace discovery; auth alone is not enough for usage. OpenCode Go auth is web-based and shared across Windows and WSL terminals.'
+ )}
+
+ {translate(
+ 'auto.components.settings.AccountsPane.51c9104e13',
+ 'Find this in the URL after logging into opencode.ai (e.g.'
+ )}{' '}
+
+ {translate(
+ 'auto.components.settings.AccountsPane.ae3b21eb6c',
+ 'opencode.ai/workspace/wrk_…/go'
+ )}
+
+ ).
+
- {translate( - 'auto.components.settings.AccountsPane.usageTracking', - 'Configure MiniMax usage tracking for your account.' - )} -
-{accessNotice}
- ) : ( -- {configured - ? usageCredentialStoredLabel(host) - : translate( - 'auto.components.settings.AccountsPane.credentialsNotSet', - 'Credentials not set' - )} -
- )} -{miniMaxStorageHelp(host)}
-- {translate( - 'auto.components.settings.AccountsPane.174fb408f9', - 'Leave these defaults alone unless MiniMax usage refresh points at the wrong workspace or model.' - )} -
+{accessNotice}
+ ) : ( ++ {configured + ? usageCredentialStoredLabel(host) + : translate( + 'auto.components.settings.AccountsPane.credentialsNotSet', + 'Credentials not set' + )} +
+ )} +{miniMaxStorageHelp(host)}
+ {translate( + 'auto.components.settings.AccountsPane.174fb408f9', + 'Leave these defaults alone unless MiniMax usage refresh points at the wrong workspace or model.' + )} +
+- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.subtitle', - 'Track Z.AI or Zhipu (BigModel) GLM Coding Plan usage in the status bar. Save the plan API key here — no ZCode CLI setup needed.' - )} -
-{accessNotice}
- ) : detailsUnavailable ? ( -- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.detailsUnavailable', - 'Plan credential details are only readable on the computer running Orca.' - )} -
- ) : apiKeyConfigured ? ( - <> -- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.keyStored', - 'API key saved · {{value0}}', - { value0: siteLabel(site ?? 'zai') } - )} -
-- {hostLabel === null - ? translate( - 'auto.components.settings.ZcodePlanAccountsSection.keyStoredHelp', - 'Stored locally and sent only to the selected site for usage refreshes. It takes priority over the ZCode CLI sign-in.' - ) - : translate( - 'auto.components.settings.ZcodePlanAccountsSection.keyStoredOnHostHelp', - 'Stored on {{host}} and sent from there only to the selected site for usage refreshes. It takes priority over the ZCode CLI sign-in.', - { host: hostLabel } - )} -
- > - ) : status?.zcodeCliConfigured ? ( - <> -- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.usingCli', - 'Using the ZCode CLI sign-in' - )} -
-- {hostLabel === null - ? translate( - 'auto.components.settings.ZcodePlanAccountsSection.usingCliHelp', - 'Orca reads the selected Coding Plan from the ZCode CLI credential store on this computer. Save an API key below to link the plan here instead.' - ) - : translate( - 'auto.components.settings.ZcodePlanAccountsSection.usingCliOnHostHelp', - 'Orca reads the selected Coding Plan from the ZCode CLI credential store on {{host}}. Save an API key below to link the plan there instead.', - { host: hostLabel } - )} -
- > - ) : ( - <> -- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.notConfigured', - 'No GLM Coding Plan linked' - )} -
-- {hostLabel === null - ? translate( - 'auto.components.settings.ZcodePlanAccountsSection.notConfiguredHelp', - 'Save the plan API key below, or sign in with the ZCode CLI on this computer.' - ) - : translate( - 'auto.components.settings.ZcodePlanAccountsSection.notConfiguredOnHostHelp', - 'Save the plan API key below, or sign in with the ZCode CLI on {{host}}.', - { host: hostLabel } - )} -
- > - )} - {staleUsageError ?{staleUsageError}
: null} -- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.hostOnly', - 'Change the plan site and API key in the desktop app on the computer running Orca.' - )} -
- ) : null} - -{unreadableNotice}
- ) : null} -{accessNotice}
+ ) : detailsUnavailable ? ( ++ {translate( + 'auto.components.settings.ZcodePlanAccountsSection.detailsUnavailable', + 'Plan credential details are only readable on the computer running Orca.' + )} +
+ ) : apiKeyConfigured ? ( + <> ++ {translate( + 'auto.components.settings.ZcodePlanAccountsSection.keyStored', + 'API key saved · {{value0}}', + { value0: siteLabel(site ?? 'zai') } + )} +
++ {hostLabel === null + ? translate( + 'auto.components.settings.ZcodePlanAccountsSection.keyStoredHelp', + 'Stored locally and sent only to the selected site for usage refreshes. It takes priority over the ZCode CLI sign-in.' + ) + : translate( + 'auto.components.settings.ZcodePlanAccountsSection.keyStoredOnHostHelp', + 'Stored on {{host}} and sent from there only to the selected site for usage refreshes. It takes priority over the ZCode CLI sign-in.', + { host: hostLabel } + )} +
+ > + ) : status?.zcodeCliConfigured ? ( + <> ++ {translate( + 'auto.components.settings.ZcodePlanAccountsSection.usingCli', + 'Using the ZCode CLI sign-in' + )} +
++ {hostLabel === null + ? translate( + 'auto.components.settings.ZcodePlanAccountsSection.usingCliHelp', + 'Orca reads the selected Coding Plan from the ZCode CLI credential store on this computer. Save an API key below to link the plan here instead.' + ) + : translate( + 'auto.components.settings.ZcodePlanAccountsSection.usingCliOnHostHelp', + 'Orca reads the selected Coding Plan from the ZCode CLI credential store on {{host}}. Save an API key below to link the plan there instead.', + { host: hostLabel } + )} +
+ > + ) : ( + <> ++ {translate( + 'auto.components.settings.ZcodePlanAccountsSection.notConfigured', + 'No GLM Coding Plan linked' + )} +
++ {hostLabel === null + ? translate( + 'auto.components.settings.ZcodePlanAccountsSection.notConfiguredHelp', + 'Save the plan API key below, or sign in with the ZCode CLI on this computer.' + ) + : translate( + 'auto.components.settings.ZcodePlanAccountsSection.notConfiguredOnHostHelp', + 'Save the plan API key below, or sign in with the ZCode CLI on {{host}}.', + { host: hostLabel } + )} +
+ > + )} + {staleUsageError ?{staleUsageError}
: null} +- {translate( - 'auto.components.settings.ZcodePlanAccountsSection.keyHelp', - 'The same key your coding tools use for the plan (for example Claude Code with ANTHROPIC_BASE_URL pointed at the site). Switching the site above changes which host receives it.' - )} -
- - {!webClient && hostLabel === null ?+ {translate( + 'auto.components.settings.ZcodePlanAccountsSection.hostOnly', + 'Change the plan site and API key in the desktop app on the computer running Orca.' + )} +
+ ) : null} - {usageWindows.length > 0 ? (
- {translate(
- 'auto.components.settings.ZcodePlanAccountsSection.planLevel',
- 'Plan: {{value0}}',
- { value0: usage.planType }
+ {unreadableNotice}
+ {translate(
+ 'auto.components.settings.ZcodePlanAccountsSection.keyHelp',
+ 'The same key your coding tools use for the plan (for example Claude Code with ANTHROPIC_BASE_URL pointed at the site). Switching the site above changes which host receives it.'
+ )}
+
+ {translate(
+ 'auto.components.settings.ZcodePlanAccountsSection.planLevel',
+ 'Plan: {{value0}}',
+ { value0: usage.planType }
+ )}
+
@@ -196,7 +195,7 @@ function OrcaCloudDevSubsection(): React.JSX.Element { )}
)} - + ) } @@ -298,29 +297,28 @@ export function DevToolsPane(): React.JSX.Element { return (
- {translate(
- 'auto.components.settings.ExperimentalPane.ca2219fe5e',
- 'Shows a small animated pet pinned to the bottom-right corner. Pick a character (Claudino, OpenCode, Gremlin) or upload your own PNG, APNG, GIF, WebP, JPG, or SVG from the status-bar pet menu. Hide it any time from the same menu without disabling this setting.'
+ {showPet ? (
+
+ {translate(
+ 'auto.components.settings.ExperimentalPane.ca2219fe5e',
+ 'Shows a small animated pet pinned to the bottom-right corner. Pick a character (Claudino, OpenCode, Gremlin) or upload your own PNG, APNG, GIF, WebP, JPG, or SVG from the status-bar pet menu. Hide it any time from the same menu without disabling this setting.'
+ )}
+
+ {translate( + 'auto.components.settings.ExperimentalPane.a20d5ea365', + 'Keeps a pane-level highlight visible after terminal bell or agent-completion events until you interact with that pane. Experimental while we tune the signal.' + )} +
+- {translate( - 'auto.components.settings.ExperimentalPane.a20d5ea365', - 'Keeps a pane-level highlight visible after terminal bell or agent-completion events until you interact with that pane. Experimental while we tune the signal.' - )} -
-- {translate( - 'auto.components.settings.ExperimentalPane.agentHibernation.copy', - 'Stops idle background agent terminals after the configured idle window and resumes supported sessions when you open them again. Agent sleep preserves launch options for agents started by Orca. Manually started agents may resume with your current Orca defaults. Experimental while we tune the safety model.' - )} -
-+ {translate( + 'auto.components.settings.ExperimentalPane.agentHibernation.copy', + 'Stops idle background agent terminals after the configured idle window and resumes supported sessions when you open them again. Agent sleep preserves launch options for agents started by Orca. Manually started agents may resume with your current Orca defaults. Experimental while we tune the safety model.' + )} +
+- {translate( - 'auto.components.settings.ExperimentalPane.newWorktreeCardStyle.copy', - 'Preview updated worktree-card layout, metadata placement, card-display menu options, and status presentation.' - )} -
+ onChange={() => + updateSettings({ + experimentalAgentHibernation: !agentHibernationEnabled + }) + } + />+ {translate( + 'auto.components.settings.ExperimentalPane.newWorktreeCardStyle.copy', + 'Preview updated worktree-card layout, metadata placement, card-display menu options, and status presentation.' + )} +
+{description}
-{description}
- {translate( +
- {translate( - 'auto.components.settings.artifacts.signInDescription', - 'Use your Orca account to upload artifacts and manage their public links.' - )} -
-- {sharingEnabled +
+ {translate( + 'auto.components.settings.artifacts.signInDescription', + 'Use your Orca account to upload artifacts and manage their public links.' + )} +
+{step.title}
++ {step.description} +
+{step.title}
-{step.description}
-- {translate( - 'auto.components.settings.automations.howItWorksDescription', - 'Schedule agent work once, then let Orca create each run and keep its results together.' - )} -
+ bodyClassName="py-4" + > ++ {translate( + 'auto.components.settings.automations.defineStepTitle', + 'Describe the work' + )} +
++ {translate( + 'auto.components.settings.automations.defineStepDescription', + 'Choose a project, agent, prompt, and schedule.' + )} +
++ {translate( + 'auto.components.settings.automations.runStepTitle', + 'Orca starts each run' + )} +
++ {translate( + 'auto.components.settings.automations.runStepDescription', + 'The selected agent gets a fresh workspace when the schedule is due.' + )} +
++ {translate( + 'auto.components.settings.automations.reviewStepTitle', + 'Review the results' + )} +
++ {translate( + 'auto.components.settings.automations.reviewStepDescription', + 'Inspect recent runs and continue the work whenever you need to.' + )} +
+- {translate( - 'auto.components.settings.automations.defineStepTitle', - 'Describe the work' - )} -
-- {translate( - 'auto.components.settings.automations.defineStepDescription', - 'Choose a project, agent, prompt, and schedule.' - )} -
-- {translate( - 'auto.components.settings.automations.runStepTitle', - 'Orca starts each run' - )} -
-- {translate( - 'auto.components.settings.automations.runStepDescription', - 'The selected agent gets a fresh workspace when the schedule is due.' - )} -
-- {translate( - 'auto.components.settings.automations.reviewStepTitle', - 'Review the results' - )} -
-- {translate( - 'auto.components.settings.automations.reviewStepDescription', - 'Inspect recent runs and continue the work whenever you need to.' - )} -
-{translate('auto.components.settings.BrowserUsePane.b8a1f2d84d', 'Agent Browser Use')} @@ -107,7 +107,7 @@ export function BrowserUseSetup({ } return ( -
diff --git a/src/renderer/src/components/settings/cli/install/CliSection.tsx b/src/renderer/src/components/settings/cli/install/CliSection.tsx
index 70bc562d4a3..080bcabf646 100644
--- a/src/renderer/src/components/settings/cli/install/CliSection.tsx
+++ b/src/renderer/src/components/settings/cli/install/CliSection.tsx
@@ -21,6 +21,7 @@ import {
getSkillDiscoveryTargetForRuntime
} from '../../../../lib/skill-runtime-command'
import { WslCliRegistration } from './WslCliRegistration'
+import { SettingsGroup } from '../../section-layout/SettingsGroup'
import { useCliRegistrationActions } from './use-cli-registration-actions'
import { useLocalCliSkillFreshnessName } from '../../../../hooks/use-local-cli-skill-freshness-name'
import { translate } from '@/i18n/i18n'
@@ -149,157 +150,155 @@ export function CliSection({
const canRevealCommandPath =
status?.commandPath != null && ['installed', 'stale', 'conflict'].includes(status.state)
+ const shellCommandLabel = translate(
+ 'auto.components.settings.CliSection.38edbb5721',
+ 'Shell command'
+ )
+ const agentSkillsLabel = translate(
+ 'auto.components.settings.CliSection.04873eea3e',
+ 'Agent skills'
+ )
+
return (
-
- {translate(
- 'auto.components.settings.CliSection.outsideOrcaDescription',
- 'Orca terminals already have `orca`. Turn this on to use `orca` from other terminals outside Orca.'
- )}
-
+ {loading
+ ? translate(
+ 'auto.components.settings.CliSection.d363e5929b',
+ 'Checking CLI registration…'
+ )
+ : (status?.detail ?? getInstallDescription(currentPlatform))}
+
- {loading
- ? translate(
- 'auto.components.settings.CliSection.d363e5929b',
- 'Checking CLI registration…'
- )
- : (status?.detail ?? getInstallDescription(currentPlatform))}
+ {status?.commandPath ? (
+
+ {translate('auto.components.settings.CliSection.15eaad0d31', 'Command path:')}{' '}
+
- {translate('auto.components.settings.CliSection.15eaad0d31', 'Command path:')}{' '}
-
- {translate(
- 'auto.components.settings.CliSection.b0c310ab46',
- 'Existing launcher target:'
- )}{' '}
-
- {status.pathDirectory}{' '}
- {translate(
- 'auto.components.settings.CliSection.7f2747f7dd',
- 'is not currently visible on PATH for this shell.'
- )}
- {status.detail}
+ {status?.state === 'stale' && status.currentTarget ? (
+
{translate(
- 'auto.components.settings.CliSection.a2b13efa94',
- 'Failed to register `{{value0}}` in PATH.',
- { value0: commandName }
+ 'auto.components.settings.CliSection.b0c310ab46',
+ 'Existing launcher target:'
+ )}{' '}
+
+ {status.pathDirectory}{' '}
+ {translate(
+ 'auto.components.settings.CliSection.7f2747f7dd',
+ 'is not currently visible on PATH for this shell.'
)}
{installFailure.reason}
+ ) : null}
+
+ {!loading && !isSupported && !isBrowserManaged && status?.detail ? (
+ {status.detail}
{translate(
- 'auto.components.settings.CliSection.installFailureConflictRemedy',
- 'Remove {{value0}} and register again if it is no longer needed.',
- { value0: installFailure.conflictCommandPath }
+ 'auto.components.settings.CliSection.a2b13efa94',
+ 'Failed to register `{{value0}}` in PATH.',
+ { value0: commandName }
)}
{installFailure.reason}
+ {translate(
+ 'auto.components.settings.CliSection.installFailureConflictRemedy',
+ 'Remove {{value0}} and register again if it is no longer needed.',
+ { value0: installFailure.conflictCommandPath }
+ )}
+
{translate(
'auto.components.settings.CliSection.36a6f919ba',
@@ -328,9 +327,9 @@ export function CliSection({
/>
{loading
? translate(
diff --git a/src/renderer/src/components/settings/computer-use/ComputerUsePane.tsx b/src/renderer/src/components/settings/computer-use/ComputerUsePane.tsx
index 7b3f06e426d..de493b4ff23 100644
--- a/src/renderer/src/components/settings/computer-use/ComputerUsePane.tsx
+++ b/src/renderer/src/components/settings/computer-use/ComputerUsePane.tsx
@@ -10,6 +10,7 @@ import { useAppStore } from '@/store/index'
import { Button } from '../../ui/button'
import { Badge } from '../../ui/badge'
import { ComputerUseSkillSetupPanel } from './ComputerUseSkillSetupPanel'
+import { SettingsGroup } from '../section-layout/SettingsGroup'
import { translate } from '@/i18n/i18n'
type PermissionDefinition = {
@@ -290,10 +291,10 @@ export function ComputerUsePane(): React.JSX.Element {
const isMac = platform === null || platform === 'darwin'
return (
-
- {translate(permission.descriptionKey, permission.descriptionDefault)}
-
+ {translate(permission.descriptionKey, permission.descriptionDefault)}
+
- {translate(
- 'auto.components.settings.DeveloperPermissionsPane.6326a4c5cc',
- 'Use these controls when a CLI, local app, or automation tool needs macOS privacy access. Orca does not ask at startup.'
- )}
-
- {translate(
- 'auto.components.settings.IntegrationsPane.1683acbac4',
- 'Connect the source hosts Orca can use for pull requests, merge requests, checks, and review status.'
- )}
-
- {translate(
- 'auto.components.settings.IntegrationsPane.3ba07f933b',
- 'Connect issue trackers Orca can use to browse tasks and start workspaces with linked context.'
- )}
-
- {translate(
- 'auto.components.settings.MobileSettingsPane.installIntro',
- 'Install Orca Mobile from the'
- )}{' '}
-
{translate(
- 'auto.components.settings.MobileSettingsPane.androidApkLabel',
- 'Android APK'
+ 'auto.components.settings.MobileSettingsPane.installIntro',
+ 'Install Orca Mobile from the'
+ )}{' '}
+
- {translate(
- 'auto.components.settings.MobileEmulatorAgentControlRow.2a674aa810',
- 'Agent Mobile Emulator Control'
- )}
-
- {translate(
- 'auto.components.settings.MobileEmulatorAgentControlRow.ff4b7e65d6',
- 'Let coding agents control the active mobile emulator with Orca CLI commands.'
- )}
- {availabilityDetail(availability)} {availabilityDetail(availability)} {label}
- {translate(
- 'auto.components.settings.RepositoryPane.b0a0c14a1c',
- 'Project-specific display details for the sidebar and tabs.'
- )}
-
+
+
{translate(
'auto.components.settings.RepositoryPane.ee5a290616',
'Opened as folder. Git features are unavailable for this workspace.'
)}
-
- {translate(
- 'auto.components.settings.RepositoryHooksSection.8567127a40',
- 'Scripts that run when worktrees are created or archived. Local scripts are stored on this machine; `orca.yaml` scripts are shared with your team.'
+ description={translate(
+ 'auto.components.settings.RepositoryHooksSection.30d555acd2',
+ 'Local and shared scripts that run after a new worktree is created.'
)}
-
- {translate(
- 'auto.components.settings.SparsePresetSettingsSection.17f8c4ce10',
- 'Manage saved directory sets for sparse worktree creation.'
- )}
-
- {translate(
- 'auto.components.settings.WorktreeSymlinksSection.7ff265071d',
- 'When a new worktree is created, each path listed here is APFS clone-copied on macOS when possible, otherwise symlinked from the primary checkout.'
- )}
-
- {translate(
- 'auto.components.settings.McpConfigSection.96f5609b04',
- 'Inspect MCP server definitions that agents can use while working in this repo.'
- )}
-
+
{translate(
'auto.components.settings.McpConfigSection.6bac9ddfc6',
'SSH repos are read through the remote filesystem. Starter creation is limited to the workspace root config.'
)}
-
{translate('auto.components.settings.McpConfigSection.4d16a0d9ac', 'Checked')}
{ownership.description} {saveError} {description}
+
{error}
- {translate(
- 'auto.components.settings.LinearAgentSkillGuide.setupBody',
- 'All three are required for the full Tasks + agent loop. First-time path is also under Task Sources.'
- )}
-
- {translate(
- 'auto.components.settings.LinearAgentSkillGuide.notesIntro',
- 'Quick reminders once Linear is connected and the skill is installed.'
- )}
-
+
{translate(
'auto.components.settings.LinearAgentSkillPane.manageConnectionHint',
'Review connected Linear workspaces and API keys in'
diff --git a/src/renderer/src/components/settings/skills/sharing/ShareSkillsSettingsPane.tsx b/src/renderer/src/components/settings/skills/sharing/ShareSkillsSettingsPane.tsx
index 54a86d542bf..c8d4945cca2 100644
--- a/src/renderer/src/components/settings/skills/sharing/ShareSkillsSettingsPane.tsx
+++ b/src/renderer/src/components/settings/skills/sharing/ShareSkillsSettingsPane.tsx
@@ -5,6 +5,7 @@ import { translate } from '@/i18n/i18n'
import { isWebClientLocation } from '@/lib/web-client-location'
import { useAppStore } from '@/store/index'
import { SettingsSwitchRow } from '../../form-controls/SettingsFormControls'
+import { SettingsGroup } from '../../section-layout/SettingsGroup'
import { OrcaSignInButton, OrcaSignInWaitNotice } from '../../../OrcaSignInProgress'
type HowToStep = { key: string; title: string; description: string }
@@ -63,157 +64,158 @@ export function ShareSkillsSettingsPane(): React.JSX.Element {
]
return (
-
- {translate(
- 'auto.components.settings.shareSkills.linkDescription',
- 'Shared bundles are not searchable or listed in Orca. The link is the credential, so send it only to people you trust.'
- )}
-
- {isWebClient
- ? translate(
- 'auto.components.settings.shareSkills.signInWebDescription',
- 'Publishing and link management are available in the Orca desktop app.'
- )
- : translate(
- 'auto.components.settings.shareSkills.signInDescription',
- 'Use your Orca account to publish bundles and manage their links. Recipients do not need an account.'
- )}
-
- {translate(
- 'auto.components.settings.shareSkills.activeLinksDescription',
- 'Only people with a link can open it. Unshare a link to block future inspection and installs.'
- )}
-
- {translate(
- 'auto.components.settings.shareSkills.howToDescription',
- 'Publish one skill or a bundle such as a collection of 30 skills behind one link.'
- )}
- {step.title} {step.description}
+ {isWebClient
+ ? translate(
+ 'auto.components.settings.shareSkills.signInWebDescription',
+ 'Publishing and link management are available in the Orca desktop app.'
+ )
+ : translate(
+ 'auto.components.settings.shareSkills.signInDescription',
+ 'Use your Orca account to publish bundles and manage their links. Recipients do not need an account.'
+ )}
+
+ {translate(
+ 'auto.components.settings.shareSkills.activeLinksDescription',
+ 'Only people with a link can open it. Unshare a link to block future inspection and installs.'
+ )}
+ {step.title}
+ {step.description}
+ {ownership.description}
- {translate(
- 'auto.components.settings.TasksPane.incompleteBannerTitle',
- 'Some visible providers still need setup'
- )}
-
- {stalledVisible.includes('linear')
- ? translate(
- 'auto.components.settings.TasksPane.incompleteBannerBodyWithLinear',
- 'Hide providers you do not use, or expand a card and finish its steps. For Linear: API access, the agent skill, and Show in Tasks.'
- )
- : translate(
- 'auto.components.settings.TasksPane.incompleteBannerBody',
- 'Hide providers you do not use, or expand a card and finish its steps.'
- )}
-
+ {translate(
+ 'auto.components.settings.TasksPane.incompleteBannerTitle',
+ 'Some visible providers still need setup'
+ )}
+
+ {stalledVisible.includes('linear')
+ ? translate(
+ 'auto.components.settings.TasksPane.incompleteBannerBodyWithLinear',
+ 'Hide providers you do not use, or expand a card and finish its steps. For Linear: API access, the agent skill, and Show in Tasks.'
+ )
+ : translate(
+ 'auto.components.settings.TasksPane.incompleteBannerBody',
+ 'Hide providers you do not use, or expand a card and finish its steps.'
)}
-
- )
- })}
-
+
- {translate(
- 'auto.components.settings.TasksPane.integrationsHint',
- 'Credentials for all providers also live under'
- )}{' '}
-
+ {translate(
+ 'auto.components.settings.TasksPane.integrationsHint',
+ 'Credentials for all providers also live under'
+ )}{' '}
+
- {translate(
- 'settings.terminal.wordSeparators.noSpaceHint',
- 'No space included — double-click will select across spaces.'
- )}
-
+ {translate(
+ 'settings.terminal.wordSeparators.noSpaceHint',
+ 'No space included — double-click will select across spaces.'
+ )}
+
+ {translate(
+ 'auto.components.settings.TerminalPane.scrollSpeed.helper',
+ 'Adjust how wheel input feels in scrollback and in mouse-aware terminal apps.'
+ )}
+
- {translate(
- 'auto.components.settings.TerminalPane.scrollSpeed.helper',
- 'Adjust how wheel input feels in scrollback and in mouse-aware terminal apps.'
- )}
-
- {translate(
- 'auto.components.settings.ManageSessionsSection.7c4889a724',
- 'Recover from a frozen or misbehaving terminal by killing sessions or restarting the underlying daemon.'
- )}
- {description}
- {translate('auto.components.settings.CliSection.c5c0f2641d', 'Orca CLI')}
-
- {status.commandPath}
{status.commandPath}
- {status.currentTarget}
- {status.currentTarget}
+
- {translate('auto.components.settings.IntegrationsPane.298c65ecac', 'Review providers')}
-
-
- {translate('auto.components.settings.IntegrationsPane.70e885705b', 'Task providers')}
-
-
- {translate('auto.components.settings.RepositoryPane.499a437335', 'Identity')}
-
-
- {translate(
- 'auto.components.settings.RepositoryHooksSection.ff082fe7c6',
- 'Worktree Hooks'
+
+
-
- {translate(
- 'auto.components.settings.WorktreeSymlinksSection.4755f120b6',
- 'Worktree Shared Paths'
- )}
-
-
- {queryTrimmed}
-
-
-
+ {queryTrimmed}
+
+
- {translate(
- 'auto.components.settings.WorktreeSymlinksSection.b814c618e2',
- 'Linked paths'
- )}
-
-
- {paths.length === 1
- ? translate(
- 'auto.components.settings.WorktreeSymlinksSection.9ea912d811',
- '1 path'
- )
- : translate(
- 'auto.components.settings.WorktreeSymlinksSection.d72ba8dc68',
- '{{value0}} paths',
- { value0: paths.length }
- )}
-
+ ) : null}
+ {filtered.map((entry) => {
+ const alreadyAdded = paths.includes(entry.name)
+ return (
+
+ {translate(
+ 'auto.components.settings.WorktreeSymlinksSection.b814c618e2',
+ 'Linked paths'
+ )}
+
+
+ {paths.length === 1
+ ? translate(
+ 'auto.components.settings.WorktreeSymlinksSection.9ea912d811',
+ '1 path'
+ )
+ : translate(
+ 'auto.components.settings.WorktreeSymlinksSection.d72ba8dc68',
+ '{{value0}} paths',
+ { value0: paths.length }
+ )}
- ))}
+
- {translate('auto.components.settings.McpConfigSection.55eea3ef47', 'MCP Configs')}
-
-
- {translate(
- 'auto.components.settings.RepositorySourceControlAiSection.71b003b62b',
- 'Source Control AI'
- )}
-
- {title}
+ {description ?
- {translate(
- 'auto.components.settings.LinearAgentSkillGuide.setupTitle',
- 'Setup checklist'
- )}
-
-
- {translate('auto.components.settings.LinearAgentSkillGuide.notesTitle', 'Good to know')}
-
-
- {translate('auto.components.settings.shareSkills.linkTitle', 'Unlisted skill links')}
-
-
- {translate(
- 'auto.components.settings.shareSkills.signInTitle',
- 'Sign in to share skills'
- )}
-
-
- {translate('auto.components.settings.shareSkills.activeLinks', 'Active shared links')}
-
-
- {translate('auto.components.settings.shareSkills.howToTitle', 'How to share skills')}
-
-
- {steps.map((step, index) => (
-
{!isWebClient ? (
-
+ {translate(
+ 'auto.components.settings.shareSkills.signInTitle',
+ 'Sign in to share skills'
+ )}
+
+
+ {translate(
+ 'auto.components.settings.shareSkills.activeLinks',
+ 'Active shared links'
+ )}
+
+
+ {steps.map((step, index) => (
+
+
+ {!isWebClient ? (
+
- {translate(
- 'auto.components.settings.CommitMessageAiPane.ad66ff886d',
- 'Source Control AI defaults'
- )}
-
-
- {translate(
- 'auto.components.settings.ManageSessionsSection.d1b80fd5cd',
- 'Manage Sessions'
- )}
-
- {heading}
-