@ai-matrx/sharing 0.1.7 → 0.1.9
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/CHANGELOG.md +21 -1
- package/dist/react.cjs +36 -6
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +36 -6
- package/dist/react.js.map +1 -1
- package/package.json +6 -4
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/index.ts","../src/react/sheet/host.tsx","../src/react/sheet/ShareModal.tsx","../src/react/sheet/ui/dialog.tsx","../src/react/sheet/ui/share-tabs-trigger.tsx","../src/react/permissionHooks.ts","../src/react/sheet/useGrantableLevels.ts","../src/react/sheet/PermissionsList.tsx","../src/react/sheet/PermissionBadge.tsx","../src/react/sheet/ui/alert-dialog.tsx","../src/react/sheet/AccessSummaryPanel.tsx","../src/react/sheet/useAccessSummary.ts","../src/react/sheet/ShareWithUserTab.tsx","../src/react/sheet/ui/scroll-area.tsx","../src/react/sheet/ui/avatar.tsx","../src/react/sheet/AddEveryoneInOrg.tsx","../src/react/sheet/OutsideSharePanel.tsx","../src/react/sheet/WhoCouldSeeOn.tsx","../src/react/sheet/OrgAvailabilityNote.tsx","../src/react/sheet/WhoCanSeeThis.tsx","../src/react/sheet/RowControls.tsx","../src/react/sheet/ui/switch.tsx","../src/react/sheet/ui/toggle-group.tsx","../src/react/sheet/PublicAccessTab.tsx","../src/react/sheet/ui/alert.tsx","../src/react/sheet/ShareLinkPanel.tsx","../src/react/sheet/ui/confirm-dialog.tsx","../src/react/sheet/useShare.tsx","../src/react/sheet/SearchEngineIndexedSwitch.tsx","../src/react/sheet/SecureLinkPanel.tsx"],"sourcesContent":["// @ai-matrx/sharing/react — THE share sheet (the one sharing dialog in every app) and its pieces.\n// Host inputs: `configureSharing` (@ai-matrx/sharing/core) + `configureShareSheetUi` (here).\nexport { configureShareSheetUi, shareSheetUi, resetShareSheetCache } from \"./sheet/host\";\nexport type { ShareSheetUi, ShareSheetConnection, ShareSheetConnections, ShareSheetOrganization, ShareSheetToastOptions } from \"./sheet/host\";\nexport * from \"./sheet/ShareModal\";\nexport * from \"./sheet/PermissionsList\";\nexport * from \"./sheet/PermissionBadge\";\nexport * from \"./sheet/AccessSummaryPanel\";\nexport * from \"./sheet/WhoCanSeeThis\";\nexport * from \"./sheet/RowControls\";\nexport * from \"./sheet/ShareLinkPanel\";\nexport * from \"./sheet/ShareWithUserTab\";\nexport * from \"./sheet/PublicAccessTab\";\nexport * from \"./sheet/OutsideSharePanel\";\nexport * from \"./sheet/SecureLinkPanel\";\nexport * from \"./sheet/AddEveryoneInOrg\";\nexport * from \"./sheet/OrgAvailabilityNote\";\nexport * from \"./sheet/SearchEngineIndexedSwitch\";\nexport * from \"./sheet/useShare\";\nexport * from \"./sheet/useGrantableLevels\";\nexport * from \"./sheet/useAccessSummary\";\nexport * from \"./permissionHooks\";\nexport * from \"./sheet/WhoCouldSeeOn\";\n","\"use client\";\n\n/**\n * @ai-matrx/sharing/react — what the SHARE SHEET needs from its host's UI, injected ONCE at boot:\n *\n * configureShareSheetUi({ toast, useCurrentUserId, useOrganizations, CopyButtons, EntityRef, ... });\n *\n * The data half (database client, aidream calls, routes) is `configureSharing` in\n * `@ai-matrx/sharing/core`. Every field here has a WORKING default, so a host that supplies\n * nothing still gets a usable sheet (plain copy buttons, a plain name for the record, an email\n * field for finding a person, the organization's roster as contacts); a richer host (the web)\n * hands in its own pieces. A default is never a blank: where a host-only feature is absent the\n * default says so (one console line naming the field, and `data-share-sheet-host=\"unconfigured\"` in the DOM).\n */\n\nimport { useCallback, useEffect, useMemo, useState, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\nimport { Input } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { confirm as kitConfirm, type ConfirmOptions } from \"@ai-matrx/kit/confirm-opener\";\nimport { readOrganizationMemberRows } from \"@ai-matrx/sharing/core\";\nimport { shareClient as shareClientForIdentity } from \"@ai-matrx/sharing/core\";\nimport { createSupabaseIdentity } from \"@ai-matrx/vault\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype LooseProps = { [key: string]: any };\n\nexport interface ShareSheetOrganization {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface ShareSheetConnection {\n user_id: string;\n email: string | null;\n display_name: string | null;\n avatar_url: string | null;\n source: \"conversation\" | \"organization\" | \"invitation\";\n sourceDetails?: string | undefined;\n}\n\nexport interface ShareSheetConnections {\n connections: ShareSheetConnection[];\n isLoading: boolean;\n error: string | null;\n partialFailures: string[];\n refresh: () => Promise<void> | void;\n}\n\nexport interface ShareSheetToastOptions {\n title?: ReactNode | undefined;\n description?: ReactNode | undefined;\n variant?: \"default\" | \"destructive\" | \"success\" | string | undefined;\n}\n\nexport interface ShareSheetUi {\n /** Messages. Default: `console` + `window.alert` for errors (never swallowed). */\n toast: (options: ShareSheetToastOptions) => void;\n /** The signed-in person's id. Default: read once from the sharing client's session. */\n useCurrentUserId: () => string | null;\n /** The organizations the person belongs to (`{id, name}`). Default: `organizations` read once. */\n useOrganizations: () => ShareSheetOrganization[];\n /** Contacts offered in the People tab. Default: the organization's roster. */\n useUserConnections: (options: { organizationId?: string }) => ShareSheetConnections;\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n CopyButtons: ComponentType<LooseProps>;\n csvExportItem: (...args: any[]) => any;\n jsonExportItem: (...args: any[]) => any;\n usePageCapture: (build: () => unknown, options?: { enabled?: boolean }) => void;\n dialogCapture: (input: any) => unknown;\n PageCaptureButton: ComponentType<LooseProps>;\n ErrorAlchemyMenu: ComponentType<LooseProps>;\n InfoHint: ComponentType<LooseProps>;\n EntityDoorControls: ComponentType<LooseProps>;\n EntityRef: ComponentType<LooseProps>;\n UserAvatarDisplay: ComponentType<LooseProps>;\n ConnectionsReadNotice: ComponentType<LooseProps>;\n UserSearchField: ComponentType<LooseProps>;\n /** The vault identity the secure-link panel seals with (`@ai-matrx/vault`). */\n vaultIdentity: unknown;\n humanLines: (...args: any[]) => string;\n /** Where dialogs portal (the web: its pop-out window container). Default: the document body. */\n usePortalContainer: () => HTMLElement | null | undefined;\n}\n\n/* ─── defaults ───────────────────────────────────────────────────────────── */\n\nfunction DefaultCopyButtons(props: LooseProps) {\n const [done, setDone] = useState(false);\n const text = (): string => {\n const h = props.human ?? props.text;\n const v = typeof h === \"function\" ? h() : h;\n return Array.isArray(v) ? v.join(\"\\n\") : String(v ?? \"\");\n };\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n className={props.className}\n onClick={() => {\n void copyText(text()).then(() => {\n setDone(true);\n setTimeout(() => setDone(false), 1500);\n });\n }}\n >\n {done ? \"Copied\" : props.label ? `Copy ${String(props.label).toLowerCase()}` : \"Copy\"}\n </Button>\n );\n}\n\n/**\n * A stand-in announces itself (law 4): one console line per port, naming `configureShareSheetUi`, and\n * every stand-in that draws leaves `data-share-sheet-host=\"unconfigured\"` (+ the port) in the DOM so a\n * second host (desktop, the extension) sees WHY a button is missing instead of finding nothing.\n */\nconst announced = new Set<string>();\nfunction announceStandIn(port: string): void {\n if (announced.has(port)) return;\n announced.add(port);\n console.warn(\n `[share] The share sheet is using its built-in stand-in for \"${port}\": the host did not pass it, so that part of the sheet is absent. Pass it with configureShareSheetUi({ ${port} }).`,\n );\n}\n/** Test seam: forget what was announced. */\nexport function resetShareSheetStandInNotices(): void {\n announced.clear();\n}\nfunction StandIn({ port }: { port: string }) {\n useEffect(() => announceStandIn(port), [port]);\n return <span hidden data-share-sheet-host=\"unconfigured\" data-share-sheet-port={port} />;\n}\n\nfunction DefaultErrorMenu(_props: LooseProps) {\n return <StandIn port=\"ErrorAlchemyMenu\" />;\n}\nfunction DefaultPageCaptureButton(_props: LooseProps) {\n return <StandIn port=\"PageCaptureButton\" />;\n}\nfunction DefaultEntityDoorControls(_props: LooseProps) {\n return <StandIn port=\"EntityDoorControls\" />;\n}\n\nfunction DefaultInfoHint(props: LooseProps) {\n return (\n <span title={String(props.text ?? \"\")} aria-label={String(props.label ?? \"More info\")} className=\"cursor-help text-muted-foreground\">\n ⓘ\n </span>\n );\n}\n\nfunction DefaultEntityRef(props: LooseProps) {\n const href = typeof props.href === \"string\" ? props.href : null;\n return href ? <a href={href} className=\"underline-offset-2 hover:underline\">{String(props.name ?? \"\")}</a> : <span>{String(props.name ?? \"\")}</span>;\n}\n\nfunction DefaultUserAvatar(props: LooseProps) {\n const u = (props.user ?? {}) as { displayName?: string | undefined; email?: string | undefined; display_name?: string | undefined };\n const name = u.displayName ?? u.display_name ?? u.email ?? \"?\";\n return (\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-full bg-muted text-xs font-medium\" aria-label={name}>\n {name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction DefaultConnectionsNotice(props: LooseProps) {\n if (!props.error && !(Array.isArray(props.partialFailures) && props.partialFailures.length)) return null;\n return (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 p-2 text-xs text-destructive\">\n {props.error ? `Contacts could not be read: ${String(props.error)}` : `Some contacts could not be read.`}{\" \"}\n {props.onRetry ? ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button type=\"button\" className=\"underline\" onClick={() => props.onRetry()}>\n Retry\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction DefaultUserSearchField(props: LooseProps) {\n const { onValueChange, onUserSelect: _onUserSelect, value, ...rest } = props;\n return <Input {...rest} value={value ?? \"\"} onChange={(e: { target: { value: string } }) => onValueChange?.(e.target.value)} />;\n}\n\nconst ORGS_EMPTY: ShareSheetOrganization[] = [];\nlet orgsCache: ShareSheetOrganization[] | null = null;\nconst orgListeners = new Set<() => void>();\n\nfunction useDefaultOrganizations(): ShareSheetOrganization[] {\n const snapshot = useSyncExternalStore(\n (cb) => {\n orgListeners.add(cb);\n return () => orgListeners.delete(cb);\n },\n () => orgsCache ?? ORGS_EMPTY,\n () => ORGS_EMPTY,\n );\n useEffect(() => {\n if (orgsCache) return;\n orgsCache = ORGS_EMPTY;\n void import(\"@ai-matrx/sharing/core\").then(async ({ shareClient }) => {\n const { data, error } = await shareClient().from(\"organizations\").select(\"id, name\");\n if (error) console.error(`[share] Your organizations could not be read: ${error.message}`);\n orgsCache = (Array.isArray(data) ? (data as ShareSheetOrganization[]) : []).map((o) => ({ ...o, id: String(o.id), name: String(o.name ?? \"\") }));\n orgListeners.forEach((l) => l());\n }).catch((err: unknown) => console.error(\"[share] Your organizations could not be read:\", err));\n }, []);\n return snapshot;\n}\n\nfunction useDefaultCurrentUserId(): string | null {\n const [id, setId] = useState<string | null>(null);\n useEffect(() => {\n void import(\"@ai-matrx/sharing/core\").then(async ({ shareClient }) => {\n const { getClaimsUser } = await import(\"@ai-matrx/sharing/core\");\n const { data } = await getClaimsUser(shareClient());\n setId(data.user?.id ?? null);\n });\n }, []);\n return id;\n}\n\nfunction useDefaultConnections({ organizationId }: { organizationId?: string }): ShareSheetConnections {\n const [state, setState] = useState<{ rows: ShareSheetConnection[]; loading: boolean; error: string | null }>({ rows: [], loading: Boolean(organizationId), error: null });\n const load = useCallback(\n async (fresh = false) => {\n if (!organizationId) return;\n setState((s) => ({ ...s, loading: true }));\n try {\n const rows = await readOrganizationMemberRows(organizationId, { fresh });\n setState({\n rows: rows.map((r) => ({\n user_id: r.user_id,\n email: r.user_email ?? null,\n display_name: r.user_display_name ?? null,\n avatar_url: r.user_avatar_url ?? null,\n source: \"organization\" as const,\n })),\n loading: false,\n error: null,\n });\n } catch (err) {\n setState({ rows: [], loading: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n [organizationId],\n );\n useEffect(() => {\n void load();\n }, [load]);\n return useMemo(\n () => ({ connections: state.rows, isLoading: state.loading, error: state.error, partialFailures: [], refresh: () => load(true) }),\n [state, load],\n );\n}\n\nconst DEFAULTS: ShareSheetUi = {\n toast: ({ title, description, variant }) => {\n const text = [title, description].filter((x) => typeof x === \"string\").join(\" — \");\n if (variant === \"destructive\") {\n console.error(`[share] ${text}`);\n if (typeof window !== \"undefined\") window.alert(text);\n } else console.info(`[share] ${text}`);\n },\n useCurrentUserId: useDefaultCurrentUserId,\n useOrganizations: useDefaultOrganizations,\n useUserConnections: useDefaultConnections,\n confirm: (o) => kitConfirm(o),\n CopyButtons: DefaultCopyButtons,\n csvExportItem: () => {\n announceStandIn(\"csvExportItem\");\n return null;\n },\n jsonExportItem: () => {\n announceStandIn(\"jsonExportItem\");\n return null;\n },\n usePageCapture: () => {\n announceStandIn(\"usePageCapture\");\n return undefined;\n },\n dialogCapture: (input) => input,\n PageCaptureButton: DefaultPageCaptureButton,\n ErrorAlchemyMenu: DefaultErrorMenu,\n InfoHint: DefaultInfoHint,\n EntityDoorControls: DefaultEntityDoorControls,\n EntityRef: DefaultEntityRef,\n UserAvatarDisplay: DefaultUserAvatar,\n ConnectionsReadNotice: DefaultConnectionsNotice,\n UserSearchField: DefaultUserSearchField,\n vaultIdentity: null,\n humanLines: (...args: unknown[]) => args.flat().filter(Boolean).map(String).join(\"\\n\"),\n usePortalContainer: () => undefined,\n};\n\nlet ui: ShareSheetUi = DEFAULTS;\n\n/** Merge host UI over the defaults (boot-time; tests may call it again). */\nexport function configureShareSheetUi(next: Partial<ShareSheetUi>): void {\n ui = { ...ui, ...next };\n}\n\nexport function shareSheetUi(): ShareSheetUi {\n return ui;\n}\n\n/* ─── the names the sheet's files import (web parity) ─────────────────────── */\n\nexport function useToast() {\n return { toast: (o: ShareSheetToastOptions) => ui.toast(o) };\n}\nexport const toast = {\n success: (message: string) => ui.toast({ title: message }),\n error: (message: string) => ui.toast({ title: message, variant: \"destructive\" }),\n info: (message: string) => ui.toast({ title: message }),\n};\nexport function shareCopyNotify(message: string, kind: \"success\" | \"error\"): void {\n ui.toast({ title: message, ...(kind === \"error\" ? { variant: \"destructive\" } : {}) });\n}\nexport const confirm = (options: ConfirmOptions) => ui.confirm(options);\nexport const useCurrentUserId = () => ui.useCurrentUserId();\nexport const useNavTree = () => ({ orgs: ui.useOrganizations() });\nexport const useOrganizationsToCreateIn = () => ({ orgs: ui.useOrganizations() });\nexport const useUserConnections = (options: { organizationId?: string }) => ui.useUserConnections(options);\nexport type ConnectionUser = ShareSheetConnection;\nexport type UserSearchCandidate = {\n id: string;\n email: string | null;\n displayName: string | null;\n avatarUrl: string | null;\n organizations?: string[] | undefined;\n source?: string | undefined;\n [key: string]: unknown;\n};\nexport const usePageCapture = (build: () => unknown, options?: { enabled?: boolean }) => ui.usePageCapture(build, options);\nexport const dialogCapture = (input: unknown) => ui.dialogCapture(input);\nexport const csvExportItem = (...args: any[]) => ui.csvExportItem(...args);\nexport const jsonExportItem = (...args: any[]) => ui.jsonExportItem(...args);\nexport const humanLines = (...args: any[]) => ui.humanLines(...args);\nexport const CopyButtons = (p: LooseProps) => <ui.CopyButtons {...p} />;\nexport const PageCaptureButton = (p: LooseProps) => <ui.PageCaptureButton {...p} />;\nexport const ShareErrorAlchemyMenu = (p: LooseProps) => <ui.ErrorAlchemyMenu {...p} />;\nexport const InfoHint = (p: LooseProps) => <ui.InfoHint {...p} />;\nexport const ShareEntityDoorControls = (p: LooseProps) => <ui.EntityDoorControls {...p} />;\nexport const ShareEntityRef = (p: LooseProps) => <ui.EntityRef {...p} />;\nexport const UserAvatarDisplay = (p: LooseProps) => <ui.UserAvatarDisplay {...p} />;\nexport const ConnectionsReadNotice = (p: LooseProps) => <ui.ConnectionsReadNotice {...p} />;\nexport const UserSearchField = (p: LooseProps) => <ui.UserSearchField {...p} />;\nlet defaultIdentity: unknown = null;\n/** The vault identity: the host's, else one built on the sharing client's own auth session. */\nexport const usePortalContainer = () => ui.usePortalContainer();\nexport const vaultIdentity = (): any => {\n if (ui.vaultIdentity) return ui.vaultIdentity;\n announceStandIn(\"vaultIdentity\");\n if (!defaultIdentity) {\n defaultIdentity = createSupabaseIdentity(shareClientForIdentity().auth as any, {\n redirectTo: () => window.location.href,\n onDifferentPerson: async (message: string) => {\n window.alert(message);\n },\n });\n }\n return defaultIdentity;\n};\n\n/* ─── the sheet's per-tab cache (was the web's redux sharingStatus slice) ─── */\n\ninterface SharingStatusEntry {\n visibility: any;\n loading: boolean;\n error: string | null;\n}\ninterface SharingAuthorityEntry {\n isOwner: boolean;\n loading: boolean;\n error: string | null;\n}\ninterface SharingStatusState {\n sharingStatus: { byKey: Record<string, SharingStatusEntry>; authorityByKey: Record<string, SharingAuthorityEntry> };\n}\ntype Action = { type: string; payload: any };\n\nlet state: SharingStatusState = { sharingStatus: { byKey: {}, authorityByKey: {} } };\nconst listeners = new Set<() => void>();\n\nfunction reduce(s: SharingStatusState[\"sharingStatus\"], a: Action): SharingStatusState[\"sharingStatus\"] {\n const { key } = a.payload as { key: string };\n const byKey = { ...s.byKey };\n const authorityByKey = { ...s.authorityByKey };\n switch (a.type) {\n case \"requested\":\n byKey[key] = { visibility: byKey[key]?.visibility ?? null, loading: true, error: null };\n break;\n case \"loaded\":\n byKey[key] = { visibility: a.payload.visibility, loading: false, error: null };\n break;\n case \"failed\":\n byKey[key] = { visibility: byKey[key]?.visibility ?? null, loading: false, error: a.payload.error };\n break;\n case \"authorityRequested\":\n authorityByKey[key] = { isOwner: authorityByKey[key]?.isOwner ?? false, loading: true, error: authorityByKey[key]?.error ?? null };\n break;\n case \"authorityResolved\":\n authorityByKey[key] = { isOwner: a.payload.isOwner, loading: false, error: a.payload.error };\n break;\n }\n return { byKey, authorityByKey };\n}\n\nconst store = {\n getState: () => state,\n dispatch: (a: Action) => {\n state = { sharingStatus: reduce(state.sharingStatus, a) };\n listeners.forEach((l) => l());\n return a;\n },\n};\n\nexport const useAppStore = () => store;\nexport function useAppSelector<T>(select: (s: SharingStatusState) => T): T {\n return useSyncExternalStore(\n (cb) => {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n () => select(state),\n () => select(state),\n );\n}\nexport const sharingStatusKey = (resourceType: string, resourceId: string) => `${resourceType}:${resourceId}`;\nexport const sharingStatusRequested = (payload: { key: string }): Action => ({ type: \"requested\", payload });\nexport const sharingStatusLoaded = (payload: { key: string; visibility: unknown }): Action => ({ type: \"loaded\", payload });\nexport const sharingStatusFailed = (payload: { key: string; error: string }): Action => ({ type: \"failed\", payload });\nexport const sharingAuthorityRequested = (payload: { key: string }): Action => ({ type: \"authorityRequested\", payload });\nexport const sharingAuthorityResolved = (payload: { key: string; isOwner: boolean; error: string | null }): Action => ({ type: \"authorityResolved\", payload });\nexport const selectSharingStatus = (s: SharingStatusState, key: string): SharingStatusEntry | undefined => s.sharingStatus.byKey[key];\nexport const selectSharingAuthority = (s: SharingStatusState, key: string): SharingAuthorityEntry | undefined => s.sharingStatus.authorityByKey[key];\n\n/** Test seam: forget every cached answer. */\nexport function resetShareSheetCache(): void {\n state = { sharingStatus: { byKey: {}, authorityByKey: {} } };\n listeners.forEach((l) => l());\n}\n\n/** web parity: the store-read hook the access summary used (kept per tab, re-read when stale). */\nconst storeReads = new Map<string, { data: unknown; at: number }>();\nexport function useStoreRead<T>(key: string | null, read: () => Promise<T>, options: { enabled?: boolean; staleAfterMs?: number } = {}) {\n const activeKey = options.enabled === false ? null : key;\n const kept = activeKey ? storeReads.get(activeKey) : undefined;\n const [s, setS] = useState<{ data: T | undefined; loading: boolean; error: string | null }>({\n data: kept?.data as T | undefined,\n loading: Boolean(activeKey) && !kept,\n error: null,\n });\n const refresh = useCallback(async () => {\n if (!activeKey) return;\n setS((p) => ({ ...p, loading: true }));\n try {\n const data = await read();\n storeReads.set(activeKey, { data, at: Date.now() });\n setS({ data, loading: false, error: null });\n } catch (err) {\n setS((p) => ({ data: p.data, loading: false, error: err instanceof Error ? err.message : String(err) }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey]);\n useEffect(() => {\n if (!activeKey) return;\n const k = storeReads.get(activeKey);\n const stale = !k || (options.staleAfterMs !== undefined && Date.now() - k.at > options.staleAfterMs);\n if (stale) void refresh();\n else setS({ data: k.data as T, loading: false, error: null });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey, refresh]);\n return { data: s.data, isLoading: s.loading, isError: s.error !== null, error: s.error, refresh };\n}\nexport function useRefreshWhenChanged(token: unknown, refresh: () => Promise<void>): void {\n const [first, setFirst] = useState(true);\n useEffect(() => {\n if (first) {\n setFirst(false);\n return;\n }\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [token]);\n}\n\n/** web parity: `useAppDispatch()` for the secure-delivery calls — a dispatch that hands the call back. */\nexport { passThroughDispatch } from \"@ai-matrx/sharing/core\";\nexport const useAppDispatch = () => passThroughDispatchRef;\nimport { passThroughDispatch as passThroughDispatchRef } from \"@ai-matrx/sharing/core\";\n","\"use client\";\n\nimport { appUrl, getActiveOrgId, sendShareNotice } from \"@ai-matrx/sharing/core\";\nimport { usePageCapture } from \"./host\";\nimport { dialogCapture } from \"./host\";\nimport { PageCaptureButton } from \"./host\";\nimport React, { useState } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Tabs, TabsContent } from \"@ai-matrx/design-system\";\nimport { TabsList } from \"@ai-matrx/design-system/controls\";\nimport { ShareTabsTrigger } from \"./ui/share-tabs-trigger\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport {\n Users,\n Globe,\n Mail,\n Loader2,\n CheckCircle,\n KeyRound,\n ShieldCheck,\n} from \"lucide-react\";\nimport { useSharing, useIsOwner } from \"../permissionHooks\";\nimport { useGrantableLevels } from \"./useGrantableLevels\";\nimport {\n getShareableResource,\n getResourceTypeLabel,\n getResourceSharePath,\n} from \"@ai-matrx/sharing/core\";\nimport type { ResourceType } from \"@ai-matrx/sharing/core\";\nimport { Skeleton } from \"@ai-matrx/design-system\";\nimport { AlertTriangle, Lock } from \"lucide-react\";\nimport { ShareEntityRef } from \"./host\";\nimport { PermissionsList } from \"./PermissionsList\";\nimport { AccessSummaryPanel } from \"./AccessSummaryPanel\";\nimport { ShareWithUserTab } from \"./ShareWithUserTab\";\nimport { OutsideSharePanel } from \"./OutsideSharePanel\";\nimport { shareWithOutsidePerson } from \"@ai-matrx/sharing/core\";\nimport { WhoCouldSeeOn } from \"./WhoCouldSeeOn\";\nimport { OrgAvailabilityNote } from \"./OrgAvailabilityNote\";\nimport { WhoCanSeeThis } from \"./WhoCanSeeThis\";\nimport { PublicAccessTab } from \"./PublicAccessTab\";\nimport { SecureLinkPanel } from \"./SecureLinkPanel\";\nimport { useToast } from \"./host\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\ninterface ShareModalProps {\n /** The level picker's words: \"notion\" = Full access · Edit · Comment · View. */\n levelWording?: \"roles\" | \"notion\" | undefined;\n isOpen: boolean;\n onClose: () => void;\n resourceType: ResourceType;\n resourceId: string;\n resourceName: string;\n /**\n * The organization this resource belongs to. Pass it whenever the caller knows: it scopes\n * the contact picker to that organization's members (FIX-7B), and the share's in-app\n * notification is filed there (ACCESS-FIX-18) — without it, a share from a page with no\n * organization picked raised \"Which workspace is this for?\". It is NOT used for the grant —\n * the store still resolves a record's organization off the row itself.\n */\n organizationId?: string | undefined;\n /**\n * What to CALL this thing on screen, when the caller knows better than the\n * registry does. In the unified store a Table IS a `custom.record` row, so\n * `resourceType=\"record\"` is correct and the registry's label — \"Record\" —\n * is the wrong noun for a table: the seventh-pass verdict read \"Share\n * Record\" above a table's own name. Omit it and the registry's label stands.\n */\n resourceNoun?: string | undefined;\n /**\n * OPTIONAL override. Leave it out — the modal resolves ownership itself.\n *\n * Only pass this when the caller already holds an authoritative, resolved\n * answer (e.g. it just created the row). Passing a stale or defaulted\n * `false` is what renders this dialog as a dead, empty shell for a user who\n * owns the record.\n */\n isOwner?: boolean | undefined;\n /**\n * SHARING WITH SOMEBODY OUTSIDE THE ORGANIZATION (lane SHARE-OUT, 21 September).\n *\n * Pass this when the subject is a TABLE in the unified record store and the\n * caller knows which organization it belongs to. The Users tab then carries\n * the outside lane: invite by email, \"invited, not yet joined\", resend and\n * revoke. Leave it out and the dialog is exactly what it was — this is not a\n * capability every resource type has, and a panel that could not work is a\n * panel that must not be drawn.\n *\n * It is NOT a second share surface: the grant it produces is an ordinary\n * `iam.permissions` row read by the same ladder, and the pending state is an\n * `iam.invitations` row, the platform's one invitation primitive.\n */\n outsideShare?: { organizationId: string; tableId: string };\n}\n\n/**\n * ShareModal - Main sharing interface\n *\n * Generic modal that works with ANY resource type.\n * Provides tabs for sharing with people or making public. A share names a PERSON, never an\n * organization (SHARE-PEOPLE-ONLY, 2026-09-25): the old Organizations tab is gone, and \"Add\n * everyone in <organization>\" inside the People tab names each current member instead.\n *\n * This is the ONE sharing dialog in the app. Do not build a feature-specific\n * variant — extend this one. It self-resolves ownership, so every call site is\n * a three-prop drop-in.\n *\n * @example\n * <ShareModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * resourceType=\"workflow\"\n * resourceId={workflowId}\n * resourceName=\"My Workflow\"\n * />\n */\nexport function ShareModal({\n levelWording = \"roles\",\n isOpen,\n onClose,\n resourceType,\n resourceId,\n resourceName,\n organizationId,\n resourceNoun,\n isOwner: isOwnerOverride,\n outsideShare,\n}: ShareModalProps) {\n const [activeTab, setActiveTab] = useState<\n \"users\" | \"public\" | \"secure\" | \"access\"\n >(\"users\");\n // How many people outside this organization are invited and have not joined.\n // Reported UP by the panel that draws them, so the grant list's empty state\n // cannot say \"Not shared with anyone\" over one of their rows (FIX-10C F13).\n const [outsidePending, setOutsidePending] = useState(0);\n const [emailingLink, setEmailingLink] = useState(false);\n const [emailSent, setEmailSent] = useState(false);\n const { toast } = useToast();\n\n const getShareUrl = (): string | null => {\n const path = getResourceSharePath(resourceType, resourceId);\n if (!path) return null;\n const baseUrl = appUrl();\n return `${baseUrl}${path}`;\n };\n\n // Email link to self\n const handleEmailLink = async () => {\n const shareUrl = getShareUrl();\n if (!shareUrl) {\n // Never email a link we can't build — a broken URL in someone's inbox is\n // the worst dead end we can ship.\n toast({\n title: \"No shareable link for this item yet\",\n description: `\"${getResourceTypeLabel(resourceType)}\" has no page to open. Sharing access still works; only the emailed link is unavailable.`,\n variant: \"destructive\",\n });\n return;\n }\n setEmailingLink(true);\n try {\n const data = await sendShareNotice(\"/sharing/email-link\", {\n resourceType: getResourceTypeLabel(resourceType),\n resourceName,\n shareUrl,\n // object-org-exempt: the saved-link notice is filed with the shared object, else where the person works\n organizationId: organizationId ?? getActiveOrgId(), // org-filter: write-target for the person's own saved-link notice\n });\n\n if (data.success) {\n setEmailSent(true);\n toast({\n title: \"Email sent\",\n description: \"Link has been emailed to you\",\n });\n setTimeout(() => setEmailSent(false), 3000);\n } else {\n toast({\n title: \"Failed to send email\",\n description: data.msg || \"Please try again\",\n variant: \"destructive\",\n });\n }\n } catch (error) {\n toast({\n title: \"Error\",\n description: \"Failed to send email\",\n variant: \"destructive\",\n });\n } finally {\n setEmailingLink(false);\n }\n };\n\n // Ownership is resolved HERE, not trusted from a prop. Callers that pass a\n // defaulted/stale `false` used to silently produce a dialog with no controls.\n const {\n isOwner: resolvedIsOwner,\n loading: ownerLoading,\n error: ownerError,\n } = useIsOwner(resourceType, resourceId);\n\n const hasOverride = typeof isOwnerOverride === \"boolean\";\n const isOwner = hasOverride ? isOwnerOverride : resolvedIsOwner;\n const resolvingOwner = !hasOverride && ownerLoading;\n\n // The alchemy capture (lane ALCHEMY-BUTTON): while open, the dialog IS what the person sees.\n usePageCapture(\n () =>\n dialogCapture({\n title: `Share ${resourceName ?? resourceType}`,\n route: typeof window !== \"undefined\" ? window.location.pathname : \"\",\n dialog: \"Share\",\n subject: { id: resourceId, name: resourceName ?? null },\n selection: {\n \"Resource type\": resourceType,\n Organization: { id: organizationId ?? null, name: null },\n Tab: activeTab,\n \"Outside sharing offered\": outsideShare ? \"yes\" : \"no\",\n },\n errors: [ownerError ? `Ownership could not be read: ${String(ownerError)}` : null],\n sections: [\n {\n id: \"share-state\",\n title: \"Share dialog state\",\n role: \"data\",\n value: {\n is_owner: isOwner,\n resolving_owner: resolvingOwner,\n outside_pending_invitations: outsidePending,\n share_link: getResourceSharePath(resourceType, resourceId),\n outside_share: outsideShare ?? null,\n },\n },\n ],\n }),\n { enabled: isOpen },\n );\n // ONE-LADDER: Edit may share inside the organization, so the dialog opens for anyone the doors would\n // let give at least one level, and offers only those levels (iam.may_grant_as, via the thin door).\n const grantable = useGrantableLevels(resourceType, resourceId, isOpen);\n const canShare = isOwner || grantable.maySharePeople;\n const ownerUnknown = !hasOverride && !ownerLoading && ownerError !== null;\n\n // A resource type missing from the registry can never share — say so loudly\n // rather than rendering a dialog whose every control silently no-ops.\n const registryEntry = resourceType\n ? getShareableResource(resourceType)\n : undefined;\n const configError = !resourceId\n ? \"No resource id was supplied to the share dialog.\"\n : !registryEntry\n ? `\"${resourceType}\" is not a registered shareable resource. Add it to shareable_resource_registry.`\n : null;\n\n const {\n permissions,\n isPublic: resourceIsPublic,\n shownTo,\n childRecord,\n setShownTo,\n organizationDefault,\n whoCanSee,\n setWhoCanSee,\n loading,\n error,\n shareWithUser,\n makePublic,\n revokeAccess,\n updateLevel,\n refresh,\n homeOrganizationId,\n } = useSharing(\n resourceType,\n resourceId,\n isOpen && !configError,\n resourceName,\n // The object's organization, as the page that opened this resolved it — the share's\n // notification is filed there and never asks which workspace this is for.\n organizationId ?? null,\n );\n\n const contactsOrganizationId = organizationId ?? homeOrganizationId ?? undefined;\n\n // Filter permissions by type for each tab\n const userPermissions = permissions.filter((p) => p.grantedToUserId);\n const publicPermission = permissions.find((p) => p.isPublic);\n\n const resourceLabel = resourceNoun ?? getResourceTypeLabel(resourceType);\n\n /**\n * Shown instead of the grant forms when the caller cannot manage sharing.\n * An empty area with no explanation reads as a broken dialog — say WHY.\n */\n const manageBlockedNotice = ownerUnknown ? (\n <div className=\"p-3 rounded-lg border border-destructive/20 bg-destructive/10 flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-destructive\">\n Couldn't confirm whether you may change sharing on this{\" \"}\n {resourceLabel.toLowerCase()}\n </p>\n <p className=\"text-xs text-destructive/80 mt-0.5\">{ownerError} <ShareErrorAlchemyMenu error={ownerError} /></p>\n </div>\n </div>\n ) : (\n <div className=\"p-3 rounded-lg border bg-muted/30 flex items-start gap-2\">\n <Lock className=\"h-4 w-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium\">\n You need Full access on this {resourceLabel.toLowerCase()} to change who can see it\n </p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Deciding who else may is what Full access means (View < Comment <\n Edit < Full access). Ask whoever has it, or an owner of the organization. The Access\n tab still shows you everyone who can reach this and why.\n </p>\n </div>\n </div>\n );\n\n // The add form is for anyone who may give at least one level; below that the door's own sentence says why.\n const shareBlockedNotice = grantable.loading ? null : (\n <div className=\"p-3 rounded-lg border bg-muted/30 flex items-start gap-2\">\n <Lock className=\"h-4 w-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <p className=\"text-sm\">\n {grantable.error ?? grantable.levels.viewer ?? \"You need Edit or Full access on this to share it.\"}\n </p>\n </div>\n );\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl max-h-[90dvh] flex flex-col\">\n <DialogHeader className=\"flex-shrink-0\">\n <div className=\"flex items-start justify-between gap-2 pr-10\">\n <div className=\"flex-1 min-w-0\">\n <DialogTitle className=\"flex items-center gap-1.5\">\n Share {resourceLabel}\n <PageCaptureButton size=\"xs\" />\n </DialogTitle>\n {/* THE DOOR LAW: the most-reused share surface in the app named\n the record and gave no way to reach it — while already\n computing its canonical path for the share URL. `ResourceType`\n IS the entity-token vocabulary (getResourceSharePath resolves\n through resolveEntityDoors), so EntityRef also gets the peek\n and the new tab. A null path falls through to `undefined`,\n which defers to the registry and correctly ends in no door for\n a type that genuinely has no route. */}\n <DialogDescription asChild>\n <div className=\"text-sm text-muted-foreground\">\n <ShareEntityRef\n token={resourceType}\n id={resourceId}\n name={resourceName}\n href={\n getResourceSharePath(resourceType, resourceId) ??\n undefined\n }\n showIcon={false}\n />\n </div>\n </DialogDescription>\n </div>\n <Button\n icon={emailingLink ? (\n <Loader2 className=\"animate-spin\" />\n ) : emailSent ? (\n <CheckCircle className=\"text-green-500\" />\n ) : (\n <Mail />\n )}\n variant=\"outline\"\n onClick={handleEmailLink}\n disabled={emailingLink}\n className=\"flex-shrink-0\"\n >\n <span className=\"ml-1.5 hidden sm:inline\">\n {emailSent ? \"Sent!\" : \"Email link\"}\n </span>\n </Button>\n </div>\n </DialogHeader>\n\n {/* Misconfigured call site — never render dead controls. */}\n {configError && (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-2 py-10 px-6 text-center\">\n <AlertTriangle className=\"h-8 w-8 text-destructive\" />\n <p className=\"text-sm font-medium\">Sharing is unavailable</p>\n <p className=\"text-xs text-muted-foreground max-w-sm\">\n {configError}\n <ShareErrorAlchemyMenu error={configError} />\n </p>\n </div>\n )}\n\n {/* Resolving ownership — show a skeleton, never the non-owner view. */}\n {!configError && resolvingOwner && (\n <div className=\"flex-1 space-y-3 py-4\" aria-busy=\"true\">\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-24 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n )}\n\n {!configError && !resolvingOwner && (\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as typeof activeTab)}\n className=\"flex-1 flex flex-col min-h-0\"\n >\n {/* phone-ok: labels are hidden below sm, icon-only tabs on phone */}\n <TabsList fill className=\"flex-shrink-0\">\n <ShareTabsTrigger value=\"users\">\n <Users className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Users</span>\n {userPermissions.length > 0 && (\n <span className=\"ml-1 px-1.5 py-0.5 text-xs bg-primary/10 rounded-full\">\n {userPermissions.length}\n </span>\n )}\n </ShareTabsTrigger>\n <ShareTabsTrigger value=\"public\">\n <Globe className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Anyone link</span>\n {publicPermission && (\n <span className=\"ml-1 px-1.5 py-0.5 text-xs bg-green-500/10 rounded-full\">\n •\n </span>\n )}\n </ShareTabsTrigger>\n {/* SECURE LINK — CODE REQUIRED (access ladder, secure delivery): the\n third way to share, for anything that must not travel in a plain\n link — a single-use link on one channel, a code on the other. */}\n <ShareTabsTrigger value=\"secure\">\n <ShieldCheck className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Secure link</span>\n </ShareTabsTrigger>\n {/* WHO CAN SEE THIS, AND WHY. The three tabs above list the GRANTS\n this dialog writes; they are only one of the six ways access is\n actually conferred. `AccessSummaryPanel` is the canonical\n answer — owner, grant, organization default, and the container\n that carries it — and it belongs beside the controls that\n change them rather than on some other screen. */}\n <ShareTabsTrigger value=\"access\">\n <KeyRound className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Access</span>\n </ShareTabsTrigger>\n </TabsList>\n\n <div className=\"dialog-scroll-clear-floating flex-1 mt-3 min-h-0 overflow-y-auto\">\n <TabsContent value=\"users\" className=\"mt-0 space-y-3\">\n {/* WHO CAN SEE THIS (SHARE-LANE-CONTROL): the lane, above the people it limits. */}\n <WhoCanSeeThis\n whoCanSee={whoCanSee}\n canChange={canShare}\n onChoose={setWhoCanSee}\n row={{\n resourceType,\n resourceId,\n shownTo,\n isPublic: resourceIsPublic,\n childRecord,\n // A whole Table is a `record` too and is never published to the web (no page\n // of its own; only its rows have one): no switch is drawn for it.\n ...(resourceType === \"record\" && resourceNoun === \"Table\"\n ? { publishable: false }\n : {}),\n onSetShownTo: setShownTo,\n onPublish: () => makePublic(),\n onStopPublishing: () => revokeAccess({ isPublic: true }),\n }}\n />\n {/* Current user permissions */}\n <div>\n <h3 className=\"text-sm font-medium mb-2\">Current Access</h3>\n {/* Only the owner (and Admins) can read the grant list: an empty list in any\n other seat — an editor who may share included — is \"cannot see\", never\n \"Not shared with anyone\" (that seat itself holds a grant). */}\n {!isOwner && !loading && userPermissions.length === 0 ? (\n <p className=\"rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n The list of people with access is visible to the owner and Admins.\n </p>\n ) : (\n <PermissionsList\n permissions={userPermissions}\n isOwner={isOwner}\n onUpdateLevel={updateLevel}\n onRevoke={revokeAccess}\n loading={loading}\n // The outside panel at the bottom of this same tab draws\n // invited-but-not-joined rows; without this the empty state\n // above them read \"Not shared with anyone\" (FIX-10C F13).\n alsoPending={{\n count: outsidePending,\n one: \"person outside this organization\",\n many: \"people outside this organization\",\n }}\n />\n )}\n <OrgAvailabilityNote\n permissions={permissions.filter(\n (p) => p.grantedToOrganizationId,\n )}\n organizationDefault={organizationDefault}\n />\n </div>\n\n {/* Add user form */}\n {canShare ? (\n <ShareWithUserTab\n levelWording={levelWording}\n grantable={grantable}\n onShare={shareWithUser}\n onSuccess={refresh}\n resourceType={resourceType}\n resourceId={resourceId}\n // The people offered are the THING'S organization: the opener's answer, else the\n // row's own (never every organization the viewer is in — that sweep read one\n // roster per membership, one after another, and never finished for a member\n // of sixty organizations; PB-07, 2026-10-01).\n {...(contactsOrganizationId ? { organizationId: contactsOrganizationId } : {})}\n alreadySharedUserIds={userPermissions\n .map((p) => p.grantedToUserId)\n .filter((id): id is string => !!id)}\n // A custom TABLE: a listed member may sit outside the table's own\n // organization, so each one goes through the outside door, which grants an\n // existing account outright whether inside or out.\n {...(outsideShare\n ? {\n grantEveryonePerson: async (person, level) => {\n try {\n const answer = await shareWithOutsidePerson(\n outsideShare.organizationId,\n outsideShare.tableId,\n person.email,\n level,\n );\n return answer.granted\n ? { success: true, message: answer.say }\n : {\n success: false,\n error:\n answer.say ||\n \"Invited, not yet given access\",\n };\n } catch (err: unknown) {\n return {\n success: false,\n error:\n err instanceof Error\n ? err.message\n : \"Not shared\",\n };\n }\n },\n }\n : {})}\n />\n ) : (\n shareBlockedNotice\n )}\n\n {/* THE ROUTE FROM THE REFUSAL TO THE REMEDY (lane SHARE-OUT).\n The people picker above offers this organization's members\n and nobody else, and the store refuses an outsider by name.\n This is where that refusal now leads: one section, drawn only\n for a table in the record store, showing exactly the controls\n the store says this person may use. It is shown to non-owners\n too — the panel itself says who can invite, which is more use\n than hiding the fact that the capability exists. */}\n {outsideShare ? (\n <OutsideSharePanel\n organizationId={outsideShare.organizationId}\n tableId={outsideShare.tableId}\n tableName={resourceName}\n onPendingChange={setOutsidePending}\n onGranted={refresh}\n />\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"access\" className=\"mt-0\">\n <AccessSummaryPanel\n entityType={resourceType as Parameters<typeof AccessSummaryPanel>[0][\"entityType\"]}\n entityId={resourceId}\n enabled={activeTab === \"access\"}\n refreshToken={permissions\n .map((p) => `${p.id}:${p.permissionLevel}`)\n .join(\"|\")}\n />\n {resourceType === \"record\" && isOwner ? <WhoCouldSeeOn recordId={resourceId} /> : null}\n </TabsContent>\n\n <TabsContent value=\"secure\" className=\"mt-0\">\n {isOwner ? (\n <SecureLinkPanel\n resourceType={resourceType}\n resourceId={resourceId}\n resourceName={resourceName}\n />\n ) : (\n manageBlockedNotice\n )}\n </TabsContent>\n\n <TabsContent value=\"public\" className=\"mt-0\">\n <PublicAccessTab\n publicPermission={publicPermission}\n isOwner={isOwner}\n resourceType={resourceType}\n resourceId={resourceId}\n resourceName={resourceName}\n />\n </TabsContent>\n </div>\n </Tabs>\n )}\n\n {error && (\n <div className=\"mt-3 p-2.5 bg-destructive/10 border border-destructive/20 rounded-md flex-shrink-0\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <ShareErrorAlchemyMenu error={error} />\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the Dialog implementation lives in\n * `@ai-matrx/design-system`, which is where every hardening this file used to\n * carry now lives, verbatim and tested:\n *\n * - the root renders unconditionally (no hydration mount gate);\n * - the desktop card is clamped to `85dvh` and scrolls inside itself, and\n * `DialogFooter` is sticky, so the primary action is always pressable;\n * - on mobile the SAME dialog becomes a bottom sheet, with the sheet geometry\n * re-asserted after the caller's className;\n * - an untitled dialog gets a visually-hidden title instead of a warning, and\n * `aria-describedby` is dropped rather than pointing at nothing;\n * - `DialogContent` provides the portal container to its own children, so a\n * popover or menu opened inside stays in the scroll shard.\n *\n * The popout wiring this file used to do by hand is now the package's\n * `PortalContainerProvider` seam, fed by summon's `PopoutShell`\n * (`@ai-matrx/summon/window`). `useDialogContainer` still resolves here for\n * `hooks/use-nested-portal-container.ts`.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n useDialogContainer,\n} from \"@ai-matrx/design-system\";\nexport type { DialogContentProps } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * The share sheet's tab trigger: the design-system controls trigger plus ONE\n * behavior the primitive lacks — a tab activates on `click`, not only on\n * `mousedown` (2026-09-12).\n *\n * Radix's `TabsTrigger` selects from `mousedown`, `focus` (automatic\n * activation) and Enter/Space. A bare `click` with no mouse sequence in front\n * of it (script or extension `element.click()`, a screen reader's \"perform\n * default action\", a driver that synthesises a click) does nothing: the\n * trigger reports `aria-selected=\"false\"` and swallows the activation. The\n * fix uses the primitive's own path: a click focuses the tab, as a real\n * browser click already does, and automatic activation then selects it. Under\n * a real mouse this is a no-op; under `activationMode=\"manual\"` selection\n * stays with Enter/Space.\n */\n\nimport * as React from \"react\";\nimport { TabsTrigger } from \"@ai-matrx/design-system/controls\";\n\ntype TriggerProps = React.ComponentPropsWithoutRef<typeof TabsTrigger>;\n\nfunction focusOnClick(onClick: TriggerProps[\"onClick\"]): TriggerProps[\"onClick\"] {\n return (event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const trigger = event.currentTarget;\n if (trigger.disabled) return;\n if (document.activeElement !== trigger) trigger.focus();\n };\n}\n\nexport const ShareTabsTrigger = React.forwardRef<React.ElementRef<typeof TabsTrigger>, TriggerProps>(\n ({ onClick, ...props }, ref) => <TabsTrigger {...props} ref={ref} onClick={focusOnClick(onClick)} />,\n);\nShareTabsTrigger.displayName = \"ShareTabsTrigger\";\n","/**\n * Permission Hooks\n *\n * React hooks for working with permissions in components.\n * These hooks provide reactive state management for permissions.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport { useAppSelector, useAppStore } from \"./sheet/host\";\nimport {\n selectSharingAuthority,\n selectSharingStatus,\n sharingAuthorityRequested,\n sharingAuthorityResolved,\n sharingStatusFailed,\n sharingStatusKey,\n sharingStatusLoaded,\n sharingStatusRequested,\n} from \"./sheet/host\";\nimport {\n Permission,\n PermissionWithDetails,\n ResourceType,\n PermissionLevel,\n CheckPermissionOptions,\n ShareActionResult,\n PermissionCheckResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n listPermissions,\n getResourcePermissions,\n checkPermission,\n resolveResourceOwnership,\n resolveSharingAuthority,\n shareWithUser,\n makePublic,\n revokeAccess,\n revokeOrgAccess,\n updatePermissionLevel,\n getSharedWithMe,\n getResourceVisibility,\n setResourceShownTo,\n setStoreLane,\n type LaneChoice,\n type ResourceVisibility,\n type WhoCanSee,\n} from \"@ai-matrx/sharing/core\";\nimport type { ShownTo } from \"@ai-matrx/sharing/core\";\n\n// ============================================================================\n// Permission Listing Hooks\n// ============================================================================\n\n/**\n * Hook to get all permissions for a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Permissions, loading state, and refresh function\n */\nexport function usePermissions(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n) {\n const [permissions, setPermissions] = useState<PermissionWithDetails[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPermissions = useCallback(async () => {\n if (!resourceType || !resourceId || !enabled) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const data = await listPermissions(resourceType, resourceId);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching permissions:\", err);\n setError(extractErrorMessage(err) || \"Failed to fetch permissions\");\n } finally {\n setLoading(false);\n }\n }, [resourceType, resourceId, enabled]);\n\n useEffect(() => {\n if (enabled) {\n fetchPermissions();\n }\n }, [fetchPermissions, enabled]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchPermissions,\n };\n}\n\n/**\n * Hook to get permissions with user/org details\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Permissions with details, loading state, and refresh function\n */\nexport function useResourcePermissions(\n resourceType: ResourceType,\n resourceId: string,\n) {\n const [permissions, setPermissions] = useState<PermissionWithDetails[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPermissions = useCallback(async () => {\n if (!resourceType || !resourceId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const data = await getResourcePermissions(resourceType, resourceId);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching resource permissions:\", err);\n setError(\n extractErrorMessage(err) || \"Failed to fetch resource permissions\",\n );\n } finally {\n setLoading(false);\n }\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n fetchPermissions();\n }, [fetchPermissions]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchPermissions,\n };\n}\n\n// ============================================================================\n// Permission Check Hooks\n// ============================================================================\n\n/**\n * Hook to check if current user has permission for a resource\n * @param options Check options\n * @returns Permission check result and loading state\n */\nexport function usePermissionCheck(options: CheckPermissionOptions) {\n const [result, setResult] = useState<PermissionCheckResult>({\n hasAccess: false,\n isOwner: false,\n });\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const check = async () => {\n setLoading(true);\n const checkResult = await checkPermission(options);\n setResult(checkResult);\n setLoading(false);\n };\n\n if (options.resourceType && options.resourceId) {\n check();\n }\n }, [options.resourceType, options.resourceId, options.requiredLevel]);\n\n return {\n ...result,\n loading,\n };\n}\n\n/**\n * Hook to check if current user can edit a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Whether user can edit and loading state\n */\nexport function useCanEdit(resourceType: ResourceType, resourceId: string) {\n const { hasAccess, loading } = usePermissionCheck({\n resourceType,\n resourceId,\n requiredLevel: \"editor\",\n });\n\n return {\n canEdit: hasAccess,\n loading,\n };\n}\n\n/**\n * Hook to check if current user can delete/admin a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Whether user has admin access and loading state\n */\nexport function useCanAdmin(resourceType: ResourceType, resourceId: string) {\n const { hasAccess, loading } = usePermissionCheck({\n resourceType,\n resourceId,\n requiredLevel: \"admin\",\n });\n\n return {\n canAdmin: hasAccess,\n loading,\n };\n}\n\n/**\n * Hook to check whether the current user MAY DECIDE WHO ELSE SEES a resource.\n *\n * It kept its name because every call site means \"may this person manage\n * sharing?\" and none of them meant \"did this person create the row\". Since\n * 2026-09-19 (lane SHARE) it asks the database's own `may_manage_sharing`\n * predicate — the Owner rung OR the `admin` rung of VIS-17's one ladder, the\n * same question the six sharing RPCs enforce — instead of reading `created_by`\n * from the resource table. Before that an `admin` on a thing was shown a\n * read-only dialog and an empty grant list, and any resource whose table\n * carries no client SELECT grant (the whole record store) could not be asked at\n * all.\n *\n * Returns three distinct states — `loading` (still resolving), `error`\n * (could NOT be determined), and `isOwner` — because collapsing them into one\n * boolean is what makes owner-gated UI render as if the user were a stranger\n * to their own record. Never gate a surface on `!isOwner` alone; check\n * `loading` and `error` first.\n *\n * @param resourceType Resource type\n * @param resourceId Resource ID\n */\nexport function useIsOwner(resourceType: ResourceType, resourceId: string) {\n const store = useAppStore();\n const key = sharingStatusKey(resourceType, resourceId);\n const entry = useAppSelector((state) => selectSharingAuthority(state, key));\n const asked = Boolean(resourceType && resourceId);\n\n // Asked once per record per tab: a mount (a woken or remounted share\n // control) reads the answer from the store; only a record nobody in this tab\n // has asked about yet reaches the database.\n const known = entry !== undefined;\n useEffect(() => {\n if (known || !asked) return;\n // Another control of the same record may have asked a moment ago.\n if (selectSharingAuthority(store.getState(), key)) return;\n store.dispatch(sharingAuthorityRequested({ key }));\n void resolveSharingAuthority(resourceType, resourceId).then((result) => {\n store.dispatch(sharingAuthorityResolved({ key, isOwner: result.isOwner, error: result.error }));\n });\n }, [known, asked, key]);\n\n if (!asked) return { isOwner: false, loading: false, error: null };\n return {\n isOwner: entry?.isOwner ?? false,\n loading: entry ? entry.loading : true,\n error: entry?.error ?? null,\n };\n}\n\n// ============================================================================\n// Sharing Action Hooks\n// ============================================================================\n\n/**\n * Hook for sharing operations\n * Provides functions to share, revoke, and update permissions\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Sharing functions and state\n */\nexport function useSharing(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n resourceName?: string | undefined,\n /**\n * The organization the object lives in, from the page that opened the dialog (its own\n * resolver). Carried to the share's in-app notification so no action on an object ever asks\n * which workspace it is for (ACCESS-FIX-18).\n */\n organizationId?: string | null | undefined,\n) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [rowState, setRowState] = useState<ResourceVisibility>({\n isPublic: false,\n });\n const { permissions, refresh: refreshPermissions } = usePermissions(\n resourceType,\n resourceId,\n enabled,\n );\n\n const refreshRowState = useCallback(async () => {\n if (!resourceType || !resourceId || !enabled) return;\n try {\n const v = await getResourceVisibility(resourceType, resourceId);\n setRowState(v);\n } catch (err) {\n console.error(\"Error fetching the record's row controls:\", err);\n setError(extractErrorMessage(err));\n }\n }, [resourceType, resourceId, enabled]);\n\n const refresh = useCallback(async () => {\n await Promise.all([refreshPermissions(), refreshRowState()]);\n }, [refreshPermissions, refreshRowState]);\n\n useEffect(() => {\n if (enabled) {\n void refreshRowState();\n }\n }, [enabled, refreshRowState]);\n\n const handleShareWithUser = useCallback(\n async (userId: string, permissionLevel: PermissionLevel) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await shareWithUser({\n resourceType,\n resourceId,\n userId,\n permissionLevel,\n resourceName,\n organizationId: organizationId ?? null,\n });\n\n if (!result.success) {\n setError(result.error || \"Failed to share\");\n return result;\n }\n\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to share with user\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, resourceName, organizationId, refresh],\n );\n\n const handleMakePublic = useCallback(\n async (permissionLevel: PermissionLevel = \"viewer\") => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await makePublic({\n resourceType,\n resourceId,\n permissionLevel,\n });\n\n if (!result.success) {\n setError(result.error || \"Failed to make public\");\n return result;\n }\n\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to make public\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleRevokeAccess = useCallback(\n async (options: {\n userId?: string | undefined;\n organizationId?: string | undefined;\n isPublic?: boolean | undefined;\n }) => {\n setLoading(true);\n setError(null);\n try {\n const result = await revokeAccess({\n resourceType,\n resourceId,\n ...options,\n });\n if (!result.success) {\n setError(result.error || \"Failed to revoke access\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to revoke access\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleRevokeOrgAccess = useCallback(\n async (organizationId: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = await revokeOrgAccess(\n resourceType,\n resourceId,\n organizationId,\n );\n if (!result.success) {\n setError(result.error || \"Failed to revoke org access\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to revoke org access\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleUpdateLevel = useCallback(\n async (\n options: { userId?: string | undefined; organizationId?: string | undefined },\n newLevel: PermissionLevel,\n ) => {\n setLoading(true);\n setError(null);\n try {\n const result = await updatePermissionLevel({\n resourceType,\n resourceId,\n ...options,\n newLevel,\n });\n if (!result.success) {\n setError(result.error || \"Failed to update permission\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to update permission\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n /** \"Shown to\" — which lists show it; never a lock (access ladder Words table). */\n const handleSetShownTo = useCallback(\n async (next: ShownTo | null) => {\n setLoading(true);\n setError(null);\n try {\n const result = await setResourceShownTo(resourceType, resourceId, next);\n if (!result.success) {\n setError(result.error || 'Could not change \"Shown to\"');\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || 'Could not change \"Shown to\"';\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n /**\n * WHO CAN SEE THIS (lane SHARE-LANE-CONTROL) — the record store's lane door only. Every other\n * kind: null, and the control is absent; its row controls are \"Shown to\" and \"Published to the\n * web\" instead.\n */\n const whoCanSee: WhoCanSee | null = rowState.whoCanSee\n ? {\n ...rowState.whoCanSee,\n organizationId: rowState.whoCanSee.organizationId ?? organizationId ?? null,\n }\n : null;\n\n const handleSetWhoCanSee = useCallback(\n async (choice: LaneChoice): Promise<ShareActionResult> => {\n if (!whoCanSee) {\n return { success: false, error: \"This item has no lane to choose.\" };\n }\n if (!whoCanSee.organizationId) {\n return {\n success: false,\n error: \"This item's organization could not be read, so its lane cannot be changed.\",\n };\n }\n setLoading(true);\n setError(null);\n try {\n const result = await setStoreLane(whoCanSee.organizationId, resourceId, choice);\n if (!result.success) {\n setError(result.error || \"Failed to change who can see this\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to change who can see this\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [whoCanSee, resourceId, refresh],\n );\n\n return {\n permissions,\n /** Published to the web (or the card's own publish). */\n isPublic: rowState.isPublic,\n /**\n * \"Shown to\" — undefined when the type does not carry it (Private, Confidential, child, or a\n * table without the column); null when the type's default applies.\n */\n shownTo: rowState.shownTo,\n /** A child record (a file attached to a chat): no row control of its own. */\n childRecord: rowState.childRecord === true,\n /** Membership alone reaches it — said under Current Access. The record store's door names it. */\n organizationDefault: rowState.organizationDefault ?? null,\n whoCanSee,\n /** The thing's own organization, read off its row; null when unknown. */\n homeOrganizationId: rowState.homeOrganizationId ?? null,\n setWhoCanSee: handleSetWhoCanSee,\n loading,\n error,\n shareWithUser: handleShareWithUser,\n makePublic: handleMakePublic,\n setShownTo: handleSetShownTo,\n revokeAccess: handleRevokeAccess,\n revokeOrgAccess: handleRevokeOrgAccess,\n updateLevel: handleUpdateLevel,\n refresh,\n refreshRowState,\n };\n}\n\n// ============================================================================\n// Shared Resources Hook\n// ============================================================================\n\n/**\n * Hook to get resources shared with current user\n * @param resourceType Optional filter by resource type\n * @returns Shared permissions and loading state\n */\nexport function useSharedWithMe(resourceType?: ResourceType | undefined) {\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchShared = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await getSharedWithMe(resourceType);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching shared resources:\", err);\n setError(extractErrorMessage(err) || \"Failed to fetch shared resources\");\n } finally {\n setLoading(false);\n }\n }, [resourceType]);\n\n useEffect(() => {\n fetchShared();\n }, [fetchShared]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchShared,\n };\n}\n\n// ============================================================================\n// Utility Hooks\n// ============================================================================\n\n/**\n * Hook to get sharing status summary for a resource.\n *\n * Intentionally lightweight — only fetches is_public from the resource row.\n * Safe to call from list-item components like ShareButton (single cheap query).\n *\n * Does NOT call get_resource_permissions (the expensive SECURITY DEFINER RPC).\n * Full permission details are loaded inside useSharing() when the modal opens.\n */\nexport function useSharingStatus(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n) {\n const store = useAppStore();\n const key = sharingStatusKey(resourceType, resourceId);\n const entry = useAppSelector((state) => selectSharingStatus(state, key));\n\n // Read the record's visibility (once per record per tab, or on purpose).\n const refresh = async () => {\n if (!resourceType || !resourceId || !enabled) return;\n store.dispatch(sharingStatusRequested({ key }));\n try {\n const v = await getResourceVisibility(resourceType, resourceId);\n store.dispatch(sharingStatusLoaded({ key, visibility: v }));\n } catch (err) {\n console.error(\"Error fetching sharing status:\", err);\n store.dispatch(sharingStatusFailed({ key, error: extractErrorMessage(err) }));\n }\n };\n\n // A mount reads the record's answer from the store; only a record nobody in\n // this tab has read yet is fetched (a woken / remounted view reads nothing).\n const known = entry !== undefined;\n useEffect(() => {\n if (known || !resourceType || !resourceId || !enabled) return;\n // Another view of the same record may have asked a moment ago.\n if (selectSharingStatus(store.getState(), key)) return;\n void refresh();\n // `refresh` is rebuilt per render; the key and the gate decide.\n }, [known, key, enabled]);\n\n return {\n isPublic: entry?.visibility?.isPublic ?? false,\n loading: entry ? entry.loading : enabled,\n error: entry?.error ?? null,\n refresh,\n };\n}\n","\"use client\";\n\n/**\n * features/sharing/hooks/useGrantableLevels.ts\n *\n * WHICH LEVELS THIS PERSON MAY GIVE ON THIS THING - asked of the database, never assumed.\n *\n * ONE-LADDER (Arman 2026-10-10): every share door asks `iam.may_grant_as`. This hook asks the\n * thin door over it (`iam.my_grantable_levels`) so the share dialog can offer exactly what the\n * doors will accept: a level maps to `null` (you may) or the sentence that says why not, and\n * `outside` is the same answer for somebody outside the organization. The screen holds no rule of\n * its own - it cannot disagree with the doors.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { createClient } from \"@ai-matrx/sharing/core\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\n\nexport type GrantableLevels = {\n loading: boolean;\n /** Could not be asked (a failure is not a refusal). */\n error: string | null;\n /** level -> null when allowed, else the reason. Absent while loading or on error. */\n levels: Partial<Record<PermissionLevel, string | null>>;\n /** May share outside the organization: null when allowed, else the reason. */\n outside: string | null;\n /** True when at least one level may be given - i.e. the person may share at all. */\n maySharePeople: boolean;\n};\n\nconst NOTHING: GrantableLevels = { loading: true, error: null, levels: {}, outside: null, maySharePeople: false };\n\ntype Answer = { levels?: Record<string, string | null>; outside?: string | null | undefined };\n\nexport function useGrantableLevels(resourceType: string, resourceId: string, enabled: boolean, refreshKey?: string | undefined): GrantableLevels {\n const [state, setState] = useState<GrantableLevels>(NOTHING);\n useEffect(() => {\n if (!enabled || !resourceType || !resourceId) return;\n let cancelled = false;\n const supabase = createClient();\n // The door is newer than the generated database types.\n const iam = supabase.schema(\"iam\") as unknown as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ data: unknown; error: { message: string } | null }>;\n };\n void iam\n .rpc(\"my_grantable_levels\", { p_resource_type: resourceType, p_resource_id: resourceId })\n .then(({ data, error }) => {\n if (cancelled) return;\n if (error) {\n setState({ ...NOTHING, loading: false, error: error.message });\n return;\n }\n const a = (data ?? {}) as Answer;\n const levels = (a.levels ?? {}) as Partial<Record<PermissionLevel, string | null>>;\n setState({\n loading: false,\n error: null,\n levels,\n outside: a.outside ?? null,\n maySharePeople: Object.values(levels).some((why) => why === null),\n });\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, resourceType, resourceId, refreshKey]);\n return state;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Card } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { ShareEntityDoorControls } from \"./host\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { X, Mail, Building2, Globe, Loader2, Lock } from \"lucide-react\";\nimport { GuestBadge, PermissionBadge, PublicBadge } from \"./PermissionBadge\";\nimport { UserAvatarDisplay } from \"./host\";\nimport { CopyButtons } from \"./host\";\nimport { csvExportItem, jsonExportItem } from \"./host\";\nimport {\n accessKpis,\n granteeKind,\n granteeLabel,\n granteeSecondaryLabel,\n grantCsvRows,\n grantLevelLabel,\n humanGrantList,\n humanGrantRow,\n sharingLocation,\n GRANT_LIST_SCOPE_NOTE,\n NO_GRANTS_DETAIL,\n NO_GRANTS_HEADLINE,\n NO_GRANTS_YET_HEADLINE,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport type {\n PermissionWithDetails,\n PermissionLevel,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n PERMISSION_LEVEL_HINTS,\n PERMISSION_LEVEL_SHORT_LABELS,\n} from \"@ai-matrx/sharing/core\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\n\ninterface PermissionsListProps {\n permissions: PermissionWithDetails[];\n isOwner: boolean;\n onUpdateLevel: (\n options: { userId?: string | undefined; organizationId?: string | undefined; isPublic?: boolean | undefined },\n newLevel: PermissionLevel,\n ) => Promise<ShareActionResult>;\n onRevoke: (options: {\n userId?: string | undefined;\n organizationId?: string | undefined;\n isPublic?: boolean | undefined;\n }) => Promise<ShareActionResult>;\n loading?: boolean | undefined;\n /**\n * Identity + the page's leading KPIs, so every copied grant states what it\n * belongs to. Optional: without it the list still copies, falling back to the\n * identity carried on the permission rows themselves — but a page that shows\n * KPIs above this list should pass them so the payloads mirror the screen.\n */\n copy?: SharingCopyContext | undefined;\n /** Which slice this list renders, e.g. \"Users\" / \"Organizations\". */\n listLabel?: string | undefined;\n /**\n * 🚨 WHAT ELSE IS ON THIS SCREEN THAT IS NOT A GRANT (FIX-10C, VERIFIER-10\n * F13, 2026-09-22).\n *\n * This list only ever knew about DIRECT grants, and said so honestly in its\n * scope note. But after an outside invitation lands, the dialog read\n * \"Current Access — Not shared with anyone — No one has been granted access\n * here\" with the invited person's row drawn directly underneath it. Both\n * halves were true and the screen contradicted itself, which is the one thing\n * a screen may not do.\n *\n * An invitation is not a grant — it confers nothing until it is accepted, and\n * making this list count it would be the same lie pointing the other way. So\n * the empty state stays an empty state and simply stops pretending it is the\n * whole screen: the caller that also draws the pending rows says how many\n * there are, and the sentence names them.\n */\n alsoPending?: { count: number; one: string; many: string } | undefined;\n}\n\n/**\n * Render-only preview size. The list itself is complete — truncating HERE\n * (never in the data) is what keeps show-all, copy, and export honest: every\n * payload and every export covers ALL grants, not the visible slice.\n */\nconst GRANT_PREVIEW = 12;\n\n/** The empty state's own box (icon, headline, detail, copy row); the first-read stand-in holds it too. */\nconst EMPTY_STATE_MIN_HEIGHT = \"min-h-[11rem]\";\n\n/**\n * What is on the screen besides the grants, in a sentence a person reads.\n *\n * The caller hands BOTH words. A plural is a word the thing already knows,\n * never an \"s\" glued onto a noun phrase — that rule cost this platform \"22 new\n * Invoicess\" once already, and \"3 person outside this organizations\" here.\n */\nfunction pendingSentence({\n count,\n one,\n many,\n}: {\n count: number;\n one: string;\n many: string;\n}): string {\n return count === 1\n ? `One ${one} is invited below and has not joined yet — they get access the moment they follow their link.`\n : `${count} ${many} are invited below and have not joined yet — each gets access the moment they follow their link.`;\n}\n\n/** Header toggle between the preview and the full grant list. */\nfunction ShowAllToggle({\n total,\n preview,\n showingAll,\n onToggle,\n}: {\n total: number;\n preview: number;\n showingAll: boolean;\n onToggle: () => void;\n}) {\n if (total <= preview) return null;\n return ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground \"\n onClick={onToggle}\n >\n {showingAll ? `top ${preview}` : `all ${total.toLocaleString()}`}\n </button>\n );\n}\n\n/**\n * PermissionsList - Display and manage current permissions\n *\n * Shows all users, organizations, and public access for a resource.\n * Allows owners to update permission levels or revoke access.\n *\n * @example\n * <PermissionsList\n * permissions={permissions}\n * isOwner={isOwner}\n * onUpdateLevel={updateLevel}\n * onRevoke={revokeAccess}\n * />\n */\nexport function PermissionsList({\n permissions,\n isOwner,\n onUpdateLevel,\n onRevoke,\n loading = false,\n copy,\n listLabel = \"Current access\",\n alsoPending,\n}: PermissionsListProps) {\n const [updatingId, setUpdatingId] = useState<string | null>(null);\n const [revokingId, setRevokingId] = useState<string | null>(null);\n const [showAll, setShowAll] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<{\n open: boolean;\n permission: PermissionWithDetails | null;\n }>({ open: false, permission: null });\n\n /**\n * The payload context. A caller that renders KPIs above this list passes\n * them; otherwise we fall back to the identity the rows themselves carry, so\n * a bare `<PermissionsList>` still copies something an agent can act on.\n */\n const context: SharingCopyContext = copy ?? {\n resourceType: permissions[0]?.resourceType ?? \"unknown\",\n resourceId: permissions[0]?.resourceId ?? \"unknown\",\n surface: listLabel,\n kpis: accessKpis({\n permissions,\n isPublic: permissions.some((p) => p.isPublic),\n // What the list actually renders — owner controls are on screen or not.\n viewerIsOwner: isOwner,\n }),\n };\n const location = sharingLocation(context.surface);\n const resourceAttributes = {\n resource_type: context.resourceType,\n resource_id: context.resourceId,\n resource_name: context.resourceName ?? null,\n };\n\n // ZERO LAYOUT SHIFT (Arman 2026-10-07; lane SHARE-DIALOG-2). Every dialog action (a \"Shown to\"\n // change, a grant, a revoke) raises `loading` while the list is re-read. This used to swap the\n // whole list for a spinner box 88px shorter than the empty state, so everything under it\n // (the add-a-person form, the organization line) jumped down and back up on every click.\n // A re-read now keeps what is on screen and only says it is busy; the stand-in below is drawn\n // only while there is nothing to keep, and it holds the empty state's own height.\n if (loading && permissions.length === 0) {\n return (\n <div\n className={`flex items-center justify-center ${EMPTY_STATE_MIN_HEIGHT}`}\n aria-busy=\"true\"\n data-grants-reserved=\"\"\n >\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (permissions.length === 0) {\n return (\n <div\n className={`group flex flex-col items-center justify-center text-center py-6 text-muted-foreground ${EMPTY_STATE_MIN_HEIGHT}`}\n data-grants-empty=\"\"\n >\n <Lock className=\"w-10 h-10 mb-1.5 opacity-20\" />\n <p className=\"text-sm\">\n {alsoPending && alsoPending.count > 0 ? NO_GRANTS_YET_HEADLINE : NO_GRANTS_HEADLINE}\n </p>\n {/*\n * This list only knows about DIRECT grants. It cannot see its table's level, publishing,\n * org membership, or access conveyed through a container — so \"only you\n * can access this\" would be a claim it has no basis for. State what is\n * actually known: no one has been granted access here.\n */}\n <p className=\"text-xs mt-0.5\">{NO_GRANTS_DETAIL}</p>\n {/* And what IS on the screen, so the headline above can never stand\n over a row that contradicts it. */}\n {alsoPending && alsoPending.count > 0 ? (\n <p className=\"text-xs mt-0.5\" data-testid=\"grants-also-pending\">\n {pendingSentence(alsoPending)}\n </p>\n ) : null}\n {/*\n * \"Nobody has been granted access\" is an ANSWER, not an absence — it is\n * usually the whole reason the user is here asking why someone can't\n * see this. It has to be copyable, and it has to carry the scope note\n * so an agent never reads it as \"nothing grants access\".\n */}\n <div className=\"mt-1.5 flex justify-center opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`${listLabel} (no grants)`}\n human={() => humanGrantList([], { surface: context.surface })}\n agent={() => ({\n kind: \"access-grants\",\n location,\n description: `The \"${listLabel}\" grant list, which is empty: ${NO_GRANTS_HEADLINE} — ${NO_GRANTS_DETAIL}.`,\n data: {\n list: listLabel,\n rendered_empty_state: {\n headline: NO_GRANTS_HEADLINE,\n detail: NO_GRANTS_DETAIL,\n },\n grants: [],\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n },\n summary: humanGrantList([], { surface: context.surface }),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n count: 0,\n },\n })}\n />\n </div>\n </div>\n );\n }\n\n const handleUpdateLevel = async (\n permission: PermissionWithDetails,\n newLevel: PermissionLevel,\n ) => {\n if (newLevel === permission.permissionLevel) return;\n\n setUpdatingId(permission.id);\n try {\n await onUpdateLevel(\n {\n userId: permission.grantedToUserId || undefined,\n organizationId: permission.grantedToOrganizationId || undefined,\n isPublic: permission.isPublic || undefined,\n },\n newLevel,\n );\n } finally {\n setUpdatingId(null);\n }\n };\n\n const handleRevoke = async (permission: PermissionWithDetails) => {\n setRevokingId(permission.id);\n try {\n await onRevoke({\n userId: permission.grantedToUserId || undefined,\n organizationId: permission.grantedToOrganizationId || undefined,\n isPublic: permission.isPublic || undefined,\n });\n } finally {\n setRevokingId(null);\n setConfirmRevoke({ open: false, permission: null });\n }\n };\n\n // The row labels come from the shared extractor, so a copied grant reads\n // exactly like the row the user is looking at.\n const getPermissionLabel = granteeLabel;\n const getPermissionSecondaryLabel = granteeSecondaryLabel;\n\n const getPermissionIcon = (permission: PermissionWithDetails) => {\n if (permission.isPublic) return Globe;\n if (permission.grantedToOrganization) return Building2;\n return Mail;\n };\n\n const visiblePermissions = showAll\n ? permissions\n : permissions.slice(0, GRANT_PREVIEW);\n\n const listHuman = () =>\n humanGrantList(permissions, {\n surface: context.surface,\n shown: visiblePermissions.length,\n });\n\n return (\n <div\n className={cn(\"space-y-1 transition-opacity\", loading && \"opacity-60\")}\n aria-busy={loading}\n data-grants-busy={loading ? \"true\" : \"false\"}\n >\n {/*\n * List-level copy + export. Both always cover ALL grants, never the\n * visible slice — the preview above is a rendering choice, and an export\n * that silently inherited it would be a lie about coverage.\n */}\n <div className=\"flex items-center justify-end gap-1\">\n <ShowAllToggle\n total={permissions.length}\n preview={GRANT_PREVIEW}\n showingAll={showAll}\n onToggle={() => setShowAll((current) => !current)}\n />\n <CopyButtons\n size=\"xs\"\n label={`${listLabel} (${permissions.length} grant${permissions.length === 1 ? \"\" : \"s\"})`}\n human={listHuman}\n json={() => permissions}\n agent={() => ({\n kind: \"access-grants\",\n location,\n description: `All ${permissions.length} direct grant(s) in the \"${listLabel}\" list. ${GRANT_LIST_SCOPE_NOTE}`,\n data: {\n list: listLabel,\n grants: permissions.map((permission) => ({\n grantee: granteeLabel(permission),\n grantee_email: granteeSecondaryLabel(permission),\n grantee_type: granteeKind(permission),\n level_shown: grantLevelLabel(permission),\n can_manage_here: isOwner,\n raw: permission,\n })),\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n rows_on_screen: visiblePermissions.length,\n rows_total: permissions.length,\n },\n summary: listHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n count: permissions.length,\n shown: visiblePermissions.length,\n },\n })}\n export={{\n items: [\n jsonExportItem(() => permissions, \"JSON (all grants)\"),\n csvExportItem(\n () => grantCsvRows(permissions),\n \"CSV (all grants)\",\n ),\n ],\n }}\n />\n </div>\n {visiblePermissions.map((permission) => {\n const Icon = getPermissionIcon(permission);\n const isUpdating = updatingId === permission.id;\n const isRevoking = revokingId === permission.id;\n\n const secondaryLabel = getPermissionSecondaryLabel(permission);\n\n return (\n // `group` is what reveals the door controls below on hover — without\n // it EntityDoorControls renders at opacity-0 and the door is\n // invisible, which is the failure this campaign has hit four times.\n <Card size=\"sm\" key={permission.id} className=\"group px-2 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Left: avatar for user grants, icon otherwise */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {permission.grantedToUser && !permission.isPublic ? (\n <UserAvatarDisplay\n user={permission.grantedToUser}\n size=\"xs\"\n className=\"flex-shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-primary/10 flex-shrink-0\">\n <Icon className=\"w-3 h-3 text-primary\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex items-center gap-1.5\">\n <p className=\"text-sm font-semibold truncate leading-none\">\n {getPermissionLabel(permission)}\n </p>\n {permission.grantedToUser?.isGuest && !permission.isPublic ? <GuestBadge /> : null}\n {/* THE DOOR LAW, applied to the ONE grantee kind that has a\n reachable route today. An org grant names a real record\n with its id right here, so it opens.\n\n The USER branch deliberately gets no door: `user` has no\n registry token, and `AdminUserRef` is the WRONG door here —\n this is a `(core)` sharing surface reached by ordinary org\n members, for whom `/administration/users` is a 403. A door\n the viewer cannot open is worse than none, because it looks\n like it worked. Tracked as the `user` registry gap in\n docs/handoffs/no-dead-ends-sweep.md. */}\n {permission.grantedToOrganization && (\n <ShareEntityDoorControls\n token=\"organization\"\n id={permission.grantedToOrganization.id}\n name={permission.grantedToOrganization.name}\n className=\"shrink-0\"\n />\n )}\n {secondaryLabel && (\n <p className=\"text-[11px] text-muted-foreground truncate leading-none\">\n {secondaryLabel}\n </p>\n )}\n </div>\n </div>\n\n {/* Right: Permission level selector and remove button */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {/* Hover-reveal so ubiquity doesn't become clutter — the same\n `group` the door controls above ride on. */}\n <span className=\"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`Grant — ${granteeLabel(permission)}`}\n human={() => humanGrantRow(permission)}\n json={() => permission}\n agent={() => ({\n kind: \"access-grant\",\n location,\n description: `One direct access grant on this resource: ${granteeLabel(\n permission,\n )} · ${grantLevelLabel(permission)}.`,\n data: {\n grantee: granteeLabel(permission),\n grantee_email: granteeSecondaryLabel(permission),\n grantee_type: granteeKind(permission),\n level_shown: grantLevelLabel(permission),\n can_manage_here: isOwner,\n raw: permission,\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n },\n summary: humanGrantRow(permission),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n grant_id: permission.id,\n grantee_type: granteeKind(permission),\n level: permission.permissionLevel,\n },\n })}\n />\n </span>\n {isOwner ? (\n <>\n <Select\n value={permission.permissionLevel}\n onValueChange={(value) =>\n handleUpdateLevel(permission, value as PermissionLevel)\n }\n disabled={isUpdating || isRevoking}\n >\n {/* Widened from 90px: THE SCOPE-QUALIFIED ADMIN RULE makes the longest\n option \"Admin (this item)\", which truncates at 90px. */}\n <SelectTrigger className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"viewer\" title={PERMISSION_LEVEL_HINTS.viewer}>{PERMISSION_LEVEL_SHORT_LABELS.viewer}</SelectItem>\n {/* VIS-17b: `commenter` is the FOURTH rung of the one ladder — it has been in\n `public.permission_level` since G0 and every policy and RPC accepts it, and\n this picker was the one place a person could not choose it (lane SHARE,\n 2026-09-19). A ladder with a rung nobody can reach is not one ladder. */}\n <SelectItem value=\"commenter\" title={PERMISSION_LEVEL_HINTS.commenter}>{PERMISSION_LEVEL_SHORT_LABELS.commenter}</SelectItem>\n <SelectItem value=\"editor\" title={PERMISSION_LEVEL_HINTS.editor}>{PERMISSION_LEVEL_SHORT_LABELS.editor}</SelectItem>\n {/* THE SCOPE-QUALIFIED ADMIN RULE (access/DECISIONS.md 2026-09-10):\n this control's own heading is the grant-list label, which does not\n name the item, so the bare \"Admin\" is qualified here. */}\n <SelectItem value=\"admin\" title={PERMISSION_LEVEL_HINTS.admin}>{PERMISSION_LEVEL_SHORT_LABELS.admin}</SelectItem>\n </SelectContent>\n </Select>\n\n <Button\n icon={isRevoking ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <X />\n )}\n variant=\"quiet\"\n aria-label={`Revoke access for ${getPermissionLabel(permission)}`}\n title={`Revoke access for ${getPermissionLabel(permission)}`}\n onClick={() =>\n setConfirmRevoke({ open: true, permission })\n }\n disabled={isUpdating || isRevoking}\n />\n </>\n ) : (\n <>\n {permission.isPublic ? (\n <PublicBadge variant=\"compact\" />\n ) : (\n <PermissionBadge\n level={permission.permissionLevel}\n variant=\"compact\"\n />\n )}\n </>\n )}\n </div>\n </div>\n </Card>\n );\n })}\n\n {/* Confirmation dialog */}\n <AlertDialog\n open={confirmRevoke.open}\n onOpenChange={(open) =>\n setConfirmRevoke({ open, permission: confirmRevoke.permission })\n }\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Revoke Access?</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to revoke access for{\" \"}\n <strong>\n {confirmRevoke.permission\n ? getPermissionLabel(confirmRevoke.permission)\n : \"\"}\n </strong>\n ? They will no longer be able to access this resource.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n if (confirmRevoke.permission) {\n handleRevoke(confirmRevoke.permission);\n }\n }}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Revoke Access\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Badge } from \"@ai-matrx/design-system\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\nimport { Crown, Shield, Eye, MessageSquare, Users, Globe } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\ninterface PermissionBadgeProps {\n level: PermissionLevel | \"owner\";\n variant?: \"default\" | \"compact\" | undefined;\n showIcon?: boolean | undefined;\n}\n\n/**\n * PermissionBadge - Visual indicator for permission levels\n *\n * Displays color-coded badges for different permission levels\n * Used throughout the app to show user permissions\n *\n * @example\n * <PermissionBadge level=\"editor\" />\n * <PermissionBadge level=\"owner\" showIcon />\n */\nexport function PermissionBadge({\n level,\n variant = \"default\",\n showIcon = false,\n}: PermissionBadgeProps) {\n // Every level on the ladder appears here. The map is typed against\n // `PermissionLevel` (utils/permissions/levels.ts — THE ONE declaration), so a\n // level added there fails this file rather than reaching a viewer as\n // `undefined.label` (`commenter` did exactly that until 2026-09-18).\n const config: Record<\n PermissionLevel | \"owner\",\n { label: string; className: string; icon: LucideIcon }\n > = {\n owner: {\n label: \"Owner\",\n className:\n \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border-yellow-300\",\n icon: Crown,\n },\n admin: {\n label: \"Full access\",\n className:\n \"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200 border-red-300\",\n icon: Shield,\n },\n commenter: {\n label: \"Comment\",\n className:\n \"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200 border-purple-300\",\n icon: MessageSquare,\n },\n editor: {\n label: \"Edit\",\n className:\n \"bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200 border-orange-300\",\n icon: Users,\n },\n viewer: {\n label: \"View\",\n className:\n \"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 border-blue-300\",\n icon: Eye,\n },\n };\n\n // A retired stored `edit_content` row reads as Edit (ONE-LADDER 2026-10-10).\n const shown = (level as string) === \"edit_content\" ? \"editor\" : level;\n const { label, className, icon: Icon } = config[shown];\n\n if (variant === \"compact\") {\n return (\n <Badge className={`${className} text-xs px-2 py-0.5`}>\n {showIcon && <Icon className=\"w-3 h-3 mr-1\" />}\n {label}\n </Badge>\n );\n }\n\n return (\n <Badge className={`${className} px-3 py-1`}>\n {showIcon && <Icon className=\"w-3.5 h-3.5 mr-1.5\" />}\n {label}\n </Badge>\n );\n}\n\n/**\n * PublicBadge - Badge specifically for public resources\n */\nexport function PublicBadge({\n variant = \"default\",\n}: {\n variant?: \"default\" | \"compact\" | undefined;\n}) {\n const className =\n \"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200 border-green-300\";\n\n if (variant === \"compact\") {\n return (\n <Badge className={`${className} text-xs px-2 py-0.5`}>\n <Globe className=\"w-3 h-3 mr-1\" />\n Public\n </Badge>\n );\n }\n\n return (\n <Badge className={`${className} px-3 py-1`}>\n <Globe className=\"w-3.5 h-3.5 mr-1.5\" />\n Public\n </Badge>\n );\n}\n\n/**\n * PermissionLevelDescription - Show what each level can do\n */\nexport function PermissionLevelDescription({\n level,\n}: {\n level: PermissionLevel;\n}) {\n // THE SCOPE-QUALIFIED ADMIN RULE (common-docs/systems/platform/access/DECISIONS.md,\n // 2026-09-10, CFL-360): the word \"admin\" never stands alone in an access surface — it carries\n // the noun of the thing it governs, so the item level is never read as the organization-admin\n // role. \"Full access\" was the retired label for this same level (AI Matrx Data Doctrine R19:\n // \"Admin is the top level on a thing; there is no 'full.'\").\n const descriptions: Record<PermissionLevel, string> = {\n viewer: \"Can view\",\n commenter: \"Can view and comment\",\n editor: \"Can view and edit values and content\",\n admin: \"Full access: also structure and sharing\",\n };\n\n return (\n <span className=\"text-xs text-muted-foreground\">{descriptions[level]}</span>\n );\n}\n\n/**\n * GuestBadge — a person who is not a member of the thing's organization (CLOSE-SHARE, Notion's \"Guest\").\n * The store decides (`isGuest` from get_resource_permissions; a Space's presence carries its own answer).\n * One marker for every share list and avatar row.\n */\nexport function GuestBadge() {\n return (\n <Badge variant=\"outline\" className=\"shrink-0 px-1.5 py-0 text-[10px] leading-4 text-muted-foreground\" data-guest-marker=\"\">\n Guest\n </Badge>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the AlertDialog implementation lives in\n * `@ai-matrx/design-system`.\n *\n * Everything this file carried is there, verbatim: the root renders\n * unconditionally (no hydration gate deleting always-visible delete buttons\n * from the first paint), and an undescribed alert dialog still gets a\n * screen-reader description instead of a console warning.\n *\n * ONE REAL DEFECT WAS FIXED IN THE PORT. This copy was not clamped to the\n * viewport, so an alert dialog listing what is about to be deleted could push\n * Cancel and Continue below the fold — and Radix does NOT dismiss an ALERT\n * dialog on a backdrop click, which made that surface a genuine dead end. The\n * package version is `max-h-[85dvh] overflow-y-auto` with a sticky,\n * edge-bleeding footer, matching Dialog.\n *\n * The popout wiring this file did by hand (`usePopoutContainer`) is now the\n * package's `PortalContainerProvider` seam, fed by summon's `PopoutShell` (`@ai-matrx/summon/window`).\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n type AlertDialogContentProps,\n} from \"@ai-matrx/design-system\";\n","/**\n * features/sharing/components/AccessSummaryPanel.tsx\n *\n * \"Who can see this, and why\" — the truthful access explanation for ONE\n * entity. Works for any entity token, not just files: hand it a type + id.\n *\n * It lists every REASON access is granted, because the reason is the part\n * users act on. \"Everyone in Titanium (via the Web Development scope)\" tells\n * you what to detach; \"Only you\" told you nothing and was often wrong.\n *\n * Every line it renders is copyable, in all three flavors, at panel and reason\n * granularity — including the failure branch. A user copying this panel is\n * asking an agent \"why can't this person see this, and what do I change?\", so\n * the rendered sentences (and the rendered error) ARE the payload.\n */\n\n\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport {\n Globe,\n Lock,\n Loader2,\n Users,\n Boxes,\n AlertTriangle,\n} from \"lucide-react\";\nimport { useAccessSummary } from \"./useAccessSummary\";\nimport { type AccessSummary } from \"@ai-matrx/sharing/core\";\nimport { CopyButtons } from \"./host\";\nimport { csvExportItem, jsonExportItem } from \"./host\";\nimport {\n accessKpis,\n accessReasonRows,\n accessSummaryView,\n humanAccessSummary,\n isPrivateSummary,\n reasonCsvRows,\n sharingLocation,\n summaryReachLabel,\n ACCESS_SUMMARY_ERROR_HEADLINE,\n NOTHING_ELSE_GRANTS,\n type AccessReasonRow,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport type { EntityTypeToken } from \"@ai-matrx/associations\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** What the panel currently knows, for pages that mirror it in their payload. */\nexport interface AccessSummaryState {\n summary: AccessSummary | null;\n error: string | null;\n loading: boolean;\n}\n\nexport interface AccessSummaryPanelProps {\n entityType: EntityTypeToken;\n entityId: string | null;\n /** Load only when the surface is actually visible. */\n enabled?: boolean | undefined;\n /**\n * Change this value to force a refetch. Required on surfaces that mutate\n * grants beside the panel (a Share tab) — pass a signature of the grant\n * state so the summary can never contradict the list next to it.\n */\n refreshToken?: unknown | undefined;\n className?: string | undefined;\n /**\n * Identity + the page's leading KPIs, mirrored verbatim into this panel's\n * payloads. Optional — without it the panel derives what it can from the\n * summary itself.\n */\n copy?: SharingCopyContext | undefined;\n /**\n * Lets the page that composes this panel mirror the reachability answer it\n * is rendering, without paying for a second round trip. Pass a stable\n * callback (a `useState` setter is ideal).\n */\n onSummaryChange?: (state: AccessSummaryState) => void;\n}\n\nexport function AccessSummaryPanel({\n entityType,\n entityId,\n enabled = true,\n refreshToken,\n className,\n copy,\n onSummaryChange,\n}: AccessSummaryPanelProps) {\n const { summary, loading, error, reload } = useAccessSummary({\n entityType,\n entityId,\n enabled,\n refreshToken,\n });\n\n /*\n * Publish upward so a composing page's payload can carry these same numbers\n * instead of recomputing (or double-fetching) what is already on screen.\n *\n * The callback is held in a ref and deliberately kept OUT of the deps: this\n * is a shared component, and a caller passing an inline arrow would\n * otherwise re-fire on every render and cascade forever. It fires when the\n * access answer actually changes, and only then.\n */\n const notifyRef = useRef(onSummaryChange);\n useEffect(() => {\n notifyRef.current = onSummaryChange;\n }, [onSummaryChange]);\n useEffect(() => {\n notifyRef.current?.({ summary, error, loading });\n }, [summary, error, loading]);\n\n const context: SharingCopyContext = copy ?? {\n resourceType: entityType,\n resourceId: entityId ?? \"unknown\",\n surface: \"Access summary\",\n kpis: accessKpis({\n permissions: [],\n isPublic: summary?.isPublic ?? false,\n viewerIsOwner: summary ? summary.viewerIsOwner : null,\n summary,\n entityType,\n }),\n };\n const location = sharingLocation(context.surface);\n const resourceAttributes = {\n resource_type: context.resourceType,\n resource_id: context.resourceId,\n resource_name: context.resourceName ?? null,\n };\n\n if (loading && !summary) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 text-[13px] text-muted-foreground\",\n className,\n )}\n >\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Working out who can see this…\n </div>\n );\n }\n\n if (error) {\n /*\n * ERRORS FIRST. A failed access read is the single highest-value thing on\n * this surface — the user is staring at \"we don't know who can see this\"\n * and wants an agent to tell them why. Copy it verbatim, with the entity\n * identity that produced it, never a paraphrase.\n */\n const errorHuman = () =>\n [\n `${ACCESS_SUMMARY_ERROR_HEADLINE}`,\n error,\n `Entity: ${entityType}:${entityId ?? \"(none)\"}`,\n `The panel offers a Retry; the reachability answer is UNKNOWN, not \"private\".`,\n ].join(\"\\n\");\n return (\n <div\n className={cn(\n \"group rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-[12px] text-destructive-ink\",\n className,\n )}\n >\n <p className=\"flex items-center gap-1.5 font-medium\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n {ACCESS_SUMMARY_ERROR_HEADLINE}\n <span className=\"ml-auto opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Access summary error\"\n human={errorHuman}\n json={() => ({\n error,\n entity_type: entityType,\n entity_id: entityId,\n })}\n agent={() => ({\n kind: \"access-summary-error\",\n location,\n description:\n \"The reachability summary failed to load. This is the error the user is looking at, verbatim — the access answer is UNKNOWN, not private.\",\n data: {\n rendered_headline: ACCESS_SUMMARY_ERROR_HEADLINE,\n rendered_error: error,\n entity_type: entityType,\n entity_id: entityId,\n retry_offered: true,\n kpis: context.kpis,\n },\n summary: errorHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n state: \"error\",\n },\n })}\n />\n </span>\n </p>\n <p className=\"opacity-80\">{error}</p>\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n type=\"button\"\n onClick={reload}\n className=\"mt-1 underline hover:no-underline\"\n >\n Retry\n </button>\n <ShareErrorAlchemyMenu error={error} />\n </div>\n );\n }\n\n if (!summary) return null;\n\n const Icon = summary.isPublic\n ? Globe\n : isPrivateSummary(summary)\n ? Lock\n : Users;\n\n // ONE extractor feeds both the rendering below and every payload — the copy\n // can never drift from the reasons on screen.\n const reasons = accessReasonRows(summary, entityType);\n const view = () => accessSummaryView(summary, entityType);\n const panelHuman = () => humanAccessSummary(summary, entityType);\n\n return (\n <div className={cn(\"group space-y-2 px-3 py-2\", className)}>\n {/* Who can open it comes from the summary the reasons below come from, so the two never\n contradict each other. */}\n <div className=\"flex items-center gap-2\">\n <p className=\"text-[12px] text-muted-foreground\">\n Who can open it:{\" \"}\n <span className=\"text-foreground\">\n {summaryReachLabel(summary)}\n </span>\n </p>\n <span className=\"ml-auto flex items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Who can see this\"\n human={panelHuman}\n json={view}\n agent={() => ({\n kind: \"access-summary\",\n location,\n description:\n 'Every reason this entity is reachable, exactly as rendered: who can open it, the one-line headline, and each reason row. This is the complete answer to \"who can see this, and why\" — direct grants are only one of the reasons listed.',\n data: { ...view(), kpis: context.kpis },\n summary: panelHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n reasons: reasons.length,\n is_public: summary.isPublic,\n viewer_is_owner: summary.viewerIsOwner,\n can_manage: summary.canManage,\n },\n })}\n export={{\n items: [\n jsonExportItem(view, \"JSON (rendered summary)\"),\n csvExportItem(\n () => reasonCsvRows(reasons),\n \"CSV (all access reasons)\",\n ),\n ],\n }}\n />\n </span>\n </div>\n\n <p className=\"flex items-start gap-2 text-[13px] text-foreground\">\n <Icon className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span>{view().headline}</span>\n </p>\n\n <ul className=\"space-y-1 text-[12px] text-muted-foreground\">\n {reasons.map((reason) => (\n <ReasonRow\n key={reason.id}\n reason={reason}\n location={location}\n attributes={{ ...context.kpis, ...resourceAttributes }}\n />\n ))}\n </ul>\n\n {isPrivateSummary(summary) ? (\n <p className=\"text-[12px] text-muted-foreground\">\n {NOTHING_ELSE_GRANTS}\n </p>\n ) : null}\n </div>\n );\n}\n\nconst REASON_ICON: Record<AccessReasonRow[\"kind\"], typeof Users> = {\n organization: Users,\n \"direct-grants\": Users,\n container: Boxes,\n};\n\nfunction ReasonRow({\n reason,\n location,\n attributes,\n}: {\n reason: AccessReasonRow;\n location: string;\n attributes: Record<string, string | number | boolean | null | undefined>;\n}) {\n const Icon = REASON_ICON[reason.kind];\n const human = () =>\n `${reason.title}${reason.detail ? ` — ${reason.detail}` : \"\"}`;\n return (\n <li className=\"group/reason flex items-start gap-2\">\n <Icon className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"min-w-0\">\n <span className=\"text-foreground\">{reason.title}</span>\n {reason.detail ? (\n <span className=\"opacity-80\"> — {reason.detail}</span>\n ) : null}\n </span>\n {/* A reason is the unit the user ACTS on (\"detach that scope\") — so it is\n the unit they hand an agent. */}\n <span className=\"ml-auto shrink-0 opacity-0 transition-opacity focus-within:opacity-100 group-hover/reason:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`Access reason — ${reason.title}`}\n human={human}\n json={() => reason}\n agent={() => ({\n kind: \"access-reason\",\n location,\n description:\n \"One reason this entity is reachable, as rendered in the access summary. Removing this reason is one of the levers for changing who can see it.\",\n data: reason,\n summary: human(),\n attributes: {\n ...attributes,\n reason_kind: reason.kind,\n container_type: reason.containerType ?? null,\n container_id: reason.containerId ?? null,\n },\n })}\n />\n </span>\n </li>\n );\n}\n\nexport default AccessSummaryPanel;\n","/**\n * features/sharing/hooks/useAccessSummary.ts\n *\n * One-entity-at-a-time effective-access loader. `enabled` exists so callers can\n * mount the panel inside a collapsed tab and only pay for the round trip when\n * the user actually looks — this query is NOT cheap enough to fire per row.\n */\n\n\"use client\";\n\nimport { useRefreshWhenChanged, useStoreRead } from \"./host\";\nimport {\n fetchAccessSummary,\n type AccessSummary,\n} from \"@ai-matrx/sharing/core\";\nimport type { EntityTypeToken } from \"@ai-matrx/associations\";\n\nexport interface UseAccessSummaryArgs {\n entityType: EntityTypeToken;\n entityId: string | null;\n /** Load only while true. Defaults to true. */\n enabled?: boolean | undefined;\n /**\n * Change this value to force a refetch — for surfaces that mutate grants\n * beside the panel (a Share tab), pass a signature of the grant state so\n * the summary can never contradict the freshly-refreshed list next to it.\n */\n refreshToken?: unknown | undefined;\n}\n\nexport interface UseAccessSummaryResult {\n summary: AccessSummary | null;\n loading: boolean;\n error: string | null;\n reload: () => void;\n}\n\nexport function useAccessSummary({\n entityType,\n entityId,\n enabled = true,\n refreshToken,\n}: UseAccessSummaryArgs): UseAccessSummaryResult {\n // Kept once per record per tab (the remount law): a tile waking from sleep or remounting shows the\n // kept summary and reads nothing; a failed read is not kept. A new `refreshToken` or `reload()` is the\n // deliberate re-read.\n const read = useStoreRead<AccessSummary>(\n entityId ? `sharing.access-summary:${entityType}:${entityId}` : null,\n () => fetchAccessSummary(entityType, entityId as string),\n { enabled: enabled && Boolean(entityId), staleAfterMs: 60_000 },\n );\n useRefreshWhenChanged(refreshToken, read.refresh);\n\n const active = enabled && Boolean(entityId);\n const reload = () => {\n void read.refresh();\n };\n return {\n summary: active ? (read.data ?? null) : null,\n loading: active && read.isLoading,\n error: active && read.isError ? (read.error ?? \"Could not load access\") : null,\n reload,\n };\n}\n","\"use client\";\n\nimport React, { useState, useMemo, useEffect } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport {\n Loader2,\n UserPlus,\n CheckCircle,\n XCircle,\n Users,\n MessageSquare,\n Building2,\n Mail,\n} from \"lucide-react\";\nimport type {\n PermissionLevel,\n ResourceType,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n PERMISSION_LEVEL_HINTS,\n PERMISSION_LEVEL_LABELS,\n PERMISSION_LEVEL_SHORT_LABELS,\n PERMISSION_LEVELS,\n} from \"@ai-matrx/sharing/core\";\nimport { PermissionLevelDescription } from \"./PermissionBadge\";\nimport type { GrantableLevels } from \"./useGrantableLevels\";\nimport { createClient } from \"@ai-matrx/sharing/core\";\nimport {\n useUserConnections,\n type ConnectionUser,\n} from \"./host\";\nimport { CopyButtons } from \"./host\";\nimport {\n sharingLocation,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport { UserSearchField } from \"./host\";\nimport type { UserSearchCandidate } from \"./host\";\n// THE package initials formatter (`@ai-matrx/kit/format`, census H1\n// 2026-09-07). Recorded display decision: a multi-part name takes FIRST +\n// LAST, so \"Ana Maria Rivera\" is AR — this surface previously printed AM.\n// A caller with no name passes the email, whose single token yields its\n// first character: exactly what these copies did by hand.\nimport { getInitials } from \"@ai-matrx/kit/format\";\nimport {\n AddEveryoneInOrg,\n type OrgMemberPerson,\n} from \"./AddEveryoneInOrg\";\nimport { ConnectionsReadNotice } from \"./host\";\n\ninterface ShareWithUserTabProps {\n onShare: (\n userId: string,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n onSuccess: () => void;\n resourceType: ResourceType;\n resourceId: string;\n /**\n * THE ORGANIZATION THIS THING BELONGS TO (FIX-7B). With it, the contact list is that\n * organization's members and nobody else. Without it the list is every organization the\n * viewer belongs to, which is what a brand-new organization's share dialog looked like when\n * the seventh pass found it offering \"people from all over the database\".\n */\n organizationId?: string | undefined;\n /** Identity + the page's leading KPIs, mirrored into the failure payload. */\n copy?: SharingCopyContext | undefined;\n /**\n * \"ADD EVERYONE IN <ORGANIZATION>\" (SHARE-PEOPLE-ONLY). How ONE listed member is granted.\n * Omitted → `onShare(person.userId, level)`, the same door as the form above. A record-store\n * table passes the outside door here, because its members may sit outside the table's own\n * organization.\n */\n grantEveryonePerson?: (\n person: OrgMemberPerson,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n /** People who already hold a grant; \"Add everyone\" shows them and skips them. */\n alreadySharedUserIds?: string[] | undefined;\n /**\n * \"notion\": the level picker reads the ladder's sentence labels, highest first — Full access · Edit ·\n * Comment · View (Spaces copies Notion's Share menu). Default: the role words.\n */\n levelWording?: \"roles\" | \"notion\" | undefined;\n /**\n * The levels the doors will accept from THIS person (iam.may_grant_as). A level with a reason is shown\n * disabled with that reason; omitted, every level is offered and the door answers (as before).\n */\n grantable?: GrantableLevels | undefined;\n}\n\ntype StatusType = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface Status {\n type: StatusType;\n message: string;\n}\n\nconst SOURCE_ICONS: Record<ConnectionUser[\"source\"], typeof Users> = {\n conversation: MessageSquare,\n organization: Building2,\n invitation: Mail,\n};\n\nconst SOURCE_LABELS: Record<ConnectionUser[\"source\"], string> = {\n conversation: \"Contact\",\n organization: \"Organization\",\n invitation: \"Invited\",\n};\n\nconst EMAIL_SHAPE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** One exact email → the person, through `lookup_user_by_email`; null when no one has it. */\nasync function lookupConnectionByEmail(typed: string): Promise<ConnectionUser | null> {\n const { data } = await createClient().schema(\"users\").rpc(\"lookup_user_by_email\", { lookup_email: typed });\n const row = (data as Array<{ user_id: string; user_email: string }> | null)?.[0];\n return row\n ? {\n user_id: row.user_id,\n email: row.user_email,\n display_name: row.user_email.split(\"@\", 1)[0] ?? null,\n avatar_url: null,\n source: \"invitation\",\n sourceDetails: \"Found by email\",\n }\n : null;\n}\n\nfunction candidateOf(connection: ConnectionUser, foundByEmail: boolean): UserSearchCandidate {\n return {\n id: connection.user_id,\n email: connection.email,\n displayName: connection.display_name,\n avatarUrl: connection.avatar_url,\n phone: null,\n adminLevel: null,\n organizations:\n connection.source === \"organization\" && connection.sourceDetails ? [connection.sourceDetails] : [],\n source: foundByEmail ? \"Found by email\" : SOURCE_LABELS[connection.source],\n createdAt: null,\n lastSignInAt: null,\n };\n}\n\n\n\n/**\n * ShareWithUserTab - Form to share with a specific user.\n * Shows the user's contacts from conversations, organizations, and invitations\n * for quick selection, with a manual email input fallback.\n */\nexport function ShareWithUserTab({\n levelWording = \"roles\",\n grantable,\n onShare,\n onSuccess,\n resourceType,\n resourceId,\n organizationId,\n copy,\n grantEveryonePerson,\n alreadySharedUserIds,\n}: ShareWithUserTabProps) {\n const [email, setEmail] = useState(\"\");\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [permissionLevel, setPermissionLevel] =\n useState<PermissionLevel>(\"viewer\");\n /** The reason a level may not be given by this person, or null when they may (or nothing is known yet). */\n const whyNotLevel = (level: PermissionLevel): string | null => {\n const why = grantable?.levels[level];\n return typeof why === \"string\" ? why : null;\n };\n const chosenWhy = whyNotLevel(permissionLevel);\n const [status, setStatus] = useState<Status>({ type: \"idle\", message: \"\" });\n const [selectedContact, setSelectedContact] = useState<ConnectionUser | null>(\n null,\n );\n\n // Scoped: this dialog is about ONE thing, in ONE organization, and the people it offers are\n // the people in that organization. Past conversations are not folded in — a conversation is\n // bounded by no organization (FIX-7B).\n const {\n connections,\n isLoading: connectionsLoading,\n error: connectionsError,\n partialFailures: connectionsPartial,\n refresh: refreshConnections,\n } = useUserConnections(organizationId ? { organizationId } : {});\n\n const filteredConnections = useMemo(() => {\n if (!searchQuery.trim()) return connections;\n const q = searchQuery.toLowerCase();\n return connections.filter(\n (c) =>\n (c.display_name && c.display_name.toLowerCase().includes(q)) ||\n (c.email && c.email.toLowerCase().includes(q)),\n );\n }, [connections, searchQuery]);\n\n // THE SEARCH FINDS ANY PERSON, NOT ONLY THIS ORGANIZATION'S ROSTER. The contact list above is\n // scoped to the thing's organization (FIX-7B), but sharing with someone outside it is a real\n // path (typed email → lookup_user_by_email). The magnifier used to search the roster alone, so\n // an existing person outside it found \"nothing\" while typing their email worked. A full email\n // typed in the field is now resolved by the same lookup and offered as a candidate.\n const [looked, setLooked] = useState<ConnectionUser | null>(null);\n /** An exact email, resolved now: the search window takes a snapshot, so Enter must not outrun the debounce. */\n const resolveTypedEmail = async (query: string): Promise<UserSearchCandidate[]> => {\n const typed = query.trim().toLowerCase();\n if (!EMAIL_SHAPE.test(typed)) return [];\n const found = connections.find((c) => c.email?.toLowerCase() === typed) ?? (await lookupConnectionByEmail(typed));\n return found ? [candidateOf(found, true)] : [];\n };\n useEffect(() => {\n const typed = email.trim().toLowerCase();\n if (!EMAIL_SHAPE.test(typed)) {\n setLooked(null);\n return;\n }\n if (connections.some((c) => c.email?.toLowerCase() === typed)) {\n setLooked(null);\n return;\n }\n let stale = false;\n const handle = setTimeout(async () => {\n const found = await lookupConnectionByEmail(typed);\n if (stale) return;\n setLooked(found);\n }, 300);\n return () => {\n stale = true;\n clearTimeout(handle);\n };\n }, [email, connections]);\n\n const searchableConnections = useMemo(\n () => (looked ? [...connections, looked] : connections),\n [connections, looked],\n );\n\n const userSearchCandidates: UserSearchCandidate[] = searchableConnections.map((connection) =>\n candidateOf(connection, connection === looked),\n );\n\n const resetStatus = () => {\n setStatus({ type: \"idle\", message: \"\" });\n };\n\n const selectContact = (contact: ConnectionUser) => {\n setSelectedContact(contact);\n setEmail(contact.email || \"\");\n setSearchQuery(\"\");\n if (status.type === \"error\") resetStatus();\n };\n\n const clearContact = () => {\n setSelectedContact(null);\n setEmail(\"\");\n };\n\n const handleShare = async () => {\n const trimmedEmail = email.trim();\n\n if (!trimmedEmail || !trimmedEmail.includes(\"@\")) {\n setStatus({\n type: \"error\",\n message: \"Please enter a valid email address\",\n });\n return;\n }\n\n setStatus({ type: \"loading\", message: \"Looking up user...\" });\n\n try {\n // Resolve userId — use selected contact to skip the lookup RPC when possible\n let targetUserId: string | null = null;\n\n if (selectedContact && selectedContact.email === trimmedEmail) {\n targetUserId = selectedContact.user_id;\n } else {\n const client = createClient();\n const { data: lookupData, error: lookupError } = await client.schema(\"users\").rpc(\n \"lookup_user_by_email\",\n { lookup_email: trimmedEmail },\n );\n\n if (lookupError) {\n setStatus({\n type: \"error\",\n message: `Lookup failed: ${lookupError.message}`,\n });\n return;\n }\n\n const userData = Array.isArray(lookupData) ? lookupData[0] : lookupData;\n\n if ((!userData || !userData.user_id) && !grantEveryonePerson) {\n setStatus({\n type: \"error\",\n message: `No user found with email \"${trimmedEmail}\". They may need to create an account first.`,\n });\n return;\n }\n\n targetUserId = userData?.user_id ?? null;\n }\n\n setStatus({ type: \"loading\", message: \"Sharing with user...\" });\n\n // Delegate to the onShare prop — this calls shareWithUser() in the service,\n // which validates ownership via the share_resource_with_user RPC and sends\n // the notification email. Never call the RPC directly from the UI layer.\n // A custom TABLE hands its outside door here (`grantEveryonePerson`): it grants an existing\n // account outright, inside the organization or out, and invites an address with no account.\n // So an address outside the organization is offered the outside share in this same box,\n // never refused with \"That person is not in this organization\".\n const result = grantEveryonePerson\n ? await grantEveryonePerson(\n { userId: targetUserId ?? \"\", email: trimmedEmail, name: trimmedEmail.split(\"@\", 1)[0] ?? trimmedEmail },\n permissionLevel,\n )\n : await onShare(targetUserId as string, permissionLevel);\n const errorMsg = result?.error;\n\n if (!errorMsg) {\n setStatus({\n type: \"success\",\n // THE CONFIRMATION LIVES HERE, IN THE DIALOG THAT DID IT (law 4: a sentence with an\n // inline home is not also toasted). It used to ride a legacy Radix toast, and on a\n // table page the organization gate's pick closed this dialog before anyone read it\n // (VERIFIER-18 H4) — the dialog now stays open, saying it worked.\n message: `Shared with ${trimmedEmail}. They can open it now.`,\n });\n setEmail(\"\");\n setSelectedContact(null);\n setPermissionLevel(\"viewer\");\n\n\n setTimeout(() => {\n onSuccess();\n }, 1500);\n } else {\n setStatus({ type: \"error\", message: errorMsg });\n }\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Something went wrong\";\n setStatus({ type: \"error\", message: `Unexpected error: ${message}` });\n }\n };\n\n const isLoading = status.type === \"loading\";\n\n return (\n <div className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\">\n <div>\n <h3 className=\"text-sm font-medium mb-1\">Share with User</h3>\n <p className=\"text-xs text-muted-foreground\">\n Select a contact or enter an email address\n </p>\n </div>\n\n {/* STATUS MESSAGE */}\n {status.type !== \"idle\" && (\n <div\n className={`p-2 rounded-md flex items-start gap-2 text-xs ${\n status.type === \"loading\"\n ? \"bg-blue-500/10 text-blue-700 dark:text-blue-300 border border-blue-500/20\"\n : status.type === \"success\"\n ? \"bg-green-500/10 text-green-700 dark:text-green-300 border border-green-500/20\"\n : \"bg-red-500/10 text-red-700 dark:text-red-300 border border-red-500/20\"\n }`}\n >\n {status.type === \"loading\" && (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin flex-shrink-0 mt-0.5\" />\n )}\n {status.type === \"success\" && (\n <CheckCircle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5\" />\n )}\n {status.type === \"error\" && (\n <XCircle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5\" />\n )}\n <span className=\"flex-1\">{status.message}</span>\n {status.type === \"error\" && (\n <>\n {/*\n * THE FAILURE IS THE PAYLOAD. \"No user found with email X — they\n * may need to create an account first\" is exactly the sentence a\n * user hands an agent, and it is only actionable together with\n * the LIVE form state that produced it: the address they typed,\n * the contact they picked, the level they chose. Built inside the\n * click handler so it reads the current inputs, never a stale\n * render.\n */}\n <CopyButtons\n size=\"xs\"\n label=\"Share failure\"\n human={() =>\n [\n \"Sharing with a user failed.\",\n `Error shown: ${status.message}`,\n `Email entered: ${email.trim() || \"(empty)\"}`,\n `Contact selected: ${\n selectedContact\n ? `${selectedContact.display_name ?? selectedContact.email} (${selectedContact.source})`\n : \"none\"\n }`,\n `Permission level chosen: ${permissionLevel}`,\n `Resource: ${resourceType}:${resourceId}`,\n ].join(\"\\n\")\n }\n json={() => ({\n error: status.message,\n email: email.trim(),\n selected_contact: selectedContact,\n permission_level: permissionLevel,\n resource_type: resourceType,\n resource_id: resourceId,\n })}\n agent={() => ({\n kind: \"share-with-user-failure\",\n location: sharingLocation(copy?.surface ?? \"Share with user\"),\n description:\n \"A share-with-user attempt that failed, with the error sentence on screen and the live form state that produced it.\",\n data: {\n rendered_error: status.message,\n form_state: {\n email_entered: email.trim(),\n selected_contact: selectedContact,\n permission_level: permissionLevel,\n contacts_available: connections.length,\n },\n resource: {\n type: resourceType,\n id: resourceId,\n name: copy?.resourceName ?? null,\n },\n kpis: copy?.kpis ?? null,\n },\n attributes: {\n ...(copy?.kpis ?? {}),\n resource_type: resourceType,\n resource_id: resourceId,\n state: \"error\",\n permission_level: permissionLevel,\n },\n })}\n />\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n onClick={resetStatus}\n className=\"text-xs underline hover:no-underline flex-shrink-0\"\n >\n Dismiss\n </button>\n </>\n )}\n </div>\n )}\n\n <div className=\"space-y-2.5\">\n {/* CONTACTS LIST */}\n {!selectedContact && (\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs flex items-center gap-1.5\">\n <Users className=\"w-3 h-3\" />\n Your Contacts\n </Label>\n {connectionsLoading ? (\n <div className=\"flex items-center justify-center py-4 text-xs text-muted-foreground\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin mr-2\" />\n Loading contacts...\n </div>\n ) : connectionsError && connections.length === 0 ? (\n <ConnectionsReadNotice\n error={connectionsError}\n partialFailures={connectionsPartial}\n hasRows={false}\n onRetry={() => void refreshConnections()}\n />\n ) : connections.length === 0 ? (\n <p className=\"text-xs text-muted-foreground py-2 text-center\">\n No contacts found. Enter an email below.\n </p>\n ) : (\n <>\n <ConnectionsReadNotice\n error={connectionsError}\n partialFailures={connectionsPartial}\n hasRows\n onRetry={() => void refreshConnections()}\n />\n {connections.length > 5 && (\n <div>\n <UserSearchField\n placeholder=\"Search contacts...\"\n value={searchQuery}\n onValueChange={setSearchQuery}\n onUserSelect={(user: UserSearchCandidate) => {\n const contact = searchableConnections.find(\n (candidate) => candidate.user_id === user.id,\n );\n if (contact) selectContact(contact);\n }}\n candidates={userSearchCandidates}\n title=\"Search your contacts\"\n disabled={isLoading}\n className=\"w-full\"\n inputClassName=\"h-8 text-xs\"\n />\n </div>\n )}\n <ScrollArea className=\"max-h-36 rounded-md border bg-background\">\n <div className=\"p-1\">\n {filteredConnections.length === 0 ? (\n <p className=\"text-xs text-muted-foreground py-2 text-center\">\n No matching contacts\n </p>\n ) : (\n filteredConnections.map((contact) => {\n const SourceIcon = SOURCE_ICONS[contact.source];\n return ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button\n key={contact.user_id}\n onClick={() => selectContact(contact)}\n disabled={isLoading}\n className=\"w-full flex items-center gap-2 p-1.5 rounded-md hover:bg-accent/50 transition-colors text-left disabled:opacity-50\"\n >\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={contact.avatar_url || undefined}\n />\n <AvatarFallback className=\"text-[10px] bg-primary/10 text-primary-ink\">\n {getInitials(contact.display_name ?? contact.email)}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium truncate\">\n {contact.display_name ||\n contact.email ||\n \"Unknown\"}\n </p>\n {contact.display_name && contact.email && (\n <p className=\"text-[10px] text-muted-foreground truncate\">\n {contact.email}\n </p>\n )}\n </div>\n <span className=\"flex items-center gap-1 text-[10px] text-muted-foreground flex-shrink-0\">\n <SourceIcon className=\"w-3 h-3\" />\n {SOURCE_LABELS[contact.source]}\n </span>\n </button>\n );\n })\n )}\n </div>\n </ScrollArea>\n </>\n )}\n </div>\n )}\n\n {/* SELECTED CONTACT CHIP */}\n {selectedContact && (\n <div className=\"flex items-center gap-2 p-2 rounded-md bg-primary/5 border border-primary/20\">\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage src={selectedContact.avatar_url || undefined} />\n <AvatarFallback className=\"text-[10px] bg-primary/10 text-primary-ink\">\n {getInitials(\n selectedContact.display_name ?? selectedContact.email,\n )}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium truncate\">\n {selectedContact.display_name || selectedContact.email}\n </p>\n {selectedContact.display_name && selectedContact.email && (\n <p className=\"text-[10px] text-muted-foreground truncate\">\n {selectedContact.email}\n </p>\n )}\n </div>\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n onClick={clearContact}\n disabled={isLoading}\n className=\"text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50\"\n >\n <XCircle className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n\n {/* MANUAL EMAIL INPUT */}\n {!selectedContact && (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"user-email\" className=\"text-xs\">\n Or enter email manually\n </Label>\n <UserSearchField\n id=\"user-email\"\n placeholder=\"user@example.com\"\n value={email}\n onValueChange={(value: string) => {\n setEmail(value);\n if (status.type === \"error\") resetStatus();\n }}\n onUserSelect={(user: UserSearchCandidate) => {\n const contact = searchableConnections.find(\n (candidate) => candidate.user_id === user.id,\n );\n if (contact) selectContact(contact);\n }}\n candidates={userSearchCandidates}\n resolveCandidates={resolveTypedEmail}\n title=\"Choose a user to share with\"\n inputType=\"email\"\n disabled={isLoading}\n inputClassName=\"h-9\"\n />\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"user-permission\" className=\"text-xs\">\n Permission Level\n </Label>\n <Select\n value={permissionLevel}\n onValueChange={(value: string) =>\n setPermissionLevel(value as PermissionLevel)\n }\n disabled={isLoading}\n >\n <SelectTrigger id=\"user-permission\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {levelWording === \"notion\"\n ? [...PERMISSION_LEVELS].reverse().map((level) => (\n <SelectItem key={level} value={level} disabled={whyNotLevel(level) !== null} title={whyNotLevel(level) ?? PERMISSION_LEVEL_HINTS[level]}>\n {PERMISSION_LEVEL_LABELS[level]}\n </SelectItem>\n ))\n : (\n <>\n <SelectItem value=\"viewer\" disabled={whyNotLevel(\"viewer\") !== null} title={whyNotLevel(\"viewer\") ?? PERMISSION_LEVEL_HINTS.viewer}>{PERMISSION_LEVEL_SHORT_LABELS.viewer}</SelectItem>\n {/* VIS-17b: `commenter` is the FOURTH rung of the one ladder — it has been in\n `public.permission_level` since G0 and every policy and RPC accepts it, and\n this picker was the one place a person could not choose it (lane SHARE,\n 2026-09-19). A ladder with a rung nobody can reach is not one ladder. */}\n <SelectItem value=\"commenter\" disabled={whyNotLevel(\"commenter\") !== null} title={whyNotLevel(\"commenter\") ?? PERMISSION_LEVEL_HINTS.commenter}>{PERMISSION_LEVEL_SHORT_LABELS.commenter}</SelectItem>\n <SelectItem value=\"editor\" disabled={whyNotLevel(\"editor\") !== null} title={whyNotLevel(\"editor\") ?? PERMISSION_LEVEL_HINTS.editor}>{PERMISSION_LEVEL_SHORT_LABELS.editor}</SelectItem>\n {/* THE SCOPE-QUALIFIED ADMIN RULE (access/DECISIONS.md 2026-09-10): the heading\n above is \"Permission Level\", which names no item, so the bare \"Admin\" is\n qualified here. */}\n <SelectItem value=\"admin\" disabled={whyNotLevel(\"admin\") !== null} title={whyNotLevel(\"admin\") ?? PERMISSION_LEVEL_HINTS.admin}>{PERMISSION_LEVEL_SHORT_LABELS.admin}</SelectItem>\n </>\n )}\n </SelectContent>\n </Select>\n <PermissionLevelDescription level={permissionLevel} />\n {/* Full access (and anything else this person may not give) is disabled above; one line says why. */}\n {chosenWhy ? <p className=\"text-xs text-muted-foreground\">{chosenWhy}</p> : null}\n {!chosenWhy && whyNotLevel(\"admin\") ? (\n <p className=\"text-xs text-muted-foreground\" data-share-level-reason=\"\">\n {whyNotLevel(\"admin\")}\n </p>\n ) : null}\n {grantable?.outside ? (\n <p className=\"text-xs text-muted-foreground\" data-share-outside-reason=\"\">\n {grantable.outside}\n </p>\n ) : null}\n </div>\n\n <Button\n variant=\"primary\"\n onClick={handleShare}\n disabled={isLoading || !email.trim() || chosenWhy !== null}\n className=\"w-full\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {status.message || \"Processing...\"}\n </>\n ) : (\n <>\n <UserPlus className=\"w-4 h-4 mr-2\" />\n Share with User\n </>\n )}\n </Button>\n\n {/* SHARE-PEOPLE-ONLY: the whole-team convenience, as people. Replaces the old\n \"Share with Organization\" tab, which granted an organization. */}\n <AddEveryoneInOrg\n level={permissionLevel}\n whyNotLevel={whyNotLevel}\n grantPerson={\n grantEveryonePerson ??\n ((person, level) => onShare(person.userId, level))\n }\n alreadySharedUserIds={alreadySharedUserIds ?? []}\n onDone={onSuccess}\n {...(organizationId ? { defaultOrgId: organizationId } : {})}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — ScrollArea lives in `@ai-matrx/design-system`, which\n * additionally exposes the viewport (`viewportClassName`, `viewportRef`) that\n * this fork kept sealed. `viewportRef` is the scrolling element — the one\n * `scrollTop` lives on, which programmatic scroll-to-bottom needs.\n */\n\nexport { ScrollArea, ScrollBar } from \"@ai-matrx/design-system\";\nexport type { ScrollAreaProps } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — Avatar lives in `@ai-matrx/design-system`. Its default\n * `size` is `lg`, the `h-10 w-10` box this repo has always used, so nothing is\n * bound here. The package's fallback also carries defined type\n * (`text-muted-foreground`, sized with the avatar) instead of inheriting\n * whatever the surrounding row happened to set.\n */\n\nexport { Avatar, AvatarFallback, AvatarImage } from \"@ai-matrx/design-system\";\nexport type { AvatarProps, AvatarSize } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * features/sharing/components/AddEveryoneInOrg.tsx\n *\n * \"ADD EVERYONE IN <ORGANIZATION>\" — THE HONEST REPLACEMENT FOR \"SHARE WITH ORGANIZATION\".\n *\n * Owner ruling (Arman, 2026-09-23): access is personal. Permission is granted to a PERSON, never\n * to an organization. The Share dialog used to carry a \"Share with Organization\" tab that wrote\n * one grant to a whole organization; the store now refuses that with \"Shares name a person, not\n * an organization.\" (lane SHARE-PEOPLE-ONLY, 2026-09-25).\n *\n * The convenience it offered, giving everybody on a team the thing at once, lives here instead.\n * The person picks one of THEIR organizations. Its CURRENT members are listed by name, each with\n * a checkbox and all ticked. Pressing the button grants each ticked PERSON through the same door\n * the single-person share uses. Nobody who joins later is included, and the panel says so in one\n * sentence.\n *\n * A TEAM IS THE SAME CONVENIENCE, NARROWER (AT-SHARE-B, Airtable parity \"user groups\"). Once an organization is\n * picked, its teams (the platform's own `iam.team`, read through `team_list`) are offered beside \"Everyone\"; picking\n * one lists that team's current members (`team_members`) and grants each PERSON the same way. A team is never a\n * grantee: what a team member gets is their own share, and people who join the team later are not added.\n */\n\nimport { readOrganizationMemberRows } from \"@ai-matrx/sharing/core\";\nimport { listTeamMembers, listTeams, type Team } from \"@ai-matrx/sharing/core\";\nimport React, { useEffect, useState } from \"react\";\nimport { Building2, CheckCircle, Loader2, Users, XCircle } from \"lucide-react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { organizationDisambiguators } from \"@ai-matrx/sharing/core\";\nimport { useOrganizationsToCreateIn } from \"./host\";\nimport { useCurrentUserId } from \"./host\";\nimport { PERMISSION_LEVELS, PERMISSION_LEVEL_SHORT_LABELS } from \"@ai-matrx/sharing/core\";\nimport type {\n PermissionLevel,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** One current member of the chosen organization, as the dialog shows them. */\nexport interface OrgMemberPerson {\n userId: string;\n email: string;\n name: string;\n}\n\nexport interface AddEveryoneInOrgProps {\n /** Grants ONE person. The same door the single-person share uses. */\n grantPerson: (\n person: OrgMemberPerson,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n /** The level picked in the People tab: the block's own level starts here, and follows it until the person picks one here. */\n level: PermissionLevel;\n /** Why a level may not be given on this thing (null: may). Those levels are shown disabled with the reason. */\n whyNotLevel?: (level: PermissionLevel) => string | null;\n /** People who already hold a grant on this thing. They are shown, not re-granted. */\n alreadySharedUserIds?: string[] | undefined;\n /** Called once after a run that granted at least one person. */\n onDone?: () => void;\n /**\n * The organization the thing lives in, when the dialog knows it. It is chosen first, so \"Add\n * everyone in <that organization>\" is one press away; any other organization the person\n * belongs to stays one pick away.\n */\n defaultOrgId?: string | undefined;\n}\n\ntype Outcome = { ok: boolean; say: string };\n\n/** \"Everyone in the organization\" — the default pick of the group select. */\nconst EVERYONE = \"__everyone__\";\n\nasync function readTeamMembers(teamId: string): Promise<OrgMemberPerson[]> {\n const rows = await listTeamMembers(teamId);\n return rows.map((row) => ({\n userId: row.userId,\n email: row.email ?? \"\",\n name: row.displayName || row.email || \"Unnamed person\",\n }));\n}\n\nasync function readMembers(orgId: string): Promise<OrgMemberPerson[]> {\n // THE ONE ROSTER READ (joined in flight, reused for 30 s).\n const data = await readOrganizationMemberRows(orgId);\n return data.map((row) => ({\n userId: row.user_id,\n email: row.user_email ?? \"\",\n name: row.user_display_name || row.user_email || \"Unnamed person\",\n }));\n}\n\nexport function AddEveryoneInOrg({\n grantPerson,\n level: sectionLevel,\n whyNotLevel,\n alreadySharedUserIds = [],\n onDone,\n defaultOrgId,\n}: AddEveryoneInOrgProps) {\n const { orgs } = useOrganizationsToCreateIn();\n const detail = organizationDisambiguators(orgs);\n const me = useCurrentUserId();\n const [open, setOpen] = useState(false);\n const [orgId, setOrgId] = useState(\"\");\n const [members, setMembers] = useState<OrgMemberPerson[] | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [ticked, setTicked] = useState<Set<string>>(new Set());\n const [running, setRunning] = useState(false);\n const [outcomes, setOutcomes] = useState<Record<string, Outcome>>({});\n const [teams, setTeams] = useState<Team[]>([]);\n const [teamsError, setTeamsError] = useState<string | null>(null);\n const [group, setGroup] = useState(EVERYONE);\n // THE BLOCK'S OWN LEVEL: starts at the People tab's level and follows it until the person picks one here.\n const [ownLevel, setOwnLevel] = useState<PermissionLevel | null>(null);\n const level = ownLevel ?? sectionLevel;\n\n const orgLabel = orgs.find((o) => o.id === orgId)?.name ?? \"this organization\";\n const team = group === EVERYONE ? undefined : teams.find((t) => t.id === group);\n // Every sentence below names the group being added: the organization, or the team picked inside it.\n const orgName = team ? team.name : orgLabel;\n\n // The organization's teams, offered beside \"Everyone\". None: the group select is absent.\n useEffect(() => {\n if (!open || !orgId) return;\n let cancelled = false;\n setTeams([]);\n setTeamsError(null);\n setGroup(EVERYONE);\n listTeams(orgId)\n .then((rows) => {\n if (!cancelled) setTeams(rows.filter((t) => t.archivedAt === null && t.memberCount > 0));\n })\n .catch((err: unknown) => {\n if (!cancelled) setTeamsError(err instanceof Error ? err.message : \"The teams could not be listed.\");\n });\n return () => {\n cancelled = true;\n };\n }, [open, orgId]);\n const already = new Set(alreadySharedUserIds);\n\n useEffect(() => {\n if (!open || !orgId) return;\n let cancelled = false;\n setMembers(null);\n setLoadError(null);\n setOutcomes({});\n (group === EVERYONE ? readMembers(orgId) : readTeamMembers(group))\n .then((rows) => {\n if (cancelled) return;\n const others = rows.filter((m) => m.userId !== me);\n setMembers(others);\n // All on by default, except people who already have it.\n setTicked(\n new Set(others.filter((m) => !already.has(m.userId)).map((m) => m.userId)),\n );\n })\n .catch((err: unknown) => {\n if (!cancelled)\n setLoadError(\n err instanceof Error ? err.message : \"The member list could not be read.\",\n );\n });\n return () => {\n cancelled = true;\n };\n // `already` is read once per organization pick on purpose: a grant made here must not\n // untick the row it just granted while the results are on screen.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, orgId, group, me]);\n\n const toggle = (userId: string, on: boolean) =>\n setTicked((prev) => {\n const next = new Set(prev);\n if (on) next.add(userId);\n else next.delete(userId);\n return next;\n });\n\n const chosen = (members ?? []).filter((m) => ticked.has(m.userId));\n\n const run = async () => {\n setRunning(true);\n const next: Record<string, Outcome> = {};\n let granted = 0;\n for (const person of chosen) {\n try {\n const result = await grantPerson(person, level);\n next[person.userId] = result.success\n ? { ok: true, say: \"Shared\" }\n : { ok: false, say: result.error || \"Not shared\" };\n if (result.success) granted += 1;\n } catch (err: unknown) {\n next[person.userId] = {\n ok: false,\n say: err instanceof Error ? err.message : \"Not shared\",\n };\n }\n setOutcomes({ ...next });\n }\n setRunning(false);\n setTicked(new Set());\n if (granted > 0) onDone?.();\n };\n\n // No organization to add from: the control is absent, never a picker with nothing in it.\n if (orgs.length === 0) return null;\n\n if (!open) {\n return (\n <Button\n icon={<Users />}\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => {\n // Start on the thing's own organization when the person is in it.\n if (!orgId && defaultOrgId && orgs.some((o) => o.id === defaultOrgId))\n setOrgId(defaultOrgId);\n setOpen(true);\n }}\n >\n Add everyone in an organization or team\n </Button>\n );\n }\n\n return (\n <div\n className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\"\n data-add-everyone-in-org\n >\n <div>\n <h3 className=\"type-title mb-1\">\n Add everyone in {orgId ? orgName : \"an organization\"}\n </h3>\n <p className=\"type-secondary text-muted-foreground\">\n Each person below is given access by name. People who join later are\n not added.\n </p>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-org\" className=\"text-xs\">\n Organization\n </Label>\n <Select value={orgId} onValueChange={setOrgId} disabled={running}>\n <SelectTrigger id=\"add-everyone-org\">\n <SelectValue placeholder=\"Choose one of your organizations\" />\n </SelectTrigger>\n <SelectContent>\n {orgs.map((org) => (\n <SelectItem key={org.id} value={org.id}>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"w-3 h-3\" />\n <span>{org.name}</span>\n {detail.get(org.id) && (\n <span className=\"type-meta text-muted-foreground\">\n {detail.get(org.id)}\n </span>\n )}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {orgId && teams.length > 0 ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-group\" className=\"text-xs\">\n Who\n </Label>\n <Select value={group} onValueChange={setGroup} disabled={running}>\n <SelectTrigger id=\"add-everyone-group\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={EVERYONE}>Everyone in {orgLabel}</SelectItem>\n {teams.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.name}\n <span className=\"type-meta text-muted-foreground\"> · {t.memberCount}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {orgId ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-level\" className=\"text-xs\">\n They get\n </Label>\n <Select\n value={level}\n onValueChange={(v) => setOwnLevel(v as PermissionLevel)}\n disabled={running}\n >\n <SelectTrigger id=\"add-everyone-level\" data-add-everyone-level={level}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PERMISSION_LEVELS.map((l) => (\n <SelectItem key={l} value={l} disabled={(whyNotLevel?.(l) ?? null) !== null} title={whyNotLevel?.(l) ?? undefined}>\n {PERMISSION_LEVEL_SHORT_LABELS[l]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {orgId && teamsError ? (\n <p className=\"type-secondary text-destructive\">\n The teams in {orgLabel} could not be listed: {teamsError}\n <ShareErrorAlchemyMenu error={teamsError} />\n </p>\n ) : null}\n\n {orgId && loadError ? (\n <p className=\"type-secondary text-destructive\">\n The people in {orgName} could not be listed: {loadError}\n <ShareErrorAlchemyMenu error={loadError} />\n </p>\n ) : null}\n {orgId && !loadError && members === null ? (\n <div className=\"flex items-center gap-2 type-secondary text-muted-foreground\">\n <Loader2 className=\"w-3 h-3 animate-spin\" /> Listing the people in{\" \"}\n {orgName}…\n </div>\n ) : null}\n {members && members.length === 0 ? (\n <p className=\"type-secondary text-muted-foreground\">\n Nobody else is in {orgName}.\n </p>\n ) : null}\n\n {members && members.length > 0 ? (\n <ul className=\"space-y-1 max-h-56 overflow-y-auto\" aria-label={`People in ${orgName}`}>\n {members.map((m) => {\n const has = already.has(m.userId);\n const outcome = outcomes[m.userId];\n return (\n <li\n key={m.userId}\n className=\"flex items-center gap-2 type-body\"\n data-member={m.email}\n >\n <Checkbox\n size=\"sm\"\n id={`add-everyone-${m.userId}`}\n checked={ticked.has(m.userId)}\n disabled={running || has || !!outcome?.ok}\n onCheckedChange={(v) => toggle(m.userId, v === true)}\n />\n <label\n htmlFor={`add-everyone-${m.userId}`}\n className=\"flex-1 min-w-0\"\n >\n <span className=\"block truncate\">{m.name}</span>\n {m.email && m.email !== m.name ? (\n <span className=\"block truncate type-secondary text-muted-foreground\">\n {m.email}\n </span>\n ) : null}\n </label>\n {has && !outcome ? (\n <span className=\"type-secondary text-muted-foreground\">\n Already has access\n </span>\n ) : null}\n {outcome ? (\n <span\n className={`flex items-center gap-1 text-xs ${outcome.ok ? \"text-green-700 dark:text-green-400\" : \"text-destructive\"}`}\n >\n {outcome.ok ? (\n <CheckCircle className=\"w-3 h-3\" />\n ) : (\n <XCircle className=\"w-3 h-3\" />\n )}\n {outcome.say}\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : null}\n\n {members && members.length > 0 && chosen.length === 0 && !running ? (\n <p className=\"type-secondary text-muted-foreground\">\n {Object.values(outcomes).some((o) => o.ok) ||\n members.every((m) => already.has(m.userId))\n ? `Everyone listed in ${orgName} has access now.`\n : \"Tick the people to add.\"}\n </p>\n ) : null}\n {members && members.length > 0 && (chosen.length > 0 || running) ? (\n <Button\n variant=\"primary\"\n type=\"button\"\n onClick={run}\n disabled={running || chosen.length === 0}\n className=\"w-full\"\n >\n {running ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Sharing…\n </>\n ) : (\n <>\n <Users className=\"w-4 h-4 mr-2\" />\n {/* read-gate-exempt: counts the people the person ticked (the member list's failure is said by loadError), not a read */}\n Share with {chosen.length}{\" \"}\n {chosen.length === 1 ? \"person\" : \"people\"}\n </>\n )}\n </Button>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\n// features/sharing/outside/OutsideSharePanel.tsx\n//\n// THE ROUTE FROM THE REFUSAL TO THE REMEDY.\n//\n// 🚨 WHAT THIS REPLACES (lane PEEK-SHARE §3, measured not guessed). The Share\n// dialog printed the store's refusal — *\"That person is not in this\n// organization, so they cannot be given access to this table yet\"* — listed\n// three ways forward, and offered no way to take any of them. A person had to\n// leave the dialog, find an organization setting, and come back. That is a dead\n// end with good manners.\n//\n// WHAT IT IS. One section inside the ONE share dialog, for a table in the\n// record store. It draws exactly what the store says it may draw\n// (`custom.table_share_outside` answers `lane_open`, `may_invite`,\n// `my_level` and `levels`), so no control here is ever live\n// when the door behind it would refuse — and when a control is absent the panel\n// says, in a sentence, who can do the thing instead. Absent or honest, never\n// dead.\n//\n// IT IS NOT A SECOND SHARE SURFACE. The grant it produces is an ordinary\n// `iam.permissions` row on the Table, read by the same ladder as every other\n// share; the pending state is an `iam.invitations` row, the platform's one\n// invitation primitive. Nothing new was invented to hold either.\n\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n AlertTriangle,\n Check,\n Globe2,\n Link2,\n Loader2,\n MailWarning,\n RotateCw,\n Send,\n Trash2,\n} from \"lucide-react\";\n\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Input } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { useToast } from \"./host\";\nimport { confirm } from \"./host\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\n\nimport {\n absoluteInviteUrl,\n shareWithOutsidePerson,\n readOutsideShare,\n resendOutside,\n revokeOutside,\n type OutsideShareState,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** The one sentence a shut lane gets. Exported so the test asserts the words. */\nexport const LANE_CLOSED_SAY =\n \"This organization's administrator has turned off sharing with people outside it.\";\n\nexport interface OutsideSharePanelProps {\n organizationId: string;\n tableId: string;\n tableName: string;\n /**\n * 🚨 SO THE LIST ABOVE CANNOT CONTRADICT THE ROWS BELOW (FIX-10C, VERIFIER-10\n * F13). The grant list up the page knows only about grants, which is correct\n * and was still how \"Not shared with anyone\" came to stand directly over an\n * invited person. This panel tells its host how many people are invited and\n * not yet joined; the host passes that to the grant list's empty state.\n */\n onPendingChange?: ((count: number) => void) | undefined;\n /**\n * An address already inside the organization is GRANTED the table rather than\n * invited (FIX-10C, VERIFIER-10 F7), and that grant belongs in the list at the\n * top of this dialog, not here. So the host is told to re-read it — otherwise\n * the person gets a sentence saying it happened and an unchanged screen.\n */\n onGranted?: (() => void) | undefined;\n}\n\nexport function OutsideSharePanel({\n organizationId,\n tableId,\n tableName,\n onPendingChange,\n onGranted,\n}: OutsideSharePanelProps) {\n const { toast } = useToast();\n const [state, setState] = useState<OutsideShareState | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [level, setLevel] = useState(\"viewer\");\n /** Which row's link was just copied, so the button can say so for a moment. */\n const [copied, setCopied] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n setLoadError(null);\n try {\n const answer = await readOutsideShare(organizationId, tableId);\n setState(answer);\n // The store already capped the list at what this person may give, so the\n // picker's default is simply the lowest rung it returned.\n setLevel((current) =>\n answer.levels.some((l) => l.level === current)\n ? current\n : (answer.levels[0]?.level ?? \"viewer\"),\n );\n } catch (error) {\n // 🚨 A FAILED READ IS NOT A FACT. It does not mean the lane is shut; it\n // means nobody could look. Same rule as the record store's own switch.\n setState(null);\n setLoadError(error instanceof Error ? error.message : String(error));\n }\n }, [organizationId, tableId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // A read that FAILED says nothing about how many are pending, so it reports\n // zero rather than a guess — the same rule the panel's own error state obeys.\n useEffect(() => {\n onPendingChange?.((state?.invitations ?? []).filter((row) => !row.joined).length);\n }, [state, onPendingChange]);\n\n /**\n * 🚨 PUTTING THE LINK IN SOMEBODY'S HAND IS THE ORDINARY CASE, NOT A FALLBACK.\n * A plumber texts his customer the link. So this control is drawn beside every\n * pending row whether or not email works here, and it goes through THE ONE copy\n * primitive — which, when the browser refuses to write the clipboard, puts the\n * text in front of the person instead of lying that it copied.\n */\n const copyLink = useCallback(\n async (invitationId: string, acceptPath: string, who: string) => {\n const url = absoluteInviteUrl(acceptPath);\n // It routes its own terminal failure to the manual-copy dialog, which puts\n // the text in front of the person — so a `false` here means the copy has\n // NOT happened and saying \"Copied\" would be a lie.\n const ok = await copyText(url).then((r: unknown) => r !== false, () => false);\n if (!ok) return;\n setCopied(invitationId);\n toast({ title: `Link copied. Send it to ${who} however you like.` });\n window.setTimeout(\n () => setCopied((c) => (c === invitationId ? null : c)),\n 2000,\n );\n },\n [toast],\n );\n\n const run = async (\n key: string,\n work: () => Promise<{ say: string; delivery?: { say: string } | null | undefined }>,\n ) => {\n setBusy(key);\n try {\n const answer = await work();\n // TWO facts, not one: what happened to the share, and what happened to the\n // message. Collapsing them is how \"invited\" came to mean \"told\".\n toast({ title: answer.say, description: answer.delivery?.say });\n await refresh();\n } catch (error) {\n toast({\n title: \"That did not happen\",\n description: error instanceof Error ? error.message : String(error),\n variant: \"destructive\",\n });\n } finally {\n setBusy(null);\n }\n };\n\n if (loadError) {\n return (\n <div className=\"rounded-lg border border-destructive/20 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-destructive\">\n We could not check who outside this organization can see {tableName}\n <ShareErrorAlchemyMenu />\n </p>\n <p className=\"mt-0.5 text-xs text-destructive/80\">\n Nobody was added or removed. This does not mean sharing outside is switched\n off — we simply could not look.\n </p>\n <p className=\"mt-1 break-words text-xs text-muted-foreground\">{loadError}</p>\n </div>\n </div>\n <Button variant=\"outline\" className=\"mt-2\" onClick={() => void refresh()}>\n Try again\n </Button>\n </div>\n );\n }\n\n if (!state) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\" aria-busy=\"true\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Checking who outside this organization can see {tableName}…</span>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3 rounded-lg border p-3\">\n <div className=\"flex items-start gap-2\">\n <Globe2 className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">People outside this organization</h3>\n {/* 🚨 NAMING A PERSON IS THE ONLY ACT (owner ruling, SHARE-GATE-OFF,\n 2026-09-23). There is no switch to press here: sharing outside is on\n by default, and an organization administrator who turned it off did\n so on purpose in settings. So a shut lane gets ONE sentence and no\n control — never a button in front of the invite. */}\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {state.lane_open ? state.say : LANE_CLOSED_SAY}\n </p>\n </div>\n </div>\n\n {/* 🚨 WHAT THIS SERVER CAN ACTUALLY DO ABOUT EMAIL, said BEFORE anybody\n presses Invite — never a promise the server cannot keep. The store\n answers yes / no / unknown; only the two that are not \"yes\" get a\n notice, because \"it emails them, and you can also copy the link\"\n already reads on the invite row itself. */}\n {state.lane_open &&\n state.may_invite &&\n state.email_delivery?.answer !== \"yes\" ? (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 p-2\">\n <MailWarning className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-xs text-muted-foreground\">\n {state.email_say}\n </p>\n </div>\n ) : null}\n\n {/* THE INVITE. */}\n {state.lane_open && state.may_invite ? (\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-end\">\n <div className=\"min-w-0 flex-1\">\n <Label htmlFor=\"outside-email\" className=\"text-xs\">\n Their email address\n </Label>\n <Input\n id=\"outside-email\"\n type=\"email\"\n placeholder=\"name@theircompany.com\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n />\n </div>\n <div className=\"sm:w-44\">\n <Label htmlFor=\"outside-level\" className=\"text-xs\">\n They can\n </Label>\n <Select value={level} onValueChange={setLevel}>\n <SelectTrigger id=\"outside-level\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* Exactly the rungs the store said this person may give. */}\n {state.levels.map((l) => (\n <SelectItem key={l.level} value={l.level}>\n {l.means}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <Button\n icon={busy === \"invite\" ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Send />\n )}\n variant=\"primary\"\n disabled={!email.trim() || busy === \"invite\"}\n onClick={() =>\n void run(\"invite\", async () => {\n const answer = await shareWithOutsidePerson(organizationId, tableId, email.trim(), level);\n setEmail(\"\");\n // An existing account (inside or outside the organization) was\n // given the table outright — the row for that lives in the grant\n // list above, so ask the host to re-read it (FIX-10C F7,\n // MOVE-AND-OUTSIDER). Only an address with no account is invited.\n if (answer.granted) onGranted?.();\n return answer;\n })\n }\n >\n Share\n </Button>\n </div>\n ) : null}\n\n {/* WHO IS OUT THERE, and which of them has actually joined. */}\n {state.invitations.length > 0 ? (\n <ul className=\"divide-y rounded-md border\">\n {state.invitations.map((row) => (\n <li key={row.invitation_id} className=\"flex items-start gap-2 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"truncate text-sm font-medium\">{row.email}</span>\n <span\n className={\n row.joined\n ? \"rounded-full bg-primary/10 px-1.5 py-0.5 text-xs\"\n : \"rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\"\n }\n >\n {row.joined ? row.level_label : \"Invited, not yet joined\"}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{row.say}</p>\n </div>\n {state.may_invite ? (\n <div className=\"flex flex-shrink-0 gap-1\">\n {/* 🚨 COPY THE LINK — beside the pending row, always, whether\n or not email works here. The real case is a plumber texting\n his customer; the email is the convenience, not the other\n way round. Absent only when there is no link to give: an\n accepted row has nothing left to open. */}\n {row.accept_path ? (\n <Button\n icon={copied === row.invitation_id ? (\n <Check />\n ) : (\n <Link2 />\n )}\n variant=\"quiet\"\n title=\"Copy invitation link\"\n onClick={() =>\n void copyLink(\n row.invitation_id,\n row.accept_path!,\n row.email,\n )\n }\n >\n <span className=\"text-xs\">\n {copied === row.invitation_id ? \"Copied\" : \"Copy link\"}\n </span>\n </Button>\n ) : null}\n {!row.joined ? (\n <Button\n icon={busy === `resend:${row.invitation_id}` ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <RotateCw />\n )} aria-label=\"Send a fresh link\"\n variant=\"quiet\"\n title=\"Send a fresh link\"\n disabled={busy === `resend:${row.invitation_id}`}\n onClick={() =>\n void run(`resend:${row.invitation_id}`, () =>\n resendOutside(organizationId, row.invitation_id),\n )\n }\n />\n ) : null}\n <Button\n icon={busy === `revoke:${row.invitation_id}` ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Trash2 />\n )} aria-label={row.joined ? \"Take their access away\" : \"Withdraw the invitation\"}\n variant=\"quiet\"\n title={row.joined ? \"Take their access away\" : \"Withdraw the invitation\"}\n disabled={busy === `revoke:${row.invitation_id}`}\n onClick={() =>\n void (async () => {\n // A destructive click names its consequence before it happens.\n const ok = await confirm({\n title: row.joined\n ? `Take ${row.email}'s access to ${tableName} away?`\n : `Withdraw ${row.email}'s invitation?`,\n description: row.joined\n ? `They lose ${tableName} immediately — anything they have open refuses the next time it asks — and, because this table is the only reason they can reach this organization at all, they lose that too. You can invite them again afterwards.`\n : \"Their link stops working. They never had access, so there is nothing to take away.\",\n confirmLabel: row.joined ? \"Take it away\" : \"Withdraw\",\n variant: \"destructive\",\n });\n if (!ok) return;\n await run(`revoke:${row.invitation_id}`, () =>\n revokeOutside(organizationId, row.invitation_id),\n );\n })()\n }\n />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\n// @ai-matrx/sharing/react — WhoCouldSeeOn — \"Who could see this on…\" (lane CLOSE-SHARE, acceptance test 15).\n//\n// A person with Full access picks a past moment; the store replays History (custom.who_could_see_on →\n// history.who_could_see) and answers in names, each marked when they no longer have access. Refusals (History was not\n// recording then, not Full access) are the store's own sentence, shown as is.\n\nimport { useState } from \"react\";\nimport { History, Loader2 } from \"lucide-react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { DateTimeField } from \"@ai-matrx/design-system/controls\";\n\nimport { createClient, PERMISSION_LEVEL_SHORT_LABELS } from \"@ai-matrx/sharing/core\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\n\ntype StoreCaller = { rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }> };\nfunction custom(): StoreCaller {\n return (createClient() as unknown as { schema(name: string): StoreCaller }).schema(\"custom\");\n}\n\ninterface PastViewer {\n kind: string;\n id: string | null;\n name: string | null;\n email: string | null;\n level: string | null;\n via: string;\n has_access_now: boolean | null;\n}\n\nexport function WhoCouldSeeOn({ recordId }: { recordId: string }) {\n const [at, setAt] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [people, setPeople] = useState<PastViewer[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n async function ask() {\n setBusy(true);\n setError(null);\n const { data, error: failed } = await custom().rpc(\"who_could_see_on\", { p_record_id: recordId, p_at: new Date(at).toISOString() });\n setBusy(false);\n const answer = data as { success?: boolean; error?: string; people?: PastViewer[] } | null;\n if (failed || !answer?.success) {\n setPeople(null);\n setError(failed?.message ?? answer?.error ?? \"That moment could not be replayed.\");\n return;\n }\n setPeople(answer.people ?? []);\n }\n\n return (\n <section className=\"mt-3 flex flex-col gap-1.5 border-t border-border pt-3\" data-who-could-see-on={recordId}>\n <span className=\"flex items-center gap-1 text-xs font-medium\">\n <History className=\"h-3.5 w-3.5\" />\n Who could see this on…\n </span>\n <div className=\"flex items-center gap-1\">\n <DateTimeField\n aria-label=\"Moment to ask about\"\n value={at}\n onValueChange={(v) => setAt(v ?? \"\")}\n className=\"min-w-0 flex-1\"\n />\n <Button icon={busy ? <Loader2 className=\"animate-spin\" /> : null} variant=\"outline\" disabled={busy || at === \"\"} onClick={() => void ask()} data-who-could-see-ask=\"\">\n Ask\n </Button>\n </div>\n {people ? (\n people.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">Nobody could see it then.</p>\n ) : (\n <ul className=\"flex flex-col gap-0.5\" data-who-could-see-list=\"\">\n {people.map((p) => (\n <li key={`${p.kind}:${p.id ?? \"public\"}`} className=\"flex items-center justify-between gap-2 text-xs\" data-who-could-see-person={p.id ?? \"\"}>\n <span className=\"min-w-0 truncate\">\n {p.name ?? p.email ?? \"Someone\"}\n <span className=\"text-muted-foreground\"> · {p.via}</span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1 text-muted-foreground\">\n {p.level ? (PERMISSION_LEVEL_SHORT_LABELS[p.level as PermissionLevel] ?? p.level) : null}\n {p.has_access_now === false ? <span className=\"rounded border border-border px-1\" data-who-could-see-lost=\"\">No access now</span> : null}\n </span>\n </li>\n ))}\n </ul>\n )\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-xs text-destructive\" data-who-could-see-error=\"\">\n {error}\n </p>\n ) : null}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/OrgAvailabilityNote.tsx\n *\n * WHAT AN ORGANIZATION ROW IS NOW (SHARE-PEOPLE-ONLY, chair ruling 2026-09-25). A share names a\n * person. An organization grantee is written only as organization AVAILABILITY: an agent bound\n * to an organization's surface, an item contributed to its library, or the HR directory. That is\n * organization configuration, not something this dialog grants. The row still gives access,\n * though, so the dialog says so in one read-only line and never hides it. It is changed where it\n * was set, in the organization.\n */\n\nimport React from \"react\";\nimport { Building2 } from \"lucide-react\";\nimport type { PermissionWithDetails } from \"@ai-matrx/sharing/core\";\n\nconst DEFAULT_VERB: Record<string, string> = {\n viewer: \"view\",\n commenter: \"comment on\",\n editor: \"edit\",\n admin: \"manage\",\n};\n\nexport function OrgAvailabilityNote({\n permissions,\n organizationDefault,\n}: {\n permissions: PermissionWithDetails[];\n /**\n * SHARE-TAILS (chair ruling 2026-09-25): a thing nobody set to \"Only me\" is the organization's\n * default, and every member reaches it without a share. \"Not shared with anyone\" above is true\n * of shares; this line says who else really reaches it. Under \"Only me\" (access ladder T-36,\n * chair ruling 2026-10-01) members still open it by link but no longer find it in lists, so the\n * door sends no default and the lane control's \"Only me\" hint says the rest.\n */\n organizationDefault?: {\n level: string;\n organizationName: string;\n organizationId?: string | undefined;\n } | null;\n}) {\n // SHARE-LANE-CONTROL: \"Everyone in <org>\" on a record-store thing is written as that\n // organization's own availability row. It IS the default said in the line above, not a second\n // organization, so it is not listed again as \"also available\".\n const orgs = permissions.filter(\n (p) =>\n p.grantedToOrganizationId &&\n !(\n organizationDefault?.organizationId &&\n p.grantedToOrganizationId === organizationDefault.organizationId\n ),\n );\n const defaultLine = organizationDefault ? (\n <p\n className=\"mt-2 flex items-start gap-1.5 text-xs text-muted-foreground\"\n data-organization-default\n >\n <Building2 className=\"w-3 h-3 mt-0.5 flex-shrink-0\" />\n <span>\n {/* Not a share: it is chosen under \"Who can see this\" above. */}\n Everyone in {organizationDefault.organizationName} can{\" \"}\n {DEFAULT_VERB[organizationDefault.level] ?? \"open\"} this by default.\n </span>\n </p>\n ) : null;\n if (orgs.length === 0) return defaultLine;\n const names = orgs.map(\n (p) => p.grantedToOrganization?.name ?? \"an organization\",\n );\n return (\n <>\n {defaultLine}\n <p\n className=\"mt-2 flex items-start gap-1.5 text-xs text-muted-foreground\"\n data-org-availability\n >\n <Building2 className=\"w-3 h-3 mt-0.5 flex-shrink-0\" />\n <span>\n {/* Not a share: it is set, and changed, in that organization. */}\n Also open to everyone in {names.join(\", \")} by its settings.\n </span>\n </p>\n </>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/WhoCanSeeThis.tsx\n *\n * \"WHO CAN SEE THIS\" — THE LANE CONTROL AT THE TOP OF THE SHARE DIALOG'S PEOPLE TAB\n * (lane SHARE-LANE-CONTROL, VERIFIER-23 item 3). Record-store things only; every other kind gets\n * its row controls (\"Shown to\", \"Published to the web\") in the same place through `row`.\n *\n * The record store has had the door since lane SHARE (`custom.share_lane_set`: mine |\n * organization | world). Under the access ladder law (T-36, chair ruling 2026-10-01) \"mine\" is the\n * hide it is, \"Shown to: Only me\": the thing leaves coworkers' lists and still opens for members\n * who have the link. It is never a lock; real separation is another organization or a\n * Confidential/Private Table type. The words are `SHOWN_TO_WORDS.only_me`, the ones RowControls uses.\n * Nothing on screen reached it: a door with no control is a dead end. This is that control, ONE\n * primitive every share host renders (ShareModal, ShareModalWindow, AgentSharePanel,\n * SiteAccessWorkspace) from `useSharing().whoCanSee` — it never reads or writes on its own.\n *\n * · Only me — lane mine: hidden from coworkers' lists; opens by link.\n * · Everyone in <organization> — the organization's default, at the level it grants.\n * · Anyone with the link — the world lane, drawn ONLY where it would be accepted\n * (`world_open`) or is already the state. Otherwise absent,\n * never disabled-looking.\n *\n * The current state is always shown. A person who cannot change sharing sees it as one line of\n * text, not as buttons. Hiding takes nobody's access away, so it applies without a confirm.\n * Named people are never touched.\n */\n\nimport React, { useState } from \"react\";\nimport { Building2, Check, EyeOff, Globe, Loader2 } from \"lucide-react\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { InfoHint } from \"./host\";\nimport { SHOWN_TO_WORDS } from \"@ai-matrx/sharing/core\";\nimport { useNavTree } from \"./host\";\nimport type {\n LaneChoice,\n WhoCanSee,\n} from \"@ai-matrx/sharing/core\";\nimport type { ShareActionResult } from \"@ai-matrx/sharing/core\";\nimport { RowControls, type RowControlsProps } from \"./RowControls\";\n\nconst LEVEL_WORD: Record<string, string> = {\n viewer: \"Viewer\",\n commenter: \"Commenter\",\n editor: \"Editor\",\n admin: \"Admin\",\n};\n\nexport interface WhoCanSeeThisProps {\n /** `useSharing().whoCanSee`. Null → the kind has no lane door, and nothing is drawn. */\n whoCanSee: WhoCanSee | null;\n /** The person may change this thing's sharing (the host's owner/Admin answer). */\n canChange: boolean;\n /** `useSharing().setWhoCanSee`. */\n onChoose: (choice: LaneChoice) => Promise<ShareActionResult>;\n /**\n * Every kind outside the record store: its row controls (\"Shown to\", \"Published to the web\"),\n * drawn in this same place. `RowControls` draws nothing for a Private, Confidential or child\n * record (access ladder T-13 phase 5).\n */\n row?: Omit<RowControlsProps, \"canChange\">;\n}\n\ninterface Option {\n choice: LaneChoice;\n label: string;\n says: string;\n /** A definition the label cannot carry, behind the tooltip slot (≤ 140). */\n hint?: string | undefined;\n icon: typeof Globe;\n}\n\n/** The truth of \"Only me\" on an Organization table (access ladder T-36): it hides, never locks. */\nconst ONLY_ME_HINT = \"Hidden from members' lists. Members with the link can still open it.\";\n\nexport function WhoCanSeeThis({\n whoCanSee,\n canChange,\n onChoose,\n row,\n}: WhoCanSeeThisProps) {\n const { orgs } = useNavTree();\n const [pending, setPending] = useState<LaneChoice | null>(null);\n const [said, setSaid] = useState<{ ok: boolean; text: string } | null>(null);\n\n if (!whoCanSee) return row ? <RowControls {...row} canChange={canChange} /> : null;\n\n const orgName =\n whoCanSee.organizationName ??\n (whoCanSee.organizationId\n ? orgs.find((o) => o.id === whoCanSee.organizationId)?.name\n : undefined) ??\n \"this organization\";\n const level = whoCanSee.memberDefaultLevel\n ? LEVEL_WORD[whoCanSee.memberDefaultLevel] ?? whoCanSee.memberDefaultLevel\n : null;\n\n const options: Option[] = [\n {\n choice: \"mine\",\n label: SHOWN_TO_WORDS.only_me.label,\n says: SHOWN_TO_WORDS.only_me.says,\n hint: ONLY_ME_HINT,\n icon: EyeOff,\n },\n {\n choice: \"organization\",\n label: `Everyone in ${orgName}`,\n says: level\n ? `Every member, as ${level}. This is the organization's default.`\n : \"Every member. This is the organization's default.\",\n icon: Building2,\n },\n ];\n if (whoCanSee.worldOffered || whoCanSee.choice === \"world\") {\n options.push({\n choice: \"world\",\n label: \"Anyone with the link\",\n says: \"Out in the world, findable by the link and nothing else.\",\n icon: Globe,\n });\n }\n const current = options.find((o) => o.choice === whoCanSee.choice) ?? options[options.length - 1]!;\n\n const apply = async (choice: LaneChoice) => {\n setPending(choice);\n setSaid(null);\n try {\n const result = await onChoose(choice);\n setSaid(\n result.success\n ? { ok: true, text: result.message ?? \"Saved.\" }\n : { ok: false, text: result.error ?? \"That could not be changed.\" },\n );\n } finally {\n setPending(null);\n }\n };\n\n const pick = (choice: LaneChoice) => {\n if (choice === whoCanSee.choice || pending) return;\n void apply(choice);\n };\n\n return (\n <section\n className=\"space-y-1.5 p-3 bg-muted/30 rounded-lg border\"\n data-who-can-see\n data-lane={whoCanSee.choice}\n >\n <p className=\"text-xs font-medium\">Who can see this</p>\n\n {canChange ? (\n <div\n role=\"radiogroup\"\n aria-label=\"Who can see this\"\n className=\"grid grid-cols-1 gap-1.5 sm:grid-flow-col sm:auto-cols-fr\"\n >\n {options.map((o) => {\n const Icon = o.icon;\n const selected = o.choice === whoCanSee.choice;\n return (\n <div key={o.choice} className=\"relative min-w-0\">\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-lane-choice={o.choice}\n onClick={() => pick(o.choice)}\n className={cn(\n \"flex w-full min-w-0 items-start gap-2 rounded-md border p-2 text-left transition-colors\",\n o.hint && \"pr-7\",\n selected\n ? \"border-primary bg-background\"\n : \"border-transparent hover:bg-background/60\",\n )}\n >\n {pending === o.choice ? (\n <Loader2 className=\"mt-0.5 h-4 w-4 flex-shrink-0 animate-spin text-primary\" />\n ) : (\n <Icon\n className={cn(\n \"mt-0.5 h-4 w-4 flex-shrink-0\",\n selected ? \"text-primary\" : \"text-muted-foreground\",\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1 text-sm font-medium\">\n <span className=\"min-w-0 break-words\">{o.label}</span>\n {selected && <Check className=\"h-3.5 w-3.5 flex-shrink-0 text-primary\" />}\n </span>\n <span className=\"block text-xs text-muted-foreground\">{o.says}</span>\n </span>\n </button>\n {/* Beside the radio, never inside it: a button may not hold a button. */}\n {o.hint && (\n <InfoHint\n text={o.hint}\n label={`About ${o.label}`}\n className=\"absolute right-2 top-2.5\"\n />\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm\" data-who-can-see-text>\n <span className=\"font-medium\">{current.label}.</span>{\" \"}\n <span className=\"text-xs text-muted-foreground\">{current.says}</span>\n {current.hint && <InfoHint text={current.hint} label={`About ${current.label}`} />}\n </p>\n )}\n\n {said && (\n <p\n className={cn(\n \"text-xs\",\n said.ok ? \"text-green-700 dark:text-green-300\" : \"text-destructive\",\n )}\n data-lane-said\n >\n {said.text}\n </p>\n )}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/RowControls.tsx\n *\n * THE RECORD'S ROW CONTROLS — exactly the access ladder's Words table, nothing else\n * (common-docs/policies/access-ladder.md, T-13 phase 5):\n *\n * Shown to Only me · My team · Everyone · Everyone on AI Matrx\n * Which lists show it to people who can already open it — never a lock.\n * Published to the web on · off — anyone, signed in or not, opens it at its address.\n * + Indexed by search engines, on the same line (T-12), only while published.\n *\n * A Private, Confidential or child record has neither, so nothing is drawn: the type's capabilities\n * (`get_share_capabilities` → `shownToOffered`, `publishLane`) decide, never a guess. It is still\n * shared by Anyone link, secure link or with people — those live in their own tabs.\n * A person who cannot change sharing sees the current state as text, never as dead buttons.\n */\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { shareCopyNotify } from \"./host\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Check, Copy, Loader2 } from \"lucide-react\";\nimport { Switch } from \"./ui/switch\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { ToggleGroup, ToggleGroupItem } from \"./ui/toggle-group\";\nimport { useToast } from \"./host\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport {\n getShareCapabilities,\n type ShareCapabilities,\n} from \"@ai-matrx/sharing/core\";\nimport { publicResourceUrl } from \"@ai-matrx/sharing/core\";\nimport { getShareableResource } from \"@ai-matrx/sharing/core\";\nimport { anyoneReachWords } from \"./PublicAccessTab\";\nimport type { ResourceType, ShareActionResult } from \"@ai-matrx/sharing/core\";\nimport type { ShownTo } from \"@ai-matrx/sharing/core\";\nimport { SHOWN_TO_ORDER, SHOWN_TO_WORDS } from \"@ai-matrx/sharing/core\";\nimport { SearchEngineIndexedSwitch } from \"./SearchEngineIndexedSwitch\";\n\nimport { ShareErrorAlchemyMenu } from \"./host\";\n/** Every sentence the slot under \"Shown to\" can hold; all are laid in one grid cell. */\nconst SAYS_SLOT_KEYS: ReadonlyArray<ShownTo | \"default\"> = [...SHOWN_TO_ORDER, \"default\"];\n\nexport interface RowControlsProps {\n resourceType: ResourceType;\n resourceId: string;\n /** The person may change this thing's sharing. */\n canChange: boolean;\n /** `useSharing().shownTo` — undefined when the type does not carry it. */\n shownTo: ShownTo | null | undefined;\n /** `useSharing().isPublic` — published to the web. */\n isPublic: boolean;\n /** `useSharing().childRecord` — a child follows its parent: nothing is drawn. */\n childRecord?: boolean | undefined;\n /**\n * `false` when this thing is never published to the web although its type is: a whole Table is a\n * `record` too, and only a ROW has a page (/p/e/record/<id>), so a Table draws no publish switch\n * at all (access ladder T-40; the database refuses it too). Omitted → the type decides.\n */\n publishable?: boolean | undefined;\n onSetShownTo: (next: ShownTo | null) => Promise<ShareActionResult>;\n onPublish: () => Promise<ShareActionResult>;\n onStopPublishing: () => Promise<ShareActionResult>;\n}\n\nexport function RowControls({\n resourceType,\n resourceId,\n canChange,\n shownTo,\n isPublic,\n childRecord = false,\n publishable = true,\n onSetShownTo,\n onPublish,\n onStopPublishing,\n}: RowControlsProps) {\n const { copyText } = useClipboard({\n notify: shareCopyNotify,\n });\n const { toast } = useToast();\n const [caps, setCaps] = useState<ShareCapabilities | null>(null);\n const [capsError, setCapsError] = useState<string | null>(null);\n const [busy, setBusy] = useState<\"shown\" | \"publish\" | null>(null);\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n let live = true;\n setCapsError(null);\n getShareCapabilities(resourceType)\n .then((c) => live && setCaps(c))\n .catch((e: unknown) => live && setCapsError(extractErrorMessage(e)));\n return () => {\n live = false;\n };\n }, [resourceType]);\n\n const publicUrl = publicResourceUrl(resourceType, resourceId);\n\n const copyAddress = useCallback(async () => {\n if (!publicUrl) return;\n if (!(await copyText(publicUrl, undefined, \"Couldn't copy the web address\"))) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [publicUrl, toast]);\n\n if (capsError) {\n return (\n <p className=\"rounded-lg border border-destructive/20 bg-destructive/10 p-3 text-xs text-destructive-ink\">\n Couldn't read this item's sharing options: {capsError}\n <ShareErrorAlchemyMenu error={capsError} /></p>\n );\n }\n if (childRecord) return null;\n // THE BAR'S PLACE IS HELD WHILE ITS OPTIONS ARE READ (member walk 2026-10-10: \"Shown to\" arrived late\n // and pushed the dialog's content down). The reserve is the bar's own box, one row tall, invisible.\n if (!caps) {\n return (\n <section aria-hidden=\"true\" className=\"invisible space-y-2 rounded-lg border p-3\" data-row-controls-reserved=\"\">\n <div className=\"flex h-8 items-center\" />\n </section>\n );\n }\n\n const showShownTo = caps.shownToOffered && shownTo !== undefined;\n const showPublish = publishable && caps.publishLane !== null;\n if (!showShownTo && !showPublish) return null;\n\n // \"Everyone on AI Matrx\" is only valid on a published record; it stays listed while it is the\n // current value so the state is never hidden.\n const shownChoices = SHOWN_TO_ORDER.filter(\n (v) => v !== \"everyone_on_ai_matrx\" || isPublic || shownTo === v,\n );\n\n const publishSays =\n caps.publishLane === \"card\"\n ? \"Only its card — the name, description and inputs — opens for anyone. What is inside stays in its organization.\"\n : // Never promise a signed-out read the type cannot deliver (no page of its own).\n anyoneReachWords(\n getShareableResource(resourceType)?.displayLabel?.toLowerCase() ?? \"item\",\n { publicPage: Boolean(publicUrl), noLoginLink: caps.isLinkShareable },\n );\n\n const chooseShownTo = async (next: ShownTo) => {\n if (!canChange || next === shownTo || busy) return;\n setBusy(\"shown\");\n try {\n const result = await onSetShownTo(next);\n if (result.success === false) {\n toast({\n title: 'Couldn\\'t change \"Shown to\"',\n description: result.error || \"Please try again\",\n variant: \"destructive\",\n });\n }\n } finally {\n setBusy(null);\n }\n };\n\n const togglePublish = async (on: boolean) => {\n if (!canChange || busy) return;\n setBusy(\"publish\");\n try {\n const result = on ? await onPublish() : await onStopPublishing();\n toast(\n result.success === false\n ? {\n title: on\n ? \"Couldn't publish it to the web\"\n : \"Couldn't stop publishing it to the web\",\n description: result.error || \"Please try again\",\n variant: \"destructive\",\n }\n : {\n title: on ? \"Published to the web\" : \"No longer published to the web\",\n description: on\n ? publishSays\n : \"People outside its organization can no longer open it, unless it is shared with them.\",\n },\n );\n } finally {\n setBusy(null);\n }\n };\n\n\n return (\n <section\n className=\"space-y-2 rounded-lg border bg-muted/30 p-3\"\n data-row-controls\n data-published={isPublic ? \"true\" : \"false\"}\n >\n {showShownTo && (\n <div className=\"flex flex-wrap items-center justify-between gap-2\" data-shown-to={shownTo ?? \"default\"}>\n <span className=\"text-xs font-medium\">Shown to</span>\n {canChange ? (\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n variant=\"outline\"\n value={shownTo ?? \"\"}\n onValueChange={(v) => v && void chooseShownTo(v as ShownTo)}\n aria-label=\"Shown to\"\n className=\"flex-wrap justify-end\"\n >\n {shownChoices.map((v) => (\n <ToggleGroupItem\n key={v}\n value={v}\n aria-label={SHOWN_TO_WORDS[v].label}\n title={SHOWN_TO_WORDS[v].says}\n className=\"h-7 px-2 text-xs data-[state=on]:border-primary data-[state=on]:bg-primary/10 data-[state=on]:text-primary-ink\"\n >\n {SHOWN_TO_WORDS[v].label}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {shownTo ? SHOWN_TO_WORDS[shownTo].label : \"The default for this type\"}\n </span>\n )}\n </div>\n )}\n {showShownTo && (\n // ZERO LAYOUT SHIFT (Arman 2026-10-07): the sentence under \"Shown to\" changes with every\n // choice and each one wraps to a different number of lines on a phone. The slot is a\n // one-cell grid holding EVERY sentence, only the current one visible, so its height is the\n // tallest one's at any width and nothing below it ever moves. The spinner's place is held\n // too (invisible, never removed).\n <div className=\"grid text-xs text-muted-foreground\" data-shown-to-says-slot=\"\">\n {SAYS_SLOT_KEYS.map((v) => {\n const current = (shownTo ?? \"default\") === v;\n return (\n <p\n key={v}\n className={cn(\"col-start-1 row-start-1\", !current && \"invisible\")}\n aria-hidden={!current}\n data-shown-to-says={v}\n >\n {v === \"default\"\n ? \"Not set — the default for this type applies.\"\n : SHOWN_TO_WORDS[v].says}{\" \"}\n A list setting, never who may open it.\n <Loader2\n className={cn(\n \"ml-1 inline h-3 w-3 animate-spin\",\n !(current && busy === \"shown\") && \"invisible\",\n )}\n />\n </p>\n );\n })}\n </div>\n )}\n\n {showPublish && (\n <div className={cn(\"space-y-1.5\", showShownTo && \"border-t pt-2\")}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Published to the web</span>\n <span className=\"flex items-center gap-3\">\n <SearchEngineIndexedSwitch\n resourceType={resourceType}\n resourceId={resourceId}\n publishedHint={isPublic}\n />\n {busy === \"publish\" && (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n )}\n {canChange ? (\n <Switch\n checked={isPublic}\n onCheckedChange={(on) => void togglePublish(on)}\n disabled={busy === \"publish\"}\n aria-label=\"Published to the web\"\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">{isPublic ? \"On\" : \"Off\"}</span>\n )}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {isPublic ? publishSays : `When on: ${publishSays}`}\n </p>\n {isPublic && publicUrl && (\n <div className=\"flex items-center gap-1.5 rounded-md border bg-background p-1.5\">\n <span className=\"min-w-0 flex-1 truncate px-1 font-mono text-xs\">{publicUrl}</span>\n <Button\n icon={copied ? <Check /> : <Copy />} aria-label=\"Copy web address\"\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => void copyAddress()}\n title=\"Copy web address\"\n />\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * THE ONE CONTROL (2026-10-05, wave 1B): Switch is the controls' switch — a 20px track inside\n * the 28px control box, so it lines up with every control beside it. NO size (`size=` is gone).\n * Codemod + census: `scripts/ui-rollout/doors-codemod.mjs`.\n *\n * `SwitchLegacy` is FROZEN — the pre-rollout compact 16px track (the package-root Switch bound\n * to `size=\"sm\"`), for the areas the rollout may not touch (the agent builder, other lanes'\n * files). Never import it in new code; each importer is listed in the census.\n */\n\nimport { Switch as PackageSwitch, type SwitchProps as PackageSwitchProps } from \"@ai-matrx/design-system\";\nimport * as React from \"react\";\n\nexport { Switch } from \"@ai-matrx/design-system/controls\";\nexport type { SwitchProps } from \"@ai-matrx/design-system/controls\";\n\nconst SwitchLegacy = React.forwardRef<\n React.ComponentRef<typeof PackageSwitch>,\n PackageSwitchProps\n>(({ size = \"sm\", ...props }, ref) => (\n <PackageSwitch ref={ref} size={size} {...props} />\n));\nSwitchLegacy.displayName = \"SwitchLegacy\";\n\nexport { SwitchLegacy };\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — ToggleGroup lives in `@ai-matrx/design-system`,\n * in the same module as `Toggle` (see `components/ui/toggle.tsx` for why the\n * two could not stay apart: they share one React context).\n *\n * `size`/`variant` declared on the group are inherited by every item.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n ToggleGroup,\n ToggleGroupItem,\n type ToggleGroupItemProps,\n type ToggleGroupProps,\n} from \"@ai-matrx/design-system\";\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Alert, AlertDescription } from \"./ui/alert\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { Permission, ResourceType } from \"@ai-matrx/sharing/core\";\nimport { ShareLinkPanel } from \"./ShareLinkPanel\";\nimport { Skeleton } from \"@ai-matrx/design-system\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport { getShareCapabilities } from \"@ai-matrx/sharing/core\";\nimport { CopyButtons } from \"./host\";\nimport { sharingLocation, type SharingCopyContext } from \"@ai-matrx/sharing/core\";\n\ninterface PublicAccessTabProps {\n /** The public permission row from the permissions table, if any (kept for hosts' tab dot). */\n publicPermission?: Permission | undefined;\n isOwner: boolean;\n resourceType: ResourceType;\n resourceId: string;\n resourceName: string;\n /**\n * Identity + the page's leading KPIs, mirrored into this tab's payloads so a\n * copied answer is interpretable on its own.\n */\n copy?: SharingCopyContext | undefined;\n}\n\n/**\n * What \"Anyone\" means for this type, in words that never promise more than the\n * platform delivers. \"No sign-in\" only where a signed-out page exists\n * (utils/permissions/publicLane.ts); everywhere else public means every signed-in\n * person finds it under Public, and a signed-out visitor reaches it only through a\n * no-login link — when the type has one. Pure — exported for tests.\n */\nexport function anyoneReachWords(\n typeLabel: string,\n reach: { publicPage: boolean; noLoginLink: boolean },\n): string {\n // The law's words for Published to the web (common-docs/policies/access-ladder.md, Words table).\n if (reach.publicPage) return `Anyone, signed in or not, opens this ${typeLabel} at its address as a viewer.`;\n return (\n `Everyone signed in to AI Matrx can find and view this ${typeLabel}.` +\n (reach.noLoginLink\n ? \" People without an account need a no-login link.\"\n : \" People without an account cannot open it.\")\n );\n}\n\n/**\n * PublicAccessTab — \"Anyone with the link\" (access ladder Words table, Link row).\n *\n * An Anyone link opens the record at its permission for whoever holds it, at EVERY level —\n * Private and Confidential records included — and is never indexed. The row controls (\"Shown to\",\n * \"Published to the web\") are not here: they sit at the top of the people tab\n * (`RowControls`), and only on Organization and Public records (T-13 phase 5).\n */\nexport function PublicAccessTab({\n isOwner,\n resourceType,\n resourceId,\n resourceName,\n copy,\n}: PublicAccessTabProps) {\n const [linkShareable, setLinkShareable] = useState(false);\n const [loading, setLoading] = useState(true);\n const [capabilitiesError, setCapabilitiesError] = useState<string | null>(null);\n\n useEffect(() => {\n let active = true;\n setLoading(true);\n setCapabilitiesError(null);\n getShareCapabilities(resourceType)\n .then((c) => {\n if (active) setLinkShareable(c.isLinkShareable);\n })\n .catch((error: unknown) => {\n if (active) setCapabilitiesError(extractErrorMessage(error));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, [resourceType]);\n\n const location = sharingLocation(copy?.surface ?? \"Anyone link\");\n\n if (loading) return <Skeleton className=\"h-20 w-full\" />;\n if (capabilitiesError) {\n // ERRORS FIRST: no link panel renders while this fails, so the sentence is the answer.\n return (\n <Alert variant=\"destructive\" className=\"group\">\n <AlertTriangle className=\"h-4 w-4\" />\n <AlertDescription className=\"flex items-start gap-2\">\n <span className=\"flex-1\">{capabilitiesError}</span>\n <span className=\"shrink-0 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Anyone link error\"\n human={() =>\n [\n \"The Anyone link controls could not load.\",\n capabilitiesError,\n `Resource: ${resourceType}:${resourceId} (${resourceName})`,\n ].join(\"\\n\")\n }\n json={() => ({\n error: capabilitiesError,\n resource_type: resourceType,\n resource_id: resourceId,\n })}\n agent={() => ({\n kind: \"public-access-error\",\n location,\n description:\n \"The share-capabilities lookup failed, so the Anyone link tab renders no controls. This is the error on screen, verbatim.\",\n data: {\n rendered_error: capabilitiesError,\n resource_type: resourceType,\n resource_id: resourceId,\n resource_name: resourceName,\n kpis: copy?.kpis ?? null,\n },\n attributes: { resource_type: resourceType, resource_id: resourceId, state: \"error\" },\n })}\n />\n </span>\n </AlertDescription>\n </Alert>\n );\n }\n return (\n <div className=\"space-y-3\">\n <ShareLinkPanel\n resourceType={resourceType}\n resourceId={resourceId}\n isOwner={isOwner}\n enabled={linkShareable}\n />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the Alert implementation lives in\n * `@ai-matrx/design-system`.\n *\n * The package version grows the variant set to the full status vocabulary:\n * `default | destructive | warning | success | info`, all token-driven. Reach\n * for `variant=\"warning\"` instead of hand-rolling an amber banner — that habit\n * (this file only ever had two variants) is why the 0.7.0 census found dozens\n * of literal-palette status divs across four repos.\n *\n * A destructive Alert carries the Alchemy Menu through the package's error\n * slot (`ErrorActionsProvider`, mounted in `AlchemyHost`) — the host wrapper\n * that used to add it here is gone, so the menu is never drawn twice.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n Alert,\n AlertDescription,\n AlertTitle,\n alertVariants,\n type AlertProps,\n} from \"@ai-matrx/design-system\";\n","\"use client\";\n\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button, DateTimeField, Input, Select } from \"@ai-matrx/design-system/controls\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { formatAbsoluteDate } from \"@ai-matrx/kit/format\";\nimport {\n Link2,\n Copy,\n Check,\n Trash2,\n Loader2,\n Plus,\n Eye,\n MessageSquareText,\n RefreshCw,\n ExternalLink,\n} from \"lucide-react\";\nimport { useToast } from \"./host\";\nimport type { ResourceType } from \"@ai-matrx/sharing/core\";\nimport {\n createShareLink,\n listShareLinks,\n revokeShareLink,\n shareUrlForLink,\n type ShareLink,\n} from \"@ai-matrx/sharing/core\";\nimport { PortalConfirmDialog } from \"./ui/confirm-dialog\";\nimport { useShare } from \"./useShare\";\nimport {\n createSafeShareMessage,\n describeShareLinkAccess,\n describeShareLinkExpiry,\n evaluateShareLinkHandoff,\n shareLinkUnavailableReason,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** One more URL a link opens at (e.g. a file's direct byte URL), shown with copy + open. */\nexport interface ShareLinkExtraUrl {\n key: string;\n label: string;\n sublabel?: string | undefined;\n url: string;\n /** Highlighted as the main URL to hand out. */\n primary?: boolean | undefined;\n}\n\n/** The access a new link grants, offered when `linkSettings` is on. */\ntype LinkPermission = \"viewer\" | \"editor\";\n\nexport interface ShareLinkPanelProps {\n resourceType: ResourceType;\n resourceId: string;\n isOwner: boolean;\n /** Whether this resource type offers no-login links (admin policy). Hidden when false. */\n enabled?: boolean | undefined;\n /** Ask permission, expiry and max uses before a link is created. */\n linkSettings?: boolean | undefined;\n /** Show each link's access, expiry and uses. */\n showLinkDetails?: boolean | undefined;\n /** An open-in-new-tab control on each link. */\n showOpenLink?: boolean | undefined;\n /** Extra URLs per link (a file's direct byte URL), each with copy + open. */\n extraUrls?: ((link: ShareLink) => ShareLinkExtraUrl[]) | undefined;\n /** The origin link URLs are built on; defaults to the app URL. */\n appOrigin?: string | undefined;\n /** Every fresh list read — lets a host keep its own store of links in step. */\n onLinksChange?: ((links: ShareLink[]) => void) | undefined;\n}\n\nfunction linkListErrorMessage(error: unknown): string {\n return error instanceof Error\n ? error.message\n : \"We couldn't load this item's share links.\";\n}\n\n/**\n * \"Anyone with the link\" — mint / copy / revoke no-login share links.\n *\n * A share link is an opaque token that lets anyone view the resource with ZERO\n * sign-in (resolved by the anon `resolve_share_token` RPC). This is the canonical\n * link-carries-everything path — distinct from publishing to the web (which\n * needs a public render route). Owner-only.\n */\nexport function ShareLinkPanel({\n resourceType,\n resourceId,\n isOwner,\n enabled = true,\n linkSettings = false,\n showLinkDetails = false,\n showOpenLink = false,\n extraUrls,\n appOrigin,\n onLinksChange,\n}: ShareLinkPanelProps) {\n const [permissionLevel, setPermissionLevel] = useState<LinkPermission>(\"viewer\");\n const [expiresAt, setExpiresAt] = useState(\"\");\n const [maxUses, setMaxUses] = useState(\"\");\n const onLinksChangeRef = useRef(onLinksChange);\n onLinksChangeRef.current = onLinksChange;\n const urlFor = useCallback(\n (link: Pick<ShareLink, \"token\" | \"shortToken\">) => shareUrlForLink(link, appOrigin),\n [appOrigin],\n );\n const { toast } = useToast();\n const [links, setLinks] = useState<ShareLink[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadedResourceKey, setLoadedResourceKey] = useState<string | null>(\n null,\n );\n const [creating, setCreating] = useState(false);\n const [copiedId, setCopiedId] = useState<string | null>(null);\n const [revokeTarget, setRevokeTarget] = useState<ShareLink | null>(null);\n const [shareTarget, setShareTarget] = useState<ShareLink | null>(null);\n const [shareError, setShareError] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [handoffBusy, setHandoffBusy] = useState(false);\n const { share, copy: copyMessage, fallbackDialog } = useShare();\n const resourceKey = `${resourceType}\\u0000${resourceId}`;\n\n const fetchLinks = useCallback(async () => {\n const fresh = await listShareLinks(resourceType, resourceId);\n onLinksChangeRef.current?.(fresh);\n return fresh;\n }, [resourceType, resourceId]);\n\n const refresh = useCallback(async (): Promise<ShareLink[] | null> => {\n setLoading(true);\n setShareError(null);\n try {\n const freshLinks = await fetchLinks();\n setLinks(freshLinks);\n setLoadedResourceKey(resourceKey);\n return freshLinks;\n } catch (error) {\n if (loadedResourceKey !== resourceKey) setLinks([]);\n setLoadedResourceKey(resourceKey);\n setShareError(linkListErrorMessage(error));\n return null;\n } finally {\n setLoading(false);\n }\n }, [fetchLinks, loadedResourceKey, resourceKey]);\n\n useEffect(() => {\n if (!isOwner) return;\n let current = true;\n void fetchLinks()\n .then((freshLinks) => {\n if (current) {\n setLinks(freshLinks);\n setLoadedResourceKey(resourceKey);\n }\n })\n .catch((error: unknown) => {\n if (current) {\n setLinks([]);\n setLoadedResourceKey(resourceKey);\n setShareError(linkListErrorMessage(error));\n }\n })\n .finally(() => {\n if (current) setLoading(false);\n });\n return () => {\n current = false;\n };\n }, [isOwner, fetchLinks, resourceKey]);\n\n const activeLinks = links.filter((l) => l.isActive);\n const isLoading = loading || loadedResourceKey !== resourceKey;\n const hasLink = !isLoading && activeLinks.length > 0;\n\n const copyLink = useCallback(\n async (sourceLink: ShareLink, alreadyRefreshed?: ShareLink[] | undefined) => {\n const refreshedLinks = alreadyRefreshed ?? (await refresh());\n if (!refreshedLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = refreshedLinks.find(\n (link) => link.id === sourceLink.id,\n );\n if (!currentLink) {\n toast({\n title: \"This link is no longer available\",\n description: \"Refresh the list and choose an active share link.\",\n variant: \"destructive\",\n });\n return;\n }\n const unavailableReason = shareLinkUnavailableReason(currentLink);\n if (unavailableReason) {\n toast({\n title: \"This link can't be copied\",\n description: unavailableReason,\n variant: \"destructive\",\n });\n return;\n }\n const outcome = await copyMessage(urlFor(currentLink), {\n title: \"Copy link\",\n description:\n \"Copy this link and send it to the person you want to share with.\",\n });\n if (outcome === \"copied\") {\n setCopiedId(currentLink.id);\n setTimeout(() => setCopiedId(null), 2000);\n toast({\n title: \"Link copied\",\n description: \"Anyone with it can view — no sign-in needed.\",\n });\n }\n },\n [copyMessage, refresh, toast, urlFor],\n );\n\n const copyExtraUrl = useCallback(\n async (key: string, url: string) => {\n const outcome = await copyMessage(url, {\n title: \"Copy link\",\n description: \"Copy this link and send it to the person you want to share with.\",\n });\n if (outcome === \"copied\") {\n setCopiedId(key);\n setTimeout(() => setCopiedId((k) => (k === key ? null : k)), 2000);\n }\n },\n [copyMessage],\n );\n\n const createLinkOnce = useCallback(async () => {\n const result = await createShareLink(\n linkSettings\n ? {\n resourceType,\n resourceId,\n permissionLevel,\n expiresAt: expiresAt ? new Date(expiresAt).toISOString() : null,\n maxUses: maxUses ? Number(maxUses) : null,\n }\n : { resourceType, resourceId },\n );\n if (result.success && result.url) {\n if (linkSettings) {\n setExpiresAt(\"\");\n setMaxUses(\"\");\n }\n const freshLinks = await refresh();\n const createdLink =\n result.token && freshLinks\n ? freshLinks.find((link) => link.token === result.token)\n : undefined;\n if (!createdLink || !freshLinks) {\n toast({\n title: \"Link created but not copied\",\n description:\n \"The current link state couldn't be confirmed. Refresh the list before sharing it.\",\n variant: \"destructive\",\n });\n return;\n }\n await copyLink(createdLink, freshLinks);\n } else {\n toast({\n title: \"Couldn't create link\",\n description: result.error ?? \"Please try again\",\n variant: \"destructive\",\n });\n }\n }, [\n resourceType,\n resourceId,\n refresh,\n copyLink,\n toast,\n linkSettings,\n permissionLevel,\n expiresAt,\n maxUses,\n ]);\n\n // A ref, not the `creating` state: two clicks in one frame both read the stale state and each\n // created a link. The ref holds until the link is made AND copied.\n const creatingRef = useRef(false);\n const handleCreate = useCallback(async () => {\n if (creatingRef.current) return;\n creatingRef.current = true;\n setCreating(true);\n try {\n await createLinkOnce();\n } finally {\n creatingRef.current = false;\n setCreating(false);\n }\n }, [createLinkOnce]);\n\n const handleRevoke = useCallback(async () => {\n if (!revokeTarget) return;\n const result = await revokeShareLink(revokeTarget.id);\n setRevokeTarget(null);\n if (result.success) {\n await refresh();\n toast({\n title: \"Link turned off\",\n description: \"It can no longer be opened.\",\n });\n } else {\n toast({\n title: \"Couldn't revoke\",\n description: result.error,\n variant: \"destructive\",\n });\n }\n }, [revokeTarget, refresh, toast]);\n\n const prepareTextShare = useCallback(\n async (linkId: string) => {\n setRefreshing(true);\n const freshLinks = await refresh();\n setRefreshing(false);\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const freshLink = freshLinks.find((link) => link.id === linkId);\n if (!freshLink) {\n toast({\n title: \"This link is no longer available\",\n description: \"Refresh the list and choose an active share link.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const unavailableReason = shareLinkUnavailableReason(freshLink);\n if (unavailableReason) {\n toast({\n title: \"This link can't be shared\",\n description: unavailableReason,\n variant: \"destructive\",\n });\n return;\n }\n\n setShareTarget(freshLink);\n },\n [refresh, toast],\n );\n\n const closeShareReview = useCallback(() => {\n if (!handoffBusy) setShareTarget(null);\n }, [handoffBusy]);\n\n const handleNativeHandoff = useCallback(async () => {\n if (!shareTarget) return;\n setHandoffBusy(true);\n try {\n const freshLinks = await refresh();\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = freshLinks.find((link) => link.id === shareTarget.id);\n if (!currentLink) {\n setShareTarget(null);\n toast({\n title: \"This link is no longer available\",\n description:\n \"It may have been turned off. Choose an active link to continue.\",\n variant: \"destructive\",\n });\n return;\n }\n const handoffReview = evaluateShareLinkHandoff(shareTarget, currentLink);\n if (handoffReview.status === \"unavailable\") {\n setShareTarget(null);\n toast({\n title: \"This link can't be shared\",\n description: handoffReview.reason,\n variant: \"destructive\",\n });\n return;\n }\n if (handoffReview.status === \"changed\") {\n setShareTarget(currentLink);\n toast({\n title: \"Link access changed\",\n description:\n \"Review the updated access, expiry, and view count before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const message = createSafeShareMessage(urlFor(currentLink));\n const outcome = await share({\n title: \"AI Matrx share\",\n text: message,\n url: null,\n copyText: message,\n fallbackTitle: \"Copy message\",\n fallbackDescription:\n \"Copy the reviewed message below and paste it into your messaging app.\",\n });\n if (outcome === \"cancelled\") return;\n\n setShareTarget(null);\n if (outcome === \"shared\") {\n toast({\n title: \"Share options opened\",\n description:\n \"AI Matrx didn't send the message. Complete it in your share app.\",\n });\n } else if (outcome === \"copied\") {\n toast({\n title: \"Message copied\",\n description: \"Paste it into a message. AI Matrx didn't send it.\",\n });\n }\n } finally {\n setHandoffBusy(false);\n }\n }, [shareTarget, refresh, share, toast, urlFor]);\n\n const handleCopyReviewedMessage = useCallback(async () => {\n if (!shareTarget) return;\n setHandoffBusy(true);\n try {\n const freshLinks = await refresh();\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = freshLinks.find((link) => link.id === shareTarget.id);\n if (!currentLink) {\n setShareTarget(null);\n toast({\n title: \"This link is no longer available\",\n description:\n \"It may have been turned off. Choose an active link to continue.\",\n variant: \"destructive\",\n });\n return;\n }\n const handoffReview = evaluateShareLinkHandoff(shareTarget, currentLink);\n if (handoffReview.status === \"unavailable\") {\n setShareTarget(null);\n toast({\n title: \"This link can't be shared\",\n description: handoffReview.reason,\n variant: \"destructive\",\n });\n return;\n }\n if (handoffReview.status === \"changed\") {\n setShareTarget(currentLink);\n toast({\n title: \"Link access changed\",\n description:\n \"Review the updated access, expiry, and view count before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const message = createSafeShareMessage(urlFor(currentLink));\n const outcome = await copyMessage(message, {\n title: \"Copy message\",\n description:\n \"Copy the reviewed message below and paste it into your messaging app.\",\n });\n setShareTarget(null);\n if (outcome === \"copied\") {\n toast({\n title: \"Message copied\",\n description: \"Paste it into a message. AI Matrx didn't send it.\",\n });\n }\n } finally {\n setHandoffBusy(false);\n }\n }, [shareTarget, refresh, copyMessage, toast, urlFor]);\n\n // Non-owners have no link controls at all (the owner is the only grantor).\n if (!isOwner) return null;\n\n // NEVER vanish silently. When the type has no no-login link lane, the owner\n // must be told — otherwise the Public tab reads as \"anyone with the link\"\n // while offering no link anywhere on screen (the defect this replaced).\n if (!enabled) {\n return (\n <div className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg border\">\n <Link2 className=\"w-4 h-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">\n No-login links aren’t on for this item type\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n Share it with specific people or an organization instead — they open\n it signed in.\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <Link2 className=\"w-4 h-4 text-primary flex-shrink-0\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">Anyone with the link</h3>\n <p className=\"text-xs text-muted-foreground\">\n {hasLink\n ? `Link is on · ${activeLinks.length} active`\n : \"Create a link that opens with no sign-in required\"}\n </p>\n </div>\n </div>\n <Button\n icon={creating ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Plus />\n )}\n variant=\"primary\"\n onClick={handleCreate}\n disabled={creating}\n className=\"flex-shrink-0\"\n >\n <span className=\"ml-1 hidden sm:inline\">\n {hasLink ? \"New link\" : \"Create link\"}\n </span>\n </Button>\n </div>\n\n {linkSettings ? (\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-3\">\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Permission</span>\n <Select<LinkPermission>\n value={permissionLevel}\n onValueChange={setPermissionLevel}\n aria-label=\"Link permission\"\n options={[\n { value: \"viewer\", label: \"Read only\" },\n { value: \"editor\", label: \"Read + write\" },\n ]}\n />\n </label>\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Expires</span>\n <DateTimeField value={expiresAt} onValueChange={(v) => setExpiresAt(v ?? \"\")} />\n </label>\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Max uses</span>\n <Input\n type=\"number\"\n min={1}\n aria-label=\"Max uses\"\n value={maxUses}\n onChange={(e) => setMaxUses(e.target.value)}\n />\n </label>\n </div>\n ) : null}\n\n {isLoading ? (\n <div className=\"flex items-center justify-center py-3 text-xs text-muted-foreground\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin mr-2\" />\n Loading links…\n </div>\n ) : activeLinks.length === 0 && !shareError ? (\n <p className=\"text-xs text-muted-foreground py-1\">\n No share links yet. Create one to share this with anyone.\n </p>\n ) : (\n <div className=\"space-y-1.5\">\n {activeLinks.map((link) => {\n const unavailableReason = shareLinkUnavailableReason(link);\n const linkUrl = urlFor(link);\n const extras = extraUrls?.(link) ?? [];\n return (\n <div key={link.id} className=\"space-y-1\">\n {showLinkDetails ? (\n <div className=\"flex flex-wrap items-center gap-1.5 px-0.5 text-[11px] text-muted-foreground\">\n <span className=\"rounded bg-muted px-1.5 py-0.5 font-medium text-foreground\">\n {link.permissionLevel === \"viewer\" ? \"Read only\" : \"Read + write\"}\n </span>\n <span>\n {link.expiresAt\n ? `Expires ${formatAbsoluteDate(link.expiresAt)}`\n : \"No expiry\"}\n </span>\n {/* read-gate-exempt: this link's own usage fields, not a list count */}\n {link.maxUses ? <span>{`${link.useCount}/${link.maxUses} uses`}</span> : null}\n </div>\n ) : null}\n {extras.map((extra) => (\n <div\n key={extra.key}\n className={\n extra.primary\n ? \"flex items-center gap-1.5 rounded-md border border-primary/30 bg-primary/5 p-1.5\"\n : \"flex items-center gap-1.5 rounded-md border bg-background p-1.5\"\n }\n >\n <div className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"text-[10px] font-medium uppercase text-muted-foreground\">\n {extra.label}\n {extra.sublabel ? ` · ${extra.sublabel}` : \"\"}\n </span>\n <span className=\"truncate font-mono text-xs\" title={extra.url}>\n {extra.url}\n </span>\n </div>\n <OutboundLink\n href={extra.url}\n aria-label={`Open ${extra.label}`}\n title=\"Open in new tab\"\n className=\"flex h-11 w-11 flex-shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground sm:h-8 sm:w-8\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </OutboundLink>\n <Button\n icon={copiedId === `${link.id}:${extra.key}` ? (\n <Check className=\"text-green-500\" />\n ) : (\n <Copy />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => copyExtraUrl(`${link.id}:${extra.key}`, extra.url)}\n disabled={!!unavailableReason}\n title={unavailableReason ?? \"Copy\"}\n aria-label={`Copy ${extra.label}`}\n />\n </div>\n ))}\n <div className=\"flex items-center gap-1.5 rounded-md border bg-background p-1.5\">\n <Input mono\n readOnly\n value={linkUrl}\n className=\"min-w-0 flex-1\"\n onFocus={(e) => e.currentTarget.select()}\n />\n <span\n className=\"flex items-center gap-1 text-[10px] text-muted-foreground px-1\"\n title={`${link.useCount} view${link.useCount === 1 ? \"\" : \"s\"}`}\n >\n <Eye className=\"w-3 h-3\" />\n {link.useCount}\n </span>\n {showOpenLink ? (\n <OutboundLink\n href={linkUrl}\n aria-label=\"Open share link\"\n title=\"Open in new tab\"\n className=\"flex h-11 w-11 flex-shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground sm:h-8 sm:w-8\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </OutboundLink>\n ) : null}\n <Button\n icon={copiedId === link.id ? (\n <Check className=\"text-green-500\" />\n ) : (\n <Copy />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => copyLink(link)}\n disabled={!!unavailableReason}\n title={unavailableReason ?? \"Copy link\"}\n aria-label=\"Copy share link\"\n />\n <Button\n icon={refreshing ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <MessageSquareText />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => prepareTextShare(link.id)}\n disabled={!!unavailableReason || refreshing}\n title={unavailableReason ?? \"Review before sharing by text\"}\n aria-label=\"Share by text\"\n />\n <Button\n icon={<Trash2 />}\n removes\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => setRevokeTarget(link)}\n title=\"Turn off link\"\n aria-label=\"Turn off share link\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {shareError ? (\n <div\n role=\"alert\"\n className=\"flex items-center justify-between gap-2 text-xs text-destructive\"\n >\n <span>{shareError}</span>\n <Button\n icon={<RefreshCw />}\n type=\"button\"\n variant=\"outline\"\n disabled={isLoading}\n onClick={() => refresh()}\n >\n Refresh\n </Button>\n <ShareErrorAlchemyMenu className=\"ml-auto\" />\n </div>\n ) : null}\n\n {refreshing && !loading ? (\n <span className=\"sr-only\" role=\"status\">\n Checking current link access\n </span>\n ) : null}\n\n <PortalConfirmDialog\n open={shareTarget !== null}\n onOpenChange={(open) => !open && closeShareReview()}\n title=\"Review message before sharing\"\n description=\"Anyone with this link can open it without signing in. AI Matrx will prepare the message; it won't send it.\"\n content={\n shareTarget ? (\n <div className=\"space-y-3 text-sm\">\n <dl className=\"space-y-1.5 text-xs\">\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Access</dt>\n <dd className=\"text-right\">\n {describeShareLinkAccess(shareTarget.permissionLevel)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Expiry</dt>\n <dd className=\"text-right\">\n {describeShareLinkExpiry(shareTarget.expiresAt)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Views</dt>\n <dd className=\"text-right\">\n {/* read-gate-exempt: the chosen link's own usage fields (from a list read that succeeded; its failure is shareError), not a list count */}\n {shareTarget.maxUses === null\n ? `${shareTarget.useCount} used · no limit`\n : `${shareTarget.useCount} of ${shareTarget.maxUses} used`}\n </dd>\n </div>\n </dl>\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium\">Message preview</p>\n <p className=\"rounded-md border bg-muted/30 p-3 break-words\">\n {createSafeShareMessage(urlFor(shareTarget))}\n </p>\n </div>\n <Button\n icon={<Copy />}\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n disabled={handoffBusy}\n onClick={handleCopyReviewedMessage}\n >\n Copy message\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n You can turn this link off from the share panel at any time.\n </p>\n </div>\n ) : null\n }\n confirmLabel={\n typeof navigator !== \"undefined\" &&\n typeof navigator.share === \"function\"\n ? \"Open share options\"\n : \"Copy message\"\n }\n cancelLabel=\"Not now\"\n contentClassName=\"w-[calc(100%-2rem)] sm:!max-w-[34rem]\"\n busy={handoffBusy}\n onConfirm={handleNativeHandoff}\n />\n\n <PortalConfirmDialog\n open={!!revokeTarget}\n onOpenChange={(o) => !o && setRevokeTarget(null)}\n title=\"Turn off this link?\"\n description=\"Anyone currently using it will lose access. This can't be undone.\"\n confirmLabel=\"Turn off link\"\n variant=\"destructive\"\n onConfirm={handleRevoke}\n />\n {fallbackDialog}\n </div>\n );\n}\n","\"use client\";\n\nimport { ConfirmDialog as PackageConfirmDialog, type ConfirmDialogProps } from \"@ai-matrx/design-system\";\nimport { usePortalContainer } from \"../host\";\n\nexport type { ConfirmDialogProps };\n\n/** The design-system confirm, portalled into the host's pop-out window when it has one. */\nexport function PortalConfirmDialog(props: ConfirmDialogProps) {\n const container = usePortalContainer();\n return <PackageConfirmDialog {...(container ? { portalContainer: container } : {})} {...props} />;\n}\n","\"use client\";\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { shareCopyNotify } from \"./host\";\nimport { toast } from \"./host\";\nimport { useCallback, useState, type ReactNode } from \"react\";\nimport { ClipboardFallbackDialog } from \"@ai-matrx/design-system\";\n\ninterface ShareOptions {\n title: string;\n text?: string | undefined;\n /** `null` omits a separate URL field when the reviewed text already contains it. */\n url?: string | null | undefined;\n /** Full text to copy when native sharing is unavailable. */\n copyText?: string | undefined;\n fallbackTitle?: string | undefined;\n fallbackDescription?: string | undefined;\n}\n\n/**\n * Which door actually opened. Callers that announce the result (\"Link copied\")\n * must not guess: a manual-fallback run copied nothing, and a toast claiming\n * otherwise is a screen that lies.\n */\nexport type ShareOutcome = \"shared\" | \"copied\" | \"manual\" | \"cancelled\";\n\nexport interface UseShareResult {\n share: (options: ShareOptions) => Promise<ShareOutcome>;\n copy: (\n text: string,\n fallback?: { title?: string | undefined; description?: string | undefined },\n ) => Promise<\"copied\" | \"manual\">;\n copied: boolean;\n fallbackDialog: ReactNode;\n}\n\n/** Native share-sheet first, clipboard second, accessible manual copy last. */\nexport function useShare(): UseShareResult {\n const { copyText: copyTextKit } = useClipboard({\n notify: shareCopyNotify,\n });\n const [copied, setCopied] = useState(false);\n const [fallbackUrl, setFallbackUrl] = useState<string | null>(null);\n const [fallbackTitle, setFallbackTitle] = useState(\"Copy link\");\n const [fallbackDescription, setFallbackDescription] = useState(\n \"Press Cmd/Ctrl+C to copy, or use the Copy button below.\",\n );\n\n const copy = useCallback(\n async (\n text: string,\n fallback?: { title?: string | undefined; description?: string | undefined },\n ): Promise<\"copied\" | \"manual\"> => {\n const showManualFallback = () => {\n setFallbackTitle(fallback?.title ?? \"Copy link\");\n setFallbackDescription(\n fallback?.description ??\n \"Press Cmd/Ctrl+C to copy, or use the Copy button below.\",\n );\n setFallbackUrl(text);\n return \"manual\" as const;\n };\n if (!(await copyTextKit(text))) return showManualFallback();\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2_000);\n return \"copied\";\n },\n [],\n );\n\n const share = useCallback(\n async (options: ShareOptions): Promise<ShareOutcome> => {\n const url =\n options.url === null\n ? \"\"\n : (options.url ??\n (typeof window !== \"undefined\" ? window.location.href : \"\"));\n const payload = {\n title: options.title,\n ...(options.text ? { text: options.text } : {}),\n ...(url ? { url } : {}),\n };\n if (typeof navigator !== \"undefined\" && navigator.share) {\n try {\n await navigator.share(payload);\n return \"shared\";\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AbortError\"\n ) {\n return \"cancelled\";\n }\n }\n }\n const copyText = options.copyText ?? url;\n return copy(copyText, {\n title: options.fallbackTitle,\n description: options.fallbackDescription,\n });\n },\n [copy],\n );\n\n return {\n share,\n copy,\n copied,\n fallbackDialog: (\n <ClipboardFallbackDialog\n open={fallbackUrl !== null}\n onOpenChange={(open: boolean) => !open && setFallbackUrl(null)}\n url={fallbackUrl ?? \"\"}\n title={fallbackTitle}\n description={fallbackDescription}\n />\n ),\n };\n}\n","\"use client\";\n\n// \"Indexed by search engines\" — the per-item half of the indexed switch (access ladder T-12).\n// Law: common-docs/policies/access-ladder.md (\"Public items: indexed or not\").\n//\n// An INLINE control: it sits on the existing \"Published to the web\" line of whatever surface\n// hosts it and never adds a row. It renders nothing until the record is published to the web\n// (search engines can only index a published record) and nothing for a type that has no\n// switch. Security is identical either way, so the words say only what search engines do.\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Switch } from \"./ui/switch\";\nimport { useToast } from \"./host\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { getSearchEngineIndexedState, setSearchEngineIndexed } from \"@ai-matrx/sharing/core\";\nimport type { SearchEngineIndexedState } from \"@ai-matrx/sharing/core\";\n\ninterface Props {\n resourceType: string;\n resourceId: string;\n /**\n * Re-read whenever this changes — pass the host's own published state so the control\n * appears the moment the record is published (and leaves when it is unpublished).\n */\n publishedHint?: boolean | undefined;\n className?: string | undefined;\n}\n\nexport function SearchEngineIndexedSwitch({\n resourceType,\n resourceId,\n publishedHint,\n className,\n}: Props) {\n const [state, setState] = useState<SearchEngineIndexedState | null>(null);\n const [busy, setBusy] = useState(false);\n const { toast } = useToast();\n\n const load = useCallback(async () => {\n const res = await getSearchEngineIndexedState(resourceType, resourceId);\n if (res.error) {\n // Loud, but not in the way: the host's own publish control still works.\n console.warn(`[search-engine-indexed] state for ${resourceType}/${resourceId}: ${res.error}`);\n setState(null);\n return;\n }\n setState(res.state);\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n void load();\n }, [load, publishedHint]);\n\n if (!state || !state.enrolled || !state.published_to_web) return null;\n\n const onChange = async (next: boolean) => {\n setBusy(true);\n // A flip is a deliberate choice and is stored as one: a later change to the type's\n // default (organization or person) never overrides what the creator set by hand.\n const res = await setSearchEngineIndexed(resourceType, resourceId, next);\n setBusy(false);\n if (res.error || !res.state) {\n toast({\n title: \"Couldn't change search engine indexing\",\n description: res.error ?? \"Please try again\",\n variant: \"destructive\",\n });\n return;\n }\n setState(res.state);\n toast({\n title: next ? \"Search engines may list this page\" : \"Search engines are told not to list this page\",\n description: \"Anyone with the address can still open it.\",\n });\n };\n\n const followsDefault = state.value === null;\n const id = `indexed-${resourceType}-${resourceId}`;\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1.5\", className)}\n title={\n followsDefault\n ? `Following the default for this type (${state.type_default ? \"indexed\" : \"not indexed\"}).`\n : \"Set for this item.\"\n }\n >\n <label htmlFor={id} className=\"cursor-pointer text-xs text-muted-foreground\">\n Indexed by search engines\n </label>\n <Switch\n id={id}\n checked={state.effective}\n onCheckedChange={onChange}\n disabled={busy || !state.can_change}\n aria-label=\"Indexed by search engines\"\n />\n </span>\n );\n}\n","\"use client\";\n\n// features/sharing/secure/SecureLinkPanel.tsx — \"SECURE LINK — CODE REQUIRED\", the sender's half.\n//\n// The third way to share, beside People and Public, for anything that must not travel in a plain\n// link: the recipient gets a single-use link on one channel and a code on the other, and it opens\n// once (aidream `services/secure_delivery/FEATURE.md`). It is ONE component, mounted by the ONE\n// share dialog (`ShareModal`, the \"Secure\" tab) and by the vault item's own Share panel — never a\n// second surface, never a per-feature variant.\n//\n// WHAT THIS PANEL NEVER HOLDS: a protected value or the link. It asks the server which protected\n// fields this person may include, sends names and addresses, and draws the receipt the server\n// writes. The list below comes from the door `platform.secure_delivery_sent` — the sender's own\n// rows only; the delivery table itself is closed to signed-in clients (aidream 1350g).\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Loader2, Mail, MessageSquare, ShieldCheck } from \"lucide-react\";\n\nimport { confirm } from \"./host\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Input } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Textarea } from \"@ai-matrx/design-system\";\nimport { ToggleGroup, ToggleGroupItem } from \"./ui/toggle-group\";\nimport { useAppDispatch } from \"./host\";\nimport { IdentityGate, useConfirmed, wasCancelled } from \"@ai-matrx/vault\";\nimport { vaultIdentity } from \"./host\";\n\nimport {\n fetchRecipientPhoneOnFile,\n fetchSecureDeliveryOptions,\n listSentSecureDeliveries,\n revokeSecureDelivery,\n type SecureDeliveryOptions,\n SecureDeliveryRefusal,\n sendSecureDelivery,\n type SentSecureDelivery,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\nimport { formatDurationMinutes } from \"@ai-matrx/kit/format\";\n\ninterface SecureLinkPanelProps {\n resourceType: string;\n resourceId: string;\n resourceName: string;\n}\n\nconst STATUS_WORDS: Record<string, string> = {\n pending: \"Waiting to be opened\",\n viewed: \"Opened\",\n revoked: \"Turned off\",\n expired: \"Expired unopened\",\n undeliverable: \"Not delivered\",\n locked: \"Closed after wrong codes\",\n};\n\nfunction when(iso: string | null): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n return Number.isNaN(d.getTime())\n ? \"\"\n : d.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n}\n\n/**\n * Sending a password is a reveal: it needs the SAME fresh sign-in the vault asks for, through the\n * vault's ONE \"Confirm it's you\" (Google, password or an emailed code) — never a second dialog.\n */\nexport function SecureLinkPanel(props: SecureLinkPanelProps) {\n return (\n <IdentityGate identity={vaultIdentity()}>\n <SecureLinkForm {...props} />\n </IdentityGate>\n );\n}\n\nfunction SecureLinkForm({ resourceType, resourceId, resourceName }: SecureLinkPanelProps) {\n const dispatch = useAppDispatch();\n const confirmed = useConfirmed();\n const [options, setOptions] = useState<SecureDeliveryOptions | null>(null);\n const [optionsError, setOptionsError] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [linkChannel, setLinkChannel] = useState<\"email\" | \"sms\">(\"email\");\n const [fields, setFields] = useState<string[]>([]);\n const [note, setNote] = useState(\"\");\n const [sending, setSending] = useState(false);\n const [result, setResult] = useState<{ tone: \"ok\" | \"warn\" | \"error\"; text: string; remedy?: string | null | undefined } | null>(null);\n const [sent, setSent] = useState<SentSecureDelivery[] | null>(null);\n\n const refreshSent = useCallback(() => {\n listSentSecureDeliveries(resourceType, resourceId)\n .then(setSent)\n .catch(() => setSent([]));\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n let live = true;\n fetchSecureDeliveryOptions(dispatch, resourceType, resourceId)\n .then((o) => live && setOptions(o))\n .catch((err: unknown) =>\n live &&\n setOptionsError(\n err instanceof SecureDeliveryRefusal ? err.message : \"Could not load what can be sent.\",\n ),\n );\n refreshSent();\n return () => {\n live = false;\n };\n }, [dispatch, resourceType, resourceId, refreshSent]);\n\n // Pre-fill the mobile when the recipient is an existing user whose phone on file has agreed to\n // texts. Never over a number the sender typed; a pre-filled number is cleared when the email\n // stops matching anyone, so the both-by-email warning stays honest.\n const [phoneTyped, setPhoneTyped] = useState(false);\n const phonePrefilled = useRef(false);\n useEffect(() => {\n if (phoneTyped) return;\n const address = email.trim();\n const clearPrefill = () => {\n if (phonePrefilled.current) {\n setPhone(\"\");\n phonePrefilled.current = false;\n }\n };\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(address)) {\n clearPrefill();\n return;\n }\n let live = true;\n const timer = setTimeout(() => {\n fetchRecipientPhoneOnFile(address)\n .then((onFile) => {\n if (!live) return;\n if (onFile) {\n setPhone(onFile);\n phonePrefilled.current = true;\n } else {\n clearPrefill();\n }\n })\n .catch(() => {\n if (live) clearPrefill();\n });\n }, 400);\n return () => {\n live = false;\n clearTimeout(timer);\n };\n }, [email, phoneTyped]);\n\n const hasBoth = email.trim() !== \"\" && phone.trim() !== \"\";\n const canSend = email.trim() !== \"\" && !sending;\n\n async function send() {\n setSending(true);\n setResult(null);\n try {\n // A \"confirm it's you\" refusal opens the gate; once confirmed the same send runs again.\n const receipt = await confirmed(() => sendSecureDelivery(dispatch, {\n resource_type: resourceType,\n resource_id: resourceId,\n recipient_email: email.trim() || null,\n recipient_phone: phone.trim() || null,\n field_keys: fields,\n link_channel: hasBoth ? linkChannel : null,\n note: note.trim() || null,\n }));\n setResult({ tone: receipt.same_channel ? \"warn\" : \"ok\", text: receipt.sentence });\n setEmail(\"\");\n setPhone(\"\");\n setPhoneTyped(false);\n phonePrefilled.current = false;\n setNote(\"\");\n setFields([]);\n refreshSent();\n } catch (err: unknown) {\n if (wasCancelled(err)) {\n setResult({ tone: \"warn\", text: \"Not sent: it was not confirmed.\" });\n } else if (err instanceof SecureDeliveryRefusal) {\n setResult({ tone: \"error\", text: err.message, remedy: err.remedy });\n } else {\n setResult({ tone: \"error\", text: \"The secure link could not be sent. Try again.\" });\n }\n } finally {\n setSending(false);\n }\n }\n\n async function turnOff(row: SentSecureDelivery) {\n const ok = await confirm({\n title: \"Turn off this secure link?\",\n description: `The link to ${row.recipient_email ?? row.recipient_phone ?? \"this person\"} stops working at once and what it carries is deleted. They will have to ask you for a new one.`,\n confirmLabel: \"Turn it off\",\n });\n if (!ok) return;\n try {\n await revokeSecureDelivery(dispatch, row.id);\n } finally {\n refreshSent();\n }\n }\n\n const protectedFields = options?.protected_fields ?? [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-2 rounded-lg border border-border bg-muted/30 p-3\">\n <ShieldCheck className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-primary\" />\n <p className=\"text-xs text-muted-foreground\">\n They get a link that opens once, and a code on a separate channel. No account needed.\n {options ? ` The link works for ${formatDurationMinutes(options.link_ttl_minutes, { style: \"long\" })}.` : \"\"}\n </p>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-email\" className=\"text-xs\">Their email</Label>\n <Input\n id=\"secure-email\"\n type=\"email\"\n autoComplete=\"off\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n placeholder=\"name@example.com\"\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-phone\" className=\"text-xs\">Their mobile, for the code</Label>\n <Input\n id=\"secure-phone\"\n type=\"tel\"\n autoComplete=\"off\"\n value={phone}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setPhone(e.target.value);\n setPhoneTyped(true);\n phonePrefilled.current = false;\n }}\n placeholder=\"+1 310 555 0123\"\n />\n </div>\n </div>\n\n {hasBoth ? (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span>Send the link by</span>\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n variant=\"outline\"\n value={linkChannel}\n onValueChange={(v) => v && setLinkChannel(v as \"email\" | \"sms\")}\n >\n <ToggleGroupItem value=\"email\" aria-label=\"Link by email\">\n <Mail className=\"mr-1 h-3.5 w-3.5\" /> Email\n </ToggleGroupItem>\n <ToggleGroupItem value=\"sms\" aria-label=\"Link by text\">\n <MessageSquare className=\"mr-1 h-3.5 w-3.5\" /> Text\n </ToggleGroupItem>\n </ToggleGroup>\n <span>and the code by {linkChannel === \"email\" ? \"text\" : \"email\"}.</span>\n </div>\n ) : email.trim() !== \"\" ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-400\">\n Without a mobile number, the link and the code both go by email — anyone who can read that\n inbox could open it.\n </p>\n ) : null}\n\n {optionsError ? (\n <p className=\"text-xs text-destructive\">\n {optionsError}\n <ShareErrorAlchemyMenu error={optionsError} operation=\"Load the secure-link options\" />\n </p>\n ) : null}\n {protectedFields.length > 0 ? (\n <fieldset className=\"space-y-2\">\n <legend className=\"text-xs font-medium\">Include protected fields from {resourceName}</legend>\n {protectedFields.map((f) => (\n <div key={f.key} className=\"flex items-start gap-2\">\n <Checkbox\n size=\"sm\"\n id={`secure-field-${f.key}`}\n checked={fields.includes(f.key)}\n disabled={!f.available}\n onCheckedChange={(checked) =>\n setFields((cur) =>\n checked ? [...cur, f.key] : cur.filter((k) => k !== f.key),\n )\n }\n />\n <div>\n <Label htmlFor={`secure-field-${f.key}`} className=\"text-sm\">\n {f.label}\n </Label>\n {!f.available && f.reason ? (\n <p className=\"text-xs text-muted-foreground\">{f.reason}</p>\n ) : null}\n </div>\n </div>\n ))}\n </fieldset>\n ) : null}\n\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-note\" className=\"text-xs\">Message (optional, shown once with it)</Label>\n <Textarea\n id=\"secure-note\"\n rows={2}\n maxLength={1000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n\n <Button icon={sending ? <Loader2 className=\"animate-spin\" /> : null} variant=\"primary\" className=\"w-full\" onClick={send} disabled={!canSend}>\n Send secure link\n </Button>\n\n {result ? (\n <div\n className={\n result.tone === \"error\"\n ? \"rounded-md border border-destructive/30 bg-destructive/10 p-2.5 text-sm text-destructive-ink\"\n : result.tone === \"warn\"\n ? \"rounded-md border border-amber-500/30 bg-amber-500/10 p-2.5 text-sm\"\n : \"rounded-md border border-border bg-muted/40 p-2.5 text-sm\"\n }\n >\n <p>{result.text}</p>\n {result.remedy ? <p className=\"mt-1 text-xs opacity-80\">{result.remedy}</p> : null}\n </div>\n ) : null}\n\n {sent && sent.length > 0 ? (\n <div>\n <h3 className=\"mb-2 text-sm font-medium\">Sent securely</h3>\n <ul className=\"divide-y divide-border rounded-lg border border-border\">\n {sent.map((row) => (\n <li key={row.id} className=\"flex items-center justify-between gap-2 p-2.5 text-sm\">\n <div className=\"min-w-0\">\n <p className=\"truncate\">{row.recipient_email ?? row.recipient_phone}</p>\n <p className=\"text-xs text-muted-foreground\">\n {STATUS_WORDS[row.status] ?? row.status}\n {row.status === \"viewed\" && row.viewed_at ? ` ${when(row.viewed_at)}` : \"\"}\n {row.status === \"pending\" ? ` · until ${when(row.expires_at)}` : \"\"}\n {row.field_keys.length > 0 ? ` · with ${row.field_keys.join(\", \")}` : \"\"}\n </p>\n </div>\n {row.status === \"pending\" ? (\n <Button variant=\"outline\" onClick={() => void turnOff(row)}>\n Turn off\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":["import_core","state","kitConfirm","shareClientForIdentity","passThroughDispatchRef","import_core","import_react","import_design_system","import_design_system","import_controls","import_controls","import_jsx_runtime","import_controls","import_lucide_react","import_react","import_core","import_core","store","state","organizationId","import_react","import_core","state","import_core","import_design_system","import_lucide_react","import_react","import_controls","import_design_system","import_design_system","import_controls","import_lucide_react","import_design_system","import_jsx_runtime","import_core","import_design_system","import_jsx_runtime","import_react","import_lucide_react","import_core","import_core","import_cn","import_jsx_runtime","import_react","import_controls","import_design_system","import_design_system","import_design_system","import_lucide_react","import_core","import_core","import_core","import_core","import_react","import_lucide_react","import_controls","import_design_system","import_core","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_controls","import_design_system","import_clipboard","import_core","import_jsx_runtime","state","import_core","import_react","import_lucide_react","import_controls","import_core","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_cn","import_core","import_clipboard","import_react","import_lucide_react","import_design_system","React","import_controls","import_jsx_runtime","PackageSwitch","import_controls","import_design_system","import_cn","import_core","import_react","import_design_system","import_lucide_react","import_react","import_controls","import_format","import_lucide_react","import_core","import_design_system","import_jsx_runtime","PackageConfirmDialog","import_clipboard","import_react","import_design_system","import_jsx_runtime","copyText","import_core","import_jsx_runtime","import_design_system","import_core","import_core","import_jsx_runtime","import_core","import_react","import_cn","import_core","import_jsx_runtime","state","import_jsx_runtime","copyText","import_jsx_runtime","import_react","import_lucide_react","import_controls","import_design_system","import_vault","import_core","import_format","import_jsx_runtime","import_jsx_runtime","error","shareWithUser","makePublic","revokeAccess"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/index.ts","../src/react/sheet/host.tsx","../src/react/sheet/ShareModal.tsx","../src/react/sheet/ui/dialog.tsx","../src/react/sheet/ui/share-tabs-trigger.tsx","../src/react/permissionHooks.ts","../src/react/sheet/useGrantableLevels.ts","../src/react/sheet/PermissionsList.tsx","../src/react/sheet/PermissionBadge.tsx","../src/react/sheet/ui/alert-dialog.tsx","../src/react/sheet/AccessSummaryPanel.tsx","../src/react/sheet/useAccessSummary.ts","../src/react/sheet/ShareWithUserTab.tsx","../src/react/sheet/ui/scroll-area.tsx","../src/react/sheet/ui/avatar.tsx","../src/react/sheet/AddEveryoneInOrg.tsx","../src/react/sheet/OutsideSharePanel.tsx","../src/react/sheet/WhoCouldSeeOn.tsx","../src/react/sheet/OrgAvailabilityNote.tsx","../src/react/sheet/WhoCanSeeThis.tsx","../src/react/sheet/RowControls.tsx","../src/react/sheet/ui/switch.tsx","../src/react/sheet/ui/toggle-group.tsx","../src/react/sheet/PublicAccessTab.tsx","../src/react/sheet/ui/alert.tsx","../src/react/sheet/ShareLinkPanel.tsx","../src/react/sheet/ui/confirm-dialog.tsx","../src/react/sheet/useShare.tsx","../src/react/sheet/SearchEngineIndexedSwitch.tsx","../src/react/sheet/SecureLinkPanel.tsx","../src/react/sheet/useKeepFocusInDialog.ts"],"sourcesContent":["// @ai-matrx/sharing/react — THE share sheet (the one sharing dialog in every app) and its pieces.\n// Host inputs: `configureSharing` (@ai-matrx/sharing/core) + `configureShareSheetUi` (here).\nexport { configureShareSheetUi, shareSheetUi, resetShareSheetCache } from \"./sheet/host\";\nexport type { ShareSheetUi, ShareSheetConnection, ShareSheetConnections, ShareSheetOrganization, ShareSheetToastOptions } from \"./sheet/host\";\nexport * from \"./sheet/ShareModal\";\nexport * from \"./sheet/PermissionsList\";\nexport * from \"./sheet/PermissionBadge\";\nexport * from \"./sheet/AccessSummaryPanel\";\nexport * from \"./sheet/WhoCanSeeThis\";\nexport * from \"./sheet/RowControls\";\nexport * from \"./sheet/ShareLinkPanel\";\nexport * from \"./sheet/ShareWithUserTab\";\nexport * from \"./sheet/PublicAccessTab\";\nexport * from \"./sheet/OutsideSharePanel\";\nexport * from \"./sheet/SecureLinkPanel\";\nexport * from \"./sheet/AddEveryoneInOrg\";\nexport * from \"./sheet/OrgAvailabilityNote\";\nexport * from \"./sheet/SearchEngineIndexedSwitch\";\nexport * from \"./sheet/useShare\";\nexport * from \"./sheet/useGrantableLevels\";\nexport * from \"./sheet/useAccessSummary\";\nexport * from \"./permissionHooks\";\nexport * from \"./sheet/WhoCouldSeeOn\";\n","\"use client\";\n\n/**\n * @ai-matrx/sharing/react — what the SHARE SHEET needs from its host's UI, injected ONCE at boot:\n *\n * configureShareSheetUi({ toast, useCurrentUserId, useOrganizations, CopyButtons, EntityRef, ... });\n *\n * The data half (database client, aidream calls, routes) is `configureSharing` in\n * `@ai-matrx/sharing/core`. Every field here has a WORKING default, so a host that supplies\n * nothing still gets a usable sheet (plain copy buttons, a plain name for the record, an email\n * field for finding a person, the organization's roster as contacts); a richer host (the web)\n * hands in its own pieces. A default is never a blank: where a host-only feature is absent the\n * default says so (one console line naming the field, and `data-share-sheet-host=\"unconfigured\"` in the DOM).\n */\n\nimport { useCallback, useEffect, useMemo, useState, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\nimport { Input } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { confirm as kitConfirm, type ConfirmOptions } from \"@ai-matrx/kit/confirm-opener\";\nimport { readOrganizationMemberRows } from \"@ai-matrx/sharing/core\";\nimport { shareClient as shareClientForIdentity } from \"@ai-matrx/sharing/core\";\nimport { createSupabaseIdentity } from \"@ai-matrx/vault\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype LooseProps = { [key: string]: any };\n\nexport interface ShareSheetOrganization {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface ShareSheetConnection {\n user_id: string;\n email: string | null;\n display_name: string | null;\n avatar_url: string | null;\n source: \"conversation\" | \"organization\" | \"invitation\";\n sourceDetails?: string | undefined;\n}\n\nexport interface ShareSheetConnections {\n connections: ShareSheetConnection[];\n isLoading: boolean;\n error: string | null;\n partialFailures: string[];\n refresh: () => Promise<void> | void;\n}\n\nexport interface ShareSheetToastOptions {\n title?: ReactNode | undefined;\n description?: ReactNode | undefined;\n variant?: \"default\" | \"destructive\" | \"success\" | string | undefined;\n}\n\nexport interface ShareSheetUi {\n /** Messages. Default: `console` + `window.alert` for errors (never swallowed). */\n toast: (options: ShareSheetToastOptions) => void;\n /** The signed-in person's id. Default: read once from the sharing client's session. */\n useCurrentUserId: () => string | null;\n /** The organizations the person belongs to (`{id, name}`). Default: `organizations` read once. */\n useOrganizations: () => ShareSheetOrganization[];\n /** Contacts offered in the People tab. Default: the organization's roster. */\n useUserConnections: (options: { organizationId?: string }) => ShareSheetConnections;\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n CopyButtons: ComponentType<LooseProps>;\n csvExportItem: (...args: any[]) => any;\n jsonExportItem: (...args: any[]) => any;\n usePageCapture: (build: () => unknown, options?: { enabled?: boolean }) => void;\n dialogCapture: (input: any) => unknown;\n PageCaptureButton: ComponentType<LooseProps>;\n ErrorAlchemyMenu: ComponentType<LooseProps>;\n InfoHint: ComponentType<LooseProps>;\n EntityDoorControls: ComponentType<LooseProps>;\n EntityRef: ComponentType<LooseProps>;\n UserAvatarDisplay: ComponentType<LooseProps>;\n ConnectionsReadNotice: ComponentType<LooseProps>;\n UserSearchField: ComponentType<LooseProps>;\n /** The vault identity the secure-link panel seals with (`@ai-matrx/vault`). */\n vaultIdentity: unknown;\n humanLines: (...args: any[]) => string;\n /** Where dialogs portal (the web: its pop-out window container). Default: the document body. */\n usePortalContainer: () => HTMLElement | null | undefined;\n}\n\n/* ─── defaults ───────────────────────────────────────────────────────────── */\n\nfunction DefaultCopyButtons(props: LooseProps) {\n const [done, setDone] = useState(false);\n const text = (): string => {\n const h = props.human ?? props.text;\n const v = typeof h === \"function\" ? h() : h;\n return Array.isArray(v) ? v.join(\"\\n\") : String(v ?? \"\");\n };\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n className={props.className}\n onClick={() => {\n void copyText(text()).then(() => {\n setDone(true);\n setTimeout(() => setDone(false), 1500);\n });\n }}\n >\n {done ? \"Copied\" : props.label ? `Copy ${String(props.label).toLowerCase()}` : \"Copy\"}\n </Button>\n );\n}\n\n/**\n * A stand-in announces itself (law 4): one console line per port, naming `configureShareSheetUi`, and\n * every stand-in that draws leaves `data-share-sheet-host=\"unconfigured\"` (+ the port) in the DOM so a\n * second host (desktop, the extension) sees WHY a button is missing instead of finding nothing.\n */\nconst announced = new Set<string>();\nfunction announceStandIn(port: string): void {\n if (announced.has(port)) return;\n announced.add(port);\n console.warn(\n `[share] The share sheet is using its built-in stand-in for \"${port}\": the host did not pass it, so that part of the sheet is absent. Pass it with configureShareSheetUi({ ${port} }).`,\n );\n}\n/** Test seam: forget what was announced. */\nexport function resetShareSheetStandInNotices(): void {\n announced.clear();\n}\nfunction StandIn({ port }: { port: string }) {\n useEffect(() => announceStandIn(port), [port]);\n return <span hidden data-share-sheet-host=\"unconfigured\" data-share-sheet-port={port} />;\n}\n\nfunction DefaultErrorMenu(_props: LooseProps) {\n return <StandIn port=\"ErrorAlchemyMenu\" />;\n}\nfunction DefaultPageCaptureButton(_props: LooseProps) {\n return <StandIn port=\"PageCaptureButton\" />;\n}\nfunction DefaultEntityDoorControls(_props: LooseProps) {\n return <StandIn port=\"EntityDoorControls\" />;\n}\n\nfunction DefaultInfoHint(props: LooseProps) {\n return (\n <span title={String(props.text ?? \"\")} aria-label={String(props.label ?? \"More info\")} className=\"cursor-help text-muted-foreground\">\n ⓘ\n </span>\n );\n}\n\nfunction DefaultEntityRef(props: LooseProps) {\n const href = typeof props.href === \"string\" ? props.href : null;\n return href ? <a href={href} className=\"underline-offset-2 hover:underline\">{String(props.name ?? \"\")}</a> : <span>{String(props.name ?? \"\")}</span>;\n}\n\nfunction DefaultUserAvatar(props: LooseProps) {\n const u = (props.user ?? {}) as { displayName?: string | undefined; email?: string | undefined; display_name?: string | undefined };\n const name = u.displayName ?? u.display_name ?? u.email ?? \"?\";\n return (\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-full bg-muted text-xs font-medium\" aria-label={name}>\n {name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction DefaultConnectionsNotice(props: LooseProps) {\n if (!props.error && !(Array.isArray(props.partialFailures) && props.partialFailures.length)) return null;\n return (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 p-2 text-xs text-destructive\">\n {props.error ? `Contacts could not be read: ${String(props.error)}` : `Some contacts could not be read.`}{\" \"}\n {props.onRetry ? ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button type=\"button\" className=\"underline\" onClick={() => props.onRetry()}>\n Retry\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction DefaultUserSearchField(props: LooseProps) {\n const { onValueChange, onUserSelect: _onUserSelect, value, ...rest } = props;\n return <Input {...rest} value={value ?? \"\"} onChange={(e: { target: { value: string } }) => onValueChange?.(e.target.value)} />;\n}\n\nconst ORGS_EMPTY: ShareSheetOrganization[] = [];\nlet orgsCache: ShareSheetOrganization[] | null = null;\nconst orgListeners = new Set<() => void>();\n\nfunction useDefaultOrganizations(): ShareSheetOrganization[] {\n const snapshot = useSyncExternalStore(\n (cb) => {\n orgListeners.add(cb);\n return () => orgListeners.delete(cb);\n },\n () => orgsCache ?? ORGS_EMPTY,\n () => ORGS_EMPTY,\n );\n useEffect(() => {\n if (orgsCache) return;\n orgsCache = ORGS_EMPTY;\n void import(\"@ai-matrx/sharing/core\").then(async ({ shareClient }) => {\n const { data, error } = await shareClient().from(\"organizations\").select(\"id, name\");\n if (error) console.error(`[share] Your organizations could not be read: ${error.message}`);\n orgsCache = (Array.isArray(data) ? (data as ShareSheetOrganization[]) : []).map((o) => ({ ...o, id: String(o.id), name: String(o.name ?? \"\") }));\n orgListeners.forEach((l) => l());\n }).catch((err: unknown) => console.error(\"[share] Your organizations could not be read:\", err));\n }, []);\n return snapshot;\n}\n\nfunction useDefaultCurrentUserId(): string | null {\n const [id, setId] = useState<string | null>(null);\n useEffect(() => {\n void import(\"@ai-matrx/sharing/core\").then(async ({ shareClient }) => {\n const { getClaimsUser } = await import(\"@ai-matrx/sharing/core\");\n const { data } = await getClaimsUser(shareClient());\n setId(data.user?.id ?? null);\n });\n }, []);\n return id;\n}\n\nfunction useDefaultConnections({ organizationId }: { organizationId?: string }): ShareSheetConnections {\n const [state, setState] = useState<{ rows: ShareSheetConnection[]; loading: boolean; error: string | null }>({ rows: [], loading: Boolean(organizationId), error: null });\n const load = useCallback(\n async (fresh = false) => {\n if (!organizationId) return;\n setState((s) => ({ ...s, loading: true }));\n try {\n const rows = await readOrganizationMemberRows(organizationId, { fresh });\n setState({\n rows: rows.map((r) => ({\n user_id: r.user_id,\n email: r.user_email ?? null,\n display_name: r.user_display_name ?? null,\n avatar_url: r.user_avatar_url ?? null,\n source: \"organization\" as const,\n })),\n loading: false,\n error: null,\n });\n } catch (err) {\n setState({ rows: [], loading: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n [organizationId],\n );\n useEffect(() => {\n void load();\n }, [load]);\n return useMemo(\n () => ({ connections: state.rows, isLoading: state.loading, error: state.error, partialFailures: [], refresh: () => load(true) }),\n [state, load],\n );\n}\n\nconst DEFAULTS: ShareSheetUi = {\n toast: ({ title, description, variant }) => {\n const text = [title, description].filter((x) => typeof x === \"string\").join(\" — \");\n if (variant === \"destructive\") {\n console.error(`[share] ${text}`);\n if (typeof window !== \"undefined\") window.alert(text);\n } else console.info(`[share] ${text}`);\n },\n useCurrentUserId: useDefaultCurrentUserId,\n useOrganizations: useDefaultOrganizations,\n useUserConnections: useDefaultConnections,\n confirm: (o) => kitConfirm(o),\n CopyButtons: DefaultCopyButtons,\n csvExportItem: () => {\n announceStandIn(\"csvExportItem\");\n return null;\n },\n jsonExportItem: () => {\n announceStandIn(\"jsonExportItem\");\n return null;\n },\n usePageCapture: () => {\n announceStandIn(\"usePageCapture\");\n return undefined;\n },\n dialogCapture: (input) => input,\n PageCaptureButton: DefaultPageCaptureButton,\n ErrorAlchemyMenu: DefaultErrorMenu,\n InfoHint: DefaultInfoHint,\n EntityDoorControls: DefaultEntityDoorControls,\n EntityRef: DefaultEntityRef,\n UserAvatarDisplay: DefaultUserAvatar,\n ConnectionsReadNotice: DefaultConnectionsNotice,\n UserSearchField: DefaultUserSearchField,\n vaultIdentity: null,\n humanLines: (...args: unknown[]) => args.flat().filter(Boolean).map(String).join(\"\\n\"),\n usePortalContainer: () => undefined,\n};\n\nlet ui: ShareSheetUi = DEFAULTS;\n\n/** Merge host UI over the defaults (boot-time; tests may call it again). */\nexport function configureShareSheetUi(next: Partial<ShareSheetUi>): void {\n ui = { ...ui, ...next };\n}\n\nexport function shareSheetUi(): ShareSheetUi {\n return ui;\n}\n\n/* ─── the names the sheet's files import (web parity) ─────────────────────── */\n\nexport function useToast() {\n return { toast: (o: ShareSheetToastOptions) => ui.toast(o) };\n}\nexport const toast = {\n success: (message: string) => ui.toast({ title: message }),\n error: (message: string) => ui.toast({ title: message, variant: \"destructive\" }),\n info: (message: string) => ui.toast({ title: message }),\n};\nexport function shareCopyNotify(message: string, kind: \"success\" | \"error\"): void {\n ui.toast({ title: message, ...(kind === \"error\" ? { variant: \"destructive\" } : {}) });\n}\nexport const confirm = (options: ConfirmOptions) => ui.confirm(options);\nexport const useCurrentUserId = () => ui.useCurrentUserId();\nexport const useNavTree = () => ({ orgs: ui.useOrganizations() });\nexport const useOrganizationsToCreateIn = () => ({ orgs: ui.useOrganizations() });\nexport const useUserConnections = (options: { organizationId?: string }) => ui.useUserConnections(options);\nexport type ConnectionUser = ShareSheetConnection;\nexport type UserSearchCandidate = {\n id: string;\n email: string | null;\n displayName: string | null;\n avatarUrl: string | null;\n organizations?: string[] | undefined;\n source?: string | undefined;\n [key: string]: unknown;\n};\nexport const usePageCapture = (build: () => unknown, options?: { enabled?: boolean }) => ui.usePageCapture(build, options);\nexport const dialogCapture = (input: unknown) => ui.dialogCapture(input);\nexport const csvExportItem = (...args: any[]) => ui.csvExportItem(...args);\nexport const jsonExportItem = (...args: any[]) => ui.jsonExportItem(...args);\nexport const humanLines = (...args: any[]) => ui.humanLines(...args);\nexport const CopyButtons = (p: LooseProps) => <ui.CopyButtons {...p} />;\nexport const PageCaptureButton = (p: LooseProps) => <ui.PageCaptureButton {...p} />;\nexport const ShareErrorAlchemyMenu = (p: LooseProps) => <ui.ErrorAlchemyMenu {...p} />;\nexport const InfoHint = (p: LooseProps) => <ui.InfoHint {...p} />;\nexport const ShareEntityDoorControls = (p: LooseProps) => <ui.EntityDoorControls {...p} />;\nexport const ShareEntityRef = (p: LooseProps) => <ui.EntityRef {...p} />;\nexport const UserAvatarDisplay = (p: LooseProps) => <ui.UserAvatarDisplay {...p} />;\nexport const ConnectionsReadNotice = (p: LooseProps) => <ui.ConnectionsReadNotice {...p} />;\nexport const UserSearchField = (p: LooseProps) => <ui.UserSearchField {...p} />;\nlet defaultIdentity: unknown = null;\n/** The vault identity: the host's, else one built on the sharing client's own auth session. */\nexport const usePortalContainer = () => ui.usePortalContainer();\nexport const vaultIdentity = (): any => {\n if (ui.vaultIdentity) return ui.vaultIdentity;\n announceStandIn(\"vaultIdentity\");\n if (!defaultIdentity) {\n defaultIdentity = createSupabaseIdentity(shareClientForIdentity().auth as any, {\n redirectTo: () => window.location.href,\n onDifferentPerson: async (message: string) => {\n window.alert(message);\n },\n });\n }\n return defaultIdentity;\n};\n\n/* ─── the sheet's per-tab cache (was the web's redux sharingStatus slice) ─── */\n\ninterface SharingStatusEntry {\n visibility: any;\n loading: boolean;\n error: string | null;\n}\ninterface SharingAuthorityEntry {\n isOwner: boolean;\n loading: boolean;\n error: string | null;\n}\ninterface SharingStatusState {\n sharingStatus: { byKey: Record<string, SharingStatusEntry>; authorityByKey: Record<string, SharingAuthorityEntry> };\n}\ntype Action = { type: string; payload: any };\n\nlet state: SharingStatusState = { sharingStatus: { byKey: {}, authorityByKey: {} } };\nconst listeners = new Set<() => void>();\n\nfunction reduce(s: SharingStatusState[\"sharingStatus\"], a: Action): SharingStatusState[\"sharingStatus\"] {\n const { key } = a.payload as { key: string };\n const byKey = { ...s.byKey };\n const authorityByKey = { ...s.authorityByKey };\n switch (a.type) {\n case \"requested\":\n byKey[key] = { visibility: byKey[key]?.visibility ?? null, loading: true, error: null };\n break;\n case \"loaded\":\n byKey[key] = { visibility: a.payload.visibility, loading: false, error: null };\n break;\n case \"failed\":\n byKey[key] = { visibility: byKey[key]?.visibility ?? null, loading: false, error: a.payload.error };\n break;\n case \"authorityRequested\":\n authorityByKey[key] = { isOwner: authorityByKey[key]?.isOwner ?? false, loading: true, error: authorityByKey[key]?.error ?? null };\n break;\n case \"authorityResolved\":\n authorityByKey[key] = { isOwner: a.payload.isOwner, loading: false, error: a.payload.error };\n break;\n }\n return { byKey, authorityByKey };\n}\n\nconst store = {\n getState: () => state,\n dispatch: (a: Action) => {\n state = { sharingStatus: reduce(state.sharingStatus, a) };\n listeners.forEach((l) => l());\n return a;\n },\n};\n\nexport const useAppStore = () => store;\nexport function useAppSelector<T>(select: (s: SharingStatusState) => T): T {\n return useSyncExternalStore(\n (cb) => {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n () => select(state),\n () => select(state),\n );\n}\nexport const sharingStatusKey = (resourceType: string, resourceId: string) => `${resourceType}:${resourceId}`;\nexport const sharingStatusRequested = (payload: { key: string }): Action => ({ type: \"requested\", payload });\nexport const sharingStatusLoaded = (payload: { key: string; visibility: unknown }): Action => ({ type: \"loaded\", payload });\nexport const sharingStatusFailed = (payload: { key: string; error: string }): Action => ({ type: \"failed\", payload });\nexport const sharingAuthorityRequested = (payload: { key: string }): Action => ({ type: \"authorityRequested\", payload });\nexport const sharingAuthorityResolved = (payload: { key: string; isOwner: boolean; error: string | null }): Action => ({ type: \"authorityResolved\", payload });\nexport const selectSharingStatus = (s: SharingStatusState, key: string): SharingStatusEntry | undefined => s.sharingStatus.byKey[key];\nexport const selectSharingAuthority = (s: SharingStatusState, key: string): SharingAuthorityEntry | undefined => s.sharingStatus.authorityByKey[key];\n\n/** Test seam: forget every cached answer. */\nexport function resetShareSheetCache(): void {\n state = { sharingStatus: { byKey: {}, authorityByKey: {} } };\n listeners.forEach((l) => l());\n}\n\n/** web parity: the store-read hook the access summary used (kept per tab, re-read when stale). */\nconst storeReads = new Map<string, { data: unknown; at: number }>();\nexport function useStoreRead<T>(key: string | null, read: () => Promise<T>, options: { enabled?: boolean; staleAfterMs?: number } = {}) {\n const activeKey = options.enabled === false ? null : key;\n const kept = activeKey ? storeReads.get(activeKey) : undefined;\n const [s, setS] = useState<{ data: T | undefined; loading: boolean; error: string | null }>({\n data: kept?.data as T | undefined,\n loading: Boolean(activeKey) && !kept,\n error: null,\n });\n const refresh = useCallback(async () => {\n if (!activeKey) return;\n setS((p) => ({ ...p, loading: true }));\n try {\n const data = await read();\n storeReads.set(activeKey, { data, at: Date.now() });\n setS({ data, loading: false, error: null });\n } catch (err) {\n setS((p) => ({ data: p.data, loading: false, error: err instanceof Error ? err.message : String(err) }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey]);\n useEffect(() => {\n if (!activeKey) return;\n const k = storeReads.get(activeKey);\n const stale = !k || (options.staleAfterMs !== undefined && Date.now() - k.at > options.staleAfterMs);\n if (stale) void refresh();\n else setS({ data: k.data as T, loading: false, error: null });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey, refresh]);\n return { data: s.data, isLoading: s.loading, isError: s.error !== null, error: s.error, refresh };\n}\nexport function useRefreshWhenChanged(token: unknown, refresh: () => Promise<void>): void {\n const [first, setFirst] = useState(true);\n useEffect(() => {\n if (first) {\n setFirst(false);\n return;\n }\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [token]);\n}\n\n/** web parity: `useAppDispatch()` for the secure-delivery calls — a dispatch that hands the call back. */\nexport { passThroughDispatch } from \"@ai-matrx/sharing/core\";\nexport const useAppDispatch = () => passThroughDispatchRef;\nimport { passThroughDispatch as passThroughDispatchRef } from \"@ai-matrx/sharing/core\";\n","\"use client\";\n\nimport { appUrl, getActiveOrgId, sendShareNotice } from \"@ai-matrx/sharing/core\";\nimport { usePageCapture } from \"./host\";\nimport { dialogCapture } from \"./host\";\nimport { PageCaptureButton } from \"./host\";\nimport React, { useState } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Tabs, TabsContent } from \"@ai-matrx/design-system\";\nimport { TabsList } from \"@ai-matrx/design-system/controls\";\nimport { ShareTabsTrigger } from \"./ui/share-tabs-trigger\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport {\n Users,\n Globe,\n Mail,\n Loader2,\n CheckCircle,\n KeyRound,\n ShieldCheck,\n} from \"lucide-react\";\nimport { useSharing, useIsOwner } from \"../permissionHooks\";\nimport { useGrantableLevels } from \"./useGrantableLevels\";\nimport {\n getShareableResource,\n getResourceTypeLabel,\n getResourceSharePath,\n} from \"@ai-matrx/sharing/core\";\nimport type { ResourceType } from \"@ai-matrx/sharing/core\";\nimport { Skeleton } from \"@ai-matrx/design-system\";\nimport { AlertTriangle, Lock } from \"lucide-react\";\nimport { ShareEntityRef } from \"./host\";\nimport { PermissionsList } from \"./PermissionsList\";\nimport { AccessSummaryPanel } from \"./AccessSummaryPanel\";\nimport { ShareWithUserTab } from \"./ShareWithUserTab\";\nimport { OutsideSharePanel } from \"./OutsideSharePanel\";\nimport { shareWithOutsidePerson } from \"@ai-matrx/sharing/core\";\nimport { WhoCouldSeeOn } from \"./WhoCouldSeeOn\";\nimport { OrgAvailabilityNote } from \"./OrgAvailabilityNote\";\nimport { WhoCanSeeThis } from \"./WhoCanSeeThis\";\nimport { PublicAccessTab } from \"./PublicAccessTab\";\nimport { SecureLinkPanel } from \"./SecureLinkPanel\";\nimport { useToast } from \"./host\";\nimport { useKeepFocusInDialog } from \"./useKeepFocusInDialog\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\ninterface ShareModalProps {\n /** The level picker's words: \"notion\" = Full access · Edit · Comment · View. */\n levelWording?: \"roles\" | \"notion\" | undefined;\n isOpen: boolean;\n onClose: () => void;\n resourceType: ResourceType;\n resourceId: string;\n resourceName: string;\n /**\n * The organization this resource belongs to. Pass it whenever the caller knows: it scopes\n * the contact picker to that organization's members (FIX-7B), and the share's in-app\n * notification is filed there (ACCESS-FIX-18) — without it, a share from a page with no\n * organization picked raised \"Which workspace is this for?\". It is NOT used for the grant —\n * the store still resolves a record's organization off the row itself.\n */\n organizationId?: string | undefined;\n /**\n * What to CALL this thing on screen, when the caller knows better than the\n * registry does. In the unified store a Table IS a `custom.record` row, so\n * `resourceType=\"record\"` is correct and the registry's label — \"Record\" —\n * is the wrong noun for a table: the seventh-pass verdict read \"Share\n * Record\" above a table's own name. Omit it and the registry's label stands.\n */\n resourceNoun?: string | undefined;\n /**\n * OPTIONAL override. Leave it out — the modal resolves ownership itself.\n *\n * Only pass this when the caller already holds an authoritative, resolved\n * answer (e.g. it just created the row). Passing a stale or defaulted\n * `false` is what renders this dialog as a dead, empty shell for a user who\n * owns the record.\n */\n isOwner?: boolean | undefined;\n /**\n * SHARING WITH SOMEBODY OUTSIDE THE ORGANIZATION (lane SHARE-OUT, 21 September).\n *\n * Pass this when the subject is a TABLE in the unified record store and the\n * caller knows which organization it belongs to. The Users tab then carries\n * the outside lane: invite by email, \"invited, not yet joined\", resend and\n * revoke. Leave it out and the dialog is exactly what it was — this is not a\n * capability every resource type has, and a panel that could not work is a\n * panel that must not be drawn.\n *\n * It is NOT a second share surface: the grant it produces is an ordinary\n * `iam.permissions` row read by the same ladder, and the pending state is an\n * `iam.invitations` row, the platform's one invitation primitive.\n */\n outsideShare?: { organizationId: string; tableId: string };\n}\n\n/**\n * ShareModal - Main sharing interface\n *\n * Generic modal that works with ANY resource type.\n * Provides tabs for sharing with people or making public. A share names a PERSON, never an\n * organization (SHARE-PEOPLE-ONLY, 2026-09-25): the old Organizations tab is gone, and \"Add\n * everyone in <organization>\" inside the People tab names each current member instead.\n *\n * This is the ONE sharing dialog in the app. Do not build a feature-specific\n * variant — extend this one. It self-resolves ownership, so every call site is\n * a three-prop drop-in.\n *\n * @example\n * <ShareModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * resourceType=\"workflow\"\n * resourceId={workflowId}\n * resourceName=\"My Workflow\"\n * />\n */\nexport function ShareModal({\n levelWording = \"roles\",\n isOpen,\n onClose,\n resourceType,\n resourceId,\n resourceName,\n organizationId,\n resourceNoun,\n isOwner: isOwnerOverride,\n outsideShare,\n}: ShareModalProps) {\n const [activeTab, setActiveTab] = useState<\n \"users\" | \"public\" | \"secure\" | \"access\"\n >(\"users\");\n // How many people outside this organization are invited and have not joined.\n // Reported UP by the panel that draws them, so the grant list's empty state\n // cannot say \"Not shared with anyone\" over one of their rows (FIX-10C F13).\n const [outsidePending, setOutsidePending] = useState(0);\n const [emailingLink, setEmailingLink] = useState(false);\n const [emailSent, setEmailSent] = useState(false);\n const { toast } = useToast();\n const keepFocusInside = useKeepFocusInDialog();\n\n const getShareUrl = (): string | null => {\n const path = getResourceSharePath(resourceType, resourceId);\n if (!path) return null;\n const baseUrl = appUrl();\n return `${baseUrl}${path}`;\n };\n\n // Email link to self\n const handleEmailLink = async () => {\n const shareUrl = getShareUrl();\n if (!shareUrl) {\n // Never email a link we can't build — a broken URL in someone's inbox is\n // the worst dead end we can ship.\n toast({\n title: \"No shareable link for this item yet\",\n description: `\"${getResourceTypeLabel(resourceType)}\" has no page to open. Sharing access still works; only the emailed link is unavailable.`,\n variant: \"destructive\",\n });\n return;\n }\n setEmailingLink(true);\n try {\n const data = await sendShareNotice(\"/sharing/email-link\", {\n resourceType: getResourceTypeLabel(resourceType),\n resourceName,\n shareUrl,\n // object-org-exempt: the saved-link notice is filed with the shared object, else where the person works\n organizationId: organizationId ?? getActiveOrgId(), // org-filter: write-target for the person's own saved-link notice\n });\n\n if (data.success) {\n setEmailSent(true);\n toast({\n title: \"Email sent\",\n description: \"Link has been emailed to you\",\n });\n setTimeout(() => setEmailSent(false), 3000);\n } else {\n toast({\n title: \"Failed to send email\",\n description: data.msg || \"Please try again\",\n variant: \"destructive\",\n });\n }\n } catch (error) {\n toast({\n title: \"Error\",\n description: \"Failed to send email\",\n variant: \"destructive\",\n });\n } finally {\n setEmailingLink(false);\n }\n };\n\n // Ownership is resolved HERE, not trusted from a prop. Callers that pass a\n // defaulted/stale `false` used to silently produce a dialog with no controls.\n const {\n isOwner: resolvedIsOwner,\n loading: ownerLoading,\n error: ownerError,\n } = useIsOwner(resourceType, resourceId);\n\n const hasOverride = typeof isOwnerOverride === \"boolean\";\n const isOwner = hasOverride ? isOwnerOverride : resolvedIsOwner;\n const resolvingOwner = !hasOverride && ownerLoading;\n\n // The alchemy capture (lane ALCHEMY-BUTTON): while open, the dialog IS what the person sees.\n usePageCapture(\n () =>\n dialogCapture({\n title: `Share ${resourceName ?? resourceType}`,\n route: typeof window !== \"undefined\" ? window.location.pathname : \"\",\n dialog: \"Share\",\n subject: { id: resourceId, name: resourceName ?? null },\n selection: {\n \"Resource type\": resourceType,\n Organization: { id: organizationId ?? null, name: null },\n Tab: activeTab,\n \"Outside sharing offered\": outsideShare ? \"yes\" : \"no\",\n },\n errors: [ownerError ? `Ownership could not be read: ${String(ownerError)}` : null],\n sections: [\n {\n id: \"share-state\",\n title: \"Share dialog state\",\n role: \"data\",\n value: {\n is_owner: isOwner,\n resolving_owner: resolvingOwner,\n outside_pending_invitations: outsidePending,\n share_link: getResourceSharePath(resourceType, resourceId),\n outside_share: outsideShare ?? null,\n },\n },\n ],\n }),\n { enabled: isOpen },\n );\n // ONE-LADDER: Edit may share inside the organization, so the dialog opens for anyone the doors would\n // let give at least one level, and offers only those levels (iam.may_grant_as, via the thin door).\n const grantable = useGrantableLevels(resourceType, resourceId, isOpen);\n const canShare = isOwner || grantable.maySharePeople;\n const ownerUnknown = !hasOverride && !ownerLoading && ownerError !== null;\n\n // A resource type missing from the registry can never share — say so loudly\n // rather than rendering a dialog whose every control silently no-ops.\n const registryEntry = resourceType\n ? getShareableResource(resourceType)\n : undefined;\n const configError = !resourceId\n ? \"No resource id was supplied to the share dialog.\"\n : !registryEntry\n ? `\"${resourceType}\" is not a registered shareable resource. Add it to shareable_resource_registry.`\n : null;\n\n const {\n permissions,\n isPublic: resourceIsPublic,\n shownTo,\n childRecord,\n setShownTo,\n organizationDefault,\n whoCanSee,\n setWhoCanSee,\n loading,\n error,\n shareWithUser,\n makePublic,\n revokeAccess,\n updateLevel,\n refresh,\n homeOrganizationId,\n } = useSharing(\n resourceType,\n resourceId,\n isOpen && !configError,\n resourceName,\n // The object's organization, as the page that opened this resolved it — the share's\n // notification is filed there and never asks which workspace this is for.\n organizationId ?? null,\n );\n\n const contactsOrganizationId = organizationId ?? homeOrganizationId ?? undefined;\n\n // Filter permissions by type for each tab\n const userPermissions = permissions.filter((p) => p.grantedToUserId);\n const publicPermission = permissions.find((p) => p.isPublic);\n\n const resourceLabel = resourceNoun ?? getResourceTypeLabel(resourceType);\n\n /**\n * Shown instead of the grant forms when the caller cannot manage sharing.\n * An empty area with no explanation reads as a broken dialog — say WHY.\n */\n const manageBlockedNotice = ownerUnknown ? (\n <div className=\"p-3 rounded-lg border border-destructive/20 bg-destructive/10 flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-destructive\">\n Couldn't confirm whether you may change sharing on this{\" \"}\n {resourceLabel.toLowerCase()}\n </p>\n <p className=\"text-xs text-destructive/80 mt-0.5\">{ownerError} <ShareErrorAlchemyMenu error={ownerError} /></p>\n </div>\n </div>\n ) : (\n <div className=\"p-3 rounded-lg border bg-muted/30 flex items-start gap-2\">\n <Lock className=\"h-4 w-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium\">\n You need Full access on this {resourceLabel.toLowerCase()} to change who can see it\n </p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Deciding who else may is what Full access means (View < Comment <\n Edit < Full access). Ask whoever has it, or an owner of the organization. The Access\n tab still shows you everyone who can reach this and why.\n </p>\n </div>\n </div>\n );\n\n // The add form is for anyone who may give at least one level; below that the door's own sentence says why.\n const shareBlockedNotice = grantable.loading ? null : (\n <div className=\"p-3 rounded-lg border bg-muted/30 flex items-start gap-2\">\n <Lock className=\"h-4 w-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <p className=\"text-sm\">\n {grantable.error ?? grantable.levels.viewer ?? \"You need Edit or Full access on this to share it.\"}\n </p>\n </div>\n );\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent ref={keepFocusInside} className=\"max-w-2xl max-h-[90dvh] flex flex-col\">\n <DialogHeader className=\"flex-shrink-0\">\n <div className=\"flex items-start justify-between gap-2 pr-10\">\n <div className=\"flex-1 min-w-0\">\n <DialogTitle className=\"flex items-center gap-1.5\">\n Share {resourceLabel}\n <PageCaptureButton size=\"xs\" />\n </DialogTitle>\n {/* THE DOOR LAW: the most-reused share surface in the app named\n the record and gave no way to reach it — while already\n computing its canonical path for the share URL. `ResourceType`\n IS the entity-token vocabulary (getResourceSharePath resolves\n through resolveEntityDoors), so EntityRef also gets the peek\n and the new tab. A null path falls through to `undefined`,\n which defers to the registry and correctly ends in no door for\n a type that genuinely has no route. */}\n <DialogDescription asChild>\n <div className=\"text-sm text-muted-foreground\">\n <ShareEntityRef\n token={resourceType}\n id={resourceId}\n name={resourceName}\n href={\n getResourceSharePath(resourceType, resourceId) ??\n undefined\n }\n showIcon={false}\n />\n </div>\n </DialogDescription>\n </div>\n <Button\n icon={emailingLink ? (\n <Loader2 className=\"animate-spin\" />\n ) : emailSent ? (\n <CheckCircle className=\"text-green-500\" />\n ) : (\n <Mail />\n )}\n variant=\"outline\"\n onClick={handleEmailLink}\n disabled={emailingLink}\n className=\"flex-shrink-0\"\n >\n <span className=\"ml-1.5 hidden sm:inline\">\n {emailSent ? \"Sent!\" : \"Email link\"}\n </span>\n </Button>\n </div>\n </DialogHeader>\n\n {/* Misconfigured call site — never render dead controls. */}\n {configError && (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-2 py-10 px-6 text-center\">\n <AlertTriangle className=\"h-8 w-8 text-destructive\" />\n <p className=\"text-sm font-medium\">Sharing is unavailable</p>\n <p className=\"text-xs text-muted-foreground max-w-sm\">\n {configError}\n <ShareErrorAlchemyMenu error={configError} />\n </p>\n </div>\n )}\n\n {/* Resolving ownership — show a skeleton, never the non-owner view. */}\n {!configError && resolvingOwner && (\n <div className=\"flex-1 space-y-3 py-4\" aria-busy=\"true\">\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-24 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n )}\n\n {!configError && !resolvingOwner && (\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as typeof activeTab)}\n className=\"flex-1 flex flex-col min-h-0\"\n >\n {/* phone-ok: labels are hidden below sm, icon-only tabs on phone */}\n <TabsList fill className=\"flex-shrink-0\">\n <ShareTabsTrigger value=\"users\">\n <Users className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Users</span>\n {userPermissions.length > 0 && (\n <span className=\"ml-1 px-1.5 py-0.5 text-xs bg-primary/10 rounded-full\">\n {userPermissions.length}\n </span>\n )}\n </ShareTabsTrigger>\n <ShareTabsTrigger value=\"public\">\n <Globe className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Anyone link</span>\n {publicPermission && (\n <span className=\"ml-1 px-1.5 py-0.5 text-xs bg-green-500/10 rounded-full\">\n •\n </span>\n )}\n </ShareTabsTrigger>\n {/* SECURE LINK — CODE REQUIRED (access ladder, secure delivery): the\n third way to share, for anything that must not travel in a plain\n link — a single-use link on one channel, a code on the other. */}\n <ShareTabsTrigger value=\"secure\">\n <ShieldCheck className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Secure link</span>\n </ShareTabsTrigger>\n {/* WHO CAN SEE THIS, AND WHY. The three tabs above list the GRANTS\n this dialog writes; they are only one of the six ways access is\n actually conferred. `AccessSummaryPanel` is the canonical\n answer — owner, grant, organization default, and the container\n that carries it — and it belongs beside the controls that\n change them rather than on some other screen. */}\n <ShareTabsTrigger value=\"access\">\n <KeyRound className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Access</span>\n </ShareTabsTrigger>\n </TabsList>\n\n <div className=\"dialog-scroll-clear-floating flex-1 mt-3 min-h-0 overflow-y-auto\">\n <TabsContent value=\"users\" className=\"mt-0 space-y-3\">\n {/* WHO CAN SEE THIS (SHARE-LANE-CONTROL): the lane, above the people it limits. */}\n <WhoCanSeeThis\n whoCanSee={whoCanSee}\n canChange={canShare}\n onChoose={setWhoCanSee}\n row={{\n resourceType,\n resourceId,\n shownTo,\n isPublic: resourceIsPublic,\n childRecord,\n // A whole Table is a `record` too and is never published to the web (no page\n // of its own; only its rows have one): no switch is drawn for it.\n ...(resourceType === \"record\" && resourceNoun === \"Table\"\n ? { publishable: false }\n : {}),\n onSetShownTo: setShownTo,\n onPublish: () => makePublic(),\n onStopPublishing: () => revokeAccess({ isPublic: true }),\n }}\n />\n {/* Current user permissions */}\n <div>\n <h3 className=\"text-sm font-medium mb-2\">Current Access</h3>\n {/* Only the owner (and Admins) can read the grant list: an empty list in any\n other seat — an editor who may share included — is \"cannot see\", never\n \"Not shared with anyone\" (that seat itself holds a grant). */}\n {!isOwner && !loading && userPermissions.length === 0 ? (\n <p className=\"rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n The list of people with access is visible to the owner and Admins.\n </p>\n ) : (\n <PermissionsList\n permissions={userPermissions}\n isOwner={isOwner}\n onUpdateLevel={updateLevel}\n onRevoke={revokeAccess}\n loading={loading}\n // The outside panel at the bottom of this same tab draws\n // invited-but-not-joined rows; without this the empty state\n // above them read \"Not shared with anyone\" (FIX-10C F13).\n alsoPending={{\n count: outsidePending,\n one: \"person outside this organization\",\n many: \"people outside this organization\",\n }}\n />\n )}\n <OrgAvailabilityNote\n permissions={permissions.filter(\n (p) => p.grantedToOrganizationId,\n )}\n organizationDefault={organizationDefault}\n />\n </div>\n\n {/* Add user form */}\n {canShare ? (\n <ShareWithUserTab\n levelWording={levelWording}\n grantable={grantable}\n onShare={shareWithUser}\n onSuccess={refresh}\n resourceType={resourceType}\n resourceId={resourceId}\n // The people offered are the THING'S organization: the opener's answer, else the\n // row's own (never every organization the viewer is in — that sweep read one\n // roster per membership, one after another, and never finished for a member\n // of sixty organizations; PB-07, 2026-10-01).\n {...(contactsOrganizationId ? { organizationId: contactsOrganizationId } : {})}\n alreadySharedUserIds={userPermissions\n .map((p) => p.grantedToUserId)\n .filter((id): id is string => !!id)}\n // A custom TABLE: a listed member may sit outside the table's own\n // organization, so each one goes through the outside door, which grants an\n // existing account outright whether inside or out.\n {...(outsideShare\n ? {\n grantEveryonePerson: async (person, level) => {\n try {\n const answer = await shareWithOutsidePerson(\n outsideShare.organizationId,\n outsideShare.tableId,\n person.email,\n level,\n );\n return answer.granted\n ? { success: true, message: answer.say }\n : {\n success: false,\n error:\n answer.say ||\n \"Invited, not yet given access\",\n };\n } catch (err: unknown) {\n return {\n success: false,\n error:\n err instanceof Error\n ? err.message\n : \"Not shared\",\n };\n }\n },\n }\n : {})}\n />\n ) : (\n shareBlockedNotice\n )}\n\n {/* THE ROUTE FROM THE REFUSAL TO THE REMEDY (lane SHARE-OUT).\n The people picker above offers this organization's members\n and nobody else, and the store refuses an outsider by name.\n This is where that refusal now leads: one section, drawn only\n for a table in the record store, showing exactly the controls\n the store says this person may use. It is shown to non-owners\n too — the panel itself says who can invite, which is more use\n than hiding the fact that the capability exists. */}\n {outsideShare ? (\n <OutsideSharePanel\n organizationId={outsideShare.organizationId}\n tableId={outsideShare.tableId}\n tableName={resourceName}\n onPendingChange={setOutsidePending}\n onGranted={refresh}\n />\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"access\" className=\"mt-0\">\n <AccessSummaryPanel\n entityType={resourceType as Parameters<typeof AccessSummaryPanel>[0][\"entityType\"]}\n entityId={resourceId}\n enabled={activeTab === \"access\"}\n refreshToken={permissions\n .map((p) => `${p.id}:${p.permissionLevel}`)\n .join(\"|\")}\n />\n {resourceType === \"record\" && isOwner ? <WhoCouldSeeOn recordId={resourceId} /> : null}\n </TabsContent>\n\n <TabsContent value=\"secure\" className=\"mt-0\">\n {isOwner ? (\n <SecureLinkPanel\n resourceType={resourceType}\n resourceId={resourceId}\n resourceName={resourceName}\n />\n ) : (\n manageBlockedNotice\n )}\n </TabsContent>\n\n <TabsContent value=\"public\" className=\"mt-0\">\n <PublicAccessTab\n publicPermission={publicPermission}\n isOwner={isOwner}\n resourceType={resourceType}\n resourceId={resourceId}\n resourceName={resourceName}\n />\n </TabsContent>\n </div>\n </Tabs>\n )}\n\n {error && (\n <div className=\"mt-3 p-2.5 bg-destructive/10 border border-destructive/20 rounded-md flex-shrink-0\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <ShareErrorAlchemyMenu error={error} />\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the Dialog implementation lives in\n * `@ai-matrx/design-system`, which is where every hardening this file used to\n * carry now lives, verbatim and tested:\n *\n * - the root renders unconditionally (no hydration mount gate);\n * - the desktop card is clamped to `85dvh` and scrolls inside itself, and\n * `DialogFooter` is sticky, so the primary action is always pressable;\n * - on mobile the SAME dialog becomes a bottom sheet, with the sheet geometry\n * re-asserted after the caller's className;\n * - an untitled dialog gets a visually-hidden title instead of a warning, and\n * `aria-describedby` is dropped rather than pointing at nothing;\n * - `DialogContent` provides the portal container to its own children, so a\n * popover or menu opened inside stays in the scroll shard.\n *\n * The popout wiring this file used to do by hand is now the package's\n * `PortalContainerProvider` seam, fed by summon's `PopoutShell`\n * (`@ai-matrx/summon/window`). `useDialogContainer` still resolves here for\n * `hooks/use-nested-portal-container.ts`.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n useDialogContainer,\n} from \"@ai-matrx/design-system\";\nexport type { DialogContentProps } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * The share sheet's tab trigger: the design-system controls trigger plus ONE\n * behavior the primitive lacks — a tab activates on `click`, not only on\n * `mousedown` (2026-09-12).\n *\n * Radix's `TabsTrigger` selects from `mousedown`, `focus` (automatic\n * activation) and Enter/Space. A bare `click` with no mouse sequence in front\n * of it (script or extension `element.click()`, a screen reader's \"perform\n * default action\", a driver that synthesises a click) does nothing: the\n * trigger reports `aria-selected=\"false\"` and swallows the activation. The\n * fix uses the primitive's own path: a click focuses the tab, as a real\n * browser click already does, and automatic activation then selects it. Under\n * a real mouse this is a no-op; under `activationMode=\"manual\"` selection\n * stays with Enter/Space.\n */\n\nimport * as React from \"react\";\nimport { TabsTrigger } from \"@ai-matrx/design-system/controls\";\n\ntype TriggerProps = React.ComponentPropsWithoutRef<typeof TabsTrigger>;\n\nfunction focusOnClick(onClick: TriggerProps[\"onClick\"]): TriggerProps[\"onClick\"] {\n return (event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const trigger = event.currentTarget;\n if (trigger.disabled) return;\n if (document.activeElement !== trigger) trigger.focus();\n };\n}\n\nexport const ShareTabsTrigger = React.forwardRef<React.ElementRef<typeof TabsTrigger>, TriggerProps>(\n ({ onClick, ...props }, ref) => <TabsTrigger {...props} ref={ref} onClick={focusOnClick(onClick)} />,\n);\nShareTabsTrigger.displayName = \"ShareTabsTrigger\";\n","/**\n * Permission Hooks\n *\n * React hooks for working with permissions in components.\n * These hooks provide reactive state management for permissions.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport { useAppSelector, useAppStore } from \"./sheet/host\";\nimport {\n selectSharingAuthority,\n selectSharingStatus,\n sharingAuthorityRequested,\n sharingAuthorityResolved,\n sharingStatusFailed,\n sharingStatusKey,\n sharingStatusLoaded,\n sharingStatusRequested,\n} from \"./sheet/host\";\nimport {\n Permission,\n PermissionWithDetails,\n ResourceType,\n PermissionLevel,\n CheckPermissionOptions,\n ShareActionResult,\n PermissionCheckResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n listPermissions,\n getResourcePermissions,\n checkPermission,\n resolveResourceOwnership,\n resolveSharingAuthority,\n shareWithUser,\n makePublic,\n revokeAccess,\n revokeOrgAccess,\n updatePermissionLevel,\n getSharedWithMe,\n getResourceVisibility,\n setResourceShownTo,\n setStoreLane,\n type LaneChoice,\n type ResourceVisibility,\n type WhoCanSee,\n} from \"@ai-matrx/sharing/core\";\nimport type { ShownTo } from \"@ai-matrx/sharing/core\";\n\n// ============================================================================\n// Permission Listing Hooks\n// ============================================================================\n\n/**\n * Hook to get all permissions for a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Permissions, loading state, and refresh function\n */\nexport function usePermissions(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n) {\n const [permissions, setPermissions] = useState<PermissionWithDetails[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPermissions = useCallback(async () => {\n if (!resourceType || !resourceId || !enabled) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const data = await listPermissions(resourceType, resourceId);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching permissions:\", err);\n setError(extractErrorMessage(err) || \"Failed to fetch permissions\");\n } finally {\n setLoading(false);\n }\n }, [resourceType, resourceId, enabled]);\n\n useEffect(() => {\n if (enabled) {\n fetchPermissions();\n }\n }, [fetchPermissions, enabled]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchPermissions,\n };\n}\n\n/**\n * Hook to get permissions with user/org details\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Permissions with details, loading state, and refresh function\n */\nexport function useResourcePermissions(\n resourceType: ResourceType,\n resourceId: string,\n) {\n const [permissions, setPermissions] = useState<PermissionWithDetails[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPermissions = useCallback(async () => {\n if (!resourceType || !resourceId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const data = await getResourcePermissions(resourceType, resourceId);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching resource permissions:\", err);\n setError(\n extractErrorMessage(err) || \"Failed to fetch resource permissions\",\n );\n } finally {\n setLoading(false);\n }\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n fetchPermissions();\n }, [fetchPermissions]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchPermissions,\n };\n}\n\n// ============================================================================\n// Permission Check Hooks\n// ============================================================================\n\n/**\n * Hook to check if current user has permission for a resource\n * @param options Check options\n * @returns Permission check result and loading state\n */\nexport function usePermissionCheck(options: CheckPermissionOptions) {\n const [result, setResult] = useState<PermissionCheckResult>({\n hasAccess: false,\n isOwner: false,\n });\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const check = async () => {\n setLoading(true);\n const checkResult = await checkPermission(options);\n setResult(checkResult);\n setLoading(false);\n };\n\n if (options.resourceType && options.resourceId) {\n check();\n }\n }, [options.resourceType, options.resourceId, options.requiredLevel]);\n\n return {\n ...result,\n loading,\n };\n}\n\n/**\n * Hook to check if current user can edit a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Whether user can edit and loading state\n */\nexport function useCanEdit(resourceType: ResourceType, resourceId: string) {\n const { hasAccess, loading } = usePermissionCheck({\n resourceType,\n resourceId,\n requiredLevel: \"editor\",\n });\n\n return {\n canEdit: hasAccess,\n loading,\n };\n}\n\n/**\n * Hook to check if current user can delete/admin a resource\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Whether user has admin access and loading state\n */\nexport function useCanAdmin(resourceType: ResourceType, resourceId: string) {\n const { hasAccess, loading } = usePermissionCheck({\n resourceType,\n resourceId,\n requiredLevel: \"admin\",\n });\n\n return {\n canAdmin: hasAccess,\n loading,\n };\n}\n\n/**\n * Hook to check whether the current user MAY DECIDE WHO ELSE SEES a resource.\n *\n * It kept its name because every call site means \"may this person manage\n * sharing?\" and none of them meant \"did this person create the row\". Since\n * 2026-09-19 (lane SHARE) it asks the database's own `may_manage_sharing`\n * predicate — the Owner rung OR the `admin` rung of VIS-17's one ladder, the\n * same question the six sharing RPCs enforce — instead of reading `created_by`\n * from the resource table. Before that an `admin` on a thing was shown a\n * read-only dialog and an empty grant list, and any resource whose table\n * carries no client SELECT grant (the whole record store) could not be asked at\n * all.\n *\n * Returns three distinct states — `loading` (still resolving), `error`\n * (could NOT be determined), and `isOwner` — because collapsing them into one\n * boolean is what makes owner-gated UI render as if the user were a stranger\n * to their own record. Never gate a surface on `!isOwner` alone; check\n * `loading` and `error` first.\n *\n * @param resourceType Resource type\n * @param resourceId Resource ID\n */\nexport function useIsOwner(resourceType: ResourceType, resourceId: string) {\n const store = useAppStore();\n const key = sharingStatusKey(resourceType, resourceId);\n const entry = useAppSelector((state) => selectSharingAuthority(state, key));\n const asked = Boolean(resourceType && resourceId);\n\n // Asked once per record per tab: a mount (a woken or remounted share\n // control) reads the answer from the store; only a record nobody in this tab\n // has asked about yet reaches the database.\n const known = entry !== undefined;\n useEffect(() => {\n if (known || !asked) return;\n // Another control of the same record may have asked a moment ago.\n if (selectSharingAuthority(store.getState(), key)) return;\n store.dispatch(sharingAuthorityRequested({ key }));\n void resolveSharingAuthority(resourceType, resourceId).then((result) => {\n store.dispatch(sharingAuthorityResolved({ key, isOwner: result.isOwner, error: result.error }));\n });\n }, [known, asked, key]);\n\n if (!asked) return { isOwner: false, loading: false, error: null };\n return {\n isOwner: entry?.isOwner ?? false,\n loading: entry ? entry.loading : true,\n error: entry?.error ?? null,\n };\n}\n\n// ============================================================================\n// Sharing Action Hooks\n// ============================================================================\n\n/**\n * Hook for sharing operations\n * Provides functions to share, revoke, and update permissions\n * @param resourceType Resource type\n * @param resourceId Resource ID\n * @returns Sharing functions and state\n */\nexport function useSharing(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n resourceName?: string | undefined,\n /**\n * The organization the object lives in, from the page that opened the dialog (its own\n * resolver). Carried to the share's in-app notification so no action on an object ever asks\n * which workspace it is for (ACCESS-FIX-18).\n */\n organizationId?: string | null | undefined,\n) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [rowState, setRowState] = useState<ResourceVisibility>({\n isPublic: false,\n });\n const { permissions, refresh: refreshPermissions } = usePermissions(\n resourceType,\n resourceId,\n enabled,\n );\n\n const refreshRowState = useCallback(async () => {\n if (!resourceType || !resourceId || !enabled) return;\n try {\n const v = await getResourceVisibility(resourceType, resourceId);\n setRowState(v);\n } catch (err) {\n console.error(\"Error fetching the record's row controls:\", err);\n setError(extractErrorMessage(err));\n }\n }, [resourceType, resourceId, enabled]);\n\n const refresh = useCallback(async () => {\n await Promise.all([refreshPermissions(), refreshRowState()]);\n }, [refreshPermissions, refreshRowState]);\n\n useEffect(() => {\n if (enabled) {\n void refreshRowState();\n }\n }, [enabled, refreshRowState]);\n\n const handleShareWithUser = useCallback(\n async (userId: string, permissionLevel: PermissionLevel) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await shareWithUser({\n resourceType,\n resourceId,\n userId,\n permissionLevel,\n resourceName,\n organizationId: organizationId ?? null,\n });\n\n if (!result.success) {\n setError(result.error || \"Failed to share\");\n return result;\n }\n\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to share with user\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, resourceName, organizationId, refresh],\n );\n\n const handleMakePublic = useCallback(\n async (permissionLevel: PermissionLevel = \"viewer\") => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await makePublic({\n resourceType,\n resourceId,\n permissionLevel,\n });\n\n if (!result.success) {\n setError(result.error || \"Failed to make public\");\n return result;\n }\n\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to make public\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleRevokeAccess = useCallback(\n async (options: {\n userId?: string | undefined;\n organizationId?: string | undefined;\n isPublic?: boolean | undefined;\n }) => {\n setLoading(true);\n setError(null);\n try {\n const result = await revokeAccess({\n resourceType,\n resourceId,\n ...options,\n });\n if (!result.success) {\n setError(result.error || \"Failed to revoke access\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to revoke access\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleRevokeOrgAccess = useCallback(\n async (organizationId: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = await revokeOrgAccess(\n resourceType,\n resourceId,\n organizationId,\n );\n if (!result.success) {\n setError(result.error || \"Failed to revoke org access\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to revoke org access\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n const handleUpdateLevel = useCallback(\n async (\n options: { userId?: string | undefined; organizationId?: string | undefined },\n newLevel: PermissionLevel,\n ) => {\n setLoading(true);\n setError(null);\n try {\n const result = await updatePermissionLevel({\n resourceType,\n resourceId,\n ...options,\n newLevel,\n });\n if (!result.success) {\n setError(result.error || \"Failed to update permission\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to update permission\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n /** \"Shown to\" — which lists show it; never a lock (access ladder Words table). */\n const handleSetShownTo = useCallback(\n async (next: ShownTo | null) => {\n setLoading(true);\n setError(null);\n try {\n const result = await setResourceShownTo(resourceType, resourceId, next);\n if (!result.success) {\n setError(result.error || 'Could not change \"Shown to\"');\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || 'Could not change \"Shown to\"';\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [resourceType, resourceId, refresh],\n );\n\n /**\n * WHO CAN SEE THIS (lane SHARE-LANE-CONTROL) — the record store's lane door only. Every other\n * kind: null, and the control is absent; its row controls are \"Shown to\" and \"Published to the\n * web\" instead.\n */\n const whoCanSee: WhoCanSee | null = rowState.whoCanSee\n ? {\n ...rowState.whoCanSee,\n organizationId: rowState.whoCanSee.organizationId ?? organizationId ?? null,\n }\n : null;\n\n const handleSetWhoCanSee = useCallback(\n async (choice: LaneChoice): Promise<ShareActionResult> => {\n if (!whoCanSee) {\n return { success: false, error: \"This item has no lane to choose.\" };\n }\n if (!whoCanSee.organizationId) {\n return {\n success: false,\n error: \"This item's organization could not be read, so its lane cannot be changed.\",\n };\n }\n setLoading(true);\n setError(null);\n try {\n const result = await setStoreLane(whoCanSee.organizationId, resourceId, choice);\n if (!result.success) {\n setError(result.error || \"Failed to change who can see this\");\n return result;\n }\n await refresh();\n return result;\n } catch (err) {\n const errorMessage =\n extractErrorMessage(err) || \"Failed to change who can see this\";\n setError(errorMessage);\n return { success: false, error: errorMessage };\n } finally {\n setLoading(false);\n }\n },\n [whoCanSee, resourceId, refresh],\n );\n\n return {\n permissions,\n /** Published to the web (or the card's own publish). */\n isPublic: rowState.isPublic,\n /**\n * \"Shown to\" — undefined when the type does not carry it (Private, Confidential, child, or a\n * table without the column); null when the type's default applies.\n */\n shownTo: rowState.shownTo,\n /** A child record (a file attached to a chat): no row control of its own. */\n childRecord: rowState.childRecord === true,\n /** Membership alone reaches it — said under Current Access. The record store's door names it. */\n organizationDefault: rowState.organizationDefault ?? null,\n whoCanSee,\n /** The thing's own organization, read off its row; null when unknown. */\n homeOrganizationId: rowState.homeOrganizationId ?? null,\n setWhoCanSee: handleSetWhoCanSee,\n loading,\n error,\n shareWithUser: handleShareWithUser,\n makePublic: handleMakePublic,\n setShownTo: handleSetShownTo,\n revokeAccess: handleRevokeAccess,\n revokeOrgAccess: handleRevokeOrgAccess,\n updateLevel: handleUpdateLevel,\n refresh,\n refreshRowState,\n };\n}\n\n// ============================================================================\n// Shared Resources Hook\n// ============================================================================\n\n/**\n * Hook to get resources shared with current user\n * @param resourceType Optional filter by resource type\n * @returns Shared permissions and loading state\n */\nexport function useSharedWithMe(resourceType?: ResourceType | undefined) {\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchShared = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await getSharedWithMe(resourceType);\n setPermissions(data);\n } catch (err) {\n console.error(\"Error fetching shared resources:\", err);\n setError(extractErrorMessage(err) || \"Failed to fetch shared resources\");\n } finally {\n setLoading(false);\n }\n }, [resourceType]);\n\n useEffect(() => {\n fetchShared();\n }, [fetchShared]);\n\n return {\n permissions,\n loading,\n error,\n refresh: fetchShared,\n };\n}\n\n// ============================================================================\n// Utility Hooks\n// ============================================================================\n\n/**\n * Hook to get sharing status summary for a resource.\n *\n * Intentionally lightweight — only fetches is_public from the resource row.\n * Safe to call from list-item components like ShareButton (single cheap query).\n *\n * Does NOT call get_resource_permissions (the expensive SECURITY DEFINER RPC).\n * Full permission details are loaded inside useSharing() when the modal opens.\n */\nexport function useSharingStatus(\n resourceType: ResourceType,\n resourceId: string,\n enabled: boolean = true,\n) {\n const store = useAppStore();\n const key = sharingStatusKey(resourceType, resourceId);\n const entry = useAppSelector((state) => selectSharingStatus(state, key));\n\n // Read the record's visibility (once per record per tab, or on purpose).\n const refresh = async () => {\n if (!resourceType || !resourceId || !enabled) return;\n store.dispatch(sharingStatusRequested({ key }));\n try {\n const v = await getResourceVisibility(resourceType, resourceId);\n store.dispatch(sharingStatusLoaded({ key, visibility: v }));\n } catch (err) {\n console.error(\"Error fetching sharing status:\", err);\n store.dispatch(sharingStatusFailed({ key, error: extractErrorMessage(err) }));\n }\n };\n\n // A mount reads the record's answer from the store; only a record nobody in\n // this tab has read yet is fetched (a woken / remounted view reads nothing).\n const known = entry !== undefined;\n useEffect(() => {\n if (known || !resourceType || !resourceId || !enabled) return;\n // Another view of the same record may have asked a moment ago.\n if (selectSharingStatus(store.getState(), key)) return;\n void refresh();\n // `refresh` is rebuilt per render; the key and the gate decide.\n }, [known, key, enabled]);\n\n return {\n isPublic: entry?.visibility?.isPublic ?? false,\n loading: entry ? entry.loading : enabled,\n error: entry?.error ?? null,\n refresh,\n };\n}\n","\"use client\";\n\n/**\n * features/sharing/hooks/useGrantableLevels.ts\n *\n * WHICH LEVELS THIS PERSON MAY GIVE ON THIS THING - asked of the database, never assumed.\n *\n * ONE-LADDER (Arman 2026-10-10): every share door asks `iam.may_grant_as`. This hook asks the\n * thin door over it (`iam.my_grantable_levels`) so the share dialog can offer exactly what the\n * doors will accept: a level maps to `null` (you may) or the sentence that says why not, and\n * `outside` is the same answer for somebody outside the organization. The screen holds no rule of\n * its own - it cannot disagree with the doors.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { createClient } from \"@ai-matrx/sharing/core\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\n\nexport type GrantableLevels = {\n loading: boolean;\n /** Could not be asked (a failure is not a refusal). */\n error: string | null;\n /** level -> null when allowed, else the reason. Absent while loading or on error. */\n levels: Partial<Record<PermissionLevel, string | null>>;\n /** May share outside the organization: null when allowed, else the reason. */\n outside: string | null;\n /** True when at least one level may be given - i.e. the person may share at all. */\n maySharePeople: boolean;\n};\n\nconst NOTHING: GrantableLevels = { loading: true, error: null, levels: {}, outside: null, maySharePeople: false };\n\ntype Answer = { levels?: Record<string, string | null>; outside?: string | null | undefined };\n\nexport function useGrantableLevels(resourceType: string, resourceId: string, enabled: boolean, refreshKey?: string | undefined): GrantableLevels {\n const [state, setState] = useState<GrantableLevels>(NOTHING);\n useEffect(() => {\n if (!enabled || !resourceType || !resourceId) return;\n let cancelled = false;\n const supabase = createClient();\n // The door is newer than the generated database types.\n const iam = supabase.schema(\"iam\") as unknown as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ data: unknown; error: { message: string } | null }>;\n };\n void iam\n .rpc(\"my_grantable_levels\", { p_resource_type: resourceType, p_resource_id: resourceId })\n .then(({ data, error }) => {\n if (cancelled) return;\n if (error) {\n setState({ ...NOTHING, loading: false, error: error.message });\n return;\n }\n const a = (data ?? {}) as Answer;\n const levels = (a.levels ?? {}) as Partial<Record<PermissionLevel, string | null>>;\n setState({\n loading: false,\n error: null,\n levels,\n outside: a.outside ?? null,\n maySharePeople: Object.values(levels).some((why) => why === null),\n });\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, resourceType, resourceId, refreshKey]);\n return state;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Card } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { ShareEntityDoorControls } from \"./host\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { X, Mail, Building2, Globe, Loader2, Lock } from \"lucide-react\";\nimport { GuestBadge, PermissionBadge, PublicBadge } from \"./PermissionBadge\";\nimport { UserAvatarDisplay } from \"./host\";\nimport { CopyButtons } from \"./host\";\nimport { csvExportItem, jsonExportItem } from \"./host\";\nimport {\n accessKpis,\n granteeKind,\n granteeLabel,\n granteeSecondaryLabel,\n grantCsvRows,\n grantLevelLabel,\n humanGrantList,\n humanGrantRow,\n sharingLocation,\n GRANT_LIST_SCOPE_NOTE,\n NO_GRANTS_DETAIL,\n NO_GRANTS_HEADLINE,\n NO_GRANTS_YET_HEADLINE,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport type {\n PermissionWithDetails,\n PermissionLevel,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n PERMISSION_LEVEL_HINTS,\n PERMISSION_LEVEL_SHORT_LABELS,\n} from \"@ai-matrx/sharing/core\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\n\ninterface PermissionsListProps {\n permissions: PermissionWithDetails[];\n isOwner: boolean;\n onUpdateLevel: (\n options: { userId?: string | undefined; organizationId?: string | undefined; isPublic?: boolean | undefined },\n newLevel: PermissionLevel,\n ) => Promise<ShareActionResult>;\n onRevoke: (options: {\n userId?: string | undefined;\n organizationId?: string | undefined;\n isPublic?: boolean | undefined;\n }) => Promise<ShareActionResult>;\n loading?: boolean | undefined;\n /**\n * Identity + the page's leading KPIs, so every copied grant states what it\n * belongs to. Optional: without it the list still copies, falling back to the\n * identity carried on the permission rows themselves — but a page that shows\n * KPIs above this list should pass them so the payloads mirror the screen.\n */\n copy?: SharingCopyContext | undefined;\n /** Which slice this list renders, e.g. \"Users\" / \"Organizations\". */\n listLabel?: string | undefined;\n /**\n * 🚨 WHAT ELSE IS ON THIS SCREEN THAT IS NOT A GRANT (FIX-10C, VERIFIER-10\n * F13, 2026-09-22).\n *\n * This list only ever knew about DIRECT grants, and said so honestly in its\n * scope note. But after an outside invitation lands, the dialog read\n * \"Current Access — Not shared with anyone — No one has been granted access\n * here\" with the invited person's row drawn directly underneath it. Both\n * halves were true and the screen contradicted itself, which is the one thing\n * a screen may not do.\n *\n * An invitation is not a grant — it confers nothing until it is accepted, and\n * making this list count it would be the same lie pointing the other way. So\n * the empty state stays an empty state and simply stops pretending it is the\n * whole screen: the caller that also draws the pending rows says how many\n * there are, and the sentence names them.\n */\n alsoPending?: { count: number; one: string; many: string } | undefined;\n}\n\n/**\n * Render-only preview size. The list itself is complete — truncating HERE\n * (never in the data) is what keeps show-all, copy, and export honest: every\n * payload and every export covers ALL grants, not the visible slice.\n */\nconst GRANT_PREVIEW = 12;\n\n/** The empty state's own box (icon, headline, detail, copy row); the first-read stand-in holds it too. */\nconst EMPTY_STATE_MIN_HEIGHT = \"min-h-[11rem]\";\n\n/**\n * What is on the screen besides the grants, in a sentence a person reads.\n *\n * The caller hands BOTH words. A plural is a word the thing already knows,\n * never an \"s\" glued onto a noun phrase — that rule cost this platform \"22 new\n * Invoicess\" once already, and \"3 person outside this organizations\" here.\n */\nfunction pendingSentence({\n count,\n one,\n many,\n}: {\n count: number;\n one: string;\n many: string;\n}): string {\n return count === 1\n ? `One ${one} is invited below and has not joined yet — they get access the moment they follow their link.`\n : `${count} ${many} are invited below and have not joined yet — each gets access the moment they follow their link.`;\n}\n\n/** Header toggle between the preview and the full grant list. */\nfunction ShowAllToggle({\n total,\n preview,\n showingAll,\n onToggle,\n}: {\n total: number;\n preview: number;\n showingAll: boolean;\n onToggle: () => void;\n}) {\n if (total <= preview) return null;\n return ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground \"\n onClick={onToggle}\n >\n {showingAll ? `top ${preview}` : `all ${total.toLocaleString()}`}\n </button>\n );\n}\n\n/**\n * PermissionsList - Display and manage current permissions\n *\n * Shows all users, organizations, and public access for a resource.\n * Allows owners to update permission levels or revoke access.\n *\n * @example\n * <PermissionsList\n * permissions={permissions}\n * isOwner={isOwner}\n * onUpdateLevel={updateLevel}\n * onRevoke={revokeAccess}\n * />\n */\nexport function PermissionsList({\n permissions,\n isOwner,\n onUpdateLevel,\n onRevoke,\n loading = false,\n copy,\n listLabel = \"Current access\",\n alsoPending,\n}: PermissionsListProps) {\n const [updatingId, setUpdatingId] = useState<string | null>(null);\n const [revokingId, setRevokingId] = useState<string | null>(null);\n const [showAll, setShowAll] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<{\n open: boolean;\n permission: PermissionWithDetails | null;\n }>({ open: false, permission: null });\n\n /**\n * The payload context. A caller that renders KPIs above this list passes\n * them; otherwise we fall back to the identity the rows themselves carry, so\n * a bare `<PermissionsList>` still copies something an agent can act on.\n */\n const context: SharingCopyContext = copy ?? {\n resourceType: permissions[0]?.resourceType ?? \"unknown\",\n resourceId: permissions[0]?.resourceId ?? \"unknown\",\n surface: listLabel,\n kpis: accessKpis({\n permissions,\n isPublic: permissions.some((p) => p.isPublic),\n // What the list actually renders — owner controls are on screen or not.\n viewerIsOwner: isOwner,\n }),\n };\n const location = sharingLocation(context.surface);\n const resourceAttributes = {\n resource_type: context.resourceType,\n resource_id: context.resourceId,\n resource_name: context.resourceName ?? null,\n };\n\n // ZERO LAYOUT SHIFT (Arman 2026-10-07; lane SHARE-DIALOG-2). Every dialog action (a \"Shown to\"\n // change, a grant, a revoke) raises `loading` while the list is re-read. This used to swap the\n // whole list for a spinner box 88px shorter than the empty state, so everything under it\n // (the add-a-person form, the organization line) jumped down and back up on every click.\n // A re-read now keeps what is on screen and only says it is busy; the stand-in below is drawn\n // only while there is nothing to keep, and it holds the empty state's own height.\n if (loading && permissions.length === 0) {\n return (\n <div\n className={`flex items-center justify-center ${EMPTY_STATE_MIN_HEIGHT}`}\n aria-busy=\"true\"\n data-grants-reserved=\"\"\n >\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (permissions.length === 0) {\n return (\n <div\n className={`group flex flex-col items-center justify-center text-center py-6 text-muted-foreground ${EMPTY_STATE_MIN_HEIGHT}`}\n data-grants-empty=\"\"\n >\n <Lock className=\"w-10 h-10 mb-1.5 opacity-20\" />\n <p className=\"text-sm\">\n {alsoPending && alsoPending.count > 0 ? NO_GRANTS_YET_HEADLINE : NO_GRANTS_HEADLINE}\n </p>\n {/*\n * This list only knows about DIRECT grants. It cannot see its table's level, publishing,\n * org membership, or access conveyed through a container — so \"only you\n * can access this\" would be a claim it has no basis for. State what is\n * actually known: no one has been granted access here.\n */}\n <p className=\"text-xs mt-0.5\">{NO_GRANTS_DETAIL}</p>\n {/* And what IS on the screen, so the headline above can never stand\n over a row that contradicts it. */}\n {alsoPending && alsoPending.count > 0 ? (\n <p className=\"text-xs mt-0.5\" data-testid=\"grants-also-pending\">\n {pendingSentence(alsoPending)}\n </p>\n ) : null}\n {/*\n * \"Nobody has been granted access\" is an ANSWER, not an absence — it is\n * usually the whole reason the user is here asking why someone can't\n * see this. It has to be copyable, and it has to carry the scope note\n * so an agent never reads it as \"nothing grants access\".\n */}\n <div className=\"mt-1.5 flex justify-center opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`${listLabel} (no grants)`}\n human={() => humanGrantList([], { surface: context.surface })}\n agent={() => ({\n kind: \"access-grants\",\n location,\n description: `The \"${listLabel}\" grant list, which is empty: ${NO_GRANTS_HEADLINE} — ${NO_GRANTS_DETAIL}.`,\n data: {\n list: listLabel,\n rendered_empty_state: {\n headline: NO_GRANTS_HEADLINE,\n detail: NO_GRANTS_DETAIL,\n },\n grants: [],\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n },\n summary: humanGrantList([], { surface: context.surface }),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n count: 0,\n },\n })}\n />\n </div>\n </div>\n );\n }\n\n const handleUpdateLevel = async (\n permission: PermissionWithDetails,\n newLevel: PermissionLevel,\n ) => {\n if (newLevel === permission.permissionLevel) return;\n\n setUpdatingId(permission.id);\n try {\n await onUpdateLevel(\n {\n userId: permission.grantedToUserId || undefined,\n organizationId: permission.grantedToOrganizationId || undefined,\n isPublic: permission.isPublic || undefined,\n },\n newLevel,\n );\n } finally {\n setUpdatingId(null);\n }\n };\n\n const handleRevoke = async (permission: PermissionWithDetails) => {\n setRevokingId(permission.id);\n try {\n await onRevoke({\n userId: permission.grantedToUserId || undefined,\n organizationId: permission.grantedToOrganizationId || undefined,\n isPublic: permission.isPublic || undefined,\n });\n } finally {\n setRevokingId(null);\n setConfirmRevoke({ open: false, permission: null });\n }\n };\n\n // The row labels come from the shared extractor, so a copied grant reads\n // exactly like the row the user is looking at.\n const getPermissionLabel = granteeLabel;\n const getPermissionSecondaryLabel = granteeSecondaryLabel;\n\n const getPermissionIcon = (permission: PermissionWithDetails) => {\n if (permission.isPublic) return Globe;\n if (permission.grantedToOrganization) return Building2;\n return Mail;\n };\n\n const visiblePermissions = showAll\n ? permissions\n : permissions.slice(0, GRANT_PREVIEW);\n\n const listHuman = () =>\n humanGrantList(permissions, {\n surface: context.surface,\n shown: visiblePermissions.length,\n });\n\n return (\n <div\n className={cn(\"space-y-1 transition-opacity\", loading && \"opacity-60\")}\n aria-busy={loading}\n data-grants-busy={loading ? \"true\" : \"false\"}\n >\n {/*\n * List-level copy + export. Both always cover ALL grants, never the\n * visible slice — the preview above is a rendering choice, and an export\n * that silently inherited it would be a lie about coverage.\n */}\n <div className=\"flex items-center justify-end gap-1\">\n <ShowAllToggle\n total={permissions.length}\n preview={GRANT_PREVIEW}\n showingAll={showAll}\n onToggle={() => setShowAll((current) => !current)}\n />\n <CopyButtons\n size=\"xs\"\n label={`${listLabel} (${permissions.length} grant${permissions.length === 1 ? \"\" : \"s\"})`}\n human={listHuman}\n json={() => permissions}\n agent={() => ({\n kind: \"access-grants\",\n location,\n description: `All ${permissions.length} direct grant(s) in the \"${listLabel}\" list. ${GRANT_LIST_SCOPE_NOTE}`,\n data: {\n list: listLabel,\n grants: permissions.map((permission) => ({\n grantee: granteeLabel(permission),\n grantee_email: granteeSecondaryLabel(permission),\n grantee_type: granteeKind(permission),\n level_shown: grantLevelLabel(permission),\n can_manage_here: isOwner,\n raw: permission,\n })),\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n rows_on_screen: visiblePermissions.length,\n rows_total: permissions.length,\n },\n summary: listHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n count: permissions.length,\n shown: visiblePermissions.length,\n },\n })}\n export={{\n items: [\n jsonExportItem(() => permissions, \"JSON (all grants)\"),\n csvExportItem(\n () => grantCsvRows(permissions),\n \"CSV (all grants)\",\n ),\n ],\n }}\n />\n </div>\n {visiblePermissions.map((permission) => {\n const Icon = getPermissionIcon(permission);\n const isUpdating = updatingId === permission.id;\n const isRevoking = revokingId === permission.id;\n\n const secondaryLabel = getPermissionSecondaryLabel(permission);\n\n return (\n // `group` is what reveals the door controls below on hover — without\n // it EntityDoorControls renders at opacity-0 and the door is\n // invisible, which is the failure this campaign has hit four times.\n <Card size=\"sm\" key={permission.id} className=\"group px-2 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Left: avatar for user grants, icon otherwise */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {permission.grantedToUser && !permission.isPublic ? (\n <UserAvatarDisplay\n user={permission.grantedToUser}\n size=\"xs\"\n className=\"flex-shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-primary/10 flex-shrink-0\">\n <Icon className=\"w-3 h-3 text-primary\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex items-center gap-1.5\">\n <p className=\"text-sm font-semibold truncate leading-none\">\n {getPermissionLabel(permission)}\n </p>\n {permission.grantedToUser?.isGuest && !permission.isPublic ? <GuestBadge /> : null}\n {/* THE DOOR LAW, applied to the ONE grantee kind that has a\n reachable route today. An org grant names a real record\n with its id right here, so it opens.\n\n The USER branch deliberately gets no door: `user` has no\n registry token, and `AdminUserRef` is the WRONG door here —\n this is a `(core)` sharing surface reached by ordinary org\n members, for whom `/administration/users` is a 403. A door\n the viewer cannot open is worse than none, because it looks\n like it worked. Tracked as the `user` registry gap in\n docs/handoffs/no-dead-ends-sweep.md. */}\n {permission.grantedToOrganization && (\n <ShareEntityDoorControls\n token=\"organization\"\n id={permission.grantedToOrganization.id}\n name={permission.grantedToOrganization.name}\n className=\"shrink-0\"\n />\n )}\n {secondaryLabel && (\n <p className=\"text-[11px] text-muted-foreground truncate leading-none\">\n {secondaryLabel}\n </p>\n )}\n </div>\n </div>\n\n {/* Right: Permission level selector and remove button */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {/* Hover-reveal so ubiquity doesn't become clutter — the same\n `group` the door controls above ride on. */}\n <span className=\"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`Grant — ${granteeLabel(permission)}`}\n human={() => humanGrantRow(permission)}\n json={() => permission}\n agent={() => ({\n kind: \"access-grant\",\n location,\n description: `One direct access grant on this resource: ${granteeLabel(\n permission,\n )} · ${grantLevelLabel(permission)}.`,\n data: {\n grantee: granteeLabel(permission),\n grantee_email: granteeSecondaryLabel(permission),\n grantee_type: granteeKind(permission),\n level_shown: grantLevelLabel(permission),\n can_manage_here: isOwner,\n raw: permission,\n scope_note: GRANT_LIST_SCOPE_NOTE,\n kpis: context.kpis,\n },\n summary: humanGrantRow(permission),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n list: listLabel,\n grant_id: permission.id,\n grantee_type: granteeKind(permission),\n level: permission.permissionLevel,\n },\n })}\n />\n </span>\n {isOwner ? (\n <>\n <Select\n value={permission.permissionLevel}\n onValueChange={(value) =>\n handleUpdateLevel(permission, value as PermissionLevel)\n }\n disabled={isUpdating || isRevoking}\n >\n {/* Widened from 90px: THE SCOPE-QUALIFIED ADMIN RULE makes the longest\n option \"Admin (this item)\", which truncates at 90px. */}\n <SelectTrigger className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"viewer\" title={PERMISSION_LEVEL_HINTS.viewer}>{PERMISSION_LEVEL_SHORT_LABELS.viewer}</SelectItem>\n {/* VIS-17b: `commenter` is the FOURTH rung of the one ladder — it has been in\n `public.permission_level` since G0 and every policy and RPC accepts it, and\n this picker was the one place a person could not choose it (lane SHARE,\n 2026-09-19). A ladder with a rung nobody can reach is not one ladder. */}\n <SelectItem value=\"commenter\" title={PERMISSION_LEVEL_HINTS.commenter}>{PERMISSION_LEVEL_SHORT_LABELS.commenter}</SelectItem>\n <SelectItem value=\"editor\" title={PERMISSION_LEVEL_HINTS.editor}>{PERMISSION_LEVEL_SHORT_LABELS.editor}</SelectItem>\n {/* THE SCOPE-QUALIFIED ADMIN RULE (access/DECISIONS.md 2026-09-10):\n this control's own heading is the grant-list label, which does not\n name the item, so the bare \"Admin\" is qualified here. */}\n <SelectItem value=\"admin\" title={PERMISSION_LEVEL_HINTS.admin}>{PERMISSION_LEVEL_SHORT_LABELS.admin}</SelectItem>\n </SelectContent>\n </Select>\n\n <Button\n icon={isRevoking ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <X />\n )}\n variant=\"quiet\"\n aria-label={`Revoke access for ${getPermissionLabel(permission)}`}\n title={`Revoke access for ${getPermissionLabel(permission)}`}\n onClick={() =>\n setConfirmRevoke({ open: true, permission })\n }\n disabled={isUpdating || isRevoking}\n />\n </>\n ) : (\n <>\n {permission.isPublic ? (\n <PublicBadge variant=\"compact\" />\n ) : (\n <PermissionBadge\n level={permission.permissionLevel}\n variant=\"compact\"\n />\n )}\n </>\n )}\n </div>\n </div>\n </Card>\n );\n })}\n\n {/* Confirmation dialog */}\n <AlertDialog\n open={confirmRevoke.open}\n onOpenChange={(open) =>\n setConfirmRevoke({ open, permission: confirmRevoke.permission })\n }\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Revoke Access?</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to revoke access for{\" \"}\n <strong>\n {confirmRevoke.permission\n ? getPermissionLabel(confirmRevoke.permission)\n : \"\"}\n </strong>\n ? They will no longer be able to access this resource.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n if (confirmRevoke.permission) {\n handleRevoke(confirmRevoke.permission);\n }\n }}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Revoke Access\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Badge } from \"@ai-matrx/design-system\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\nimport { Crown, Shield, Eye, MessageSquare, Users, Globe } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\ninterface PermissionBadgeProps {\n level: PermissionLevel | \"owner\";\n variant?: \"default\" | \"compact\" | undefined;\n showIcon?: boolean | undefined;\n}\n\n/**\n * PermissionBadge - Visual indicator for permission levels\n *\n * Displays color-coded badges for different permission levels\n * Used throughout the app to show user permissions\n *\n * @example\n * <PermissionBadge level=\"editor\" />\n * <PermissionBadge level=\"owner\" showIcon />\n */\nexport function PermissionBadge({\n level,\n variant = \"default\",\n showIcon = false,\n}: PermissionBadgeProps) {\n // Every level on the ladder appears here. The map is typed against\n // `PermissionLevel` (utils/permissions/levels.ts — THE ONE declaration), so a\n // level added there fails this file rather than reaching a viewer as\n // `undefined.label` (`commenter` did exactly that until 2026-09-18).\n const config: Record<\n PermissionLevel | \"owner\",\n { label: string; className: string; icon: LucideIcon }\n > = {\n owner: {\n label: \"Owner\",\n className:\n \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border-yellow-300\",\n icon: Crown,\n },\n admin: {\n label: \"Full access\",\n className:\n \"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200 border-red-300\",\n icon: Shield,\n },\n commenter: {\n label: \"Comment\",\n className:\n \"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200 border-purple-300\",\n icon: MessageSquare,\n },\n editor: {\n label: \"Edit\",\n className:\n \"bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200 border-orange-300\",\n icon: Users,\n },\n viewer: {\n label: \"View\",\n className:\n \"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 border-blue-300\",\n icon: Eye,\n },\n };\n\n // A retired stored `edit_content` row reads as Edit (ONE-LADDER 2026-10-10).\n const shown = (level as string) === \"edit_content\" ? \"editor\" : level;\n const { label, className, icon: Icon } = config[shown];\n\n if (variant === \"compact\") {\n return (\n <Badge className={`${className} text-xs px-2 py-0.5`}>\n {showIcon && <Icon className=\"w-3 h-3 mr-1\" />}\n {label}\n </Badge>\n );\n }\n\n return (\n <Badge className={`${className} px-3 py-1`}>\n {showIcon && <Icon className=\"w-3.5 h-3.5 mr-1.5\" />}\n {label}\n </Badge>\n );\n}\n\n/**\n * PublicBadge - Badge specifically for public resources\n */\nexport function PublicBadge({\n variant = \"default\",\n}: {\n variant?: \"default\" | \"compact\" | undefined;\n}) {\n const className =\n \"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200 border-green-300\";\n\n if (variant === \"compact\") {\n return (\n <Badge className={`${className} text-xs px-2 py-0.5`}>\n <Globe className=\"w-3 h-3 mr-1\" />\n Public\n </Badge>\n );\n }\n\n return (\n <Badge className={`${className} px-3 py-1`}>\n <Globe className=\"w-3.5 h-3.5 mr-1.5\" />\n Public\n </Badge>\n );\n}\n\n/**\n * PermissionLevelDescription - Show what each level can do\n */\nexport function PermissionLevelDescription({\n level,\n}: {\n level: PermissionLevel;\n}) {\n // THE SCOPE-QUALIFIED ADMIN RULE (common-docs/systems/platform/access/DECISIONS.md,\n // 2026-09-10, CFL-360): the word \"admin\" never stands alone in an access surface — it carries\n // the noun of the thing it governs, so the item level is never read as the organization-admin\n // role. \"Full access\" was the retired label for this same level (AI Matrx Data Doctrine R19:\n // \"Admin is the top level on a thing; there is no 'full.'\").\n const descriptions: Record<PermissionLevel, string> = {\n viewer: \"Can view\",\n commenter: \"Can view and comment\",\n editor: \"Can view and edit values and content\",\n admin: \"Full access: also structure and sharing\",\n };\n\n return (\n <span className=\"text-xs text-muted-foreground\">{descriptions[level]}</span>\n );\n}\n\n/**\n * GuestBadge — a person who is not a member of the thing's organization (CLOSE-SHARE, Notion's \"Guest\").\n * The store decides (`isGuest` from get_resource_permissions; a Space's presence carries its own answer).\n * One marker for every share list and avatar row.\n */\nexport function GuestBadge() {\n return (\n <Badge variant=\"outline\" className=\"shrink-0 px-1.5 py-0 text-[10px] leading-4 text-muted-foreground\" data-guest-marker=\"\">\n Guest\n </Badge>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the AlertDialog implementation lives in\n * `@ai-matrx/design-system`.\n *\n * Everything this file carried is there, verbatim: the root renders\n * unconditionally (no hydration gate deleting always-visible delete buttons\n * from the first paint), and an undescribed alert dialog still gets a\n * screen-reader description instead of a console warning.\n *\n * ONE REAL DEFECT WAS FIXED IN THE PORT. This copy was not clamped to the\n * viewport, so an alert dialog listing what is about to be deleted could push\n * Cancel and Continue below the fold — and Radix does NOT dismiss an ALERT\n * dialog on a backdrop click, which made that surface a genuine dead end. The\n * package version is `max-h-[85dvh] overflow-y-auto` with a sticky,\n * edge-bleeding footer, matching Dialog.\n *\n * The popout wiring this file did by hand (`usePopoutContainer`) is now the\n * package's `PortalContainerProvider` seam, fed by summon's `PopoutShell` (`@ai-matrx/summon/window`).\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n type AlertDialogContentProps,\n} from \"@ai-matrx/design-system\";\n","/**\n * features/sharing/components/AccessSummaryPanel.tsx\n *\n * \"Who can see this, and why\" — the truthful access explanation for ONE\n * entity. Works for any entity token, not just files: hand it a type + id.\n *\n * It lists every REASON access is granted, because the reason is the part\n * users act on. \"Everyone in Titanium (via the Web Development scope)\" tells\n * you what to detach; \"Only you\" told you nothing and was often wrong.\n *\n * Every line it renders is copyable, in all three flavors, at panel and reason\n * granularity — including the failure branch. A user copying this panel is\n * asking an agent \"why can't this person see this, and what do I change?\", so\n * the rendered sentences (and the rendered error) ARE the payload.\n */\n\n\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport {\n Globe,\n Lock,\n Loader2,\n Users,\n Boxes,\n AlertTriangle,\n} from \"lucide-react\";\nimport { useAccessSummary } from \"./useAccessSummary\";\nimport { type AccessSummary } from \"@ai-matrx/sharing/core\";\nimport { CopyButtons } from \"./host\";\nimport { csvExportItem, jsonExportItem } from \"./host\";\nimport {\n accessKpis,\n accessReasonRows,\n accessSummaryView,\n humanAccessSummary,\n isPrivateSummary,\n reasonCsvRows,\n sharingLocation,\n summaryReachLabel,\n ACCESS_SUMMARY_ERROR_HEADLINE,\n NOTHING_ELSE_GRANTS,\n type AccessReasonRow,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport type { EntityTypeToken } from \"@ai-matrx/associations\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** What the panel currently knows, for pages that mirror it in their payload. */\nexport interface AccessSummaryState {\n summary: AccessSummary | null;\n error: string | null;\n loading: boolean;\n}\n\nexport interface AccessSummaryPanelProps {\n entityType: EntityTypeToken;\n entityId: string | null;\n /** Load only when the surface is actually visible. */\n enabled?: boolean | undefined;\n /**\n * Change this value to force a refetch. Required on surfaces that mutate\n * grants beside the panel (a Share tab) — pass a signature of the grant\n * state so the summary can never contradict the list next to it.\n */\n refreshToken?: unknown | undefined;\n className?: string | undefined;\n /**\n * Identity + the page's leading KPIs, mirrored verbatim into this panel's\n * payloads. Optional — without it the panel derives what it can from the\n * summary itself.\n */\n copy?: SharingCopyContext | undefined;\n /**\n * Lets the page that composes this panel mirror the reachability answer it\n * is rendering, without paying for a second round trip. Pass a stable\n * callback (a `useState` setter is ideal).\n */\n onSummaryChange?: (state: AccessSummaryState) => void;\n}\n\nexport function AccessSummaryPanel({\n entityType,\n entityId,\n enabled = true,\n refreshToken,\n className,\n copy,\n onSummaryChange,\n}: AccessSummaryPanelProps) {\n const { summary, loading, error, reload } = useAccessSummary({\n entityType,\n entityId,\n enabled,\n refreshToken,\n });\n\n /*\n * Publish upward so a composing page's payload can carry these same numbers\n * instead of recomputing (or double-fetching) what is already on screen.\n *\n * The callback is held in a ref and deliberately kept OUT of the deps: this\n * is a shared component, and a caller passing an inline arrow would\n * otherwise re-fire on every render and cascade forever. It fires when the\n * access answer actually changes, and only then.\n */\n const notifyRef = useRef(onSummaryChange);\n useEffect(() => {\n notifyRef.current = onSummaryChange;\n }, [onSummaryChange]);\n useEffect(() => {\n notifyRef.current?.({ summary, error, loading });\n }, [summary, error, loading]);\n\n const context: SharingCopyContext = copy ?? {\n resourceType: entityType,\n resourceId: entityId ?? \"unknown\",\n surface: \"Access summary\",\n kpis: accessKpis({\n permissions: [],\n isPublic: summary?.isPublic ?? false,\n viewerIsOwner: summary ? summary.viewerIsOwner : null,\n summary,\n entityType,\n }),\n };\n const location = sharingLocation(context.surface);\n const resourceAttributes = {\n resource_type: context.resourceType,\n resource_id: context.resourceId,\n resource_name: context.resourceName ?? null,\n };\n\n if (loading && !summary) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 text-[13px] text-muted-foreground\",\n className,\n )}\n >\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Working out who can see this…\n </div>\n );\n }\n\n if (error) {\n /*\n * ERRORS FIRST. A failed access read is the single highest-value thing on\n * this surface — the user is staring at \"we don't know who can see this\"\n * and wants an agent to tell them why. Copy it verbatim, with the entity\n * identity that produced it, never a paraphrase.\n */\n const errorHuman = () =>\n [\n `${ACCESS_SUMMARY_ERROR_HEADLINE}`,\n error,\n `Entity: ${entityType}:${entityId ?? \"(none)\"}`,\n `The panel offers a Retry; the reachability answer is UNKNOWN, not \"private\".`,\n ].join(\"\\n\");\n return (\n <div\n className={cn(\n \"group rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-[12px] text-destructive-ink\",\n className,\n )}\n >\n <p className=\"flex items-center gap-1.5 font-medium\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n {ACCESS_SUMMARY_ERROR_HEADLINE}\n <span className=\"ml-auto opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Access summary error\"\n human={errorHuman}\n json={() => ({\n error,\n entity_type: entityType,\n entity_id: entityId,\n })}\n agent={() => ({\n kind: \"access-summary-error\",\n location,\n description:\n \"The reachability summary failed to load. This is the error the user is looking at, verbatim — the access answer is UNKNOWN, not private.\",\n data: {\n rendered_headline: ACCESS_SUMMARY_ERROR_HEADLINE,\n rendered_error: error,\n entity_type: entityType,\n entity_id: entityId,\n retry_offered: true,\n kpis: context.kpis,\n },\n summary: errorHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n state: \"error\",\n },\n })}\n />\n </span>\n </p>\n <p className=\"opacity-80\">{error}</p>\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n type=\"button\"\n onClick={reload}\n className=\"mt-1 underline hover:no-underline\"\n >\n Retry\n </button>\n <ShareErrorAlchemyMenu error={error} />\n </div>\n );\n }\n\n if (!summary) return null;\n\n const Icon = summary.isPublic\n ? Globe\n : isPrivateSummary(summary)\n ? Lock\n : Users;\n\n // ONE extractor feeds both the rendering below and every payload — the copy\n // can never drift from the reasons on screen.\n const reasons = accessReasonRows(summary, entityType);\n const view = () => accessSummaryView(summary, entityType);\n const panelHuman = () => humanAccessSummary(summary, entityType);\n\n return (\n <div className={cn(\"group space-y-2 px-3 py-2\", className)}>\n {/* Who can open it comes from the summary the reasons below come from, so the two never\n contradict each other. */}\n <div className=\"flex items-center gap-2\">\n <p className=\"text-[12px] text-muted-foreground\">\n Who can open it:{\" \"}\n <span className=\"text-foreground\">\n {summaryReachLabel(summary)}\n </span>\n </p>\n <span className=\"ml-auto flex items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Who can see this\"\n human={panelHuman}\n json={view}\n agent={() => ({\n kind: \"access-summary\",\n location,\n description:\n 'Every reason this entity is reachable, exactly as rendered: who can open it, the one-line headline, and each reason row. This is the complete answer to \"who can see this, and why\" — direct grants are only one of the reasons listed.',\n data: { ...view(), kpis: context.kpis },\n summary: panelHuman(),\n attributes: {\n ...context.kpis,\n ...resourceAttributes,\n reasons: reasons.length,\n is_public: summary.isPublic,\n viewer_is_owner: summary.viewerIsOwner,\n can_manage: summary.canManage,\n },\n })}\n export={{\n items: [\n jsonExportItem(view, \"JSON (rendered summary)\"),\n csvExportItem(\n () => reasonCsvRows(reasons),\n \"CSV (all access reasons)\",\n ),\n ],\n }}\n />\n </span>\n </div>\n\n <p className=\"flex items-start gap-2 text-[13px] text-foreground\">\n <Icon className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span>{view().headline}</span>\n </p>\n\n <ul className=\"space-y-1 text-[12px] text-muted-foreground\">\n {reasons.map((reason) => (\n <ReasonRow\n key={reason.id}\n reason={reason}\n location={location}\n attributes={{ ...context.kpis, ...resourceAttributes }}\n />\n ))}\n </ul>\n\n {isPrivateSummary(summary) ? (\n <p className=\"text-[12px] text-muted-foreground\">\n {NOTHING_ELSE_GRANTS}\n </p>\n ) : null}\n </div>\n );\n}\n\nconst REASON_ICON: Record<AccessReasonRow[\"kind\"], typeof Users> = {\n organization: Users,\n \"direct-grants\": Users,\n container: Boxes,\n};\n\nfunction ReasonRow({\n reason,\n location,\n attributes,\n}: {\n reason: AccessReasonRow;\n location: string;\n attributes: Record<string, string | number | boolean | null | undefined>;\n}) {\n const Icon = REASON_ICON[reason.kind];\n const human = () =>\n `${reason.title}${reason.detail ? ` — ${reason.detail}` : \"\"}`;\n return (\n <li className=\"group/reason flex items-start gap-2\">\n <Icon className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"min-w-0\">\n <span className=\"text-foreground\">{reason.title}</span>\n {reason.detail ? (\n <span className=\"opacity-80\"> — {reason.detail}</span>\n ) : null}\n </span>\n {/* A reason is the unit the user ACTS on (\"detach that scope\") — so it is\n the unit they hand an agent. */}\n <span className=\"ml-auto shrink-0 opacity-0 transition-opacity focus-within:opacity-100 group-hover/reason:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={`Access reason — ${reason.title}`}\n human={human}\n json={() => reason}\n agent={() => ({\n kind: \"access-reason\",\n location,\n description:\n \"One reason this entity is reachable, as rendered in the access summary. Removing this reason is one of the levers for changing who can see it.\",\n data: reason,\n summary: human(),\n attributes: {\n ...attributes,\n reason_kind: reason.kind,\n container_type: reason.containerType ?? null,\n container_id: reason.containerId ?? null,\n },\n })}\n />\n </span>\n </li>\n );\n}\n\nexport default AccessSummaryPanel;\n","/**\n * features/sharing/hooks/useAccessSummary.ts\n *\n * One-entity-at-a-time effective-access loader. `enabled` exists so callers can\n * mount the panel inside a collapsed tab and only pay for the round trip when\n * the user actually looks — this query is NOT cheap enough to fire per row.\n */\n\n\"use client\";\n\nimport { useRefreshWhenChanged, useStoreRead } from \"./host\";\nimport {\n fetchAccessSummary,\n type AccessSummary,\n} from \"@ai-matrx/sharing/core\";\nimport type { EntityTypeToken } from \"@ai-matrx/associations\";\n\nexport interface UseAccessSummaryArgs {\n entityType: EntityTypeToken;\n entityId: string | null;\n /** Load only while true. Defaults to true. */\n enabled?: boolean | undefined;\n /**\n * Change this value to force a refetch — for surfaces that mutate grants\n * beside the panel (a Share tab), pass a signature of the grant state so\n * the summary can never contradict the freshly-refreshed list next to it.\n */\n refreshToken?: unknown | undefined;\n}\n\nexport interface UseAccessSummaryResult {\n summary: AccessSummary | null;\n loading: boolean;\n error: string | null;\n reload: () => void;\n}\n\nexport function useAccessSummary({\n entityType,\n entityId,\n enabled = true,\n refreshToken,\n}: UseAccessSummaryArgs): UseAccessSummaryResult {\n // Kept once per record per tab (the remount law): a tile waking from sleep or remounting shows the\n // kept summary and reads nothing; a failed read is not kept. A new `refreshToken` or `reload()` is the\n // deliberate re-read.\n const read = useStoreRead<AccessSummary>(\n entityId ? `sharing.access-summary:${entityType}:${entityId}` : null,\n () => fetchAccessSummary(entityType, entityId as string),\n { enabled: enabled && Boolean(entityId), staleAfterMs: 60_000 },\n );\n useRefreshWhenChanged(refreshToken, read.refresh);\n\n const active = enabled && Boolean(entityId);\n const reload = () => {\n void read.refresh();\n };\n return {\n summary: active ? (read.data ?? null) : null,\n loading: active && read.isLoading,\n error: active && read.isError ? (read.error ?? \"Could not load access\") : null,\n reload,\n };\n}\n","\"use client\";\n\nimport React, { useState, useMemo, useEffect } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport {\n Loader2,\n UserPlus,\n CheckCircle,\n XCircle,\n Users,\n MessageSquare,\n Building2,\n Mail,\n} from \"lucide-react\";\nimport type {\n PermissionLevel,\n ResourceType,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport {\n PERMISSION_LEVEL_HINTS,\n PERMISSION_LEVEL_LABELS,\n PERMISSION_LEVEL_SHORT_LABELS,\n PERMISSION_LEVELS,\n} from \"@ai-matrx/sharing/core\";\nimport { PermissionLevelDescription } from \"./PermissionBadge\";\nimport type { GrantableLevels } from \"./useGrantableLevels\";\nimport { createClient } from \"@ai-matrx/sharing/core\";\nimport {\n useUserConnections,\n type ConnectionUser,\n} from \"./host\";\nimport { CopyButtons } from \"./host\";\nimport {\n sharingLocation,\n type SharingCopyContext,\n} from \"@ai-matrx/sharing/core\";\nimport { UserSearchField } from \"./host\";\nimport type { UserSearchCandidate } from \"./host\";\n// THE package initials formatter (`@ai-matrx/kit/format`, census H1\n// 2026-09-07). Recorded display decision: a multi-part name takes FIRST +\n// LAST, so \"Ana Maria Rivera\" is AR — this surface previously printed AM.\n// A caller with no name passes the email, whose single token yields its\n// first character: exactly what these copies did by hand.\nimport { getInitials } from \"@ai-matrx/kit/format\";\nimport {\n AddEveryoneInOrg,\n type OrgMemberPerson,\n} from \"./AddEveryoneInOrg\";\nimport { ConnectionsReadNotice } from \"./host\";\n\ninterface ShareWithUserTabProps {\n onShare: (\n userId: string,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n onSuccess: () => void;\n resourceType: ResourceType;\n resourceId: string;\n /**\n * THE ORGANIZATION THIS THING BELONGS TO (FIX-7B). With it, the contact list is that\n * organization's members and nobody else. Without it the list is every organization the\n * viewer belongs to, which is what a brand-new organization's share dialog looked like when\n * the seventh pass found it offering \"people from all over the database\".\n */\n organizationId?: string | undefined;\n /** Identity + the page's leading KPIs, mirrored into the failure payload. */\n copy?: SharingCopyContext | undefined;\n /**\n * \"ADD EVERYONE IN <ORGANIZATION>\" (SHARE-PEOPLE-ONLY). How ONE listed member is granted.\n * Omitted → `onShare(person.userId, level)`, the same door as the form above. A record-store\n * table passes the outside door here, because its members may sit outside the table's own\n * organization.\n */\n grantEveryonePerson?: (\n person: OrgMemberPerson,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n /** People who already hold a grant; \"Add everyone\" shows them and skips them. */\n alreadySharedUserIds?: string[] | undefined;\n /**\n * \"notion\": the level picker reads the ladder's sentence labels, highest first — Full access · Edit ·\n * Comment · View (Spaces copies Notion's Share menu). Default: the role words.\n */\n levelWording?: \"roles\" | \"notion\" | undefined;\n /**\n * The levels the doors will accept from THIS person (iam.may_grant_as). A level with a reason is shown\n * disabled with that reason; omitted, every level is offered and the door answers (as before).\n */\n grantable?: GrantableLevels | undefined;\n}\n\ntype StatusType = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface Status {\n type: StatusType;\n message: string;\n}\n\nconst SOURCE_ICONS: Record<ConnectionUser[\"source\"], typeof Users> = {\n conversation: MessageSquare,\n organization: Building2,\n invitation: Mail,\n};\n\nconst SOURCE_LABELS: Record<ConnectionUser[\"source\"], string> = {\n conversation: \"Contact\",\n organization: \"Organization\",\n invitation: \"Invited\",\n};\n\nconst EMAIL_SHAPE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** One exact email → the person, through `lookup_user_by_email`; null when no one has it. */\nasync function lookupConnectionByEmail(typed: string): Promise<ConnectionUser | null> {\n const { data } = await createClient().schema(\"users\").rpc(\"lookup_user_by_email\", { lookup_email: typed });\n const row = (data as Array<{ user_id: string; user_email: string }> | null)?.[0];\n return row\n ? {\n user_id: row.user_id,\n email: row.user_email,\n display_name: row.user_email.split(\"@\", 1)[0] ?? null,\n avatar_url: null,\n source: \"invitation\",\n sourceDetails: \"Found by email\",\n }\n : null;\n}\n\nfunction candidateOf(connection: ConnectionUser, foundByEmail: boolean): UserSearchCandidate {\n return {\n id: connection.user_id,\n email: connection.email,\n displayName: connection.display_name,\n avatarUrl: connection.avatar_url,\n phone: null,\n adminLevel: null,\n organizations:\n connection.source === \"organization\" && connection.sourceDetails ? [connection.sourceDetails] : [],\n source: foundByEmail ? \"Found by email\" : SOURCE_LABELS[connection.source],\n createdAt: null,\n lastSignInAt: null,\n };\n}\n\n\n\n/**\n * ShareWithUserTab - Form to share with a specific user.\n * Shows the user's contacts from conversations, organizations, and invitations\n * for quick selection, with a manual email input fallback.\n */\nexport function ShareWithUserTab({\n levelWording = \"roles\",\n grantable,\n onShare,\n onSuccess,\n resourceType,\n resourceId,\n organizationId,\n copy,\n grantEveryonePerson,\n alreadySharedUserIds,\n}: ShareWithUserTabProps) {\n const [email, setEmail] = useState(\"\");\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [permissionLevel, setPermissionLevel] =\n useState<PermissionLevel>(\"viewer\");\n /** The reason a level may not be given by this person, or null when they may (or nothing is known yet). */\n const whyNotLevel = (level: PermissionLevel): string | null => {\n const why = grantable?.levels[level];\n return typeof why === \"string\" ? why : null;\n };\n const chosenWhy = whyNotLevel(permissionLevel);\n const [status, setStatus] = useState<Status>({ type: \"idle\", message: \"\" });\n const [selectedContact, setSelectedContact] = useState<ConnectionUser | null>(\n null,\n );\n\n // Scoped: this dialog is about ONE thing, in ONE organization, and the people it offers are\n // the people in that organization. Past conversations are not folded in — a conversation is\n // bounded by no organization (FIX-7B).\n const {\n connections,\n isLoading: connectionsLoading,\n error: connectionsError,\n partialFailures: connectionsPartial,\n refresh: refreshConnections,\n } = useUserConnections(organizationId ? { organizationId } : {});\n\n const filteredConnections = useMemo(() => {\n if (!searchQuery.trim()) return connections;\n const q = searchQuery.toLowerCase();\n return connections.filter(\n (c) =>\n (c.display_name && c.display_name.toLowerCase().includes(q)) ||\n (c.email && c.email.toLowerCase().includes(q)),\n );\n }, [connections, searchQuery]);\n\n // THE SEARCH FINDS ANY PERSON, NOT ONLY THIS ORGANIZATION'S ROSTER. The contact list above is\n // scoped to the thing's organization (FIX-7B), but sharing with someone outside it is a real\n // path (typed email → lookup_user_by_email). The magnifier used to search the roster alone, so\n // an existing person outside it found \"nothing\" while typing their email worked. A full email\n // typed in the field is now resolved by the same lookup and offered as a candidate.\n const [looked, setLooked] = useState<ConnectionUser | null>(null);\n /** An exact email, resolved now: the search window takes a snapshot, so Enter must not outrun the debounce. */\n const resolveTypedEmail = async (query: string): Promise<UserSearchCandidate[]> => {\n const typed = query.trim().toLowerCase();\n if (!EMAIL_SHAPE.test(typed)) return [];\n const found = connections.find((c) => c.email?.toLowerCase() === typed) ?? (await lookupConnectionByEmail(typed));\n return found ? [candidateOf(found, true)] : [];\n };\n useEffect(() => {\n const typed = email.trim().toLowerCase();\n if (!EMAIL_SHAPE.test(typed)) {\n setLooked(null);\n return;\n }\n if (connections.some((c) => c.email?.toLowerCase() === typed)) {\n setLooked(null);\n return;\n }\n let stale = false;\n const handle = setTimeout(async () => {\n const found = await lookupConnectionByEmail(typed);\n if (stale) return;\n setLooked(found);\n }, 300);\n return () => {\n stale = true;\n clearTimeout(handle);\n };\n }, [email, connections]);\n\n const searchableConnections = useMemo(\n () => (looked ? [...connections, looked] : connections),\n [connections, looked],\n );\n\n const userSearchCandidates: UserSearchCandidate[] = searchableConnections.map((connection) =>\n candidateOf(connection, connection === looked),\n );\n\n const resetStatus = () => {\n setStatus({ type: \"idle\", message: \"\" });\n };\n\n const selectContact = (contact: ConnectionUser) => {\n setSelectedContact(contact);\n setEmail(contact.email || \"\");\n setSearchQuery(\"\");\n if (status.type === \"error\") resetStatus();\n };\n\n const clearContact = () => {\n setSelectedContact(null);\n setEmail(\"\");\n };\n\n const handleShare = async () => {\n const trimmedEmail = email.trim();\n\n if (!trimmedEmail || !trimmedEmail.includes(\"@\")) {\n setStatus({\n type: \"error\",\n message: \"Please enter a valid email address\",\n });\n return;\n }\n\n setStatus({ type: \"loading\", message: \"Looking up user...\" });\n\n try {\n // Resolve userId — use selected contact to skip the lookup RPC when possible\n let targetUserId: string | null = null;\n\n if (selectedContact && selectedContact.email === trimmedEmail) {\n targetUserId = selectedContact.user_id;\n } else {\n const client = createClient();\n const { data: lookupData, error: lookupError } = await client.schema(\"users\").rpc(\n \"lookup_user_by_email\",\n { lookup_email: trimmedEmail },\n );\n\n if (lookupError) {\n setStatus({\n type: \"error\",\n message: `Lookup failed: ${lookupError.message}`,\n });\n return;\n }\n\n const userData = Array.isArray(lookupData) ? lookupData[0] : lookupData;\n\n if ((!userData || !userData.user_id) && !grantEveryonePerson) {\n setStatus({\n type: \"error\",\n message: `No user found with email \"${trimmedEmail}\". They may need to create an account first.`,\n });\n return;\n }\n\n targetUserId = userData?.user_id ?? null;\n }\n\n setStatus({ type: \"loading\", message: \"Sharing with user...\" });\n\n // Delegate to the onShare prop — this calls shareWithUser() in the service,\n // which validates ownership via the share_resource_with_user RPC and sends\n // the notification email. Never call the RPC directly from the UI layer.\n // A custom TABLE hands its outside door here (`grantEveryonePerson`): it grants an existing\n // account outright, inside the organization or out, and invites an address with no account.\n // So an address outside the organization is offered the outside share in this same box,\n // never refused with \"That person is not in this organization\".\n const result = grantEveryonePerson\n ? await grantEveryonePerson(\n { userId: targetUserId ?? \"\", email: trimmedEmail, name: trimmedEmail.split(\"@\", 1)[0] ?? trimmedEmail },\n permissionLevel,\n )\n : await onShare(targetUserId as string, permissionLevel);\n const errorMsg = result?.error;\n\n if (!errorMsg) {\n setStatus({\n type: \"success\",\n // THE CONFIRMATION LIVES HERE, IN THE DIALOG THAT DID IT (law 4: a sentence with an\n // inline home is not also toasted). It used to ride a legacy Radix toast, and on a\n // table page the organization gate's pick closed this dialog before anyone read it\n // (VERIFIER-18 H4) — the dialog now stays open, saying it worked.\n message: `Shared with ${trimmedEmail}. They can open it now.`,\n });\n setEmail(\"\");\n setSelectedContact(null);\n setPermissionLevel(\"viewer\");\n\n\n setTimeout(() => {\n onSuccess();\n }, 1500);\n } else {\n setStatus({ type: \"error\", message: errorMsg });\n }\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Something went wrong\";\n setStatus({ type: \"error\", message: `Unexpected error: ${message}` });\n }\n };\n\n const isLoading = status.type === \"loading\";\n\n return (\n <div className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\">\n <div>\n <h3 className=\"text-sm font-medium mb-1\">Share with User</h3>\n <p className=\"text-xs text-muted-foreground\">\n Select a contact or enter an email address\n </p>\n </div>\n\n {/* STATUS MESSAGE */}\n {status.type !== \"idle\" && (\n <div\n className={`p-2 rounded-md flex items-start gap-2 text-xs ${\n status.type === \"loading\"\n ? \"bg-blue-500/10 text-blue-700 dark:text-blue-300 border border-blue-500/20\"\n : status.type === \"success\"\n ? \"bg-green-500/10 text-green-700 dark:text-green-300 border border-green-500/20\"\n : \"bg-red-500/10 text-red-700 dark:text-red-300 border border-red-500/20\"\n }`}\n >\n {status.type === \"loading\" && (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin flex-shrink-0 mt-0.5\" />\n )}\n {status.type === \"success\" && (\n <CheckCircle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5\" />\n )}\n {status.type === \"error\" && (\n <XCircle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5\" />\n )}\n <span className=\"flex-1\">{status.message}</span>\n {status.type === \"error\" && (\n <>\n {/*\n * THE FAILURE IS THE PAYLOAD. \"No user found with email X — they\n * may need to create an account first\" is exactly the sentence a\n * user hands an agent, and it is only actionable together with\n * the LIVE form state that produced it: the address they typed,\n * the contact they picked, the level they chose. Built inside the\n * click handler so it reads the current inputs, never a stale\n * render.\n */}\n <CopyButtons\n size=\"xs\"\n label=\"Share failure\"\n human={() =>\n [\n \"Sharing with a user failed.\",\n `Error shown: ${status.message}`,\n `Email entered: ${email.trim() || \"(empty)\"}`,\n `Contact selected: ${\n selectedContact\n ? `${selectedContact.display_name ?? selectedContact.email} (${selectedContact.source})`\n : \"none\"\n }`,\n `Permission level chosen: ${permissionLevel}`,\n `Resource: ${resourceType}:${resourceId}`,\n ].join(\"\\n\")\n }\n json={() => ({\n error: status.message,\n email: email.trim(),\n selected_contact: selectedContact,\n permission_level: permissionLevel,\n resource_type: resourceType,\n resource_id: resourceId,\n })}\n agent={() => ({\n kind: \"share-with-user-failure\",\n location: sharingLocation(copy?.surface ?? \"Share with user\"),\n description:\n \"A share-with-user attempt that failed, with the error sentence on screen and the live form state that produced it.\",\n data: {\n rendered_error: status.message,\n form_state: {\n email_entered: email.trim(),\n selected_contact: selectedContact,\n permission_level: permissionLevel,\n contacts_available: connections.length,\n },\n resource: {\n type: resourceType,\n id: resourceId,\n name: copy?.resourceName ?? null,\n },\n kpis: copy?.kpis ?? null,\n },\n attributes: {\n ...(copy?.kpis ?? {}),\n resource_type: resourceType,\n resource_id: resourceId,\n state: \"error\",\n permission_level: permissionLevel,\n },\n })}\n />\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n onClick={resetStatus}\n className=\"text-xs underline hover:no-underline flex-shrink-0\"\n >\n Dismiss\n </button>\n </>\n )}\n </div>\n )}\n\n <div className=\"space-y-2.5\">\n {/* CONTACTS LIST */}\n {!selectedContact && (\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs flex items-center gap-1.5\">\n <Users className=\"w-3 h-3\" />\n Your Contacts\n </Label>\n {connectionsLoading ? (\n <div className=\"flex items-center justify-center py-4 text-xs text-muted-foreground\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin mr-2\" />\n Loading contacts...\n </div>\n ) : connectionsError && connections.length === 0 ? (\n <ConnectionsReadNotice\n error={connectionsError}\n partialFailures={connectionsPartial}\n hasRows={false}\n onRetry={() => void refreshConnections()}\n />\n ) : connections.length === 0 ? (\n <p className=\"text-xs text-muted-foreground py-2 text-center\">\n No contacts found. Enter an email below.\n </p>\n ) : (\n <>\n <ConnectionsReadNotice\n error={connectionsError}\n partialFailures={connectionsPartial}\n hasRows\n onRetry={() => void refreshConnections()}\n />\n {connections.length > 5 && (\n <div>\n <UserSearchField\n placeholder=\"Search contacts...\"\n value={searchQuery}\n onValueChange={setSearchQuery}\n onUserSelect={(user: UserSearchCandidate) => {\n const contact = searchableConnections.find(\n (candidate) => candidate.user_id === user.id,\n );\n if (contact) selectContact(contact);\n }}\n candidates={userSearchCandidates}\n title=\"Search your contacts\"\n disabled={isLoading}\n className=\"w-full\"\n inputClassName=\"h-8 text-xs\"\n />\n </div>\n )}\n <ScrollArea className=\"max-h-36 rounded-md border bg-background\">\n <div className=\"p-1\">\n {filteredConnections.length === 0 ? (\n <p className=\"text-xs text-muted-foreground py-2 text-center\">\n No matching contacts\n </p>\n ) : (\n filteredConnections.map((contact) => {\n const SourceIcon = SOURCE_ICONS[contact.source];\n return ( // ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change\n <button\n key={contact.user_id}\n onClick={() => selectContact(contact)}\n disabled={isLoading}\n className=\"w-full flex items-center gap-2 p-1.5 rounded-md hover:bg-accent/50 transition-colors text-left disabled:opacity-50\"\n >\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={contact.avatar_url || undefined}\n />\n <AvatarFallback className=\"text-[10px] bg-primary/10 text-primary-ink\">\n {getInitials(contact.display_name ?? contact.email)}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium truncate\">\n {contact.display_name ||\n contact.email ||\n \"Unknown\"}\n </p>\n {contact.display_name && contact.email && (\n <p className=\"text-[10px] text-muted-foreground truncate\">\n {contact.email}\n </p>\n )}\n </div>\n <span className=\"flex items-center gap-1 text-[10px] text-muted-foreground flex-shrink-0\">\n <SourceIcon className=\"w-3 h-3\" />\n {SOURCE_LABELS[contact.source]}\n </span>\n </button>\n );\n })\n )}\n </div>\n </ScrollArea>\n </>\n )}\n </div>\n )}\n\n {/* SELECTED CONTACT CHIP */}\n {selectedContact && (\n <div className=\"flex items-center gap-2 p-2 rounded-md bg-primary/5 border border-primary/20\">\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage src={selectedContact.avatar_url || undefined} />\n <AvatarFallback className=\"text-[10px] bg-primary/10 text-primary-ink\">\n {getInitials(\n selectedContact.display_name ?? selectedContact.email,\n )}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium truncate\">\n {selectedContact.display_name || selectedContact.email}\n </p>\n {selectedContact.display_name && selectedContact.email && (\n <p className=\"text-[10px] text-muted-foreground truncate\">\n {selectedContact.email}\n </p>\n )}\n </div>\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n onClick={clearContact}\n disabled={isLoading}\n className=\"text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50\"\n >\n <XCircle className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n\n {/* MANUAL EMAIL INPUT */}\n {!selectedContact && (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"user-email\" className=\"text-xs\">\n Or enter email manually\n </Label>\n <UserSearchField\n id=\"user-email\"\n placeholder=\"user@example.com\"\n value={email}\n onValueChange={(value: string) => {\n setEmail(value);\n if (status.type === \"error\") resetStatus();\n }}\n onUserSelect={(user: UserSearchCandidate) => {\n const contact = searchableConnections.find(\n (candidate) => candidate.user_id === user.id,\n );\n if (contact) selectContact(contact);\n }}\n candidates={userSearchCandidates}\n resolveCandidates={resolveTypedEmail}\n title=\"Choose a user to share with\"\n inputType=\"email\"\n disabled={isLoading}\n inputClassName=\"h-9\"\n />\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"user-permission\" className=\"text-xs\">\n Permission Level\n </Label>\n <Select\n value={permissionLevel}\n onValueChange={(value: string) =>\n setPermissionLevel(value as PermissionLevel)\n }\n disabled={isLoading}\n >\n <SelectTrigger id=\"user-permission\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {levelWording === \"notion\"\n ? [...PERMISSION_LEVELS].reverse().map((level) => (\n <SelectItem key={level} value={level} disabled={whyNotLevel(level) !== null} title={whyNotLevel(level) ?? PERMISSION_LEVEL_HINTS[level]}>\n {PERMISSION_LEVEL_LABELS[level]}\n </SelectItem>\n ))\n : (\n <>\n <SelectItem value=\"viewer\" disabled={whyNotLevel(\"viewer\") !== null} title={whyNotLevel(\"viewer\") ?? PERMISSION_LEVEL_HINTS.viewer}>{PERMISSION_LEVEL_SHORT_LABELS.viewer}</SelectItem>\n {/* VIS-17b: `commenter` is the FOURTH rung of the one ladder — it has been in\n `public.permission_level` since G0 and every policy and RPC accepts it, and\n this picker was the one place a person could not choose it (lane SHARE,\n 2026-09-19). A ladder with a rung nobody can reach is not one ladder. */}\n <SelectItem value=\"commenter\" disabled={whyNotLevel(\"commenter\") !== null} title={whyNotLevel(\"commenter\") ?? PERMISSION_LEVEL_HINTS.commenter}>{PERMISSION_LEVEL_SHORT_LABELS.commenter}</SelectItem>\n <SelectItem value=\"editor\" disabled={whyNotLevel(\"editor\") !== null} title={whyNotLevel(\"editor\") ?? PERMISSION_LEVEL_HINTS.editor}>{PERMISSION_LEVEL_SHORT_LABELS.editor}</SelectItem>\n {/* THE SCOPE-QUALIFIED ADMIN RULE (access/DECISIONS.md 2026-09-10): the heading\n above is \"Permission Level\", which names no item, so the bare \"Admin\" is\n qualified here. */}\n <SelectItem value=\"admin\" disabled={whyNotLevel(\"admin\") !== null} title={whyNotLevel(\"admin\") ?? PERMISSION_LEVEL_HINTS.admin}>{PERMISSION_LEVEL_SHORT_LABELS.admin}</SelectItem>\n </>\n )}\n </SelectContent>\n </Select>\n <PermissionLevelDescription level={permissionLevel} />\n {/* Full access (and anything else this person may not give) is disabled above; one line says why. */}\n {chosenWhy ? <p className=\"text-xs text-muted-foreground\">{chosenWhy}</p> : null}\n {!chosenWhy && whyNotLevel(\"admin\") ? (\n <p className=\"text-xs text-muted-foreground\" data-share-level-reason=\"\">\n {whyNotLevel(\"admin\")}\n </p>\n ) : null}\n {grantable?.outside ? (\n <p className=\"text-xs text-muted-foreground\" data-share-outside-reason=\"\">\n {grantable.outside}\n </p>\n ) : null}\n </div>\n\n <Button\n variant=\"primary\"\n onClick={handleShare}\n disabled={isLoading || !email.trim() || chosenWhy !== null}\n className=\"w-full\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {status.message || \"Processing...\"}\n </>\n ) : (\n <>\n <UserPlus className=\"w-4 h-4 mr-2\" />\n Share with User\n </>\n )}\n </Button>\n\n {/* SHARE-PEOPLE-ONLY: the whole-team convenience, as people. Replaces the old\n \"Share with Organization\" tab, which granted an organization. */}\n <AddEveryoneInOrg\n level={permissionLevel}\n whyNotLevel={whyNotLevel}\n grantPerson={\n grantEveryonePerson ??\n ((person, level) => onShare(person.userId, level))\n }\n alreadySharedUserIds={alreadySharedUserIds ?? []}\n onDone={onSuccess}\n {...(organizationId ? { defaultOrgId: organizationId } : {})}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — ScrollArea lives in `@ai-matrx/design-system`, which\n * additionally exposes the viewport (`viewportClassName`, `viewportRef`) that\n * this fork kept sealed. `viewportRef` is the scrolling element — the one\n * `scrollTop` lives on, which programmatic scroll-to-bottom needs.\n */\n\nexport { ScrollArea, ScrollBar } from \"@ai-matrx/design-system\";\nexport type { ScrollAreaProps } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — Avatar lives in `@ai-matrx/design-system`. Its default\n * `size` is `lg`, the `h-10 w-10` box this repo has always used, so nothing is\n * bound here. The package's fallback also carries defined type\n * (`text-muted-foreground`, sized with the avatar) instead of inheriting\n * whatever the surrounding row happened to set.\n */\n\nexport { Avatar, AvatarFallback, AvatarImage } from \"@ai-matrx/design-system\";\nexport type { AvatarProps, AvatarSize } from \"@ai-matrx/design-system\";\n","\"use client\";\n\n/**\n * features/sharing/components/AddEveryoneInOrg.tsx\n *\n * \"ADD EVERYONE IN <ORGANIZATION>\" — THE HONEST REPLACEMENT FOR \"SHARE WITH ORGANIZATION\".\n *\n * Owner ruling (Arman, 2026-09-23): access is personal. Permission is granted to a PERSON, never\n * to an organization. The Share dialog used to carry a \"Share with Organization\" tab that wrote\n * one grant to a whole organization; the store now refuses that with \"Shares name a person, not\n * an organization.\" (lane SHARE-PEOPLE-ONLY, 2026-09-25).\n *\n * The convenience it offered, giving everybody on a team the thing at once, lives here instead.\n * The person picks one of THEIR organizations. Its CURRENT members are listed by name, each with\n * a checkbox and all ticked. Pressing the button grants each ticked PERSON through the same door\n * the single-person share uses. Nobody who joins later is included, and the panel says so in one\n * sentence.\n *\n * A TEAM IS THE SAME CONVENIENCE, NARROWER (AT-SHARE-B, Airtable parity \"user groups\"). Once an organization is\n * picked, its teams (the platform's own `iam.team`, read through `team_list`) are offered beside \"Everyone\"; picking\n * one lists that team's current members (`team_members`) and grants each PERSON the same way. A team is never a\n * grantee: what a team member gets is their own share, and people who join the team later are not added.\n */\n\nimport { readOrganizationMemberRows } from \"@ai-matrx/sharing/core\";\nimport { listTeamMembers, listTeams, type Team } from \"@ai-matrx/sharing/core\";\nimport React, { useEffect, useState } from \"react\";\nimport { Building2, CheckCircle, Loader2, Users, XCircle } from \"lucide-react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { organizationDisambiguators } from \"@ai-matrx/sharing/core\";\nimport { useOrganizationsToCreateIn } from \"./host\";\nimport { useCurrentUserId } from \"./host\";\nimport { PERMISSION_LEVELS, PERMISSION_LEVEL_SHORT_LABELS } from \"@ai-matrx/sharing/core\";\nimport type {\n PermissionLevel,\n ShareActionResult,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** One current member of the chosen organization, as the dialog shows them. */\nexport interface OrgMemberPerson {\n userId: string;\n email: string;\n name: string;\n}\n\nexport interface AddEveryoneInOrgProps {\n /** Grants ONE person. The same door the single-person share uses. */\n grantPerson: (\n person: OrgMemberPerson,\n level: PermissionLevel,\n ) => Promise<ShareActionResult>;\n /** The level picked in the People tab: the block's own level starts here, and follows it until the person picks one here. */\n level: PermissionLevel;\n /** Why a level may not be given on this thing (null: may). Those levels are shown disabled with the reason. */\n whyNotLevel?: (level: PermissionLevel) => string | null;\n /** People who already hold a grant on this thing. They are shown, not re-granted. */\n alreadySharedUserIds?: string[] | undefined;\n /** Called once after a run that granted at least one person. */\n onDone?: () => void;\n /**\n * The organization the thing lives in, when the dialog knows it. It is chosen first, so \"Add\n * everyone in <that organization>\" is one press away; any other organization the person\n * belongs to stays one pick away.\n */\n defaultOrgId?: string | undefined;\n}\n\ntype Outcome = { ok: boolean; say: string };\n\n/** \"Everyone in the organization\" — the default pick of the group select. */\nconst EVERYONE = \"__everyone__\";\n\nasync function readTeamMembers(teamId: string): Promise<OrgMemberPerson[]> {\n const rows = await listTeamMembers(teamId);\n return rows.map((row) => ({\n userId: row.userId,\n email: row.email ?? \"\",\n name: row.displayName || row.email || \"Unnamed person\",\n }));\n}\n\nasync function readMembers(orgId: string): Promise<OrgMemberPerson[]> {\n // THE ONE ROSTER READ (joined in flight, reused for 30 s).\n const data = await readOrganizationMemberRows(orgId);\n return data.map((row) => ({\n userId: row.user_id,\n email: row.user_email ?? \"\",\n name: row.user_display_name || row.user_email || \"Unnamed person\",\n }));\n}\n\nexport function AddEveryoneInOrg({\n grantPerson,\n level: sectionLevel,\n whyNotLevel,\n alreadySharedUserIds = [],\n onDone,\n defaultOrgId,\n}: AddEveryoneInOrgProps) {\n const { orgs } = useOrganizationsToCreateIn();\n const detail = organizationDisambiguators(orgs);\n const me = useCurrentUserId();\n const [open, setOpen] = useState(false);\n const [orgId, setOrgId] = useState(\"\");\n const [members, setMembers] = useState<OrgMemberPerson[] | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [ticked, setTicked] = useState<Set<string>>(new Set());\n const [running, setRunning] = useState(false);\n const [outcomes, setOutcomes] = useState<Record<string, Outcome>>({});\n const [teams, setTeams] = useState<Team[]>([]);\n const [teamsError, setTeamsError] = useState<string | null>(null);\n const [group, setGroup] = useState(EVERYONE);\n // THE BLOCK'S OWN LEVEL: starts at the People tab's level and follows it until the person picks one here.\n const [ownLevel, setOwnLevel] = useState<PermissionLevel | null>(null);\n const level = ownLevel ?? sectionLevel;\n\n const orgLabel = orgs.find((o) => o.id === orgId)?.name ?? \"this organization\";\n const team = group === EVERYONE ? undefined : teams.find((t) => t.id === group);\n // Every sentence below names the group being added: the organization, or the team picked inside it.\n const orgName = team ? team.name : orgLabel;\n\n // The organization's teams, offered beside \"Everyone\". None: the group select is absent.\n useEffect(() => {\n if (!open || !orgId) return;\n let cancelled = false;\n setTeams([]);\n setTeamsError(null);\n setGroup(EVERYONE);\n listTeams(orgId)\n .then((rows) => {\n if (!cancelled) setTeams(rows.filter((t) => t.archivedAt === null && t.memberCount > 0));\n })\n .catch((err: unknown) => {\n if (!cancelled) setTeamsError(err instanceof Error ? err.message : \"The teams could not be listed.\");\n });\n return () => {\n cancelled = true;\n };\n }, [open, orgId]);\n const already = new Set(alreadySharedUserIds);\n\n useEffect(() => {\n if (!open || !orgId) return;\n let cancelled = false;\n setMembers(null);\n setLoadError(null);\n setOutcomes({});\n (group === EVERYONE ? readMembers(orgId) : readTeamMembers(group))\n .then((rows) => {\n if (cancelled) return;\n const others = rows.filter((m) => m.userId !== me);\n setMembers(others);\n // All on by default, except people who already have it.\n setTicked(\n new Set(others.filter((m) => !already.has(m.userId)).map((m) => m.userId)),\n );\n })\n .catch((err: unknown) => {\n if (!cancelled)\n setLoadError(\n err instanceof Error ? err.message : \"The member list could not be read.\",\n );\n });\n return () => {\n cancelled = true;\n };\n // `already` is read once per organization pick on purpose: a grant made here must not\n // untick the row it just granted while the results are on screen.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, orgId, group, me]);\n\n const toggle = (userId: string, on: boolean) =>\n setTicked((prev) => {\n const next = new Set(prev);\n if (on) next.add(userId);\n else next.delete(userId);\n return next;\n });\n\n const chosen = (members ?? []).filter((m) => ticked.has(m.userId));\n\n const run = async () => {\n setRunning(true);\n const next: Record<string, Outcome> = {};\n let granted = 0;\n for (const person of chosen) {\n try {\n const result = await grantPerson(person, level);\n next[person.userId] = result.success\n ? { ok: true, say: \"Shared\" }\n : { ok: false, say: result.error || \"Not shared\" };\n if (result.success) granted += 1;\n } catch (err: unknown) {\n next[person.userId] = {\n ok: false,\n say: err instanceof Error ? err.message : \"Not shared\",\n };\n }\n setOutcomes({ ...next });\n }\n setRunning(false);\n setTicked(new Set());\n if (granted > 0) onDone?.();\n };\n\n // No organization to add from: the control is absent, never a picker with nothing in it.\n if (orgs.length === 0) return null;\n\n if (!open) {\n return (\n <Button\n icon={<Users />}\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => {\n // Start on the thing's own organization when the person is in it.\n if (!orgId && defaultOrgId && orgs.some((o) => o.id === defaultOrgId))\n setOrgId(defaultOrgId);\n setOpen(true);\n }}\n >\n Add everyone in an organization or team\n </Button>\n );\n }\n\n return (\n <div\n className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\"\n data-add-everyone-in-org\n >\n <div>\n <h3 className=\"type-title mb-1\">\n Add everyone in {orgId ? orgName : \"an organization\"}\n </h3>\n <p className=\"type-secondary text-muted-foreground\">\n Each person below is given access by name. People who join later are\n not added.\n </p>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-org\" className=\"text-xs\">\n Organization\n </Label>\n <Select value={orgId} onValueChange={setOrgId} disabled={running}>\n <SelectTrigger id=\"add-everyone-org\">\n <SelectValue placeholder=\"Choose one of your organizations\" />\n </SelectTrigger>\n <SelectContent>\n {orgs.map((org) => (\n <SelectItem key={org.id} value={org.id}>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"w-3 h-3\" />\n <span>{org.name}</span>\n {detail.get(org.id) && (\n <span className=\"type-meta text-muted-foreground\">\n {detail.get(org.id)}\n </span>\n )}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {orgId && teams.length > 0 ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-group\" className=\"text-xs\">\n Who\n </Label>\n <Select value={group} onValueChange={setGroup} disabled={running}>\n <SelectTrigger id=\"add-everyone-group\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={EVERYONE}>Everyone in {orgLabel}</SelectItem>\n {teams.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.name}\n <span className=\"type-meta text-muted-foreground\"> · {t.memberCount}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {orgId ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"add-everyone-level\" className=\"text-xs\">\n They get\n </Label>\n <Select\n value={level}\n onValueChange={(v) => setOwnLevel(v as PermissionLevel)}\n disabled={running}\n >\n <SelectTrigger id=\"add-everyone-level\" data-add-everyone-level={level}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PERMISSION_LEVELS.map((l) => (\n <SelectItem key={l} value={l} disabled={(whyNotLevel?.(l) ?? null) !== null} title={whyNotLevel?.(l) ?? undefined}>\n {PERMISSION_LEVEL_SHORT_LABELS[l]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {orgId && teamsError ? (\n <p className=\"type-secondary text-destructive\">\n The teams in {orgLabel} could not be listed: {teamsError}\n <ShareErrorAlchemyMenu error={teamsError} />\n </p>\n ) : null}\n\n {orgId && loadError ? (\n <p className=\"type-secondary text-destructive\">\n The people in {orgName} could not be listed: {loadError}\n <ShareErrorAlchemyMenu error={loadError} />\n </p>\n ) : null}\n {orgId && !loadError && members === null ? (\n <div className=\"flex items-center gap-2 type-secondary text-muted-foreground\">\n <Loader2 className=\"w-3 h-3 animate-spin\" /> Listing the people in{\" \"}\n {orgName}…\n </div>\n ) : null}\n {members && members.length === 0 ? (\n <p className=\"type-secondary text-muted-foreground\">\n Nobody else is in {orgName}.\n </p>\n ) : null}\n\n {members && members.length > 0 ? (\n <ul className=\"space-y-1 max-h-56 overflow-y-auto\" aria-label={`People in ${orgName}`}>\n {members.map((m) => {\n const has = already.has(m.userId);\n const outcome = outcomes[m.userId];\n return (\n <li\n key={m.userId}\n className=\"flex items-center gap-2 type-body\"\n data-member={m.email}\n >\n <Checkbox\n size=\"sm\"\n id={`add-everyone-${m.userId}`}\n checked={ticked.has(m.userId)}\n disabled={running || has || !!outcome?.ok}\n onCheckedChange={(v) => toggle(m.userId, v === true)}\n />\n <label\n htmlFor={`add-everyone-${m.userId}`}\n className=\"flex-1 min-w-0\"\n >\n <span className=\"block truncate\">{m.name}</span>\n {m.email && m.email !== m.name ? (\n <span className=\"block truncate type-secondary text-muted-foreground\">\n {m.email}\n </span>\n ) : null}\n </label>\n {has && !outcome ? (\n <span className=\"type-secondary text-muted-foreground\">\n Already has access\n </span>\n ) : null}\n {outcome ? (\n <span\n className={`flex items-center gap-1 text-xs ${outcome.ok ? \"text-green-700 dark:text-green-400\" : \"text-destructive\"}`}\n >\n {outcome.ok ? (\n <CheckCircle className=\"w-3 h-3\" />\n ) : (\n <XCircle className=\"w-3 h-3\" />\n )}\n {outcome.say}\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : null}\n\n {members && members.length > 0 && chosen.length === 0 && !running ? (\n <p className=\"type-secondary text-muted-foreground\">\n {Object.values(outcomes).some((o) => o.ok) ||\n members.every((m) => already.has(m.userId))\n ? `Everyone listed in ${orgName} has access now.`\n : \"Tick the people to add.\"}\n </p>\n ) : null}\n {members && members.length > 0 && (chosen.length > 0 || running) ? (\n <Button\n variant=\"primary\"\n type=\"button\"\n onClick={run}\n disabled={running || chosen.length === 0}\n className=\"w-full\"\n >\n {running ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Sharing…\n </>\n ) : (\n <>\n <Users className=\"w-4 h-4 mr-2\" />\n {/* read-gate-exempt: counts the people the person ticked (the member list's failure is said by loadError), not a read */}\n Share with {chosen.length}{\" \"}\n {chosen.length === 1 ? \"person\" : \"people\"}\n </>\n )}\n </Button>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\n// features/sharing/outside/OutsideSharePanel.tsx\n//\n// THE ROUTE FROM THE REFUSAL TO THE REMEDY.\n//\n// 🚨 WHAT THIS REPLACES (lane PEEK-SHARE §3, measured not guessed). The Share\n// dialog printed the store's refusal — *\"That person is not in this\n// organization, so they cannot be given access to this table yet\"* — listed\n// three ways forward, and offered no way to take any of them. A person had to\n// leave the dialog, find an organization setting, and come back. That is a dead\n// end with good manners.\n//\n// WHAT IT IS. One section inside the ONE share dialog, for a table in the\n// record store. It draws exactly what the store says it may draw\n// (`custom.table_share_outside` answers `lane_open`, `may_invite`,\n// `my_level` and `levels`), so no control here is ever live\n// when the door behind it would refuse — and when a control is absent the panel\n// says, in a sentence, who can do the thing instead. Absent or honest, never\n// dead.\n//\n// IT IS NOT A SECOND SHARE SURFACE. The grant it produces is an ordinary\n// `iam.permissions` row on the Table, read by the same ladder as every other\n// share; the pending state is an `iam.invitations` row, the platform's one\n// invitation primitive. Nothing new was invented to hold either.\n\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n AlertTriangle,\n Check,\n Globe2,\n Link2,\n Loader2,\n MailWarning,\n RotateCw,\n Send,\n Trash2,\n} from \"lucide-react\";\n\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Input } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Select, SelectContent, SelectItem, SelectValue } from \"@ai-matrx/design-system\";\nimport { SelectTrigger } from \"@ai-matrx/design-system/controls\";\nimport { useToast } from \"./host\";\nimport { confirm } from \"./host\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\n\nimport {\n absoluteInviteUrl,\n shareWithOutsidePerson,\n readOutsideShare,\n resendOutside,\n revokeOutside,\n type OutsideShareState,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** The one sentence a shut lane gets. Exported so the test asserts the words. */\nexport const LANE_CLOSED_SAY =\n \"This organization's administrator has turned off sharing with people outside it.\";\n\nexport interface OutsideSharePanelProps {\n organizationId: string;\n tableId: string;\n tableName: string;\n /**\n * 🚨 SO THE LIST ABOVE CANNOT CONTRADICT THE ROWS BELOW (FIX-10C, VERIFIER-10\n * F13). The grant list up the page knows only about grants, which is correct\n * and was still how \"Not shared with anyone\" came to stand directly over an\n * invited person. This panel tells its host how many people are invited and\n * not yet joined; the host passes that to the grant list's empty state.\n */\n onPendingChange?: ((count: number) => void) | undefined;\n /**\n * An address already inside the organization is GRANTED the table rather than\n * invited (FIX-10C, VERIFIER-10 F7), and that grant belongs in the list at the\n * top of this dialog, not here. So the host is told to re-read it — otherwise\n * the person gets a sentence saying it happened and an unchanged screen.\n */\n onGranted?: (() => void) | undefined;\n}\n\nexport function OutsideSharePanel({\n organizationId,\n tableId,\n tableName,\n onPendingChange,\n onGranted,\n}: OutsideSharePanelProps) {\n const { toast } = useToast();\n const [state, setState] = useState<OutsideShareState | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [level, setLevel] = useState(\"viewer\");\n /** Which row's link was just copied, so the button can say so for a moment. */\n const [copied, setCopied] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n setLoadError(null);\n try {\n const answer = await readOutsideShare(organizationId, tableId);\n setState(answer);\n // The store already capped the list at what this person may give, so the\n // picker's default is simply the lowest rung it returned.\n setLevel((current) =>\n answer.levels.some((l) => l.level === current)\n ? current\n : (answer.levels[0]?.level ?? \"viewer\"),\n );\n } catch (error) {\n // 🚨 A FAILED READ IS NOT A FACT. It does not mean the lane is shut; it\n // means nobody could look. Same rule as the record store's own switch.\n setState(null);\n setLoadError(error instanceof Error ? error.message : String(error));\n }\n }, [organizationId, tableId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // A read that FAILED says nothing about how many are pending, so it reports\n // zero rather than a guess — the same rule the panel's own error state obeys.\n useEffect(() => {\n onPendingChange?.((state?.invitations ?? []).filter((row) => !row.joined).length);\n }, [state, onPendingChange]);\n\n /**\n * 🚨 PUTTING THE LINK IN SOMEBODY'S HAND IS THE ORDINARY CASE, NOT A FALLBACK.\n * A plumber texts his customer the link. So this control is drawn beside every\n * pending row whether or not email works here, and it goes through THE ONE copy\n * primitive — which, when the browser refuses to write the clipboard, puts the\n * text in front of the person instead of lying that it copied.\n */\n const copyLink = useCallback(\n async (invitationId: string, acceptPath: string, who: string) => {\n const url = absoluteInviteUrl(acceptPath);\n // It routes its own terminal failure to the manual-copy dialog, which puts\n // the text in front of the person — so a `false` here means the copy has\n // NOT happened and saying \"Copied\" would be a lie.\n const ok = await copyText(url).then((r: unknown) => r !== false, () => false);\n if (!ok) return;\n setCopied(invitationId);\n toast({ title: `Link copied. Send it to ${who} however you like.` });\n window.setTimeout(\n () => setCopied((c) => (c === invitationId ? null : c)),\n 2000,\n );\n },\n [toast],\n );\n\n const run = async (\n key: string,\n work: () => Promise<{ say: string; delivery?: { say: string } | null | undefined }>,\n ) => {\n setBusy(key);\n try {\n const answer = await work();\n // TWO facts, not one: what happened to the share, and what happened to the\n // message. Collapsing them is how \"invited\" came to mean \"told\".\n toast({ title: answer.say, description: answer.delivery?.say });\n await refresh();\n } catch (error) {\n toast({\n title: \"That did not happen\",\n description: error instanceof Error ? error.message : String(error),\n variant: \"destructive\",\n });\n } finally {\n setBusy(null);\n }\n };\n\n if (loadError) {\n return (\n <div className=\"rounded-lg border border-destructive/20 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-destructive\">\n We could not check who outside this organization can see {tableName}\n <ShareErrorAlchemyMenu />\n </p>\n <p className=\"mt-0.5 text-xs text-destructive/80\">\n Nobody was added or removed. This does not mean sharing outside is switched\n off — we simply could not look.\n </p>\n <p className=\"mt-1 break-words text-xs text-muted-foreground\">{loadError}</p>\n </div>\n </div>\n <Button variant=\"outline\" className=\"mt-2\" onClick={() => void refresh()}>\n Try again\n </Button>\n </div>\n );\n }\n\n if (!state) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\" aria-busy=\"true\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Checking who outside this organization can see {tableName}…</span>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3 rounded-lg border p-3\">\n <div className=\"flex items-start gap-2\">\n <Globe2 className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">People outside this organization</h3>\n {/* 🚨 NAMING A PERSON IS THE ONLY ACT (owner ruling, SHARE-GATE-OFF,\n 2026-09-23). There is no switch to press here: sharing outside is on\n by default, and an organization administrator who turned it off did\n so on purpose in settings. So a shut lane gets ONE sentence and no\n control — never a button in front of the invite. */}\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {state.lane_open ? state.say : LANE_CLOSED_SAY}\n </p>\n </div>\n </div>\n\n {/* 🚨 WHAT THIS SERVER CAN ACTUALLY DO ABOUT EMAIL, said BEFORE anybody\n presses Invite — never a promise the server cannot keep. The store\n answers yes / no / unknown; only the two that are not \"yes\" get a\n notice, because \"it emails them, and you can also copy the link\"\n already reads on the invite row itself. */}\n {state.lane_open &&\n state.may_invite &&\n state.email_delivery?.answer !== \"yes\" ? (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 p-2\">\n <MailWarning className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-xs text-muted-foreground\">\n {state.email_say}\n </p>\n </div>\n ) : null}\n\n {/* THE INVITE. */}\n {state.lane_open && state.may_invite ? (\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-end\">\n <div className=\"min-w-0 flex-1\">\n <Label htmlFor=\"outside-email\" className=\"text-xs\">\n Their email address\n </Label>\n <Input\n id=\"outside-email\"\n type=\"email\"\n placeholder=\"name@theircompany.com\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n />\n </div>\n <div className=\"sm:w-44\">\n <Label htmlFor=\"outside-level\" className=\"text-xs\">\n They can\n </Label>\n <Select value={level} onValueChange={setLevel}>\n <SelectTrigger id=\"outside-level\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* Exactly the rungs the store said this person may give. */}\n {state.levels.map((l) => (\n <SelectItem key={l.level} value={l.level}>\n {l.means}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <Button\n icon={busy === \"invite\" ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Send />\n )}\n variant=\"primary\"\n disabled={!email.trim() || busy === \"invite\"}\n onClick={() =>\n void run(\"invite\", async () => {\n const answer = await shareWithOutsidePerson(organizationId, tableId, email.trim(), level);\n setEmail(\"\");\n // An existing account (inside or outside the organization) was\n // given the table outright — the row for that lives in the grant\n // list above, so ask the host to re-read it (FIX-10C F7,\n // MOVE-AND-OUTSIDER). Only an address with no account is invited.\n if (answer.granted) onGranted?.();\n return answer;\n })\n }\n >\n Share\n </Button>\n </div>\n ) : null}\n\n {/* WHO IS OUT THERE, and which of them has actually joined. */}\n {state.invitations.length > 0 ? (\n <ul className=\"divide-y rounded-md border\">\n {state.invitations.map((row) => (\n <li key={row.invitation_id} className=\"flex items-start gap-2 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"truncate text-sm font-medium\">{row.email}</span>\n <span\n className={\n row.joined\n ? \"rounded-full bg-primary/10 px-1.5 py-0.5 text-xs\"\n : \"rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\"\n }\n >\n {row.joined ? row.level_label : \"Invited, not yet joined\"}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{row.say}</p>\n </div>\n {state.may_invite ? (\n <div className=\"flex flex-shrink-0 gap-1\">\n {/* 🚨 COPY THE LINK — beside the pending row, always, whether\n or not email works here. The real case is a plumber texting\n his customer; the email is the convenience, not the other\n way round. Absent only when there is no link to give: an\n accepted row has nothing left to open. */}\n {row.accept_path ? (\n <Button\n icon={copied === row.invitation_id ? (\n <Check />\n ) : (\n <Link2 />\n )}\n variant=\"quiet\"\n title=\"Copy invitation link\"\n onClick={() =>\n void copyLink(\n row.invitation_id,\n row.accept_path!,\n row.email,\n )\n }\n >\n <span className=\"text-xs\">\n {copied === row.invitation_id ? \"Copied\" : \"Copy link\"}\n </span>\n </Button>\n ) : null}\n {!row.joined ? (\n <Button\n icon={busy === `resend:${row.invitation_id}` ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <RotateCw />\n )} aria-label=\"Send a fresh link\"\n variant=\"quiet\"\n title=\"Send a fresh link\"\n disabled={busy === `resend:${row.invitation_id}`}\n onClick={() =>\n void run(`resend:${row.invitation_id}`, () =>\n resendOutside(organizationId, row.invitation_id),\n )\n }\n />\n ) : null}\n <Button\n icon={busy === `revoke:${row.invitation_id}` ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Trash2 />\n )} aria-label={row.joined ? \"Take their access away\" : \"Withdraw the invitation\"}\n variant=\"quiet\"\n title={row.joined ? \"Take their access away\" : \"Withdraw the invitation\"}\n disabled={busy === `revoke:${row.invitation_id}`}\n onClick={() =>\n void (async () => {\n // A destructive click names its consequence before it happens.\n const ok = await confirm({\n title: row.joined\n ? `Take ${row.email}'s access to ${tableName} away?`\n : `Withdraw ${row.email}'s invitation?`,\n description: row.joined\n ? `They lose ${tableName} immediately — anything they have open refuses the next time it asks — and, because this table is the only reason they can reach this organization at all, they lose that too. You can invite them again afterwards.`\n : \"Their link stops working. They never had access, so there is nothing to take away.\",\n confirmLabel: row.joined ? \"Take it away\" : \"Withdraw\",\n variant: \"destructive\",\n });\n if (!ok) return;\n await run(`revoke:${row.invitation_id}`, () =>\n revokeOutside(organizationId, row.invitation_id),\n );\n })()\n }\n />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\n// @ai-matrx/sharing/react — WhoCouldSeeOn — \"Who could see this on…\" (lane CLOSE-SHARE, acceptance test 15).\n//\n// A person with Full access picks a past moment; the store replays History (custom.who_could_see_on →\n// history.who_could_see) and answers in names, each marked when they no longer have access. Refusals (History was not\n// recording then, not Full access) are the store's own sentence, shown as is.\n\nimport { useState } from \"react\";\nimport { History, Loader2 } from \"lucide-react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { DateTimeField } from \"@ai-matrx/design-system/controls\";\n\nimport { createClient, PERMISSION_LEVEL_SHORT_LABELS } from \"@ai-matrx/sharing/core\";\nimport type { PermissionLevel } from \"@ai-matrx/sharing/core\";\n\ntype StoreCaller = { rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }> };\nfunction custom(): StoreCaller {\n return (createClient() as unknown as { schema(name: string): StoreCaller }).schema(\"custom\");\n}\n\ninterface PastViewer {\n kind: string;\n id: string | null;\n name: string | null;\n email: string | null;\n level: string | null;\n via: string;\n has_access_now: boolean | null;\n}\n\nexport function WhoCouldSeeOn({ recordId }: { recordId: string }) {\n const [at, setAt] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [people, setPeople] = useState<PastViewer[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n async function ask() {\n setBusy(true);\n setError(null);\n const { data, error: failed } = await custom().rpc(\"who_could_see_on\", { p_record_id: recordId, p_at: new Date(at).toISOString() });\n setBusy(false);\n const answer = data as { success?: boolean; error?: string; people?: PastViewer[] } | null;\n if (failed || !answer?.success) {\n setPeople(null);\n setError(failed?.message ?? answer?.error ?? \"That moment could not be replayed.\");\n return;\n }\n setPeople(answer.people ?? []);\n }\n\n return (\n <section className=\"mt-3 flex flex-col gap-1.5 border-t border-border pt-3\" data-who-could-see-on={recordId}>\n <span className=\"flex items-center gap-1 text-xs font-medium\">\n <History className=\"h-3.5 w-3.5\" />\n Who could see this on…\n </span>\n <div className=\"flex items-center gap-1\">\n <DateTimeField\n aria-label=\"Moment to ask about\"\n value={at}\n onValueChange={(v) => setAt(v ?? \"\")}\n className=\"min-w-0 flex-1\"\n />\n <Button icon={busy ? <Loader2 className=\"animate-spin\" /> : null} variant=\"outline\" disabled={busy || at === \"\"} onClick={() => void ask()} data-who-could-see-ask=\"\">\n Ask\n </Button>\n </div>\n {people ? (\n people.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">Nobody could see it then.</p>\n ) : (\n <ul className=\"flex flex-col gap-0.5\" data-who-could-see-list=\"\">\n {people.map((p) => (\n <li key={`${p.kind}:${p.id ?? \"public\"}`} className=\"flex items-center justify-between gap-2 text-xs\" data-who-could-see-person={p.id ?? \"\"}>\n <span className=\"min-w-0 truncate\">\n {p.name ?? p.email ?? \"Someone\"}\n <span className=\"text-muted-foreground\"> · {p.via}</span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1 text-muted-foreground\">\n {p.level ? (PERMISSION_LEVEL_SHORT_LABELS[p.level as PermissionLevel] ?? p.level) : null}\n {p.has_access_now === false ? <span className=\"rounded border border-border px-1\" data-who-could-see-lost=\"\">No access now</span> : null}\n </span>\n </li>\n ))}\n </ul>\n )\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-xs text-destructive\" data-who-could-see-error=\"\">\n {error}\n </p>\n ) : null}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/OrgAvailabilityNote.tsx\n *\n * WHAT AN ORGANIZATION ROW IS NOW (SHARE-PEOPLE-ONLY, chair ruling 2026-09-25). A share names a\n * person. An organization grantee is written only as organization AVAILABILITY: an agent bound\n * to an organization's surface, an item contributed to its library, or the HR directory. That is\n * organization configuration, not something this dialog grants. The row still gives access,\n * though, so the dialog says so in one read-only line and never hides it. It is changed where it\n * was set, in the organization.\n */\n\nimport React from \"react\";\nimport { Building2 } from \"lucide-react\";\nimport type { PermissionWithDetails } from \"@ai-matrx/sharing/core\";\n\nconst DEFAULT_VERB: Record<string, string> = {\n viewer: \"view\",\n commenter: \"comment on\",\n editor: \"edit\",\n admin: \"manage\",\n};\n\nexport function OrgAvailabilityNote({\n permissions,\n organizationDefault,\n}: {\n permissions: PermissionWithDetails[];\n /**\n * SHARE-TAILS (chair ruling 2026-09-25): a thing nobody set to \"Only me\" is the organization's\n * default, and every member reaches it without a share. \"Not shared with anyone\" above is true\n * of shares; this line says who else really reaches it. Under \"Only me\" (access ladder T-36,\n * chair ruling 2026-10-01) members still open it by link but no longer find it in lists, so the\n * door sends no default and the lane control's \"Only me\" hint says the rest.\n */\n organizationDefault?: {\n level: string;\n organizationName: string;\n organizationId?: string | undefined;\n } | null;\n}) {\n // SHARE-LANE-CONTROL: \"Everyone in <org>\" on a record-store thing is written as that\n // organization's own availability row. It IS the default said in the line above, not a second\n // organization, so it is not listed again as \"also available\".\n const orgs = permissions.filter(\n (p) =>\n p.grantedToOrganizationId &&\n !(\n organizationDefault?.organizationId &&\n p.grantedToOrganizationId === organizationDefault.organizationId\n ),\n );\n const defaultLine = organizationDefault ? (\n <p\n className=\"mt-2 flex items-start gap-1.5 text-xs text-muted-foreground\"\n data-organization-default\n >\n <Building2 className=\"w-3 h-3 mt-0.5 flex-shrink-0\" />\n <span>\n {/* Not a share: it is chosen under \"Who can see this\" above. */}\n Everyone in {organizationDefault.organizationName} can{\" \"}\n {DEFAULT_VERB[organizationDefault.level] ?? \"open\"} this by default.\n </span>\n </p>\n ) : null;\n if (orgs.length === 0) return defaultLine;\n const names = orgs.map(\n (p) => p.grantedToOrganization?.name ?? \"an organization\",\n );\n return (\n <>\n {defaultLine}\n <p\n className=\"mt-2 flex items-start gap-1.5 text-xs text-muted-foreground\"\n data-org-availability\n >\n <Building2 className=\"w-3 h-3 mt-0.5 flex-shrink-0\" />\n <span>\n {/* Not a share: it is set, and changed, in that organization. */}\n Also open to everyone in {names.join(\", \")} by its settings.\n </span>\n </p>\n </>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/WhoCanSeeThis.tsx\n *\n * \"WHO CAN SEE THIS\" — THE LANE CONTROL AT THE TOP OF THE SHARE DIALOG'S PEOPLE TAB\n * (lane SHARE-LANE-CONTROL, VERIFIER-23 item 3). Record-store things only; every other kind gets\n * its row controls (\"Shown to\", \"Published to the web\") in the same place through `row`.\n *\n * The record store has had the door since lane SHARE (`custom.share_lane_set`: mine |\n * organization | world). Under the access ladder law (T-36, chair ruling 2026-10-01) \"mine\" is the\n * hide it is, \"Shown to: Only me\": the thing leaves coworkers' lists and still opens for members\n * who have the link. It is never a lock; real separation is another organization or a\n * Confidential/Private Table type. The words are `SHOWN_TO_WORDS.only_me`, the ones RowControls uses.\n * Nothing on screen reached it: a door with no control is a dead end. This is that control, ONE\n * primitive every share host renders (ShareModal, ShareModalWindow, AgentSharePanel,\n * SiteAccessWorkspace) from `useSharing().whoCanSee` — it never reads or writes on its own.\n *\n * · Only me — lane mine: hidden from coworkers' lists; opens by link.\n * · Everyone in <organization> — the organization's default, at the level it grants.\n * · Anyone with the link — the world lane, drawn ONLY where it would be accepted\n * (`world_open`) or is already the state. Otherwise absent,\n * never disabled-looking.\n *\n * The current state is always shown. A person who cannot change sharing sees it as one line of\n * text, not as buttons. Hiding takes nobody's access away, so it applies without a confirm.\n * Named people are never touched.\n */\n\nimport React, { useState } from \"react\";\nimport { Building2, Check, EyeOff, Globe, Loader2 } from \"lucide-react\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { InfoHint } from \"./host\";\nimport { SHOWN_TO_WORDS } from \"@ai-matrx/sharing/core\";\nimport { useNavTree } from \"./host\";\nimport type {\n LaneChoice,\n WhoCanSee,\n} from \"@ai-matrx/sharing/core\";\nimport type { ShareActionResult } from \"@ai-matrx/sharing/core\";\nimport { RowControls, type RowControlsProps } from \"./RowControls\";\n\nconst LEVEL_WORD: Record<string, string> = {\n viewer: \"Viewer\",\n commenter: \"Commenter\",\n editor: \"Editor\",\n admin: \"Admin\",\n};\n\nexport interface WhoCanSeeThisProps {\n /** `useSharing().whoCanSee`. Null → the kind has no lane door, and nothing is drawn. */\n whoCanSee: WhoCanSee | null;\n /** The person may change this thing's sharing (the host's owner/Admin answer). */\n canChange: boolean;\n /** `useSharing().setWhoCanSee`. */\n onChoose: (choice: LaneChoice) => Promise<ShareActionResult>;\n /**\n * Every kind outside the record store: its row controls (\"Shown to\", \"Published to the web\"),\n * drawn in this same place. `RowControls` draws nothing for a Private, Confidential or child\n * record (access ladder T-13 phase 5).\n */\n row?: Omit<RowControlsProps, \"canChange\">;\n}\n\ninterface Option {\n choice: LaneChoice;\n label: string;\n says: string;\n /** A definition the label cannot carry, behind the tooltip slot (≤ 140). */\n hint?: string | undefined;\n icon: typeof Globe;\n}\n\n/** The truth of \"Only me\" on an Organization table (access ladder T-36): it hides, never locks. */\nconst ONLY_ME_HINT = \"Hidden from members' lists. Members with the link can still open it.\";\n\nexport function WhoCanSeeThis({\n whoCanSee,\n canChange,\n onChoose,\n row,\n}: WhoCanSeeThisProps) {\n const { orgs } = useNavTree();\n const [pending, setPending] = useState<LaneChoice | null>(null);\n const [said, setSaid] = useState<{ ok: boolean; text: string } | null>(null);\n\n if (!whoCanSee) return row ? <RowControls {...row} canChange={canChange} /> : null;\n\n const orgName =\n whoCanSee.organizationName ??\n (whoCanSee.organizationId\n ? orgs.find((o) => o.id === whoCanSee.organizationId)?.name\n : undefined) ??\n \"this organization\";\n const level = whoCanSee.memberDefaultLevel\n ? LEVEL_WORD[whoCanSee.memberDefaultLevel] ?? whoCanSee.memberDefaultLevel\n : null;\n\n const options: Option[] = [\n {\n choice: \"mine\",\n label: SHOWN_TO_WORDS.only_me.label,\n says: SHOWN_TO_WORDS.only_me.says,\n hint: ONLY_ME_HINT,\n icon: EyeOff,\n },\n {\n choice: \"organization\",\n label: `Everyone in ${orgName}`,\n says: level\n ? `Every member, as ${level}. This is the organization's default.`\n : \"Every member. This is the organization's default.\",\n icon: Building2,\n },\n ];\n if (whoCanSee.worldOffered || whoCanSee.choice === \"world\") {\n options.push({\n choice: \"world\",\n label: \"Anyone with the link\",\n says: \"Out in the world, findable by the link and nothing else.\",\n icon: Globe,\n });\n }\n const current = options.find((o) => o.choice === whoCanSee.choice) ?? options[options.length - 1]!;\n\n const apply = async (choice: LaneChoice) => {\n setPending(choice);\n setSaid(null);\n try {\n const result = await onChoose(choice);\n setSaid(\n result.success\n ? { ok: true, text: result.message ?? \"Saved.\" }\n : { ok: false, text: result.error ?? \"That could not be changed.\" },\n );\n } finally {\n setPending(null);\n }\n };\n\n const pick = (choice: LaneChoice) => {\n if (choice === whoCanSee.choice || pending) return;\n void apply(choice);\n };\n\n return (\n <section\n className=\"space-y-1.5 p-3 bg-muted/30 rounded-lg border\"\n data-who-can-see\n data-lane={whoCanSee.choice}\n >\n <p className=\"text-xs font-medium\">Who can see this</p>\n\n {canChange ? (\n <div\n role=\"radiogroup\"\n aria-label=\"Who can see this\"\n className=\"grid grid-cols-1 gap-1.5 sm:grid-flow-col sm:auto-cols-fr\"\n >\n {options.map((o) => {\n const Icon = o.icon;\n const selected = o.choice === whoCanSee.choice;\n return (\n <div key={o.choice} className=\"relative min-w-0\">\n {/* ui-exception: moved verbatim from the web share sheet; restyling onto design-system Button is its own UI change */}\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-lane-choice={o.choice}\n onClick={() => pick(o.choice)}\n className={cn(\n \"flex w-full min-w-0 items-start gap-2 rounded-md border p-2 text-left transition-colors\",\n o.hint && \"pr-7\",\n selected\n ? \"border-primary bg-background\"\n : \"border-transparent hover:bg-background/60\",\n )}\n >\n {pending === o.choice ? (\n <Loader2 className=\"mt-0.5 h-4 w-4 flex-shrink-0 animate-spin text-primary\" />\n ) : (\n <Icon\n className={cn(\n \"mt-0.5 h-4 w-4 flex-shrink-0\",\n selected ? \"text-primary\" : \"text-muted-foreground\",\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1 text-sm font-medium\">\n <span className=\"min-w-0 break-words\">{o.label}</span>\n {selected && <Check className=\"h-3.5 w-3.5 flex-shrink-0 text-primary\" />}\n </span>\n <span className=\"block text-xs text-muted-foreground\">{o.says}</span>\n </span>\n </button>\n {/* Beside the radio, never inside it: a button may not hold a button. */}\n {o.hint && (\n <InfoHint\n text={o.hint}\n label={`About ${o.label}`}\n className=\"absolute right-2 top-2.5\"\n />\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm\" data-who-can-see-text>\n <span className=\"font-medium\">{current.label}.</span>{\" \"}\n <span className=\"text-xs text-muted-foreground\">{current.says}</span>\n {current.hint && <InfoHint text={current.hint} label={`About ${current.label}`} />}\n </p>\n )}\n\n {said && (\n <p\n className={cn(\n \"text-xs\",\n said.ok ? \"text-green-700 dark:text-green-300\" : \"text-destructive\",\n )}\n data-lane-said\n >\n {said.text}\n </p>\n )}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * features/sharing/components/RowControls.tsx\n *\n * THE RECORD'S ROW CONTROLS — exactly the access ladder's Words table, nothing else\n * (common-docs/policies/access-ladder.md, T-13 phase 5):\n *\n * Shown to Only me · My team · Everyone · Everyone on AI Matrx\n * Which lists show it to people who can already open it — never a lock.\n * Published to the web on · off — anyone, signed in or not, opens it at its address.\n * + Indexed by search engines, on the same line (T-12), only while published.\n *\n * A Private, Confidential or child record has neither, so nothing is drawn: the type's capabilities\n * (`get_share_capabilities` → `shownToOffered`, `publishLane`) decide, never a guess. It is still\n * shared by Anyone link, secure link or with people — those live in their own tabs.\n * A person who cannot change sharing sees the current state as text, never as dead buttons.\n */\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { shareCopyNotify } from \"./host\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Check, Copy, Loader2 } from \"lucide-react\";\nimport { Switch } from \"./ui/switch\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { ToggleGroup, ToggleGroupItem } from \"./ui/toggle-group\";\nimport { useToast } from \"./host\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport {\n getShareCapabilities,\n type ShareCapabilities,\n} from \"@ai-matrx/sharing/core\";\nimport { publicResourceUrl } from \"@ai-matrx/sharing/core\";\nimport { getShareableResource } from \"@ai-matrx/sharing/core\";\nimport { anyoneReachWords } from \"./PublicAccessTab\";\nimport type { ResourceType, ShareActionResult } from \"@ai-matrx/sharing/core\";\nimport type { ShownTo } from \"@ai-matrx/sharing/core\";\nimport { SHOWN_TO_ORDER, SHOWN_TO_WORDS } from \"@ai-matrx/sharing/core\";\nimport { SearchEngineIndexedSwitch } from \"./SearchEngineIndexedSwitch\";\n\nimport { ShareErrorAlchemyMenu } from \"./host\";\n/** Every sentence the slot under \"Shown to\" can hold; all are laid in one grid cell. */\nconst SAYS_SLOT_KEYS: ReadonlyArray<ShownTo | \"default\"> = [...SHOWN_TO_ORDER, \"default\"];\n\nexport interface RowControlsProps {\n resourceType: ResourceType;\n resourceId: string;\n /** The person may change this thing's sharing. */\n canChange: boolean;\n /** `useSharing().shownTo` — undefined when the type does not carry it. */\n shownTo: ShownTo | null | undefined;\n /** `useSharing().isPublic` — published to the web. */\n isPublic: boolean;\n /** `useSharing().childRecord` — a child follows its parent: nothing is drawn. */\n childRecord?: boolean | undefined;\n /**\n * `false` when this thing is never published to the web although its type is: a whole Table is a\n * `record` too, and only a ROW has a page (/p/e/record/<id>), so a Table draws no publish switch\n * at all (access ladder T-40; the database refuses it too). Omitted → the type decides.\n */\n publishable?: boolean | undefined;\n onSetShownTo: (next: ShownTo | null) => Promise<ShareActionResult>;\n onPublish: () => Promise<ShareActionResult>;\n onStopPublishing: () => Promise<ShareActionResult>;\n}\n\nexport function RowControls({\n resourceType,\n resourceId,\n canChange,\n shownTo,\n isPublic,\n childRecord = false,\n publishable = true,\n onSetShownTo,\n onPublish,\n onStopPublishing,\n}: RowControlsProps) {\n const { copyText } = useClipboard({\n notify: shareCopyNotify,\n });\n const { toast } = useToast();\n const [caps, setCaps] = useState<ShareCapabilities | null>(null);\n const [capsError, setCapsError] = useState<string | null>(null);\n const [busy, setBusy] = useState<\"shown\" | \"publish\" | null>(null);\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n let live = true;\n setCapsError(null);\n getShareCapabilities(resourceType)\n .then((c) => live && setCaps(c))\n .catch((e: unknown) => live && setCapsError(extractErrorMessage(e)));\n return () => {\n live = false;\n };\n }, [resourceType]);\n\n const publicUrl = publicResourceUrl(resourceType, resourceId);\n\n const copyAddress = useCallback(async () => {\n if (!publicUrl) return;\n if (!(await copyText(publicUrl, undefined, \"Couldn't copy the web address\"))) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [publicUrl, toast]);\n\n if (capsError) {\n return (\n <p className=\"rounded-lg border border-destructive/20 bg-destructive/10 p-3 text-xs text-destructive-ink\">\n Couldn't read this item's sharing options: {capsError}\n <ShareErrorAlchemyMenu error={capsError} /></p>\n );\n }\n if (childRecord) return null;\n // THE BAR'S PLACE IS HELD WHILE ITS OPTIONS ARE READ (member walk 2026-10-10: \"Shown to\" arrived late\n // and pushed the dialog's content down). The reserve is the bar's own box, one row tall, invisible.\n if (!caps) {\n return (\n <section aria-hidden=\"true\" className=\"invisible space-y-2 rounded-lg border p-3\" data-row-controls-reserved=\"\">\n <div className=\"flex h-8 items-center\" />\n </section>\n );\n }\n\n const showShownTo = caps.shownToOffered && shownTo !== undefined;\n const showPublish = publishable && caps.publishLane !== null;\n if (!showShownTo && !showPublish) return null;\n\n // \"Everyone on AI Matrx\" is only valid on a published record; it stays listed while it is the\n // current value so the state is never hidden.\n const shownChoices = SHOWN_TO_ORDER.filter(\n (v) => v !== \"everyone_on_ai_matrx\" || isPublic || shownTo === v,\n );\n\n const publishSays =\n caps.publishLane === \"card\"\n ? \"Only its card — the name, description and inputs — opens for anyone. What is inside stays in its organization.\"\n : // Never promise a signed-out read the type cannot deliver (no page of its own).\n anyoneReachWords(\n getShareableResource(resourceType)?.displayLabel?.toLowerCase() ?? \"item\",\n { publicPage: Boolean(publicUrl), noLoginLink: caps.isLinkShareable },\n );\n\n const chooseShownTo = async (next: ShownTo) => {\n if (!canChange || next === shownTo || busy) return;\n setBusy(\"shown\");\n try {\n const result = await onSetShownTo(next);\n if (result.success === false) {\n toast({\n title: 'Couldn\\'t change \"Shown to\"',\n description: result.error || \"Please try again\",\n variant: \"destructive\",\n });\n }\n } finally {\n setBusy(null);\n }\n };\n\n const togglePublish = async (on: boolean) => {\n if (!canChange || busy) return;\n setBusy(\"publish\");\n try {\n const result = on ? await onPublish() : await onStopPublishing();\n toast(\n result.success === false\n ? {\n title: on\n ? \"Couldn't publish it to the web\"\n : \"Couldn't stop publishing it to the web\",\n description: result.error || \"Please try again\",\n variant: \"destructive\",\n }\n : {\n title: on ? \"Published to the web\" : \"No longer published to the web\",\n description: on\n ? publishSays\n : \"People outside its organization can no longer open it, unless it is shared with them.\",\n },\n );\n } finally {\n setBusy(null);\n }\n };\n\n\n return (\n <section\n className=\"space-y-2 rounded-lg border bg-muted/30 p-3\"\n data-row-controls\n data-published={isPublic ? \"true\" : \"false\"}\n >\n {showShownTo && (\n <div className=\"flex flex-wrap items-center justify-between gap-2\" data-shown-to={shownTo ?? \"default\"}>\n <span className=\"text-xs font-medium\">Shown to</span>\n {canChange ? (\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n variant=\"outline\"\n value={shownTo ?? \"\"}\n onValueChange={(v) => v && void chooseShownTo(v as ShownTo)}\n aria-label=\"Shown to\"\n className=\"flex-wrap justify-end\"\n >\n {shownChoices.map((v) => (\n <ToggleGroupItem\n key={v}\n value={v}\n aria-label={SHOWN_TO_WORDS[v].label}\n title={SHOWN_TO_WORDS[v].says}\n className=\"h-7 px-2 text-xs data-[state=on]:border-primary data-[state=on]:bg-primary/10 data-[state=on]:text-primary-ink\"\n >\n {SHOWN_TO_WORDS[v].label}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {shownTo ? SHOWN_TO_WORDS[shownTo].label : \"The default for this type\"}\n </span>\n )}\n </div>\n )}\n {showShownTo && (\n // ZERO LAYOUT SHIFT (Arman 2026-10-07): the sentence under \"Shown to\" changes with every\n // choice and each one wraps to a different number of lines on a phone. The slot is a\n // one-cell grid holding EVERY sentence, only the current one visible, so its height is the\n // tallest one's at any width and nothing below it ever moves. The spinner's place is held\n // too (invisible, never removed).\n <div className=\"grid text-xs text-muted-foreground\" data-shown-to-says-slot=\"\">\n {SAYS_SLOT_KEYS.map((v) => {\n const current = (shownTo ?? \"default\") === v;\n return (\n <p\n key={v}\n className={cn(\"col-start-1 row-start-1\", !current && \"invisible\")}\n aria-hidden={!current}\n data-shown-to-says={v}\n >\n {v === \"default\"\n ? \"Not set — the default for this type applies.\"\n : SHOWN_TO_WORDS[v].says}{\" \"}\n A list setting, never who may open it.\n <Loader2\n className={cn(\n \"ml-1 inline h-3 w-3 animate-spin\",\n !(current && busy === \"shown\") && \"invisible\",\n )}\n />\n </p>\n );\n })}\n </div>\n )}\n\n {showPublish && (\n <div className={cn(\"space-y-1.5\", showShownTo && \"border-t pt-2\")}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Published to the web</span>\n <span className=\"flex items-center gap-3\">\n <SearchEngineIndexedSwitch\n resourceType={resourceType}\n resourceId={resourceId}\n publishedHint={isPublic}\n />\n {busy === \"publish\" && (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n )}\n {canChange ? (\n <Switch\n checked={isPublic}\n onCheckedChange={(on) => void togglePublish(on)}\n disabled={busy === \"publish\"}\n aria-label=\"Published to the web\"\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">{isPublic ? \"On\" : \"Off\"}</span>\n )}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {isPublic ? publishSays : `When on: ${publishSays}`}\n </p>\n {isPublic && publicUrl && (\n <div className=\"flex items-center gap-1.5 rounded-md border bg-background p-1.5\">\n <span className=\"min-w-0 flex-1 truncate px-1 font-mono text-xs\">{publicUrl}</span>\n <Button\n icon={copied ? <Check /> : <Copy />} aria-label=\"Copy web address\"\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => void copyAddress()}\n title=\"Copy web address\"\n />\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","\"use client\";\n\n/**\n * THE ONE CONTROL (2026-10-05, wave 1B): Switch is the controls' switch — a 20px track inside\n * the 28px control box, so it lines up with every control beside it. NO size (`size=` is gone).\n * Codemod + census: `scripts/ui-rollout/doors-codemod.mjs`.\n *\n * `SwitchLegacy` is FROZEN — the pre-rollout compact 16px track (the package-root Switch bound\n * to `size=\"sm\"`), for the areas the rollout may not touch (the agent builder, other lanes'\n * files). Never import it in new code; each importer is listed in the census.\n */\n\nimport { Switch as PackageSwitch, type SwitchProps as PackageSwitchProps } from \"@ai-matrx/design-system\";\nimport * as React from \"react\";\n\nexport { Switch } from \"@ai-matrx/design-system/controls\";\nexport type { SwitchProps } from \"@ai-matrx/design-system/controls\";\n\nconst SwitchLegacy = React.forwardRef<\n React.ComponentRef<typeof PackageSwitch>,\n PackageSwitchProps\n>(({ size = \"sm\", ...props }, ref) => (\n <PackageSwitch ref={ref} size={size} {...props} />\n));\nSwitchLegacy.displayName = \"SwitchLegacy\";\n\nexport { SwitchLegacy };\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — ToggleGroup lives in `@ai-matrx/design-system`,\n * in the same module as `Toggle` (see `components/ui/toggle.tsx` for why the\n * two could not stay apart: they share one React context).\n *\n * `size`/`variant` declared on the group are inherited by every item.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n ToggleGroup,\n ToggleGroupItem,\n type ToggleGroupItemProps,\n type ToggleGroupProps,\n} from \"@ai-matrx/design-system\";\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Alert, AlertDescription } from \"./ui/alert\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { Permission, ResourceType } from \"@ai-matrx/sharing/core\";\nimport { ShareLinkPanel } from \"./ShareLinkPanel\";\nimport { Skeleton } from \"@ai-matrx/design-system\";\nimport { extractErrorMessage } from \"@ai-matrx/sharing/core\";\nimport { getShareCapabilities } from \"@ai-matrx/sharing/core\";\nimport { CopyButtons } from \"./host\";\nimport { sharingLocation, type SharingCopyContext } from \"@ai-matrx/sharing/core\";\n\ninterface PublicAccessTabProps {\n /** The public permission row from the permissions table, if any (kept for hosts' tab dot). */\n publicPermission?: Permission | undefined;\n isOwner: boolean;\n resourceType: ResourceType;\n resourceId: string;\n resourceName: string;\n /**\n * Identity + the page's leading KPIs, mirrored into this tab's payloads so a\n * copied answer is interpretable on its own.\n */\n copy?: SharingCopyContext | undefined;\n}\n\n/**\n * What \"Anyone\" means for this type, in words that never promise more than the\n * platform delivers. \"No sign-in\" only where a signed-out page exists\n * (utils/permissions/publicLane.ts); everywhere else public means every signed-in\n * person finds it under Public, and a signed-out visitor reaches it only through a\n * no-login link — when the type has one. Pure — exported for tests.\n */\nexport function anyoneReachWords(\n typeLabel: string,\n reach: { publicPage: boolean; noLoginLink: boolean },\n): string {\n // The law's words for Published to the web (common-docs/policies/access-ladder.md, Words table).\n if (reach.publicPage) return `Anyone, signed in or not, opens this ${typeLabel} at its address as a viewer.`;\n return (\n `Everyone signed in to AI Matrx can find and view this ${typeLabel}.` +\n (reach.noLoginLink\n ? \" People without an account need a no-login link.\"\n : \" People without an account cannot open it.\")\n );\n}\n\n/**\n * PublicAccessTab — \"Anyone with the link\" (access ladder Words table, Link row).\n *\n * An Anyone link opens the record at its permission for whoever holds it, at EVERY level —\n * Private and Confidential records included — and is never indexed. The row controls (\"Shown to\",\n * \"Published to the web\") are not here: they sit at the top of the people tab\n * (`RowControls`), and only on Organization and Public records (T-13 phase 5).\n */\nexport function PublicAccessTab({\n isOwner,\n resourceType,\n resourceId,\n resourceName,\n copy,\n}: PublicAccessTabProps) {\n const [linkShareable, setLinkShareable] = useState(false);\n const [loading, setLoading] = useState(true);\n const [capabilitiesError, setCapabilitiesError] = useState<string | null>(null);\n\n useEffect(() => {\n let active = true;\n setLoading(true);\n setCapabilitiesError(null);\n getShareCapabilities(resourceType)\n .then((c) => {\n if (active) setLinkShareable(c.isLinkShareable);\n })\n .catch((error: unknown) => {\n if (active) setCapabilitiesError(extractErrorMessage(error));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, [resourceType]);\n\n const location = sharingLocation(copy?.surface ?? \"Anyone link\");\n\n if (loading) return <Skeleton className=\"h-20 w-full\" />;\n if (capabilitiesError) {\n // ERRORS FIRST: no link panel renders while this fails, so the sentence is the answer.\n return (\n <Alert variant=\"destructive\" className=\"group\">\n <AlertTriangle className=\"h-4 w-4\" />\n <AlertDescription className=\"flex items-start gap-2\">\n <span className=\"flex-1\">{capabilitiesError}</span>\n <span className=\"shrink-0 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label=\"Anyone link error\"\n human={() =>\n [\n \"The Anyone link controls could not load.\",\n capabilitiesError,\n `Resource: ${resourceType}:${resourceId} (${resourceName})`,\n ].join(\"\\n\")\n }\n json={() => ({\n error: capabilitiesError,\n resource_type: resourceType,\n resource_id: resourceId,\n })}\n agent={() => ({\n kind: \"public-access-error\",\n location,\n description:\n \"The share-capabilities lookup failed, so the Anyone link tab renders no controls. This is the error on screen, verbatim.\",\n data: {\n rendered_error: capabilitiesError,\n resource_type: resourceType,\n resource_id: resourceId,\n resource_name: resourceName,\n kpis: copy?.kpis ?? null,\n },\n attributes: { resource_type: resourceType, resource_id: resourceId, state: \"error\" },\n })}\n />\n </span>\n </AlertDescription>\n </Alert>\n );\n }\n return (\n <div className=\"space-y-3\">\n <ShareLinkPanel\n resourceType={resourceType}\n resourceId={resourceId}\n isOwner={isOwner}\n enabled={linkShareable}\n />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * HOST RE-EXPORT ONLY — the Alert implementation lives in\n * `@ai-matrx/design-system`.\n *\n * The package version grows the variant set to the full status vocabulary:\n * `default | destructive | warning | success | info`, all token-driven. Reach\n * for `variant=\"warning\"` instead of hand-rolling an amber banner — that habit\n * (this file only ever had two variants) is why the 0.7.0 census found dozens\n * of literal-palette status divs across four repos.\n *\n * A destructive Alert carries the Alchemy Menu through the package's error\n * slot (`ErrorActionsProvider`, mounted in `AlchemyHost`) — the host wrapper\n * that used to add it here is gone, so the menu is never drawn twice.\n *\n * Import from here or from the package — both are the same component.\n */\n\nexport {\n Alert,\n AlertDescription,\n AlertTitle,\n alertVariants,\n type AlertProps,\n} from \"@ai-matrx/design-system\";\n","\"use client\";\n\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button, DateTimeField, Input, Select } from \"@ai-matrx/design-system/controls\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { formatAbsoluteDate } from \"@ai-matrx/kit/format\";\nimport {\n Link2,\n Copy,\n Check,\n Trash2,\n Loader2,\n Plus,\n Eye,\n MessageSquareText,\n RefreshCw,\n ExternalLink,\n} from \"lucide-react\";\nimport { useToast } from \"./host\";\nimport type { ResourceType } from \"@ai-matrx/sharing/core\";\nimport {\n createShareLink,\n listShareLinks,\n revokeShareLink,\n shareUrlForLink,\n type ShareLink,\n} from \"@ai-matrx/sharing/core\";\nimport { PortalConfirmDialog } from \"./ui/confirm-dialog\";\nimport { useShare } from \"./useShare\";\nimport {\n createSafeShareMessage,\n describeShareLinkAccess,\n describeShareLinkExpiry,\n evaluateShareLinkHandoff,\n shareLinkUnavailableReason,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\n\n/** One more URL a link opens at (e.g. a file's direct byte URL), shown with copy + open. */\nexport interface ShareLinkExtraUrl {\n key: string;\n label: string;\n sublabel?: string | undefined;\n url: string;\n /** Highlighted as the main URL to hand out. */\n primary?: boolean | undefined;\n}\n\n/** The access a new link grants, offered when `linkSettings` is on. */\ntype LinkPermission = \"viewer\" | \"editor\";\n\nexport interface ShareLinkPanelProps {\n resourceType: ResourceType;\n resourceId: string;\n isOwner: boolean;\n /** Whether this resource type offers no-login links (admin policy). Hidden when false. */\n enabled?: boolean | undefined;\n /** Ask permission, expiry and max uses before a link is created. */\n linkSettings?: boolean | undefined;\n /** Show each link's access, expiry and uses. */\n showLinkDetails?: boolean | undefined;\n /** An open-in-new-tab control on each link. */\n showOpenLink?: boolean | undefined;\n /** Extra URLs per link (a file's direct byte URL), each with copy + open. */\n extraUrls?: ((link: ShareLink) => ShareLinkExtraUrl[]) | undefined;\n /** The origin link URLs are built on; defaults to the app URL. */\n appOrigin?: string | undefined;\n /** Every fresh list read — lets a host keep its own store of links in step. */\n onLinksChange?: ((links: ShareLink[]) => void) | undefined;\n}\n\nfunction linkListErrorMessage(error: unknown): string {\n return error instanceof Error\n ? error.message\n : \"We couldn't load this item's share links.\";\n}\n\n/**\n * \"Anyone with the link\" — mint / copy / revoke no-login share links.\n *\n * A share link is an opaque token that lets anyone view the resource with ZERO\n * sign-in (resolved by the anon `resolve_share_token` RPC). This is the canonical\n * link-carries-everything path — distinct from publishing to the web (which\n * needs a public render route). Owner-only.\n */\nexport function ShareLinkPanel({\n resourceType,\n resourceId,\n isOwner,\n enabled = true,\n linkSettings = false,\n showLinkDetails = false,\n showOpenLink = false,\n extraUrls,\n appOrigin,\n onLinksChange,\n}: ShareLinkPanelProps) {\n const [permissionLevel, setPermissionLevel] = useState<LinkPermission>(\"viewer\");\n const [expiresAt, setExpiresAt] = useState(\"\");\n const [maxUses, setMaxUses] = useState(\"\");\n const onLinksChangeRef = useRef(onLinksChange);\n onLinksChangeRef.current = onLinksChange;\n const urlFor = useCallback(\n (link: Pick<ShareLink, \"token\" | \"shortToken\">) => shareUrlForLink(link, appOrigin),\n [appOrigin],\n );\n const { toast } = useToast();\n const [links, setLinks] = useState<ShareLink[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadedResourceKey, setLoadedResourceKey] = useState<string | null>(\n null,\n );\n const [creating, setCreating] = useState(false);\n const [copiedId, setCopiedId] = useState<string | null>(null);\n const [revokeTarget, setRevokeTarget] = useState<ShareLink | null>(null);\n const [shareTarget, setShareTarget] = useState<ShareLink | null>(null);\n const [shareError, setShareError] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [handoffBusy, setHandoffBusy] = useState(false);\n const { share, copy: copyMessage, fallbackDialog } = useShare();\n const resourceKey = `${resourceType}\\u0000${resourceId}`;\n\n const fetchLinks = useCallback(async () => {\n const fresh = await listShareLinks(resourceType, resourceId);\n onLinksChangeRef.current?.(fresh);\n return fresh;\n }, [resourceType, resourceId]);\n\n const refresh = useCallback(async (): Promise<ShareLink[] | null> => {\n setLoading(true);\n setShareError(null);\n try {\n const freshLinks = await fetchLinks();\n setLinks(freshLinks);\n setLoadedResourceKey(resourceKey);\n return freshLinks;\n } catch (error) {\n if (loadedResourceKey !== resourceKey) setLinks([]);\n setLoadedResourceKey(resourceKey);\n setShareError(linkListErrorMessage(error));\n return null;\n } finally {\n setLoading(false);\n }\n }, [fetchLinks, loadedResourceKey, resourceKey]);\n\n useEffect(() => {\n if (!isOwner) return;\n let current = true;\n void fetchLinks()\n .then((freshLinks) => {\n if (current) {\n setLinks(freshLinks);\n setLoadedResourceKey(resourceKey);\n }\n })\n .catch((error: unknown) => {\n if (current) {\n setLinks([]);\n setLoadedResourceKey(resourceKey);\n setShareError(linkListErrorMessage(error));\n }\n })\n .finally(() => {\n if (current) setLoading(false);\n });\n return () => {\n current = false;\n };\n }, [isOwner, fetchLinks, resourceKey]);\n\n const activeLinks = links.filter((l) => l.isActive);\n const isLoading = loading || loadedResourceKey !== resourceKey;\n const hasLink = !isLoading && activeLinks.length > 0;\n\n const copyLink = useCallback(\n async (sourceLink: ShareLink, alreadyRefreshed?: ShareLink[] | undefined) => {\n const refreshedLinks = alreadyRefreshed ?? (await refresh());\n if (!refreshedLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = refreshedLinks.find(\n (link) => link.id === sourceLink.id,\n );\n if (!currentLink) {\n toast({\n title: \"This link is no longer available\",\n description: \"Refresh the list and choose an active share link.\",\n variant: \"destructive\",\n });\n return;\n }\n const unavailableReason = shareLinkUnavailableReason(currentLink);\n if (unavailableReason) {\n toast({\n title: \"This link can't be copied\",\n description: unavailableReason,\n variant: \"destructive\",\n });\n return;\n }\n const outcome = await copyMessage(urlFor(currentLink), {\n title: \"Copy link\",\n description:\n \"Copy this link and send it to the person you want to share with.\",\n });\n if (outcome === \"copied\") {\n setCopiedId(currentLink.id);\n setTimeout(() => setCopiedId(null), 2000);\n toast({\n title: \"Link copied\",\n description: \"Anyone with it can view — no sign-in needed.\",\n });\n }\n },\n [copyMessage, refresh, toast, urlFor],\n );\n\n const copyExtraUrl = useCallback(\n async (key: string, url: string) => {\n const outcome = await copyMessage(url, {\n title: \"Copy link\",\n description: \"Copy this link and send it to the person you want to share with.\",\n });\n if (outcome === \"copied\") {\n setCopiedId(key);\n setTimeout(() => setCopiedId((k) => (k === key ? null : k)), 2000);\n }\n },\n [copyMessage],\n );\n\n const createLinkOnce = useCallback(async () => {\n const result = await createShareLink(\n linkSettings\n ? {\n resourceType,\n resourceId,\n permissionLevel,\n expiresAt: expiresAt ? new Date(expiresAt).toISOString() : null,\n maxUses: maxUses ? Number(maxUses) : null,\n }\n : { resourceType, resourceId },\n );\n if (result.success && result.url) {\n if (linkSettings) {\n setExpiresAt(\"\");\n setMaxUses(\"\");\n }\n const freshLinks = await refresh();\n const createdLink =\n result.token && freshLinks\n ? freshLinks.find((link) => link.token === result.token)\n : undefined;\n if (!createdLink || !freshLinks) {\n toast({\n title: \"Link created but not copied\",\n description:\n \"The current link state couldn't be confirmed. Refresh the list before sharing it.\",\n variant: \"destructive\",\n });\n return;\n }\n await copyLink(createdLink, freshLinks);\n } else {\n toast({\n title: \"Couldn't create link\",\n description: result.error ?? \"Please try again\",\n variant: \"destructive\",\n });\n }\n }, [\n resourceType,\n resourceId,\n refresh,\n copyLink,\n toast,\n linkSettings,\n permissionLevel,\n expiresAt,\n maxUses,\n ]);\n\n // A ref, not the `creating` state: two clicks in one frame both read the stale state and each\n // created a link. The ref holds until the link is made AND copied.\n const creatingRef = useRef(false);\n const handleCreate = useCallback(async () => {\n if (creatingRef.current) return;\n creatingRef.current = true;\n setCreating(true);\n try {\n await createLinkOnce();\n } finally {\n creatingRef.current = false;\n setCreating(false);\n }\n }, [createLinkOnce]);\n\n const handleRevoke = useCallback(async () => {\n if (!revokeTarget) return;\n const result = await revokeShareLink(revokeTarget.id);\n setRevokeTarget(null);\n if (result.success) {\n await refresh();\n toast({\n title: \"Link turned off\",\n description: \"It can no longer be opened.\",\n });\n } else {\n toast({\n title: \"Couldn't revoke\",\n description: result.error,\n variant: \"destructive\",\n });\n }\n }, [revokeTarget, refresh, toast]);\n\n const prepareTextShare = useCallback(\n async (linkId: string) => {\n setRefreshing(true);\n const freshLinks = await refresh();\n setRefreshing(false);\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const freshLink = freshLinks.find((link) => link.id === linkId);\n if (!freshLink) {\n toast({\n title: \"This link is no longer available\",\n description: \"Refresh the list and choose an active share link.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const unavailableReason = shareLinkUnavailableReason(freshLink);\n if (unavailableReason) {\n toast({\n title: \"This link can't be shared\",\n description: unavailableReason,\n variant: \"destructive\",\n });\n return;\n }\n\n setShareTarget(freshLink);\n },\n [refresh, toast],\n );\n\n const closeShareReview = useCallback(() => {\n if (!handoffBusy) setShareTarget(null);\n }, [handoffBusy]);\n\n const handleNativeHandoff = useCallback(async () => {\n if (!shareTarget) return;\n setHandoffBusy(true);\n try {\n const freshLinks = await refresh();\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = freshLinks.find((link) => link.id === shareTarget.id);\n if (!currentLink) {\n setShareTarget(null);\n toast({\n title: \"This link is no longer available\",\n description:\n \"It may have been turned off. Choose an active link to continue.\",\n variant: \"destructive\",\n });\n return;\n }\n const handoffReview = evaluateShareLinkHandoff(shareTarget, currentLink);\n if (handoffReview.status === \"unavailable\") {\n setShareTarget(null);\n toast({\n title: \"This link can't be shared\",\n description: handoffReview.reason,\n variant: \"destructive\",\n });\n return;\n }\n if (handoffReview.status === \"changed\") {\n setShareTarget(currentLink);\n toast({\n title: \"Link access changed\",\n description:\n \"Review the updated access, expiry, and view count before sharing.\",\n variant: \"destructive\",\n });\n return;\n }\n\n const message = createSafeShareMessage(urlFor(currentLink));\n const outcome = await share({\n title: \"AI Matrx share\",\n text: message,\n url: null,\n copyText: message,\n fallbackTitle: \"Copy message\",\n fallbackDescription:\n \"Copy the reviewed message below and paste it into your messaging app.\",\n });\n if (outcome === \"cancelled\") return;\n\n setShareTarget(null);\n if (outcome === \"shared\") {\n toast({\n title: \"Share options opened\",\n description:\n \"AI Matrx didn't send the message. Complete it in your share app.\",\n });\n } else if (outcome === \"copied\") {\n toast({\n title: \"Message copied\",\n description: \"Paste it into a message. AI Matrx didn't send it.\",\n });\n }\n } finally {\n setHandoffBusy(false);\n }\n }, [shareTarget, refresh, share, toast, urlFor]);\n\n const handleCopyReviewedMessage = useCallback(async () => {\n if (!shareTarget) return;\n setHandoffBusy(true);\n try {\n const freshLinks = await refresh();\n if (!freshLinks) {\n toast({\n title: \"Couldn't check this link\",\n description:\n \"The link list couldn't be refreshed. Try again before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const currentLink = freshLinks.find((link) => link.id === shareTarget.id);\n if (!currentLink) {\n setShareTarget(null);\n toast({\n title: \"This link is no longer available\",\n description:\n \"It may have been turned off. Choose an active link to continue.\",\n variant: \"destructive\",\n });\n return;\n }\n const handoffReview = evaluateShareLinkHandoff(shareTarget, currentLink);\n if (handoffReview.status === \"unavailable\") {\n setShareTarget(null);\n toast({\n title: \"This link can't be shared\",\n description: handoffReview.reason,\n variant: \"destructive\",\n });\n return;\n }\n if (handoffReview.status === \"changed\") {\n setShareTarget(currentLink);\n toast({\n title: \"Link access changed\",\n description:\n \"Review the updated access, expiry, and view count before copying.\",\n variant: \"destructive\",\n });\n return;\n }\n const message = createSafeShareMessage(urlFor(currentLink));\n const outcome = await copyMessage(message, {\n title: \"Copy message\",\n description:\n \"Copy the reviewed message below and paste it into your messaging app.\",\n });\n setShareTarget(null);\n if (outcome === \"copied\") {\n toast({\n title: \"Message copied\",\n description: \"Paste it into a message. AI Matrx didn't send it.\",\n });\n }\n } finally {\n setHandoffBusy(false);\n }\n }, [shareTarget, refresh, copyMessage, toast, urlFor]);\n\n // Non-owners have no link controls at all (the owner is the only grantor).\n if (!isOwner) return null;\n\n // NEVER vanish silently. When the type has no no-login link lane, the owner\n // must be told — otherwise the Public tab reads as \"anyone with the link\"\n // while offering no link anywhere on screen (the defect this replaced).\n if (!enabled) {\n return (\n <div className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg border\">\n <Link2 className=\"w-4 h-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">\n No-login links aren’t on for this item type\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n Share it with specific people or an organization instead — they open\n it signed in.\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2.5 p-3 bg-muted/30 rounded-lg border\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <Link2 className=\"w-4 h-4 text-primary flex-shrink-0\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">Anyone with the link</h3>\n <p className=\"text-xs text-muted-foreground\">\n {hasLink\n ? `Link is on · ${activeLinks.length} active`\n : \"Create a link that opens with no sign-in required\"}\n </p>\n </div>\n </div>\n <Button\n icon={creating ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Plus />\n )}\n variant=\"primary\"\n onClick={handleCreate}\n disabled={creating}\n className=\"flex-shrink-0\"\n >\n <span className=\"ml-1 hidden sm:inline\">\n {hasLink ? \"New link\" : \"Create link\"}\n </span>\n </Button>\n </div>\n\n {linkSettings ? (\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-3\">\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Permission</span>\n <Select<LinkPermission>\n value={permissionLevel}\n onValueChange={setPermissionLevel}\n aria-label=\"Link permission\"\n options={[\n { value: \"viewer\", label: \"Read only\" },\n { value: \"editor\", label: \"Read + write\" },\n ]}\n />\n </label>\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Expires</span>\n <DateTimeField value={expiresAt} onValueChange={(v) => setExpiresAt(v ?? \"\")} />\n </label>\n <label className=\"flex flex-col gap-1 text-xs\">\n <span className=\"text-muted-foreground\">Max uses</span>\n <Input\n type=\"number\"\n min={1}\n aria-label=\"Max uses\"\n value={maxUses}\n onChange={(e) => setMaxUses(e.target.value)}\n />\n </label>\n </div>\n ) : null}\n\n {isLoading ? (\n <div className=\"flex items-center justify-center py-3 text-xs text-muted-foreground\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin mr-2\" />\n Loading links…\n </div>\n ) : activeLinks.length === 0 && !shareError ? (\n <p className=\"text-xs text-muted-foreground py-1\">\n No share links yet. Create one to share this with anyone.\n </p>\n ) : (\n <div className=\"space-y-1.5\">\n {activeLinks.map((link) => {\n const unavailableReason = shareLinkUnavailableReason(link);\n const linkUrl = urlFor(link);\n const extras = extraUrls?.(link) ?? [];\n return (\n <div key={link.id} className=\"space-y-1\">\n {showLinkDetails ? (\n <div className=\"flex flex-wrap items-center gap-1.5 px-0.5 text-[11px] text-muted-foreground\">\n <span className=\"rounded bg-muted px-1.5 py-0.5 font-medium text-foreground\">\n {link.permissionLevel === \"viewer\" ? \"Read only\" : \"Read + write\"}\n </span>\n <span>\n {link.expiresAt\n ? `Expires ${formatAbsoluteDate(link.expiresAt)}`\n : \"No expiry\"}\n </span>\n {/* read-gate-exempt: this link's own usage fields, not a list count */}\n {link.maxUses ? <span>{`${link.useCount}/${link.maxUses} uses`}</span> : null}\n </div>\n ) : null}\n {extras.map((extra) => (\n <div\n key={extra.key}\n className={\n extra.primary\n ? \"flex items-center gap-1.5 rounded-md border border-primary/30 bg-primary/5 p-1.5\"\n : \"flex items-center gap-1.5 rounded-md border bg-background p-1.5\"\n }\n >\n <div className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"text-[10px] font-medium uppercase text-muted-foreground\">\n {extra.label}\n {extra.sublabel ? ` · ${extra.sublabel}` : \"\"}\n </span>\n <span className=\"truncate font-mono text-xs\" title={extra.url}>\n {extra.url}\n </span>\n </div>\n <OutboundLink\n href={extra.url}\n aria-label={`Open ${extra.label}`}\n title=\"Open in new tab\"\n className=\"flex h-11 w-11 flex-shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground sm:h-8 sm:w-8\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </OutboundLink>\n <Button\n icon={copiedId === `${link.id}:${extra.key}` ? (\n <Check className=\"text-green-500\" />\n ) : (\n <Copy />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => copyExtraUrl(`${link.id}:${extra.key}`, extra.url)}\n disabled={!!unavailableReason}\n title={unavailableReason ?? \"Copy\"}\n aria-label={`Copy ${extra.label}`}\n />\n </div>\n ))}\n <div className=\"flex items-center gap-1.5 rounded-md border bg-background p-1.5\">\n <Input mono\n readOnly\n value={linkUrl}\n className=\"min-w-0 flex-1\"\n onFocus={(e) => e.currentTarget.select()}\n />\n <span\n className=\"flex items-center gap-1 text-[10px] text-muted-foreground px-1\"\n title={`${link.useCount} view${link.useCount === 1 ? \"\" : \"s\"}`}\n >\n <Eye className=\"w-3 h-3\" />\n {link.useCount}\n </span>\n {showOpenLink ? (\n <OutboundLink\n href={linkUrl}\n aria-label=\"Open share link\"\n title=\"Open in new tab\"\n className=\"flex h-11 w-11 flex-shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground sm:h-8 sm:w-8\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </OutboundLink>\n ) : null}\n <Button\n icon={copiedId === link.id ? (\n <Check className=\"text-green-500\" />\n ) : (\n <Copy />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => copyLink(link)}\n disabled={!!unavailableReason}\n title={unavailableReason ?? \"Copy link\"}\n aria-label=\"Copy share link\"\n />\n <Button\n icon={refreshing ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <MessageSquareText />\n )}\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => prepareTextShare(link.id)}\n disabled={!!unavailableReason || refreshing}\n title={unavailableReason ?? \"Review before sharing by text\"}\n aria-label=\"Share by text\"\n />\n <Button\n icon={<Trash2 />}\n removes\n variant=\"quiet\"\n className=\"flex-shrink-0\"\n onClick={() => setRevokeTarget(link)}\n title=\"Turn off link\"\n aria-label=\"Turn off share link\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {shareError ? (\n <div\n role=\"alert\"\n className=\"flex items-center justify-between gap-2 text-xs text-destructive\"\n >\n <span>{shareError}</span>\n <Button\n icon={<RefreshCw />}\n type=\"button\"\n variant=\"outline\"\n disabled={isLoading}\n onClick={() => refresh()}\n >\n Refresh\n </Button>\n <ShareErrorAlchemyMenu className=\"ml-auto\" />\n </div>\n ) : null}\n\n {refreshing && !loading ? (\n <span className=\"sr-only\" role=\"status\">\n Checking current link access\n </span>\n ) : null}\n\n <PortalConfirmDialog\n open={shareTarget !== null}\n onOpenChange={(open) => !open && closeShareReview()}\n title=\"Review message before sharing\"\n description=\"Anyone with this link can open it without signing in. AI Matrx will prepare the message; it won't send it.\"\n content={\n shareTarget ? (\n <div className=\"space-y-3 text-sm\">\n <dl className=\"space-y-1.5 text-xs\">\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Access</dt>\n <dd className=\"text-right\">\n {describeShareLinkAccess(shareTarget.permissionLevel)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Expiry</dt>\n <dd className=\"text-right\">\n {describeShareLinkExpiry(shareTarget.expiresAt)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-3\">\n <dt className=\"text-muted-foreground\">Views</dt>\n <dd className=\"text-right\">\n {/* read-gate-exempt: the chosen link's own usage fields (from a list read that succeeded; its failure is shareError), not a list count */}\n {shareTarget.maxUses === null\n ? `${shareTarget.useCount} used · no limit`\n : `${shareTarget.useCount} of ${shareTarget.maxUses} used`}\n </dd>\n </div>\n </dl>\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium\">Message preview</p>\n <p className=\"rounded-md border bg-muted/30 p-3 break-words\">\n {createSafeShareMessage(urlFor(shareTarget))}\n </p>\n </div>\n <Button\n icon={<Copy />}\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n disabled={handoffBusy}\n onClick={handleCopyReviewedMessage}\n >\n Copy message\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n You can turn this link off from the share panel at any time.\n </p>\n </div>\n ) : null\n }\n confirmLabel={\n typeof navigator !== \"undefined\" &&\n typeof navigator.share === \"function\"\n ? \"Open share options\"\n : \"Copy message\"\n }\n cancelLabel=\"Not now\"\n contentClassName=\"w-[calc(100%-2rem)] sm:!max-w-[34rem]\"\n busy={handoffBusy}\n onConfirm={handleNativeHandoff}\n />\n\n <PortalConfirmDialog\n open={!!revokeTarget}\n onOpenChange={(o) => !o && setRevokeTarget(null)}\n title=\"Turn off this link?\"\n description=\"Anyone currently using it will lose access. This can't be undone.\"\n confirmLabel=\"Turn off link\"\n variant=\"destructive\"\n onConfirm={handleRevoke}\n />\n {fallbackDialog}\n </div>\n );\n}\n","\"use client\";\n\nimport { ConfirmDialog as PackageConfirmDialog, type ConfirmDialogProps } from \"@ai-matrx/design-system\";\nimport { usePortalContainer } from \"../host\";\n\nexport type { ConfirmDialogProps };\n\n/** The design-system confirm, portalled into the host's pop-out window when it has one. */\nexport function PortalConfirmDialog(props: ConfirmDialogProps) {\n const container = usePortalContainer();\n return <PackageConfirmDialog {...(container ? { portalContainer: container } : {})} {...props} />;\n}\n","\"use client\";\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { shareCopyNotify } from \"./host\";\nimport { toast } from \"./host\";\nimport { useCallback, useState, type ReactNode } from \"react\";\nimport { ClipboardFallbackDialog } from \"@ai-matrx/design-system\";\n\ninterface ShareOptions {\n title: string;\n text?: string | undefined;\n /** `null` omits a separate URL field when the reviewed text already contains it. */\n url?: string | null | undefined;\n /** Full text to copy when native sharing is unavailable. */\n copyText?: string | undefined;\n fallbackTitle?: string | undefined;\n fallbackDescription?: string | undefined;\n}\n\n/**\n * Which door actually opened. Callers that announce the result (\"Link copied\")\n * must not guess: a manual-fallback run copied nothing, and a toast claiming\n * otherwise is a screen that lies.\n */\nexport type ShareOutcome = \"shared\" | \"copied\" | \"manual\" | \"cancelled\";\n\nexport interface UseShareResult {\n share: (options: ShareOptions) => Promise<ShareOutcome>;\n copy: (\n text: string,\n fallback?: { title?: string | undefined; description?: string | undefined },\n ) => Promise<\"copied\" | \"manual\">;\n copied: boolean;\n fallbackDialog: ReactNode;\n}\n\n/** Native share-sheet first, clipboard second, accessible manual copy last. */\nexport function useShare(): UseShareResult {\n const { copyText: copyTextKit } = useClipboard({\n notify: shareCopyNotify,\n });\n const [copied, setCopied] = useState(false);\n const [fallbackUrl, setFallbackUrl] = useState<string | null>(null);\n const [fallbackTitle, setFallbackTitle] = useState(\"Copy link\");\n const [fallbackDescription, setFallbackDescription] = useState(\n \"Press Cmd/Ctrl+C to copy, or use the Copy button below.\",\n );\n\n const copy = useCallback(\n async (\n text: string,\n fallback?: { title?: string | undefined; description?: string | undefined },\n ): Promise<\"copied\" | \"manual\"> => {\n const showManualFallback = () => {\n setFallbackTitle(fallback?.title ?? \"Copy link\");\n setFallbackDescription(\n fallback?.description ??\n \"Press Cmd/Ctrl+C to copy, or use the Copy button below.\",\n );\n setFallbackUrl(text);\n return \"manual\" as const;\n };\n if (!(await copyTextKit(text))) return showManualFallback();\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2_000);\n return \"copied\";\n },\n [],\n );\n\n const share = useCallback(\n async (options: ShareOptions): Promise<ShareOutcome> => {\n const url =\n options.url === null\n ? \"\"\n : (options.url ??\n (typeof window !== \"undefined\" ? window.location.href : \"\"));\n const payload = {\n title: options.title,\n ...(options.text ? { text: options.text } : {}),\n ...(url ? { url } : {}),\n };\n if (typeof navigator !== \"undefined\" && navigator.share) {\n try {\n await navigator.share(payload);\n return \"shared\";\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AbortError\"\n ) {\n return \"cancelled\";\n }\n }\n }\n const copyText = options.copyText ?? url;\n return copy(copyText, {\n title: options.fallbackTitle,\n description: options.fallbackDescription,\n });\n },\n [copy],\n );\n\n return {\n share,\n copy,\n copied,\n fallbackDialog: (\n <ClipboardFallbackDialog\n open={fallbackUrl !== null}\n onOpenChange={(open: boolean) => !open && setFallbackUrl(null)}\n url={fallbackUrl ?? \"\"}\n title={fallbackTitle}\n description={fallbackDescription}\n />\n ),\n };\n}\n","\"use client\";\n\n// \"Indexed by search engines\" — the per-item half of the indexed switch (access ladder T-12).\n// Law: common-docs/policies/access-ladder.md (\"Public items: indexed or not\").\n//\n// An INLINE control: it sits on the existing \"Published to the web\" line of whatever surface\n// hosts it and never adds a row. It renders nothing until the record is published to the web\n// (search engines can only index a published record) and nothing for a type that has no\n// switch. Security is identical either way, so the words say only what search engines do.\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Switch } from \"./ui/switch\";\nimport { useToast } from \"./host\";\nimport { cn } from \"@ai-matrx/design-system/cn\";\nimport { getSearchEngineIndexedState, setSearchEngineIndexed } from \"@ai-matrx/sharing/core\";\nimport type { SearchEngineIndexedState } from \"@ai-matrx/sharing/core\";\n\ninterface Props {\n resourceType: string;\n resourceId: string;\n /**\n * Re-read whenever this changes — pass the host's own published state so the control\n * appears the moment the record is published (and leaves when it is unpublished).\n */\n publishedHint?: boolean | undefined;\n className?: string | undefined;\n}\n\nexport function SearchEngineIndexedSwitch({\n resourceType,\n resourceId,\n publishedHint,\n className,\n}: Props) {\n const [state, setState] = useState<SearchEngineIndexedState | null>(null);\n const [busy, setBusy] = useState(false);\n const { toast } = useToast();\n\n const load = useCallback(async () => {\n const res = await getSearchEngineIndexedState(resourceType, resourceId);\n if (res.error) {\n // Loud, but not in the way: the host's own publish control still works.\n console.warn(`[search-engine-indexed] state for ${resourceType}/${resourceId}: ${res.error}`);\n setState(null);\n return;\n }\n setState(res.state);\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n void load();\n }, [load, publishedHint]);\n\n if (!state || !state.enrolled || !state.published_to_web) return null;\n\n const onChange = async (next: boolean) => {\n setBusy(true);\n // A flip is a deliberate choice and is stored as one: a later change to the type's\n // default (organization or person) never overrides what the creator set by hand.\n const res = await setSearchEngineIndexed(resourceType, resourceId, next);\n setBusy(false);\n if (res.error || !res.state) {\n toast({\n title: \"Couldn't change search engine indexing\",\n description: res.error ?? \"Please try again\",\n variant: \"destructive\",\n });\n return;\n }\n setState(res.state);\n toast({\n title: next ? \"Search engines may list this page\" : \"Search engines are told not to list this page\",\n description: \"Anyone with the address can still open it.\",\n });\n };\n\n const followsDefault = state.value === null;\n const id = `indexed-${resourceType}-${resourceId}`;\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1.5\", className)}\n title={\n followsDefault\n ? `Following the default for this type (${state.type_default ? \"indexed\" : \"not indexed\"}).`\n : \"Set for this item.\"\n }\n >\n <label htmlFor={id} className=\"cursor-pointer text-xs text-muted-foreground\">\n Indexed by search engines\n </label>\n <Switch\n id={id}\n checked={state.effective}\n onCheckedChange={onChange}\n disabled={busy || !state.can_change}\n aria-label=\"Indexed by search engines\"\n />\n </span>\n );\n}\n","\"use client\";\n\n// features/sharing/secure/SecureLinkPanel.tsx — \"SECURE LINK — CODE REQUIRED\", the sender's half.\n//\n// The third way to share, beside People and Public, for anything that must not travel in a plain\n// link: the recipient gets a single-use link on one channel and a code on the other, and it opens\n// once (aidream `services/secure_delivery/FEATURE.md`). It is ONE component, mounted by the ONE\n// share dialog (`ShareModal`, the \"Secure\" tab) and by the vault item's own Share panel — never a\n// second surface, never a per-feature variant.\n//\n// WHAT THIS PANEL NEVER HOLDS: a protected value or the link. It asks the server which protected\n// fields this person may include, sends names and addresses, and draws the receipt the server\n// writes. The list below comes from the door `platform.secure_delivery_sent` — the sender's own\n// rows only; the delivery table itself is closed to signed-in clients (aidream 1350g).\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Loader2, Mail, MessageSquare, ShieldCheck } from \"lucide-react\";\n\nimport { confirm } from \"./host\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Input } from \"@ai-matrx/design-system/controls\";\nimport { Label } from \"@ai-matrx/design-system\";\nimport { Textarea } from \"@ai-matrx/design-system\";\nimport { ToggleGroup, ToggleGroupItem } from \"./ui/toggle-group\";\nimport { useAppDispatch } from \"./host\";\nimport { IdentityGate, useConfirmed, wasCancelled } from \"@ai-matrx/vault\";\nimport { vaultIdentity } from \"./host\";\n\nimport {\n fetchRecipientPhoneOnFile,\n fetchSecureDeliveryOptions,\n listSentSecureDeliveries,\n revokeSecureDelivery,\n type SecureDeliveryOptions,\n SecureDeliveryRefusal,\n sendSecureDelivery,\n type SentSecureDelivery,\n} from \"@ai-matrx/sharing/core\";\nimport { ShareErrorAlchemyMenu } from \"./host\";\nimport { formatDurationMinutes } from \"@ai-matrx/kit/format\";\n\ninterface SecureLinkPanelProps {\n resourceType: string;\n resourceId: string;\n resourceName: string;\n}\n\nconst STATUS_WORDS: Record<string, string> = {\n pending: \"Waiting to be opened\",\n viewed: \"Opened\",\n revoked: \"Turned off\",\n expired: \"Expired unopened\",\n undeliverable: \"Not delivered\",\n locked: \"Closed after wrong codes\",\n};\n\nfunction when(iso: string | null): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n return Number.isNaN(d.getTime())\n ? \"\"\n : d.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n}\n\n/**\n * Sending a password is a reveal: it needs the SAME fresh sign-in the vault asks for, through the\n * vault's ONE \"Confirm it's you\" (Google, password or an emailed code) — never a second dialog.\n */\nexport function SecureLinkPanel(props: SecureLinkPanelProps) {\n return (\n <IdentityGate identity={vaultIdentity()}>\n <SecureLinkForm {...props} />\n </IdentityGate>\n );\n}\n\nfunction SecureLinkForm({ resourceType, resourceId, resourceName }: SecureLinkPanelProps) {\n const dispatch = useAppDispatch();\n const confirmed = useConfirmed();\n const [options, setOptions] = useState<SecureDeliveryOptions | null>(null);\n const [optionsError, setOptionsError] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [linkChannel, setLinkChannel] = useState<\"email\" | \"sms\">(\"email\");\n const [fields, setFields] = useState<string[]>([]);\n const [note, setNote] = useState(\"\");\n const [sending, setSending] = useState(false);\n const [result, setResult] = useState<{ tone: \"ok\" | \"warn\" | \"error\"; text: string; remedy?: string | null | undefined } | null>(null);\n const [sent, setSent] = useState<SentSecureDelivery[] | null>(null);\n\n const refreshSent = useCallback(() => {\n listSentSecureDeliveries(resourceType, resourceId)\n .then(setSent)\n .catch(() => setSent([]));\n }, [resourceType, resourceId]);\n\n useEffect(() => {\n let live = true;\n fetchSecureDeliveryOptions(dispatch, resourceType, resourceId)\n .then((o) => live && setOptions(o))\n .catch((err: unknown) =>\n live &&\n setOptionsError(\n err instanceof SecureDeliveryRefusal ? err.message : \"Could not load what can be sent.\",\n ),\n );\n refreshSent();\n return () => {\n live = false;\n };\n }, [dispatch, resourceType, resourceId, refreshSent]);\n\n // Pre-fill the mobile when the recipient is an existing user whose phone on file has agreed to\n // texts. Never over a number the sender typed; a pre-filled number is cleared when the email\n // stops matching anyone, so the both-by-email warning stays honest.\n const [phoneTyped, setPhoneTyped] = useState(false);\n const phonePrefilled = useRef(false);\n useEffect(() => {\n if (phoneTyped) return;\n const address = email.trim();\n const clearPrefill = () => {\n if (phonePrefilled.current) {\n setPhone(\"\");\n phonePrefilled.current = false;\n }\n };\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(address)) {\n clearPrefill();\n return;\n }\n let live = true;\n const timer = setTimeout(() => {\n fetchRecipientPhoneOnFile(address)\n .then((onFile) => {\n if (!live) return;\n if (onFile) {\n setPhone(onFile);\n phonePrefilled.current = true;\n } else {\n clearPrefill();\n }\n })\n .catch(() => {\n if (live) clearPrefill();\n });\n }, 400);\n return () => {\n live = false;\n clearTimeout(timer);\n };\n }, [email, phoneTyped]);\n\n const hasBoth = email.trim() !== \"\" && phone.trim() !== \"\";\n const canSend = email.trim() !== \"\" && !sending;\n\n async function send() {\n setSending(true);\n setResult(null);\n try {\n // A \"confirm it's you\" refusal opens the gate; once confirmed the same send runs again.\n const receipt = await confirmed(() => sendSecureDelivery(dispatch, {\n resource_type: resourceType,\n resource_id: resourceId,\n recipient_email: email.trim() || null,\n recipient_phone: phone.trim() || null,\n field_keys: fields,\n link_channel: hasBoth ? linkChannel : null,\n note: note.trim() || null,\n }));\n setResult({ tone: receipt.same_channel ? \"warn\" : \"ok\", text: receipt.sentence });\n setEmail(\"\");\n setPhone(\"\");\n setPhoneTyped(false);\n phonePrefilled.current = false;\n setNote(\"\");\n setFields([]);\n refreshSent();\n } catch (err: unknown) {\n if (wasCancelled(err)) {\n setResult({ tone: \"warn\", text: \"Not sent: it was not confirmed.\" });\n } else if (err instanceof SecureDeliveryRefusal) {\n setResult({ tone: \"error\", text: err.message, remedy: err.remedy });\n } else {\n setResult({ tone: \"error\", text: \"The secure link could not be sent. Try again.\" });\n }\n } finally {\n setSending(false);\n }\n }\n\n async function turnOff(row: SentSecureDelivery) {\n const ok = await confirm({\n title: \"Turn off this secure link?\",\n description: `The link to ${row.recipient_email ?? row.recipient_phone ?? \"this person\"} stops working at once and what it carries is deleted. They will have to ask you for a new one.`,\n confirmLabel: \"Turn it off\",\n });\n if (!ok) return;\n try {\n await revokeSecureDelivery(dispatch, row.id);\n } finally {\n refreshSent();\n }\n }\n\n const protectedFields = options?.protected_fields ?? [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-2 rounded-lg border border-border bg-muted/30 p-3\">\n <ShieldCheck className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-primary\" />\n <p className=\"text-xs text-muted-foreground\">\n They get a link that opens once, and a code on a separate channel. No account needed.\n {options ? ` The link works for ${formatDurationMinutes(options.link_ttl_minutes, { style: \"long\" })}.` : \"\"}\n </p>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-email\" className=\"text-xs\">Their email</Label>\n <Input\n id=\"secure-email\"\n type=\"email\"\n autoComplete=\"off\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n placeholder=\"name@example.com\"\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-phone\" className=\"text-xs\">Their mobile, for the code</Label>\n <Input\n id=\"secure-phone\"\n type=\"tel\"\n autoComplete=\"off\"\n value={phone}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setPhone(e.target.value);\n setPhoneTyped(true);\n phonePrefilled.current = false;\n }}\n placeholder=\"+1 310 555 0123\"\n />\n </div>\n </div>\n\n {hasBoth ? (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span>Send the link by</span>\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n variant=\"outline\"\n value={linkChannel}\n onValueChange={(v) => v && setLinkChannel(v as \"email\" | \"sms\")}\n >\n <ToggleGroupItem value=\"email\" aria-label=\"Link by email\">\n <Mail className=\"mr-1 h-3.5 w-3.5\" /> Email\n </ToggleGroupItem>\n <ToggleGroupItem value=\"sms\" aria-label=\"Link by text\">\n <MessageSquare className=\"mr-1 h-3.5 w-3.5\" /> Text\n </ToggleGroupItem>\n </ToggleGroup>\n <span>and the code by {linkChannel === \"email\" ? \"text\" : \"email\"}.</span>\n </div>\n ) : email.trim() !== \"\" ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-400\">\n Without a mobile number, the link and the code both go by email — anyone who can read that\n inbox could open it.\n </p>\n ) : null}\n\n {optionsError ? (\n <p className=\"text-xs text-destructive\">\n {optionsError}\n <ShareErrorAlchemyMenu error={optionsError} operation=\"Load the secure-link options\" />\n </p>\n ) : null}\n {protectedFields.length > 0 ? (\n <fieldset className=\"space-y-2\">\n <legend className=\"text-xs font-medium\">Include protected fields from {resourceName}</legend>\n {protectedFields.map((f) => (\n <div key={f.key} className=\"flex items-start gap-2\">\n <Checkbox\n size=\"sm\"\n id={`secure-field-${f.key}`}\n checked={fields.includes(f.key)}\n disabled={!f.available}\n onCheckedChange={(checked) =>\n setFields((cur) =>\n checked ? [...cur, f.key] : cur.filter((k) => k !== f.key),\n )\n }\n />\n <div>\n <Label htmlFor={`secure-field-${f.key}`} className=\"text-sm\">\n {f.label}\n </Label>\n {!f.available && f.reason ? (\n <p className=\"text-xs text-muted-foreground\">{f.reason}</p>\n ) : null}\n </div>\n </div>\n ))}\n </fieldset>\n ) : null}\n\n <div className=\"space-y-1\">\n <Label htmlFor=\"secure-note\" className=\"text-xs\">Message (optional, shown once with it)</Label>\n <Textarea\n id=\"secure-note\"\n rows={2}\n maxLength={1000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n\n <Button icon={sending ? <Loader2 className=\"animate-spin\" /> : null} variant=\"primary\" className=\"w-full\" onClick={send} disabled={!canSend}>\n Send secure link\n </Button>\n\n {result ? (\n <div\n className={\n result.tone === \"error\"\n ? \"rounded-md border border-destructive/30 bg-destructive/10 p-2.5 text-sm text-destructive-ink\"\n : result.tone === \"warn\"\n ? \"rounded-md border border-amber-500/30 bg-amber-500/10 p-2.5 text-sm\"\n : \"rounded-md border border-border bg-muted/40 p-2.5 text-sm\"\n }\n >\n <p>{result.text}</p>\n {result.remedy ? <p className=\"mt-1 text-xs opacity-80\">{result.remedy}</p> : null}\n </div>\n ) : null}\n\n {sent && sent.length > 0 ? (\n <div>\n <h3 className=\"mb-2 text-sm font-medium\">Sent securely</h3>\n <ul className=\"divide-y divide-border rounded-lg border border-border\">\n {sent.map((row) => (\n <li key={row.id} className=\"flex items-center justify-between gap-2 p-2.5 text-sm\">\n <div className=\"min-w-0\">\n <p className=\"truncate\">{row.recipient_email ?? row.recipient_phone}</p>\n <p className=\"text-xs text-muted-foreground\">\n {STATUS_WORDS[row.status] ?? row.status}\n {row.status === \"viewed\" && row.viewed_at ? ` ${when(row.viewed_at)}` : \"\"}\n {row.status === \"pending\" ? ` · until ${when(row.expires_at)}` : \"\"}\n {row.field_keys.length > 0 ? ` · with ${row.field_keys.join(\", \")}` : \"\"}\n </p>\n </div>\n {row.status === \"pending\" ? (\n <Button variant=\"outline\" onClick={() => void turnOff(row)}>\n Turn off\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * A dialog never lets focus fall out of it by itself. Every action in the share sheet (Share with\n * User, copy link, change a role, remove a person) disables or replaces the control that was just\n * pressed while it works; the browser then drops focus to <body>, where Escape and Tab no longer\n * reach the dialog (adversarial walk 3 O1: Escape did nothing right after \"Share with User\").\n *\n * Watches the dialog's content for those disables and re-renders; when focus has fallen to <body>\n * (or nowhere) it puts it on the first enabled control, else on the dialog itself. It never moves\n * focus the person placed anywhere else.\n */\nexport function useKeepFocusInDialog(): (element: HTMLElement | null) => void {\n const [element, setElement] = useState<HTMLElement | null>(null);\n useEffect(() => {\n if (!element) return undefined;\n let frame = 0;\n const settle = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n if (!element.isConnected) return;\n const now = document.activeElement;\n if (now && now !== document.body && now !== document.documentElement) return;\n const target = element.querySelector<HTMLElement>(\n \"input:not([disabled]):not([type=hidden]), button:not([disabled]), [href], [tabindex]:not([tabindex='-1'])\",\n );\n (target ?? element).focus({ preventScroll: true });\n });\n };\n const observer = new MutationObserver(settle);\n observer.observe(element, { subtree: true, childList: true, attributes: true, attributeFilter: [\"disabled\"] });\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [element]);\n return setElement;\n}\n"],"mappings":"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","names":["import_core","state","kitConfirm","shareClientForIdentity","passThroughDispatchRef","import_core","import_react","import_design_system","import_design_system","import_controls","import_controls","import_jsx_runtime","import_controls","import_lucide_react","import_react","import_core","import_core","store","state","organizationId","import_react","import_core","state","import_core","import_design_system","import_lucide_react","import_react","import_controls","import_design_system","import_design_system","import_controls","import_lucide_react","import_design_system","import_jsx_runtime","import_core","import_design_system","import_jsx_runtime","import_react","import_lucide_react","import_core","import_core","import_cn","import_jsx_runtime","import_react","import_controls","import_design_system","import_design_system","import_design_system","import_lucide_react","import_core","import_core","import_core","import_core","import_react","import_lucide_react","import_controls","import_design_system","import_core","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_controls","import_design_system","import_clipboard","import_core","import_jsx_runtime","state","import_core","import_react","import_lucide_react","import_controls","import_core","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_cn","import_core","import_clipboard","import_react","import_lucide_react","import_design_system","React","import_controls","import_jsx_runtime","PackageSwitch","import_controls","import_design_system","import_cn","import_core","import_react","import_design_system","import_lucide_react","import_react","import_controls","import_format","import_lucide_react","import_core","import_design_system","import_jsx_runtime","PackageConfirmDialog","import_clipboard","import_react","import_design_system","import_jsx_runtime","copyText","import_core","import_jsx_runtime","import_design_system","import_core","import_core","import_jsx_runtime","import_core","import_react","import_cn","import_core","import_jsx_runtime","state","import_jsx_runtime","copyText","import_jsx_runtime","import_react","import_lucide_react","import_controls","import_design_system","import_vault","import_core","import_format","import_jsx_runtime","import_react","import_jsx_runtime","error","shareWithUser","makePublic","revokeAccess"]}
|