@streamoid/settings 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -48,7 +48,11 @@ type SettingsTab = "profile"
48
48
  | "organization"
49
49
  /** Organization › Workspaces. */
50
50
  | "organizationWorkspaces"
51
- /** Organization › Domains & join requests. */
51
+ /**
52
+ * @deprecated The Domains tab is gone; join requests moved to Organization ›
53
+ * Workspaces. Kept so old links and host code still resolve — it renders
54
+ * the Workspaces view.
55
+ */
52
56
  | "organizationDomains" | "referral" | "billing" | "apikey";
53
57
  /** Which entity a tab acts on. Drives the nav grouping and the breadcrumb. */
54
58
  type SettingsScope = "account" | "workspace" | "organization" | "global";
@@ -155,10 +159,11 @@ interface SettingsWorkspaceCurrent {
155
159
  */
156
160
  organizationId?: string;
157
161
  /**
158
- * "private" = only members of this workspace can see it; "shared" = every
159
- * member of the parent org gets implicit view-only access. Toggled from
160
- * the Workspace tab; org admins always have full implicit access
161
- * regardless of this flag (host-side rule, not enforced by this package).
162
+ * "shared" = listed in the organization's workspace picker, so anyone in the
163
+ * organization can join it as a member; "private" = not listed, people get
164
+ * in by invite only. Visibility never grants access by itself. Org admins
165
+ * can open every workspace in their organization either way (host-side
166
+ * rule, not enforced by this package).
162
167
  */
163
168
  orgVisibility?: "private" | "shared";
164
169
  }
@@ -242,10 +247,11 @@ interface SettingsWorkspaceAdapter {
242
247
  /**
243
248
  * An organization membership role.
244
249
  *
245
- * `guest` is an outsider who accepted an invite to a single workspace inside
246
- * the organization. They hold a membership row — so they show up in these
247
- * responses — but inherit nothing from the org: no implicit access to its
248
- * shared workspaces, and every org-level write is refused by the backend.
250
+ * `guest` is an outsider who accepted an invite to a workspace inside the
251
+ * organization. They hold a membership row — so they show up in these
252
+ * responses — but inherit nothing from the org: they can't join its shared
253
+ * workspaces from the picker, can only ever be a workspace member, and every
254
+ * org-level write is refused by the backend.
249
255
  *
250
256
  * Gate write affordances on `=== "admin"`, never on `!== "member"`: a role this
251
257
  * union does not yet name must read as least-privileged, not as an editor.
@@ -267,7 +273,15 @@ interface SettingsOrganizationCurrent {
267
273
  imageUrl?: string;
268
274
  role?: SettingsOrganizationRole | string;
269
275
  /**
270
- * Whether the viewer may invite into this organization.
276
+ * The email domain this organization is tied to (e.g. "acme.com"), when it
277
+ * has one. Organizations created for a team on a free email provider have
278
+ * none. Lets the workspace invite modal tell, from the address alone, that
279
+ * an invitee will be a guest — and so can only be invited as a member.
280
+ */
281
+ domain?: string | null;
282
+ /**
283
+ * Whether the viewer may add people to this organization through a
284
+ * workspace invite ("Colleague").
271
285
  *
272
286
  * Orthogonal to `role`, not implied by it: a guest row can carry it too, so
273
287
  * gate on `role !== "guest" && (role === "admin" || inviteAccess)`. The
@@ -279,7 +293,9 @@ interface SettingsOrganizationCurrent {
279
293
  interface OrganizationMember {
280
294
  _id: string;
281
295
  role: SettingsOrganizationRole;
282
- inviteAccess: boolean;
296
+ /** @deprecated Only meant anything for organization-level invites, which
297
+ * no longer exist. */
298
+ inviteAccess?: boolean;
283
299
  /** Populated user. Rows whose user document was deleted come back from the
284
300
  * API with a null `user` — OrganizationContent drops those on fetch, so
285
301
  * every render site can treat this as present. */
@@ -295,7 +311,10 @@ interface OrganizationMember {
295
311
  name?: string;
296
312
  };
297
313
  }
