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
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
7 changes: 6 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -15,7 +15,7 @@ const DEMO_COMPONENTS: Record<string, ComponentType> = {
"team-collaboration": TeamCollaborationDemo,
tasks: TasksDemo,
"slack-integration": SlackIntegrationDemo,
"remote-workspaces": RemoteWorkspacesDemo,
"remote-access": RemoteAccessDemo,
"mobile-app": MobileAppDemo,
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Trans } from "@lingui/react/macro";
import { HiOutlineComputerDesktop, HiOutlineSignal } from "react-icons/hi2";

export function RemoteWorkspacesDemo() {
export function RemoteAccessDemo() {
return (
<div className="w-full h-full flex items-center justify-center">
<div className="w-[300px] bg-card/90 backdrop-blur-sm rounded-lg border border-border shadow-2xl overflow-hidden">
Expand All @@ -13,8 +13,8 @@ export function RemoteWorkspacesDemo() {
<div className="w-2.5 h-2.5 rounded-full bg-[#28c840]" />
</div>
<span className="text-xs text-muted-foreground ml-1">
<Trans id="components.remoteWorkspacesDemo.windowTitle">
Remote Workspaces
<Trans id="components.remoteAccessDemo.windowTitle">
Remote Access
</Trans>
</span>
</div>
Expand All @@ -27,9 +27,7 @@ export function RemoteWorkspacesDemo() {
<HiOutlineComputerDesktop className="size-5 text-foreground/80" />
</div>
<span className="text-[10px] text-muted-foreground">
<Trans id="components.remoteWorkspacesDemo.thisMac">
This Mac
</Trans>
<Trans id="components.remoteAccessDemo.thisMac">This Mac</Trans>
</span>
</div>
<div className="flex items-center gap-1">
Expand All @@ -42,32 +40,28 @@ export function RemoteWorkspacesDemo() {
<HiOutlineComputerDesktop className="size-5 text-foreground/80" />
</div>
<span className="text-[10px] text-muted-foreground">
<Trans id="components.remoteWorkspacesDemo.remote">
Remote
</Trans>
<Trans id="components.remoteAccessDemo.remote">Remote</Trans>
</span>
</div>
</div>

<div className="mt-2 space-y-1.5">
<div className="flex items-center justify-between px-2 py-1.5 rounded bg-foreground/5 text-xs">
<span className="text-foreground/80">
<Trans id="components.remoteWorkspacesDemo.tunnelEstablished">
<Trans id="components.remoteAccessDemo.tunnelEstablished">
Tunnel established
</Trans>
</span>
<span className="text-emerald-400 text-[10px]">
<Trans id="components.remoteWorkspacesDemo.live">live</Trans>
<Trans id="components.remoteAccessDemo.live">live</Trans>
</span>
</div>
<div className="flex items-center justify-between px-2 py-1.5 rounded bg-foreground/5 text-xs">
<span className="text-foreground/80">
<Trans id="components.remoteWorkspacesDemo.latency">
Latency
</Trans>
<Trans id="components.remoteAccessDemo.latency">Latency</Trans>
</span>
<span className="text-foreground/60 text-[10px]">
<Trans id="components.remoteWorkspacesDemo.latencyValue">
<Trans id="components.remoteAccessDemo.latencyValue">
42ms
</Trans>
</span>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { RemoteAccessDemo } from "./RemoteAccessDemo";

This file was deleted.

12 changes: 6 additions & 6 deletions apps/desktop/src/renderer/components/Paywall/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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.",
}),
Expand Down Expand Up @@ -111,6 +111,6 @@ export const PRO_FEATURES: ProFeature[] = [
export const FEATURE_ID_MAP: Record<GatedFeature, string> = {
[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",
};
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -81,8 +81,8 @@ export function HostOfflineRunDialog({
})}
</span>{" "}
isn't connected to the Superset relay. Make sure relay
access is on in Settings &gt; Remote Workspaces on that
device, then run it again.
access is on in Settings &gt; Remote Access on that device,
then run it again.
</Trans>
</p>
)}
Expand All @@ -108,7 +108,7 @@ export function HostOfflineRunDialog({
<Button
disabled={isPending}
onClick={() =>
gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, () =>
gateFeature(GATED_FEATURES.REMOTE_ACCESS, () =>
setConfirmOpen(true),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const ICON = (

/**
* Automations dispatch from the cloud through the relay, so even the local
* device is unreachable until relay access is enabled in Settings > Remote Workspaces.
* device is unreachable until relay access is enabled in Settings > Remote Access.
* Renders nothing while connectivity is unknown (row not yet synced).
*/
export function RelayOfflineNotice({
Expand Down Expand Up @@ -57,7 +57,7 @@ export function RelayOfflineNotice({
className="ml-auto h-7 shrink-0 border-warning/40 bg-warning/10 px-2.5 text-xs text-warning hover:bg-warning/20"
disabled={isPending}
onClick={() =>
gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, () =>
gateFeature(GATED_FEATURES.REMOTE_ACCESS, () =>
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
setConfirmOpen(true),
)
}
Expand Down Expand Up @@ -96,8 +96,8 @@ export function RelayOfflineNotice({
>
host settings
</Link>
, and make sure relay access is on in Settings &gt; Remote
Workspaces on that device.
, and make sure relay access is on in Settings &gt; Remote Access on
that device.
</Trans>
</span>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(() => {
Expand All @@ -69,7 +69,7 @@ export function V2WorkspaceContextMenu({
add();
return;
}
gateFeature(GATED_FEATURES.REMOTE_WORKSPACES, add);
gateFeature(GATED_FEATURES.REMOTE_ACCESS, add);
}, [
ensureWorkspaceInSidebar,
gateFeature,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ export function ExposeViaRelayConfirmDialog({
</p>
{targetEnabled ? (
<p>
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.
</p>
) : (
<p>
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.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
</p>
)}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -99,19 +99,17 @@ export function ExposeViaRelaySection() {
<HighlightText
text={t({
id: "settings.components.exposeViaRelay.label",
message:
"Allow remote workspaces to access this device via relay",
message: "Allow remote access to this device via relay",
})}
query={searchQuery}
/>
</Label>
<p className="text-xs text-muted-foreground">
<Trans id="settings.components.exposeViaRelay.hint">
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.{" "}
<a
href={`${COMPANY.DOCS_URL}/remote-workspaces`}
href={`${COMPANY.DOCS_URL}/remote-access`}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1 text-primary hover:underline"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,8 @@ const SECTION_GROUPS: SectionGroup[] = [
id: "/settings/security",
section: "security",
label: msg({
id: "settings.components.generalSettings.remoteWorkspaces",
message: "Remote Workspaces",
id: "settings.components.generalSettings.remoteAccess",
message: "Remote Access",
}),
icon: <HiOutlineLockClosed className="h-4 w-4" />,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,8 @@ export function HostSettings({ hostId }: HostSettingsProps) {
<h3 className="text-sm font-medium">
<HighlightText
text={t({
id: "settings.hosts.remoteWorkspacesTitle",
message: "Remote workspaces",
id: "settings.hosts.remoteAccessTitle",
message: "Remote access",
})}
query={searchQuery}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ export function SecuritySettings({ visibleItems }: SecuritySettingsProps) {
<div className="p-6 max-w-4xl w-full">
<div className="mb-8">
<h2 className="text-xl font-semibold">
<Trans id="settings.security.title">Remote Workspaces</Trans>
<Trans id="settings.security.title">Remote Access</Trans>
</h2>
<p className="text-sm text-muted-foreground mt-1">
<Trans id="settings.security.subtitle">
Control how your local machine is reachable from remote workspaces
Control how your local machine is reachable from elsewhere
</Trans>
</p>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
"lockdown",
"network",
Expand Down
Loading
Loading