@agent-native/core 0.22.12 → 0.22.15

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.
Files changed (98) hide show
  1. package/dist/agent/engine/builder-engine.d.ts +1 -1
  2. package/dist/agent/engine/registry.d.ts.map +1 -1
  3. package/dist/agent/engine/registry.js +13 -1
  4. package/dist/agent/engine/registry.js.map +1 -1
  5. package/dist/agent/model-config.d.ts +6 -6
  6. package/dist/agent/model-config.js +3 -3
  7. package/dist/agent/model-config.js.map +1 -1
  8. package/dist/chat-threads/store.d.ts.map +1 -1
  9. package/dist/chat-threads/store.js +6 -2
  10. package/dist/chat-threads/store.js.map +1 -1
  11. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  12. package/dist/client/MultiTabAssistantChat.js +5 -6
  13. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  14. package/dist/client/agent-chat.d.ts.map +1 -1
  15. package/dist/client/agent-chat.js +13 -0
  16. package/dist/client/agent-chat.js.map +1 -1
  17. package/dist/client/index.d.ts +1 -0
  18. package/dist/client/index.d.ts.map +1 -1
  19. package/dist/client/index.js +1 -0
  20. package/dist/client/index.js.map +1 -1
  21. package/dist/client/mcp-app-host.d.ts +40 -0
  22. package/dist/client/mcp-app-host.d.ts.map +1 -0
  23. package/dist/client/mcp-app-host.js +165 -0
  24. package/dist/client/mcp-app-host.js.map +1 -0
  25. package/dist/client/sharing/ShareButton.d.ts +9 -0
  26. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  27. package/dist/client/sharing/ShareButton.js +19 -2
  28. package/dist/client/sharing/ShareButton.js.map +1 -1
  29. package/dist/client/use-chat-models.d.ts.map +1 -1
  30. package/dist/client/use-chat-models.js +4 -5
  31. package/dist/client/use-chat-models.js.map +1 -1
  32. package/dist/db/client.d.ts +1 -0
  33. package/dist/db/client.d.ts.map +1 -1
  34. package/dist/db/client.js +33 -17
  35. package/dist/db/client.js.map +1 -1
  36. package/dist/db/create-get-db.d.ts.map +1 -1
  37. package/dist/db/create-get-db.js +2 -8
  38. package/dist/db/create-get-db.js.map +1 -1
  39. package/dist/index.browser.d.ts +2 -1
  40. package/dist/index.browser.d.ts.map +1 -1
  41. package/dist/index.browser.js +2 -1
  42. package/dist/index.browser.js.map +1 -1
  43. package/dist/index.d.ts +2 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/mcp/build-server.d.ts +2 -0
  48. package/dist/mcp/build-server.d.ts.map +1 -1
  49. package/dist/mcp/build-server.js +59 -3
  50. package/dist/mcp/build-server.js.map +1 -1
  51. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  52. package/dist/mcp/builtin-tools.js +2 -4
  53. package/dist/mcp/builtin-tools.js.map +1 -1
  54. package/dist/mcp/connect-route.d.ts.map +1 -1
  55. package/dist/mcp/connect-route.js +14 -0
  56. package/dist/mcp/connect-route.js.map +1 -1
  57. package/dist/mcp/embed-app.d.ts.map +1 -1
  58. package/dist/mcp/embed-app.js +167 -1
  59. package/dist/mcp/embed-app.js.map +1 -1
  60. package/dist/mcp/embed-route.d.ts +26 -0
  61. package/dist/mcp/embed-route.d.ts.map +1 -0
  62. package/dist/mcp/embed-route.js +38 -0
  63. package/dist/mcp/embed-route.js.map +1 -0
  64. package/dist/mcp/index.d.ts +1 -0
  65. package/dist/mcp/index.d.ts.map +1 -1
  66. package/dist/mcp/index.js +1 -0
  67. package/dist/mcp/index.js.map +1 -1
  68. package/dist/mcp/server.d.ts.map +1 -1
  69. package/dist/mcp/server.js +16 -1
  70. package/dist/mcp/server.js.map +1 -1
  71. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  72. package/dist/scripts/agent-engines/list-agent-engines.js +18 -12
  73. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  74. package/dist/server/better-auth-instance.d.ts.map +1 -1
  75. package/dist/server/better-auth-instance.js +2 -1
  76. package/dist/server/better-auth-instance.js.map +1 -1
  77. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  78. package/dist/server/core-routes-plugin.js +22 -1
  79. package/dist/server/core-routes-plugin.js.map +1 -1
  80. package/dist/server/embed-route.d.ts.map +1 -1
  81. package/dist/server/embed-route.js +7 -1
  82. package/dist/server/embed-route.js.map +1 -1
  83. package/dist/server/embed-session.d.ts.map +1 -1
  84. package/dist/server/embed-session.js +55 -2
  85. package/dist/server/embed-session.js.map +1 -1
  86. package/dist/shared/embed-auth.d.ts +1 -0
  87. package/dist/shared/embed-auth.d.ts.map +1 -1
  88. package/dist/shared/embed-auth.js +1 -0
  89. package/dist/shared/embed-auth.js.map +1 -1
  90. package/dist/vite/client.d.ts +2 -0
  91. package/dist/vite/client.d.ts.map +1 -1
  92. package/dist/vite/client.js +5 -0
  93. package/dist/vite/client.js.map +1 -1
  94. package/docs/content/actions.md +22 -7
  95. package/docs/content/client.md +43 -0
  96. package/docs/content/external-agents.md +40 -1
  97. package/docs/content/mcp-protocol.md +25 -0
  98. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover.\n * This is treated as the primary \"Copy link\" target — same convention\n * as Google Docs' Share dialog, which copies the editor URL. */\n shareUrl?: string;\n /** Optional label for the primary copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the primary copyable link section. */\n shareUrlDescription?: ReactNode;\n /** Optional placeholder shown in the share-URL slot when `shareUrl` is\n * undefined. Use this to explain *why* there's no link yet (e.g. \"Publish\n * this form to get a public response link\") instead of leaving the slot\n * empty. */\n shareUrlPlaceholder?: ReactNode;\n /** Optional secondary copyable link (e.g. a presentation / read-only\n * surface for the same resource). Anyone with at least viewer access\n * can open it — access is enforced on the resource itself, not the\n * URL shape, so we never gate this behind visibility. */\n secondaryShareUrl?: string;\n /** Optional label for the secondary copyable link. */\n secondaryShareUrlLabel?: string;\n /** Optional helper text for the secondary copyable link. */\n secondaryShareUrlDescription?: ReactNode;\n /** @deprecated No longer enforced — access is checked on the resource,\n * not the URL shape, mirroring Google Slides. Kept for callsite\n * compatibility; the prop is now a no-op. */\n shareUrlRequiresPublic?: boolean;\n /** @deprecated See `shareUrlRequiresPublic`. No longer rendered. */\n shareUrlUnavailableDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesPolicy {\n /** When false, the visibility picker hides \"Public\". Default: true. */\n allowPublic: boolean;\n /** When true, individual user shares must target an org member or pending invitee. Default: false. */\n requireOrgMemberForUserShares: boolean;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n /** Server-declared policy for what visibilities and share targets are allowed. */\n policy?: SharesPolicy;\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility): Promise<void> => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n return new Promise((resolve, reject) => {\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId === visibilityRequestId.current) {\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n }\n sharesQuery\n .refetch()\n .then(() => resolve())\n .catch(reject)\n .finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: (error) => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n }\n reject(error);\n },\n },\n );\n });\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const policy: SharesPolicy = sharesQuery.data?.policy ?? {\n allowPublic: true,\n requireOrgMemberForUserShares: false,\n };\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => Promise<void>;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const [shareError, setShareError] = useState<string | null>(null);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const policy: SharesPolicy = data?.policy ?? {\n allowPublic: true,\n requireOrgMemberForUserShares: false,\n };\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n setShareError(null);\n void onVisibilityChange(next).catch((err) => {\n setShareError(extractShareErrorMessage(err));\n });\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setShareError(null);\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: (err: any) => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n setEmail(trimmed);\n setShareError(extractShareErrorMessage(err));\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleDone = () => {\n if (canManage && hasInviteEmail) handleAdd();\n onClose();\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder={\n policy.requireOrgMemberForUserShares\n ? \"Add people from your organization\"\n : \"Add people by email\"\n }\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n if (shareError) setShareError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {shareError ? (\n <div\n role=\"alert\"\n className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n {shareError}\n </div>\n ) : null}\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n allowPublic={policy.allowPublic}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n />\n ) : props.shareUrlPlaceholder ? (\n <div className=\"mb-4 rounded-md border border-dashed border-border bg-muted/20 px-3 py-2.5 text-xs text-muted-foreground\">\n {props.shareUrlLabel ? (\n <div className=\"mb-0.5 font-medium text-foreground\">\n {props.shareUrlLabel}\n </div>\n ) : null}\n {props.shareUrlPlaceholder}\n </div>\n ) : null}\n\n {props.secondaryShareUrl ? (\n <CopyLinkField\n value={props.secondaryShareUrl}\n label={props.secondaryShareUrlLabel}\n description={props.secondaryShareUrlDescription}\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={handleDone}\n className={BUTTON_PRIMARY_SM}\n >\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n value={value}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm text-muted-foreground outline-none\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n /** When false, the \"Public\" option is omitted. Default: true. */\n allowPublic?: boolean;\n}) {\n const allowPublic = props.allowPublic !== false;\n const current = visibilityMeta(props.value, props.visibilityCopy);\n const options = (Object.keys(VIS_META) as Visibility[]).filter(\n (k) => allowPublic || k !== \"public\",\n );\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={options.map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\n\n/**\n * Pull a user-readable error message out of a failed action call. Action\n * routes surface server-side errors as a JSON `{ error: string }` body that\n * the `useActionMutation` wrapper re-throws as\n * `Error(\"Action <name> failed: <message>\")`. Strip the framework prefix so\n * what reaches the user is the underlying server message.\n */\nfunction extractShareErrorMessage(err: unknown): string {\n const fallback = \"Could not update sharing — please try again.\";\n const pickRaw = (): string | null => {\n if (!err) return null;\n if (err instanceof Error) return err.message?.trim() || null;\n if (typeof err === \"string\") return err.trim() || null;\n if (typeof err === \"object\") {\n const any = err as { error?: unknown; message?: unknown };\n if (typeof any.error === \"string\" && any.error.trim()) return any.error;\n if (typeof any.message === \"string\" && any.message.trim())\n return any.message;\n }\n return null;\n };\n const raw = pickRaw();\n if (!raw || raw.toLowerCase() === \"failed to fetch\") return fallback;\n const stripped = raw.replace(/^Action\\s+[\\w-]+\\s+failed:\\s*/i, \"\");\n return stripped || fallback;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