298
- /** A single row in the combined Organization invites table. */
314
+ /**
315
+ * @deprecated Organization-level invites no longer exist; the package never
316
+ * reads this. Kept so host adapters that still name it keep compiling.
317
+ */
299
318
  interface OrganizationInvite {
300
319
  _id: string;
301
320
  kind: "email" | "domain";
@@ -331,10 +350,8 @@ interface OrganizationJoinRequest {
331
350
  };
332
351
  createdAt?: string;
333
352
  }
334
- /** Result of checking whether the current user's email domain already has
335
- * an org claiming it via a domain invite — drives the "an organization
336
- * already exists for your company" prompt in the create-organization
337
- * empty state, so people don't fragment a company across duplicate orgs. */
353
+ /** @deprecated Joining by domain now happens at sign-in; the package never
354
+ * reads this. */
338
355
  interface OrganizationDomainMatch {
339
356
  organizationId: string;
340
357
  organizationName: string;
@@ -350,7 +367,9 @@ interface SettingsOrganizationAdapter {
350
367
  managementUrl?: string;
351
368
  current: SettingsOrganizationCurrent | null;
352
369
  list: () => Promise<SettingsOrganizationListItem[]>;
353
- create: (input: {
370
+ /** @deprecated Organizations are created at sign-in from the email domain,
371
+ * or from the company name given in onboarding. Never called. */
372
+ create?: (input: {
354
373
  name: string;
355
374
  imageFile?: File | null;
356
375
  }) => Promise<{
@@ -364,59 +383,55 @@ interface SettingsOrganizationAdapter {
364
383
  switch: (id: string) => Promise<void>;
365
384
  delete: (id: string) => Promise<void>;
366
385
  fetchMembers: () => Promise<OrganizationMember[]>;
367
- /** Merged email + domain invites, tagged by `kind`. Drives a single
368
- * combined pending-invites table (not two separate lists). */
369
- fetchInvites: () => Promise<OrganizationInvite[]>;
370
- inviteMemberByEmail: (input: {
386
+ /** @deprecated Never called. */
387
+ fetchInvites?: () => Promise<OrganizationInvite[]>;
388
+ /** @deprecated Never called. */
389
+ inviteMemberByEmail?: (input: {
371
390
  email: string;
372
391
  role: "admin" | "member";
373
392
  inviteAccess: boolean;
374
393
  }) => Promise<void>;
375
- inviteDomain: (input: {
394
+ /** @deprecated Never called. */
395
+ inviteDomain?: (input: {
376
396
  domain: string;
377
397
  autoJoinRole: "admin" | "member";
378
398
  }) => Promise<void>;
379
- /** Revoke a domain invite. Only stops *future* auto-joins — does not
380
- * remove members who already joined via that domain. */
381
- revokeDomainInvite: (id: string) => Promise<void>;
382
- cancelInvite: (token: string) => Promise<void>;
383
- resendInvite: (invitationId: string) => Promise<void>;
399
+ /** @deprecated Never called. */
400
+ revokeDomainInvite?: (id: string) => Promise<void>;
401
+ /** @deprecated Never called. */
402
+ cancelInvite?: (token: string) => Promise<void>;
403
+ /** @deprecated Never called. */
404
+ resendInvite?: (invitationId: string) => Promise<void>;
405
+ /** Removes the users from the organization — and, on the backend, from
406
+ * every workspace in it. */
384
407
  removeMember: (input: {
385
408
  userIds?: string[];
409
+ /** @deprecated Organization invites no longer exist. */
386
410
  invitationIds?: string[];
387
411
  }) => Promise<void>;
388
412
  updateMemberRole: (input: {
389
413
  userId: string;
390
414
  role: "admin" | "member";
415
+ /** @deprecated Organization invites no longer exist. */
391
416
  inviteAccess?: boolean;
392
417
  }) => Promise<void>;
393
418
  /** Optional: gates write affordances inside the Organization tab. Can report
394
419
  * "guest", so callers must gate on `=== "admin"` rather than `!== "member"`. */
395
420
  getHighestRole?: () => Promise<{
396
421
  role: SettingsOrganizationRole;
397
- /**
398
- * The viewer's own email domain, and whether it can be claimed at all.
399
- *
400
- * A self-serve domain claim can only ever be the claimer's OWN domain —
401
- * there is no DNS verification, so the backend refuses any other — which
402
- * makes one boolean about one known domain the entire answer. Server
403
- * computed on purpose: the disposable-domain lists it consults are
404
- * provisioned at runtime, so no bundled list could agree with it.
405
- */
422
+ /** @deprecated Domain claims no longer exist; never read. */
406
423
  emailDomain?: string | null;
424
+ /** @deprecated Domain claims no longer exist; never read. */
407
425
  canClaimEmailDomain?: boolean;
408
426
  }>;
409
427
  fetchWorkspaces: () => Promise<OrganizationWorkspaceItem[]>;
410
428
  fetchJoinRequests: () => Promise<OrganizationJoinRequest[]>;
411
429
  approveJoinRequest: (requestId: string) => Promise<void>;
412
430
  rejectJoinRequest: (requestId: string) => Promise<void>;
413
- /** Checks whether the current user's email domain already has an org
414
- * claiming it. Called when `current` is null, before showing the
415
- * "create organization" empty state. */
416
- checkDomainMatch: () => Promise<OrganizationDomainMatch | null>;
417
- /** Self-service join for the domain-match prompt — domain invites are
418
- * auto-join by design, so this doesn't need admin approval. */
419
- joinByDomain: () => Promise<void>;
431
+ /** @deprecated Joining by domain now happens at sign-in. Never called. */
432
+ checkDomainMatch?: () => Promise<OrganizationDomainMatch | null>;
433
+ /** @deprecated Joining by domain now happens at sign-in. Never called. */
434
+ joinByDomain?: () => Promise<void>;
420
435
  }
421
436
  type TokenExpiry = "30d" | "60d" | "90d" | "1y" | "never";
422
437
  interface ApiToken {
@@ -1040,21 +1055,17 @@ declare function TeamsContent({ embedded, onInviteOpen, onInviteOpenChange, work
1040
1055
  }): react.JSX.Element;
1041
1056
 
1042
1057
  /**
1043
- * Which slice of the organization to show. The tab used to stack all three on
1044
- * one scrolling page, so the members table, the workspace list and the join
1045
- * requests competed for the same screen and the sections below the table were
1046
- * easy to miss entirely.
1058
+ * Which slice of the organization to show: its people, or its workspaces
1059
+ * together with the workspaces asking to join it.
1047
1060
  *
1048
- * `people` and `domains` split invites by kind on purpose: an email invite is
1049
- * a person you are expecting, a domain invite is a standing rule. They were
1050
- * interleaved in one "Pending" list, where a row could be either.
1061
+ * `domains` is kept as an alias of `workspaces` for hosts and links that still
1062
+ * use it. The Domains tab it named is gone: an organization is tied to one
1063
+ * email domain from the moment it is created, and nobody claims one by hand.
1051
1064
  */
1052
1065
  type OrganizationView = "people" | "workspaces" | "domains";
1053
- declare function OrganizationContent({ embedded, view, onInviteOpen, onInviteOpenChange, }?: {
1066
+ declare function OrganizationContent({ embedded, view, }?: {
1054
1067
  embedded?: boolean;
1055
1068
  view?: OrganizationView;
1056
- onInviteOpen?: boolean;
1057
- onInviteOpenChange?: (open: boolean) => void;
1058
1069
  }): react.JSX.Element;
1059
1070
 
1060
1071
  declare function TokensContent({ embedded, showRevokedOverride, onShowRevokedChange: _onShowRevokedChange, createOpenOverride, onCreateOpenChange, }?: {
@@ -1141,7 +1152,9 @@ interface MemberListToolbarProps {
1141
1152
  activeLabel: string;
1142
1153
  /** Row counts, appended to each tab label. Pass `null` while still loading. */
1143
1154
  activeCount: number | null;
1144
- pendingCount: number | null;
1155
+ /** Omit (or pass `undefined`) for a list with no pending invites — the
1156
+ * organization's — and the tab pair collapses to a single label. */
1157
+ pendingCount?: number | null;
1145
1158
  searchQuery: string;
1146
1159
  onSearchChange: (value: string) => void;
1147
1160
  /** Optional trailing control, e.g. an Invite button on the page itself. */
@@ -1211,63 +1224,48 @@ interface OrganizationModalProps {
1211
1224
  }
1212
1225
  declare function OrganizationModal({ open, mode, organization, onClose, onCreate, onUpdate, onDelete, }: OrganizationModalProps): react.JSX.Element | null;
1213
1226
 
1214
- type ModalMode$1 = "invite" | "update";
1215
- interface OrganizationInviteModalProps {
1227
+ interface WorkspacePickerItem {
1228
+ _id: string;
1229
+ name: string;
1230
+ imageUrl?: string;
1231
+ /** Who created it, shown under the name. */
1232
+ ownerName?: string;
1233
+ }
1234
+ interface WorkspacePickerProps {
1235
+ organizationName?: string;
1236
+ workspaces: WorkspacePickerItem[];
1237
+ /** While the list is still loading. */
1238
+ loading?: boolean;
1239
+ /** Join the ticked workspaces as a member. Throw to keep the picker open. */
1240
+ onJoin: (workspaceIds: string[]) => Promise<void>;
1241
+ /** Create a workspace (the user becomes its admin). Throw to keep it open. */
1242
+ onCreate: (name: string) => Promise<void>;
1243
+ }
1244
+ declare function WorkspacePicker({ organizationName, workspaces, loading, onJoin, onCreate, }: WorkspacePickerProps): react.JSX.Element;
1245
+
1246
+ interface OrganizationMemberModalProps {
1216
1247
  open: boolean;
1217
- mode: ModalMode$1;
1218
- /** Update mode: the target member's email (read-only display). */
1248
+ /** The target member's email (read-only display). */
1219
1249
  userEmail?: string;
1220
1250
  /** admin/member only — the toggle below cannot express any other role, so
1221
1251
  * pass `lockRole` for a target whose role is outside that pair. */
1222
1252
  initialRole?: "admin" | "member";
1223
1253
  /**
1224
1254
  * Show the target's role read-only and disable Save, leaving Remove as the
1225
- * only action.
1226
- *
1227
- * For an organization guest: the toggle offers Admin and Member and nothing
1228
- * else, so opening it on a guest preselected "Member" and quietly promoted
1229
- * them the moment Save was pressed — even by an admin who came only to flip
1230
- * `inviteAccess`, which is itself the thing a guest must never hold. Removing
1231
- * a guest happens through this same modal, so refusing to open it was not an
1232
- * option.
1255
+ * only action. For an organization guest: the toggle offers Admin and Member
1256
+ * and nothing else, and a guest can't be made either.
1233
1257
  */
1234
1258
  lockRole?: boolean;
1235
- /**
1236
- * Whether the viewer's own email domain can be claimed at all. Defaults to
1237
- * true, preserving today's behaviour for any host that does not pass it.
1238
- *
1239
- * A domain claim can only ever be the claimer's OWN domain — there is no DNS
1240
- * verification, so the backend refuses any other — and a public provider
1241
- * like gmail.com can never be claimed by anybody. Offering the tab in that
1242
- * case advertises the one mechanism that would solve bulk onboarding and
1243
- * then fails after submit, which is worse than not offering it.
1244
- */
1245
- canClaimDomain?: boolean;
1246
- /** The viewer's own email domain: the only one they could ever claim. */
1247
- claimableDomain?: string | null;
1248
1259
  /** Label for the read-only role shown when `lockRole` is set. */
1249
1260
  lockedRoleLabel?: string;
1250
- initialInviteAccess?: boolean;
1251
- /** Lets a pending-invite row reopen this modal to resend without edits. */
1252
- allowSubmitWithoutChanges?: boolean;
1253
1261
  canRemove?: boolean;
1254
1262
  onClose: () => void;
1255
- onInviteEmail?: (input: {
1256
- email: string;
1257
- role: "admin" | "member";
1258
- inviteAccess: boolean;
1259
- }) => void;
1260
- onInviteDomain?: (input: {
1261
- domain: string;
1262
- autoJoinRole: "admin" | "member";
1263
- }) => void;
1264
1263
  onUpdate?: (input: {
1265
1264
  role: "admin" | "member";
1266
- inviteAccess: boolean;
1267
1265
  }) => void;
1268
1266
  onRemove?: () => void;
1269
1267
  }
1270
- declare function OrganizationInviteModal({ open, mode, userEmail, initialRole, lockRole, canClaimDomain, claimableDomain, lockedRoleLabel, initialInviteAccess, allowSubmitWithoutChanges, canRemove, onClose, onInviteEmail, onInviteDomain, onUpdate, onRemove, }: OrganizationInviteModalProps): react.JSX.Element | null;
1268
+ declare function OrganizationMemberModal({ open, userEmail, initialRole, lockRole, lockedRoleLabel, canRemove, onClose, onUpdate, onRemove, }: OrganizationMemberModalProps): react.JSX.Element | null;
1271
1269
 
1272
1270
  interface ConfirmLeaveModalProps {
1273
1271
  open: boolean;
@@ -1304,8 +1302,8 @@ interface StoreOption {
1304
1302
  }
1305
1303
  /**
1306
1304
  * Standing in the workspace's parent organization, as distinct from `role`,
1307
- * which is the role inside the workspace itself. The two are independent: an
1308
- * external collaborator is routinely a workspace admin and an org guest.
1305
+ * which is the role inside the workspace itself. A colleague can hold either
1306
+ * workspace role; a guest can only ever be a workspace member.
1309
1307
  */
1310
1308
  type OrganizationStanding = "colleague" | "guest";
1311
1309
  interface InviteUpdateModalProps {
@@ -1372,10 +1370,16 @@ interface InviteUpdateModalProps {
1372
1370
  allowGuestStanding?: boolean;
1373
1371
  /** Defaults to "guest" — the least-privileged of the two. */
1374
1372
  initialOrganizationStanding?: OrganizationStanding;
1373
+ /**
1374
+ * The email domain of the workspace's organization, when it has one. An
1375
+ * invitee outside it joins as a guest (unless invited as a Colleague), and
1376
+ * a guest can only be a workspace member — so Admin is locked off for them.
1377
+ */
1378
+ organizationDomain?: string | null;
1375
1379
  /** Called only in invite mode; receives (permissions, email, standing) */
1376
1380
  onInvite?: (permissions: UserPermissions, email: string, organizationStanding?: OrganizationStanding) => void;
1377
1381
  }
1378
- declare function InviteUpdateModal({ open, mode, userEmail, stores, hiddenApps, allowSubmitWithoutChanges, initialPermissions, onClose, onSave, onRemove, canRemove, showOrganizationStanding, organizationName, allowGuestStanding, initialOrganizationStanding, onInvite, }: InviteUpdateModalProps): react.JSX.Element | null;
1382
+ declare function InviteUpdateModal({ open, mode, userEmail, stores, hiddenApps, allowSubmitWithoutChanges, initialPermissions, onClose, onSave, onRemove, canRemove, showOrganizationStanding, organizationName, allowGuestStanding, initialOrganizationStanding, organizationDomain, onInvite, }: InviteUpdateModalProps): react.JSX.Element | null;
1379
1383
 
1380
1384
  interface ExportDateModalProps {
1381
1385
  title: string;
@@ -1395,4 +1399,4 @@ declare function SettingsAdaptersProvider({ adapters, children, }: {
1395
1399
  */
1396
1400
  declare function useSettingsAdapters(): SettingsAdapters;
1397
1401
 
1398
- export { APP_KEYS, type ApiToken, type AppKey, type AvailableCreditsResponse, BillingContent, type BillingEventPayload, type BillingProduct, type BillingSubscription, BuyCreditsModal, type BuyCreditsPayload, type BuyCreditsResponse, ConfirmDeleteModal, ConfirmLeaveModal, type CreatedToken, type CustomCreditInfo, type CustomCreditResponse, DEFAULT_PERMISSIONS, DEFAULT_USER_LANGUAGE, ExportDateModal, InviteUpdateModal, type InvoicePdfResponse, MemberListFrame, type MemberListFrameProps, type MemberListTab, MemberListToolbar, type MemberListToolbarProps, type MemberPermissionsPayload, OrganizationContent, type OrganizationData, type OrganizationInvite, OrganizationInviteModal, type OrganizationInviteModalProps, type OrganizationJoinRequest, type OrganizationMember, OrganizationModal, type OrganizationView, type OrganizationWorkspaceItem, type Price, type PriceMetadata, type ProductsResponse, ProfileAvatar, ProfileTab, ReferralTab, SCOPE_LABELS, ScopeHeader, type ScopeHeaderProps, type ServiceItem, type SettingsAdapters, SettingsAdaptersProvider, type SettingsApiAdapter, type SettingsAuthAdapter, type SettingsAuthUser, SettingsContent, type SettingsContentProps, type SettingsImageUploadAdapter, type SettingsNavigationAdapter, type SettingsOrganizationAdapter, type SettingsOrganizationCurrent, type SettingsOrganizationListItem, type SettingsScope, type SettingsTab, type SettingsToastAdapter, SettingsTooltip, type SettingsTooltipPlacement, type SettingsTooltipProps, type SettingsWorkspaceAdapter, type SettingsWorkspaceCurrent, type SettingsWorkspaceListItem, SiconKey, type StoreItem, type SubscriptionPlan, type SubscriptionResponse, TAB_DESCRIPTIONS, TAB_LABELS, TAB_SCOPE, TAB_TO_URL, type TeamMember, TeamsContent, type TokenExpiry, TokensContent, URL_TO_TAB, USER_LANGUAGES, type UpdateSubscriptionPayload, type UpdateSubscriptionResponse, type UsageHistoryItem, type UsageHistoryResponse, type UserLanguage, type UserPermissions, type WorkspaceData, WorkspaceGeneralTab, type WorkspaceGeneralTabProps, type WorkspaceInvite, WorkspaceListTab, type WorkspaceMember, WorkspaceModal, type WorkspaceOrganization, type WorkspaceOrganizationRequest, WorkspaceTab, type WorkspaceUsageResponse, countLabel, loadWorkspaceOrganization, resolveSettingsTabFromPath, useSettingsAdapters, useWorkspaceOrganization, userLanguageLabel };
1402
+ export { APP_KEYS, type ApiToken, type AppKey, type AvailableCreditsResponse, BillingContent, type BillingEventPayload, type BillingProduct, type BillingSubscription, BuyCreditsModal, type BuyCreditsPayload, type BuyCreditsResponse, ConfirmDeleteModal, ConfirmLeaveModal, type CreatedToken, type CustomCreditInfo, type CustomCreditResponse, DEFAULT_PERMISSIONS, DEFAULT_USER_LANGUAGE, ExportDateModal, InviteUpdateModal, type InvoicePdfResponse, MemberListFrame, type MemberListFrameProps, type MemberListTab, MemberListToolbar, type MemberListToolbarProps, type MemberPermissionsPayload, OrganizationContent, type OrganizationData, type OrganizationInvite, type OrganizationJoinRequest, type OrganizationMember, OrganizationMemberModal, type OrganizationMemberModalProps, OrganizationModal, type OrganizationView, type OrganizationWorkspaceItem, type Price, type PriceMetadata, type ProductsResponse, ProfileAvatar, ProfileTab, ReferralTab, SCOPE_LABELS, ScopeHeader, type ScopeHeaderProps, type ServiceItem, type SettingsAdapters, SettingsAdaptersProvider, type SettingsApiAdapter, type SettingsAuthAdapter, type SettingsAuthUser, SettingsContent, type SettingsContentProps, type SettingsImageUploadAdapter, type SettingsNavigationAdapter, type SettingsOrganizationAdapter, type SettingsOrganizationCurrent, type SettingsOrganizationListItem, type SettingsScope, type SettingsTab, type SettingsToastAdapter, SettingsTooltip, type SettingsTooltipPlacement, type SettingsTooltipProps, type SettingsWorkspaceAdapter, type SettingsWorkspaceCurrent, type SettingsWorkspaceListItem, SiconKey, type StoreItem, type SubscriptionPlan, type SubscriptionResponse, TAB_DESCRIPTIONS, TAB_LABELS, TAB_SCOPE, TAB_TO_URL, type TeamMember, TeamsContent, type TokenExpiry, TokensContent, URL_TO_TAB, USER_LANGUAGES, type UpdateSubscriptionPayload, type UpdateSubscriptionResponse, type UsageHistoryItem, type UsageHistoryResponse, type UserLanguage, type UserPermissions, type WorkspaceData, WorkspaceGeneralTab, type WorkspaceGeneralTabProps, type WorkspaceInvite, WorkspaceListTab, type WorkspaceMember, WorkspaceModal, type WorkspaceOrganization, type WorkspaceOrganizationRequest, WorkspacePicker, type WorkspacePickerItem, type WorkspacePickerProps, WorkspaceTab, type WorkspaceUsageResponse, countLabel, loadWorkspaceOrganization, resolveSettingsTabFromPath, useSettingsAdapters, useWorkspaceOrganization, userLanguageLabel };