diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63155951e80..b2adea32bc6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,6 +93,11 @@ jobs: steps: - name: Check out code uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + # The i18n audit compares this branch against its merge base to catch + # translations left behind by an English edit; a shallow clone has no + # merge base to find. + fetch-depth: 0 - name: Setup Bun id: setup-bun @@ -115,6 +120,8 @@ jobs: # Message catalogs must match source (extract) and compile with no # missing translations (--strict); a dirty diff means someone forgot # to run `bun run --cwd packages/i18n check` after changing strings. + # The audit also fails on translations left stranded by an English edit, + # which --strict cannot see because nothing is missing. - name: Audit i18n catalogs run: bun run --cwd packages/i18n check diff --git a/AGENTS.md b/AGENTS.md index 6423300d0c2..d963fb74b23 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -135,8 +135,13 @@ and are never translated — someone stuck in the wrong language has to recogniz Relative times use `formatRelativeTime`/`formatCompactRelativeTime`, not hand-rolled "3d ago" helpers; `Intl` already knows every locale's wording. -Two traps worth knowing before you touch catalogs: +Three traps worth knowing before you touch catalogs: +- **Editing English copy is not enough.** IDs are stable, so Lingui keeps the text loosely + coupled to them: `locales/en/messages.po` is what actually renders, and translations are + never invalidated when the English moves. `extract` runs `--overwrite` so the source locale + is always regenerated, and the `check` script fails on translations the edit stranded. + Details and the exemption file: `packages/i18n/README.md`. - **Regenerate from a clean tree.** `messages.po` is environment-sensitive. Entry order and `#:` reference order both used to vary between macOS and Linux; `orderBy: "messageId"` and `scripts/sort-po-references.ts` pin them, but a catalog regenerated on top of local diff --git a/apps/desktop/src/renderer/commandPalette/modules/settings/commands.ts b/apps/desktop/src/renderer/commandPalette/modules/settings/commands.ts index 658f02b7b80..efa6ab15960 100644 --- a/apps/desktop/src/renderer/commandPalette/modules/settings/commands.ts +++ b/apps/desktop/src/renderer/commandPalette/modules/settings/commands.ts @@ -187,7 +187,7 @@ const TABS: SettingsTab[] = [ id: "security", title: msg({ id: "commandPalette.settingsTab.security", - message: "Remote Workspaces", + message: "Remote Access", }), path: "/settings/security", icon: KeyRoundIcon, diff --git a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/FeaturePreview.tsx b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/FeaturePreview.tsx index a37c0d47e10..d0291af8c5f 100644 --- a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/FeaturePreview.tsx +++ b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/FeaturePreview.tsx @@ -6,7 +6,7 @@ import type { ProFeature } from "../../constants"; import { PRO_FEATURES } from "../../constants"; import { DitheredBackground } from "./components/DitheredBackground"; import { MobileAppDemo } from "./components/MobileAppDemo"; -import { RemoteWorkspacesDemo } from "./components/RemoteWorkspacesDemo"; +import { RemoteAccessDemo } from "./components/RemoteAccessDemo"; import { SlackIntegrationDemo } from "./components/SlackIntegrationDemo"; import { TasksDemo } from "./components/TasksDemo"; import { TeamCollaborationDemo } from "./components/TeamCollaborationDemo"; @@ -15,7 +15,7 @@ const DEMO_COMPONENTS: Record = { "team-collaboration": TeamCollaborationDemo, tasks: TasksDemo, "slack-integration": SlackIntegrationDemo, - "remote-workspaces": RemoteWorkspacesDemo, + "remote-access": RemoteAccessDemo, "mobile-app": MobileAppDemo, }; diff --git a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/RemoteWorkspacesDemo.tsx b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/RemoteAccessDemo.tsx similarity index 80% rename from apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/RemoteWorkspacesDemo.tsx rename to apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/RemoteAccessDemo.tsx index 108b64bc221..b85c13f7042 100644 --- a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/RemoteWorkspacesDemo.tsx +++ b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/RemoteAccessDemo.tsx @@ -1,7 +1,7 @@ import { Trans } from "@lingui/react/macro"; import { HiOutlineComputerDesktop, HiOutlineSignal } from "react-icons/hi2"; -export function RemoteWorkspacesDemo() { +export function RemoteAccessDemo() { return (
@@ -13,8 +13,8 @@ export function RemoteWorkspacesDemo() {
- - Remote Workspaces + + Remote Access
@@ -27,9 +27,7 @@ export function RemoteWorkspacesDemo() {
- - This Mac - + This Mac
@@ -42,9 +40,7 @@ export function RemoteWorkspacesDemo() {
- - Remote - + Remote @@ -52,22 +48,20 @@ export function RemoteWorkspacesDemo() {
- + Tunnel established - live + live
- - Latency - + Latency - + 42ms diff --git a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/index.ts b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/index.ts new file mode 100644 index 00000000000..1206a598286 --- /dev/null +++ b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteAccessDemo/index.ts @@ -0,0 +1 @@ +export { RemoteAccessDemo } from "./RemoteAccessDemo"; diff --git a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/index.ts b/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/index.ts deleted file mode 100644 index 48c6b977109..00000000000 --- a/apps/desktop/src/renderer/components/Paywall/components/FeaturePreview/components/RemoteWorkspacesDemo/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RemoteWorkspacesDemo } from "./RemoteWorkspacesDemo"; diff --git a/apps/desktop/src/renderer/components/Paywall/constants.ts b/apps/desktop/src/renderer/components/Paywall/constants.ts index c97b522ca74..40d06f49e7f 100644 --- a/apps/desktop/src/renderer/components/Paywall/constants.ts +++ b/apps/desktop/src/renderer/components/Paywall/constants.ts @@ -12,7 +12,7 @@ import { export const GATED_FEATURES = { INVITE_MEMBERS: "invite-members", TASKS: "tasks", - REMOTE_WORKSPACES: "remote-workspaces", + REMOTE_ACCESS: "remote-access", MOBILE_APP: "mobile-app", } as const; @@ -30,13 +30,13 @@ export interface ProFeature { export const PRO_FEATURES: ProFeature[] = [ { - id: "remote-workspaces", + id: "remote-access", title: msg({ - id: "components.paywall.remoteWorkspaces.title", - message: "Remote Workspaces", + id: "components.paywall.remoteAccess.title", + message: "Remote Access", }), description: msg({ - id: "components.paywall.remoteWorkspaces.description", + id: "components.paywall.remoteAccess.description", message: "Reach this Mac from anywhere via the Superset relay, or spin up cloud workspaces. Connect from any client.", }), @@ -111,6 +111,6 @@ export const PRO_FEATURES: ProFeature[] = [ export const FEATURE_ID_MAP: Record = { [GATED_FEATURES.INVITE_MEMBERS]: "team-collaboration", [GATED_FEATURES.TASKS]: "tasks", - [GATED_FEATURES.REMOTE_WORKSPACES]: "remote-workspaces", + [GATED_FEATURES.REMOTE_ACCESS]: "remote-access", [GATED_FEATURES.MOBILE_APP]: "mobile-app", }; diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/components/HostOfflineRunDialog/HostOfflineRunDialog.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/components/HostOfflineRunDialog/HostOfflineRunDialog.tsx index b3497523369..c92c9a87d6e 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/components/HostOfflineRunDialog/HostOfflineRunDialog.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/components/HostOfflineRunDialog/HostOfflineRunDialog.tsx @@ -26,7 +26,7 @@ interface HostOfflineRunDialogProps { /** * Shown when "Run now" is skipped because the target host isn't connected to * the relay. For the local device it offers enabling relay access in place - * (same typed confirmation as Settings > Remote Workspaces). + * (same typed confirmation as Settings > Remote Access). */ export function HostOfflineRunDialog({ hostId, @@ -81,8 +81,8 @@ export function HostOfflineRunDialog({ })} {" "} isn't connected to the Superset relay. Make sure relay - access is on in Settings > Remote Workspaces on that - device, then run it again. + access is on in Settings > Remote Access on that device, + then run it again.

)} @@ -108,7 +108,7 @@ export function HostOfflineRunDialog({
diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/hooks/useEnableRelayAccess/useEnableRelayAccess.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/hooks/useEnableRelayAccess/useEnableRelayAccess.ts index d7cea298507..61de3e39232 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/hooks/useEnableRelayAccess/useEnableRelayAccess.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/hooks/useEnableRelayAccess/useEnableRelayAccess.ts @@ -3,7 +3,7 @@ import { i18n } from "@superset/i18n"; import { toast } from "@superset/ui/sonner"; import { electronTrpc } from "renderer/lib/electron-trpc"; -/** Enable relay access with the same mutation + feedback as Settings > Remote Workspaces. */ +/** Enable relay access with the same mutation + feedback as Settings > Remote Access. */ export function useEnableRelayAccess() { const utils = electronTrpc.useUtils(); const setExpose = diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/utils/hostOfflineError/hostOfflineError.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/utils/hostOfflineError/hostOfflineError.ts index 7b597fcf8a1..d61e2787d7c 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/utils/hostOfflineError/hostOfflineError.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/automations/utils/hostOfflineError/hostOfflineError.ts @@ -8,7 +8,7 @@ const HOST_OFFLINE_ERRORS = ["target host offline", "no host available"]; export const HOST_OFFLINE_HELP = msg({ id: "dashboard.automations.hostOfflineHelp", message: - "The host isn't connected to the Superset relay. If it's this device, turn on \"Allow remote workspaces to access this device via relay\" in Settings > Remote Workspaces, then try again.", + "The host isn't connected to the Superset relay. If it's this device, turn on \"Allow remote access to this device via relay\" in Settings > Remote Access, then try again.", }); export function isHostOfflineError(error: string | null | undefined): boolean { diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspaceContextMenu/V2WorkspaceContextMenu.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspaceContextMenu/V2WorkspaceContextMenu.tsx index 9ccc53d54e4..d4cc3e6f25c 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspaceContextMenu/V2WorkspaceContextMenu.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspaceContextMenu/V2WorkspaceContextMenu.tsx @@ -59,7 +59,7 @@ export function V2WorkspaceContextMenu({ go(); return; } - gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, go); + gateFeature(GATED_FEATURES.REMOTE_ACCESS, go); }, [gateFeature, navigate, workspace.hostType, workspace.id]); const addToSidebar = useCallback(() => { @@ -69,7 +69,7 @@ export function V2WorkspaceContextMenu({ add(); return; } - gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, add); + gateFeature(GATED_FEATURES.REMOTE_ACCESS, add); }, [ ensureWorkspaceInSidebar, gateFeature, diff --git a/apps/desktop/src/renderer/routes/_authenticated/components/ExposeViaRelayConfirmDialog/ExposeViaRelayConfirmDialog.tsx b/apps/desktop/src/renderer/routes/_authenticated/components/ExposeViaRelayConfirmDialog/ExposeViaRelayConfirmDialog.tsx index 910e5108d4f..0a564d09936 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/components/ExposeViaRelayConfirmDialog/ExposeViaRelayConfirmDialog.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/components/ExposeViaRelayConfirmDialog/ExposeViaRelayConfirmDialog.tsx @@ -51,13 +51,13 @@ export function ExposeViaRelayConfirmDialog({

{targetEnabled ? (

- Remote workspaces you grant access to will be able to reach - this device through Superset Relay. + Devices and workspaces you grant access to will be able to + reach this device through Superset Relay.

) : (

- Remote workspaces will no longer be able to reach this device - through Superset Relay. + Nothing else will be able to reach this device through + Superset Relay.

)}
diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/billing/plans/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/billing/plans/page.tsx index cd421c96ada..ae0663639e2 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/billing/plans/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/billing/plans/page.tsx @@ -216,8 +216,8 @@ const COMPARISON_SECTIONS: ComparisonSection[] = [ }, { label: msg({ - id: "settings.billing.plans.rowRemoteWorkspaces", - message: "Remote workspaces", + id: "settings.billing.plans.rowRemoteAccess", + message: "Remote access", }), values: [null, true, true], badge: { diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/components/ExposeViaRelaySection/ExposeViaRelaySection.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/components/ExposeViaRelaySection/ExposeViaRelaySection.tsx index 8f6067342ac..25a47659c22 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/components/ExposeViaRelaySection/ExposeViaRelaySection.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/components/ExposeViaRelaySection/ExposeViaRelaySection.tsx @@ -82,7 +82,7 @@ export function ExposeViaRelaySection() { const handleChange = (next: boolean) => { if (next) { - gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, () => openConfirm(true)); + gateFeature(GATED_FEATURES.REMOTE_ACCESS, () => openConfirm(true)); } else { openConfirm(false); } @@ -99,19 +99,17 @@ export function ExposeViaRelaySection() {

- When off, remote workspaces can't access the files and tools on - this device. You can still connect out to remote sandboxes from - here.{" "} + When off, nothing else can reach the files and tools on this + device. You can still connect out to remote sandboxes from here.{" "} , }, diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/hosts/$hostId/components/HostSettings/HostSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/hosts/$hostId/components/HostSettings/HostSettings.tsx index 371823c14dc..0b5d7ee1d23 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/hosts/$hostId/components/HostSettings/HostSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/hosts/$hostId/components/HostSettings/HostSettings.tsx @@ -186,8 +186,8 @@ export function HostSettings({ hostId }: HostSettingsProps) {

diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/security/components/SecuritySettings/SecuritySettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/security/components/SecuritySettings/SecuritySettings.tsx index 8a79ff465d8..afd93947d22 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/security/components/SecuritySettings/SecuritySettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/security/components/SecuritySettings/SecuritySettings.tsx @@ -20,11 +20,11 @@ export function SecuritySettings({ visibleItems }: SecuritySettingsProps) {

- Remote Workspaces + Remote Access

- Control how your local machine is reachable from remote workspaces + Control how your local machine is reachable from elsewhere

diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index cdf889a787c..917ed3c28cf 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -1669,14 +1669,18 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ { id: SETTING_ITEM_ID.SECURITY_EXPOSE_HOST_SERVICE_VIA_RELAY, section: "security", - title: "Allow remote workspaces to access this device via relay", + title: "Allow remote access to this device via relay", description: - "Controls whether remote workspaces can reach your local host service through the Superset relay", + "Controls whether other devices can reach your local host service through the Superset relay", keywords: [ "security", "relay", "remote", + "remote access", "workspace", + // The section was called Remote Workspaces until the rename; keep the + // old name searchable for anyone who still reaches for it. + "workspaces", "expose", "lockdown", "network", diff --git a/apps/docs/content/docs/remote-access.mdx b/apps/docs/content/docs/remote-access.mdx index 85d4068be27..3d3c10c9e68 100644 --- a/apps/docs/content/docs/remote-access.mdx +++ b/apps/docs/content/docs/remote-access.mdx @@ -18,9 +18,9 @@ Exposing your primary workstation through the relay means anything reachable by Use the desktop toggle when you genuinely need it on this machine. Otherwise prefer the CLI path on a dedicated host. -Open the desktop app and go to **Settings → Security**. Flip on **Allow remote workspaces to access this device via relay**. +Open the desktop app and go to **Settings → Remote Access**. Flip on **Allow remote access to this device via relay**. -![Settings → Security relay toggle](/images/remote-workspaces-security-toggle.png) +![Settings → Remote Access relay toggle](/images/remote-workspaces-security-toggle.png) Enabling the toggle restarts the host service, so any running terminals on this device will be interrupted. You'll be asked to type a confirmation phrase before the change applies. @@ -98,7 +98,7 @@ Forwarded traffic passes through the Superset relay, like terminal traffic does. ## Turning access off -- **Desktop**: flip the toggle in **Settings → Security** back off. The host service restarts and stops accepting relay traffic. +- **Desktop**: flip the toggle in **Settings → Remote Access** back off. The host service restarts and stops accepting relay traffic. - **CLI**: run `superset stop` on the host machine. In both cases, in-flight terminals and host-backed work on that machine are interrupted. diff --git a/apps/mobile/screens/(authenticated)/(home)/home-connect-host/HomeConnectHostScreen.tsx b/apps/mobile/screens/(authenticated)/(home)/home-connect-host/HomeConnectHostScreen.tsx index bb31ba9fca3..8c4fc593c91 100644 --- a/apps/mobile/screens/(authenticated)/(home)/home-connect-host/HomeConnectHostScreen.tsx +++ b/apps/mobile/screens/(authenticated)/(home)/home-connect-host/HomeConnectHostScreen.tsx @@ -15,7 +15,7 @@ import { useOrganizations } from "@/screens/(authenticated)/hooks/useOrganizatio import { OrganizationHeaderButton } from "../home/components/OrganizationHeaderButton"; import { SetupStep } from "./components/SetupStep"; -const SETUP_DOCS_URL = `${COMPANY.DOCS_URL}/remote-workspaces`; +const SETUP_DOCS_URL = `${COMPANY.DOCS_URL}/remote-access`; /** * Home for an organization with no device of yours in it. Every list on this @@ -119,8 +119,8 @@ export function HomeConnectHostScreen() { })} > - Settings → Security → “Allow remote workspaces to access this - device via relay”. + Settings → Remote Access → “Allow remote access to this device via + relay”. diff --git a/apps/mobile/screens/(authenticated)/settings/hosts/HostsSettingsScreen.tsx b/apps/mobile/screens/(authenticated)/settings/hosts/HostsSettingsScreen.tsx index e9bb3f4844f..b1534336dd4 100644 --- a/apps/mobile/screens/(authenticated)/settings/hosts/HostsSettingsScreen.tsx +++ b/apps/mobile/screens/(authenticated)/settings/hosts/HostsSettingsScreen.tsx @@ -48,13 +48,13 @@ export function HostsSettingsScreen() { style={{ color: theme.mutedForeground }} > - In the Superset desktop app, open Settings → Security and turn on - “Allow remote workspaces to access this device via relay”. + In the Superset desktop app, open Settings → Remote Access and + turn on “Allow remote access to this device via relay”.