1
+ {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n IconSearchOff,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover.\n * This is treated as the primary \"Copy link\" target — same convention\n * as Google Docs' Share dialog, which copies the editor URL. */\n shareUrl?: string;\n /** Optional label for the primary copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the primary copyable link section. */\n shareUrlDescription?: ReactNode;\n /** Optional placeholder shown in the share-URL slot when `shareUrl` is\n * undefined. Use this to explain *why* there's no link yet (e.g. \"Publish\n * this form to get a public response link\") instead of leaving the slot\n * empty. */\n shareUrlPlaceholder?: ReactNode;\n /** Optional secondary copyable link (e.g. a presentation / read-only\n * surface for the same resource). Anyone with at least viewer access\n * can open it — access is enforced on the resource itself, not the\n * URL shape, so we never gate this behind visibility. */\n secondaryShareUrl?: string;\n /** Optional label for the secondary copyable link. */\n secondaryShareUrlLabel?: string;\n /** Optional helper text for the secondary copyable link. */\n secondaryShareUrlDescription?: ReactNode;\n /** @deprecated No longer enforced — access is checked on the resource,\n * not the URL shape, mirroring Google Slides. Kept for callsite\n * compatibility; the prop is now a no-op. */\n shareUrlRequiresPublic?: boolean;\n /** @deprecated See `shareUrlRequiresPublic`. No longer rendered. */\n shareUrlUnavailableDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n /** Optional Notion-style organization access control. When present, the\n * share panel shows a \"Hide in search\" switch for org visibility. */\n hideInSearchControl?: {\n checked: boolean;\n pending?: boolean;\n label?: string;\n description?: ReactNode;\n onCheckedChange: (checked: boolean) => void | Promise<void>;\n };\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesPolicy {\n /** When false, the visibility picker hides \"Public\". Default: true. */\n allowPublic: boolean;\n /** When true, individual user shares must target an org member or pending invitee. Default: false. */\n requireOrgMemberForUserShares: boolean;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n /** Server-declared policy for what visibilities and share targets are allowed. */\n policy?: SharesPolicy;\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility): Promise<void> => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n return new Promise((resolve, reject) => {\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId === visibilityRequestId.current) {\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n }\n sharesQuery\n .refetch()\n .then(() => resolve())\n .catch(reject)\n .finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: (error) => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n }\n reject(error);\n },\n },\n );\n });\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const policy: SharesPolicy = sharesQuery.data?.policy ?? {\n allowPublic: true,\n requireOrgMemberForUserShares: false,\n };\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => Promise<void>;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const [shareError, setShareError] = useState<string | null>(null);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const policy: SharesPolicy = data?.policy ?? {\n allowPublic: true,\n requireOrgMemberForUserShares: false,\n };\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n setShareError(null);\n void onVisibilityChange(next).catch((err) => {\n setShareError(extractShareErrorMessage(err));\n });\n };\n\n const handleHideInSearch = () => {\n const control = props.hideInSearchControl;\n if (!control || control.pending || !canManage) return;\n setShareError(null);\n try {\n Promise.resolve(control.onCheckedChange(!control.checked)).catch(\n (err) => {\n setShareError(extractShareErrorMessage(err));\n },\n );\n } catch (err) {\n setShareError(extractShareErrorMessage(err));\n }\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setShareError(null);\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: (err: any) => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n setEmail(trimmed);\n setShareError(extractShareErrorMessage(err));\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleDone = () => {\n if (canManage && hasInviteEmail) handleAdd();\n onClose();\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder={\n policy.requireOrgMemberForUserShares\n ? \"Add people from your organization\"\n : \"Add people by email\"\n }\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n if (shareError) setShareError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {shareError ? (\n <div\n role=\"alert\"\n className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n {shareError}\n </div>\n ) : null}\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n allowPublic={policy.allowPublic}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {visibility === \"org\" && props.hideInSearchControl ? (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={props.hideInSearchControl.checked}\n disabled={!canManage || props.hideInSearchControl.pending}\n onClick={handleHideInSearch}\n className={cn(\n \"mb-4 flex w-full items-center gap-3 rounded-md border border-border/70 bg-muted/25 px-3 py-2.5 text-left transition-colors hover:bg-accent/45 disabled:cursor-not-allowed disabled:opacity-60\",\n props.hideInSearchControl.checked &&\n \"border-border bg-accent/35 text-foreground\",\n )}\n >\n <span\n aria-hidden\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-border bg-muted-foreground/25 transition-colors\",\n props.hideInSearchControl.checked &&\n \"border-primary/70 bg-primary\",\n )}\n >\n <span\n className={cn(\n \"ml-0.5 size-4 rounded-full bg-background shadow-sm transition-transform\",\n props.hideInSearchControl.checked && \"translate-x-4\",\n )}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <IconSearchOff size={14} strokeWidth={1.8} />\n {props.hideInSearchControl.label ?? \"Hide in search\"}\n </span>\n <span className=\"mt-0.5 block text-xs leading-5 text-muted-foreground\">\n {props.hideInSearchControl.description ??\n \"People with the link can still open this.\"}\n </span>\n </span>\n </button>\n ) : null}\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n />\n ) : props.shareUrlPlaceholder ? (\n <div className=\"mb-4 rounded-md border border-dashed border-border bg-muted/20 px-3 py-2.5 text-xs text-muted-foreground\">\n {props.shareUrlLabel ? (\n <div className=\"mb-0.5 font-medium text-foreground\">\n {props.shareUrlLabel}\n </div>\n ) : null}\n {props.shareUrlPlaceholder}\n </div>\n ) : null}\n\n {props.secondaryShareUrl ? (\n <CopyLinkField\n value={props.secondaryShareUrl}\n label={props.secondaryShareUrlLabel}\n description={props.secondaryShareUrlDescription}\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={handleDone}\n className={BUTTON_PRIMARY_SM}\n >\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n value={value}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm text-muted-foreground outline-none\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n /** When false, the \"Public\" option is omitted. Default: true. */\n allowPublic?: boolean;\n}) {\n const allowPublic = props.allowPublic !== false;\n const current = visibilityMeta(props.value, props.visibilityCopy);\n const options = (Object.keys(VIS_META) as Visibility[]).filter(\n (k) => allowPublic || k !== \"public\",\n );\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={options.map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\n\n/**\n * Pull a user-readable error message out of a failed action call. Action\n * routes surface server-side errors as a JSON `{ error: string }` body that\n * the `useActionMutation` wrapper re-throws as\n * `Error(\"Action <name> failed: <message>\")`. Strip the framework prefix so\n * what reaches the user is the underlying server message.\n */\nfunction extractShareErrorMessage(err: unknown): string {\n const fallback = \"Could not update sharing — please try again.\";\n const pickRaw = (): string | null => {\n if (!err) return null;\n if (err instanceof Error) return err.message?.trim() || null;\n if (typeof err === \"string\") return err.trim() || null;\n if (typeof err === \"object\") {\n const any = err as { error?: unknown; message?: unknown };\n if (typeof any.error === \"string\" && any.error.trim()) return any.error;\n if (typeof any.message === \"string\" && any.message.trim())\n return any.message;\n }\n return null;\n };\n const raw = pickRaw();\n if (!raw || raw.toLowerCase() === \"failed to fetch\") return fallback;\n const stripped = raw.replace(/^Action\\s+[\\w-]+\\s+failed:\\s*/i, \"\");\n return stripped || fallback;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-models.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-models.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,eAAe,CAAC;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAClD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,UAAU,OAAO;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAgC,EAChC,OAAc,GACf,GAAE,OAAY,GAAG,mBAAmB,CAyQpC"}
1
+ {"version":3,"file":"use-chat-models.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-models.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,eAAe,CAAC;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAClD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,UAAU,OAAO;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAgC,EAChC,OAAc,GACf,GAAE,OAAY,GAAG,mBAAmB,CA2QpC"}
@@ -160,7 +160,7 @@ export function useChatModels({ storageKey = DEFAULT_STORAGE_KEY, enabled = true
160
160
  "ai-sdk:google",
161
161
  ]);
