Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
"@lingui/react": "6.4.0",
"@modelcontextprotocol/sdk": "^1.29.0",
"@monaco-editor/react": "^4.7.0",
"@opencode-ai/sdk": "^1.17.13",
"@opencode-ai/sdk": "^1.18.3",
"@poracode/activity-bridge": "file:native/activity-bridge",
"@poracode/agents-usage": "workspace:*",
"@poracode/ssh-bridge": "file:native/ssh-bridge",
Expand Down
10 changes: 5 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ publicHoistPattern:
nodeLinker: hoisted

minimumReleaseAgeExclude:
# OpenCode v2 runtime-pooling integration requires the current official SDK.
- "@opencode-ai/sdk@1.18.3"
# LegendList 3.3.3 contains the web anchoring and batched measurement fixes
# required by the chat transcript virtualizer migration.
- "@legendapp/list@3.3.3"
Expand Down
13 changes: 13 additions & 0 deletions src/renderer/components/composer/composerMcpServers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,19 @@ export function resolveMcpScope(
return scopes?.terminal ?? "none";
}

/**
* Providers that declare `mcpConfigSource: "agentSettings"` configure MCP on
* their settings page instead of the composer: the "+" menu shows no MCP rows
* at all for their threads (built-ins are hidden by their `"none"` scopes;
* callers use this to suppress the custom-server rows and read-only fallbacks
* too).
*/
export function providerOwnsMcpConfig(
capabilities: Pick<AgentCapability, "mcpConfigSource">,
): boolean {
return capabilities.mcpConfigSource === "agentSettings";
}

