44 lines · 1.9 KB · TypeScript
RawDownload
import type { Owner } from "@executor-js/sdk/shared"; import { useOrganizationId } from "./organization-context"; // ---------------------------------------------------------------------------// Owner display (v2) — Personal vs Workspace in cloud, Local in single-player.//// v1's scope stack (personal → org) collapsed to a single `Owner` axis: a// connection / policy is owned by the `org` (tenant-shared) or by the acting// `user`. The global "active owner" toggle has been retired: views no longer// filter by a single ambient owner. Instead, read surfaces merge BOTH owners// (atoms omit `owner`), and each row carries its own `owner` for grouping +// badges. Owner stays real only at WRITE surfaces (policy writes, the run-panel// address, create-target choices), where it is chosen explicitly per call.//// These helpers are display-only. Write paths must still resolve owners through// the connection-owner helpers so local hosts clamp to one Local owner.// --------------------------------------------------------------------------- /** Human label for an owner, for badges and toggles. */export function ownerLabel(owner: Owner): string {  return owner === "user" ? "Personal" : "Workspace";} /** Local/desktop are single-player hosts. The real partition there is the *  cwd-derived local workspace, so do not expose Personal/Workspace language. */export function ownerLabelForHost(owner: Owner, organizationId: string | null): string {  if (organizationId === null) return owner === "org" ? "Local" : "Personal";  return ownerLabel(owner);} export function useOwnerDisplay(): {  readonly isSinglePlayerHost: boolean;  readonly showOwnerLabels: boolean;  readonly label: (owner: Owner) => string;} {  const organizationId = useOrganizationId();  const isSinglePlayerHost = organizationId === null;  return {    isSinglePlayerHost,    showOwnerLabels: !isSinglePlayerHost,    label: (owner) => ownerLabelForHost(owner, organizationId),  };}