From 45d4823238362f98dd75374c8277c131410b5fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Fri, 21 Aug 2026 01:20:38 +0000 Subject: [PATCH] browser pairing and its extension zip leave the platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The last two pieces the extraction missed. IntegrationsSettings/BrowserRelay.tsx drove the plugin's pairing from a platform screen, calling /browser/relay-token and working only because the plugin happens to serve that path — the same coupling removed everywhere else this morning. public/browser-relay-extension.zip was a hand-built snapshot that had drifted 58 lines behind the extension it claimed to be: built in August from something predating a February commit, never rebuilt, and missing the multi-session recovery path. The plugin builds the archive from its own directory per request now, so there is nothing left to fall behind. Co-Authored-By: Claude Opus 5 --- public/browser-relay-extension.zip | Bin 13858 -> 0 bytes .../IntegrationsSettings/BrowserRelay.tsx | 199 ------------------ .../Settings/IntegrationsSettings/index.tsx | 8 - 3 files changed, 207 deletions(-) delete mode 100644 public/browser-relay-extension.zip delete mode 100644 src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/BrowserRelay.tsx diff --git a/public/browser-relay-extension.zip b/public/browser-relay-extension.zip deleted file mode 100644 index ae3af8e36f00014a310f67721e866f4f7b54c122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13858 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 BG$sH5 diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/BrowserRelay.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/BrowserRelay.tsx deleted file mode 100644 index 86dd223e..00000000 --- a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/BrowserRelay.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import { useState } from 'react'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { Copy, Check, Download, ExternalLink, RefreshCw, Trash2 } from 'lucide-react'; -import { toast } from 'sonner'; -import { Button } from '@/components/ui/button'; -import { useClient } from 'hooks/useClient'; -import { copyToClipboard } from 'helpers/clipboard'; - -type RelayToken = { - token: string; - port: number; -}; - -export const BrowserRelay = () => { - const client = useClient(); - const queryClient = useQueryClient(); - const [copiedField, setCopiedField] = useState(null); - - const { data: status } = useQuery({ - queryKey: ['browser-status'], - queryFn: () => client.get<{ extensionConnected: boolean; targetCount: number }>('/browser/status'), - refetchInterval: 5000, - }); - - const { data: tokenData } = useQuery({ - queryKey: ['browser-relay-token'], - queryFn: () => client.get('/browser/relay-token'), - }); - - const regenerate = useMutation({ - mutationFn: () => client.post('/browser/relay-token/regenerate'), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['browser-relay-token'] }); - toast.success('Token regenerated — update the extension with the new token'); - }, - onError: () => toast.error('Failed to regenerate token'), - }); - - const revoke = useMutation({ - mutationFn: () => client.delete('/browser/relay-token'), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['browser-relay-token'] }); - toast.success('Token revoked'); - }, - onError: () => toast.error('Failed to revoke token'), - }); - - const handleCopy = async (value: string, field: string) => { - try { - await copyToClipboard(value); - setCopiedField(field); - toast.success('Copied to clipboard'); - setTimeout(() => setCopiedField(null), 2000); - } catch { - toast.error('Failed to copy'); - } - }; - - const isConnected = status?.extensionConnected ?? false; - const serverAddress = window.location.hostname; - - return ( -
- {isConnected ? ( -
-
-
-

Connected

-

- {status?.targetCount ?? 0} tab{(status?.targetCount ?? 0) !== 1 ? 's' : ''} attached - {' — '} - - view tabs - -

-
-
- ) : ( -

- Connect your Chrome browser to Officer so AI agents can view and interact with your tabs. -

- )} - - {/* Step 1: Install */} -
-

1. Install the extension

-

- Download and unzip the extension, then load it in Chrome: -

- - - Download Extension - -
    -
  1. - Open{' '} - - chrome://extensions - {' '} - in Chrome -
  2. -
  3. - Enable Developer mode (top-right toggle) -
  4. -
  5. - Click Load unpacked and select the unzipped folder -
  6. -
-
- - {/* Step 2: Configure */} - {tokenData && ( -
-

2. Configure the extension

-

- Open the extension options (right-click icon → Options) and enter these values: -

- -
- handleCopy(serverAddress, 'host')} - /> - handleCopy(String(tokenData.port), 'port')} - /> - handleCopy(tokenData.token, 'token')} - /> -
- -
- - -
-
- )} - - {/* Step 3: Attach */} -
-

3. Attach a tab

-

- Navigate to any webpage and click the Officer extension icon in the toolbar. A cyan ON badge - means the tab is connected. Then go to{' '} - - /browser - {' '} - to view your tabs. -

-
-
- ); -}; - -type CredentialRowProps = { - label: string; - value: string; - masked?: boolean; - copied: boolean; - onCopy: () => void; -}; - -const CredentialRow = ({ label, value, masked, copied, onCopy }: CredentialRowProps) => ( -
- {label} - {masked ? `${value.slice(0, 8)}${'•'.repeat(16)}` : value} - -
-); diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/index.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/index.tsx index bdd39670..cc763eae 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/index.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/index.tsx @@ -8,7 +8,6 @@ import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { SettingsRoute, SettingsSidebar, SettingsContent, type SettingsSection } from '../SettingsPanel'; import { GoogleOAuthConfig } from './GoogleOAuthConfig'; // import { GoogleAccount } from './GoogleAccount'; // hidden — email uses IMAP app password now -import { BrowserRelay } from './BrowserRelay'; import { ApifyConfig } from './ApifyConfig'; import { DavAppPasswords } from './DavAppPasswords'; @@ -50,13 +49,6 @@ const personalSections: SettingsSection[] = [ description: 'Per-device passwords for CalDAV/CardDAV clients', content: , }, - { - key: 'browser-relay', - icon: Globe, - title: 'Browser Relay', - description: 'Connect your Chrome browser', - content: , - }, ]; // The Enterprise/Personal tab is not a second thing to remember — it is a fact about which section is