162
162
  groups = enginesData.engines
163
- .filter((e) => allowedEngines.has(e.name))
163
+ .filter((e) => allowedEngines.has(e.name) && e.packageInstalled !== false)
164
164
  .map((e) => {
165
165
  const models = [...e.supportedModels];
166
166
  if (e.name === currentEngineName &&
@@ -172,10 +172,9 @@ export function useChatModels({ storageKey = DEFAULT_STORAGE_KEY, enabled = true
172
172
  engine: e.name,
173
173
  label: e.label,
174
174
  models,
175
- configured: e.packageInstalled !== false &&
176
- (e.requiredEnvVars.length === 0 ||
177
- e.requiredEnvVars.some((v) => configuredKeys.has(v)) ||
178
- e.name === currentEngineName),
175
+ configured: e.requiredEnvVars.length === 0 ||
176
+ e.requiredEnvVars.some((v) => configuredKeys.has(v)) ||
177
+ e.name === currentEngineName,
179
178
  };
180
179
  });
181
180
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-models.js","sourceRoot":"","sources":["../../src/client/use-chat-models.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\n\nexport interface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\n\nexport interface UseChatModelsResult {\n availableModels: EngineModelGroup[];\n defaultModel: string;\n selectedModel: string;\n selectedEngine: string;\n selectedEffort: ReasoningEffort;\n onModelChange: (model: string, engine: string) => void;\n onEffortChange: (effort: ReasoningEffort) => void;\n refreshEngines: () => void;\n}\n\ninterface Options {\n /**\n * localStorage key used to persist the user's model + effort selection across\n * page loads. Pass `null` to disable persistence.\n */\n storageKey?: string | null;\n /**\n * Disable server-backed model discovery for hosts that provide their own\n * model list/state, such as Electron Code.\n */\n enabled?: boolean;\n}\n\nconst DEFAULT_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\ninterface PersistedSelection {\n model?: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\nfunction readPersisted(key: string | null): PersistedSelection {\n if (!key || typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? (JSON.parse(raw) as PersistedSelection) : {};\n } catch {\n return {};\n }\n}\n\nfunction writePersisted(key: string | null, value: PersistedSelection) {\n if (!key || typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {}\n}\n\n/**\n * Fetches available engines/models from the agent server and exposes the same\n * model picker state that `MultiTabAssistantChat` wires up — for surfaces like\n * the Dispatch homepage hero composer that need an identical model picker\n * without mounting the full tabbed chat.\n */\nexport function useChatModels({\n storageKey = DEFAULT_STORAGE_KEY,\n enabled = true,\n}: Options = {}): UseChatModelsResult {\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n\n const initialPersisted = readPersisted(storageKey);\n const hasExplicitSelectionRef = useRef(Boolean(initialPersisted.model));\n const [selectedModel, setSelectedModel] = useState<string>(\n initialPersisted.model ?? DEFAULT_MODEL,\n );\n const [selectedEngine, setSelectedEngine] = useState<string>(\n initialPersisted.engine ?? \"\",\n );\n const [selectedEffort, setSelectedEffort] = useState<ReasoningEffort>(\n initialPersisted.effort ?? \"auto\",\n );\n const selectionRef = useRef({\n selectedModel,\n selectedEngine,\n selectedEffort,\n });\n\n useEffect(() => {\n selectionRef.current = {\n selectedModel,\n selectedEngine,\n selectedEffort,\n };\n }, [selectedEffort, selectedEngine, selectedModel]);\n\n const onModelChange = useCallback(\n (model: string, engine: string) => {\n hasExplicitSelectionRef.current = true;\n const effortOptions = getReasoningEffortOptionsForModel(model);\n setSelectedModel(model);\n setSelectedEngine(engine);\n setSelectedEffort((prevEffort) => {\n const next =\n prevEffort === \"auto\" || effortOptions.includes(prevEffort)\n ? prevEffort\n : \"auto\";\n writePersisted(storageKey, { model, engine, effort: next });\n return next;\n });\n },\n [storageKey],\n );\n\n const onEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n hasExplicitSelectionRef.current = true;\n setSelectedEffort(effort);\n writePersisted(storageKey, {\n model: selectedModel,\n engine: selectedEngine,\n effort,\n });\n },\n [selectedEngine, selectedModel, storageKey],\n );\n\n const refreshEngines = useCallback(() => {\n if (!enabled) return;\n Promise.all([\n fetch(agentNativePath(\"/_agent-native/actions/manage-agent-engine\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"list\" }),\n }).then((r) => (r.ok ? r.json() : null)),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n let groups: EngineModelGroup[];\n\n if (builderConnected) {\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n const other = builderModels.filter(\n (m: string) =>\n !m.startsWith(\"claude-\") &&\n !m.startsWith(\"gpt-\") &&\n !m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ...(other.length\n ? [\n {\n engine: \"builder\",\n label: \"More\",\n models: other,\n configured: true,\n },\n ]\n : []),\n ];\n\n if (currentModel && !builderModels.includes(currentModel)) {\n const firstGroup = groups[0];\n if (firstGroup) firstGroup.models.unshift(currentModel);\n }\n } else {\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter((e: any) => allowedEngines.has(e.name))\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.packageInstalled !== false &&\n (e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName),\n };\n });\n }\n const nextDefaultModel = currentModel ?? DEFAULT_MODEL;\n setAvailableModels(groups);\n setDefaultModel(nextDefaultModel);\n\n const selection = selectionRef.current;\n if (!hasExplicitSelectionRef.current) {\n const defaultGroup =\n groups.find((group) => group.models.includes(nextDefaultModel)) ??\n groups[0];\n const nextModel =\n defaultGroup?.models.find((model) => model === nextDefaultModel) ??\n defaultGroup?.models[0] ??\n nextDefaultModel;\n const nextEngine = defaultGroup?.engine ?? \"\";\n const effortOptions = getReasoningEffortOptionsForModel(nextModel);\n const nextEffort =\n selection.selectedEffort === \"auto\" ||\n effortOptions.includes(selection.selectedEffort)\n ? selection.selectedEffort\n : \"auto\";\n setSelectedModel(nextModel);\n setSelectedEngine(nextEngine);\n setSelectedEffort(nextEffort);\n return;\n }\n\n const selectedGroup = groups.find(\n (group) =>\n group.models.includes(selection.selectedModel) &&\n (!selection.selectedEngine ||\n group.engine === selection.selectedEngine),\n );\n if (!selectedGroup) {\n const defaultGroup =\n groups.find((group) => group.models.includes(nextDefaultModel)) ??\n groups[0];\n const nextModel =\n defaultGroup?.models.find((model) => model === nextDefaultModel) ??\n defaultGroup?.models[0] ??\n nextDefaultModel;\n const nextEngine = defaultGroup?.engine ?? \"\";\n const effortOptions = getReasoningEffortOptionsForModel(nextModel);\n const nextEffort =\n selection.selectedEffort === \"auto\" ||\n effortOptions.includes(selection.selectedEffort)\n ? selection.selectedEffort\n : \"auto\";\n setSelectedModel(nextModel);\n setSelectedEngine(nextEngine);\n setSelectedEffort(nextEffort);\n writePersisted(storageKey, {\n model: nextModel,\n engine: nextEngine,\n effort: nextEffort,\n });\n }\n })\n .catch(() => {});\n }, [enabled, storageKey]);\n\n useEffect(() => {\n if (!enabled) return;\n refreshEngines();\n }, [enabled, refreshEngines]);\n\n return {\n availableModels,\n defaultModel,\n selectedModel,\n selectedEngine,\n selectedEffort,\n onModelChange,\n onEffortChange,\n refreshEngines,\n };\n}\n"]}
1
+ {"version":3,"file":"use-chat-models.js","sourceRoot":"","sources":["../../src/client/use-chat-models.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\n\nexport interface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\n\nexport interface UseChatModelsResult {\n availableModels: EngineModelGroup[];\n defaultModel: string;\n selectedModel: string;\n selectedEngine: string;\n selectedEffort: ReasoningEffort;\n onModelChange: (model: string, engine: string) => void;\n onEffortChange: (effort: ReasoningEffort) => void;\n refreshEngines: () => void;\n}\n\ninterface Options {\n /**\n * localStorage key used to persist the user's model + effort selection across\n * page loads. Pass `null` to disable persistence.\n */\n storageKey?: string | null;\n /**\n * Disable server-backed model discovery for hosts that provide their own\n * model list/state, such as Electron Code.\n */\n enabled?: boolean;\n}\n\nconst DEFAULT_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\ninterface PersistedSelection {\n model?: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\nfunction readPersisted(key: string | null): PersistedSelection {\n if (!key || typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? (JSON.parse(raw) as PersistedSelection) : {};\n } catch {\n return {};\n }\n}\n\nfunction writePersisted(key: string | null, value: PersistedSelection) {\n if (!key || typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {}\n}\n\n/**\n * Fetches available engines/models from the agent server and exposes the same\n * model picker state that `MultiTabAssistantChat` wires up — for surfaces like\n * the Dispatch homepage hero composer that need an identical model picker\n * without mounting the full tabbed chat.\n */\nexport function useChatModels({\n storageKey = DEFAULT_STORAGE_KEY,\n enabled = true,\n}: Options = {}): UseChatModelsResult {\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n\n const initialPersisted = readPersisted(storageKey);\n const hasExplicitSelectionRef = useRef(Boolean(initialPersisted.model));\n const [selectedModel, setSelectedModel] = useState<string>(\n initialPersisted.model ?? DEFAULT_MODEL,\n );\n const [selectedEngine, setSelectedEngine] = useState<string>(\n initialPersisted.engine ?? \"\",\n );\n const [selectedEffort, setSelectedEffort] = useState<ReasoningEffort>(\n initialPersisted.effort ?? \"auto\",\n );\n const selectionRef = useRef({\n selectedModel,\n selectedEngine,\n selectedEffort,\n });\n\n useEffect(() => {\n selectionRef.current = {\n selectedModel,\n selectedEngine,\n selectedEffort,\n };\n }, [selectedEffort, selectedEngine, selectedModel]);\n\n const onModelChange = useCallback(\n (model: string, engine: string) => {\n hasExplicitSelectionRef.current = true;\n const effortOptions = getReasoningEffortOptionsForModel(model);\n setSelectedModel(model);\n setSelectedEngine(engine);\n setSelectedEffort((prevEffort) => {\n const next =\n prevEffort === \"auto\" || effortOptions.includes(prevEffort)\n ? prevEffort\n : \"auto\";\n writePersisted(storageKey, { model, engine, effort: next });\n return next;\n });\n },\n [storageKey],\n );\n\n const onEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n hasExplicitSelectionRef.current = true;\n setSelectedEffort(effort);\n writePersisted(storageKey, {\n model: selectedModel,\n engine: selectedEngine,\n effort,\n });\n },\n [selectedEngine, selectedModel, storageKey],\n );\n\n const refreshEngines = useCallback(() => {\n if (!enabled) return;\n Promise.all([\n fetch(agentNativePath(\"/_agent-native/actions/manage-agent-engine\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"list\" }),\n }).then((r) => (r.ok ? r.json() : null)),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n let groups: EngineModelGroup[];\n\n if (builderConnected) {\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n const other = builderModels.filter(\n (m: string) =>\n !m.startsWith(\"claude-\") &&\n !m.startsWith(\"gpt-\") &&\n !m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ...(other.length\n ? [\n {\n engine: \"builder\",\n label: \"More\",\n models: other,\n configured: true,\n },\n ]\n : []),\n ];\n\n if (currentModel && !builderModels.includes(currentModel)) {\n const firstGroup = groups[0];\n if (firstGroup) firstGroup.models.unshift(currentModel);\n }\n } else {\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter(\n (e: any) =>\n allowedEngines.has(e.name) && e.packageInstalled !== false,\n )\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName,\n };\n });\n }\n const nextDefaultModel = currentModel ?? DEFAULT_MODEL;\n setAvailableModels(groups);\n setDefaultModel(nextDefaultModel);\n\n const selection = selectionRef.current;\n if (!hasExplicitSelectionRef.current) {\n const defaultGroup =\n groups.find((group) => group.models.includes(nextDefaultModel)) ??\n groups[0];\n const nextModel =\n defaultGroup?.models.find((model) => model === nextDefaultModel) ??\n defaultGroup?.models[0] ??\n nextDefaultModel;\n const nextEngine = defaultGroup?.engine ?? \"\";\n const effortOptions = getReasoningEffortOptionsForModel(nextModel);\n const nextEffort =\n selection.selectedEffort === \"auto\" ||\n effortOptions.includes(selection.selectedEffort)\n ? selection.selectedEffort\n : \"auto\";\n setSelectedModel(nextModel);\n setSelectedEngine(nextEngine);\n setSelectedEffort(nextEffort);\n return;\n }\n\n const selectedGroup = groups.find(\n (group) =>\n group.models.includes(selection.selectedModel) &&\n (!selection.selectedEngine ||\n group.engine === selection.selectedEngine),\n );\n if (!selectedGroup) {\n const defaultGroup =\n groups.find((group) => group.models.includes(nextDefaultModel)) ??\n groups[0];\n const nextModel =\n defaultGroup?.models.find((model) => model === nextDefaultModel) ??\n defaultGroup?.models[0] ??\n nextDefaultModel;\n const nextEngine = defaultGroup?.engine ?? \"\";\n const effortOptions = getReasoningEffortOptionsForModel(nextModel);\n const nextEffort =\n selection.selectedEffort === \"auto\" ||\n effortOptions.includes(selection.selectedEffort)\n ? selection.selectedEffort\n : \"auto\";\n setSelectedModel(nextModel);\n setSelectedEngine(nextEngine);\n setSelectedEffort(nextEffort);\n writePersisted(storageKey, {\n model: nextModel,\n engine: nextEngine,\n effort: nextEffort,\n });\n }\n })\n .catch(() => {});\n }, [enabled, storageKey]);\n\n useEffect(() => {\n if (!enabled) return;\n refreshEngines();\n }, [enabled, refreshEngines]);\n\n return {\n availableModels,\n defaultModel,\n selectedModel,\n selectedEngine,\n selectedEffort,\n onModelChange,\n onEffortChange,\n refreshEngines,\n };\n}\n"]}
@@ -127,6 +127,7 @@ export declare function pgPoolOptions(url: string): Record<string, unknown>;
127
127
  * proceed when one connection is busy.
128
128
  */
129
129
  export declare function neonPoolMax(): number;
130
+ export declare function attachNeonPoolErrorLogger(pool: unknown, label?: string): void;
130
131
  export declare function createDbExec(config?: DbExecConfig): Promise<DbExec>;
131
132
  /**
132
133
  * Get the singleton database client. Returns a `DbExec` whose first
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
package/dist/db/client.js CHANGED
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import path from "path";
12
12
  const recyclingPostgresPools = new WeakSet();
13
+ const loggedNeonPools = new WeakSet();
13
14
  // ---------------------------------------------------------------------------
14
15
  // Per-app DATABASE_URL resolution
15
16
  // ---------------------------------------------------------------------------
@@ -434,6 +435,29 @@ export function pgPoolOptions(url) {
434
435
  export function neonPoolMax() {
435
436
  return isServerlessRuntime() ? 2 : 10;
436
437
  }
438
+ export function attachNeonPoolErrorLogger(pool, label = "db/neon") {
439
+ if (!pool || typeof pool !== "object")
440
+ return;
441
+ if (loggedNeonPools.has(pool))
442
+ return;
443
+ const withEvents = pool;
444
+ if (typeof withEvents.on !== "function")
445
+ return;
446
+ loggedNeonPools.add(pool);
447
+ withEvents.on("error", (err) => {
448
+ console.warn(`[${label}] pool error (will reconnect on next query):`, err instanceof Error ? err.message : err);
449
+ });
450
+ }
451
+ function disposePostgresPoolEventually(pool, label) {
452
+ if (!pool || typeof pool !== "object")
453
+ return;
454
+ if (recyclingPostgresPools.has(pool))
455
+ return;
456
+ recyclingPostgresPools.add(pool);
457
+ void pool.end().catch((err) => {
458
+ console.warn(`[db/postgres] ${label} cleanup failed:`, err instanceof Error ? err.message : err);
459
+ });
460
+ }
437
461
  // ---------------------------------------------------------------------------
438
462
  // Singleton client — lazy-initialized on first execute() call
439
463
  // ---------------------------------------------------------------------------
@@ -481,15 +505,7 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
481
505
  if (isNeonUrl(url)) {
482
506
  const { Pool } = await import("@neondatabase/serverless");
483
507
  const pool = new Pool({ connectionString: url, max: neonPoolMax() });
484
- // Neon's serverless Pool extends EventEmitter and emits 'error'
485
- // when its WebSocket connection drops (idle timeout, Lambda
486
- // suspend, network blip). Without a listener, Node 24 surfaces
487
- // these as fatal `Unhandled error` / `Connection terminated
488
- // unexpectedly` uncaught exceptions, even though the next query
489
- // would have transparently re-connected. Log and swallow.
490
- pool.on("error", (err) => {
491
- console.warn("[db/neon] pool error (will reconnect on next query):", err instanceof Error ? err.message : err);
492
- });
508
+ attachNeonPoolErrorLogger(pool);
493
509
  if (trackSingletonResources)
494
510
  _neonPool = pool;
495
511
  return {
@@ -543,7 +559,7 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
543
559
  const pgSql = sqliteToPostgresParams(rawSql);
544
560
  const result = await withDbTimeout("query", () => conn.unsafe(pgSql, args), dbOpTimeoutMs(), () => {
545
561
  timedOut = true;
546
- return conn.end({ timeout: 1 });
562
+ disposePostgresPoolEventually(conn, "timed-out worker query");
547
563
  });
548
564
  return {
549
565
  rows: Array.from(result),
@@ -551,8 +567,11 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
551
567
  };
552
568
  }
553
569
  finally {
554
- if (!timedOut)
555
- await conn.end();
570
+ if (!timedOut) {
571
+ await conn.end().catch((err) => {
572
+ console.warn("[db/postgres] worker query cleanup failed:", err instanceof Error ? err.message : err);
573
+ });
574
+ }
556
575
  }
557
576
  },
558
577
  };
@@ -567,16 +586,13 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
567
586
  let pool = createPool();
568
587
  if (trackSingletonResources)
569
588
  _pgPool = pool;
570
- const recyclePool = async (timedOutPool) => {
571
- if (recyclingPostgresPools.has(timedOutPool))
572
- return;
573
- recyclingPostgresPools.add(timedOutPool);
589
+ const recyclePool = (timedOutPool) => {
574
590
  if (pool === timedOutPool) {
575
591
  pool = createPool();
576
592
  if (trackSingletonResources)
577
593
  _pgPool = pool;
578
594
  }
579
- await timedOutPool.end({ timeout: 1 });
595
+ disposePostgresPoolEventually(timedOutPool, "timed-out pooled query");
580
596
  };
581
597
  return {
582
598
  async execute(sql) {