diff --git a/src/main/sharedSettingsFile.test.ts b/src/main/sharedSettingsFile.test.ts index e6920a9dc..b65e51b88 100644 --- a/src/main/sharedSettingsFile.test.ts +++ b/src/main/sharedSettingsFile.test.ts @@ -119,6 +119,12 @@ describe("sharedSettingsFile", () => { wslConflictResolverFast: false, wslConflictResolverPresentationMode: "gui", agentSettings: {}, + machineScopeModes: { + providerOrder: "synced", + hiddenModels: "synced", + disabledAgents: "synced", + }, + machineSettings: {}, hiddenModels: {}, disabledAgents: [], providerOrder: [], @@ -254,6 +260,12 @@ describe("sharedSettingsFile", () => { wslConflictResolverFast: false, wslConflictResolverPresentationMode: "gui", agentSettings: {}, + machineScopeModes: { + providerOrder: "synced", + hiddenModels: "synced", + disabledAgents: "synced", + }, + machineSettings: {}, hiddenModels: {}, disabledAgents: [], providerOrder: [], diff --git a/src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx b/src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx index dcb2b9ef9..bfb48436b 100644 --- a/src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx +++ b/src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx @@ -14,6 +14,8 @@ import { Tooltip } from "@heroui/react"; import { ProviderIcon } from "@/renderer/components/providers/ProviderIcon"; import { ResponsiveMenuSurface, useResponsiveMenu } from "../ResponsiveMenuSurface"; import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; +import { effectiveProviderOrder } from "@/shared/machineSettings"; +import { LOCAL_NATIVE_MACHINE_KEY } from "@/shared/machines"; import { baseAgentKind, type ThreadPresentationMode } from "@/shared/contracts"; import { migrateCursorBaseId, parseCursorModelId } from "@/shared/cursorModelId"; import { Button } from "../Button"; @@ -66,6 +68,11 @@ export interface ProviderModelMenuProps { /** When set, only this provider's rows are rendered. */ lockedAgentKind?: string; presentationMode?: ThreadPresentationMode; + /** + * Machine whose provider-order preference applies ("local" when omitted). + * Only affects ordering while the provider-order lock is off. + */ + machineKey?: string; isDisabled?: boolean; hideLabelOnWrap?: boolean; forceHideLabel?: boolean; @@ -284,7 +291,9 @@ export function ProviderModelMenu(props: ProviderModelMenuProps) { const favorites = useSharedSettings((s) => s.favoriteModels); const recents = useSharedSettings((s) => s.recentModels); - const providerOrder = useSharedSettings((s) => s.providerOrder); + const providerOrder = useSharedSettings((s) => + effectiveProviderOrder(s, props.machineKey ?? LOCAL_NATIVE_MACHINE_KEY), + ); const hiddenModels = useSharedSettings((s) => s.hiddenModels); const providerModelPreferences = useSharedSettings((s) => s.providerModelPreferences); const providerConfigs = useSharedSettings((s) => s.providerConfigs); diff --git a/src/renderer/components/thread/AgentDiscoveryScreen.tsx b/src/renderer/components/thread/AgentDiscoveryScreen.tsx index de9230507..9ffc49041 100644 --- a/src/renderer/components/thread/AgentDiscoveryScreen.tsx +++ b/src/renderer/components/thread/AgentDiscoveryScreen.tsx @@ -6,6 +6,7 @@ import type { MessageDescriptor } from "@lingui/core"; import { PixelLoader } from "@/renderer/components/common/PixelLoader"; import { ProviderIcon } from "@/renderer/components/providers/ProviderIcon"; import { getProviderManifests } from "@/renderer/components/providers/providerManifest"; +import { localEnvLabel } from "@/renderer/utils/machineLabels"; import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; import type { AgentStatus, ProjectLocation } from "@/shared/contracts"; import type { CSSProperties, ReactNode } from "react"; @@ -98,7 +99,7 @@ export function AgentDiscoveryScreen(props: { ? [ { key: `wsl:${wslDistro}`, - label: `WSL: ${wslDistro}`, + label: localEnvLabel({ kind: "wsl", distro: wslDistro }), matches: (status) => status.envKind === "wsl" && status.envDistro === wslDistro, }, ] @@ -106,12 +107,12 @@ export function AgentDiscoveryScreen(props: { ? [ { key: "native", - label: t`Windows`, + label: localEnvLabel({ kind: "native" }), matches: (status) => status.envKind !== "wsl", }, ...props.wslDistros.map((distro) => ({ key: `wsl:${distro}`, - label: `WSL: ${distro}`, + label: localEnvLabel({ kind: "wsl", distro }), matches: (status: AgentStatus) => status.envKind === "wsl" && status.envDistro === distro, })), @@ -120,12 +121,12 @@ export function AgentDiscoveryScreen(props: { ? [ { key: "native", - label: "Windows", + label: localEnvLabel({ kind: "native" }), matches: (status) => status.envKind !== "wsl", }, ...discoveryScope.wslDistros.map((distro) => ({ key: `wsl:${distro}`, - label: `WSL: ${distro}`, + label: localEnvLabel({ kind: "wsl", distro }), matches: (status: AgentStatus) => status.envKind === "wsl" && status.envDistro === distro, })), diff --git a/src/renderer/components/thread/ThreadAgentUpdateDock.test.tsx b/src/renderer/components/thread/ThreadAgentUpdateDock.test.tsx index f48ef1c90..fc8566191 100644 --- a/src/renderer/components/thread/ThreadAgentUpdateDock.test.tsx +++ b/src/renderer/components/thread/ThreadAgentUpdateDock.test.tsx @@ -121,7 +121,7 @@ describe("ThreadAgentUpdateDock", () => { render(); expect( - await screen.findByText(/Cursor SDK: Windows · v1\.0\.24 → v1\.0\.31/u), + await screen.findByText(/Cursor SDK: This computer · v1\.0\.24 → v1\.0\.31/u), ).toBeInTheDocument(); expect(screen.queryByText(/2026\.07\.09/u)).toBeNull(); expect(bridgeMock.getLatestAgentVersion).toHaveBeenCalledWith({ @@ -170,7 +170,9 @@ describe("ThreadAgentUpdateDock", () => { ); expect( - await screen.findByText(/Cursor: Windows · v2026\.07\.09-a3815c0 → v2026\.07\.23-e383d2b/u), + await screen.findByText( + /Cursor: This computer · v2026\.07\.09-a3815c0 → v2026\.07\.23-e383d2b/u, + ), ).toBeInTheDocument(); expect(bridgeMock.getLatestAgentVersion).toHaveBeenCalledWith({ agentKind: "cursor" }); diff --git a/src/renderer/components/thread/ThreadComposer.tsx b/src/renderer/components/thread/ThreadComposer.tsx index 0152a3da3..968fe506c 100644 --- a/src/renderer/components/thread/ThreadComposer.tsx +++ b/src/renderer/components/thread/ThreadComposer.tsx @@ -83,6 +83,7 @@ export type ComposerControl = currentAgentKind: string; currentModel: string; lockedAgentKind?: string; + machineKey?: string; presentationMode?: ThreadPresentationMode; isDisabled?: boolean; hideLabelOnWrap?: boolean; @@ -440,6 +441,7 @@ export function ThreadComposer(props: { currentAgentKind={control.currentAgentKind} currentModel={control.currentModel} {...(control.lockedAgentKind ? { lockedAgentKind: control.lockedAgentKind } : {})} + {...(control.machineKey ? { machineKey: control.machineKey } : {})} {...(control.presentationMode ? { presentationMode: control.presentationMode } : {})} {...(control.isDisabled !== undefined ? { isDisabled: control.isDisabled } : {})} {...(control.openSignal !== undefined ? { openSignal: control.openSignal } : {})} diff --git a/src/renderer/components/thread/ThreadComposerSection.tsx b/src/renderer/components/thread/ThreadComposerSection.tsx index 6af53a7c9..182b0693f 100644 --- a/src/renderer/components/thread/ThreadComposerSection.tsx +++ b/src/renderer/components/thread/ThreadComposerSection.tsx @@ -62,6 +62,7 @@ import { ThreadContextIndicator } from "./ThreadContextIndicator"; import { getApprovalDenyOption } from "./ThreadRuntimeRequestPanel/helpers"; import { hasReportedContextUsage, resolveThreadContextUsageSummary } from "./threadContextUsage"; import { buildControls } from "./buildModelPickerControls"; +import { machineKeyForLocation } from "@/shared/machines"; import { submitComposerPrompt } from "./threadComposerSubmit"; import { filterSlashCommands, @@ -440,6 +441,7 @@ function ThreadComposerSectionInner(props: ThreadComposerSectionProps & { thread (config) => changeThreadConfig(thread.id, config), modelPreferences, (model, preference) => setProviderModelPreference(thread.agentKind, model, preference), + machineKeyForLocation(projectLocation), ); const controlsWithOpenSignal = controls.map((control): ComposerControl => { if (controlOpenRequest?.target === "model" && control.kind === "provider-model") { diff --git a/src/renderer/components/thread/ThreadDraftView.tsx b/src/renderer/components/thread/ThreadDraftView.tsx index 91da474e5..d2e48739a 100644 --- a/src/renderer/components/thread/ThreadDraftView.tsx +++ b/src/renderer/components/thread/ThreadDraftView.tsx @@ -33,6 +33,7 @@ import { buildProviderModelMenuProviders, patchConfigForModelChange, } from "./buildModelPickerControls"; +import { machineKeyForLocation } from "@/shared/machines"; import { agentWithCapabilities, formatAgentList, @@ -975,6 +976,7 @@ export function ThreadDraftView(props: { thinking, capabilities: filteredCaps, presentationMode, + machineKey: machineKeyForLocation(project.location), onProviderModelChange: (next) => latestProviderModelChangeRef.current(next), onConfigPatch: (patch) => latestConfigPatchRef.current(patch), }); @@ -989,6 +991,7 @@ export function ThreadDraftView(props: { fast, thinking, presentationMode, + project.location, ]); const providerDraftControls = useMemo(() => { diff --git a/src/renderer/components/thread/buildModelPickerControls.tsx b/src/renderer/components/thread/buildModelPickerControls.tsx index 3bf84742e..a00861fba 100644 --- a/src/renderer/components/thread/buildModelPickerControls.tsx +++ b/src/renderer/components/thread/buildModelPickerControls.tsx @@ -49,6 +49,8 @@ export type BuildModelPickerControlsInput = { capabilities: AgentCapability; presentationMode?: ThreadPresentationMode; lockedAgentKind?: string; + /** Machine whose provider-order preference applies to the picker. */ + machineKey?: string; isDisabled?: boolean; hideLabelOnWrap?: boolean; includeFastToggle?: boolean; @@ -211,6 +213,7 @@ export function buildModelPickerControls(input: BuildModelPickerControlsInput): capabilities: filteredCaps, presentationMode, lockedAgentKind, + machineKey, isDisabled, hideLabelOnWrap = true, includeFastToggle = true, @@ -239,6 +242,7 @@ export function buildModelPickerControls(input: BuildModelPickerControlsInput): currentAgentKind: selectedAgentKind, currentModel: model, ...(lockedAgentKind ? { lockedAgentKind } : {}), + ...(machineKey ? { machineKey } : {}), ...(presentationMode ? { presentationMode } : {}), ...(isDisabled !== undefined ? { isDisabled } : {}), hideLabelOnWrap, @@ -364,6 +368,7 @@ export function buildControls( onConfigChange: (config: ThreadConfig) => void, modelPreferences?: Record, onModelPreferenceChange?: (model: string, preference: ProviderModelPreference) => void, + machineKey?: string, ): ComposerControl[] { const presentationMode = thread.presentationMode ?? agentStatus?.capabilities.presentationMode ?? "terminal"; @@ -407,6 +412,7 @@ export function buildControls( ...(effectiveConfig.thinking ? { thinking: effectiveConfig.thinking } : {}), capabilities: filteredCaps, lockedAgentKind: thread.agentKind, + ...(machineKey ? { machineKey } : {}), presentationMode, isDisabled, onProviderModelChange: ({ model }) => { diff --git a/src/renderer/locales/de/messages.po b/src/renderer/locales/de/messages.po index 106188886..bb80a92ef 100644 --- a/src/renderer/locales/de/messages.po +++ b/src/renderer/locales/de/messages.po @@ -238,6 +238,11 @@ msgstr "{0} vergleicht die anonymisierten Chat-Antworten…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} vergleicht die anonymisierten Diffs…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} ist offline. Letzter bekannter Status wird angezeigt." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "vor {seconds}s" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# Server} other {# Server}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} von {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Der Agent hat einen Fehler festgestellt." #~ msgid "Agent for candidate {0}" #~ msgstr "Agent für Kandidat {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Der Agent ist aktiv und bereit" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Der Agent ist derzeit deaktiviert" @@ -1236,6 +1246,10 @@ msgstr "Alle Stufen" msgid "All files" msgstr "Alle Dateien" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Alle Computer" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Verbinden..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Verbindet…" @@ -4152,6 +4167,14 @@ msgstr "losgelöster HEAD" #~ msgid "Details" #~ msgstr "Details" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Erkennen" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Agents auf diesem Computer erkennen" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Aus Projektdateien erkennen" @@ -4441,6 +4464,11 @@ msgstr "Entwurf" msgid "Drag to reorder how providers appear in the model picker." msgstr "Ziehen Sie, um die Anzeige der Anbieter in der Modellauswahl neu anzuordnen." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Ziehen, um die Provider auf {0} neu anzuordnen." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Zum Neuanordnen ziehen; Doppelklicken Sie zum Bearbeiten" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Skills und Server dieses Plugins für neue Threads aktivieren." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Aktiviert" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Installieren Sie {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Installieren Sie {env}" +#~ msgid "Install {env}" +#~ msgstr "Installieren Sie {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Verwaltete Skills in {0} installieren." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Installieren Sie zuerst native Anbieter; Verwenden Sie ACP für zusätzliche Protokollagenten." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Installieren: {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Unter Windows installieren" @@ -6195,11 +6227,14 @@ msgstr "v{updateVersion} installieren" msgid "Install v{version}" msgstr "v{version} installieren" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Installation, Updates und Anmeldung sind auf Remote-Computern noch nicht verfügbar." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Installiert" @@ -6283,6 +6318,11 @@ msgstr "Zweig behalten" msgid "Keep me on track" msgstr "Halte mich auf Kurs" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Überall dieselbe Provider-Reihenfolge verwenden. Deaktivieren, um sie pro Computer anzupassen." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Standortsymbol" msgid "Lock panel to the open thread" msgstr "Panel an den offenen Thread binden" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Beim Sperren wird die Reihenfolge dieses Computers übernommen und überall angewendet." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Melde dich bei Tailscale an, um HTTPS-Zugriff über MagicDNS zu aktivieren." @@ -7370,6 +7414,11 @@ msgstr "Benötigt Aufmerksamkeit · Genehmigung erforderlich" msgid "Needs Attention · Reply required" msgstr "Benötigt Aufmerksamkeit · Antwort erforderlich" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Erfordert Aufmerksamkeit auf {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Keine Sprache erkannt." msgid "No staged changes" msgstr "Keine bereitgestellten Änderungen" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Dieser Computer hat noch keinen Status gemeldet." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Keine Schritte gemeldet" @@ -8047,6 +8100,10 @@ msgstr "Kein Git-Repository" msgid "Not a Git repository" msgstr "Kein Git-Repository" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Auf diesem Computer noch nicht erkannt." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Nicht gefunden" @@ -8129,6 +8186,7 @@ msgstr "Nur offizielle Quellen" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Offline" @@ -8148,6 +8206,11 @@ msgstr "auf" msgid "On" msgstr "Am" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "Zur vollen Stunde" @@ -8586,6 +8649,10 @@ msgstr "Koppeln Sie einen Desktop unter Verbindungen, um seine Ports weiterzulei msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Kopple ein Smartphone, Tablet oder einen Browser mit diesem Desktop." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Remote-Computer koppeln…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Laufzeit-Debug" msgid "Runtime options" msgstr "Laufzeitoptionen" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Gleiche Provider-Reihenfolge auf allen Computern" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Sättigung und Helligkeit" @@ -10545,8 +10617,12 @@ msgstr "Tastenkürzel speichern" #~ msgstr "Gespeicherter API-Schlüssel" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Gespeicherte Anmeldeinformationen werden in allen Umgebungen gemeinsam genutzt." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Gespeicherte Anmeldeinformationen werden in allen Umgebungen gemeinsam genutzt." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Gespeicherte Zugangsdaten gelten für alle Computer." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Kandidat {0} ({label}) als Gewinner auswählen" msgid "Select device" msgstr "Gerät auswählen" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Computer auswählen" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Modell auswählen" @@ -11868,6 +11948,10 @@ msgstr "Unterstützt Schnellmodus" msgid "Swap notes and to-dos" msgstr "Notizen und Aufgaben tauschen" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Wechseln" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Dieser Code läuft in {countdown} ab" msgid "This code has expired." msgstr "Dieser Code ist abgelaufen." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Dieser Computer" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Diese Verbindung kann Projekte anzeigen, aber nicht verwalten. Kopple erneut, um dies zu aktivieren." @@ -12424,6 +12512,10 @@ msgstr "Diese HTTPS-Seite konnte den Desktop über einfaches HTTP nicht erreiche #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Dieser Link öffnet die App, die Poracode in deinem Netzwerk bereitstellt. Die gehostete App wird über HTTPS ausgeliefert, was Browser daran hindert, einen Desktop über einfaches HTTP zu erreichen." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "dieser Computer" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Dieser Computer" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Update auf {updateLabel} für {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Update auf v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Update auf v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Update auf v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Wird in {0} ausgeführt:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Schreiben Sie Notizen für dieses Projekt ..." msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/en/messages.po b/src/renderer/locales/en/messages.po index 39a0a58cc..734806baf 100644 --- a/src/renderer/locales/en/messages.po +++ b/src/renderer/locales/en/messages.po @@ -238,6 +238,11 @@ msgstr "{0} is comparing the anonymized chat responses…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} is comparing the anonymized diffs…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} is offline. Showing last known status." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds}s ago" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# server} other {# servers}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} from {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Agent encountered an error." #~ msgid "Agent for candidate {0}" #~ msgstr "Agent for candidate {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Agent is active and ready" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Agent is currently disabled" @@ -1236,6 +1246,10 @@ msgstr "All efforts" msgid "All files" msgstr "All files" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "All machines" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Connecting..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Connecting…" @@ -4152,6 +4167,14 @@ msgstr "detached HEAD" #~ msgid "Details" #~ msgstr "Details" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Detect" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Detect agents on this machine" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Detect from project files" @@ -4441,6 +4464,11 @@ msgstr "Draft" msgid "Drag to reorder how providers appear in the model picker." msgstr "Drag to reorder how providers appear in the model picker." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Drag to reorder providers on {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Drag to reorder; double-click to edit" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Enable this plugin's skills and servers for new threads." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Enabled" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Install {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Install {env}" +#~ msgid "Install {env}" +#~ msgstr "Install {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Install managed skills into {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Install native providers first; use ACP for additional protocol agents." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Install on {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Install on Windows" @@ -6195,11 +6227,14 @@ msgstr "Install v{updateVersion}" msgid "Install v{version}" msgstr "Install v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Install, update, and sign-in are not yet available on remote machines." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Installed" @@ -6283,6 +6318,11 @@ msgstr "Keep Branch" msgid "Keep me on track" msgstr "Keep me on track" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Keep one provider order everywhere. Turn off to arrange per machine." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Location glyph" msgid "Lock panel to the open thread" msgstr "Lock panel to the open thread" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Locking keeps this machine's order and applies it everywhere." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Log in to Tailscale to enable HTTPS access through MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Needs Attention · Approval required" msgid "Needs Attention · Reply required" msgstr "Needs Attention · Reply required" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Needs attention on {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "No speech detected." msgid "No staged changes" msgstr "No staged changes" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "No status reported by this machine yet." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "No steps reported" @@ -8047,6 +8100,10 @@ msgstr "Not a git repository" msgid "Not a Git repository" msgstr "Not a Git repository" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Not detected on this machine yet." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Not found" @@ -8129,6 +8186,7 @@ msgstr "Official sources only" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Offline" @@ -8148,6 +8206,11 @@ msgstr "on" msgid "On" msgstr "On" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "On {0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "On the hour" @@ -8586,6 +8649,10 @@ msgstr "Pair a desktop from Connections to forward its ports." msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Pair a phone, tablet, or browser with this desktop." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Pair a remote machine…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Runtime debug" msgid "Runtime options" msgstr "Runtime options" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Same provider order on all machines" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Saturation and brightness" @@ -10545,8 +10617,12 @@ msgstr "Save shortcut" #~ msgstr "Saved API key" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Saved credentials are shared across all environments." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Saved credentials are shared across all environments." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Saved credentials are shared across all machines." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Select candidate {0} ({label}) as winner" msgid "Select device" msgstr "Select device" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Select machine" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Select model" @@ -11868,6 +11948,10 @@ msgstr "Supports Fast mode" msgid "Swap notes and to-dos" msgstr "Swap notes and to-dos" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Switch" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "This code expires in {countdown}" msgid "This code has expired." msgstr "This code has expired." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "This computer" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "This connection can view projects but not manage them. Re-pair to enable." @@ -12424,6 +12512,10 @@ msgstr "This HTTPS page couldn't reach the desktop on plain HTTP. Allow local ne #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "this machine" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "This machine" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Update to {updateLabel} for {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Update to v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Update to v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Update to v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Will run in {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Write notes for this project…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/es/messages.po b/src/renderer/locales/es/messages.po index 5a1a51c59..363f5ec07 100644 --- a/src/renderer/locales/es/messages.po +++ b/src/renderer/locales/es/messages.po @@ -238,6 +238,11 @@ msgstr "{0} está comparando las respuestas de chat anonimizadas…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} está comparando los diffs anonimizados…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} está sin conexión. Se muestra el último estado conocido." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "hace {seconds}s" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# servidor} other {# servidores}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} de {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "El agente encontró un error." #~ msgid "Agent for candidate {0}" #~ msgstr "Agente para el candidato {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "El agente está activo y listo" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "El agente está deshabilitado actualmente" @@ -1236,6 +1246,10 @@ msgstr "Todos los niveles de esfuerzo" msgid "All files" msgstr "Todos los archivos" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Todas las máquinas" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Conectando..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Conectando…" @@ -4152,6 +4167,14 @@ msgstr "HEAD separado" #~ msgid "Details" #~ msgstr "Detalles" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Detectar" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Detectar agentes en esta máquina" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Detectar desde los archivos del proyecto" @@ -4441,6 +4464,11 @@ msgstr "Borrador" msgid "Drag to reorder how providers appear in the model picker." msgstr "Arrastra para reordenar cómo aparecen los proveedores en el selector de modelos." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Arrastra para reordenar los proveedores en {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Arrastra para reordenar; doble clic para editar" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Activa las skills y servidores de este plugin para los nuevos hilos." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Habilitado" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Instalar {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Instalar {env}" +#~ msgid "Install {env}" +#~ msgstr "Instalar {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Instalar skills administradas en {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Instala primero los proveedores nativos; usa ACP para agentes de protocolo adicionales." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Instalar en {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Instalar en Windows" @@ -6195,11 +6227,14 @@ msgstr "Instalar v{updateVersion}" msgid "Install v{version}" msgstr "Instalar v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Instalar, actualizar e iniciar sesión aún no están disponibles en máquinas remotas." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Instalado" @@ -6283,6 +6318,11 @@ msgstr "Mantener rama" msgid "Keep me on track" msgstr "Manténme encaminado" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Mantén un solo orden de proveedores en todas partes. Desactívalo para organizarlo por máquina." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Glifo de ubicación" msgid "Lock panel to the open thread" msgstr "Fijar el panel al hilo abierto" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Al bloquear se conserva el orden de esta máquina y se aplica en todas partes." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Inicia sesión en Tailscale para habilitar el acceso HTTPS a través de MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Necesita atención · Aprobación requerida" msgid "Needs Attention · Reply required" msgstr "Necesita atención · Respuesta requerida" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Requiere atención en {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "No se detectó voz." msgid "No staged changes" msgstr "No hay cambios preparados" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Esta máquina aún no ha informado su estado." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "No se informaron pasos" @@ -8047,6 +8100,10 @@ msgstr "No es un repositorio git" msgid "Not a Git repository" msgstr "No es un repositorio Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Aún no detectado en esta máquina." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "No encontrado" @@ -8129,6 +8186,7 @@ msgstr "Solo fuentes oficiales" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Sin conexión" @@ -8148,6 +8206,11 @@ msgstr "activado" msgid "On" msgstr "El" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "En {0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "En punto" @@ -8586,6 +8649,10 @@ msgstr "Empareja un escritorio desde Conexiones para reenviar sus puertos." msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Empareja un teléfono, una tableta o un navegador con este escritorio." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Vincular una máquina remota…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Depuración de runtime" msgid "Runtime options" msgstr "Opciones de runtime" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Mismo orden de proveedores en todas las máquinas" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Saturación y brillo" @@ -10545,8 +10617,12 @@ msgstr "Guardar atajo" #~ msgstr "Clave de API guardada" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Las credenciales guardadas se comparten entre todos los entornos." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Las credenciales guardadas se comparten entre todos los entornos." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Las credenciales guardadas se comparten entre todas las máquinas." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Seleccionar al candidato {0} ({label}) como ganador" msgid "Select device" msgstr "Seleccionar dispositivo" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Seleccionar máquina" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Seleccionar modelo" @@ -11868,6 +11948,10 @@ msgstr "Compatible con el modo rápido" msgid "Swap notes and to-dos" msgstr "Intercambiar notas y tareas pendientes" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Cambiar" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Este código caduca en {countdown}" msgid "This code has expired." msgstr "Este código ha caducado." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Este equipo" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Esta conexión puede ver proyectos, pero no administrarlos. Vuelve a emparejarla para habilitarlo." @@ -12424,6 +12512,10 @@ msgstr "Esta página HTTPS no pudo conectar con el escritorio en HTTP simple. Pe #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Este enlace abre la app que Poracode sirve en tu red. La app alojada se sirve por HTTPS, lo que impide que los navegadores lleguen a un escritorio en HTTP simple." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "esta máquina" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Esta máquina" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Actualizar a {updateLabel} para {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Actualizar a v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Actualizar a v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Actualizar a v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Se ejecutará en {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Escribe notas para este proyecto…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/fr/messages.po b/src/renderer/locales/fr/messages.po index f131e8613..bc196a630 100644 --- a/src/renderer/locales/fr/messages.po +++ b/src/renderer/locales/fr/messages.po @@ -238,6 +238,11 @@ msgstr "{0} compare les réponses de chat anonymisées…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} compare les diffs anonymisés…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} est hors ligne. Affichage du dernier état connu." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "il y a {seconds} s" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# serveur} other {# serveurs}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} de {providerLabel} : {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "L'agent a rencontré une erreur." #~ msgid "Agent for candidate {0}" #~ msgstr "Agent du candidat {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "L'agent est actif et prêt" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "L'agent est actuellement désactivé" @@ -1236,6 +1246,10 @@ msgstr "Tous les niveaux d'effort" msgid "All files" msgstr "Tous les fichiers" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Toutes les machines" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Connexion..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Connexion…" @@ -4152,6 +4167,14 @@ msgstr "HEAD détachée" #~ msgid "Details" #~ msgstr "Détails" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Détecter" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Détecter les agents sur cette machine" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Détecter depuis les fichiers du projet" @@ -4441,6 +4464,11 @@ msgstr "Brouillon" msgid "Drag to reorder how providers appear in the model picker." msgstr "Faites glisser pour réorganiser la manière dont les fournisseurs apparaissent dans le sélecteur de modèles." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Faites glisser pour réorganiser les fournisseurs sur {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Faites glisser pour réorganiser ; double-cliquez pour modifier" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Activez les compétences et serveurs de ce plugin pour les nouveaux fils." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Activé" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Installez {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Installer {env}" +#~ msgid "Install {env}" +#~ msgstr "Installer {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Installer les compétences gérées dans {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Installez d'abord les fournisseurs natifs ; utilisez ACP pour les agents de protocole supplémentaires." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Installer sur {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Installer sous Windows" @@ -6195,11 +6227,14 @@ msgstr "Installer v{updateVersion}" msgid "Install v{version}" msgstr "Installer v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "L'installation, la mise à jour et la connexion ne sont pas encore disponibles sur les machines distantes." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Installé" @@ -6283,6 +6318,11 @@ msgstr "Garder la branche" msgid "Keep me on track" msgstr "Garde-moi sur la bonne voie" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Conserver un seul ordre de fournisseurs partout. Désactivez pour l'organiser par machine." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Glyphe d'emplacement" msgid "Lock panel to the open thread" msgstr "Verrouiller le panneau sur le fil de discussion ouvert" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Le verrouillage conserve l'ordre de cette machine et l'applique partout." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Connectez-vous à Tailscale pour activer l’accès HTTPS via MagicDNS." @@ -7369,6 +7413,11 @@ msgstr "A besoin d'attention · Approbation requise" msgid "Needs Attention · Reply required" msgstr "A besoin d'attention · Réponse requise" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Attention requise sur {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7969,6 +8018,10 @@ msgstr "Aucune parole détectée." msgid "No staged changes" msgstr "Aucune modification indexée" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Cette machine n'a pas encore signalé d'état." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Aucune étape signalée" @@ -8046,6 +8099,10 @@ msgstr "Pas un dépôt git" msgid "Not a Git repository" msgstr "Pas un dépôt Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Pas encore détecté sur cette machine." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Pas trouvé" @@ -8128,6 +8185,7 @@ msgstr "Sources officielles uniquement" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Hors ligne" @@ -8147,6 +8205,11 @@ msgstr "sur" msgid "On" msgstr "Le" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "Sur {0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "À l'heure pile" @@ -8585,6 +8648,10 @@ msgstr "Associez un bureau depuis Connexions pour transférer ses ports." msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Associez un téléphone, une tablette ou un navigateur à ce bureau." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Associer une machine distante…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10481,6 +10548,11 @@ msgstr "Débogage d'exécution" msgid "Runtime options" msgstr "Options d'exécution" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Même ordre de fournisseurs sur toutes les machines" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Saturation et luminosité" @@ -10544,8 +10616,12 @@ msgstr "Enregistrer le raccourci" #~ msgstr "Clé API enregistrée" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Les informations d'identification enregistrées sont partagées dans tous les environnements." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Les informations d'identification enregistrées sont partagées dans tous les environnements." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Les identifiants enregistrés sont partagés entre toutes les machines." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10891,6 +10967,10 @@ msgstr "Sélectionner le candidat {0} ({label}) comme gagnant" msgid "Select device" msgstr "Sélectionner un appareil" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Sélectionner une machine" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Sélectionnez le modèle" @@ -11867,6 +11947,10 @@ msgstr "Compatible avec le mode rapide" msgid "Swap notes and to-dos" msgstr "Basculer entre les notes et les tâches" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Basculer" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12384,6 +12468,10 @@ msgstr "Ce code expire dans {countdown}" msgid "This code has expired." msgstr "Ce code a expiré." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Cet ordinateur" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Cette connexion peut voir les projets, mais pas les gérer. Associez-la à nouveau pour l’activer." @@ -12423,6 +12511,10 @@ msgstr "Cette page HTTPS n'a pas pu joindre l'ordinateur en HTTP simple. Autoris #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Ce lien ouvre l'application que Poracode sert sur votre réseau. L'application hébergée est servie en HTTPS, ce qui empêche les navigateurs de joindre un ordinateur en HTTP simple." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "cette machine" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Cette machine" @@ -13337,15 +13429,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Mise à jour vers {updateLabel} pour {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Mise à jour vers v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Mise à jour vers v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Mise à jour vers v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13867,7 +13961,6 @@ msgid "Will run in {0}:" msgstr "S'exécutera dans {0} :" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14096,6 +14189,11 @@ msgstr "Écrivez des notes pour ce projet…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/ja/messages.po b/src/renderer/locales/ja/messages.po index 420ff0192..648c04ca2 100644 --- a/src/renderer/locales/ja/messages.po +++ b/src/renderer/locales/ja/messages.po @@ -238,6 +238,11 @@ msgstr "{0} が匿名化されたチャット回答を比較しています…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} が匿名化された差分を比較しています…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} はオフラインです。最後に確認したステータスを表示しています。" + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -589,6 +594,11 @@ msgstr "{seconds}秒前" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# 個のサーバー} other {# 個のサーバー}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{providerLabel} の {serverName}: {disabledLabel}" @@ -1084,11 +1094,11 @@ msgstr "エージェントでエラーが発生しました。" #~ msgid "Agent for candidate {0}" #~ msgstr "候補 {0} のエージェント" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "エージェントはアクティブで準備完了です" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "エージェントは現在無効になっています" @@ -1235,6 +1245,10 @@ msgstr "すべての推論レベル" msgid "All files" msgstr "すべてのファイル" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "すべてのマシン" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3141,6 +3155,7 @@ msgstr "接続中..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "接続中…" @@ -4151,6 +4166,14 @@ msgstr "デタッチされた HEAD" #~ msgid "Details" #~ msgstr "詳細" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "検出" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "このマシンでエージェントを検出" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "プロジェクトファイルから検出" @@ -4440,6 +4463,11 @@ msgstr "草案" msgid "Drag to reorder how providers appear in the model picker." msgstr "ドラッグして、モデル ピッカーでのプロバイダーの表示順序を変更します。" +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "ドラッグして {0} のプロバイダーの順序を変更します。" + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "ドラッグして並べ替えます。ダブルクリックして編集します" @@ -4624,7 +4652,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "このプラグインのスキルとサーバーを新しいスレッドで有効にします。" #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "有効" @@ -6088,8 +6116,8 @@ msgid "Install {0}." msgstr "{0}をインストールします。" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "{env}をインストールする" +#~ msgid "Install {env}" +#~ msgstr "{env}をインストールする" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6154,6 +6182,10 @@ msgstr "管理対象スキルを {0} にインストールします。" msgid "Install native providers first; use ACP for additional protocol agents." msgstr "最初にネイティブプロバイダーをインストールします。追加のプロトコル エージェントには ACP を使用します。" +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "{env} にインストール" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Windows にインストールする" @@ -6194,11 +6226,14 @@ msgstr "v{updateVersion} をインストール" msgid "Install v{version}" msgstr "v{version} をインストール" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "リモートマシンでのインストール・更新・サインインはまだ利用できません。" + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "インストール済み" @@ -6282,6 +6317,11 @@ msgstr "ブランチを維持する" msgid "Keep me on track" msgstr "順調に進める" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "すべてのマシンで同じプロバイダー順序を使用します。オフにするとマシンごとに並べ替えられます。" + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6592,6 +6632,10 @@ msgstr "場所グリフ" msgid "Lock panel to the open thread" msgstr "パネルを開いているスレッドに固定する" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "ロックすると、このマシンの順序がすべてのマシンに適用されます。" + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "MagicDNS 経由の HTTPS アクセスを有効にするには Tailscale にログインしてください。" @@ -7368,6 +7412,11 @@ msgstr "注意が必要 · 承認が必要" msgid "Needs Attention · Reply required" msgstr "注意が必要 · 返信が必要です" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "{0} で対応が必要です" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7968,6 +8017,10 @@ msgstr "音声が検出されませんでした。" msgid "No staged changes" msgstr "ステージされた変更はありません" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "このマシンからのステータス報告はまだありません。" + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "報告されたステップはありません" @@ -8045,6 +8098,10 @@ msgstr "git リポジトリではありません" msgid "Not a Git repository" msgstr "Git リポジトリではありません" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "このマシンではまだ検出されていません。" + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "見つかりません" @@ -8127,6 +8184,7 @@ msgstr "公式ソースのみ" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "オフライン" @@ -8146,6 +8204,11 @@ msgstr "オン" msgid "On" msgstr "曜日" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0} のみ" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "毎正時" @@ -8584,6 +8647,10 @@ msgstr "「接続」からデスクトップをペアリングして、そのポ msgid "Pair a phone, tablet, or browser with this desktop." msgstr "このデスクトップとスマートフォン、タブレット、またはブラウザをペアリングします。" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "リモートマシンをペアリング…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10480,6 +10547,11 @@ msgstr "ランタイムデバッグ" msgid "Runtime options" msgstr "実行時オプション" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "すべてのマシンで同じプロバイダー順序" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "彩度と明度" @@ -10543,8 +10615,12 @@ msgstr "ショートカットを保存" #~ msgstr "保存済みの API キー" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "保存された認証情報はすべての環境で共有されます。" +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "保存された認証情報はすべての環境で共有されます。" + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "保存された認証情報はすべてのマシンで共有されます。" #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10890,6 +10966,10 @@ msgstr "候補 {0}({label})を勝者として選択" msgid "Select device" msgstr "デバイスを選択" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "マシンを選択" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "モデルを選択してください" @@ -11866,6 +11946,10 @@ msgstr "高速モードに対応" msgid "Swap notes and to-dos" msgstr "メモやToDoを交換する" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "切り替え" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12383,6 +12467,10 @@ msgstr "このコードは {countdown} で期限切れになります" msgid "This code has expired." msgstr "このコードは期限切れです。" +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "このコンピューター" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "この接続ではプロジェクトを表示できますが、管理はできません。有効にするには再度ペアリングしてください。" @@ -12422,6 +12510,10 @@ msgstr "この HTTPS ページは平文 HTTP のデスクトップに接続で #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "このリンクは Poracode がネットワーク上で提供しているアプリを開きます。ホスト版のアプリは HTTPS で配信されるため、ブラウザは平文 HTTP のデスクトップに接続できません。" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "このマシン" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "このマシン" @@ -13336,15 +13428,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "{0}({env}) の{updateLabel}への更新" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "v{0}に更新" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "v{latestRegistryVersion}に更新" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "v{latestRegistryVersion}に更新" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13866,7 +13960,6 @@ msgid "Will run in {0}:" msgstr "{0}で実行されます:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14095,6 +14188,11 @@ msgstr "このプロジェクトのメモを書いてください…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/ko/messages.po b/src/renderer/locales/ko/messages.po index 9b1d56fa8..3e3e32ce9 100644 --- a/src/renderer/locales/ko/messages.po +++ b/src/renderer/locales/ko/messages.po @@ -238,6 +238,11 @@ msgstr "{0}이(가) 익명화된 채팅 응답을 비교하고 있습니다…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0}이(가) 익명화된 diff를 비교하고 있습니다…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0}이(가) 오프라인입니다. 마지막으로 확인된 상태를 표시합니다." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds}초 전" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {서버 #개} other {서버 #개}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{providerLabel}의 {serverName}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "에이전트에 오류가 발생했습니다." #~ msgid "Agent for candidate {0}" #~ msgstr "후보 {0}의 에이전트" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "에이전트가 활성 상태이며 준비되었습니다" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "에이전트가 현재 비활성화되어 있습니다" @@ -1236,6 +1246,10 @@ msgstr "모든 추론 강도" msgid "All files" msgstr "모든 파일" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "모든 기기" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "연결 중..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "연결 중…" @@ -4152,6 +4167,14 @@ msgstr "분리된 HEAD" #~ msgid "Details" #~ msgstr "세부 정보" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "감지" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "이 기기에서 에이전트 감지" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "프로젝트 파일에서 감지" @@ -4441,6 +4464,11 @@ msgstr "초안" msgid "Drag to reorder how providers appear in the model picker." msgstr "모델 선택기에 공급자가 표시되는 방식을 바꾸려면 드래그하세요." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "드래그하여 {0}의 프로바이더 순서를 변경하세요." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "드래그하여 재정렬하세요. 편집하려면 두 번 클릭하세요." @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "새 스레드에서 이 플러그인의 스킬과 서버를 사용합니다." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "활성화됨" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "{0}을(를) 설치합니다." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "{env} 설치" +#~ msgid "Install {env}" +#~ msgstr "{env} 설치" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "관리형 스킬을 {0}에 설치합니다." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "기본 공급자를 먼저 설치하십시오. 추가 프로토콜 에이전트에는 ACP를 사용하십시오." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "{env}에 설치" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Windows에 설치" @@ -6195,11 +6227,14 @@ msgstr "v{updateVersion} 설치" msgid "Install v{version}" msgstr "v{version} 설치" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "원격 기기에서는 설치, 업데이트, 로그인을 아직 사용할 수 없습니다." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "설치됨" @@ -6283,6 +6318,11 @@ msgstr "브랜치 유지" msgid "Keep me on track" msgstr "계획대로 진행하기" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "모든 기기에서 하나의 프로바이더 순서를 유지합니다. 끄면 기기별로 정렬할 수 있습니다." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "위치 글리프" msgid "Lock panel to the open thread" msgstr "패널을 열린 스레드에 고정" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "잠그면 이 기기의 순서가 유지되어 모든 기기에 적용됩니다." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "MagicDNS를 통한 HTTPS 액세스를 활성화하려면 Tailscale에 로그인하세요." @@ -7370,6 +7414,11 @@ msgstr "주의 필요 · 승인 필요" msgid "Needs Attention · Reply required" msgstr "주의 필요 · 답변 필요" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "{0}에서 확인이 필요합니다" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "음성이 감지되지 않았습니다." msgid "No staged changes" msgstr "단계적 변경 없음" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "이 기기에서 아직 상태가 보고되지 않았습니다." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "보고된 단계 없음" @@ -8047,6 +8100,10 @@ msgstr "Git 저장소가 아닙니다." msgid "Not a Git repository" msgstr "Git 저장소가 아님" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "이 기기에서 아직 감지되지 않았습니다." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "찾을 수 없음" @@ -8129,6 +8186,7 @@ msgstr "공식 소스만" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "오프라인" @@ -8148,6 +8206,11 @@ msgstr "켜짐" msgid "On" msgstr "요일" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0}에서" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "정각" @@ -8586,6 +8649,10 @@ msgstr "연결에서 데스크톱을 페어링하여 포트를 포워딩하세 msgid "Pair a phone, tablet, or browser with this desktop." msgstr "휴대폰, 태블릿 또는 브라우저를 이 데스크톱과 페어링합니다." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "원격 기기 페어링…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "런타임 디버그" msgid "Runtime options" msgstr "런타임 옵션" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "모든 기기에서 동일한 프로바이더 순서" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "채도와 밝기" @@ -10545,8 +10617,12 @@ msgstr "단축키 저장" #~ msgstr "저장된 API 키" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "저장된 자격 증명은 모든 환경에서 공유됩니다." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "저장된 자격 증명은 모든 환경에서 공유됩니다." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "저장된 자격 증명은 모든 기기에서 공유됩니다." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "후보 {0}({label}): 우승자로 선택" msgid "Select device" msgstr "기기 선택" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "기기 선택" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "모델 선택" @@ -11868,6 +11948,10 @@ msgstr "고속 모드 지원" msgid "Swap notes and to-dos" msgstr "메모와 할 일 바꾸기" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "전환" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "이 코드는 {countdown} 후 만료됩니다" msgid "This code has expired." msgstr "이 코드는 만료되었습니다." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "이 컴퓨터" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "이 연결은 프로젝트를 볼 수 있지만 관리할 수 없습니다. 활성화하려면 다시 페어링하세요." @@ -12424,6 +12512,10 @@ msgstr "이 HTTPS 페이지는 일반 HTTP 데스크톱에 연결할 수 없었 #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "이 링크는 Poracode가 네트워크에서 제공하는 앱을 엽니다. 호스팅된 앱은 HTTPS로 제공되므로 브라우저가 일반 HTTP 데스크톱에 연결하는 것을 차단합니다." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "이 기기" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "이 기기" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "{0}({env})에 대한 {updateLabel}(으)로 업데이트" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "v{0}(으)로 업데이트" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "v{latestRegistryVersion}(으)로 업데이트" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "v{latestRegistryVersion}(으)로 업데이트" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "{0}에서 실행됩니다:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "이 프로젝트에 대한 메모를 작성하세요…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/pl/messages.po b/src/renderer/locales/pl/messages.po index a090fa21e..993d1b19c 100644 --- a/src/renderer/locales/pl/messages.po +++ b/src/renderer/locales/pl/messages.po @@ -238,6 +238,11 @@ msgstr "{0} porównuje zanonimizowane odpowiedzi na czacie…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} porównuje zanonimizowane różnice…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} jest offline. Wyświetlany jest ostatni znany stan." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds} s temu" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# serwer} other {# serwerów}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} z {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Agent napotkał błąd." #~ msgid "Agent for candidate {0}" #~ msgstr "Agent dla kandydata {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Agent jest aktywny i gotowy" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Agent jest aktualnie wyłączony" @@ -1236,6 +1246,10 @@ msgstr "Wszystkie poziomy" msgid "All files" msgstr "Wszystkie pliki" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Wszystkie komputery" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Łączenie..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Łączenie…" @@ -4152,6 +4167,14 @@ msgstr "odłączony HEAD" #~ msgid "Details" #~ msgstr "Szczegóły" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Wykryj" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Wykryj agentów na tym komputerze" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Wykryj z plików projektu" @@ -4441,6 +4464,11 @@ msgstr "Wersja robocza" msgid "Drag to reorder how providers appear in the model picker." msgstr "Przeciągnij, aby zmienić kolejność dostawców w selektorze modeli." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Przeciągnij, aby zmienić kolejność dostawców na {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Przeciągnij, aby zmienić kolejność; kliknij dwukrotnie, aby edytować" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Włącz umiejętności i serwery tej wtyczki dla nowych wątków." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Włączone" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Zainstaluj {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Zainstaluj {env}" +#~ msgid "Install {env}" +#~ msgstr "Zainstaluj {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Zainstaluj zarządzane umiejętności w {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Najpierw zainstaluj natywnych dostawców; użyj ACP dla dodatkowych agentów protokołu." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Zainstaluj: {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Zainstaluj w systemie Windows" @@ -6195,11 +6227,14 @@ msgstr "Zainstaluj v{updateVersion}" msgid "Install v{version}" msgstr "Zainstaluj v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Instalacja, aktualizacja i logowanie nie są jeszcze dostępne na zdalnych komputerach." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Zainstalowano" @@ -6283,6 +6318,11 @@ msgstr "Zachowaj gałąź" msgid "Keep me on track" msgstr "Pomóż mi trzymać się planu" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Zachowaj jedną kolejność dostawców wszędzie. Wyłącz, aby układać ją osobno dla każdego komputera." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Glif lokalizacji" msgid "Lock panel to the open thread" msgstr "Przypnij panel do otwartego wątku" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Zablokowanie zachowuje kolejność tego komputera i stosuje ją wszędzie." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Zaloguj się do Tailscale, aby włączyć dostęp HTTPS przez MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Wymaga uwagi · Wymagana zgoda" msgid "Needs Attention · Reply required" msgstr "Wymaga uwagi · Wymagana odpowiedź" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Wymaga uwagi na {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Nie wykryto mowy." msgid "No staged changes" msgstr "Żadnych zmian etapowych" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Ten komputer nie zgłosił jeszcze stanu." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Nie zgłoszono żadnych kroków" @@ -8047,6 +8100,10 @@ msgstr "To nie jest repozytorium git" msgid "Not a Git repository" msgstr "To nie jest repozytorium Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Jeszcze nie wykryto na tym komputerze." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Nie znaleziono" @@ -8129,6 +8186,7 @@ msgstr "Tylko oficjalne źródła" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Offline" @@ -8148,6 +8206,11 @@ msgstr "na" msgid "On" msgstr "W" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "O pełnej godzinie" @@ -8586,6 +8649,10 @@ msgstr "Sparuj komputer w sekcji Połączenia, aby przekierowywać jego porty." msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Sparuj telefon, tablet lub przeglądarkę z tym komputerem." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Sparuj zdalny komputer…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Debugowanie w czasie wykonywania" msgid "Runtime options" msgstr "Opcje środowiska wykonawczego" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Ta sama kolejność dostawców na wszystkich komputerach" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Nasycenie i jasność" @@ -10545,8 +10617,12 @@ msgstr "Zapisz skrót" #~ msgstr "Zapisany klucz API" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Zapisane poświadczenia są udostępniane we wszystkich środowiskach." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Zapisane poświadczenia są udostępniane we wszystkich środowiskach." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Zapisane dane logowania są wspólne dla wszystkich komputerów." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Wybierz kandydata {0} ({label}) jako zwycięzcę" msgid "Select device" msgstr "Wybierz urządzenie" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Wybierz komputer" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Wybierz model" @@ -11868,6 +11948,10 @@ msgstr "Obsługuje tryb szybki" msgid "Swap notes and to-dos" msgstr "Zamień notatki i zadania" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Przełącz" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Ten kod wygasa za {countdown}" msgid "This code has expired." msgstr "Ten kod wygasł." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Ten komputer" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "To połączenie może wyświetlać projekty, ale nie może nimi zarządzać. Sparuj ponownie, aby włączyć." @@ -12424,6 +12512,10 @@ msgstr "Ta strona HTTPS nie mogła połączyć się z desktopem po zwykłym HTTP #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Ten link otwiera aplikację, którą Poracode udostępnia w twojej sieci. Hostowana aplikacja jest serwowana przez HTTPS, co blokuje przeglądarkom dostęp do desktopa po zwykłym HTTP." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "ten komputer" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Ten komputer" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Aktualizacja do {updateLabel} dla {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Aktualizacja do wersji {0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Aktualizacja do wersji {latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Aktualizacja do wersji {latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Będzie działać w {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Napisz notatki do tego projektu…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/pt-BR/messages.po b/src/renderer/locales/pt-BR/messages.po index fc55abbaf..851246d0c 100644 --- a/src/renderer/locales/pt-BR/messages.po +++ b/src/renderer/locales/pt-BR/messages.po @@ -238,6 +238,11 @@ msgstr "{0} está comparando as respostas de chat anonimizadas…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} está comparando os diffs anonimizados…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} está offline. Exibindo o último status conhecido." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "há {seconds}s" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# servidor} other {# servidores}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} de {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "O agente encontrou um erro." #~ msgid "Agent for candidate {0}" #~ msgstr "Agente para o candidato {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "O agente está ativo e pronto" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "O agente está desativado no momento" @@ -1236,6 +1246,10 @@ msgstr "Todos os níveis de esforço" msgid "All files" msgstr "Todos os arquivos" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Todas as máquinas" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Conectando..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Conectando…" @@ -4152,6 +4167,14 @@ msgstr "HEAD desanexado" #~ msgid "Details" #~ msgstr "Detalhes" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Detectar" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Detectar agentes nesta máquina" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Detectar nos arquivos do projeto" @@ -4441,6 +4464,11 @@ msgstr "Rascunho" msgid "Drag to reorder how providers appear in the model picker." msgstr "Arraste para reordenar como os provedores aparecem no seletor de modelos." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Arraste para reordenar os provedores em {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Arraste para reordenar; clique duas vezes para editar" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Ative as skills e servidores deste plugin para novos threads." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Habilitado" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Instale {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Instalar {env}" +#~ msgid "Install {env}" +#~ msgstr "Instalar {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Instalar skills gerenciadas em {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Instale os provedores nativos primeiro; use ACP para agentes de protocolo adicionais." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Instalar em {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Instalar no Windows" @@ -6195,11 +6227,14 @@ msgstr "Instalar v{updateVersion}" msgid "Install v{version}" msgstr "Instalar v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Instalação, atualização e login ainda não estão disponíveis em máquinas remotas." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Instalado" @@ -6283,6 +6318,11 @@ msgstr "Manter branch" msgid "Keep me on track" msgstr "Mantenha-me no caminho certo" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Mantenha uma única ordem de provedores em todos os lugares. Desative para organizar por máquina." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Glifo de localização" msgid "Lock panel to the open thread" msgstr "Fixar o painel no tópico aberto" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Bloquear mantém a ordem desta máquina e a aplica em todos os lugares." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Entre no Tailscale para habilitar o acesso HTTPS pelo MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Precisa de atenção · Aprovação necessária" msgid "Needs Attention · Reply required" msgstr "Precisa de atenção · Resposta obrigatória" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Requer atenção em {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Nenhuma fala detectada." msgid "No staged changes" msgstr "Nenhuma alteração no stage" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Esta máquina ainda não informou o status." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Nenhuma etapa informada" @@ -8047,6 +8100,10 @@ msgstr "Não é um repositório git" msgid "Not a Git repository" msgstr "Não é um repositório Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Ainda não detectado nesta máquina." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Não encontrado" @@ -8129,6 +8186,7 @@ msgstr "Somente fontes oficiais" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Offline" @@ -8148,6 +8206,11 @@ msgstr "ativado" msgid "On" msgstr "Em" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "Em {0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "Na hora exata" @@ -8586,6 +8649,10 @@ msgstr "Pareie um desktop em Conexões para encaminhar suas portas." msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Pareie um celular, tablet ou navegador com este desktop." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Parear uma máquina remota…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Depuração de tempo de execução" msgid "Runtime options" msgstr "Opções de tempo de execução" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Mesma ordem de provedores em todas as máquinas" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Saturação e brilho" @@ -10545,8 +10617,12 @@ msgstr "Salvar atalho" #~ msgstr "Chave de API salva" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "As credenciais salvas são compartilhadas em todos os ambientes." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "As credenciais salvas são compartilhadas em todos os ambientes." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "As credenciais salvas são compartilhadas entre todas as máquinas." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Selecionar o candidato {0} ({label}) como vencedor" msgid "Select device" msgstr "Selecionar dispositivo" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Selecionar máquina" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Selecione o modelo" @@ -11868,6 +11948,10 @@ msgstr "Compatível com o modo rápido" msgid "Swap notes and to-dos" msgstr "Alternar entre notas e tarefas" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Alternar" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Este código expira em {countdown}" msgid "This code has expired." msgstr "Este código expirou." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Este computador" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Esta conexão pode ver projetos, mas não gerenciá-los. Faça o pareamento novamente para habilitar." @@ -12424,6 +12512,10 @@ msgstr "Esta página HTTPS não conseguiu alcançar o desktop em HTTP simples. P #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Este link abre o app que o Poracode serve na sua rede. O app hospedado é servido por HTTPS, o que impede os navegadores de alcançar um desktop em HTTP simples." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "esta máquina" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Esta máquina" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Atualizar para {updateLabel} para {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Atualizar para v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Atualizar para v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Atualizar para v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Será executado em {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Escreva notas para este projeto…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/ru/messages.po b/src/renderer/locales/ru/messages.po index 0e4e90e02..f595fdf1d 100644 --- a/src/renderer/locales/ru/messages.po +++ b/src/renderer/locales/ru/messages.po @@ -238,6 +238,11 @@ msgstr "{0} сравнивает анонимизированные ответы msgid "{0} is comparing the anonymized diffs…" msgstr "{0} сравнивает анонимизированные различия…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} офлайн. Показан последний известный статус." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds}с назад" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# сервер} other {# серверов}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} из {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Агент столкнулся с ошибкой." #~ msgid "Agent for candidate {0}" #~ msgstr "Агент для кандидата {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Агент активен и готов" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Агент сейчас отключён" @@ -1236,6 +1246,10 @@ msgstr "Все уровни рассуждений" msgid "All files" msgstr "Все файлы" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Все компьютеры" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Подключение..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Подключение…" @@ -4152,6 +4167,14 @@ msgstr "отделённый HEAD" #~ msgid "Details" #~ msgstr "Сведения" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Определить" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Найти агентов на этом компьютере" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Определить по файлам проекта" @@ -4441,6 +4464,11 @@ msgstr "Черновик" msgid "Drag to reorder how providers appear in the model picker." msgstr "Перетащите, чтобы изменить порядок отображения провайдеров в выборе модели." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Перетащите, чтобы изменить порядок провайдеров на {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Перетащите для изменения порядка; двойной щелчок для редактирования" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Включить навыки и серверы этого плагина для новых тредов." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Включено" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Установить {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Установить {env}" +#~ msgid "Install {env}" +#~ msgstr "Установить {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Установить управляемые навыки в {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Сначала установите нативные провайдеры; используйте ACP для дополнительных протокольных агентов." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Установить: {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Установить в Windows" @@ -6195,11 +6227,14 @@ msgstr "Установить v{updateVersion}" msgid "Install v{version}" msgstr "Установить v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Установка, обновление и вход пока недоступны на удалённых компьютерах." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Установлено" @@ -6283,6 +6318,11 @@ msgstr "Сохранить ветку" msgid "Keep me on track" msgstr "Помогай мне не сбиваться с курса" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Использовать один порядок провайдеров везде. Отключите, чтобы настраивать его для каждого компьютера." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Символ расположения" msgid "Lock panel to the open thread" msgstr "Закрепить панель за открытым тредом" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "При блокировке порядок этого компьютера будет применён везде." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Войдите в Tailscale, чтобы включить HTTPS-доступ через MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Требует внимания · Нужно одобрение" msgid "Needs Attention · Reply required" msgstr "Требует внимания · Нужен ответ" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Требует внимания: {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Речь не обнаружена." msgid "No staged changes" msgstr "Нет подготовленных изменений" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Этот компьютер ещё не сообщил статус." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Нет данных о шагах" @@ -8047,6 +8100,10 @@ msgstr "Не репозиторий git" msgid "Not a Git repository" msgstr "Не репозиторий Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "На этом компьютере ещё не обнаружено." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Не найдено" @@ -8129,6 +8186,7 @@ msgstr "Только официальные источники" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Офлайн" @@ -8148,6 +8206,11 @@ msgstr "вкл" msgid "On" msgstr "В день" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "В начале часа" @@ -8586,6 +8649,10 @@ msgstr "Подключите десктоп в разделе «Подключе msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Сопрягите телефон, планшет или браузер с этим рабочим столом." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Подключить удалённый компьютер…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Отладка среды выполнения" msgid "Runtime options" msgstr "Параметры среды выполнения" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Одинаковый порядок провайдеров на всех компьютерах" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Насыщенность и яркость" @@ -10545,8 +10617,12 @@ msgstr "Сохранить сочетание клавиш" #~ msgstr "Сохранённый API-ключ" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Сохранённые учётные данные используются во всех средах." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Сохранённые учётные данные используются во всех средах." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Сохранённые учётные данные общие для всех компьютеров." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Выбрать кандидата {0} ({label}) победителем" msgid "Select device" msgstr "Выбрать устройство" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Выбрать компьютер" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Выбрать модель" @@ -11868,6 +11948,10 @@ msgstr "Поддерживает быстрый режим" msgid "Swap notes and to-dos" msgstr "Поменять местами заметки и задачи" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Переключить" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Код истекает через {countdown}" msgid "This code has expired." msgstr "Срок действия кода истёк." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Этот компьютер" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Это подключение может просматривать проекты, но не управлять ими. Выполните сопряжение заново, чтобы включить управление." @@ -12424,6 +12512,10 @@ msgstr "Эта HTTPS-страница не смогла обратиться к #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Эта ссылка открывает приложение, которое Poracode раздаёт в вашей сети. Размещённое приложение работает по HTTPS, поэтому браузеры блокируют обращение к десктопу по обычному HTTP." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "этот компьютер" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Этот компьютер" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Обновить до {updateLabel} для {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Обновить до v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Обновить до v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Обновить до v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Будет выполнено в {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Напишите заметки для этого проекта…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/tr/messages.po b/src/renderer/locales/tr/messages.po index fe557d2ab..43a4b3517 100644 --- a/src/renderer/locales/tr/messages.po +++ b/src/renderer/locales/tr/messages.po @@ -238,6 +238,11 @@ msgstr "{0}, anonimleştirilmiş sohbet yanıtlarını karşılaştırıyor…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} anonimleştirilmiş farkları karşılaştırıyor…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} çevrimdışı. Bilinen son durum gösteriliyor." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds} sn önce" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# sunucu} other {# sunucu}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{providerLabel} kaynağından {serverName}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Temsilci bir hatayla karşılaştı." #~ msgid "Agent for candidate {0}" #~ msgstr "Aday {0} için ajan" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Temsilci aktif ve hazır" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Temsilci şu anda devre dışı" @@ -1236,6 +1246,10 @@ msgstr "Tüm efor düzeyleri" msgid "All files" msgstr "Tüm dosyalar" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Tüm makineler" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Bağlanıyor..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Bağlanıyor…" @@ -4152,6 +4167,14 @@ msgstr "ayrık HEAD" #~ msgid "Details" #~ msgstr "Ayrıntılar" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Algıla" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Bu makinedeki ajanları algıla" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Proje dosyalarından algıla" @@ -4441,6 +4464,11 @@ msgstr "Taslak" msgid "Drag to reorder how providers appear in the model picker." msgstr "Sağlayıcıların model seçicide nasıl görüneceğini yeniden sıralamak için sürükleyin." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "{0} üzerindeki sağlayıcıları yeniden sıralamak için sürükleyin." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Yeniden sıralamak için sürükleyin; düzenlemek için çift tıklayın" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Bu eklentinin becerilerini ve sunucularını yeni konular için etkinleştirin." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Etkin" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "{0} yükleyin." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "{env}'i yükleyin" +#~ msgid "Install {env}" +#~ msgstr "{env}'i yükleyin" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Yönetilen becerileri {0} konumuna yükle." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Önce yerel sağlayıcıları yükleyin; ek protokol aracıları için ACP'yi kullanın." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "{env} üzerine kur" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Windows'a yükleyin" @@ -6195,11 +6227,14 @@ msgstr "v{updateVersion} sürümünü yükle" msgid "Install v{version}" msgstr "v{version} sürümünü yükle" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Uzak makinelerde kurulum, güncelleme ve oturum açma henüz kullanılamıyor." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Yüklendi" @@ -6283,6 +6318,11 @@ msgstr "Şubeyi Koru" msgid "Keep me on track" msgstr "Beni yolunda tut" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Her yerde tek bir sağlayıcı sırası kullanın. Makine başına düzenlemek için kapatın." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Konum glifi" msgid "Lock panel to the open thread" msgstr "Paneli açık konuya sabitle" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Kilitlemek bu makinenin sırasını korur ve her yere uygular." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "MagicDNS üzerinden HTTPS erişimini etkinleştirmek için Tailscale'e giriş yapın." @@ -7370,6 +7414,11 @@ msgstr "Dikkat Edilmesi Gerekiyor · Onay gerekiyor" msgid "Needs Attention · Reply required" msgstr "Dikkat Edilmesi Gerekiyor · Yanıt gerekli" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "{0} üzerinde ilgi gerekiyor" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Konuşma algılanmadı." msgid "No staged changes" msgstr "Aşamalı değişiklik yok" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Bu makine henüz durum bildirmedi." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Bildirilen adım yok" @@ -8047,6 +8100,10 @@ msgstr "Git deposu değil" msgid "Not a Git repository" msgstr "Git deposu değil" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Bu makinede henüz algılanmadı." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Bulunamadı" @@ -8129,6 +8186,7 @@ msgstr "Yalnızca resmî kaynaklar" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Çevrimdışı" @@ -8148,6 +8206,11 @@ msgstr "açık" msgid "On" msgstr "Gün" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0} üzerinde" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "Saat başında" @@ -8586,6 +8649,10 @@ msgstr "Portlarını yönlendirmek için Bağlantılar'dan bir masaüstü eşle msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Bir telefonu, tableti veya tarayıcıyı bu masaüstüyle eşleştirin." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Uzak makine eşleştir…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Çalışma zamanı hata ayıklaması" msgid "Runtime options" msgstr "Çalışma zamanı seçenekleri" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Tüm makinelerde aynı sağlayıcı sırası" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Doygunluk ve parlaklık" @@ -10545,8 +10617,12 @@ msgstr "Kısayolu kaydet" #~ msgstr "Kaydedilmiş API anahtarı" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Kaydedilen kimlik bilgileri tüm ortamlarda paylaşılır." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Kaydedilen kimlik bilgileri tüm ortamlarda paylaşılır." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Kaydedilen kimlik bilgileri tüm makineler arasında paylaşılır." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "{0} numaralı adayı ({label}) kazanan olarak seç" msgid "Select device" msgstr "Cihaz seç" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Makine seç" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Modeli seçin" @@ -11868,6 +11948,10 @@ msgstr "Hızlı modu destekler" msgid "Swap notes and to-dos" msgstr "Notları ve yapılacak işleri değiştir" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Geç" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Bu kodun süresi {countdown} içinde doluyor" msgid "This code has expired." msgstr "Bu kodun süresi doldu." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Bu bilgisayar" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Bu bağlantı projeleri görüntüleyebilir ancak yönetemez. Etkinleştirmek için yeniden eşleştirin." @@ -12424,6 +12512,10 @@ msgstr "Bu HTTPS sayfası düz HTTP kullanan masaüstüne ulaşamadı. Bu siteye #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Bu bağlantı, Poracode'un ağınızda sunduğu uygulamayı açar. Barındırılan uygulama HTTPS üzerinden sunulduğu için tarayıcılar düz HTTP kullanan bir masaüstüne erişimi engeller." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "bu makine" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Bu makine" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "{0} ({env}) için {updateLabel} güncellemesi" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "v{0}'ye güncelleme" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "v{latestRegistryVersion}'ye güncelleme" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "v{latestRegistryVersion}'ye güncelleme" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "{0} içinde çalışacak:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Bu proje için notlar yazın…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/uk/messages.po b/src/renderer/locales/uk/messages.po index 7508fb1b8..c06cdf5ca 100644 --- a/src/renderer/locales/uk/messages.po +++ b/src/renderer/locales/uk/messages.po @@ -238,6 +238,11 @@ msgstr "{0} порівнює анонімізовані відповіді в ч msgid "{0} is comparing the anonymized diffs…" msgstr "{0} порівнює анонімізовані відмінності…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} офлайн. Показано останній відомий статус." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds}с тому" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# сервер} other {# серверів}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} з {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Агент натрапив на помилку." #~ msgid "Agent for candidate {0}" #~ msgstr "Агент для кандидата {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Агент активний і готовий" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Агент зараз вимкнено" @@ -1236,6 +1246,10 @@ msgstr "Усі рівні зусиль" msgid "All files" msgstr "Усі файли" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Усі комп’ютери" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Підключення..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Підключення…" @@ -4152,6 +4167,14 @@ msgstr "відокремлений HEAD" #~ msgid "Details" #~ msgstr "Відомості" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Виявити" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Знайти агентів на цьому комп’ютері" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Визначити з файлів проєкту" @@ -4441,6 +4464,11 @@ msgstr "Чернетка" msgid "Drag to reorder how providers appear in the model picker." msgstr "Перетягніть, щоб змінити порядок відображення провайдерів у виборі моделі." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Перетягніть, щоб змінити порядок провайдерів на {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Перетягніть для зміни порядку; подвійний клік для редагування" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Увімкнути навички та сервери цього плагіна для нових тредів." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Увімкнено" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Встановити {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Встановити {env}" +#~ msgid "Install {env}" +#~ msgstr "Встановити {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Установити керовані навички в {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Спершу встановіть нативні провайдери; використовуйте ACP для додаткових протокольних агентів." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Встановити: {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Встановити у Windows" @@ -6195,11 +6227,14 @@ msgstr "Встановити v{updateVersion}" msgid "Install v{version}" msgstr "Встановити v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Встановлення, оновлення та вхід поки недоступні на віддалених комп’ютерах." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Встановлено" @@ -6283,6 +6318,11 @@ msgstr "Зберегти гілку" msgid "Keep me on track" msgstr "Допомагай мені тримати курс" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Використовувати один порядок провайдерів скрізь. Вимкніть, щоб налаштовувати його для кожного комп’ютера." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Символ розташування" msgid "Lock panel to the open thread" msgstr "Закріпити панель за відкритим тредом" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Під час блокування порядок цього комп’ютера буде застосовано скрізь." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Увійдіть у Tailscale, щоб увімкнути HTTPS-доступ через MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Потребує уваги · Потрібне схвалення" msgid "Needs Attention · Reply required" msgstr "Потребує уваги · Потрібна відповідь" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Потребує уваги: {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Мовлення не виявлено." msgid "No staged changes" msgstr "Немає підготовлених змін" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Цей комп’ютер ще не повідомив статус." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Немає даних про кроки" @@ -8047,6 +8100,10 @@ msgstr "Не репозиторій git" msgid "Not a Git repository" msgstr "Не репозиторій Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "На цьому комп’ютері ще не виявлено." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Не знайдено" @@ -8129,6 +8186,7 @@ msgstr "Лише офіційні джерела" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Офлайн" @@ -8148,6 +8206,11 @@ msgstr "увімк" msgid "On" msgstr "У день" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "{0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "На початку години" @@ -8586,6 +8649,10 @@ msgstr "Підключіть комп'ютер у розділі «Підклю msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Спаруйте телефон, планшет або браузер із цим робочим столом." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Під’єднати віддалений комп’ютер…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Налагодження середовища виконання" msgid "Runtime options" msgstr "Параметри середовища виконання" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Однаковий порядок провайдерів на всіх комп’ютерах" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Насиченість та яркість" @@ -10545,8 +10617,12 @@ msgstr "Зберегти комбінацію клавіш" #~ msgstr "Збережений API-ключ" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Збережені облікові дані використовуються в усіх середовищах." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Збережені облікові дані використовуються в усіх середовищах." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Збережені облікові дані спільні для всіх комп’ютерів." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Вибрати кандидата {0} ({label}) переможцем" msgid "Select device" msgstr "Вибрати пристрій" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Вибрати комп’ютер" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Вибрати модель" @@ -11868,6 +11948,10 @@ msgstr "Підтримує швидкий режим" msgid "Swap notes and to-dos" msgstr "Поміняти місцями нотатки та завдання" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Перемкнути" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Код спливає за {countdown}" msgid "This code has expired." msgstr "Термін дії коду сплив." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Цей комп’ютер" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Це підключення може переглядати проєкти, але не керувати ними. Створіть сполучення заново, щоб увімкнути керування." @@ -12424,6 +12512,10 @@ msgstr "Ця HTTPS-сторінка не змогла звернутися до #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Це посилання відкриває застосунок, який Poracode роздає у вашій мережі. Розміщений застосунок працює через HTTPS, тому браузери блокують звернення до десктопа через звичайний HTTP." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "цей комп’ютер" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Цей комп’ютер" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Оновити до {updateLabel} для {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Оновити до v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Оновити до v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Оновити до v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Буде виконано в {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Напишіть нотатки для цього проекту…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/vi/messages.po b/src/renderer/locales/vi/messages.po index fd73e210e..362b2b044 100644 --- a/src/renderer/locales/vi/messages.po +++ b/src/renderer/locales/vi/messages.po @@ -238,6 +238,11 @@ msgstr "{0} đang so sánh các câu trả lời trò chuyện đã ẩn danh… msgid "{0} is comparing the anonymized diffs…" msgstr "{0} đang so sánh các diff đã ẩn danh…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} đang ngoại tuyến. Hiển thị trạng thái đã biết gần nhất." + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds} giây trước" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# máy chủ} other {# máy chủ}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{serverName} từ {providerLabel}: {disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "Tác nhân đã gặp lỗi." #~ msgid "Agent for candidate {0}" #~ msgstr "Tác nhân cho ứng viên {0}" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "Tác nhân đang hoạt động và sẵn sàng" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "Tác nhân hiện đang bị vô hiệu hóa" @@ -1236,6 +1246,10 @@ msgstr "Tất cả mức nỗ lực" msgid "All files" msgstr "Tất cả các tập tin" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "Tất cả các máy" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "Đang kết nối..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "Đang kết nối…" @@ -4152,6 +4167,14 @@ msgstr "HEAD tách rời" #~ msgid "Details" #~ msgstr "Chi tiết" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "Phát hiện" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "Phát hiện agent trên máy này" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "Phát hiện từ tệp dự án" @@ -4441,6 +4464,11 @@ msgstr "Bản nháp" msgid "Drag to reorder how providers appear in the model picker." msgstr "Kéo để sắp xếp lại cách các nhà cung cấp xuất hiện trong bộ chọn mô hình." +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "Kéo để sắp xếp lại các nhà cung cấp trên {0}." + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "Kéo để sắp xếp lại; nhấp đúp để chỉnh sửa" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "Bật skill và máy chủ của plugin này cho các luồng mới." #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "Đã bật" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "Cài đặt {0}." #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "Cài đặt {env}" +#~ msgid "Install {env}" +#~ msgstr "Cài đặt {env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "Cài đặt các skill được quản lý vào {0}." msgid "Install native providers first; use ACP for additional protocol agents." msgstr "Cài đặt nhà cung cấp gốc trước; sử dụng ACP cho các tác nhân giao thức bổ sung." +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "Cài đặt trên {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "Cài đặt trên Windows" @@ -6195,11 +6227,14 @@ msgstr "Cài đặt v{updateVersion}" msgid "Install v{version}" msgstr "Cài đặt v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "Cài đặt, cập nhật và đăng nhập chưa khả dụng trên máy từ xa." + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "Đã cài đặt" @@ -6283,6 +6318,11 @@ msgstr "Giữ nhánh" msgid "Keep me on track" msgstr "Giúp tôi đi đúng hướng" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "Giữ một thứ tự nhà cung cấp cho mọi nơi. Tắt để sắp xếp theo từng máy." + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "Ký tự vị trí" msgid "Lock panel to the open thread" msgstr "Ghim bảng vào luồng đang mở" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "Khóa sẽ giữ thứ tự của máy này và áp dụng cho mọi nơi." + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "Đăng nhập vào Tailscale để bật quyền truy cập HTTPS qua MagicDNS." @@ -7370,6 +7414,11 @@ msgstr "Cần chú ý · Cần có sự phê duyệt" msgid "Needs Attention · Reply required" msgstr "Cần chú ý · Cần trả lời" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "Cần chú ý trên {0}" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7970,6 +8019,10 @@ msgstr "Không phát hiện thấy giọng nói nào." msgid "No staged changes" msgstr "Không có thay đổi nào được đưa vào staging" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "Máy này chưa báo cáo trạng thái." + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "Không có bước nào được báo cáo" @@ -8047,6 +8100,10 @@ msgstr "Không phải là kho lưu trữ git" msgid "Not a Git repository" msgstr "Không phải kho lưu trữ Git" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "Chưa được phát hiện trên máy này." + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "Không tìm thấy" @@ -8129,6 +8186,7 @@ msgstr "Chỉ nguồn chính thức" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "Ngoại tuyến" @@ -8148,6 +8206,11 @@ msgstr "trên" msgid "On" msgstr "Vào" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "Trên {0}" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "Đúng đầu giờ" @@ -8586,6 +8649,10 @@ msgstr "Ghép đôi một máy tính từ Kết nối để chuyển tiếp các msgid "Pair a phone, tablet, or browser with this desktop." msgstr "Ghép đôi điện thoại, máy tính bảng hoặc trình duyệt với máy tính này." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "Ghép nối máy từ xa…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10482,6 +10549,11 @@ msgstr "Gỡ lỗi thời gian chạy" msgid "Runtime options" msgstr "Tùy chọn thời gian chạy" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "Cùng thứ tự nhà cung cấp trên tất cả các máy" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "Độ bão hòa và độ sáng" @@ -10545,8 +10617,12 @@ msgstr "Lưu phím tắt" #~ msgstr "Khóa API đã lưu" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "Thông tin đăng nhập đã lưu được chia sẻ trên tất cả các môi trường." +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "Thông tin đăng nhập đã lưu được chia sẻ trên tất cả các môi trường." + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "Thông tin đăng nhập đã lưu được dùng chung cho tất cả các máy." #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10892,6 +10968,10 @@ msgstr "Chọn ứng viên {0} ({label}) làm ứng viên thắng" msgid "Select device" msgstr "Chọn thiết bị" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "Chọn máy" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "Chọn mô hình" @@ -11868,6 +11948,10 @@ msgstr "Hỗ trợ chế độ nhanh" msgid "Swap notes and to-dos" msgstr "Hoán đổi ghi chú và việc cần làm" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "Chuyển" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12385,6 +12469,10 @@ msgstr "Mã này hết hạn sau {countdown}" msgid "This code has expired." msgstr "Mã này đã hết hạn." +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "Máy tính này" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "Kết nối này có thể xem dự án nhưng không thể quản lý. Hãy ghép nối lại để bật." @@ -12424,6 +12512,10 @@ msgstr "Trang HTTPS này không thể kết nối tới desktop dùng HTTP thu #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "Liên kết này mở ứng dụng mà Poracode phục vụ trong mạng của bạn. Ứng dụng được host chạy qua HTTPS, nên trình duyệt chặn việc kết nối tới desktop dùng HTTP thuần." +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "máy này" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "Máy này" @@ -13338,15 +13430,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "Cập nhật lên {updateLabel} cho {0} ({env})" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "Cập nhật lên v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "Cập nhật lên v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "Cập nhật lên v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13868,7 +13962,6 @@ msgid "Will run in {0}:" msgstr "Sẽ chạy trong {0}:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14097,6 +14190,11 @@ msgstr "Viết ghi chú cho dự án này…" msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/locales/zh-CN/messages.po b/src/renderer/locales/zh-CN/messages.po index 04187494b..da8bc8103 100644 --- a/src/renderer/locales/zh-CN/messages.po +++ b/src/renderer/locales/zh-CN/messages.po @@ -238,6 +238,11 @@ msgstr "{0} 正在比较匿名化的聊天回复…" msgid "{0} is comparing the anonymized diffs…" msgstr "{0} 正在比较匿名化的差异…" +#. placeholder {0}: props.machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "{0} is offline. Showing last known status." +msgstr "{0} 已离线。正在显示最后已知状态。" + #. placeholder {0}: summary.maxLabel #: src/renderer/components/thread/ThreadContextDock.tsx msgid "{0} limit" @@ -590,6 +595,11 @@ msgstr "{seconds} 秒前" msgid "{serverCount, plural, one {# server} other {# servers}}" msgstr "{serverCount, plural, one {# 个服务器} other {# 个服务器}}" +#. placeholder {0}: ref.env.distro +#: src/renderer/utils/machineLabels.ts +msgid "{serverName} · WSL {0}" +msgstr "{serverName} · WSL {0}" + #: src/renderer/components/mcp/McpExternalImportModal.tsx msgid "{serverName} from {providerLabel}: {disabledLabel}" msgstr "{providerLabel} 的 {serverName}:{disabledLabel}" @@ -1085,11 +1095,11 @@ msgstr "代理遇到错误。" #~ msgid "Agent for candidate {0}" #~ msgstr "候选项 {0} 的智能体" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is active and ready" msgstr "代理已激活并准备就绪" -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Agent is currently disabled" msgstr "代理当前已禁用" @@ -1236,6 +1246,10 @@ msgstr "全部级别" msgid "All files" msgstr "所有文件" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "All machines" +msgstr "所有设备" + #: src/mobile/views/ThreadsView.tsx #: src/renderer/views/MainView/parts/Sidebar/parts/SidebarProjectFilter.tsx msgid "All projects" @@ -3142,6 +3156,7 @@ msgstr "连接中..." #: src/renderer/components/thread/ChatPane/ChatTurnElapsed.tsx #: src/renderer/components/thread/ThreadDraftView.tsx #: src/renderer/components/thread/ThreadHeaderStatus.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Connecting…" msgstr "正在连接…" @@ -4152,6 +4167,14 @@ msgstr "分离的 HEAD" #~ msgid "Details" #~ msgstr "详细信息" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect" +msgstr "检测" + +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Detect agents on this machine" +msgstr "在此设备上检测代理" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconPicker.tsx #~ msgid "Detect from project files" #~ msgstr "从项目文件检测" @@ -4441,6 +4464,11 @@ msgstr "草稿" msgid "Drag to reorder how providers appear in the model picker." msgstr "拖动以重新排序提供程序在模型选择器中的显示方式。" +#. placeholder {0}: selectedMachine.label +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Drag to reorder providers on {0}." +msgstr "拖动以调整 {0} 上提供方的顺序。" + #: src/renderer/views/MainView/parts/RightPanel/parts/NotesPanel/TodoRow.tsx msgid "Drag to reorder; double-click to edit" msgstr "拖动即可重新排序;双击进行编辑" @@ -4625,7 +4653,7 @@ msgid "Enable this plugin's skills and servers for new threads." msgstr "为新会话启用此插件的技能和服务器。" #: src/renderer/components/skills/SkillsManager.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Enabled" msgstr "启用" @@ -6089,8 +6117,8 @@ msgid "Install {0}." msgstr "安装{0}。" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx -msgid "Install {env}" -msgstr "安装{env}" +#~ msgid "Install {env}" +#~ msgstr "安装{env}" #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #~ msgid "Install @cursor/sdk to configure its API key." @@ -6155,6 +6183,10 @@ msgstr "将托管技能安装到{0}。" msgid "Install native providers first; use ACP for additional protocol agents." msgstr "首先安装原生提供程序;使用 ACP 作为附加协议代理。" +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx +msgid "Install on {env}" +msgstr "安装到 {env}" + #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "Install on Windows" msgstr "在 Windows 上安装" @@ -6195,11 +6227,14 @@ msgstr "安装 v{updateVersion}" msgid "Install v{version}" msgstr "安装 v{version}" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Install, update, and sign-in are not yet available on remote machines." +msgstr "远程设备暂不支持安装、更新和登录。" + #: src/renderer/components/plugins/PluginMarketplace.tsx #: src/renderer/components/skills/SkillMarketplaceModal.tsx #: src/renderer/views/SettingsOverlay/parts/CursorProviderSettings.tsx #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx -#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx msgid "Installed" msgstr "已安装" @@ -6283,6 +6318,11 @@ msgstr "保留分支" msgid "Keep me on track" msgstr "让我保持正轨" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Keep one provider order everywhere. Turn off to arrange per machine." +msgstr "在所有设备上保持同一提供方顺序。关闭后可按设备分别排序。" + #: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx #: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts msgid "Keep Poracode in the system tray when it launches at startup." @@ -6593,6 +6633,10 @@ msgstr "位置图标" msgid "Lock panel to the open thread" msgstr "将面板锁定到打开的线程" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +msgid "Locking keeps this machine's order and applies it everywhere." +msgstr "锁定后将保留此设备的顺序并应用到所有设备。" + #: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx msgid "Log in to Tailscale to enable HTTPS access through MagicDNS." msgstr "登录 Tailscale 以通过 MagicDNS 启用 HTTPS 访问。" @@ -7369,6 +7413,11 @@ msgstr "需要注意 · 需要批准" msgid "Needs Attention · Reply required" msgstr "需要关注 · 需要回复" +#. placeholder {0}: machine.label +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Needs attention on {0}" +msgstr "{0} 上需要处理" + #: src/mobile/presentation.ts #: src/renderer/components/thread/ThreadHeaderStatus.tsx msgid "Needs reply" @@ -7969,6 +8018,10 @@ msgstr "未检测到语音。" msgid "No staged changes" msgstr "没有暂存的更改" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "No status reported by this machine yet." +msgstr "此设备尚未报告状态。" + #: src/renderer/views/GitHubActionsView/GitHubActionsRunList.tsx #~ msgid "No steps reported" #~ msgstr "未报告任何步骤" @@ -8046,6 +8099,10 @@ msgstr "不是 git 存储库" msgid "Not a Git repository" msgstr "不是 Git 存储库" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Not detected on this machine yet." +msgstr "尚未在此设备上检测到。" + #: src/renderer/components/thread/AgentDiscoveryScreen.tsx msgid "Not found" msgstr "未找到" @@ -8128,6 +8185,7 @@ msgstr "仅官方来源" #: src/mobile/remoteConnectionState.ts #: src/renderer/components/common/RemoteServerStatusDot.tsx +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx msgid "Offline" msgstr "离线" @@ -8147,6 +8205,11 @@ msgstr "开" msgid "On" msgstr "日期" +#. placeholder {0}: props.machineLabel ?? t`this machine` +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "On {0}" +msgstr "在 {0} 上" + #: src/renderer/views/SchedulesView/ScheduleEditor.tsx msgid "On the hour" msgstr "整点" @@ -8585,6 +8648,10 @@ msgstr "在“连接”中配对一台桌面设备以转发其端口。" msgid "Pair a phone, tablet, or browser with this desktop." msgstr "将手机、平板电脑或浏览器与此桌面配对。" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Pair a remote machine…" +msgstr "配对远程设备…" + #: src/mobile/components.tsx #: src/mobile/remoteConnectionState.ts msgid "Pair again" @@ -10481,6 +10548,11 @@ msgstr "运行时调试" msgid "Runtime options" msgstr "运行时选项" +#: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts +msgid "Same provider order on all machines" +msgstr "所有设备使用相同的提供方顺序" + #: src/renderer/views/ProjectSettingsOverlay/parts/ProjectIconSources.tsx msgid "Saturation and brightness" msgstr "饱和度与亮度" @@ -10544,8 +10616,12 @@ msgstr "保存快捷键" #~ msgstr "已保存的 API 密钥" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Saved credentials are shared across all environments." -msgstr "保存的凭据在所有环境中共享。" +#~ msgid "Saved credentials are shared across all environments." +#~ msgstr "保存的凭据在所有环境中共享。" + +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +msgid "Saved credentials are shared across all machines." +msgstr "已保存的凭据在所有设备间共享。" #: src/renderer/views/SettingsOverlay/parts/TerminalSettings.tsx msgid "Saved shell" @@ -10891,6 +10967,10 @@ msgstr "选择候选项 {0}({label})作为优胜者" msgid "Select device" msgstr "选择设备" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx +msgid "Select machine" +msgstr "选择设备" + #: src/renderer/components/common/ProviderModelMenu/ProviderModelMenu.tsx msgid "Select model" msgstr "选择模型" @@ -11867,6 +11947,10 @@ msgstr "支持快速模式" msgid "Swap notes and to-dos" msgstr "切换笔记和待办事项" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx +msgid "Switch" +msgstr "切换" + #: src/mobile/views/WorkspaceView.tsx #: src/renderer/views/GitReviewOverlay/GitReviewOverlay.tsx #: src/renderer/views/GitReviewOverlay/parts/GitReviewPanel.tsx @@ -12384,6 +12468,10 @@ msgstr "此代码将在 {countdown} 后过期" msgid "This code has expired." msgstr "此代码已过期。" +#: src/renderer/utils/machineLabels.ts +msgid "This computer" +msgstr "这台电脑" + #: src/mobile/views/ManageProjectsView.tsx msgid "This connection can view projects but not manage them. Re-pair to enable." msgstr "此连接可以查看项目,但不能管理项目。请重新配对以启用。" @@ -12423,6 +12511,10 @@ msgstr "此 HTTPS 页面无法连接使用纯 HTTP 的桌面。请允许该站 #~ msgid "This link opens the app Poracode serves on your network. The hosted app is served over HTTPS, which browsers block from reaching a plain-HTTP desktop." #~ msgstr "此链接会打开 Poracode 在你网络中提供的应用。托管版应用通过 HTTPS 提供,浏览器会因此阻止它连接使用纯 HTTP 的桌面。" +#: src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx +msgid "this machine" +msgstr "此设备" + #: src/renderer/views/SettingsOverlay/parts/ArchivedThreadsSettings.tsx msgid "This machine" msgstr "此设备" @@ -13337,15 +13429,17 @@ msgid "Update to {updateLabel} for {0} ({env})" msgstr "将{0}({env})更新到{updateLabel}" #. placeholder {0}: agent.version +#. placeholder {0}: props.latestRegistryVersion #. placeholder {0}: update.targetVersion #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx msgid "Update to v{0}" msgstr "更新到 v{0}" #: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx -msgid "Update to v{latestRegistryVersion}" -msgstr "更新到 v{latestRegistryVersion}" +#~ msgid "Update to v{latestRegistryVersion}" +#~ msgstr "更新到 v{latestRegistryVersion}" #: src/renderer/views/GitReviewOverlay/parts/GitReviewSidebar/parts/PrSection.tsx msgid "Update with merge commit" @@ -13867,7 +13961,6 @@ msgid "Will run in {0}:" msgstr "将在{0}运行:" #: src/renderer/components/mcp/McpProjectDestinationDropdown.tsx -#: src/renderer/components/thread/AgentDiscoveryScreen.tsx #: src/renderer/views/MainView/parts/CreateProject/CreateProjectMenu.tsx #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -14096,6 +14189,11 @@ msgstr "为这个项目写笔记..." msgid "WSL" msgstr "WSL" +#. placeholder {0}: env.distro +#: src/renderer/utils/machineLabels.ts +msgid "WSL · {0}" +msgstr "WSL · {0}" + #. placeholder {0}: status.envDistro #: src/renderer/views/SettingsOverlay/parts/AcpRegistrySettings.tsx msgid "WSL ({0})" diff --git a/src/renderer/state/agentStatusesStore.test.ts b/src/renderer/state/agentStatusesStore.test.ts index 729b3795f..51bc4c794 100644 --- a/src/renderer/state/agentStatusesStore.test.ts +++ b/src/renderer/state/agentStatusesStore.test.ts @@ -47,7 +47,7 @@ beforeEach(reset); describe("persisted agent status cache", () => { it("invalidates v15 statuses cached before Command Code's live-only model discovery", async () => { const options = useAgentStatusesStore.persist.getOptions(); - expect(options.version).toBe(16); + expect(options.version).toBe(17); const staleCommandCode = makeStatus({ kind: "commandcode", label: "Command Code", @@ -79,7 +79,7 @@ describe("persisted agent status cache", () => { it("invalidates v10 statuses whose terminal auth methods lack baseSpawnEnv-derived env", async () => { const options = useAgentStatusesStore.persist.getOptions(); - expect(options.version).toBe(16); + expect(options.version).toBe(17); const staleLogin = makeStatus({ kind: "antigravity", label: "Antigravity", @@ -106,7 +106,7 @@ describe("persisted agent status cache", () => { it("invalidates v14 statuses that grouped Cursor Grok under Other models", async () => { const options = useAgentStatusesStore.persist.getOptions(); - expect(options.version).toBe(16); + expect(options.version).toBe(17); const staleCursor = makeStatus({ kind: "cursor", label: "Cursor", @@ -139,7 +139,7 @@ describe("persisted agent status cache", () => { it("invalidates v8 statuses cached before successful ACP sessions established auth", async () => { const options = useAgentStatusesStore.persist.getOptions(); - expect(options.version).toBe(16); + expect(options.version).toBe(17); const staleAcp = makeStatus({ kind: "acp-generic:example", label: "Example ACP", @@ -166,7 +166,7 @@ describe("persisted agent status cache", () => { it("invalidates v6 statuses produced without the Grok login-shell environment", async () => { const options = useAgentStatusesStore.persist.getOptions(); - expect(options.version).toBe(16); + expect(options.version).toBe(17); expect(options.migrate).toBeTypeOf("function"); const grok = makeStatus({ diff --git a/src/renderer/state/agentStatusesStore.ts b/src/renderer/state/agentStatusesStore.ts index 419642c7f..b9091cbb7 100644 --- a/src/renderer/state/agentStatusesStore.ts +++ b/src/renderer/state/agentStatusesStore.ts @@ -263,10 +263,10 @@ export const useAgentStatusesStore = create()( }), { name: "poracode-agent-statuses-v1", - version: 16, - // v16 mirrors supervisor STATUS_CACHE_VERSION=19 so this localStorage - // copy does not keep Command Code's pre-live-discovery curated model - // table (deepseek fallbacks, static `defaultEffort`) on first paint. + version: 17, + // v17 mirrors supervisor STATUS_CACHE_VERSION=20: detection now resolves + // per-machine agent-setting overrides, so statuses cached under + // kind-global settings must not survive the upgrade on first paint. migrate: (persisted) => { const prev = (persisted ?? {}) as Partial; return { diff --git a/src/renderer/state/machineSelectionStore.ts b/src/renderer/state/machineSelectionStore.ts new file mode 100644 index 000000000..9023df4e9 --- /dev/null +++ b/src/renderer/state/machineSelectionStore.ts @@ -0,0 +1,17 @@ +import { create } from "zustand"; +import { LOCAL_NATIVE_MACHINE_KEY } from "@/shared/machines"; + +/** + * Which machine the Agents settings area is currently scoped to. Session-only + * by design: every launch starts back at the local machine, so a stale + * selection can never silently point install/login actions at another host. + */ +interface MachineSelectionState { + selectedMachineId: string; + setSelectedMachine(machineId: string): void; +} + +export const useMachineSelectionStore = create((set) => ({ + selectedMachineId: LOCAL_NATIVE_MACHINE_KEY, + setSelectedMachine: (machineId) => set({ selectedMachineId: machineId }), +})); diff --git a/src/renderer/state/machines.test.ts b/src/renderer/state/machines.test.ts new file mode 100644 index 000000000..2004b2df2 --- /dev/null +++ b/src/renderer/state/machines.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, it } from "vitest"; +import type { AgentStatus } from "@/shared/contracts"; +import { deriveMachines, machineIdForStatus } from "./machines"; + +function status(overrides: Partial): AgentStatus { + return { + kind: "codex", + label: "Codex", + installed: true, + authState: "authenticated", + capabilities: { + models: [], + efforts: [], + modelEfforts: {}, + modes: [], + approvalPolicies: [], + sandboxModes: [], + supportsResume: true, + supportsDirectInput: true, + liveInputMode: "server", + presentationMode: "terminal", + settingDefs: [], + }, + ...overrides, + } as AgentStatus; +} + +describe("deriveMachines", () => { + it("always lists the local machine first and dedupes/sorts WSL distros", () => { + const machines = deriveMachines({ + enumeratedDistros: ["Ubuntu", "Debian"], + projectDistros: ["Ubuntu", "Alpine"], + remoteServers: [], + remoteRuntime: {}, + }); + expect(machines.map((machine) => machine.id)).toEqual([ + "local", + "local/wsl:Alpine", + "local/wsl:Debian", + "local/wsl:Ubuntu", + ]); + expect(machines[0]!.status).toBe("online"); + }); + + it("adds remote machines with connection state and their WSL distros", () => { + const machines = deriveMachines({ + enumeratedDistros: [], + projectDistros: [], + remoteServers: [{ desktopId: "desk-1", label: "Studio" }], + remoteRuntime: { + "desk-1": { + status: "online", + agentStatuses: { wsl: [{ envDistro: "Ubuntu" }, { envDistro: "Ubuntu" }, {}] }, + }, + }, + }); + expect(machines.map((machine) => machine.id)).toEqual([ + "local", + "remote:desk-1", + "remote:desk-1/wsl:Ubuntu", + ]); + expect(machines[1]!.status).toBe("online"); + expect(machines[1]!.label).toBe("Studio"); + }); + + it("marks unpaired runtime states offline", () => { + const machines = deriveMachines({ + enumeratedDistros: [], + projectDistros: [], + remoteServers: [{ desktopId: "desk-2", label: "Laptop" }], + remoteRuntime: {}, + }); + expect(machines[1]!.status).toBe("offline"); + }); +}); + +describe("machineIdForStatus", () => { + it("buckets local statuses by env", () => { + expect(machineIdForStatus(status({ envKind: "windows" }))).toBe("local"); + expect(machineIdForStatus(status({ envKind: "posix" }))).toBe("local"); + expect(machineIdForStatus(status({ envKind: "wsl", envDistro: "Ubuntu" }))).toBe( + "local/wsl:Ubuntu", + ); + }); +}); diff --git a/src/renderer/state/machines.ts b/src/renderer/state/machines.ts new file mode 100644 index 000000000..14b7ec3a5 --- /dev/null +++ b/src/renderer/state/machines.ts @@ -0,0 +1,185 @@ +import { create } from "zustand"; +import { readBridge } from "@/renderer/bridge"; +import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; +import { useAppStore } from "@/renderer/state/appStore"; +import { useMachineSelectionStore } from "@/renderer/state/machineSelectionStore"; +import { buildWslProjectDistrosKey, parseWslProjectDistrosKey } from "@/renderer/state/projectKeys"; +import { useRemoteServersStore } from "@/renderer/state/remoteServersStore"; +import { localEnvLabel, machineLabel } from "@/renderer/utils/machineLabels"; +import type { AgentStatus } from "@/shared/contracts"; +import { + agentEnvForStatus, + machineKey, + LOCAL_NATIVE_MACHINE_KEY, + type MachineRef, +} from "@/shared/machines"; + +/** One selectable machine in the Agents settings area. */ +export interface MachineDescriptor { + /** `machineKey(ref)` — stable id used for selection and settings maps. */ + id: string; + ref: MachineRef; + kind: "local" | "local-wsl" | "remote" | "remote-wsl"; + label: string; + status: "online" | "offline" | "connecting"; + desktopId?: string; + wslDistro?: string; +} + +/** + * Locally enumerated WSL distros (registry-backed supervisor probe), fetched + * when the Agents settings area mounts. Unioned with project-derived distros + * so a distro appears even when only one of the two sources knows about it. + */ +interface WslDistroListState { + distros: string[]; + loaded: boolean; + refresh(): Promise; +} + +export const useWslDistroListStore = create((set) => ({ + distros: [], + loaded: false, + refresh: async () => { + try { + const distros = await readBridge().listWslDistros(); + set({ distros, loaded: true }); + } catch { + // Enumeration is best-effort; project-derived distros remain available. + set({ loaded: true }); + } + }, +})); + +function remoteStatusOf(status: string | undefined): MachineDescriptor["status"] { + if (status === "online") return "online"; + if (status === "connecting") return "connecting"; + return "offline"; +} + +/** + * Derive the machine list: local host, local WSL distros (enumerated ∪ + * project-derived), and each paired remote server plus the WSL distros its + * agent statuses report. Pure given its inputs; exported for tests. + */ +export function deriveMachines(inputs: { + enumeratedDistros: readonly string[]; + projectDistros: readonly string[]; + /** Distros already present in detected WSL agent statuses. */ + statusDistros?: readonly string[]; + remoteServers: readonly { desktopId: string; label: string }[]; + remoteRuntime: Readonly< + Record< + string, + { status: string; agentStatuses?: { wsl: readonly { envDistro?: string | undefined }[] } } + > + >; +}): MachineDescriptor[] { + const machines: MachineDescriptor[] = [ + { + id: LOCAL_NATIVE_MACHINE_KEY, + ref: { host: "local", env: { kind: "native" } }, + kind: "local", + label: localEnvLabel({ kind: "native" }), + status: "online", + }, + ]; + const localDistros = [ + ...new Set([ + ...inputs.enumeratedDistros, + ...inputs.projectDistros, + ...(inputs.statusDistros ?? []), + ]), + ].sort(); + for (const distro of localDistros) { + const ref: MachineRef = { host: "local", env: { kind: "wsl", distro } }; + machines.push({ + id: machineKey(ref), + ref, + kind: "local-wsl", + label: localEnvLabel(ref.env), + status: "online", + wslDistro: distro, + }); + } + const remoteName = (desktopId: string) => + inputs.remoteServers.find((server) => server.desktopId === desktopId)?.label ?? desktopId; + for (const server of inputs.remoteServers) { + const runtime = inputs.remoteRuntime[server.desktopId]; + const status = remoteStatusOf(runtime?.status); + const nativeRef: MachineRef = { + host: "remote", + desktopId: server.desktopId, + env: { kind: "native" }, + }; + machines.push({ + id: machineKey(nativeRef), + ref: nativeRef, + kind: "remote", + label: machineLabel(nativeRef, { remoteName }), + status, + desktopId: server.desktopId, + }); + const remoteDistros = [ + ...new Set( + (runtime?.agentStatuses?.wsl ?? []) + .map((remoteStatus) => remoteStatus.envDistro) + .filter((distro): distro is string => Boolean(distro)), + ), + ].sort(); + for (const distro of remoteDistros) { + const ref: MachineRef = { + host: "remote", + desktopId: server.desktopId, + env: { kind: "wsl", distro }, + }; + machines.push({ + id: machineKey(ref), + ref, + kind: "remote-wsl", + label: machineLabel(ref, { remoteName }), + status, + desktopId: server.desktopId, + wslDistro: distro, + }); + } + } + return machines; +} + +/** Machines currently selectable in the Agents settings area. */ +export function useMachines(): MachineDescriptor[] { + const enumeratedDistros = useWslDistroListStore((state) => state.distros); + const projectDistrosKey = useAppStore((state) => buildWslProjectDistrosKey(state.projects)); + const wslAgentStatuses = useAgentStatusesStore((state) => state.wslAgentStatuses); + const remoteServers = useRemoteServersStore((state) => state.servers); + const remoteRuntime = useRemoteServersStore((state) => state.runtime); + return deriveMachines({ + enumeratedDistros, + projectDistros: parseWslProjectDistrosKey(projectDistrosKey), + statusDistros: wslAgentStatuses + .map((status) => status.envDistro) + .filter((distro): distro is string => Boolean(distro)), + remoteServers, + remoteRuntime, + }); +} + +/** The selected machine, falling back to the local host when it disappears. */ +export function useSelectedMachine(): MachineDescriptor { + const machines = useMachines(); + const selectedMachineId = useMachineSelectionStore((state) => state.selectedMachineId); + return ( + machines.find((machine) => machine.id === selectedMachineId) ?? + machines.find((machine) => machine.id === LOCAL_NATIVE_MACHINE_KEY) ?? + machines[0]! + ); +} + +/** + * Machine id a *local* agent status belongs to. Remote statuses never flow + * through the local status stores, so bucketing by env is sufficient here. + */ +export function machineIdForStatus(status: AgentStatus): string { + return machineKey({ host: "local", env: agentEnvForStatus(status) }); +} diff --git a/src/renderer/state/sharedSettingsStore.ts b/src/renderer/state/sharedSettingsStore.ts index 877c18157..781e0d07d 100644 --- a/src/renderer/state/sharedSettingsStore.ts +++ b/src/renderer/state/sharedSettingsStore.ts @@ -43,6 +43,12 @@ import { uninstallPlugin as removeInstalledPlugin, } from "@/shared/plugins/catalog"; import { incrementAgentSelectionUsage } from "@/shared/crossagentRanking"; +import { isSensitiveAgentSetting } from "@/shared/agentSecrets"; +import { + effectiveProviderOrder, + type MachineScopeMode, + type MachineScopeModes, +} from "@/shared/machineSettings"; const STORAGE_KEY = "poracode-shared-settings"; @@ -88,6 +94,16 @@ interface SharedSettingsState extends SharedSettings { setCrossagentProviderPaused: (agentKind: string, paused: boolean) => void; setCrossagentHiddenModels: (agentKind: string, hiddenIds: string[]) => void; setProviderOrder: (order: string[]) => void; + setMachineScopeMode: (domain: keyof MachineScopeModes, mode: MachineScopeMode) => void; + setMachineProviderOrder: (machineId: string, order: string[]) => void; + /** Relock: adopt `machineId`'s effective order globally and clear overrides. */ + lockProviderOrderToMachine: (machineId: string) => void; + setMachineAgentSetting: ( + machineId: string, + agentKind: string, + key: string, + value: boolean | string, + ) => void; setCollapseTerminalComposer: (value: boolean) => void; setCliPickerTarget: (value: CliPickerTarget) => void; setStaleThreadUnloadMinutes: (value: number) => void; @@ -472,6 +488,58 @@ export const useSharedSettings = create()((set, get) => ({ set({ providerOrder: next }); persistSettings(selectSharedSettings(get())); }, + setMachineScopeMode: (domain, mode) => { + const current = get().machineScopeModes; + if (current[domain] === mode) return; + set({ machineScopeModes: { ...current, [domain]: mode } }); + persistSettings(selectSharedSettings(get())); + }, + setMachineProviderOrder: (machineId, order) => { + const machineSettings = get().machineSettings; + const next = [...new Set(order.filter((kind) => typeof kind === "string" && kind.length > 0))]; + // An empty order removes the override — the machine falls back to the + // global order (mirrors the global reset semantics). + const { providerOrder: _previousOrder, ...entry } = machineSettings[machineId] ?? {}; + set({ + machineSettings: { + ...machineSettings, + [machineId]: next.length > 0 ? { ...entry, providerOrder: next } : entry, + }, + }); + persistSettings(selectSharedSettings(get())); + }, + lockProviderOrderToMachine: (machineId) => { + const state = get(); + const adopted = [...effectiveProviderOrder(state, machineId)]; + const machineSettings = Object.fromEntries( + Object.entries(state.machineSettings).map(([key, entry]) => { + const { providerOrder: _providerOrder, ...rest } = entry; + return [key, rest]; + }), + ); + set({ + providerOrder: adopted, + machineScopeModes: { ...state.machineScopeModes, providerOrder: "synced" }, + machineSettings, + }); + persistSettings(selectSharedSettings(get())); + }, + setMachineAgentSetting: (machineId, agentKind, key, value) => { + // Secrets are sealed per host and must never be machine-keyed. + if (isSensitiveAgentSetting(agentKind, key)) { + throw new Error(`Refusing to store sensitive agent setting per machine: ${key}`); + } + const machineSettings = get().machineSettings; + const entry = machineSettings[machineId]; + const agentSettings = { + ...entry?.agentSettings, + [agentKind]: { ...entry?.agentSettings?.[agentKind], [key]: value }, + }; + set({ + machineSettings: { ...machineSettings, [machineId]: { ...entry, agentSettings } }, + }); + persistSettings(selectSharedSettings(get())); + }, setCollapseTerminalComposer: (collapseTerminalComposer) => { set({ collapseTerminalComposer }); persistSettings(selectSharedSettings(get())); @@ -1006,6 +1074,8 @@ function selectSharedSettings(state: SharedSettingsState): SharedSettingsInput { wslConflictResolverFast: state.wslConflictResolverFast, wslConflictResolverPresentationMode: state.wslConflictResolverPresentationMode, agentSettings: state.agentSettings, + machineScopeModes: state.machineScopeModes, + machineSettings: state.machineSettings, hiddenModels: state.hiddenModels, disabledAgents: state.disabledAgents, providerOrder: state.providerOrder, diff --git a/src/renderer/utils/acpRegistryAuth.ts b/src/renderer/utils/acpRegistryAuth.ts index 509d144eb..725de3d3f 100644 --- a/src/renderer/utils/acpRegistryAuth.ts +++ b/src/renderer/utils/acpRegistryAuth.ts @@ -8,6 +8,7 @@ import type { } from "@/shared/contracts"; import { useAppStore } from "@/renderer/state/appStore"; import { buildWslProjectDistrosKey, parseWslProjectDistrosKey } from "@/renderer/state/projectKeys"; +import { localEnvLabel } from "@/renderer/utils/machineLabels"; type StatusAuthMethod = NonNullable[number]; @@ -101,8 +102,10 @@ export function statusUpdateScope(status: AgentStatus): { } export function envLabelForStatus(status: AgentStatus): string { - if (status.envKind === "wsl") return status.envDistro ? `WSL (${status.envDistro})` : "WSL"; - if (status.envKind === "windows") return "Windows"; + if (status.envKind === "wsl") { + return status.envDistro ? localEnvLabel({ kind: "wsl", distro: status.envDistro }) : "WSL"; + } + if (status.envKind === "windows") return localEnvLabel({ kind: "native" }); return ""; } diff --git a/src/renderer/utils/machineLabels.ts b/src/renderer/utils/machineLabels.ts new file mode 100644 index 000000000..71aaf269e --- /dev/null +++ b/src/renderer/utils/machineLabels.ts @@ -0,0 +1,22 @@ +import { msg } from "@lingui/core/macro"; +import { i18n } from "@/renderer/i18n/i18n"; +import type { AgentEnv, MachineRef } from "@/shared/machines"; + +/** + * The one user-facing label convention for machines and envs. Replaces the + * historical trio (`"Windows"`/`"WSL (X)"`, `"Native"`/`"WSL · X"`, + * `"Windows"`/`"WSL: X"`) so every surface names a machine the same way. + */ +export function localEnvLabel(env: AgentEnv): string { + return env.kind === "wsl" ? i18n._(msg`WSL · ${env.distro}`) : i18n._(msg`This computer`); +} + +/** Label for a machine; remote names come from the paired server record. */ +export function machineLabel( + ref: MachineRef, + options: { remoteName: (desktopId: string) => string }, +): string { + if (ref.host === "local") return localEnvLabel(ref.env); + const serverName = options.remoteName(ref.desktopId); + return ref.env.kind === "wsl" ? i18n._(msg`${serverName} · WSL ${ref.env.distro}`) : serverName; +} diff --git a/src/renderer/views/SettingsOverlay/SettingsOverlay.test.tsx b/src/renderer/views/SettingsOverlay/SettingsOverlay.test.tsx index 95fa54326..63d384cc4 100644 --- a/src/renderer/views/SettingsOverlay/SettingsOverlay.test.tsx +++ b/src/renderer/views/SettingsOverlay/SettingsOverlay.test.tsx @@ -62,6 +62,8 @@ vi.mock("@/renderer/components/layout/PageLayout", () => ({ vi.mock("@/renderer/components/common", () => ({ PixelLoader: () => , + TuxIcon: () => , + Select: () => , SidebarButton: (props: { icon?: ReactNode; label: string; diff --git a/src/renderer/views/SettingsOverlay/SettingsOverlay.tsx b/src/renderer/views/SettingsOverlay/SettingsOverlay.tsx index a058e5b01..bf86e5f80 100644 --- a/src/renderer/views/SettingsOverlay/SettingsOverlay.tsx +++ b/src/renderer/views/SettingsOverlay/SettingsOverlay.tsx @@ -39,6 +39,7 @@ import { PluginsSettings } from "./parts/PluginsSettings"; import { SettingsSidebar } from "./parts/SettingsSidebar"; import { WorkspacesSettings } from "./parts/WorkspacesSettings"; import { AgentSettingsEmpty, SingleAgentSettings } from "./parts/SingleAgentSettings"; +import { AgentsMachineBar } from "./parts/machineScope/AgentsMachineBar"; import type { SettingsSection } from "./parts/types"; const SECTION_VIEWS: Partial ReactNode>> = { @@ -189,6 +190,8 @@ export function SettingsOverlay(props: { onClose: () => void }) { .map((status) => status.kind), ); const isAgentsSectionActive = activeSection === "agents" || activeSection.startsWith("agents:"); + const isMachineScopedSection = + activeSection === "agentsGeneral" || activeSection.startsWith("agents:"); const wslDistros = wslProjectDistrosKey ? wslProjectDistrosKey.split("\0") : []; const section = renderSection(activeSection, navigateToSection); @@ -247,17 +250,23 @@ export function SettingsOverlay(props: { onClose: () => void }) { {section} ) : ( -
- {section} - {isAgentsSectionActive && isRefreshingAgents ? ( -
- -
- ) : null} +
+
+ {section} + {isAgentsSectionActive && isRefreshingAgents ? ( +
+ +
+ ) : null} +
+ {/* Floats over the scroll area rather than living in the section's + flow, so it keeps its position and state across agent-section + remounts (`key={activeSection}`). */} + {isMachineScopedSection ? : null}
) } diff --git a/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.test.tsx b/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.test.tsx index 0c2abb3ab..eecce6ce8 100644 --- a/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.test.tsx +++ b/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.test.tsx @@ -17,7 +17,16 @@ const statusesState = { const settingsState = { providerOrder: [] as string[], + machineScopeModes: { + providerOrder: "synced" as const, + hiddenModels: "synced" as const, + disabledAgents: "synced" as const, + }, + machineSettings: {} as Record, setProviderOrder: vi.fn<(order: string[]) => void>(), + setMachineScopeMode: vi.fn<(domain: string, mode: string) => void>(), + setMachineProviderOrder: vi.fn<(machineId: string, order: string[]) => void>(), + lockProviderOrderToMachine: vi.fn<(machineId: string) => void>(), acpRegistryInstalledAgents: {} as Record, syncAcpRegistryInstalledAgents: vi.fn<(installed: InstalledAcpRegistryAgent[]) => void>(), }; @@ -67,6 +76,12 @@ vi.mock("@/renderer/bridge", () => ({ readBridge: () => bridge, })); +vi.mock("@/renderer/state/remoteServersStore", () => ({ + useRemoteServersStore: ( + selector: (state: { servers: never[]; runtime: Record }) => unknown, + ) => selector({ servers: [], runtime: {} }), +})); + vi.mock("@heroui/react", () => ({ toast: toastMock, Button: (props: { @@ -100,6 +115,9 @@ vi.mock("@dnd-kit/react/sortable", () => ({ vi.mock("@/renderer/components/common", () => ({ PixelLoader: () => , + ToggleSwitch: (props: { "aria-label"?: string; isSelected?: boolean }) => ( + + ), })); vi.mock("@/renderer/components/providers/ProviderIcon", () => ({ @@ -147,7 +165,7 @@ describe("ModelOrderSection provider updates", () => { expect(screen.getByText("—")).toBeTruthy(); }); - it("breaks the version out per environment only when they disagree", async () => { + it("scopes each provider row's version to the selected machine", async () => { statusesState.agentStatuses = [ makeStatus({ kind: "claude", label: "Claude Code", version: "1.2.3", envKind: "windows" }), makeStatus({ kind: "codex", label: "Codex", version: "1.0.0", envKind: "windows" }), @@ -171,11 +189,11 @@ describe("ModelOrderSection provider updates", () => { render(); - expect(await screen.findByText("Windows v1.2.3 · WSL (Ubuntu) v1.1.0")).toHaveClass( - "max-w-[45%]", - "truncate", - ); + // The default scope is the local machine, so only its versions render — + // the WSL copy belongs to the "local/wsl:Ubuntu" machine. + expect(await screen.findByText("v1.2.3")).toBeTruthy(); expect(screen.getByText("v1.0.0")).toBeTruthy(); + expect(screen.queryByText(/WSL/)).toBeNull(); }); it("offers a per-provider update when the published version is newer", async () => { @@ -388,10 +406,12 @@ describe("ModelOrderSection provider updates", () => { }); }); - it("updates each outdated environment of a provider once", async () => { + it("updates only the selected machine's environment", async () => { statusesState.agentStatuses = [ makeStatus({ kind: "claude", label: "Claude Code", version: "1.2.3", envKind: "windows" }), ]; + // A WSL copy belongs to another machine and must not be touched by an + // update-all run scoped to the local machine. statusesState.wslAgentStatuses = [ makeStatus({ kind: "claude", @@ -407,10 +427,9 @@ describe("ModelOrderSection provider updates", () => { fireEvent.click(await screen.findByRole("button", { name: "Update all" })); - await waitFor(() => expect(bridge.updateAgentBinary).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(bridge.updateAgentBinary).toHaveBeenCalledTimes(1)); expect(bridge.updateAgentBinary.mock.calls.map(([payload]) => payload)).toEqual([ { agentKind: "claude", envKind: "windows" }, - { agentKind: "claude", envKind: "wsl", wslDistro: "Ubuntu" }, ]); }); @@ -433,34 +452,20 @@ describe("ModelOrderSection provider updates", () => { expect(toastMock.success).not.toHaveBeenCalled(); }); - it("still updates the remaining environments when one environment fails", async () => { + it("reports a failed machine update without claiming success", async () => { statusesState.agentStatuses = [ makeStatus({ kind: "claude", label: "Claude Code", version: "1.2.3", envKind: "windows" }), ]; - statusesState.wslAgentStatuses = [ - makeStatus({ - kind: "claude", - label: "Claude Code", - version: "1.1.0", - envKind: "wsl", - envDistro: "Ubuntu", - }), - ]; bridge.getLatestAgentVersion.mockResolvedValue({ source: "npm", version: "1.3.0" }); - bridge.updateAgentBinary.mockImplementation(({ envKind }) => - Promise.resolve( - envKind === "windows" ? { ok: true } : { ok: false, output: "npm ERR! EACCES" }, - ), - ); + bridge.updateAgentBinary.mockResolvedValue({ ok: false, output: "npm ERR! EACCES" }); render(); fireEvent.click(await screen.findByRole("button", { name: "Update Claude Code to v1.3.0" })); - await waitFor(() => expect(bridge.updateAgentBinary).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(bridge.updateAgentBinary).toHaveBeenCalledTimes(1)); expect(bridge.updateAgentBinary.mock.calls.map(([payload]) => payload)).toEqual([ { agentKind: "claude", envKind: "windows" }, - { agentKind: "claude", envKind: "wsl", wslDistro: "Ubuntu" }, ]); expect(toastMock.danger).toHaveBeenCalledWith("Unable to update Claude Code: npm ERR! EACCES"); expect(toastMock.success).not.toHaveBeenCalled(); diff --git a/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx b/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx index 057b9b613..dfc365cc2 100644 --- a/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx +++ b/src/renderer/views/SettingsOverlay/parts/ModelOrderSection.tsx @@ -7,10 +7,13 @@ import type { AgentStatus } from "@/shared/contracts"; import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; import { getSettingsInstalledAgents } from "@/shared/agentStatus"; -import { PixelLoader } from "@/renderer/components/common"; +import { PixelLoader, ToggleSwitch } from "@/renderer/components/common"; import { ProviderIcon } from "@/renderer/components/providers/ProviderIcon"; import { getProviderModelPickerRank } from "@/renderer/components/providers/providerManifest"; import { useProviderUpdates, type ProviderUpdateEntry } from "./useProviderUpdates"; +import { machineIdForStatus, useMachines, useSelectedMachine } from "@/renderer/state/machines"; +import { useRemoteServersStore } from "@/renderer/state/remoteServersStore"; +import { effectiveProviderOrder } from "@/shared/machineSettings"; function resolveDisplayedKinds( installed: readonly AgentStatus[], @@ -144,17 +147,56 @@ export function ModelOrderSection() { const agentStatuses = useAgentStatusesStore((s) => s.agentStatuses); const wslAgentStatuses = useAgentStatusesStore((s) => s.wslAgentStatuses); const providerOrder = useSharedSettings((s) => s.providerOrder); + const machineScopeModes = useSharedSettings((s) => s.machineScopeModes); + const machineSettings = useSharedSettings((s) => s.machineSettings); const setProviderOrder = useSharedSettings((s) => s.setProviderOrder); + const setMachineScopeMode = useSharedSettings((s) => s.setMachineScopeMode); + const setMachineProviderOrder = useSharedSettings((s) => s.setMachineProviderOrder); + const lockProviderOrderToMachine = useSharedSettings((s) => s.lockProviderOrderToMachine); - const installedAgents = getSettingsInstalledAgents(agentStatuses, wslAgentStatuses); - const displayedKinds = resolveDisplayedKinds(installedAgents, providerOrder); + const machines = useMachines(); + const selectedMachine = useSelectedMachine(); + const isRemoteMachine = selectedMachine.ref.host === "remote"; + const remoteRuntime = useRemoteServersStore((s) => + selectedMachine.desktopId ? s.runtime[selectedMachine.desktopId] : undefined, + ); + const orderLocked = machineScopeModes.providerOrder === "synced"; + const activeOrder = effectiveProviderOrder( + { machineScopeModes, machineSettings, providerOrder }, + selectedMachine.id, + ); + + // The list shows the selected machine's providers: local machines filter the + // local status stores by machine; remote machines read the paired host's + // already-collected statuses. + const installedAgents = isRemoteMachine + ? getSettingsInstalledAgents( + selectedMachine.ref.env.kind === "native" + ? (remoteRuntime?.agentStatuses?.windows ?? []) + : [], + (remoteRuntime?.agentStatuses?.wsl ?? []).filter( + (a) => a.envDistro === selectedMachine.wslDistro, + ), + ) + : getSettingsInstalledAgents( + agentStatuses.filter((a) => machineIdForStatus(a) === selectedMachine.id), + wslAgentStatuses.filter((a) => machineIdForStatus(a) === selectedMachine.id), + ); + const displayedKinds = resolveDisplayedKinds(installedAgents, activeOrder); const byKind = new Map(installedAgents.map((a) => [a.kind, a])); const orderedAgents = displayedKinds .map((kind) => byKind.get(kind)) .filter((a): a is AgentStatus => a !== undefined); - const isCustomized = providerOrder.length > 0; - const updates = useProviderUpdates(orderedAgents); + const isCustomized = orderLocked + ? providerOrder.length > 0 + : (machineSettings[selectedMachine.id]?.providerOrder?.length ?? 0) > 0; + const applyOrder = (next: string[]) => { + if (orderLocked) setProviderOrder(next); + else setMachineProviderOrder(selectedMachine.id, next); + }; + // Update actions run on the local supervisor only. + const updates = useProviderUpdates(isRemoteMachine ? [] : orderedAgents, selectedMachine.id); const updateAllProgress = updates.updateAllProgress; const updateAllProgressLabel = updateAllProgress ? updateAllProgress.phase === "probing" @@ -173,7 +215,7 @@ export function ModelOrderSection() { const [moved] = next.splice(fromIndex, 1); if (!moved) return; next.splice(toIndex, 0, moved); - setProviderOrder(next); + applyOrder(next); } if (orderedAgents.length === 0) return null; @@ -191,7 +233,7 @@ export function ModelOrderSection() { {isCustomized ? (

- Drag to reorder how providers appear in the model picker. + {orderLocked || machines.length <= 1 ? ( + Drag to reorder how providers appear in the model picker. + ) : ( + Drag to reorder providers on {selectedMachine.label}. + )}

+ {machines.length > 1 ? ( +
+
+

+ Same provider order on all machines +

+

+ {orderLocked ? ( + Keep one provider order everywhere. Turn off to arrange per machine. + ) : ( + Locking keeps this machine's order and applies it everywhere. + )} +

+
+ { + if (selected) lockProviderOrderToMachine(selectedMachine.id); + else setMachineScopeMode("providerOrder", "per-machine"); + }} + /> +
+ ) : null}
{orderedAgents.map((agent, index) => ( diff --git a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.test.tsx b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.test.tsx index 6758e01e1..7955a2821 100644 --- a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.test.tsx +++ b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.test.tsx @@ -285,6 +285,12 @@ vi.mock("@/renderer/state/agentStatusesStore", () => ({ ), })); +vi.mock("@/renderer/state/remoteServersStore", () => ({ + useRemoteServersStore: ( + selector: (state: { servers: never[]; runtime: Record }) => unknown, + ) => selector({ servers: [], runtime: {} }), +})); + vi.mock("@/renderer/state/sharedSettingsStore", () => ({ useSharedSettings: (selector: (state: typeof sharedSettingsState) => unknown) => selector(sharedSettingsState), @@ -330,6 +336,7 @@ vi.mock("@/renderer/components/common", () => ({ ), })); +import { useMachineSelectionStore } from "@/renderer/state/machineSelectionStore"; import { useProviderUsageStore } from "@/renderer/state/providerUsageStore"; import { SingleAgentSettings } from "./SingleAgentSettings"; @@ -404,8 +411,14 @@ describe("SingleAgentSettings", () => { runAgentInstallCommandMock.mockReset().mockReturnValue(true); runAgentLoginCommandMock.mockReset().mockReturnValue(true); useProviderUsageStore.setState({ snapshots: {} }); + useMachineSelectionStore.setState({ selectedMachineId: "local" }); }); + /** Scope the Agents pages to another machine, as the machine bar would. */ + const selectMachine = (machineId: string) => { + act(() => useMachineSelectionStore.getState().setSelectedMachine(machineId)); + }; + it("renders identity metadata as a single compact summary line", () => { statusesState.agentStatuses = [ makeStatus("claude", { @@ -546,8 +559,9 @@ describe("SingleAgentSettings", () => { render(); - expect(within(envRow("WSL (Ubuntu)")).queryByText(/ChatGPT Pro/)).not.toBeInTheDocument(); - expect(within(envRow("Windows")).getByText(/ChatGPT Pro 20x/)).toBeInTheDocument(); + expect(within(envRow("This computer")).getByText(/ChatGPT Pro 20x/)).toBeInTheDocument(); + selectMachine("local/wsl:Ubuntu"); + expect(within(envRow("WSL · Ubuntu")).queryByText(/ChatGPT Pro/)).not.toBeInTheDocument(); }); it("renders a Claude profile editor before detection has reported the profile status", () => { @@ -644,6 +658,7 @@ describe("SingleAgentSettings", () => { ]; render(); + selectMachine("local/wsl:Ubuntu"); fireEvent.click(screen.getByRole("button", { name: /login/i })); expect(runAgentLoginCommandMock).toHaveBeenCalledWith({ @@ -709,11 +724,13 @@ describe("SingleAgentSettings", () => { render(); - const windowsRow = envRow("Windows"); - const wslRow = envRow("WSL (Ubuntu)"); + const windowsRow = envRow("This computer"); expect(within(windowsRow).getByRole("button", { name: /login/i })).toBeInTheDocument(); + expect(screen.queryByText(/This computer, WSL · Ubuntu needs authentication/u)).toBeNull(); + + selectMachine("local/wsl:Ubuntu"); + const wslRow = envRow("WSL · Ubuntu"); expect(within(wslRow).getByRole("button", { name: /login/i })).toBeInTheDocument(); - expect(screen.queryByText(/Windows, WSL \(Ubuntu\) needs authentication/u)).toBeNull(); fireEvent.click(within(wslRow).getByRole("button", { name: /login/i })); @@ -732,7 +749,7 @@ describe("SingleAgentSettings", () => { }); expect(screen.getByRole("status", { name: /logging in/i })).toBeInTheDocument(); expect( - screen.getByText("Refreshing WSL (Ubuntu) Cursor authentication status."), + screen.getByText("Refreshing WSL · Ubuntu Cursor authentication status."), ).toBeInTheDocument(); expect(refreshAgentStatusesMock).toHaveBeenCalledWith(["Ubuntu"], { agentKinds: ["cursor"], @@ -1028,9 +1045,9 @@ describe("SingleAgentSettings", () => { render(); - const windowsRow = envRow("Windows"); + const windowsRow = envRow("This computer"); expect(within(windowsRow).getByText("Not installed")).toBeInTheDocument(); - fireEvent.click(within(windowsRow).getByRole("button", { name: "Install Windows" })); + fireEvent.click(within(windowsRow).getByRole("button", { name: "Install on This computer" })); expect(runAgentInstallCommandMock).toHaveBeenCalledWith({ label: "Grok Build", @@ -1077,10 +1094,11 @@ describe("SingleAgentSettings", () => { ]; render(); + selectMachine("local/wsl:Ubuntu"); - const wslRow = envRow("WSL (Ubuntu)"); + const wslRow = envRow("WSL · Ubuntu"); expect(within(wslRow).getByText("Not installed")).toBeInTheDocument(); - fireEvent.click(within(wslRow).getByRole("button", { name: "Install WSL (Ubuntu)" })); + fireEvent.click(within(wslRow).getByRole("button", { name: "Install on WSL · Ubuntu" })); expect(runAgentInstallCommandMock).toHaveBeenCalledWith({ label: "Grok Build", @@ -1208,10 +1226,11 @@ describe("SingleAgentSettings", () => { render(); + expect(within(envRow("This computer")).queryByRole("button", { name: "Login" })).toBeNull(); + selectMachine("local/wsl:Ubuntu"); expect(screen.getAllByText("Login required").length).toBeGreaterThan(0); - expect(within(envRow("Windows")).queryByRole("button", { name: "Login" })).toBeNull(); expect( - within(envRow("WSL (Ubuntu)")).getByRole("button", { name: "Login WSL (Ubuntu)" }), + within(envRow("WSL · Ubuntu")).getByRole("button", { name: "Login WSL · Ubuntu" }), ).toBeVisible(); }); @@ -1255,8 +1274,9 @@ describe("SingleAgentSettings", () => { ]; render(); + selectMachine("local/wsl:Ubuntu"); - const row = envRow("WSL (Ubuntu)"); + const row = envRow("WSL · Ubuntu"); await act(async () => { fireEvent.click(within(row).getByRole("button", { name: /login/i })); }); @@ -1287,13 +1307,12 @@ describe("SingleAgentSettings", () => { ]; render(); + selectMachine("local/wsl:Ubuntu"); - const row = envRow("WSL (Ubuntu)"); + const row = envRow("WSL · Ubuntu"); fireEvent.click(within(row).getByRole("button", { name: /login/i })); - expect( - screen.getByText(/Waiting for WSL \(Ubuntu\) Login authentication/u), - ).toBeInTheDocument(); + expect(screen.getByText(/Waiting for WSL · Ubuntu Login authentication/u)).toBeInTheDocument(); resolveAuth(); await waitFor(() => expect(refreshAgentStatusesMock).toHaveBeenCalled()); @@ -1319,13 +1338,12 @@ describe("SingleAgentSettings", () => { render(); - expect(screen.getByText("Windows")).toBeInTheDocument(); + expect(screen.getByText("This computer")).toBeInTheDocument(); expect(screen.getAllByText("Login required").length).toBeGreaterThan(0); - expect(screen.getByText(/Complete Login sign-in for Windows\./u)).toBeInTheDocument(); - const windowsRow = envRow("Windows"); + expect(screen.getByText(/Complete Login sign-in for This computer\./u)).toBeInTheDocument(); + const windowsRow = envRow("This computer"); expect(within(windowsRow).getByRole("button", { name: /login/i })).toBeInTheDocument(); - expect(screen.getByText("WSL (Ubuntu)")).toBeInTheDocument(); - expect(screen.queryByText(/Windows · Authentication/u)).toBeNull(); + expect(screen.queryByText(/This computer · Authentication/u)).toBeNull(); }); it("labels the remaining WSL auth action when Windows is already signed in", async () => { @@ -1349,14 +1367,16 @@ describe("SingleAgentSettings", () => { render(); - // Per-env rows: Windows env gets its own logout action, WSL env gets - // its own login action. No combined Re-login button across envs. - const windowsRow = envRow("Windows"); - const wslRow = envRow("WSL (Ubuntu)"); + // Each machine owns its env row: the local machine shows logout plus an + // attention hint pointing at the WSL machine; switching reveals login. + const windowsRow = envRow("This computer"); expect(within(windowsRow).getByRole("button", { name: /logout/i })).toBeInTheDocument(); + expect(screen.getByText("Needs attention on WSL · Ubuntu")).toBeInTheDocument(); + fireEvent.click(screen.getByRole("button", { name: "Switch" })); + const wslRow = envRow("WSL · Ubuntu"); expect(within(wslRow).getByRole("button", { name: /login/i })).toBeInTheDocument(); expect(screen.queryByRole("button", { name: /re-login/i })).toBeNull(); - expect(screen.getByText(/Complete Login sign-in for WSL \(Ubuntu\)\./u)).toBeInTheDocument(); + expect(screen.getByText(/Complete Login sign-in for WSL · Ubuntu\./u)).toBeInTheDocument(); await act(async () => { fireEvent.click(within(wslRow).getByRole("button", { name: /login/i })); }); @@ -1397,7 +1417,7 @@ describe("SingleAgentSettings", () => { render(); - const windowsRow = envRow("Windows"); + const windowsRow = envRow("This computer"); fireEvent.click(within(windowsRow).getByRole("button", { name: /logout/i })); expect(screen.getByRole("status", { name: /logging out/i })).toBeInTheDocument(); @@ -1436,7 +1456,7 @@ describe("SingleAgentSettings", () => { render(); - const row = envRow("Windows"); + const row = envRow("This computer"); fireEvent.click(within(row).getByRole("button", { name: /re-login/i })); expect(authenticateAcpAgentMock).toHaveBeenCalledWith({ @@ -1474,7 +1494,7 @@ describe("SingleAgentSettings", () => { render(); - const row = envRow("Windows"); + const row = envRow("This computer"); fireEvent.click(within(row).getByRole("button", { name: /re-login/i })); expect(authenticateAcpAgentMock).not.toHaveBeenCalled(); @@ -1512,7 +1532,7 @@ describe("SingleAgentSettings", () => { ]; render(); - fireEvent.click(within(envRow("Windows")).getByRole("button", { name: /login/i })); + fireEvent.click(within(envRow("This computer")).getByRole("button", { name: /login/i })); const loginInput = runAgentLoginCommandMock.mock.calls[0]?.[0]; await act(async () => { @@ -1537,7 +1557,7 @@ describe("SingleAgentSettings", () => { render(); - const row = envRow("Windows"); + const row = envRow("This computer"); fireEvent.click(within(row).getByRole("button", { name: /login/i })); expect(authenticateAcpAgentMock).toHaveBeenCalledWith({ @@ -1561,7 +1581,7 @@ describe("SingleAgentSettings", () => { render(); - const row = envRow("Windows"); + const row = envRow("This computer"); fireEvent.click(within(row).getByRole("button", { name: /logout/i })); expect(logoutAcpAgentMock).toHaveBeenCalledWith({ @@ -1597,7 +1617,10 @@ describe("SingleAgentSettings", () => { render(); - const wslRow = envRow("WSL (Ubuntu)"); + const windowsRow = envRow("This computer"); + expect(within(windowsRow).queryByRole("button", { name: /Update to v/i })).toBeNull(); + selectMachine("local/wsl:Ubuntu"); + const wslRow = envRow("WSL · Ubuntu"); await waitFor(() => expect( within(wslRow).getByRole("button", { @@ -1605,8 +1628,6 @@ describe("SingleAgentSettings", () => { }), ).toBeInTheDocument(), ); - const windowsRow = envRow("Windows"); - expect(within(windowsRow).queryByRole("button", { name: /Update to v/i })).toBeNull(); await act(async () => { fireEvent.click( @@ -1661,47 +1682,56 @@ describe("SingleAgentSettings", () => { render(); - const windowsRow = envRow("Windows"); - const wslRow = envRow("WSL (Ubuntu)"); fireEvent.click( - await within(windowsRow).findByRole("button", { + await within(envRow("This computer")).findByRole("button", { name: /Update to v1\.1\.0/i, }), ); await waitFor(() => expect( - within(windowsRow).getByRole("status", { name: "Updating Cursor (Windows)" }), + within(envRow("This computer")).getByRole("status", { + name: "Updating Cursor (This computer)", + }), ).toBeInTheDocument(), ); + selectMachine("local/wsl:Ubuntu"); fireEvent.click( - within(wslRow).getByRole("button", { + await within(envRow("WSL · Ubuntu")).findByRole("button", { name: /Update to v1\.1\.0/i, }), ); - await waitFor(() => { - expect( - within(windowsRow).getByRole("status", { name: "Updating Cursor (Windows)" }), - ).toBeInTheDocument(); + await waitFor(() => expect( - within(wslRow).getByRole("status", { name: "Updating Cursor (WSL (Ubuntu))" }), - ).toBeInTheDocument(); - }); + within(envRow("WSL · Ubuntu")).getByRole("status", { + name: "Updating Cursor (WSL · Ubuntu)", + }), + ).toBeInTheDocument(), + ); resolveWslUpdate({ ok: false }); await waitFor(() => expect( - within(wslRow).queryByRole("status", { name: "Updating Cursor (WSL (Ubuntu))" }), + within(envRow("WSL · Ubuntu")).queryByRole("status", { + name: "Updating Cursor (WSL · Ubuntu)", + }), ).toBeNull(), ); + + // The Windows loader survives the machine switches independently. + selectMachine("local"); expect( - within(windowsRow).getByRole("status", { name: "Updating Cursor (Windows)" }), + within(envRow("This computer")).getByRole("status", { + name: "Updating Cursor (This computer)", + }), ).toBeInTheDocument(); resolveWindowsUpdate({ ok: false }); await waitFor(() => expect( - within(windowsRow).queryByRole("status", { name: "Updating Cursor (Windows)" }), + within(envRow("This computer")).queryByRole("status", { + name: "Updating Cursor (This computer)", + }), ).toBeNull(), ); platformSpy.mockRestore(); diff --git a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx index 5a9ff6019..2e83a2dbe 100644 --- a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx +++ b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx @@ -1,7 +1,7 @@ -import { startTransition, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Button, toast } from "@heroui/react"; import { Trans, useLingui } from "@lingui/react/macro"; -import { AlertTriangle, ArrowUpCircle, LogIn, LogOut, Save } from "lucide-react"; +import { AlertTriangle, LogIn, LogOut, Save } from "lucide-react"; import { isNewerVersion } from "@/shared/agents/updateResolver"; import type { AgentOwnedAuthMethod, @@ -19,6 +19,7 @@ import { friendlyError } from "@/shared/messages"; import { runAgentInstallCommand, runAgentLoginCommand } from "@/renderer/actions/agentLoginActions"; import { useAppStore } from "@/renderer/state/appStore"; import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; +import { useMachines, useSelectedMachine } from "@/renderer/state/machines"; import { buildWslProjectDistrosKey } from "@/renderer/state/projectKeys"; import { useProviderUsage } from "@/renderer/state/providerUsageStore"; import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; @@ -35,8 +36,7 @@ import { statusUpdateScope, shouldPreferTerminalLogin, } from "@/renderer/utils/acpRegistryAuth"; -import { Input, ToggleSwitch } from "@/renderer/components/common"; -import { ProviderIcon } from "@/renderer/components/providers/ProviderIcon"; +import { Input } from "@/renderer/components/common"; import { providerMenuKey, providerVisibilityKey, @@ -45,10 +45,18 @@ import { expandAgentToVisibilityProviders } from "@/renderer/components/thread/b import { SettingsPage } from "../SettingsForm"; import { NATIVE_AGENT_REGISTRY_ENTRIES } from "../agentRegistryNative"; import { SAVED_CREDENTIAL_MASK } from "../secretMask"; +import { AgentHeader } from "./parts/AgentHeader"; import { AgentSettingRow } from "./parts/AgentSettingRow"; import { ModelVisibilityDropdown } from "./parts/ModelVisibilityDropdown"; import { AgentEnvironmentRow, AgentInstallEnvironmentRow } from "./parts/AgentEnvironmentRow"; import { HookPluginSettings } from "./parts/HookPluginSettings"; +import { MachineScopeHeading } from "../machineScope/MachineScopeHeading"; +import { + MachineAttentionHint, + NoMachineStatusRow, + RemoteMachineNotice, +} from "../machineScope/MachineScopeRows"; +import { useMachineScopedStatuses } from "../machineScope/useMachineScopedStatuses"; import { findAgentAuthMethod, findEnvVarAuthMethod, @@ -113,9 +121,19 @@ export function SingleAgentSettings(props: { const profileInstance = useSharedSettings((s) => profileKindParts ? s.agentInstances[profileKindParts.instanceId] : undefined, ); - const installedHere = agentStatuses.filter((a) => a.kind === props.agentKind && a.installed); - const installedWsl = wslAgentStatuses.filter((a) => a.kind === props.agentKind && a.installed); - const installedStatuses = [...installedHere, ...installedWsl]; + const selectedMachine = useSelectedMachine(); + const machines = useMachines(); + const isRemoteMachine = selectedMachine.ref.host === "remote"; + const { scoped: machineStatuses, othersNeedingAttention } = useMachineScopedStatuses( + props.agentKind, + selectedMachine, + ); + const installedAnywhere = [...agentStatuses, ...wslAgentStatuses].filter( + (a) => a.kind === props.agentKind && a.installed, + ); + // Everything actionable on this page — env rows, auth, versions, provider + // panel — is scoped to the selected machine. + const installedStatuses = machineStatuses.filter((a) => a.installed); const nativeRegistryEntry = NATIVE_AGENT_REGISTRY_ENTRIES.find( (entry) => entry.id === props.agentKind, ); @@ -124,20 +142,26 @@ export function SingleAgentSettings(props: { const providerEntry = NATIVE_AGENT_REGISTRY_ENTRIES.find( (entry) => entry.id === baseAgentKind(props.agentKind), ); - const installableHere = nativeRegistryEntry - ? agentStatuses.filter((a) => a.kind === props.agentKind && !a.installed && a.envKind !== "wsl") - : []; - const installableWsl = nativeRegistryEntry - ? wslAgentStatuses.filter((a) => a.kind === props.agentKind && !a.installed) - : []; - const agent = installedHere[0] ?? installedWsl[0]; + const installableStatuses = + nativeRegistryEntry && !isRemoteMachine ? machineStatuses.filter((a) => !a.installed) : []; + // Header and capabilities fall back to any machine's install so the page + // stays usable while the selected machine has nothing detected yet. + const agent = installedStatuses[0] ?? installedAnywhere[0]; const isDisabled = useSharedSettings((s) => s.disabledAgents.includes(props.agentKind)); const setAgentDisabled = useSharedSettings((s) => s.setAgentDisabled); const installedRegistryRecord = useSharedSettings( (s) => s.acpRegistryInstalledAgents[extractAcpGenericInstanceId(props.agentKind) ?? ""], ); const syncInstalledAgents = useSharedSettings((s) => s.syncAcpRegistryInstalledAgents); - const wslDistros = wslProjectDistrosKey ? wslProjectDistrosKey.split("\0") : []; + const projectWslDistros = wslProjectDistrosKey ? wslProjectDistrosKey.split("\0") : []; + // Include the selected machine's distro even when no project lives in it, so + // scoped refreshes keep its statuses inside the supervisor's cache filter. + const wslDistros = + selectedMachine.ref.host === "local" && + selectedMachine.wslDistro !== undefined && + !projectWslDistros.includes(selectedMachine.wslDistro) + ? [...projectWslDistros, selectedMachine.wslDistro] + : projectWslDistros; const registryAgentId = extractAcpGenericInstanceId(props.agentKind); // Read-side guards: any stored "latest version" only counts when its owner @@ -152,7 +176,9 @@ export function SingleAgentSettings(props: { latestNpmEntry && latestNpmEntry.agentKind === props.agentKind ? latestNpmEntry.version : undefined; - const newestInstalledVersion = installedStatuses.reduce((latest, status) => { + // Peer versions from every machine: a copy lagging behind another machine's + // install is still a known-good upgrade target for this machine's row. + const newestInstalledVersion = installedAnywhere.reduce((latest, status) => { const version = status.version; if (!version) return latest; if (!latest || isNewerVersion(version, latest)) return version; @@ -272,14 +298,6 @@ export function SingleAgentSettings(props: { const modelVisibilityProviders = expandAgentToVisibilityProviders(agent); const hasSelectableModels = modelVisibilityProviders.length > 0; - const versionRows: { label: string; status: AgentStatus }[] = []; - if (platform === "win32") { - for (const s of installedHere) versionRows.push({ label: envLabelForStatus(s), status: s }); - for (const s of installedWsl) versionRows.push({ label: envLabelForStatus(s), status: s }); - } else { - for (const s of installedHere) - versionRows.push({ label: envLabelForStatus(s) || t`Installed`, status: s }); - } const missingAuthStatuses = installedStatuses.filter((status) => status.authState === "missing"); const envVarAuthMethod = findEnvVarAuthMethod(installedStatuses) ?? findEnvVarAuthMethod(missingAuthStatuses); @@ -289,11 +307,13 @@ export function SingleAgentSettings(props: { const method = status.authMethods?.find(isAgentAuthMethod); return method ? [{ status, method }] : []; }); - const sharedAgentAuthMethod = findAgentAuthMethodInStatuses(installedStatuses); - const sharedTerminalAuthMethod = findTerminalAuthMethodInStatuses(installedStatuses); + // Auth-method borrowing spans machines: an env that omitted its methods can + // still offer the sign-in another machine's status advertised. + const sharedAgentAuthMethod = findAgentAuthMethodInStatuses(installedAnywhere); + const sharedTerminalAuthMethod = findTerminalAuthMethodInStatuses(installedAnywhere); const agentAuth = findAgentAuthMethod(agentAuthStatuses) ?? - (sharedAgentAuthMethod + (sharedAgentAuthMethod && installedStatuses.length > 0 ? { status: agentAuthStatuses.find((status) => status.authMethods?.some(isAgentAuthMethod)) ?? @@ -480,7 +500,9 @@ export function SingleAgentSettings(props: { // distro hold their own sessions. We split the auth panel into one row per // env so each shows its own state independently. Env-var credentials stay // shared (single block above the per-env rows). - const hasInteractiveAuth = installedStatuses.some(hasInteractiveAuthMethods); + // Provider-level: whether *any* machine advertises an interactive sign-in, + // so an env whose status omitted methods still renders its login row. + const hasInteractiveAuth = installedAnywhere.some(hasInteractiveAuthMethods); // When env-var credentials already satisfy every env, the user is signed in // via the shared key — per-env Logout rows are misleading because there is // no per-env session to revoke. Show just the env-var block in that case. @@ -657,15 +679,16 @@ export function SingleAgentSettings(props: { type: "terminal" as const, }) : undefined; - const methods: Array = usePerEnvAuthRows - ? shouldPreferTerminalLogin(status) && terminalMethod - ? [terminalMethod] - : agentMethods.length > 0 - ? agentMethods - : terminalMethod - ? [terminalMethod] - : [] - : []; + const methods: Array = + usePerEnvAuthRows && !isRemoteMachine + ? shouldPreferTerminalLogin(status) && terminalMethod + ? [terminalMethod] + : agentMethods.length > 0 + ? agentMethods + : terminalMethod + ? [terminalMethod] + : [] + : []; // Match against whichever identity the row actually displays, so the live // plan is only adopted when it belongs to that same account. const rowMetadata = @@ -681,10 +704,10 @@ export function SingleAgentSettings(props: { authMethods={methods} authPending={authPendingEnvKey === envKey} binaryUpdatePending={binaryUpdatePendingEnvKeys.has(envKey)} - canLogout={supportsAcpLogoutStatus(status, acpInstanceId)} + canLogout={!isRemoteMachine && supportsAcpLogoutStatus(status, acpInstanceId)} includeAuthFallback={includeAuthFallbackMetadata} isRedetecting={redetectingEnvKeys.has(envKey)} - latestNpmVersion={latestNpmVersion} + latestNpmVersion={isRemoteMachine ? undefined : latestNpmVersion} livePlan={resolveLivePlanLabel(rowMetadata, providerUsage)} newestInstalledVersion={newestInstalledVersion} pendingMessage={authPendingEnvKey === envKey ? authPendingMessage : undefined} @@ -717,10 +740,20 @@ export function SingleAgentSettings(props: { const environmentRows = ( <> - {installedHere.map(renderInstalledEnvironmentRow)} - {installableHere.map(renderInstallableEnvironmentRow)} - {installedWsl.map(renderInstalledEnvironmentRow)} - {installableWsl.map(renderInstallableEnvironmentRow)} + {machines.length > 1 ? ( + + ) : null} + {installedStatuses.map(renderInstalledEnvironmentRow)} + {installableStatuses.map(renderInstallableEnvironmentRow)} + {installedStatuses.length === 0 && installableStatuses.length === 0 ? ( + + ) : null} + {isRemoteMachine ? : null} + ); // Panels that group several runtimes place these rows inside the runtime they @@ -732,60 +765,25 @@ export function SingleAgentSettings(props: { return (
-
-
- -
-

{agent.label}

-

- {isDisabled ? t`Agent is currently disabled` : t`Agent is active and ready`} -

-
-
-
- {updateAvailable && ( - - )} - 0} - size="sm" - aria-label={t`Enabled`} - onChange={(selected) => { - startTransition(() => { - setAgentDisabled(agent.kind, !selected); - }); - if (selected) { - void readBridge() - .refreshAgentStatuses(wslDistros, { agentKinds: [agent.kind] }) - .catch(() => undefined); - } - }} - /> -
-
+ 0} + wslDistros={wslDistros} + onPerformUpdate={performUpdate} + onSetAgentDisabled={setAgentDisabled} + /> - {panelOwnsInstallRows ? null : ( + {panelOwnsInstallRows && !isRemoteMachine ? null : (
{environmentRows}
)}
- {providerEntry?.settingsPanel ? ( + {providerEntry?.settingsPanel && !isRemoteMachine ? ( {envVarAuthMethod && acpInstanceId ? (
@@ -805,7 +803,7 @@ export function SingleAgentSettings(props: {

{envVarAuthMethod.name}

- Saved credentials are shared across all environments. + Saved credentials are shared across all machines.

{envVarAuthMethod.vars.map((variable) => { @@ -978,6 +976,11 @@ export function SingleAgentSettings(props: {
+ {machines.length > 1 && (defs.length > 0 || hasSelectableModels) ? ( +
+ +
+ ) : null} {defs.length > 0 && (
{defs.map((def) => ( @@ -1000,7 +1003,7 @@ export function SingleAgentSettings(props: { )}
- {isCursorProfileKind(agent.kind) ? null : ( + {isCursorProfileKind(agent.kind) || isRemoteMachine ? null : ( props.onInstall(props.status)} > diff --git a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx new file mode 100644 index 000000000..46276fb00 --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentHeader.tsx @@ -0,0 +1,72 @@ +import { startTransition } from "react"; +import { Button } from "@heroui/react"; +import { Trans, useLingui } from "@lingui/react/macro"; +import { ArrowUpCircle } from "lucide-react"; +import { readBridge } from "@/renderer/bridge"; +import { ToggleSwitch } from "@/renderer/components/common"; +import { ProviderIcon } from "@/renderer/components/providers/ProviderIcon"; +import type { AgentStatus } from "@/shared/contracts"; + +/** Page header of an agent's settings: identity, registry update, enable toggle. */ +export function AgentHeader(props: { + agent: AgentStatus; + isDisabled: boolean; + updateAvailable: boolean; + updatePending: boolean; + latestRegistryVersion: string | undefined; + toggleDisabled: boolean; + wslDistros: readonly string[]; + onPerformUpdate: () => void; + onSetAgentDisabled: (agentKind: string, disabled: boolean) => void; +}) { + const { t } = useLingui(); + const { agent } = props; + return ( +
+
+ +
+

{agent.label}

+

+ {props.isDisabled ? t`Agent is currently disabled` : t`Agent is active and ready`} +

+
+
+
+ {props.updateAvailable && ( + + )} + { + startTransition(() => { + props.onSetAgentDisabled(agent.kind, !selected); + }); + if (selected) { + void readBridge() + .refreshAgentStatuses([...props.wslDistros], { agentKinds: [agent.kind] }) + .catch(() => undefined); + } + }} + /> +
+
+ ); +} diff --git a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx index 1f55cb21f..b48e28fdc 100644 --- a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx +++ b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/HookPluginSettings.tsx @@ -3,7 +3,8 @@ import { Button, toast } from "@heroui/react"; import { Trans, useLingui } from "@lingui/react/macro"; import { Download, Trash2 } from "lucide-react"; import type { AgentHookPluginEnv, AgentHookPluginStatus, AgentStatus } from "@/shared/contracts"; -import { hookEnvForAgentStatus, hookEnvKey, hookEnvLabel } from "@/shared/agentHookPluginEnv"; +import { hookEnvForAgentStatus, hookEnvKey } from "@/shared/agentHookPluginEnv"; +import { localEnvLabel } from "@/renderer/utils/machineLabels"; import { readBridge } from "@/renderer/bridge"; function HookPluginEnvironmentRow(props: { @@ -46,7 +47,7 @@ function HookPluginEnvironmentRow(props: { action({ agentKind: props.agentKind, env: status.env }) .then((result) => { props.onRefresh(result.status); - const envName = hookEnvLabel(status.env); + const envName = localEnvLabel(status.env); toast.success( mode === "uninstall" ? t`${props.agentLabel} hooks removed for ${envName}.` @@ -64,7 +65,7 @@ function HookPluginEnvironmentRow(props: { return (
- {hookEnvLabel(status.env)} + {localEnvLabel(status.env)} {versionText} {isOutdated ? ( diff --git a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/authHelpers.ts b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/authHelpers.ts index 36d37e469..5418e2f53 100644 --- a/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/authHelpers.ts +++ b/src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/authHelpers.ts @@ -7,6 +7,7 @@ import type { UsageSnapshot, } from "@/shared/contracts"; import { i18n } from "@/renderer/i18n/i18n"; +import { agentEnvForStatus, agentEnvKey } from "@/shared/machines"; import { envLabelForStatus, isAgentAuthMethod, @@ -134,7 +135,7 @@ export function findTerminalLoginStatus(statuses: readonly AgentStatus[]): Agent } export function statusEnvKey(status: AgentStatus): string { - return status.envKind === "wsl" && status.envDistro ? `wsl:${status.envDistro}` : "native"; + return agentEnvKey(agentEnvForStatus(status)); } export function supportsAcpLogoutStatus( diff --git a/src/renderer/views/SettingsOverlay/parts/machineScope/AgentsMachineBar.tsx b/src/renderer/views/SettingsOverlay/parts/machineScope/AgentsMachineBar.tsx new file mode 100644 index 000000000..85cd1c73b --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/machineScope/AgentsMachineBar.tsx @@ -0,0 +1,44 @@ +import { useEffect } from "react"; +import { useMachineSelectionStore } from "@/renderer/state/machineSelectionStore"; +import { useMachines, useWslDistroListStore } from "@/renderer/state/machines"; +import { LOCAL_NATIVE_MACHINE_KEY } from "@/shared/machines"; +import { MachineSelect } from "./MachineSelect"; +import type { SettingsSection } from "../types"; + +/** + * Global machine scope for the Agents settings area: a floating pill docked + * at the bottom-center of the page, clear of the content flow. Renders + * nothing while only the local machine exists, so single-machine users see + * the pages exactly as before. + */ +export function AgentsMachineBar(props: { onNavigate: (section: SettingsSection) => void }) { + const machines = useMachines(); + const selectedMachineId = useMachineSelectionStore((state) => state.selectedMachineId); + const setSelectedMachine = useMachineSelectionStore((state) => state.setSelectedMachine); + const distrosLoaded = useWslDistroListStore((state) => state.loaded); + const refreshDistros = useWslDistroListStore((state) => state.refresh); + + // Enumerate local WSL distros once per settings visit (registry probe on the + // supervisor). Project-derived distros keep the list useful if this fails. + useEffect(() => { + if (!distrosLoaded) void refreshDistros(); + }, [distrosLoaded, refreshDistros]); + + // Snap back to the local machine when the selection disappears (distro + // removed, server unpaired). + useEffect(() => { + if (!machines.some((machine) => machine.id === selectedMachineId)) { + setSelectedMachine(LOCAL_NATIVE_MACHINE_KEY); + } + }, [machines, selectedMachineId, setSelectedMachine]); + + if (machines.length <= 1) return null; + + return ( +
+
+ props.onNavigate("remoteServers")} /> +
+
+ ); +} diff --git a/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx new file mode 100644 index 000000000..46ae8ad38 --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeHeading.tsx @@ -0,0 +1,17 @@ +import { useLingui } from "@lingui/react/macro"; + +/** + * Micro-heading separating machine-scoped rows from rows shared by every + * machine. Uses the sidebar group-header idiom rather than a badge so the + * grouping reads as structure, not decoration. + */ +export function MachineScopeHeading(props: { scope: "machine" | "all"; machineLabel?: string }) { + const { t } = useLingui(); + const text = + props.scope === "all" ? t`All machines` : t`On ${props.machineLabel ?? t`this machine`}`; + return ( +

+ {text} +

+ ); +} diff --git a/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx new file mode 100644 index 000000000..4c42d9270 --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineScopeRows.tsx @@ -0,0 +1,114 @@ +import { useState } from "react"; +import { Button, toast } from "@heroui/react"; +import { Trans, useLingui } from "@lingui/react/macro"; +import { AlertTriangle, RefreshCw } from "lucide-react"; +import { readBridge } from "@/renderer/bridge"; +import { PixelLoader } from "@/renderer/components/common"; +import { useMachineSelectionStore } from "@/renderer/state/machineSelectionStore"; +import type { MachineDescriptor } from "@/renderer/state/machines"; +import { friendlyError } from "@/shared/messages"; + +/** + * Cross-machine awareness while the page is scoped to one machine: names the + * machines where this agent still needs attention and jumps the scope there. + */ +export function MachineAttentionHint(props: { + machineIds: readonly string[]; + machines: readonly MachineDescriptor[]; +}) { + const setSelectedMachine = useMachineSelectionStore((state) => state.setSelectedMachine); + const entries = props.machineIds + .map((id) => props.machines.find((machine) => machine.id === id)) + .filter((machine): machine is MachineDescriptor => machine !== undefined); + if (entries.length === 0) return null; + return ( +
+ {entries.map((machine) => ( +
+

+ + + Needs attention on {machine.label} + +

+ +
+ ))} +
+ ); +} + +/** + * Shown when the selected machine has no detected status for this agent — + * typically a WSL distro that exists but was never probed because no project + * lives in it. Offers a machine-scoped detection pass. + */ +export function NoMachineStatusRow(props: { + machine: MachineDescriptor; + agentKind: string; + wslDistros: readonly string[]; +}) { + const { t } = useLingui(); + const [pending, setPending] = useState(false); + const isRemote = props.machine.ref.host === "remote"; + + const detect = () => { + if (pending || isRemote) return; + setPending(true); + readBridge() + .refreshAgentStatuses([...props.wslDistros], { + agentKinds: [props.agentKind], + envs: [props.machine.ref.env], + }) + .catch((error) => toast.danger(friendlyError(error))) + .finally(() => setPending(false)); + }; + + return ( +
+

+ {isRemote ? ( + No status reported by this machine yet. + ) : ( + Not detected on this machine yet. + )} +

+ {isRemote ? null : ( + + )} +
+ ); +} + +/** Read-only notice for a remote machine's page (phase: statuses only). */ +export function RemoteMachineNotice(props: { machine: MachineDescriptor }) { + return ( +
+ {props.machine.status === "offline" ? ( +

+ {props.machine.label} is offline. Showing last known status. +

+ ) : null} +

+ Install, update, and sign-in are not yet available on remote machines. +

+
+ ); +} diff --git a/src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx new file mode 100644 index 000000000..f8b7f5e2d --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/machineScope/MachineSelect.tsx @@ -0,0 +1,78 @@ +import { useLingui } from "@lingui/react/macro"; +import { Monitor, Server } from "lucide-react"; +import { Select, TuxIcon, type SelectOption } from "@/renderer/components/common"; +import { RemoteServerStatusDot } from "@/renderer/components/common/RemoteServerStatusDot"; +import { useMachineSelectionStore } from "@/renderer/state/machineSelectionStore"; +import type { MachineDescriptor } from "@/renderer/state/machines"; + +/** Pseudo-option id intercepted to open the Remote Environments page. */ +const PAIR_REMOTE_OPTION_ID = "__pair-remote"; + +function machineIcon(machine: MachineDescriptor) { + if (machine.kind === "local") return ; + if (machine.kind === "local-wsl") return ; + return ( + + + + + ); +} + +export function MachineSelect(props: { + machines: readonly MachineDescriptor[]; + onPairRemote: () => void; +}) { + const { t } = useLingui(); + const selectedMachineId = useMachineSelectionStore((state) => state.selectedMachineId); + const setSelectedMachine = useMachineSelectionStore((state) => state.setSelectedMachine); + + const machineDetail = (machine: MachineDescriptor): string | undefined => { + if (machine.status === "offline") return t`Offline`; + if (machine.status === "connecting") return t`Connecting…`; + return undefined; + }; + + const options: SelectOption[] = [ + ...props.machines.map((machine) => { + const detail = machineDetail(machine); + return { + id: machine.id, + label: machine.label, + icon: machineIcon(machine), + ...(detail ? { detail } : {}), + }; + }), + { + id: PAIR_REMOTE_OPTION_ID, + label: t`Pair a remote machine…`, + icon: , + }, + ]; + + return ( +