diff --git a/packages/web/src/components/dashboard/Dashboard.tsx b/packages/web/src/components/dashboard/Dashboard.tsx
index ba7c8fd..f38fb56 100644
--- a/packages/web/src/components/dashboard/Dashboard.tsx
+++ b/packages/web/src/components/dashboard/Dashboard.tsx
@@ -7,6 +7,7 @@ import type { components } from "@/api/schema.d.ts";
import { ErrorAlert } from "@/components/shared/ErrorAlert";
import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Body, Muted, PageTitle, SectionHeading } from "@/components/ui/typography";
+import { useDemo } from "@/hooks/useDemo";
import { COLOR } from "@/lib/constants";
import { formatCount } from "@/lib/utils";
@@ -15,6 +16,7 @@ type QueueStatus = components["schemas"]["QueueStatus"];
// ─── Per-workspace queue row ─────────────────────────────────────────────────
function WorkspaceQueueRow({ workspaceId }: { workspaceId: string }) {
+ const { mask } = useDemo();
const { data, isLoading } = useQueueStatus(workspaceId);
const pending = data?.pending_work_units ?? 0;
@@ -40,7 +42,7 @@ function WorkspaceQueueRow({ workspaceId }: { workspaceId: string }) {
className="font-mono text-xs truncate max-w-[200px] group-hover:underline"
style={{ color: "var(--accent-text)" }}
>
- {workspaceId}
+ {mask(workspaceId)}
- ).map(({ val, color }, i) => (
+ { key: "total", val: total, color: "var(--text-2)" },
+ { key: "done", val: done, color: COLOR.success },
+ { key: "active", val: active, color: COLOR.warning },
+ { key: "pending", val: pending, color: "var(--text-3)" },
+ ] satisfies Array<{ key: string; val: number; color: string }>
+ ).map(({ key, val, color }) => (
diff --git a/packages/web/src/components/layout/Sidebar.tsx b/packages/web/src/components/layout/Sidebar.tsx
index 3f05c78..139cd5e 100644
--- a/packages/web/src/components/layout/Sidebar.tsx
+++ b/packages/web/src/components/layout/Sidebar.tsx
@@ -25,7 +25,7 @@ export function Sidebar() {
const matchRoute = useMatchRoute();
const config = loadConfig();
const { theme, toggle } = useTheme();
- const { demo, toggle: toggleDemo } = useDemo();
+ const { demo, toggle: toggleDemo, mask } = useDemo();
return (
- {config.baseUrl.replace(/^https?:\/\//, "")}
+ {mask(config.baseUrl.replace(/^https?:\/\//, ""))}
)}
diff --git a/packages/web/src/components/peers/PeerDetail.tsx b/packages/web/src/components/peers/PeerDetail.tsx
index 0cc6f45..4e7f5fe 100644
--- a/packages/web/src/components/peers/PeerDetail.tsx
+++ b/packages/web/src/components/peers/PeerDetail.tsx
@@ -88,7 +88,7 @@ export function PeerDetail() {
params={{ workspaceId } as never}
className="hover:underline font-mono"
>
- {workspaceId}
+ {mask(workspaceId)}
/
- {peerId}
+ {mask(peerId)}
{observeMe !== undefined && (
{repTarget ? (
<>
- {peerId}
+ {mask(peerId)}
→
- {repTarget}
+ {mask(repTarget)}
>
) : (
"Memory Representation"
diff --git a/packages/web/src/components/peers/PeerList.tsx b/packages/web/src/components/peers/PeerList.tsx
index 08669e5..d3387bb 100644
--- a/packages/web/src/components/peers/PeerList.tsx
+++ b/packages/web/src/components/peers/PeerList.tsx
@@ -112,7 +112,7 @@ export function PeerList() {
style={{ color: COLOR.dimText }}
>
- {workspaceId}
+ {mask(workspaceId)}
@@ -139,7 +139,7 @@ export function PeerList() {
- {workspaceId}
+ {mask(workspaceId)}
diff --git a/packages/web/src/components/sessions/SessionDetail.tsx b/packages/web/src/components/sessions/SessionDetail.tsx
index 38cf27f..8213279 100644
--- a/packages/web/src/components/sessions/SessionDetail.tsx
+++ b/packages/web/src/components/sessions/SessionDetail.tsx
@@ -116,7 +116,7 @@ export function SessionDetail() {
params={{ workspaceId } as never}
className="hover:underline font-mono"
>
- {workspaceId}
+ {mask(workspaceId)}
/
- {sessionId}
+ {mask(sessionId)}
- {workspaceId}
+ {mask(workspaceId)}
@@ -142,7 +144,7 @@ export function SessionList() {
className="font-mono text-sm font-medium truncate"
style={{ color: COLOR.accentSoft }}
>
- {session.id}
+ {mask(session.id)}
{session.is_active && (
@@ -189,7 +191,7 @@ export function SessionList() {
color: COLOR.dimText,
}}
>
- {(session.metadata as Record).source}
+ {mask((session.metadata as Record).source)}
)}
diff --git a/packages/web/src/components/workspaces/WebhookManager.tsx b/packages/web/src/components/workspaces/WebhookManager.tsx
index 459da22..91c7f97 100644
--- a/packages/web/src/components/workspaces/WebhookManager.tsx
+++ b/packages/web/src/components/workspaces/WebhookManager.tsx
@@ -11,6 +11,7 @@ import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Body, Muted, PageTitle, SectionHeading } from "@/components/ui/typography";
+import { useDemo } from "@/hooks/useDemo";
import { COLOR } from "@/lib/constants";
const urlSchema = z.string().url({ message: "Must be a valid URL" });
@@ -20,6 +21,7 @@ interface Props {
}
export function WebhookManager({ workspaceId }: Props) {
+ const { mask } = useDemo();
const { data: webhooks, isLoading, error } = useWebhooks(workspaceId);
const createWebhook = useCreateWebhook(workspaceId);
const deleteWebhook = useDeleteWebhook(workspaceId);
@@ -60,7 +62,7 @@ export function WebhookManager({ workspaceId }: Props) {
style={{ color: "var(--text-3)" }}
>
- {workspaceId}
+ {mask(workspaceId)}
@@ -163,7 +165,7 @@ export function WebhookManager({ workspaceId }: Props) {
className="text-xs font-mono truncate"
style={{ color: "var(--accent-text)" }}
>
- {(wh as { url: string }).url}
+ {mask((wh as { url: string }).url)}
- {(wh as { id: string }).id}
+ {mask((wh as { id: string }).id)}
- {workspaceId}
+ {mask(workspaceId)}
|
setConfirmDelete(false)}
diff --git a/packages/web/src/components/workspaces/WorkspaceList.tsx b/packages/web/src/components/workspaces/WorkspaceList.tsx
index 1cb9c9f..64789d2 100644
--- a/packages/web/src/components/workspaces/WorkspaceList.tsx
+++ b/packages/web/src/components/workspaces/WorkspaceList.tsx
@@ -10,6 +10,7 @@ import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Pagination } from "@/components/shared/Pagination";
import { SortControl, type SortDir } from "@/components/shared/SortControl";
import { MonoCaption, Muted, PageTitle } from "@/components/ui/typography";
+import { useDemo } from "@/hooks/useDemo";
import { COLOR } from "@/lib/constants";
type Workspace = components["schemas"]["Workspace"];
@@ -29,6 +30,7 @@ const item: Variants = {
};
export function WorkspaceList() {
+ const { mask } = useDemo();
const [page, setPage] = useState(1);
const [sortField, setSortField] = useState("created_at");
const [sortDir, setSortDir] = useState("desc");
@@ -131,7 +133,7 @@ export function WorkspaceList() {
className="font-mono text-sm font-medium"
style={{ color: COLOR.accentSoft }}
>
- {ws.id}
+ {mask(ws.id)}
|