From ffc6e3b78dea9a2c6ad30456f0ac20e28508b735 Mon Sep 17 00:00:00 2001 From: Serhii Vecherenko Date: Mon, 27 Jul 2026 19:20:30 -0700 Subject: [PATCH 1/2] feat(crossagent): add configurable routing and ranking preferences - rank agents using usage, favorites, tags, and built-in order - persist manual routing overrides and expose MCP management tools - add routing settings UI, IPC support, localization, and coverage --- src/main/app-controls/mcp/tools/settings.ts | 2 + src/main/ipc/localHandlers.ts | 10 + src/main/main.ts | 67 ++ src/main/sharedSettingsFile.test.ts | 44 ++ src/main/sharedSettingsFile.ts | 2 + src/mobile/bridge.ts | 2 + src/renderer/actions/threadLaunchActions.ts | 8 +- src/renderer/locales/de/messages.po | 75 +- src/renderer/locales/en/messages.po | 75 +- src/renderer/locales/es/messages.po | 75 +- src/renderer/locales/fr/messages.po | 75 +- src/renderer/locales/ja/messages.po | 75 +- src/renderer/locales/ko/messages.po | 75 +- src/renderer/locales/pl/messages.po | 75 +- src/renderer/locales/pt-BR/messages.po | 75 +- src/renderer/locales/ru/messages.po | 75 +- src/renderer/locales/tr/messages.po | 75 +- src/renderer/locales/uk/messages.po | 75 +- src/renderer/locales/vi/messages.po | 75 +- src/renderer/locales/zh-CN/messages.po | 75 +- .../state/sharedSettingsStore.test.ts | 19 + src/renderer/state/sharedSettingsStore.ts | 27 +- .../parts/CrossagentRoutingSection.test.tsx | 179 +++++ .../parts/CrossagentRoutingSection.tsx | 214 +++++- .../parts/McpServersSettings.tsx | 2 +- src/shared/contracts/mcpServer.ts | 3 + src/shared/crossagentRanking.test.ts | 690 ++++++++++++++++++ src/shared/crossagentRanking.ts | 603 +++++++++++++++ src/shared/ipc/events.ts | 25 +- src/shared/ipc/procedureMap.ts | 1 + src/shared/ipc/procedures/mcp.ts | 19 + src/shared/ipc/procedures/settings.ts | 17 +- src/shared/ipc/procedures/thread.ts | 5 + src/shared/settings.ts | 65 +- .../CrossagentMcpIngress.test.ts | 19 + .../crossagentMcp/CrossagentMcpIngress.ts | 23 +- .../RoutingOverridePersistence.test.ts | 79 ++ .../RoutingOverridePersistence.ts | 65 ++ .../crossagentMcp/toolRegistry.test.ts | 400 +++++++++- src/supervisor/crossagentMcp/toolRegistry.ts | 362 ++++++++- src/supervisor/crossagentMcp/types.ts | 30 + src/supervisor/ipcHandlers.ts | 3 + .../runtime/supervisorSharedSettings.test.ts | 44 ++ .../runtime/supervisorSharedSettings.ts | 10 +- src/supervisor/supervisorRuntime.ts | 61 +- 45 files changed, 3995 insertions(+), 80 deletions(-) create mode 100644 src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.test.tsx create mode 100644 src/shared/crossagentRanking.test.ts create mode 100644 src/shared/crossagentRanking.ts create mode 100644 src/supervisor/crossagentMcp/RoutingOverridePersistence.test.ts create mode 100644 src/supervisor/crossagentMcp/RoutingOverridePersistence.ts create mode 100644 src/supervisor/runtime/supervisorSharedSettings.test.ts diff --git a/src/main/app-controls/mcp/tools/settings.ts b/src/main/app-controls/mcp/tools/settings.ts index 15d9844e8..a3f573fe7 100644 --- a/src/main/app-controls/mcp/tools/settings.ts +++ b/src/main/app-controls/mcp/tools/settings.ts @@ -20,6 +20,8 @@ const PROTECTED_SETTINGS_KEYS: ReadonlySet = new Set([ "agentInstances", "acpRegistryInstalledAgents", "agentHookSupport", + "crossagentSelectionUsage", + "crossagentRoutingOverrides", "mcpServers", ]); diff --git a/src/main/ipc/localHandlers.ts b/src/main/ipc/localHandlers.ts index 8bba1a79c..c7690b314 100644 --- a/src/main/ipc/localHandlers.ts +++ b/src/main/ipc/localHandlers.ts @@ -68,6 +68,7 @@ import { } from "@/shared/ipc"; import { supportsNativeWindowMaterial, syncNativeThemeForMaterial } from "../window/windowMaterial"; import type { SharedSettings } from "@/shared/settings"; +import { removeCrossagentRoutingOverride } from "@/shared/crossagentRanking"; import { headersToRecord, readBoundedResponseBody } from "@/shared/http"; import type { PoracodePaths } from "@/shared/poracodePaths"; import { UsageLoginManager } from "../usageLogin/UsageLoginManager"; @@ -350,6 +351,15 @@ export function createLocalIpcHandlers( options.updatePowerSaveBlocker(); options.onSharedSettingsChanged?.(merged); }, + removeCrossagentRoutingOverride: ({ tags }) => { + const settingsPath = options.requirePoracodePaths().settingsPath; + const current = readSharedSettingsFile(settingsPath); + const overrides = removeCrossagentRoutingOverride(current.crossagentRoutingOverrides, tags); + const settings = { ...current, crossagentRoutingOverrides: overrides }; + writeSharedSettingsFile(settingsPath, settings); + options.onSharedSettingsChanged?.(settings); + return overrides; + }, setClaudeProfileEnvironment: (payload) => { const settingsPath = options.requirePoracodePaths().settingsPath; const { settings, instance } = applyClaudeProfileEnvironment( diff --git a/src/main/main.ts b/src/main/main.ts index 4d6a2eaa5..09e50b3b8 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -65,6 +65,11 @@ import { readKeybindingsFile } from "./keybindingsFile"; import { QuickComposerShortcutManager } from "./quickComposerShortcut"; import { shouldStartMinimized, syncWindowsStartupRegistration } from "./startupSettings"; import { type PoracodePaths, resolvePoracodeBaseDir } from "@/shared/poracodePaths"; +import { + incrementCrossagentSelectionUsage, + removeCrossagentRoutingOverride, + upsertCrossagentRoutingOverride, +} from "@/shared/crossagentRanking"; import { getAppName } from "@/shared/appName"; import { productNameFor, resolvePoracodeChannel } from "@/shared/channel"; import { @@ -314,6 +319,40 @@ function handleSharedSettingsChanged(settings: SharedSettings): void { syncStartupSettings(settings); } +function recordCrossagentSelectionPreference( + event: Extract, +): void { + const settingsPath = requirePoracodePaths().settingsPath; + const current = readSharedSettingsFile(settingsPath); + const next = { + ...current, + crossagentSelectionUsage: incrementCrossagentSelectionUsage( + current.crossagentSelectionUsage, + event.selections, + ), + }; + writeSharedSettingsFile(settingsPath, next); + handleSharedSettingsChanged(next); + mainWindow?.webContents.send(IPC_EVENT_CHANNELS.sharedSettingsChanged, next); +} + +function updateCrossagentRoutingOverride( + event: Extract, +): void { + const settingsPath = requirePoracodePaths().settingsPath; + const current = readSharedSettingsFile(settingsPath); + const next = { + ...current, + crossagentRoutingOverrides: + event.change.action === "set" + ? upsertCrossagentRoutingOverride(current.crossagentRoutingOverrides, event.change.override) + : removeCrossagentRoutingOverride(current.crossagentRoutingOverrides, event.change.tags), + }; + writeSharedSettingsFile(settingsPath, next); + handleSharedSettingsChanged(next); + mainWindow?.webContents.send(IPC_EVENT_CHANNELS.sharedSettingsChanged, next); +} + function handleMainWindowClose(event: Electron.Event): void { if (isQuitting) return; if (!mainWindow || mainWindow.isDestroyed()) return; @@ -717,6 +756,34 @@ if (!hasSingleInstanceLock) { captureMainException(error, tags); }, onEvent: (event) => { + if (event.type === "crossagent-selection-used") { + try { + recordCrossagentSelectionPreference(event); + } catch (error) { + captureMainException(error, { "poracode.feature_area": "crossagents-routing" }); + } + return; + } + if (event.type === "crossagent-routing-override-changed") { + let errorMessage: string | undefined; + try { + updateCrossagentRoutingOverride(event); + } catch (error) { + errorMessage = + error instanceof Error ? error.message : "Unable to save the routing preference"; + captureMainException(error, { "poracode.feature_area": "crossagents-routing" }); + } + void supervisorClient + .call("confirmCrossagentRoutingOverride", { + requestId: event.requestId, + ok: errorMessage === undefined, + ...(errorMessage ? { error: errorMessage } : {}), + }) + .catch((error) => { + captureMainException(error, { "poracode.feature_area": "crossagents-routing" }); + }); + return; + } persistSupervisorEvent(event); handleSupervisorEventForSleep(event); appControlsMcpIngress?.observeSupervisorEvent(event); diff --git a/src/main/sharedSettingsFile.test.ts b/src/main/sharedSettingsFile.test.ts index db84f13dd..3facbc766 100644 --- a/src/main/sharedSettingsFile.test.ts +++ b/src/main/sharedSettingsFile.test.ts @@ -13,6 +13,7 @@ import { } from "@/shared/settings"; import { applyClaudeProfileEnvironment, + mergeManagedSharedSettings, readSharedSettingsFile, writeSharedSettingsFile, } from "./sharedSettingsFile"; @@ -36,6 +37,43 @@ afterEach(() => { }); describe("sharedSettingsFile", () => { + it("preserves supervisor-managed Crossagents routing data during renderer writes", () => { + const onDisk: SharedSettings = { + ...defaultSharedSettings, + crossagentSelectionUsage: [ + { + agentKind: "kimi", + modelId: "k3", + effort: "max", + fast: false, + tags: ["mobile", "simulator"], + count: 4, + lastUsedAt: 10, + }, + ], + crossagentRoutingOverrides: [ + { + tags: ["frontend", "design"], + agentKind: "claude", + modelId: "opus", + effort: "max", + fast: false, + updatedAt: 11, + }, + ], + }; + const { + agentHookSupport: _agentHookSupport, + crossagentSelectionUsage: _crossagentSelectionUsage, + crossagentRoutingOverrides: _crossagentRoutingOverrides, + ...incoming + } = defaultSharedSettings; + + const merged = mergeManagedSharedSettings(onDisk, incoming); + expect(merged.crossagentSelectionUsage).toEqual(onDisk.crossagentSelectionUsage); + expect(merged.crossagentRoutingOverrides).toEqual(onDisk.crossagentRoutingOverrides); + }); + it("writes and reads shared settings as readable JSON", () => { const settingsPath = join(makeTempDir(), "settings.json"); writeSharedSettingsFile(settingsPath, { @@ -128,6 +166,9 @@ describe("sharedSettingsFile", () => { workspaces: [], favoriteModels: [], recentModels: [], + agentSelectionUsage: [], + crossagentSelectionUsage: [], + crossagentRoutingOverrides: [], agentHookSupport: {}, enabledMcpServers: {}, mcpServers: [], @@ -251,6 +292,9 @@ describe("sharedSettingsFile", () => { workspaces: [], favoriteModels: [], recentModels: [], + agentSelectionUsage: [], + crossagentSelectionUsage: [], + crossagentRoutingOverrides: [], agentHookSupport: {}, enabledMcpServers: {}, mcpServers: [], diff --git a/src/main/sharedSettingsFile.ts b/src/main/sharedSettingsFile.ts index 49ad233d1..8c1d2f7e8 100644 --- a/src/main/sharedSettingsFile.ts +++ b/src/main/sharedSettingsFile.ts @@ -94,6 +94,8 @@ export function mergeManagedSharedSettings( ...supervisorManagedInstances, }, agentHookSupport: onDisk.agentHookSupport, + crossagentSelectionUsage: onDisk.crossagentSelectionUsage, + crossagentRoutingOverrides: onDisk.crossagentRoutingOverrides, }; } diff --git a/src/mobile/bridge.ts b/src/mobile/bridge.ts index cc1a21f51..e9a294be9 100644 --- a/src/mobile/bridge.ts +++ b/src/mobile/bridge.ts @@ -250,6 +250,8 @@ const remoteBridge = { pushDesktopSettingsDiff(activeClient, settings); return Promise.resolve(); }, + removeCrossagentRoutingOverride: () => + Promise.reject(new Error("Manual routing preferences can only be changed on desktop.")), // Shell conveniences with browser-native equivalents. openExternal: (url: string) => { diff --git a/src/renderer/actions/threadLaunchActions.ts b/src/renderer/actions/threadLaunchActions.ts index bc6de77ee..71dbdaeb8 100644 --- a/src/renderer/actions/threadLaunchActions.ts +++ b/src/renderer/actions/threadLaunchActions.ts @@ -20,7 +20,13 @@ export async function performInitialThreadLaunch(input: { if (thread.config.model) { useSharedSettings .getState() - .pushRecentModel(thread.agentKind, thread.config.model, presentation); + .pushRecentModel( + thread.agentKind, + thread.config.model, + presentation, + thread.config.effort, + thread.config.fast, + ); } let optimisticUserMessageItemId: string | undefined; diff --git a/src/renderer/locales/de/messages.po b/src/renderer/locales/de/messages.po index 90c09b12d..4fa93af9d 100644 --- a/src/renderer/locales/de/messages.po +++ b/src/renderer/locales/de/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# Tool} other {# Tools}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# Runde} other {# Runden}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# Verwendung} other {# Verwendungen}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Schriftgröße des Agententerminals" msgid "Agent update available" msgstr "Agent-Update verfügbar" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Agent-Nutzung" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agent:{description}" @@ -924,6 +933,14 @@ msgstr "Agenten" msgid "Agents · General" msgstr "Agenten · Allgemein" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Agenten klassifizieren delegierte Arbeit mit Aufgaben-Tags. Manuelle Aufgabenrouten haben Vorrang, gefolgt von passenden erlernten Routen, globaler Crossagents-Nutzung, Favoriten, normaler Agentennutzung und der integrierten Reihenfolge." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Agenten klassifizieren delegierte Arbeit mit Aufgaben-Tags. Passende erlernte Routen werden zuerst eingestuft, gefolgt von globaler Crossagents-Nutzung, Favoriten, normaler Agentennutzung und der integrierten Reihenfolge." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Integriert" msgid "Built-in MCP servers" msgstr "Integrierte MCP-Server" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Integrierte Reihenfolge" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Integrierte Server werden von Poracode verwaltet. Sie können global deaktiviert, aber nicht bearbeitet oder entfernt werden." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Crossagent-Ergebnis" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagent-Routing und -Rangfolge" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Leitfaden für Crossagents-Routing" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents für diesen Thread aktiviert" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents-Nutzung" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Krönen" @@ -4154,6 +4182,7 @@ msgstr "Ziel konnte nicht aktualisiert werden" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Schnell" @@ -4170,6 +4199,10 @@ msgstr "Am schnellsten (Whisper Tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "„Am schnellsten“ verwendet Whisper Tiny; „Besser“ verwendet Whisper Base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favorit" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favoriten" @@ -5541,6 +5574,14 @@ msgstr "Vom Anbieter verwaltet" msgid "Manual order" msgstr "Manuelle Reihenfolge" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Manuelle Überschreibung" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Manuelle Routen überschreiben das erlernte Routing, wenn alle ihre Aufgaben-Tags übereinstimmen." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Oben anheften" msgid "Pinned" msgstr "Angepinnt" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Angeheftete Aufgabenrouten" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "PR-Titel (leer lassen, um automatisch zu generieren)" msgid "Pre-commit hook failed" msgstr "Pre-Commit-Hook ist fehlgeschlagen" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Bevorzugte Routing-Reihenfolge" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Remote-Umgebung wird vorbereitet…" @@ -8135,6 +8184,10 @@ msgstr "Aus dem Panel entfernen" msgid "Remove model" msgstr "Modell entfernen" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Angeheftete Route für {tagLabel} entfernen" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Zielanbieter" msgid "Task" msgstr "Aufgabe" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Aufgabenübereinstimmung" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Aufgabenausgabe" @@ -10747,6 +10804,10 @@ msgstr "Claude-Profile können nicht aktualisiert werden." msgid "Unable to remove {0} credentials." msgstr "{0}-Anmeldeinformationen können nicht entfernt werden." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Angeheftete Route konnte nicht entfernt werden." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Worktree konnte nicht entfernt werden." @@ -10867,6 +10928,14 @@ msgstr "Nicht verfügbar" msgid "Unavailable project" msgstr "Nicht verfügbares Projekt" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Nicht verfügbarer Anbieter" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Nicht verfügbare Anbieter, Modelle, Schlussfolgerungsstufen und Fast-Modi werden automatisch übersprungen." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Gruppierung aufheben" @@ -11150,6 +11219,10 @@ msgstr "Verbraucht" msgid "Used by {conflict}" msgstr "Von {conflict} verwendet" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Wird verwendet, wenn kein Anbieter angegeben ist. Explizite Crossagents-Nutzung steht an erster Stelle, gefolgt von Favoriten, normaler Agent-Nutzung und integrierter Reihenfolge." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Benutzer" diff --git a/src/renderer/locales/en/messages.po b/src/renderer/locales/en/messages.po index 087bc3c24..b16a43e0d 100644 --- a/src/renderer/locales/en/messages.po +++ b/src/renderer/locales/en/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# tool} other {# tools}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# turn} other {# turns}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# use} other {# uses}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Agent terminal font size" msgid "Agent update available" msgstr "Agent update available" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Agent usage" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agent: {description}" @@ -924,6 +933,14 @@ msgstr "Agents" msgid "Agents · General" msgstr "Agents · General" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Built-in" msgid "Built-in MCP servers" msgstr "Built-in MCP servers" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Built-in order" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Crossagent Result" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagent routing and ranking" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Crossagent routing guide" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents enabled for this thread" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents usage" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Crown" @@ -4154,6 +4182,7 @@ msgstr "Failed to update goal" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Fast" @@ -4170,6 +4199,10 @@ msgstr "Fastest (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Fastest uses Whisper tiny; Better uses Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favorite" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favorites" @@ -5541,6 +5574,14 @@ msgstr "Managed by provider" msgid "Manual order" msgstr "Manual order" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Manual override" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Manual routes override learned routing whenever all of their task tags match." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Pin to top" msgid "Pinned" msgstr "Pinned" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Pinned task routes" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "PR title (leave empty to auto-generate)" msgid "Pre-commit hook failed" msgstr "Pre-commit hook failed" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Preferred routing order" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Preparing remote environment…" @@ -8135,6 +8184,10 @@ msgstr "Remove from panel" msgid "Remove model" msgstr "Remove model" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Remove pinned route for {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Target provider" msgid "Task" msgstr "Task" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Task match" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Task output" @@ -10747,6 +10804,10 @@ msgstr "Unable to refresh Claude profiles." msgid "Unable to remove {0} credentials." msgstr "Unable to remove {0} credentials." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Unable to remove pinned route." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Unable to remove worktree." @@ -10867,6 +10928,14 @@ msgstr "Unavailable" msgid "Unavailable project" msgstr "Unavailable project" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Unavailable provider" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Ungroup" @@ -11150,6 +11219,10 @@ msgstr "Used" msgid "Used by {conflict}" msgstr "Used by {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "User" diff --git a/src/renderer/locales/es/messages.po b/src/renderer/locales/es/messages.po index 324513449..69cbf8b32 100644 --- a/src/renderer/locales/es/messages.po +++ b/src/renderer/locales/es/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# herramienta} other {# herramientas}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# turno} other {# turnos}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# uso} other {# usos}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Tamaño de fuente del terminal del agente" msgid "Agent update available" msgstr "Actualización de agente disponible" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Uso de agentes" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agente: {description}" @@ -924,6 +933,14 @@ msgstr "Agentes" msgid "Agents · General" msgstr "Agentes · General" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Los agentes clasifican el trabajo delegado con etiquetas de tarea. Las rutas de tarea manuales tienen prioridad, seguidas de las rutas aprendidas coincidentes, el uso global de Crossagents, los favoritos, el uso normal de agentes y el orden integrado." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Los agentes clasifican el trabajo delegado con etiquetas de tarea. Las rutas aprendidas que coinciden se clasifican primero, seguidas del uso global de Crossagents, los favoritos, el uso normal de agentes y el orden integrado." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Integrado" msgid "Built-in MCP servers" msgstr "Servidores MCP integrados" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Orden integrado" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Poracode administra los servidores integrados. Se pueden deshabilitar globalmente, pero no se pueden editar ni eliminar." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Resultado de Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Enrutamiento y clasificación de Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Guía de enrutamiento de Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents habilitados para este hilo" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Uso de Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Coronar" @@ -4154,6 +4182,7 @@ msgstr "No se pudo actualizar el objetivo" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Rápido" @@ -4170,6 +4199,10 @@ msgstr "Más rápido (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Más rápido usa Whisper tiny; Mejor usa Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favorito" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favoritos" @@ -5541,6 +5574,14 @@ msgstr "Gestionado por el proveedor" msgid "Manual order" msgstr "Orden manual" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Anulación manual" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Las rutas manuales sustituyen el enrutamiento aprendido siempre que coincidan todas sus etiquetas de tarea." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Fijar arriba" msgid "Pinned" msgstr "Fijado" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Rutas de tarea fijadas" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Título del PR (dejar vacío para autogenerar)" msgid "Pre-commit hook failed" msgstr "El hook de pre-commit falló" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Orden de enrutamiento preferido" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Preparando el entorno remoto…" @@ -8135,6 +8184,10 @@ msgstr "Quitar del panel" msgid "Remove model" msgstr "Eliminar modelo" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Eliminar la ruta fijada para {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Proveedor de destino" msgid "Task" msgstr "Tarea" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Coincidencia de tarea" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Salida de la tarea" @@ -10747,6 +10804,10 @@ msgstr "No se pueden actualizar los perfiles de Claude." msgid "Unable to remove {0} credentials." msgstr "No se pueden eliminar las credenciales de {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "No se pudo eliminar la ruta fijada." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "No se pudo eliminar el worktree." @@ -10867,6 +10928,14 @@ msgstr "No disponible" msgid "Unavailable project" msgstr "Proyecto no disponible" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Proveedor no disponible" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Los proveedores, modelos, niveles de razonamiento y modos Fast no disponibles se omiten automáticamente." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Desagrupar" @@ -11150,6 +11219,10 @@ msgstr "Usado" msgid "Used by {conflict}" msgstr "Lo usa {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Se usa cuando no se especifica un proveedor. El uso explícito de Crossagents ocupa el primer lugar, seguido de los favoritos, el uso normal de agentes y el orden integrado." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Usuario" diff --git a/src/renderer/locales/fr/messages.po b/src/renderer/locales/fr/messages.po index b79e8bc0f..fe24b01c6 100644 --- a/src/renderer/locales/fr/messages.po +++ b/src/renderer/locales/fr/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# outil} other {# outils}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# tour} other {# tours}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# utilisation} other {# utilisations}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Taille de la police du terminal de l'agent" msgid "Agent update available" msgstr "Mise à jour de l'agent disponible" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Utilisation des agents" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agent : {description}" @@ -924,6 +933,14 @@ msgstr "Agents" msgid "Agents · General" msgstr "Agents · Général" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Les agents classent le travail délégué à l’aide d’étiquettes de tâche. Les routes manuelles sont prioritaires, suivies des routes apprises correspondantes, de l’utilisation globale de Crossagents, des favoris, de l’utilisation habituelle des agents et de l’ordre intégré." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Les agents classent le travail délégué avec des étiquettes de tâche. Les routes apprises correspondantes sont classées en premier, suivies de l’utilisation globale de Crossagents, des favoris, de l’utilisation normale des agents et de l’ordre intégré." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Intégré" msgid "Built-in MCP servers" msgstr "Serveurs MCP intégrés" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Ordre intégré" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Les serveurs intégrés sont gérés par Poracode. Ils peuvent être désactivés globalement, mais ne peuvent être ni modifiés ni supprimés." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}) : {description}" msgid "Crossagent Result" msgstr "Résultat de Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Routage et classement des Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Guide de routage de Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents activés pour ce fil de discussion" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Utilisation de Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Couronner" @@ -4154,6 +4182,7 @@ msgstr "Impossible de mettre à jour l'objectif" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Rapide" @@ -4170,6 +4199,10 @@ msgstr "Le plus rapide (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Le plus rapide utilise Whisper tiny ; Meilleur utilise Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favori" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favoris" @@ -5541,6 +5574,14 @@ msgstr "Gérée par le fournisseur" msgid "Manual order" msgstr "Ordre manuel" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Remplacement manuel" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Les routes manuelles remplacent le routage appris lorsque toutes leurs étiquettes de tâche correspondent." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7378,6 +7419,10 @@ msgstr "Épingler en haut" msgid "Pinned" msgstr "Épinglé" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Routes de tâche épinglées" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7506,6 +7551,10 @@ msgstr "Titre du PR (laisser vide pour générer automatiquement)" msgid "Pre-commit hook failed" msgstr "Échec du hook de pré-validation" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Ordre de routage préféré" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Préparation de l’environnement distant…" @@ -8134,6 +8183,10 @@ msgstr "Supprimer du panneau" msgid "Remove model" msgstr "Supprimer le modèle" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Supprimer la route épinglée pour {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9949,6 +10002,10 @@ msgstr "Fournisseur cible" msgid "Task" msgstr "Tâche" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Correspondance de tâche" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Résultat de la tâche" @@ -10746,6 +10803,10 @@ msgstr "Impossible d'actualiser les profils Claude." msgid "Unable to remove {0} credentials." msgstr "Impossible de supprimer les informations d'identification {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Impossible de supprimer la route épinglée." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Impossible de supprimer l'arbre de travail." @@ -10866,6 +10927,14 @@ msgstr "Indisponible" msgid "Unavailable project" msgstr "Projet indisponible" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Fournisseur indisponible" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Les fournisseurs, modèles, niveaux de raisonnement et modes Fast indisponibles sont ignorés automatiquement." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Dissocier" @@ -11149,6 +11218,10 @@ msgstr "Utilisé" msgid "Used by {conflict}" msgstr "Utilisé par {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Utilisé lorsqu’aucun fournisseur n’est spécifié. L’utilisation explicite de Crossagents est classée en premier, suivie des favoris, de l’utilisation normale des agents et de l’ordre intégré." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Utilisateur" diff --git a/src/renderer/locales/ja/messages.po b/src/renderer/locales/ja/messages.po index 98a7072e3..3788c4275 100644 --- a/src/renderer/locales/ja/messages.po +++ b/src/renderer/locales/ja/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# 個のツール} other {# 個のツール}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, other {# ターン}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, other {# 回}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -904,6 +909,10 @@ msgstr "エージェント端末のフォントサイズ" msgid "Agent update available" msgstr "エージェントのアップデートが利用可能" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "エージェントの使用" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "エージェント:{description}" @@ -923,6 +932,14 @@ msgstr "エージェント" msgid "Agents · General" msgstr "エージェント · 一般" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "エージェントは委任された作業をタスクタグで分類します。手動のタスクルートが最優先され、次に一致する学習済みルート、Crossagents 全体での使用状況、お気に入り、通常のエージェント使用状況、組み込み順序が続きます。" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "エージェントは委任された作業をタスクタグで分類します。一致する学習済みルートが最優先され、その後に Crossagents 全体の使用状況、お気に入り、通常のエージェント使用状況、組み込み順序が続きます。" + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1615,6 +1632,10 @@ msgstr "組み込み" msgid "Built-in MCP servers" msgstr "組み込みMCPサーバー" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "組み込み順" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "組み込みサーバーはPoracodeによって管理されます。グローバルに無効化できますが、編集や削除はできません。" @@ -3030,8 +3051,11 @@ msgstr "Crossagent({subagent}):{description}" msgid "Crossagent Result" msgstr "Crossagentの結果" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagents のルーティングと順位" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Crossagents ルーティングガイド" @@ -3060,6 +3084,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "このスレッドに対して Crossagents が有効になっています" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents の使用" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "勝者に選ぶ" @@ -4153,6 +4181,7 @@ msgstr "目標を更新できませんでした" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "速い" @@ -4169,6 +4198,10 @@ msgstr "最速(Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "最速は Whisper tiny を使用し、高精度は Whisper base を使用します。" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "お気に入り" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "お気に入り" @@ -5540,6 +5573,14 @@ msgstr "プロバイダーが管理" msgid "Manual order" msgstr "手動並び替え" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "手動オーバーライド" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "すべてのタスクタグが一致する場合、手動ルートが学習済みルーティングより優先されます。" + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7377,6 +7418,10 @@ msgstr "トップにピン留めする" msgid "Pinned" msgstr "固定された" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "固定されたタスクルート" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7505,6 +7550,10 @@ msgstr "PR タイトル (自動生成するには空のままにしてくださ msgid "Pre-commit hook failed" msgstr "コミット前のフックが失敗しました" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "優先ルーティング順" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "リモート環境を準備中…" @@ -8133,6 +8182,10 @@ msgstr "パネルから削除" msgid "Remove model" msgstr "モデルを削除" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "{tagLabel} の固定ルートを削除" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9948,6 +10001,10 @@ msgstr "対象プロバイダー" msgid "Task" msgstr "タスク" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "タスク一致" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "タスクの出力" @@ -10745,6 +10802,10 @@ msgstr "Claude プロファイルを更新できません。" msgid "Unable to remove {0} credentials." msgstr "{0}資格情報を削除できません。" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "固定ルートを削除できませんでした。" + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "ワークツリーを削除できません。" @@ -10865,6 +10926,14 @@ msgstr "利用不可" msgid "Unavailable project" msgstr "利用できないプロジェクト" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "利用できないプロバイダー" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "利用できないプロバイダー、モデル、推論レベル、Fast モードは自動的にスキップされます。" + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "グループ解除" @@ -11148,6 +11217,10 @@ msgstr "使用済み" msgid "Used by {conflict}" msgstr "{conflict}で使用中" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "プロバイダーが指定されていない場合に使用されます。Crossagents で明示的に使用したもの、 お気に入り、通常のエージェント使用、組み込み順の順に優先されます。" + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "ユーザー" diff --git a/src/renderer/locales/ko/messages.po b/src/renderer/locales/ko/messages.po index 80ebd1391..0d4ae2de2 100644 --- a/src/renderer/locales/ko/messages.po +++ b/src/renderer/locales/ko/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {도구 #개} other {도구 #개}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, other {# 턴}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, other {#회 사용}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "에이전트 터미널 글꼴 크기" msgid "Agent update available" msgstr "에이전트 업데이트 사용 가능" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "에이전트 사용" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "에이전트: {description}" @@ -924,6 +933,14 @@ msgstr "에이전트" msgid "Agents · General" msgstr "에이전트 · 일반" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "에이전트는 위임된 작업을 작업 태그로 분류합니다. 수동 작업 경로가 가장 먼저 적용되고, 일치하는 학습된 경로, 전체 Crossagents 사용량, 즐겨찾기, 일반 에이전트 사용량, 기본 제공 순서가 이어집니다." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "에이전트는 위임된 작업을 작업 태그로 분류합니다. 일치하는 학습된 경로가 먼저 순위에 오르고, 전체 Crossagents 사용량, 즐겨찾기, 일반 에이전트 사용량, 기본 순서가 이어집니다." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "기본 제공" msgid "Built-in MCP servers" msgstr "기본 제공 MCP 서버" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "기본 제공 순서" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "기본 제공 서버는 Poracode에서 관리합니다. 전역으로 비활성화할 수 있지만 편집하거나 제거할 수 없습니다." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Crossagent 결과" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagents 라우팅 및 순위" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Crossagents 라우팅 가이드" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "이 스레드에 Crossagents가 활성화되었습니다." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents 사용" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "우승자로 선택" @@ -4154,6 +4182,7 @@ msgstr "목표를 업데이트하지 못했습니다" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "빠르게" @@ -4170,6 +4199,10 @@ msgstr "가장 빠름 (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "가장 빠름은 Whisper tiny를, 더 좋음은 Whisper base를 사용합니다." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "즐겨찾기" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "즐겨찾기" @@ -5541,6 +5574,14 @@ msgstr "제공자가 관리함" msgid "Manual order" msgstr "수동 정렬" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "수동 재정의" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "모든 작업 태그가 일치하면 수동 경로가 학습된 라우팅보다 우선합니다." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "상단에 고정" msgid "Pinned" msgstr "고정됨" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "고정된 작업 경로" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "PR 제목(자동 생성하려면 비워두세요)" msgid "Pre-commit hook failed" msgstr "사전 커밋 후크 실패" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "선호 라우팅 순서" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "원격 환경 준비 중…" @@ -8135,6 +8184,10 @@ msgstr "패널에서 제거" msgid "Remove model" msgstr "모델 제거" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "{tagLabel}의 고정 경로 제거" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "대상 공급자" msgid "Task" msgstr "작업" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "작업 일치" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "작업 출력" @@ -10747,6 +10804,10 @@ msgstr "Claude 프로필을 새로 고칠 수 없습니다." msgid "Unable to remove {0} credentials." msgstr "{0} 자격 증명을 제거할 수 없습니다." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "고정 경로를 제거할 수 없습니다." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "작업 트리를 제거할 수 없습니다." @@ -10867,6 +10928,14 @@ msgstr "사용할 수 없음" msgid "Unavailable project" msgstr "사용할 수 없는 프로젝트" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "사용할 수 없는 제공자" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "사용할 수 없는 제공자, 모델, 추론 수준 및 Fast 모드는 자동으로 건너뜁니다." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "그룹 해제" @@ -11150,6 +11219,10 @@ msgstr "사용됨" msgid "Used by {conflict}" msgstr "{conflict}에서 사용 중" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "제공자를 지정하지 않았을 때 사용합니다. 명시적인 Crossagents 사용, 즐겨찾기, 일반 에이전트 사용, 기본 제공 순서 순으로 우선합니다." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "사용자" diff --git a/src/renderer/locales/pl/messages.po b/src/renderer/locales/pl/messages.po index 9360d0e31..ceb9c1b43 100644 --- a/src/renderer/locales/pl/messages.po +++ b/src/renderer/locales/pl/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# narzędzie} few {# narzędzia} many {# narzędzi} oth #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# tura} few {# tury} many {# tur} other {# tury}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# użycie} few {# użycia} many {# użyć} other {# użycia}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Rozmiar czcionki terminala agenta" msgid "Agent update available" msgstr "Dostępna aktualizacja agenta" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Użycie agentów" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agent:{description}" @@ -924,6 +933,14 @@ msgstr "Agenci" msgid "Agents · General" msgstr "Agenci · Ogólne" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Agenci klasyfikują delegowaną pracę za pomocą tagów zadań. Ręczne trasy zadań mają najwyższy priorytet, a po nich pasujące wyuczone trasy, globalne użycie Crossagents, ulubione, zwykłe użycie agentów i kolejność wbudowana." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Agenci klasyfikują delegowaną pracę za pomocą tagów zadań. Pasujące wyuczone trasy są klasyfikowane jako pierwsze, a następnie globalne użycie Crossagents, ulubione, zwykłe użycie agentów i kolejność wbudowana." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Wbudowany" msgid "Built-in MCP servers" msgstr "Wbudowane serwery MCP" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Kolejność wbudowana" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Wbudowane serwery są zarządzane przez Poracode. Można je globalnie wyłączyć, ale nie można ich edytować ani usuwać." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Wynik Crossagenta" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Routing i ranking Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Przewodnik po routingu Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents włączeni dla tego wątku" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Użycie Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Wybierz zwycięzcę" @@ -4154,6 +4182,7 @@ msgstr "Nie udało się zaktualizować celu" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Szybki" @@ -4170,6 +4199,10 @@ msgstr "Najszybszy (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "„Najszybszy” używa modelu Whisper tiny; „Lepszy” używa modelu Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Ulubione" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Ulubione" @@ -5541,6 +5574,14 @@ msgstr "Zarządzana przez dostawcę" msgid "Manual order" msgstr "Kolejność ręczna" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Ręczne zastąpienie" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Ręczne trasy zastępują wyuczone trasowanie, gdy pasują wszystkie ich tagi zadań." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Przypnij do góry" msgid "Pinned" msgstr "Przypięty" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Przypięte trasy zadań" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Tytuł PR (pozostaw puste, aby wygenerować automatycznie)" msgid "Pre-commit hook failed" msgstr "Hak pre-commit nie powiódł się" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Preferowana kolejność routingu" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Przygotowywanie środowiska zdalnego…" @@ -8135,6 +8184,10 @@ msgstr "Usuń z panelu" msgid "Remove model" msgstr "Usuń model" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Usuń przypiętą trasę dla {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Dostawca docelowy" msgid "Task" msgstr "Zadanie" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Dopasowanie zadania" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Dane wyjściowe zadania" @@ -10747,6 +10804,10 @@ msgstr "Nie można odświeżyć profili Claude." msgid "Unable to remove {0} credentials." msgstr "Nie można usunąć poświadczeń {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Nie udało się usunąć przypiętej trasy." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Nie można usunąć drzewa roboczego." @@ -10867,6 +10928,14 @@ msgstr "Niedostępny" msgid "Unavailable project" msgstr "Niedostępny projekt" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Niedostępny dostawca" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Niedostępni dostawcy, modele, poziomy rozumowania i tryby Fast są automatycznie pomijane." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Rozgrupuj" @@ -11150,6 +11219,10 @@ msgstr "Używany" msgid "Used by {conflict}" msgstr "Używany przez {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Używane, gdy nie określono dostawcy. Najpierw brane jest pod uwagę jawne użycie Crossagents, następnie ulubione, zwykłe użycie agentów i kolejność wbudowana." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Użytkownik" diff --git a/src/renderer/locales/pt-BR/messages.po b/src/renderer/locales/pt-BR/messages.po index 81bc50f9e..685ccf787 100644 --- a/src/renderer/locales/pt-BR/messages.po +++ b/src/renderer/locales/pt-BR/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# ferramenta} other {# ferramentas}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# turno} other {# turnos}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# uso} other {# usos}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Tamanho da fonte do terminal do agente" msgid "Agent update available" msgstr "Atualização do agente disponível" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Uso de agentes" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Agente:{description}" @@ -924,6 +933,14 @@ msgstr "Agentes" msgid "Agents · General" msgstr "Agentes · Geral" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Os agentes classificam o trabalho delegado com tags de tarefa. As rotas manuais de tarefa têm prioridade, seguidas pelas rotas aprendidas correspondentes, pelo uso global do Crossagents, pelos favoritos, pelo uso normal de agentes e pela ordem integrada." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Os agentes classificam o trabalho delegado com tags de tarefa. As rotas aprendidas correspondentes ficam em primeiro lugar, seguidas pelo uso global do Crossagents, favoritos, uso normal de agentes e ordem integrada." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Integrado" msgid "Built-in MCP servers" msgstr "Servidores MCP integrados" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Ordem integrada" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Os servidores integrados são gerenciados pelo Poracode. Eles podem ser desativados globalmente, mas não podem ser editados nem removidos." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Resultado do Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Roteamento e classificação de Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Guia de roteamento do Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents ativados para este tópico" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Uso de Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Coroar" @@ -4154,6 +4182,7 @@ msgstr "Não foi possível atualizar o objetivo" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Rápido" @@ -4170,6 +4199,10 @@ msgstr "Mais rápido (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "O mais rápido usa o Whisper tiny; o Melhor usa o Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favorito" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favoritos" @@ -5541,6 +5574,14 @@ msgstr "Gerenciada pelo provedor" msgid "Manual order" msgstr "Ordem manual" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Substituição manual" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "As rotas manuais substituem o roteamento aprendido quando todas as tags de tarefa correspondem." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Fixar no topo" msgid "Pinned" msgstr "Fixado" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Rotas de tarefa fixadas" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Título PR (deixe em branco para gerar automaticamente)" msgid "Pre-commit hook failed" msgstr "Falha no gancho de pré-confirmação" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Ordem de roteamento preferida" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Preparando o ambiente remoto…" @@ -8135,6 +8184,10 @@ msgstr "Remover do painel" msgid "Remove model" msgstr "Remover modelo" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Remover a rota fixada para {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Provedor de destino" msgid "Task" msgstr "Tarefa" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Correspondência da tarefa" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Saída da tarefa" @@ -10747,6 +10804,10 @@ msgstr "Não foi possível atualizar os perfis do Claude." msgid "Unable to remove {0} credentials." msgstr "Não foi possível remover as credenciais do {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Não foi possível remover a rota fixada." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Não foi possível remover a árvore de trabalho." @@ -10867,6 +10928,14 @@ msgstr "Indisponível" msgid "Unavailable project" msgstr "Projeto indisponível" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Provedor indisponível" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Provedores, modelos, níveis de raciocínio e modos Fast indisponíveis são ignorados automaticamente." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Desagrupar" @@ -11150,6 +11219,10 @@ msgstr "Usado" msgid "Used by {conflict}" msgstr "Usado por {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Usado quando nenhum provedor é especificado. O uso explícito de Crossagents vem primeiro, seguido pelos favoritos, pelo uso normal de agentes e pela ordem integrada." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Usuário" diff --git a/src/renderer/locales/ru/messages.po b/src/renderer/locales/ru/messages.po index 32e85c612..6bdc1c864 100644 --- a/src/renderer/locales/ru/messages.po +++ b/src/renderer/locales/ru/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# инструмент} few {# инструмента} #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# ход} few {# хода} many {# ходов} other {# хода}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# использование} few {# использования} many {# использований} other {# использования}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Размер шрифта терминала агента" msgid "Agent update available" msgstr "Доступно обновление агента" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Использование агентов" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Агент: {description}" @@ -924,6 +933,14 @@ msgstr "Агенты" msgid "Agents · General" msgstr "Агенты · Общие" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Агенты классифицируют делегированную работу с помощью тегов задач. Сначала применяются ручные маршруты задач, затем подходящие изученные маршруты, глобальная статистика использования Crossagents, избранное, обычная статистика использования агентов и встроенный порядок." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Агенты классифицируют делегированную работу с помощью тегов задач. Сначала ранжируются подходящие изученные маршруты, затем глобальная статистика Crossagents, избранное, обычная статистика агентов и встроенный порядок." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Встроенный" msgid "Built-in MCP servers" msgstr "Встроенные серверы MCP" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Встроенный порядок" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Встроенные серверы управляются Poracode. Их можно отключить глобально, но нельзя редактировать или удалять." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Результат Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Маршрутизация и рейтинг Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Руководство по маршрутизации Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents включены для этого треда" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Использование Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Назначить победителем" @@ -4154,6 +4182,7 @@ msgstr "Не удалось обновить цель" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Быстрый" @@ -4170,6 +4199,10 @@ msgstr "Быстрее всего (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Режим «Быстрее всего» использует Whisper tiny; «Лучше» — Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Избранное" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Избранное" @@ -5541,6 +5574,14 @@ msgstr "Управляется провайдером" msgid "Manual order" msgstr "Ручной порядок" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Ручное переопределение" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Ручные маршруты переопределяют изученную маршрутизацию, когда совпадают все их теги задач." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Закрепить вверху" msgid "Pinned" msgstr "Закреплено" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Закреплённые маршруты задач" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Заголовок PR (оставьте пустым для автоге msgid "Pre-commit hook failed" msgstr "Сбой хука pre-commit" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Предпочтительный порядок маршрутизации" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Подготовка удалённой среды…" @@ -8135,6 +8184,10 @@ msgstr "Удалить с панели" msgid "Remove model" msgstr "Удалить модель" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Удалить закреплённый маршрут для {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Целевой провайдер" msgid "Task" msgstr "Задача" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Соответствие задаче" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Вывод задачи" @@ -10747,6 +10804,10 @@ msgstr "Не удалось обновить профили Claude." msgid "Unable to remove {0} credentials." msgstr "Не удалось удалить учётные данные {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Не удалось удалить закреплённый маршрут." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Не удалось удалить worktree." @@ -10867,6 +10928,14 @@ msgstr "Недоступно" msgid "Unavailable project" msgstr "Недоступный проект" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Недоступный провайдер" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Недоступные провайдеры, модели, уровни рассуждений и режимы Fast автоматически пропускаются." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Разгруппировать" @@ -11150,6 +11219,10 @@ msgstr "Использовано" msgid "Used by {conflict}" msgstr "Используется командой {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Используется, когда провайдер не указан. На первом месте — явное использование Crossagents, затем избранное, обычное использование агентов и встроенный порядок." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Пользователь" diff --git a/src/renderer/locales/tr/messages.po b/src/renderer/locales/tr/messages.po index 1f7f23a23..dc254b8c7 100644 --- a/src/renderer/locales/tr/messages.po +++ b/src/renderer/locales/tr/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# araç} other {# araç}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# tur} other {# tur}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, other {# kullanım}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Temsilci terminali yazı tipi boyutu" msgid "Agent update available" msgstr "Temsilci güncellemesi mevcut" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Ajan kullanımı" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Temsilci: {description}" @@ -924,6 +933,14 @@ msgstr "Temsilciler" msgid "Agents · General" msgstr "Temsilciler · Genel" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Ajanlar devredilen işi görev etiketleriyle sınıflandırır. Önce manuel görev rotaları, ardından eşleşen öğrenilmiş rotalar, genel Crossagents kullanımı, favoriler, normal ajan kullanımı ve yerleşik sıra gelir." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Aracılar devredilen işleri görev etiketleriyle sınıflandırır. Eşleşen öğrenilmiş rotalar ilk sırada yer alır; ardından genel Crossagents kullanımı, favoriler, normal aracı kullanımı ve yerleşik sıra gelir." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Yerleşik" msgid "Built-in MCP servers" msgstr "Yerleşik MCP sunucuları" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Yerleşik sıra" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Yerleşik sunucular Poracode tarafından yönetilir. Genel olarak devre dışı bırakılabilirler ancak düzenlenemez veya kaldırılamazlar." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Crossagent Sonucu" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagents yönlendirme ve sıralaması" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Crossagents yönlendirme kılavuzu" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Bu konu için Crossagents etkinleştirildi" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents kullanımı" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Kazanan seç" @@ -4154,6 +4182,7 @@ msgstr "Hedef güncellenemedi" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Hızlı" @@ -4170,6 +4199,10 @@ msgstr "En hızlı (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "En hızlı, Whisper tiny modelini kullanır; Daha iyi, Whisper base modelini kullanır." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Favori" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Favoriler" @@ -5541,6 +5574,14 @@ msgstr "Sağlayıcı tarafından yönetiliyor" msgid "Manual order" msgstr "Manuel sıralama" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Manuel geçersiz kılma" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Tüm görev etiketleri eşleştiğinde manuel rotalar öğrenilmiş yönlendirmeyi geçersiz kılar." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "En üste sabitle" msgid "Pinned" msgstr "Sabitlendi" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Sabitlenmiş görev rotaları" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "PR başlığı (otomatik oluşturmak için boş bırakın)" msgid "Pre-commit hook failed" msgstr "Pre-commit kancası başarısız oldu" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Tercih edilen yönlendirme sırası" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Uzak ortam hazırlanıyor…" @@ -8135,6 +8184,10 @@ msgstr "Panelden kaldır" msgid "Remove model" msgstr "Modeli kaldır" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "{tagLabel} için sabitlenmiş rotayı kaldır" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Hedef sağlayıcı" msgid "Task" msgstr "Görev" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Görev eşleşmesi" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Görev çıkışı" @@ -10747,6 +10804,10 @@ msgstr "Claude profilleri yenilenemiyor." msgid "Unable to remove {0} credentials." msgstr "{0} kimlik bilgileri kaldırılamıyor." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Sabitlenmiş rota kaldırılamadı." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Çalışma ağacı kaldırılamıyor." @@ -10867,6 +10928,14 @@ msgstr "Kullanılamıyor" msgid "Unavailable project" msgstr "Kullanılamayan proje" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Kullanılamayan sağlayıcı" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Kullanılamayan sağlayıcılar, modeller, akıl yürütme düzeyleri ve Fast modları otomatik olarak atlanır." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Grubu çöz" @@ -11150,6 +11219,10 @@ msgstr "Kullanılmış" msgid "Used by {conflict}" msgstr "{conflict} tarafından kullanılıyor" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Sağlayıcı belirtilmediğinde kullanılır. Önce açık Crossagents kullanımı, ardından favoriler, normal ajan kullanımı ve yerleşik sıra gelir." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Kullanıcı" diff --git a/src/renderer/locales/uk/messages.po b/src/renderer/locales/uk/messages.po index 1dbc5f684..b8531a9ac 100644 --- a/src/renderer/locales/uk/messages.po +++ b/src/renderer/locales/uk/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# інструмент} few {# інструменти} #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, one {# хід} few {# ходи} many {# ходів} other {# ходу}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, one {# використання} few {# використання} many {# використань} other {# використання}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Розмір шрифту термінала агента" msgid "Agent update available" msgstr "Доступне оновлення агента" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Використання агентів" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Агент: {description}" @@ -924,6 +933,14 @@ msgstr "Агенти" msgid "Agents · General" msgstr "Агенти · Загальні" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Агенти класифікують делеговану роботу за допомогою тегів завдань. Спочатку застосовуються ручні маршрути завдань, потім відповідні вивчені маршрути, глобальна статистика використання Crossagents, вибране, звичайна статистика використання агентів і вбудований порядок." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Агенти класифікують делеговану роботу за допомогою тегів завдань. Спочатку ранжуються відповідні вивчені маршрути, потім глобальна статистика Crossagents, вибране, звичайна статистика агентів і вбудований порядок." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Вбудований" msgid "Built-in MCP servers" msgstr "Вбудовані сервери MCP" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Вбудований порядок" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Вбудовані сервери керуються Poracode. Їх можна вимкнути глобально, але не можна редагувати або видаляти." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Результат Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Маршрутизація та рейтинг Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Посібник із маршрутизації Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Crossagents увімкнено для цього треду" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Використання Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Обрати переможцем" @@ -4154,6 +4182,7 @@ msgstr "Не вдалося оновити мету" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Швидкий" @@ -4170,6 +4199,10 @@ msgstr "Найшвидше (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Найшвидше використовує Whisper tiny; Краще використовує Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Обране" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Вибране" @@ -5541,6 +5574,14 @@ msgstr "Керується провайдером" msgid "Manual order" msgstr "Ручний порядок" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Ручне перевизначення" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Ручні маршрути перевизначають вивчену маршрутизацію, коли збігаються всі їхні теги завдань." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Закріпити вгорі" msgid "Pinned" msgstr "Закріплено" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Закріплені маршрути завдань" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Заголовок PR (залиште порожнім для автоґ msgid "Pre-commit hook failed" msgstr "Збій хука pre-commit" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Бажаний порядок маршрутизації" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Підготовка віддаленого середовища…" @@ -8135,6 +8184,10 @@ msgstr "Видалити з панелі" msgid "Remove model" msgstr "Видалити модель" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Видалити закріплений маршрут для {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Цільовий провайдер" msgid "Task" msgstr "Завдання" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Відповідність завданню" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Вивід завдання" @@ -10747,6 +10804,10 @@ msgstr "Не вдалося оновити профілі Claude." msgid "Unable to remove {0} credentials." msgstr "Не вдалося видалити облікові дані {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Не вдалося видалити закріплений маршрут." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Не вдалося видалити worktree." @@ -10867,6 +10928,14 @@ msgstr "Недоступно" msgid "Unavailable project" msgstr "Недоступний проєкт" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Недоступний провайдер" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Недоступні провайдери, моделі, рівні міркування та режими Fast автоматично пропускаються." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Розгрупувати" @@ -11150,6 +11219,10 @@ msgstr "Використано" msgid "Used by {conflict}" msgstr "Використовується для {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Використовується, коли провайдера не вказано. Спочатку враховується явне використання Crossagents, потім обране, звичайне використання агентів і вбудований порядок." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Користувач" diff --git a/src/renderer/locales/vi/messages.po b/src/renderer/locales/vi/messages.po index c00f49022..3ef715bc9 100644 --- a/src/renderer/locales/vi/messages.po +++ b/src/renderer/locales/vi/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# công cụ} other {# công cụ}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, other {# lượt}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, other {# lần dùng}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "Kích thước phông chữ terminal của tác nhân" msgid "Agent update available" msgstr "Đã có bản cập nhật tác nhân" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "Mức sử dụng tác nhân" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "Tác nhân: {description}" @@ -924,6 +933,14 @@ msgstr "Tác nhân" msgid "Agents · General" msgstr "Tác nhân · Chung" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "Các tác nhân phân loại công việc được giao bằng thẻ tác vụ. Tuyến tác vụ thủ công được ưu tiên trước, sau đó là các tuyến đã học phù hợp, mức sử dụng Crossagents toàn cục, mục yêu thích, mức sử dụng tác nhân thông thường và thứ tự tích hợp." + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "Các tác nhân phân loại công việc được ủy quyền bằng thẻ tác vụ. Các tuyến đã học phù hợp được xếp hạng đầu tiên, tiếp theo là mức sử dụng Crossagents toàn cục, mục yêu thích, mức sử dụng tác nhân thông thường và thứ tự tích hợp." + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "Tích hợp sẵn" msgid "Built-in MCP servers" msgstr "Máy chủ MCP tích hợp sẵn" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "Thứ tự tích hợp" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "Các máy chủ tích hợp sẵn do Poracode quản lý. Bạn có thể tắt chúng trên toàn hệ thống nhưng không thể chỉnh sửa hoặc xóa." @@ -3031,8 +3052,11 @@ msgstr "Crossagent ({subagent}): {description}" msgid "Crossagent Result" msgstr "Kết quả Crossagent" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Định tuyến và xếp hạng Crossagents" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Hướng dẫn định tuyến Crossagents" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "Đã bật Crossagents cho chủ đề này" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Mức sử dụng Crossagents" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "Chọn làm ứng viên thắng" @@ -4154,6 +4182,7 @@ msgstr "Không thể cập nhật mục tiêu" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "Nhanh" @@ -4170,6 +4199,10 @@ msgstr "Nhanh nhất (Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "Nhanh nhất dùng Whisper tiny; Tốt hơn dùng Whisper base." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "Yêu thích" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "Yêu thích" @@ -5541,6 +5574,14 @@ msgstr "Do nhà cung cấp quản lý" msgid "Manual order" msgstr "Sắp xếp thủ công" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "Ghi đè thủ công" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "Tuyến thủ công ghi đè định tuyến đã học khi tất cả thẻ tác vụ của chúng đều khớp." + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7379,6 +7420,10 @@ msgstr "Ghim lên đầu" msgid "Pinned" msgstr "Đã ghim" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "Tuyến tác vụ đã ghim" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7507,6 +7552,10 @@ msgstr "Tiêu đề PR (để trống để tự động tạo)" msgid "Pre-commit hook failed" msgstr "Hook pre-commit không thành công" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "Thứ tự định tuyến ưu tiên" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "Đang chuẩn bị môi trường từ xa…" @@ -8135,6 +8184,10 @@ msgstr "Xóa khỏi bảng điều khiển" msgid "Remove model" msgstr "Xóa mô hình" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "Xóa tuyến đã ghim cho {tagLabel}" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9950,6 +10003,10 @@ msgstr "Nhà cung cấp mục tiêu" msgid "Task" msgstr "Tác vụ" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "Khớp tác vụ" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "Đầu ra nhiệm vụ" @@ -10747,6 +10804,10 @@ msgstr "Không thể làm mới hồ sơ Claude." msgid "Unable to remove {0} credentials." msgstr "Không thể xóa thông tin xác thực {0}." +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "Không thể xóa tuyến đã ghim." + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "Không thể xóa cây làm việc." @@ -10867,6 +10928,14 @@ msgstr "Không khả dụng" msgid "Unavailable project" msgstr "Dự án không khả dụng" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "Nhà cung cấp không khả dụng" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "Nhà cung cấp, mô hình, mức suy luận và chế độ Fast không khả dụng sẽ tự động được bỏ qua." + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "Bỏ nhóm" @@ -11150,6 +11219,10 @@ msgstr "Đã dùng" msgid "Used by {conflict}" msgstr "Đã được dùng bởi {conflict}" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "Được dùng khi không chỉ định nhà cung cấp. Mức sử dụng Crossagents rõ ràng được ưu tiên trước, tiếp theo là mục yêu thích, mức sử dụng tác nhân thông thường và thứ tự tích hợp." + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "Người dùng" diff --git a/src/renderer/locales/zh-CN/messages.po b/src/renderer/locales/zh-CN/messages.po index 689e07244..554e26e5e 100644 --- a/src/renderer/locales/zh-CN/messages.po +++ b/src/renderer/locales/zh-CN/messages.po @@ -96,6 +96,11 @@ msgstr "{0, plural, one {# 个工具} other {# 个工具}}" #~ msgid "{0, plural, one {# turn} other {# turns}}" #~ msgstr "{0, plural, other {# 轮}}" +#. placeholder {0}: entry.usageCount +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "{0, plural, one {# use} other {# uses}}" +msgstr "{0, plural, other {使用 # 次}}" + #. placeholder {0}: candidates.length #: src/renderer/components/experiment/NewExperimentModal.tsx #~ msgid "{0, plural, one {Candidate (#)} other {Candidates (#)}}" @@ -905,6 +910,10 @@ msgstr "代理终端字体大小" msgid "Agent update available" msgstr "代理更新可用" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agent usage" +msgstr "智能体使用情况" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Agent: {description}" msgstr "代理:{description}" @@ -924,6 +933,14 @@ msgstr "智能体" msgid "Agents · General" msgstr "代理·一般" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Agents classify delegated work with task tags. Manual task routes rank first, followed by matching learned routes, global Crossagents usage, favorites, normal agent usage, and built-in order." +msgstr "代理使用任务标签对委派的工作进行分类。手动任务路由优先,其次是匹配的已学习路由、Crossagents 全局使用情况、收藏项、常规代理使用情况和内置顺序。" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Agents classify delegated work with task tags. Matching learned routes rank first, followed by global Crossagents usage, favorites, normal agent usage, and built-in order." +#~ msgstr "智能体使用任务标签对委派的工作进行分类。匹配的已学习路由优先排序,之后依次是 Crossagents 全局使用情况、收藏项、普通智能体使用情况和内置顺序。" + #. Settings section: AI / assistant configuration #: src/mobile/settingsSections.ts #: src/renderer/views/SettingsOverlay/parts/AISettings.tsx @@ -1616,6 +1633,10 @@ msgstr "内置" msgid "Built-in MCP servers" msgstr "内置 MCP 服务器" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Built-in order" +msgstr "内置顺序" + #: src/renderer/components/mcp/McpServersManager.tsx msgid "Built-in servers are managed by Poracode. They can be disabled globally but cannot be edited or removed." msgstr "内置服务器由 Poracode 管理。可以全局禁用,但不能编辑或删除。" @@ -3031,8 +3052,11 @@ msgstr "Crossagent({subagent}):{description}" msgid "Crossagent Result" msgstr "Crossagent 结果" -#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx #: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx +msgid "Crossagent routing and ranking" +msgstr "Crossagents 路由和排名" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Crossagent routing guide" msgstr "Crossagents 路由指南" @@ -3061,6 +3085,10 @@ msgstr "Crossagents" msgid "Crossagents enabled for this thread" msgstr "已为此线程启用 Crossagents" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Crossagents usage" +msgstr "Crossagents 使用情况" + #: src/renderer/views/ExperimentView/parts/ExperimentCandidateCard.tsx msgid "Crown" msgstr "选为优胜者" @@ -4154,6 +4182,7 @@ msgstr "无法更新目标" #: src/renderer/components/experiment/ExperimentDraftTargets.tsx #: src/renderer/components/providers/modelDisplay.ts #: src/renderer/components/thread/buildModelPickerControls.tsx +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx msgid "Fast" msgstr "快" @@ -4170,6 +4199,10 @@ msgstr "最快(Whisper tiny)" msgid "Fastest uses Whisper tiny; Better uses Whisper base." msgstr "“最快”使用 Whisper tiny;“更好”使用 Whisper base。" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Favorite" +msgstr "收藏" + #: src/renderer/components/common/ProviderModelMenu/parts/buildItems.ts msgid "Favorites" msgstr "收藏夹" @@ -5541,6 +5574,14 @@ msgstr "由提供商托管" msgid "Manual order" msgstr "手动排序" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual override" +msgstr "手动覆盖" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Manual routes override learned routing whenever all of their task tags match." +msgstr "当所有任务标签均匹配时,手动路由会覆盖已学习的路由。" + #. placeholder {0}: thread.title #: src/renderer/views/MainView/parts/Sidebar/parts/SortableThreadItem/parts/ThreadItemSuffix.tsx msgid "Mark {0} done" @@ -7378,6 +7419,10 @@ msgstr "固定到顶部" msgid "Pinned" msgstr "已固定" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Pinned task routes" +msgstr "已固定的任务路由" + #: src/mobile/ComposerInfoChips.tsx #: src/renderer/components/layout/UnifiedRightPanel.tsx #: src/renderer/components/providers/composerControlBuilders.tsx @@ -7506,6 +7551,10 @@ msgstr "PR 标题(留空以自动生成)" msgid "Pre-commit hook failed" msgstr "预提交挂钩失败" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Preferred routing order" +msgstr "首选路由顺序" + #: src/renderer/views/SettingsOverlay/parts/SshConnectionForm.tsx msgid "Preparing remote environment…" msgstr "正在准备远程环境…" @@ -8134,6 +8183,10 @@ msgstr "从面板上移除" msgid "Remove model" msgstr "移除模型" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Remove pinned route for {tagLabel}" +msgstr "移除 {tagLabel} 的固定路由" + #: src/mobile/views/ManageProjectsView.tsx #: src/renderer/views/SettingsOverlay/parts/RemoteServersSettings.tsx msgid "Remove project" @@ -9949,6 +10002,10 @@ msgstr "目标提供商" msgid "Task" msgstr "任务" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Task match" +msgstr "任务匹配" + #: src/renderer/components/thread/ChatPane/parts/items/toolDisplay.ts msgid "Task output" msgstr "任务输出" @@ -10746,6 +10803,10 @@ msgstr "无法刷新 Claude 配置文件。" msgid "Unable to remove {0} credentials." msgstr "无法删除{0}凭据。" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unable to remove pinned route." +msgstr "无法移除固定路由。" + #: src/renderer/actions/worktreeActions.ts msgid "Unable to remove worktree." msgstr "无法删除工作树。" @@ -10866,6 +10927,14 @@ msgstr "不可用" msgid "Unavailable project" msgstr "不可用的项目" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable provider" +msgstr "提供商不可用" + +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +msgid "Unavailable providers, models, reasoning levels, and Fast modes are skipped automatically." +msgstr "不可用的提供商、模型、推理级别和 Fast 模式会被自动跳过。" + #: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/parts/BrowserTabGroupMenu.tsx msgid "Ungroup" msgstr "取消分组" @@ -11149,6 +11218,10 @@ msgstr "已使用" msgid "Used by {conflict}" msgstr "已被{conflict}使用" +#: src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +#~ msgid "Used when no provider is specified. Explicit Crossagents usage ranks first, followed by favorites, normal agent usage, and built-in order." +#~ msgstr "未指定提供商时使用。优先按明确的 Crossagents 使用情况排名,其次是收藏、普通智能体使用情况和内置顺序。" + #: src/renderer/components/mcp/McpServersManager.tsx #~ msgid "User" #~ msgstr "用户" diff --git a/src/renderer/state/sharedSettingsStore.test.ts b/src/renderer/state/sharedSettingsStore.test.ts index 9e72584df..f83755d9a 100644 --- a/src/renderer/state/sharedSettingsStore.test.ts +++ b/src/renderer/state/sharedSettingsStore.test.ts @@ -22,6 +22,9 @@ describe("sharedSettingsStore", () => { disabledAgents: [], favoriteModels: [], recentModels: [], + agentSelectionUsage: [], + crossagentSelectionUsage: [], + crossagentRoutingOverrides: [], providerOrder: [], lastUsedProjectDirs: {}, }); @@ -46,6 +49,22 @@ describe("sharedSettingsStore", () => { expect(useSharedSettings.getState().audio.transcriptionLanguage).toBe("es"); }); + it("counts repeated normal composer selections for Crossagents fallback ranking", () => { + const state = useSharedSettings.getState(); + state.pushRecentModel("kimi", "k3", "gui", "max", false); + state.pushRecentModel("kimi", "k3", "gui", "max", false); + + expect(useSharedSettings.getState().agentSelectionUsage).toEqual([ + expect.objectContaining({ + agentKind: "kimi", + modelId: "k3", + effort: "max", + fast: false, + count: 2, + }), + ]); + }); + it("updates provider config when only context size, fast, and thinking change", () => { useSharedSettings.getState().setProviderConfig("claude", { model: "claude-opus-4-7", diff --git a/src/renderer/state/sharedSettingsStore.ts b/src/renderer/state/sharedSettingsStore.ts index f209d59f8..0f9906370 100644 --- a/src/renderer/state/sharedSettingsStore.ts +++ b/src/renderer/state/sharedSettingsStore.ts @@ -29,6 +29,7 @@ import type { Workspace, } from "@/shared/contracts"; import { nextWorkspaceIconId } from "@/shared/contracts"; +import { incrementAgentSelectionUsage } from "@/shared/crossagentRanking"; const STORAGE_KEY = "poracode-shared-settings"; @@ -167,11 +168,12 @@ interface SharedSettingsState extends SharedSettings { agentKind: string, modelId: string, presentationMode: ThreadPresentationMode, + effort?: string, + fast?: boolean, ) => void; } const RECENT_MODELS_LIMIT = 16; - function hasBridge(): boolean { return typeof window !== "undefined" && window.poracode !== undefined; } @@ -760,7 +762,7 @@ export const useSharedSettings = create()((set, get) => ({ set({ crossagentRoutingGuide }); persistSettings(selectSharedSettings(get())); }, - pushRecentModel: (agentKind, modelId, presentationMode) => { + pushRecentModel: (agentKind, modelId, presentationMode, effort, fast) => { const current = get().recentModels; const samePresentation = current.filter((m) => m.presentationMode === presentationMode); const otherPresentations = current.filter((m) => m.presentationMode !== presentationMode); @@ -772,18 +774,26 @@ export const useSharedSettings = create()((set, get) => ({ RECENT_MODELS_LIMIT, ); const next = [...nextForPresentation, ...otherPresentations].slice(0, RECENT_MODELS_LIMIT * 2); - if ( + const agentSelectionUsage = incrementAgentSelectionUsage(get().agentSelectionUsage, [ + { + agentKind, + modelId, + ...(effort ? { effort } : {}), + fast: fast === true, + }, + ]); + const recentsUnchanged = current.length === next.length && current.every( (m, i) => m.agentKind === next[i]!.agentKind && m.modelId === next[i]!.modelId && m.presentationMode === next[i]!.presentationMode, - ) - ) { - return; - } - set({ recentModels: next }); + ); + set({ + ...(recentsUnchanged ? {} : { recentModels: next }), + agentSelectionUsage, + }); persistSettings(selectSharedSettings(get())); }, })); @@ -883,6 +893,7 @@ function selectSharedSettings(state: SharedSettingsState): SharedSettingsInput { workspaces: state.workspaces, favoriteModels: state.favoriteModels, recentModels: state.recentModels, + agentSelectionUsage: state.agentSelectionUsage, browser: state.browser, audio: state.audio, usage: state.usage, diff --git a/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.test.tsx b/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.test.tsx new file mode 100644 index 000000000..5056c3c94 --- /dev/null +++ b/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.test.tsx @@ -0,0 +1,179 @@ +import { act, fireEvent, screen, waitFor } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { renderWithI18n as render } from "@/renderer/testUtils/i18n"; +import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; +import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; +import type { AgentStatus } from "@/shared/contracts"; +import type { CrossagentRoutingSnapshotEntry } from "@/shared/crossagentRanking"; +import { CrossagentRoutingSection } from "./CrossagentRoutingSection"; + +const mocks = vi.hoisted(() => ({ + getCrossagentRouting: vi.fn<() => Promise>(), + removeCrossagentRoutingOverride: + vi.fn< + (payload: { + tags: string[]; + }) => Promise["crossagentRoutingOverrides"]> + >(), +})); + +vi.mock("@/renderer/bridge", () => ({ + readBridge: () => ({ + appVersion: "desktop", + getCrossagentRouting: mocks.getCrossagentRouting, + removeCrossagentRoutingOverride: mocks.removeCrossagentRoutingOverride, + }), + isRemoteSession: () => false, +})); + +function makeStatus(kind: string, label: string, model: string): AgentStatus { + return { + kind, + label, + installed: true, + authState: "authenticated", + capabilities: { + models: [{ id: model, label: model.toUpperCase() }], + efforts: ["high", "max"], + defaultEffort: "high", + modelEfforts: {}, + modes: ["agent"], + approvalPolicies: [], + sandboxModes: [], + supportsResume: true, + supportsDirectInput: true, + liveInputMode: "terminal", + presentationMode: "terminal", + presentationModes: ["terminal", "gui"], + settingDefs: [], + }, + } as AgentStatus; +} + +describe("CrossagentRoutingSection", () => { + beforeEach(() => { + mocks.removeCrossagentRoutingOverride.mockResolvedValue([]); + mocks.getCrossagentRouting.mockImplementation(async () => + useSharedSettings.getState().disabledAgents.includes("kimi") + ? [ + { + provider: "claude", + label: "Claude Code", + execution: "structured", + rank: 1, + source: "favorite", + usageCount: 0, + model: { id: "sonnet", label: "SONNET" }, + reasoning: "high", + fast: false, + learnedTags: [{ tag: "frontend", count: 3 }], + }, + ] + : [ + { + provider: "kimi", + label: "Kimi Code", + execution: "one-shot", + rank: 1, + source: "crossagent-usage", + usageCount: 4, + model: { id: "k3", label: "K3" }, + reasoning: "max", + fast: false, + learnedTags: [ + { tag: "mobile", count: 4 }, + { tag: "simulator", count: 4 }, + ], + }, + { + provider: "claude", + label: "Claude Code", + execution: "structured", + rank: 2, + source: "favorite", + usageCount: 0, + model: { id: "sonnet", label: "SONNET" }, + reasoning: "high", + fast: false, + learnedTags: [{ tag: "frontend", count: 3 }], + }, + ], + ); + useAgentStatusesStore.setState({ + agentStatuses: [ + makeStatus("claude", "Claude Code", "sonnet"), + makeStatus("kimi", "Kimi Code", "k3"), + ], + }); + useSharedSettings.setState({ + crossagentRoutingGuide: "", + disabledAgents: [], + hiddenModels: {}, + favoriteModels: [{ agentKind: "claude", modelId: "sonnet", presentationMode: "gui" }], + agentSelectionUsage: [], + crossagentSelectionUsage: [ + { + agentKind: "kimi", + modelId: "k3", + effort: "max", + fast: false, + count: 4, + lastUsedAt: 10, + }, + ], + crossagentRoutingOverrides: [ + { + tags: ["frontend", "design"], + agentKind: "claude", + modelId: "sonnet", + effort: "high", + fast: true, + updatedAt: 11, + }, + ], + }); + }); + + it("shows the supervisor's active learned order and refreshes it when availability changes", async () => { + render(); + + expect(await screen.findByText("Kimi Code")).toBeInTheDocument(); + expect(screen.getByText("Crossagents usage")).toBeInTheDocument(); + expect(screen.getByText("4 uses")).toBeInTheDocument(); + expect(screen.getByText("#mobile (4) · #simulator (4)")).toBeInTheDocument(); + expect(screen.getByText("#frontend + #design")).toBeInTheDocument(); + expect(screen.getByText("claude · sonnet · High · Fast")).toBeInTheDocument(); + expect(screen.getAllByText("#1")).toHaveLength(1); + + act(() => useSharedSettings.setState({ disabledAgents: ["kimi"] })); + + await waitFor(() => expect(screen.queryByText("Kimi Code")).not.toBeInTheDocument()); + expect(screen.getByText("Claude Code")).toBeInTheDocument(); + expect(screen.getByText("Favorite")).toBeInTheDocument(); + expect(screen.getAllByText("#1")).toHaveLength(1); + }); + + it("shows unavailable pinned routes and removes them from Settings", async () => { + useSharedSettings.setState({ + crossagentRoutingOverrides: [ + { + tags: ["review"], + agentKind: "removed-provider", + modelId: "gone", + updatedAt: 20, + }, + ], + }); + render(); + + expect(await screen.findByText("#review")).toBeInTheDocument(); + expect(screen.getByText("removed-provider · gone · Unavailable provider")).toBeInTheDocument(); + + fireEvent.click(screen.getByRole("button", { name: "Remove pinned route for #review" })); + + await waitFor(() => + expect(mocks.removeCrossagentRoutingOverride).toHaveBeenCalledWith({ tags: ["review"] }), + ); + expect(useSharedSettings.getState().crossagentRoutingOverrides).toEqual([]); + }); +}); diff --git a/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx b/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx index a46d83fd2..065d2219f 100644 --- a/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx +++ b/src/renderer/views/SettingsOverlay/parts/CrossagentRoutingSection.tsx @@ -1,7 +1,13 @@ -import { useState } from "react"; -import { Trans, useLingui } from "@lingui/react/macro"; -import { TextArea } from "@/renderer/components/common"; +import { useEffect, useState } from "react"; +import { Plural, Trans, useLingui } from "@lingui/react/macro"; +import { toast } from "@heroui/react"; +import { Trash2 } from "lucide-react"; +import { isRemoteSession, readBridge } from "@/renderer/bridge"; +import { Button, TextArea } from "@/renderer/components/common"; +import { useAgentStatusesStore } from "@/renderer/state/agentStatusesStore"; import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; +import type { CrossagentRoutingSnapshotEntry } from "@/shared/crossagentRanking"; +import { formatReasoningLabel } from "@/shared/modelLabels"; /** * Free-text routing guidance for cross-provider subagents. The text is appended @@ -13,26 +19,196 @@ import { useSharedSettings } from "@/renderer/state/sharedSettingsStore"; export function CrossagentRoutingSection() { const { t } = useLingui(); const crossagentRoutingGuide = useSharedSettings((s) => s.crossagentRoutingGuide); + const crossagentSelectionUsage = useSharedSettings((s) => s.crossagentSelectionUsage); + const crossagentRoutingOverrides = useSharedSettings((s) => s.crossagentRoutingOverrides); + const agentSelectionUsage = useSharedSettings((s) => s.agentSelectionUsage); + const favoriteModels = useSharedSettings((s) => s.favoriteModels); + const disabledAgents = useSharedSettings((s) => s.disabledAgents); + const hiddenModels = useSharedSettings((s) => s.hiddenModels); + const statuses = useAgentStatusesStore((s) => s.agentStatuses); const setCrossagentRoutingGuide = useSharedSettings((s) => s.setCrossagentRoutingGuide); const [draft, setDraft] = useState(crossagentRoutingGuide); + const [ranked, setRanked] = useState([]); + const [removingRoute, setRemovingRoute] = useState(null); + const preferenceSourceLabels = { + "manual-override": t`Manual override`, + "tag-affinity": t`Task match`, + "crossagent-usage": t`Crossagents usage`, + favorite: t`Favorite`, + "agent-usage": t`Agent usage`, + "built-in": t`Built-in order`, + } as const; + useEffect(() => { + let active = true; + void readBridge() + .getCrossagentRouting() + .then((entries) => { + if (active) setRanked(entries); + }) + .catch(() => {}); + return () => { + active = false; + }; + }, [ + statuses, + disabledAgents, + hiddenModels, + crossagentSelectionUsage, + crossagentRoutingOverrides, + agentSelectionUsage, + favoriteModels, + ]); + + async function removePinnedRoute(tags: string[]) { + const key = tags.join("\u0000"); + setRemovingRoute(key); + try { + const nextOverrides = await readBridge().removeCrossagentRoutingOverride({ + tags, + }); + useSharedSettings.setState({ crossagentRoutingOverrides: nextOverrides }); + } catch { + toast.danger(t`Unable to remove pinned route.`); + } finally { + setRemovingRoute(null); + } + } return ( -
-

- Crossagent routing guide -

-

- Instructions agents follow when choosing which agent or model to delegate to. -

-