From ce2072b205d7aa591341c1ae2c4d3215dd8fa084 Mon Sep 17 00:00:00 2001 From: Aqil Aziz Date: Fri, 22 May 2026 07:24:13 +0700 Subject: [PATCH] fix(cloud): accept 405 as reachable RPC probe --- .../BootCheckGate/BootCheckGate.tsx | 5 +++++ .../__tests__/BootCheckGate.test.tsx | 18 +++++++++++++++ app/src/lib/i18n/chunks/de-3.ts | 2 ++ app/src/lib/i18n/chunks/de-5.ts | 22 +++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/app/src/components/BootCheckGate/BootCheckGate.tsx b/app/src/components/BootCheckGate/BootCheckGate.tsx index e531b6919a..2d742e2af2 100644 --- a/app/src/components/BootCheckGate/BootCheckGate.tsx +++ b/app/src/components/BootCheckGate/BootCheckGate.tsx @@ -173,6 +173,11 @@ function ModePicker({ onConfirm }: PickerProps) { setTestStatus({ kind: 'auth' }); return; } + if (response.status === 405) { + log('[boot-check] picker — test reached /rpc but method was rejected'); + setTestStatus({ kind: 'ok' }); + return; + } if (!response.ok) { log('[boot-check] picker — test failed: HTTP %d', response.status); setTestStatus({ kind: 'unreachable', reason: `HTTP ${response.status} from /rpc` }); diff --git a/app/src/components/BootCheckGate/__tests__/BootCheckGate.test.tsx b/app/src/components/BootCheckGate/__tests__/BootCheckGate.test.tsx index cb754fa336..1b15191361 100644 --- a/app/src/components/BootCheckGate/__tests__/BootCheckGate.test.tsx +++ b/app/src/components/BootCheckGate/__tests__/BootCheckGate.test.tsx @@ -274,6 +274,24 @@ describe('BootCheckGate — picker test connection', () => { ); }); + it('shows Connected when /rpc returns 405 Method Not Allowed', async () => { + mockTestCoreRpcConnection.mockResolvedValue({ + ok: false, + status: 405, + statusText: 'Method Not Allowed', + text: async () => 'Method Not Allowed', + } as unknown as Response); + + renderGate(); + fillCloudInputs('https://example.trycloudflare.com/rpc', 'tok-abc'); + fireEvent.click(screen.getByRole('button', { name: 'Test Connection' })); + + await waitFor(() => { + expect(screen.getByTestId('test-status-ok')).toBeInTheDocument(); + }); + expect(screen.queryByTestId('test-status-unreachable')).not.toBeInTheDocument(); + }); + it('shows Auth failed on a 401 response', async () => { mockTestCoreRpcConnection.mockResolvedValue({ ok: false, diff --git a/app/src/lib/i18n/chunks/de-3.ts b/app/src/lib/i18n/chunks/de-3.ts index 8cbb4e8ae7..e1b209a9b5 100644 --- a/app/src/lib/i18n/chunks/de-3.ts +++ b/app/src/lib/i18n/chunks/de-3.ts @@ -104,6 +104,8 @@ const de3: TranslationMap = { 'subconscious.failed': 'gescheitert', 'subconscious.tickInterval': 'Tick-Intervall', 'subconscious.runNow': 'Jetzt ausführen', + 'subconscious.providerUnavailableTitle': 'Subconscious ist pausiert', + 'subconscious.providerSettings': 'KI-Einstellungen', 'subconscious.approvalNeeded': 'Genehmigung erforderlich', 'subconscious.requiresApproval': 'Erfordert eine Genehmigung', 'subconscious.fixInConnections': 'Fix in Verbindungen', diff --git a/app/src/lib/i18n/chunks/de-5.ts b/app/src/lib/i18n/chunks/de-5.ts index c698c292fd..8ec284678d 100644 --- a/app/src/lib/i18n/chunks/de-5.ts +++ b/app/src/lib/i18n/chunks/de-5.ts @@ -501,6 +501,28 @@ const de5: TranslationMap = { 'settings.mascot.colorYellow': 'Gelb', 'settings.mascot.libraryUnavailable': 'OpenHuman Bibliothek nicht verfügbar', 'settings.mascot.title': 'OpenHuman', + 'settings.developerMenu.mcpServer.title': 'MCP-Server', + 'settings.developerMenu.mcpServer.desc': + 'Konfiguriere externe MCP-Clients für die Verbindung mit OpenHuman', + 'settings.mcpServer.title': 'MCP-Server', + 'settings.mcpServer.toolsSectionTitle': 'Verfügbare Tools', + 'settings.mcpServer.toolsSectionDesc': + 'Tools, die über den MCP-stdio-Server verfügbar sind, wenn openhuman-core mcp ausgeführt wird', + 'settings.mcpServer.configSectionTitle': 'Client-Konfiguration', + 'settings.mcpServer.configSectionDesc': + 'Wähle deinen MCP-Client aus, um den passenden Konfigurationsausschnitt zu erzeugen', + 'settings.mcpServer.copySnippet': 'In Zwischenablage kopieren', + 'settings.mcpServer.copied': 'Kopiert!', + 'settings.mcpServer.openConfigFile': 'Konfigurationsdatei öffnen', + 'settings.mcpServer.binaryPathNotFound': + 'OpenHuman-Binärdatei nicht gefunden. Wenn du aus dem Quellcode arbeitest, baue sie mit: cargo build --bin openhuman-core', + 'settings.mcpServer.openConfigError': 'Konfigurationsdatei konnte nicht geöffnet werden', + 'settings.mcpServer.clientClaudeDesktop': 'Claude Desktop', + 'settings.mcpServer.clientCursor': 'Cursor', + 'settings.mcpServer.clientCodex': 'Codex', + 'settings.mcpServer.clientZed': 'Zed', + 'settings.mcpServer.configFilePath': 'Konfigurationsdatei', + 'settings.mcpServer.clientSelectorAriaLabel': 'MCP-Client-Auswahl', }; export default de5;