export interface ComposerMcpServerDescriptor {
id: "browser" | "crossagents" | "chrome";
configKey: ComposerMcpConfigKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ describe("chatPaneSelectors", () => {
"agent-running": {
...items["agent-running"],
state: "completed",
payload: { ...items["agent-running"].payload, status: "success" },
payload: { ...items["agent-running"].payload },
},
},
},
Expand Down
29 changes: 20 additions & 9 deletions src/renderer/components/thread/ThreadComposerSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ import { modelVisibilityKey } from "@/renderer/components/common/ProviderModelMe
import { AttachmentBar } from "../composer/AttachmentBar";
import { ComposerAddMenu } from "../composer/ComposerAddMenu";
import { ComposerVoiceInput } from "../composer/ComposerVoiceInput";
import { composerMcpServers, COMPUTER_USE_MCP_ID } from "../composer/composerMcpServers";
import {
composerMcpServers,
COMPUTER_USE_MCP_ID,
providerOwnsMcpConfig,
} from "../composer/composerMcpServers";
import { openAttachmentLightbox } from "../composer/ImageLightbox";
import { openPdfPreview } from "../pdf/openPdfPreview";
import {
Expand Down Expand Up @@ -186,20 +190,27 @@ function ThreadComposerSectionInner(props: ThreadComposerSectionProps & { thread
// and Computer Use. Users change servers in the draft composer or settings
// before launching a new thread.
// Bindings are display-only for an active session; toggles are no-ops.
// Providers with `mcpConfigSource: "agentSettings"` configure MCP on their
// settings page instead of per-thread, so their composer carries no MCP
// display at all — no built-in rows, no custom servers, and no read-only
// "none for this run" fallback.
const providerOwnsMcp = agentStatus ? providerOwnsMcpConfig(agentStatus.capabilities) : false;
const mcpServers = composerMcpServers.map((descriptor) => ({
descriptor,
enabled: thread.config[descriptor.configKey] === true,
visible: thread.config[descriptor.configKey] === true,
visible: !providerOwnsMcp && thread.config[descriptor.configKey] === true,
onToggle: () => {},
}));
const launchCustomMcpNames = useAppStore(
(s) => s.mcpLaunchCustomServerNamesByThreadId[thread.id],
);
const customMcpServers = (launchCustomMcpNames ?? []).map((name) => ({
id: name,
name,
enabled: true,
}));
const customMcpServers = providerOwnsMcp
? []
: (launchCustomMcpNames ?? []).map((name) => ({
id: name,
name,
enabled: true,
}));
const mcpMentions: McpMentionItem[] = [
...composerMcpServers
.filter((descriptor) => thread.config[descriptor.configKey] === true)
Expand Down Expand Up @@ -775,10 +786,10 @@ function ThreadComposerSectionInner(props: ThreadComposerSectionProps & { thread
<ComposerAddMenu
mcpServers={mcpServers}
customMcpServers={customMcpServers}
readOnly
readOnly={!providerOwnsMcp}
computerUse={{
enabled: thread.config.computerUse === true,
visible: thread.config.computerUse === true,
visible: !providerOwnsMcp && thread.config.computerUse === true,
onToggle: () => {},
}}
showFileOption={!isRemote}
Expand Down
13 changes: 8 additions & 5 deletions src/renderer/components/thread/ThreadDraftComposerArea.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
composerMcpServers,
COMPUTER_USE_MCP_ID,
mcpTogglePatch,
providerOwnsMcpConfig,
} from "@/renderer/components/composer/composerMcpServers";
import { openAttachmentLightbox } from "@/renderer/components/composer/ImageLightbox";
import { openPdfPreview } from "@/renderer/components/pdf/openPdfPreview";
Expand Down Expand Up @@ -386,13 +387,15 @@ export function ThreadDraftComposerArea(props: {
// the MCP Servers settings page — because custom servers bind at launch from
// settings, not from per-thread config. The launch-time merge helper decides
// which workspace entries override global ones, so the menu can't drift from
// what actually launches.
// what actually launches. Providers whose MCP set lives on their settings
// page show no rows here at all.
const hideCustomMcpRows = providerOwnsMcpConfig(props.selectedAgent.capabilities);
const projectCustomMcpServers = props.project.mcpServers ?? [];
const projectCustomMcpIds = new Set(projectCustomMcpServers.map((server) => server.id));
const customMcpServers: ComposerCustomMcpItem[] = mergeMcpServers(
userCustomMcpServers,
projectCustomMcpServers,
).map((server) => {
const mergedCustomMcpServers = hideCustomMcpRows
? []
: mergeMcpServers(userCustomMcpServers, projectCustomMcpServers);
const customMcpServers: ComposerCustomMcpItem[] = mergedCustomMcpServers.map((server) => {
const isProject = projectCustomMcpIds.has(server.id);
const scopedServers = isProject ? projectCustomMcpServers : userCustomMcpServers;
return {
Expand Down
34 changes: 34 additions & 0 deletions src/renderer/locales/de/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -1469,6 +1469,7 @@ msgstr "Durchsuchen Sie Ihre GitHub-Repositorys oder fügen Sie eine Klon-URL ei
#: src/renderer/views/MainView/parts/RightPanel/parts/BrowserPanel/BrowserPanel.tsx
#: src/renderer/views/MainView/parts/SidebarHeaderControls.tsx
#: src/renderer/views/SettingsOverlay/parts/BrowserSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/SettingsSidebar.tsx
msgid "Browser"
msgstr "Browser"
Expand Down Expand Up @@ -1840,6 +1841,7 @@ msgstr "Worktree-Basisordner auswählen"

#: src/renderer/components/composer/composerMcpServers.ts
#: src/renderer/components/mcp/McpServersManager.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Chrome"
msgstr "Chrome"

Expand Down Expand Up @@ -2357,6 +2359,7 @@ msgstr "Composer-Steuerung"
#: src/renderer/components/mcp/McpServersManager.tsx
#: src/renderer/components/thread/ThreadComposerSection.tsx
#: src/renderer/components/thread/ThreadDraftComposerArea.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Computer Use"
msgstr "Computernutzung"

Expand Down Expand Up @@ -2547,6 +2550,14 @@ msgstr "In einem anderen Anbieter fortfahren"
msgid "Continue in..."
msgstr "Weiter in..."

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Control an external Chrome browser."
msgstr "Steuert einen externen Chrome-Browser."

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Control the desktop."
msgstr "Steuert den Desktop."

#: src/renderer/views/SettingsOverlay/parts/SearchSettings.tsx
msgid "Control which files appear in the @file mention search. Per-project overrides live in each project's settings."
msgstr "Steuern Sie, welche Dateien in der @file-Erwähnungssuche angezeigt werden. Projektspezifische Überschreibungen sind in den Einstellungen jedes Projekts verfügbar."
Expand Down Expand Up @@ -2910,6 +2921,7 @@ msgstr "Crossagent: {subagent}"
#: src/renderer/components/mcp/McpServersManager.tsx
#: src/renderer/components/thread/ChatPane/parts/items/ActiveSubAgentTile.tsx
#: src/renderer/views/SettingsOverlay/parts/McpServersSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Crossagents"
msgstr "Crossagents"

Expand Down Expand Up @@ -3031,6 +3043,10 @@ msgstr "Standardberechtigungen"
msgid "Default thread removal"
msgstr "Standardmäßiges Entfernen von Threads"

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Delegate work to other AI agents."
msgstr "Delegieren Sie Aufgaben an andere KI-Agenten."

#. Thread remove action: delete permanently
#: src/mobile/views/FilesView.tsx
#: src/renderer/components/common/BranchSelector/BranchSelector.tsx
Expand Down Expand Up @@ -5370,6 +5386,7 @@ msgid "MCP server URL"
msgstr "MCP-Server-URL"

#: src/renderer/components/composer/ComposerAddMenu.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/ProfileSettings.tsx
msgid "MCP servers"
msgstr "MCP-Server"
Expand All @@ -5382,6 +5399,10 @@ msgstr "MCP-Server"
msgid "MCP Servers"
msgstr "MCP-Server"

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "MCP servers updated."
msgstr "MCP-Server aktualisiert."

#: src/renderer/views/ProfileOverlay/parts/ActivityInsights.tsx
msgid "MCP tool calls"
msgstr "MCP-Toolaufrufe"
Expand Down Expand Up @@ -7052,6 +7073,10 @@ msgstr "Poracode installiert seinen Server auf dem SSH-Host oder verwendet ihn e
msgid "Poracode will restart, back up its current data, and replace it with a complete copy of your Lightcode data."
msgstr "Poracode wird neu gestartet, sichert seine aktuellen Daten und ersetzt sie durch eine vollständige Kopie Ihrer Lightcode-Daten."

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Poracode's built-in browser tools."
msgstr "Die integrierten Browser-Tools von Poracode."

#: src/mobile/views/DesktopsView.tsx
#: src/mobile/views/PortsView.tsx
msgid "Port"
Expand Down Expand Up @@ -8186,6 +8211,7 @@ msgstr "Laufzeitoptionen"
#: src/renderer/views/FileEditorOverlay/parts/FileEditorPane/parts/EditorToolbar.tsx
#: src/renderer/views/ProfileOverlay/parts/EditProfileDialog.tsx
#: src/renderer/views/SettingsOverlay/parts/ClaudeProfileSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/SingleAgentSettings.tsx
msgid "Save"
msgstr "Speichern"
Expand All @@ -8207,6 +8233,10 @@ msgstr "Claude-Profil speichern"
msgid "Save File"
msgstr "Datei speichern"

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "Save MCP servers"
msgstr "MCP-Server speichern"

#: src/renderer/views/SettingsOverlay/parts/ShortcutsSettings.tsx
msgid "Save shortcut"
msgstr "Tastenkürzel speichern"
Expand Down Expand Up @@ -9694,6 +9724,10 @@ msgstr "Theme"
msgid "Theme and chat font size"
msgstr "Theme und Chat-Schriftgröße"

#: src/renderer/views/SettingsOverlay/parts/OpenCodeProviderSettings.tsx
msgid "These built-in MCP servers are shared by OpenCode threads. Saving updates running GUI projects; removing a server can interrupt an active turn. Terminal threads pick up changes on their next launch."
msgstr "Diese integrierten MCP-Server werden von OpenCode-Threads gemeinsam genutzt. Beim Speichern werden laufende GUI-Projekte aktualisiert; das Entfernen eines Servers kann einen aktiven Durchlauf unterbrechen. Terminal-Threads übernehmen Änderungen beim nächsten Start."

#: src/renderer/components/common/EffortContextMenu/EffortContextMenu.tsx
#: src/renderer/components/thread/ChatPane/parts/items/Reasoning.tsx
#: src/renderer/components/thread/ChatPane/parts/items/ReasoningInline.tsx
Expand Down
Loading