@agent-native/core 0.92.5 → 0.92.7

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 (148) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +19 -0
  3. package/corpus/core/docs/content/template-assets.mdx +139 -0
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +96 -6
  6. package/corpus/core/src/cli/sync-builder-starter-manifest.ts +1 -1
  7. package/corpus/core/src/client/AssistantChat.tsx +127 -15
  8. package/corpus/core/src/client/chat/tool-call-display.tsx +9 -3
  9. package/corpus/core/src/client/org/TeamPage.tsx +274 -177
  10. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -6
  11. package/corpus/core/src/client/settings/SettingsPanel.tsx +1 -1
  12. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +49 -1
  13. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +2 -2
  14. package/corpus/core/src/demo/config.ts +3 -3
  15. package/corpus/core/src/demo/redact.ts +720 -0
  16. package/corpus/core/src/extensions/url-safety.ts +13 -1
  17. package/corpus/core/src/localization/default-messages.ts +7 -0
  18. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +7 -0
  19. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +7 -0
  20. package/corpus/core/src/templates/default/app/i18n/en-US.ts +7 -0
  21. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +7 -0
  22. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +7 -0
  23. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +7 -0
  24. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +7 -0
  25. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +7 -0
  26. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +7 -0
  27. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -0
  28. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -0
  29. package/corpus/templates/analytics/AGENTS.md +6 -3
  30. package/corpus/templates/analytics/changelog/2026-07-09-uptime-monitors-use-scheduled-workers-in-production-serverless.md +6 -0
  31. package/corpus/templates/analytics/docs/uptime-monitoring.md +5 -0
  32. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +14 -2
  33. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +35 -0
  34. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +19 -0
  35. package/corpus/templates/assets/AGENTS.md +13 -0
  36. package/corpus/templates/assets/actions/_generation-preset-settings.ts +73 -0
  37. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +63 -0
  38. package/corpus/templates/assets/actions/create-generation-preset.ts +22 -8
  39. package/corpus/templates/assets/actions/duplicate-library.ts +49 -1
  40. package/corpus/templates/assets/actions/generate-image-batch.ts +14 -1
  41. package/corpus/templates/assets/actions/generate-image.ts +195 -26
  42. package/corpus/templates/assets/actions/import-asset-from-url.ts +323 -0
  43. package/corpus/templates/assets/actions/list-generation-presets.ts +1 -1
  44. package/corpus/templates/assets/actions/rerun-generation-run.ts +37 -0
  45. package/corpus/templates/assets/actions/update-generation-preset.ts +19 -1
  46. package/corpus/templates/assets/app/i18n/ar-SA.ts +1 -0
  47. package/corpus/templates/assets/app/i18n/de-DE.ts +1 -0
  48. package/corpus/templates/assets/app/i18n/es-ES.ts +1 -0
  49. package/corpus/templates/assets/app/i18n/fr-FR.ts +1 -0
  50. package/corpus/templates/assets/app/i18n/hi-IN.ts +1 -0
  51. package/corpus/templates/assets/app/i18n/ja-JP.ts +1 -0
  52. package/corpus/templates/assets/app/i18n/ko-KR.ts +1 -0
  53. package/corpus/templates/assets/app/i18n/pt-BR.ts +1 -0
  54. package/corpus/templates/assets/app/i18n/zh-CN.ts +1 -0
  55. package/corpus/templates/assets/app/i18n/zh-TW.ts +41 -0
  56. package/corpus/templates/assets/app/i18n-data.ts +93 -0
  57. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +66 -11
  58. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +959 -24
  59. package/corpus/templates/assets/changelog/2026-07-07-preset-skeleton-controls-fit-correctly-on-narrower-edit-page.md +6 -0
  60. package/corpus/templates/assets/changelog/2026-07-09-import-reference-images-from-url.md +6 -0
  61. package/corpus/templates/assets/changelog/2026-07-09-preset-reference-board.md +6 -0
  62. package/corpus/templates/assets/server/handlers/assets.ts +7 -27
  63. package/corpus/templates/assets/server/lib/generation.ts +83 -2
  64. package/corpus/templates/assets/server/lib/preset-chat-context.ts +17 -4
  65. package/corpus/templates/assets/server/lib/preset-references.ts +182 -0
  66. package/corpus/templates/assets/server/lib/upload-validation.ts +38 -0
  67. package/corpus/templates/assets/shared/api.ts +20 -0
  68. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +6 -0
  69. package/corpus/templates/calendar/actions/create-event.ts +8 -2
  70. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +22 -7
  71. package/corpus/templates/calendar/changelog/2026-07-09-calendar-events-with-guests-now-automatically-get-a-google-m.md +6 -0
  72. package/corpus/templates/calendar/changelog/2026-07-09-new-events-now-mark-the-creator-rsvp-as-yes.md +6 -0
  73. package/corpus/templates/calendar/server/handlers/events.ts +9 -2
  74. package/corpus/templates/calendar/server/lib/event-video-conferencing.ts +58 -0
  75. package/corpus/templates/calendar/server/lib/google-calendar.ts +1 -0
  76. package/corpus/templates/clips/changelog/2026-07-09-meeting-reminder-popovers-can-now-be-dismissed-with-a-top-le.md +6 -0
  77. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +3 -1
  78. package/corpus/templates/clips/desktop/src/styles.css +13 -9
  79. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +5 -2
  80. package/dist/agent/production-agent.d.ts +34 -1
  81. package/dist/agent/production-agent.d.ts.map +1 -1
  82. package/dist/agent/production-agent.js +58 -5
  83. package/dist/agent/production-agent.js.map +1 -1
  84. package/dist/cli/sync-builder-starter-manifest.js +1 -1
  85. package/dist/cli/sync-builder-starter-manifest.js.map +1 -1
  86. package/dist/client/AssistantChat.d.ts +3 -1
  87. package/dist/client/AssistantChat.d.ts.map +1 -1
  88. package/dist/client/AssistantChat.js +96 -15
  89. package/dist/client/AssistantChat.js.map +1 -1
  90. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  91. package/dist/client/chat/tool-call-display.js +5 -1
  92. package/dist/client/chat/tool-call-display.js.map +1 -1
  93. package/dist/client/org/TeamPage.d.ts.map +1 -1
  94. package/dist/client/org/TeamPage.js +32 -13
  95. package/dist/client/org/TeamPage.js.map +1 -1
  96. package/dist/client/settings/DemoModeSection.d.ts +3 -3
  97. package/dist/client/settings/DemoModeSection.js +4 -4
  98. package/dist/client/settings/DemoModeSection.js.map +1 -1
  99. package/dist/client/settings/SettingsPanel.js +1 -1
  100. package/dist/client/settings/SettingsPanel.js.map +1 -1
  101. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  102. package/dist/client/settings/SettingsTabsPage.js +38 -2
  103. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  104. package/dist/collab/routes.d.ts +1 -1
  105. package/dist/collab/struct-routes.d.ts +1 -1
  106. package/dist/demo/actions/toggle-demo-mode.js +2 -2
  107. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  108. package/dist/demo/config.js +3 -3
  109. package/dist/demo/config.js.map +1 -1
  110. package/dist/demo/redact.d.ts +1 -1
  111. package/dist/demo/redact.d.ts.map +1 -1
  112. package/dist/demo/redact.js +0 -0
  113. package/dist/demo/redact.js.map +1 -1
  114. package/dist/extensions/url-safety.d.ts +5 -0
  115. package/dist/extensions/url-safety.d.ts.map +1 -1
  116. package/dist/extensions/url-safety.js +10 -0
  117. package/dist/extensions/url-safety.js.map +1 -1
  118. package/dist/localization/default-messages.d.ts +7 -0
  119. package/dist/localization/default-messages.d.ts.map +1 -1
  120. package/dist/localization/default-messages.js +7 -0
  121. package/dist/localization/default-messages.js.map +1 -1
  122. package/dist/notifications/routes.d.ts +2 -2
  123. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  124. package/dist/resources/handlers.d.ts +2 -2
  125. package/dist/templates/default/app/i18n/ar-SA.ts +7 -0
  126. package/dist/templates/default/app/i18n/de-DE.ts +7 -0
  127. package/dist/templates/default/app/i18n/en-US.ts +7 -0
  128. package/dist/templates/default/app/i18n/es-ES.ts +7 -0
  129. package/dist/templates/default/app/i18n/fr-FR.ts +7 -0
  130. package/dist/templates/default/app/i18n/hi-IN.ts +7 -0
  131. package/dist/templates/default/app/i18n/ja-JP.ts +7 -0
  132. package/dist/templates/default/app/i18n/ko-KR.ts +7 -0
  133. package/dist/templates/default/app/i18n/pt-BR.ts +7 -0
  134. package/dist/templates/default/app/i18n/zh-CN.ts +7 -0
  135. package/dist/templates/default/app/i18n/zh-TW.ts +7 -0
  136. package/docs/content/template-assets.mdx +139 -0
  137. package/package.json +1 -1
  138. package/src/templates/default/app/i18n/ar-SA.ts +7 -0
  139. package/src/templates/default/app/i18n/de-DE.ts +7 -0
  140. package/src/templates/default/app/i18n/en-US.ts +7 -0
  141. package/src/templates/default/app/i18n/es-ES.ts +7 -0
  142. package/src/templates/default/app/i18n/fr-FR.ts +7 -0
  143. package/src/templates/default/app/i18n/hi-IN.ts +7 -0
  144. package/src/templates/default/app/i18n/ja-JP.ts +7 -0
  145. package/src/templates/default/app/i18n/ko-KR.ts +7 -0
  146. package/src/templates/default/app/i18n/pt-BR.ts +7 -0
  147. package/src/templates/default/app/i18n/zh-CN.ts +7 -0
  148. package/src/templates/default/app/i18n/zh-TW.ts +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TeamPage.js","sourceRoot":"","sources":["../../../src/client/org/TeamPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconUserPlus,\n IconTrash,\n IconCrown,\n IconShieldCheck,\n IconLoader2,\n IconCheck,\n IconPencil,\n IconAt,\n IconX,\n IconKey,\n IconCopy,\n IconRefresh,\n IconEye,\n IconEyeOff,\n IconCloudUpload,\n IconFileImport,\n IconPlus,\n IconAlertTriangle,\n IconUsersGroup,\n} from \"@tabler/icons-react\";\nimport { useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport type { DomainMatchOrg } from \"../../org/types.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n useOrg,\n useOrgMembers,\n useOrgInvitations,\n useCreateOrg,\n useUpdateOrg,\n useBulkInviteMembers,\n useChangeMemberRole,\n useAcceptInvitation,\n useRemoveMember,\n useSwitchOrg,\n useSetOrgDomain,\n useSetA2ASecret,\n useSyncA2ASecret,\n useJoinByDomain,\n type InviteRole,\n type SyncA2ASecretResult,\n} from \"./hooks.js\";\n\nexport interface TeamPageProps {\n /**\n * Optional wrapper around the page contents. Templates pass their own Layout\n * component so the Team page renders inside the template's chrome.\n */\n layout?: (children: ReactNode) => ReactNode;\n /**\n * Title shown at the top of the page. Defaults to \"Team\".\n */\n title?: string;\n /**\n * Hide the page title when this is rendered inside another titled surface,\n * such as the Settings > Team tab.\n */\n showTitle?: boolean;\n /**\n * Description shown on the \"Create an Organization\" card. Defaults to\n * \"Set up a team to collaborate with your colleagues.\"\n */\n createOrgDescription?: string;\n /**\n * Class applied to the outer max-width container. Templates can use this to\n * tweak page width.\n */\n className?: string;\n}\n\nfunction RoleIcon({ role }: { role: string }) {\n if (role === \"owner\")\n return <IconCrown className=\"h-3.5 w-3.5 text-amber-500\" />;\n if (role === \"admin\")\n return <IconShieldCheck className=\"h-3.5 w-3.5 text-blue-500\" />;\n return null;\n}\n\nfunction ErrorText({ error }: { error: unknown }) {\n if (!error) return null;\n return (\n <p className=\"text-xs text-red-500\">\n {error instanceof Error ? error.message : String(error)}\n </p>\n );\n}\n\nfunction PendingInvitationsCard() {\n const t = useT();\n const { data: org } = useOrg();\n const acceptInvitation = useAcceptInvitation();\n\n if (!org?.pendingInvitations?.length) return null;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.pendingInvitations\")}</h3>\n {org.pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div>\n <div className=\"text-sm font-medium\">{inv.orgName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"org.invitedByLabel\", { name: inv.invitedBy })}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => acceptInvitation.mutate(inv.id)}\n disabled={acceptInvitation.isPending}\n className=\"rounded-md bg-green-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-green-700 disabled:opacity-50\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.accept\")\n )}\n </button>\n </div>\n ))}\n <ErrorText error={acceptInvitation.error} />\n </section>\n );\n}\n\nfunction JoinByDomainCard({ matches }: { matches: DomainMatchOrg[] }) {\n const t = useT();\n const joinByDomain = useJoinByDomain();\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.joinYourTeam\")}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {matches.length === 1\n ? t(\"org.joinDomainOne\")\n : t(\"org.joinDomainMany\")}\n </p>\n <div className=\"space-y-2\">\n {matches.map((m) => (\n <div\n key={m.orgId}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-blue-600/10\">\n <IconUsersGroup className=\"h-4 w-4 text-blue-600\" />\n </div>\n <div className=\"text-sm font-medium\">{m.orgName}</div>\n </div>\n <button\n type=\"button\"\n disabled={joinByDomain.isPending && pendingId === m.orgId}\n onClick={() => {\n setPendingId(m.orgId);\n joinByDomain.mutate(m.orgId, {\n onSettled: () => setPendingId(null),\n });\n }}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {joinByDomain.isPending && pendingId === m.orgId ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.join\")\n )}\n </button>\n </div>\n ))}\n </div>\n <ErrorText error={joinByDomain.error} />\n </section>\n );\n}\n\nfunction CreateOrgCard({ description }: { description?: string }) {\n const t = useT();\n const createOrg = useCreateOrg();\n const [name, setName] = useState(\"\");\n const [showForm, setShowForm] = useState(false);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.createOrgCardTitle\")}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {description || t(\"org.createOrgCardDescription\")}\n </p>\n {!showForm ? (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90\"\n >\n {t(\"org.createOrganization\")}\n </button>\n ) : (\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Acme Inc.\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={!name.trim() || createOrg.isPending}\n onClick={() =>\n createOrg.mutate(name.trim(), {\n onSuccess: () => {\n setName(\"\");\n setShowForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.create\")\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowForm(false);\n setName(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n {t(\"org.cancel\")}\n </button>\n </div>\n <ErrorText error={createOrg.error} />\n </div>\n )}\n </section>\n );\n}\n\nfunction OrgNameDisplay({ name, canEdit }: { name: string; canEdit: boolean }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(name);\n const updateOrg = useUpdateOrg();\n\n if (!canEdit) return <div className=\"text-sm font-medium\">{name}</div>;\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(name);\n setEditing(true);\n }}\n className=\"group flex items-center gap-1.5 text-sm font-medium hover:text-foreground/80\"\n >\n {name}\n <IconPencil className=\"h-3 w-3 text-muted-foreground opacity-0 group-hover:opacity-100\" />\n </button>\n );\n }\n\n function save() {\n const trimmed = draft.trim();\n if (!trimmed || trimmed === name) {\n setEditing(false);\n return;\n }\n updateOrg.mutate(trimmed, { onSuccess: () => setEditing(false) });\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n onBlur={save}\n className=\"rounded border border-border bg-background px-1.5 py-0.5 text-sm font-medium focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <ErrorText error={updateOrg.error} />\n </div>\n );\n}\n\nfunction MembersCard() {\n const t = useT();\n const { data: org } = useOrg();\n const { data: membersData, isLoading: isLoadingMembers } = useOrgMembers();\n const { data: invitationsData } = useOrgInvitations();\n const removeMember = useRemoveMember();\n const switchOrg = useSwitchOrg();\n\n const [showInviteForm, setShowInviteForm] = useState(false);\n\n if (!org?.orgId) return null;\n\n const isOwner = org.role === \"owner\";\n const isOwnerOrAdmin = isOwner || org.role === \"admin\";\n const members = membersData?.members ?? [];\n const pendingInvites = invitationsData?.invitations ?? [];\n const hasMultipleOrgs = (org.orgs?.length ?? 0) > 1;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-blue-600/10\">\n <IconUsersGroup className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <OrgNameDisplay name={org.orgName ?? \"\"} canEdit={isOwnerOrAdmin} />\n <div className=\"text-xs text-muted-foreground\">\n {t(\"org.memberCount\", { count: members.length })} ·{\" \"}\n {t(\"org.youAreRole\", { role: org.role })}\n </div>\n </div>\n </div>\n {hasMultipleOrgs && (\n <select\n value={org.orgId ?? \"\"}\n onChange={(e) => switchOrg.mutate(e.target.value || null)}\n disabled={switchOrg.isPending}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-xs\"\n >\n {org.orgs.map((o) => (\n <option key={o.orgId} value={o.orgId}>\n {o.orgName}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <div className=\"grid gap-5 border-t border-border pt-3 lg:grid-cols-[minmax(0,1fr)_minmax(18rem,22rem)]\">\n <div className=\"min-w-0 space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2\">\n {t(\"org.members\")}\n </div>\n {isLoadingMembers && members.length === 0 && (\n <>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className=\"flex items-center justify-between py-1.5 px-2\"\n >\n <div className=\"flex items-center gap-2\">\n <div\n className=\"h-3.5 rounded bg-muted animate-pulse\"\n style={{ width: `${140 + i * 30}px` }}\n />\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ))}\n </>\n )}\n {members.map((m) => (\n <MemberRow\n key={m.email}\n email={m.email}\n role={m.role}\n isCurrentUser={m.email === org.email}\n currentUserRole={org.role ?? null}\n />\n ))}\n {pendingInvites.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between gap-2 py-1.5 px-2 opacity-60\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm\">{inv.email}</span>\n <RoleIcon role={inv.role} />\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n Invited{inv.role === \"admin\" ? \" · admin\" : \"\"}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {isOwnerOrAdmin && (\n <div className=\"border-t border-border pt-3\">\n {!showInviteForm ? (\n <button\n type=\"button\"\n onClick={() => setShowInviteForm(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n Invite members\n </button>\n ) : (\n <BulkInviteForm\n currentUserRole={org.role}\n onClose={() => setShowInviteForm(false)}\n />\n )}\n </div>\n )}\n </div>\n\n {isOwnerOrAdmin && (\n <div className=\"min-w-0 space-y-3 border-t border-border pt-3 lg:border-s lg:border-t-0 lg:ps-5 lg:pt-0\">\n <DomainSettingsSection\n domain={org.allowedDomain}\n ownerEmail={org.email}\n />\n\n {isOwner && <A2ASecretSection secret={org.a2aSecret} />}\n </div>\n )}\n </div>\n\n <ErrorText error={removeMember.error} />\n <ErrorText error={switchOrg.error} />\n </section>\n );\n}\n\nfunction MemberRow({\n email,\n role,\n isCurrentUser,\n currentUserRole,\n}: {\n email: string;\n role: string;\n isCurrentUser: boolean;\n currentUserRole: string | null;\n}) {\n const t = useT();\n const removeMember = useRemoveMember();\n const changeRole = useChangeMemberRole();\n const [editing, setEditing] = useState(false);\n const [confirmingRemove, setConfirmingRemove] = useState(false);\n\n // Owners can manage admins + members. Admins can only manage members.\n // Owners themselves are immutable through this UI; current user can't\n // edit their own role here.\n const canManage =\n role !== \"owner\" &&\n !isCurrentUser &&\n (currentUserRole === \"owner\" ||\n (currentUserRole === \"admin\" && role === \"member\"));\n\n return (\n <div className=\"flex items-center justify-between gap-2 py-1.5 px-2 rounded hover:bg-accent/30\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm\">{email}</span>\n <RoleIcon role={role} />\n {isCurrentUser && (\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n {t(\"org.you\")}\n </span>\n )}\n {role === \"admin\" && (\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-blue-600\">\n {t(\"org.admin\")}\n </span>\n )}\n </div>\n {canManage && (\n <div className=\"flex shrink-0 items-center gap-1\">\n {editing ? (\n <select\n autoFocus\n value={role}\n onChange={(e) => {\n const next = e.target.value === \"admin\" ? \"admin\" : \"member\";\n if (next !== role) {\n changeRole.mutate(\n { email, role: next },\n { onSuccess: () => setEditing(false) },\n );\n } else {\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n disabled={changeRole.isPending}\n className=\"rounded-md border border-border bg-background px-1.5 py-0.5 text-[11px]\"\n >\n <option value=\"member\">{t(\"org.member\")}</option>\n <option value=\"admin\">{t(\"org.admin\")}</option>\n </select>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"org.changeRole\")}</TooltipContent>\n </Tooltip>\n )}\n {confirmingRemove ? (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingRemove(false)}\n className=\"rounded px-1.5 py-0.5 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {t(\"org.cancel\")}\n </button>\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() =>\n removeMember.mutate(email, {\n onSettled: () => setConfirmingRemove(false),\n })\n }\n className=\"rounded bg-red-500 px-1.5 py-0.5 text-[11px] text-white hover:bg-red-600 disabled:opacity-50\"\n >\n {t(\"org.remove\")}\n </button>\n </div>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() => setConfirmingRemove(true)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"org.removeMember\")}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n );\n}\n\ninterface DraftInvite {\n email: string;\n role: InviteRole;\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction parseEmailList(input: string): string[] {\n return Array.from(\n new Set(\n input\n .split(/[\\s,;]+/)\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n ),\n );\n}\n\nfunction parseCsvEmails(text: string): string[] {\n // Tolerant CSV parse — split on lines, then on commas, take any cell\n // that looks like an email. Handles \"name,email,role\" rows or just\n // \"email\" per line. A robust full CSV parser would be overkill here.\n const cells: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n for (const cell of line.split(\",\")) {\n const trimmed = cell.trim().replace(/^\"|\"$/g, \"\");\n if (trimmed) cells.push(trimmed);\n }\n }\n return Array.from(\n new Set(cells.filter((c) => EMAIL_RE.test(c)).map((c) => c.toLowerCase())),\n );\n}\n\nfunction BulkInviteForm({\n currentUserRole,\n onClose,\n}: {\n currentUserRole: string | null;\n onClose: () => void;\n}) {\n const bulkInvite = useBulkInviteMembers();\n const fileRef = useRef<HTMLInputElement>(null);\n const [drafts, setDrafts] = useState<DraftInvite[]>([\n { email: \"\", role: \"member\" },\n ]);\n const [pasteOpen, setPasteOpen] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [pasteRole, setPasteRole] = useState<InviteRole>(\"member\");\n const [resultBanner, setResultBanner] = useState<{\n succeeded: number;\n failed: { email: string; error: string }[];\n } | null>(null);\n\n const canSetAdmin = currentUserRole === \"owner\";\n\n const validDrafts = useMemo(\n () =>\n drafts\n .map((d) => ({ ...d, email: d.email.trim().toLowerCase() }))\n .filter((d) => EMAIL_RE.test(d.email)),\n [drafts],\n );\n\n function setDraft(index: number, patch: Partial<DraftInvite>) {\n setDrafts((prev) =>\n prev.map((d, i) => (i === index ? { ...d, ...patch } : d)),\n );\n }\n\n function appendEmails(emails: string[], role: InviteRole) {\n if (!emails.length) return;\n setDrafts((prev) => {\n const existing = new Set(\n prev.map((d) => d.email.trim().toLowerCase()).filter(Boolean),\n );\n const fresh: DraftInvite[] = [];\n for (const e of emails) {\n if (!existing.has(e)) {\n fresh.push({ email: e, role });\n existing.add(e);\n }\n }\n // If the only existing row is an empty placeholder, drop it.\n const cleaned = prev.filter(\n (d, i) => !(i === 0 && !d.email.trim() && prev.length === 1),\n );\n return [...cleaned, ...fresh];\n });\n }\n\n function handleFile(file: File) {\n file.text().then((text) => {\n const emails = parseCsvEmails(text);\n if (emails.length) {\n appendEmails(emails, \"member\");\n } else {\n setResultBanner({\n succeeded: 0,\n failed: [{ email: file.name, error: \"No valid emails found in CSV\" }],\n });\n }\n });\n }\n\n async function submit() {\n setResultBanner(null);\n const dedup = new Map<string, DraftInvite>();\n for (const d of validDrafts) {\n // canSetAdmin guard mirrors server-side enforcement so an admin-only\n // user editing the form can't even attempt to grant admin (they'd\n // get a 403 anyway).\n const role = canSetAdmin ? d.role : \"member\";\n dedup.set(d.email, { ...d, role });\n }\n const invites = Array.from(dedup.values());\n if (invites.length === 0) return;\n\n const result = await bulkInvite.mutateAsync(invites);\n setResultBanner({\n succeeded: result.succeeded.length,\n failed: result.failed,\n });\n\n // Wipe drafts that succeeded; leave failed ones so the user can fix\n // and retry. If everything succeeded, reset to a single blank row.\n const failedEmails = new Set(result.failed.map((f) => f.email));\n setDrafts((prev) => {\n const remaining = prev.filter((d) =>\n failedEmails.has(d.email.trim().toLowerCase()),\n );\n return remaining.length > 0 ? remaining : [{ email: \"\", role: \"member\" }];\n });\n\n // Auto-close on full success.\n if (result.failed.length === 0 && result.succeeded.length > 0) {\n setTimeout(() => onClose(), 1200);\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n {drafts.map((draft, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <input\n type=\"email\"\n value={draft.email}\n onChange={(e) => setDraft(i, { email: e.target.value })}\n placeholder=\"colleague@company.com\"\n className=\"flex-1 rounded-md border border-border bg-background px-3 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus={i === drafts.length - 1}\n />\n <select\n value={draft.role}\n onChange={(e) =>\n setDraft(i, {\n role: e.target.value === \"admin\" ? \"admin\" : \"member\",\n })\n }\n disabled={!canSetAdmin}\n title={\n canSetAdmin\n ? undefined\n : \"Only the organization owner can invite admins\"\n }\n className=\"rounded-md border border-border bg-background px-2 py-1.5 text-xs disabled:opacity-50\"\n >\n <option value=\"member\">Member</option>\n <option value=\"admin\">Admin</option>\n </select>\n {drafts.length > 1 && (\n <button\n type=\"button\"\n onClick={() =>\n setDrafts((prev) => prev.filter((_, j) => j !== i))\n }\n className=\"text-muted-foreground hover:text-red-500\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n setDrafts((prev) => [...prev, { email: \"\", role: \"member\" }])\n }\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n Add another\n </button>\n <button\n type=\"button\"\n onClick={() => setPasteOpen((v) => !v)}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n Paste many\n </button>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconFileImport className=\"h-3.5 w-3.5\" />\n Import CSV\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".csv,text/csv,text/plain\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFile(file);\n // reset so re-uploading the same file re-fires onChange\n e.target.value = \"\";\n }}\n />\n </div>\n\n {pasteOpen && (\n <div className=\"space-y-2 rounded-md border border-border p-3\">\n <div className=\"text-xs font-medium text-muted-foreground\">\n Paste emails (comma, space, or newline separated)\n </div>\n <textarea\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n rows={4}\n placeholder=\"alice@acme.com, bob@acme.com&#10;charlie@acme.com\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n />\n <div className=\"flex items-center gap-2\">\n <select\n value={pasteRole}\n onChange={(e) =>\n setPasteRole(e.target.value === \"admin\" ? \"admin\" : \"member\")\n }\n disabled={!canSetAdmin}\n className=\"rounded-md border border-border bg-background px-2 py-1.5 text-xs disabled:opacity-50\"\n >\n <option value=\"member\">Add as members</option>\n <option value=\"admin\">Add as admins</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n appendEmails(parseEmailList(pasteValue), pasteRole);\n setPasteValue(\"\");\n setPasteOpen(false);\n }}\n disabled={parseEmailList(pasteValue).length === 0}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Add\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteValue(\"\");\n setPasteOpen(false);\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={validDrafts.length === 0 || bulkInvite.isPending}\n onClick={submit}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {bulkInvite.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n <IconCheck className=\"h-3.5 w-3.5\" />\n Send {validDrafts.length || \"\"}{\" \"}\n {validDrafts.length === 1 ? \"invite\" : \"invites\"}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Close\n </button>\n </div>\n\n <p className=\"text-[11px] text-muted-foreground\">\n Each invitee signs in with this exact email to accept.\n {canSetAdmin\n ? \" Admins can manage members and workspace settings.\"\n : \" Only the organization owner can grant admin access.\"}\n </p>\n\n {resultBanner && (\n <div className=\"space-y-1 rounded-md border border-border bg-accent/30 p-2.5\">\n {resultBanner.succeeded > 0 && (\n <p className=\"text-[11px] text-green-600\">\n <IconCheck className=\"inline h-3 w-3 -mt-0.5\" /> Sent{\" \"}\n {resultBanner.succeeded}{\" \"}\n {resultBanner.succeeded === 1 ? \"invite\" : \"invites\"}.\n </p>\n )}\n {resultBanner.failed.length > 0 && (\n <ul className=\"space-y-0.5 text-[11px] text-red-500\">\n {resultBanner.failed.map((f) => (\n <li key={f.email}>\n <IconAlertTriangle className=\"inline h-3 w-3 -mt-0.5 me-1\" />\n {f.email}: {f.error}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n <ErrorText error={bulkInvite.error} />\n </div>\n );\n}\n\nfunction DomainSettingsSection({\n domain,\n ownerEmail,\n}: {\n domain: string | null;\n ownerEmail: string;\n}) {\n const setOrgDomain = useSetOrgDomain();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(domain ?? \"\");\n\n const ownDomain = ownerEmail.split(\"@\")[1]?.toLowerCase() ?? \"\";\n\n function save() {\n const trimmed = draft.trim().toLowerCase();\n if (trimmed === (domain ?? \"\")) {\n setEditing(false);\n return;\n }\n setOrgDomain.mutate(trimmed || null, {\n onSuccess: () => setEditing(false),\n });\n }\n\n return (\n <div className=\"space-y-2 border-t border-border pt-3 first:border-t-0 first:pt-0\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Email domain auto-join\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Anyone who signs up with an email at this domain will join your\n organization automatically. You can only set your own email domain (\n {ownDomain || \"—\"}); free email providers like gmail.com or outlook.com\n aren&apos;t allowed.\n </p>\n {!editing ? (\n <div className=\"flex items-center gap-2\">\n {domain ? (\n <>\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm\">\n <IconAt className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {domain}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n setDraft(domain);\n setEditing(true);\n }}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Edit domain</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={() => setOrgDomain.mutate(null)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Remove domain</TooltipContent>\n </Tooltip>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(ownDomain);\n setEditing(true);\n }}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconAt className=\"h-3.5 w-3.5\" />\n Allow {ownDomain || \"your domain\"} to auto-join\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n placeholder={ownDomain || \"example.com\"}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={save}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setOrgDomain.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n <ErrorText error={setOrgDomain.error} />\n </div>\n );\n}\n\nfunction A2ASecretSection({ secret }: { secret: string | null | undefined }) {\n const setA2ASecret = useSetA2ASecret();\n const syncA2ASecret = useSyncA2ASecret();\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pasteMode, setPasteMode] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [syncResult, setSyncResult] = useState<SyncA2ASecretResult | null>(\n null,\n );\n\n function copyToClipboard() {\n if (!secret) return;\n navigator.clipboard.writeText(secret).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n // Push the current secret to all connected apps. Optionally pass the\n // PREVIOUS secret as `signSecret` so the receiving apps (which still\n // hold the previous value) can verify the JWT.\n function syncToApps(signSecret?: string) {\n setSyncResult(null);\n syncA2ASecret.mutate(signSecret ? { signSecret } : undefined, {\n onSuccess: (result) => {\n setSyncResult(result);\n },\n });\n }\n\n function regenerate() {\n setA2ASecret.mutate(undefined, {\n onSuccess: (result) => {\n setRevealed(false);\n // Auto-sync the new secret to all connected apps. Sign with the\n // PREVIOUS secret (which peers still hold) so verification on\n // their side succeeds and they accept the new value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n function saveSecret() {\n const trimmed = pasteValue.trim();\n if (!trimmed) return;\n setA2ASecret.mutate(trimmed, {\n onSuccess: (result) => {\n setPasteMode(false);\n setPasteValue(\"\");\n // Same auto-sync flow as regenerate: peers verify with the\n // previous secret, then update to the new pasted value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n const masked = secret ? \"****\" + secret.slice(-8) : \"Not set\";\n\n return (\n <div className=\"space-y-2 border-t border-border pt-3 first:border-t-0 first:pt-0\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Cross-app authentication\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n This secret authenticates cross-app delegation (e.g. Dispatch to\n Analytics). All apps in your organization need the same secret.\n </p>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono\">\n <IconKey className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {revealed && secret ? secret : masked}\n </span>\n {secret && (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRevealed(!revealed)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n {revealed ? (\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n ) : (\n <IconEye className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {revealed ? \"Hide secret\" : \"Reveal secret\"}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n {copied ? (\n <IconCheck className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent>Copy secret</TooltipContent>\n </Tooltip>\n </>\n )}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={regenerate}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconRefresh className=\"h-3.5 w-3.5\" />\n )}\n Regenerate\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Regenerate secret and sync to connected apps\n </TooltipContent>\n </Tooltip>\n {secret && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => syncToApps()}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n >\n {syncA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconCloudUpload className=\"h-3.5 w-3.5\" />\n )}\n Sync to apps\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Push this secret to every connected app\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n\n {syncA2ASecret.isPending && (\n <p className=\"text-[11px] text-muted-foreground\">\n Syncing to connected apps…\n </p>\n )}\n\n {syncResult && !syncA2ASecret.isPending && (\n <div className=\"space-y-1\">\n <p className=\"text-[11px] text-muted-foreground\">\n Synced to {syncResult.succeeded}/{syncResult.total} app\n {syncResult.total === 1 ? \"\" : \"s\"}\n {syncResult.failed > 0 ? ` (${syncResult.failed} failed)` : \"\"}.\n </p>\n {syncResult.failed > 0 && (\n <ul className=\"text-[11px] text-red-500 list-disc ps-5 space-y-0.5\">\n {syncResult.results\n .filter((r) => !r.ok)\n .map((r) => (\n <li key={r.id}>\n {r.name}: {r.error || `HTTP ${r.status ?? \"?\"}`}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {!pasteMode ? (\n <button\n type=\"button\"\n onClick={() => setPasteMode(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconKey className=\"h-3.5 w-3.5\" />\n Paste secret from another app\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") saveSecret();\n if (e.key === \"Escape\") {\n setPasteMode(false);\n setPasteValue(\"\");\n }\n }}\n placeholder=\"Paste A2A secret\"\n className=\"flex-1 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={!pasteValue.trim() || setA2ASecret.isPending}\n onClick={saveSecret}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteMode(false);\n setPasteValue(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <ErrorText error={setA2ASecret.error} />\n <ErrorText error={syncA2ASecret.error} />\n </div>\n );\n}\n\n/**\n * Default Team management page. Templates can route directly to this component\n * or wrap it with their own Layout via the `layout` prop.\n */\nexport function TeamPage({\n layout,\n title,\n showTitle = true,\n createOrgDescription,\n className,\n}: TeamPageProps) {\n const t = useT();\n const { data: org, isLoading } = useOrg();\n\n const content = (\n <div className={`space-y-6 ${className ?? \"max-w-2xl\"}`}>\n {showTitle ? (\n <h2 className=\"text-2xl font-bold tracking-tight\">\n {title ?? t(\"org.team\")}\n </h2>\n ) : null}\n\n {isLoading && (\n <section className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"text-sm text-muted-foreground\">\n {t(\"org.loading\")}\n </div>\n </section>\n )}\n\n {!isLoading && (\n <>\n <PendingInvitationsCard />\n {!org?.orgId ? (\n <>\n {org?.domainMatches && org.domainMatches.length > 0 && (\n <JoinByDomainCard matches={org.domainMatches} />\n )}\n <CreateOrgCard description={createOrgDescription} />\n </>\n ) : (\n <MembersCard />\n )}\n </>\n )}\n </div>\n );\n\n const wrapped = (\n <TooltipProvider delayDuration={200}>{content}</TooltipProvider>\n );\n\n return layout ? <>{layout(wrapped)}</> : wrapped;\n}\n"]}
1
+ {"version":3,"file":"TeamPage.js","sourceRoot":"","sources":["../../../src/client/org/TeamPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,eAAe,EACf,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,OAAO,EACP,QAAQ,EACR,WAAW,EACX,OAAO,EACP,UAAU,EACV,eAAe,EACf,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAGlE,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EACL,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,GAGhB,MAAM,YAAY,CAAC;AA6BpB,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAoB;IAC1C,IAAI,IAAI,KAAK,OAAO;QAClB,OAAO,KAAC,SAAS,IAAC,SAAS,EAAC,4BAA4B,GAAG,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO;QAClB,OAAO,KAAC,eAAe,IAAC,SAAS,EAAC,2BAA2B,GAAG,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAAsB;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CACL,YAAG,SAAS,EAAC,sBAAsB,YAChC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACrD,CACL,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAE/C,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,OAAO,CACL,mBAAS,SAAS,EAAC,uDAAuD,aACxE,aAAI,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,wBAAwB,CAAC,GAAM,EACrE,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACnC,eAEE,SAAS,EAAC,uEAAuE,aAEjF,0BACE,cAAK,SAAS,EAAC,qBAAqB,YAAE,GAAG,CAAC,OAAO,GAAO,EACxD,cAAK,SAAS,EAAC,+BAA+B,YAC3C,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,GAC7C,IACF,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAC9C,QAAQ,EAAE,gBAAgB,CAAC,SAAS,EACpC,SAAS,EAAC,2GAA2G,YAEpH,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAC5B,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,CAAC,CAAC,YAAY,CAAC,CAChB,GACM,KApBJ,GAAG,CAAC,EAAE,CAqBP,CACP,CAAC,EACF,KAAC,SAAS,IAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,GAAI,IACpC,CACX,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,OAAO,EAAiC;IAClE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEhE,OAAO,CACL,mBAAS,SAAS,EAAC,uDAAuD,aACxE,aAAI,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,kBAAkB,CAAC,GAAM,EAChE,YAAG,SAAS,EAAC,+BAA+B,YACzC,OAAO,CAAC,MAAM,KAAK,CAAC;oBACnB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACxB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GACzB,EACJ,cAAK,SAAS,EAAC,WAAW,YACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,eAEE,SAAS,EAAC,uEAAuE,aAEjF,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,oEAAoE,YACjF,KAAC,cAAc,IAAC,SAAS,EAAC,uBAAuB,GAAG,GAChD,EACN,cAAK,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,OAAO,GAAO,IAClD,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,YAAY,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,KAAK,EACzD,OAAO,EAAE,GAAG,EAAE;gCACZ,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gCACtB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;oCAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;iCACpC,CAAC,CAAC;4BACL,CAAC,EACD,SAAS,EAAC,+GAA+G,YAExH,YAAY,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACjD,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,CAAC,CAAC,UAAU,CAAC,CACd,GACM,KAzBJ,CAAC,CAAC,KAAK,CA0BR,CACP,CAAC,GACE,EACN,KAAC,SAAS,IAAC,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,IAChC,CACX,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,WAAW,EAA4B;IAC9D,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,CACL,mBAAS,SAAS,EAAC,uDAAuD,aACxE,aAAI,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,wBAAwB,CAAC,GAAM,EACtE,YAAG,SAAS,EAAC,+BAA+B,YACzC,WAAW,IAAI,CAAC,CAAC,8BAA8B,CAAC,GAC/C,EACH,CAAC,QAAQ,CAAC,CAAC,CAAC,CACX,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,SAAS,EAAC,2FAA2F,YAEpG,CAAC,CAAC,wBAAwB,CAAC,GACrB,CACV,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,WAAW,aACxB,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,WAAW,EAAC,gBAAgB,EAC5B,SAAS,EAAC,8HAA8H,EACxI,SAAS,SACT,EACF,eAAK,SAAS,EAAC,YAAY,aACzB,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,SAAS,EAC7C,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;oCAC5B,SAAS,EAAE,GAAG,EAAE;wCACd,OAAO,CAAC,EAAE,CAAC,CAAC;wCACZ,WAAW,CAAC,KAAK,CAAC,CAAC;oCACrB,CAAC;iCACF,CAAC,EAEJ,SAAS,EAAC,+GAA+G,YAExH,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CACrB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,CAAC,CAAC,YAAY,CAAC,CAChB,GACM,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;oCACZ,WAAW,CAAC,KAAK,CAAC,CAAC;oCACnB,OAAO,CAAC,EAAE,CAAC,CAAC;gCACd,CAAC,EACD,SAAS,EAAC,6GAA6G,YAEtH,CAAC,CAAC,YAAY,CAAC,GACT,IACL,EACN,KAAC,SAAS,IAAC,KAAK,EAAE,SAAS,CAAC,KAAK,GAAI,IACjC,CACP,IACO,CACX,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAsC;IAC3E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO;QAAE,OAAO,cAAK,SAAS,EAAC,qBAAqB,YAAE,IAAI,GAAO,CAAC;IAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;gBACZ,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC,EACD,SAAS,EAAC,8EAA8E,aAEvF,IAAI,EACL,KAAC,UAAU,IAAC,SAAS,EAAC,iEAAiE,GAAG,IACnF,CACV,CAAC;IACJ,CAAC;IAED,SAAS,IAAI;QACX,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACjC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,2BAA2B,aACxC,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wBAAE,IAAI,EAAE,CAAC;oBAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;wBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC,EACD,MAAM,EAAE,IAAI,EACZ,SAAS,EAAC,oIAAoI,EAC9I,SAAS,SACT,EACF,KAAC,SAAS,IAAC,KAAK,EAAE,SAAS,CAAC,KAAK,GAAI,IACjC,CACP,CAAC;AACJ,CAAC;AAaD,SAAS,WAAW;IAClB,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3E,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC,GAAG,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;IACrC,MAAM,cAAc,GAAG,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,MAAM,OAAO,GAAG,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,eAAe,EAAE,WAAW,IAAI,EAAE,CAAC;IAC1D,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEpD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,mBAAS,SAAS,EAAC,uDAAuD,aACxE,eAAK,SAAS,EAAC,mEAAmE,aAChF,eAAK,SAAS,EAAC,iCAAiC,aAC9C,cAAK,SAAS,EAAC,6EAA6E,YAC1F,KAAC,cAAc,IAAC,SAAS,EAAC,uBAAuB,GAAG,GAChD,EACN,eAAK,SAAS,EAAC,SAAS,aACtB,KAAC,cAAc,IACb,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EACvB,OAAO,EAAE,cAAc,GACvB,EACF,eAAK,SAAS,EAAC,+BAA+B,aAC3C,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,aAAI,GAAG,EACtD,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,IACpC,IACF,IACF,EACL,eAAe,IAAI,CAClB,iBACE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,EACzD,QAAQ,EAAE,SAAS,CAAC,SAAS,EAC7B,SAAS,EAAC,sFAAsF,YAE/F,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,iBAAsB,KAAK,EAAE,CAAC,CAAC,KAAK,YACjC,CAAC,CAAC,OAAO,IADC,CAAC,CAAC,KAAK,CAEX,CACV,CAAC,GACK,CACV,IACG,EAEL,cAAc,IAAI,CACjB,cAAK,SAAS,EAAC,6BAA6B,YACzC,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EACtC,SAAS,EAAC,4HAA4H,aAEtI,KAAC,YAAY,IAAC,SAAS,EAAC,aAAa,GAAG,EACvC,CAAC,CAAC,mBAAmB,CAAC,IAChB,CACV,CAAC,CAAC,CAAC,CACF,KAAC,cAAc,IACb,eAAe,EAAE,GAAG,CAAC,IAAI,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,GACvC,CACH,GACG,CACP,EAEA,cAAc,IAAI,CACjB,eAAK,SAAS,EAAC,uDAAuD,aACpE,KAAC,qBAAqB,IACpB,MAAM,EAAE,GAAG,CAAC,aAAa,EACzB,UAAU,EAAE,GAAG,CAAC,KAAK,GACrB,EAED,OAAO,IAAI,KAAC,gBAAgB,IAAC,MAAM,EAAE,GAAG,CAAC,SAAS,GAAI,IACnD,CACP,EAED,KAAC,SAAS,IAAC,KAAK,EAAE,SAAS,CAAC,KAAK,GAAI,IAC7B,EAEV,KAAC,gBAAgB,IACf,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAC3B,eAAe,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,GACjC,IACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAOhB;IACC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAEjB,OAAO,CACL,mBAAS,SAAS,EAAC,yCAAyC,aAC1D,cAAK,SAAS,EAAC,qGAAqG,YAClH,0BACE,aAAI,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,aAAa,CAAC,GAAM,EAC3D,YAAG,SAAS,EAAC,+BAA+B,YACzC,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,GAC9C,IACA,GACF,EACN,MAAC,KAAK,eACJ,KAAC,WAAW,cACV,MAAC,QAAQ,eACP,KAAC,SAAS,cAAE,CAAC,CAAC,YAAY,CAAC,GAAa,EACxC,KAAC,SAAS,cAAE,CAAC,CAAC,UAAU,CAAC,GAAa,EACtC,KAAC,SAAS,cAAE,CAAC,CAAC,YAAY,CAAC,GAAa,EACxC,KAAC,SAAS,IAAC,SAAS,EAAC,UAAU,YAAE,CAAC,CAAC,aAAa,CAAC,GAAa,IACrD,GACC,EACd,KAAC,SAAS,cACP,gBAAgB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,cACP,KAAC,SAAS,IAAC,OAAO,EAAE,CAAC,YACnB,cACE,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GACrC,GACQ,IANC,CAAC,CAOL,CACZ,CAAC,CACH,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACxD,KAAC,QAAQ,cACP,KAAC,SAAS,IACR,OAAO,EAAE,CAAC,EACV,SAAS,EAAC,gDAAgD,YAEzD,CAAC,CAAC,eAAe,CAAC,GACT,GACH,CACZ,CAAC,CAAC,CAAC,CACF,8BACG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,KAAC,SAAS,IAER,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,IAAI,EAAE,CAAC,CAAC,IAAI,EACZ,aAAa,EAAE,CAAC,CAAC,KAAK,KAAK,gBAAgB,EAC3C,eAAe,EAAE,eAAe,IAJ3B,CAAC,CAAC,KAAK,CAKZ,CACH,CAAC,EACD,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC3B,KAAC,gBAAgB,IAAc,MAAM,EAAE,GAAG,IAAnB,GAAG,CAAC,EAAE,CAAiB,CAC/C,CAAC,IACD,CACJ,GACS,IACN,IACA,CACX,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,CAA0B;IACzD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,IAAI,EAAoB;IAC3C,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,OAAO,CACL,gBAAM,SAAS,EAAC,uGAAuG,aACrH,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,GAAI,EACvB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IACd,CACR,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,MAAM,EAAqC;IACrE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,OAAO,CACL,MAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,aAC9B,KAAC,SAAS,IAAC,SAAS,EAAC,UAAU,YAC7B,eAAM,SAAS,EAAC,kBAAkB,YAAE,MAAM,CAAC,KAAK,GAAQ,GAC9C,EACZ,KAAC,SAAS,cACR,KAAC,SAAS,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,GACtB,EACZ,KAAC,SAAS,cACR,eAAM,SAAS,EAAC,8EAA8E,YAC3F,CAAC,CAAC,aAAa,CAAC,GACZ,GACG,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,gCAAgC,kBAAc,IAC1D,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,IAAI,EACJ,aAAa,EACb,eAAe,GAMhB;IACC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhE,sEAAsE;IACtE,sEAAsE;IACtE,4BAA4B;IAC5B,MAAM,SAAS,GACb,IAAI,KAAK,OAAO;QAChB,CAAC,aAAa;QACd,CAAC,eAAe,KAAK,OAAO;YAC1B,CAAC,eAAe,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;IAExD,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,UAAU,YAC7B,eAAM,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAQ,GACvC,EACZ,KAAC,SAAS,cACR,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,GAAI,GACf,EACZ,KAAC,SAAS,cACP,aAAa,CAAC,CAAC,CAAC,CACf,eAAM,SAAS,EAAC,8EAA8E,YAC3F,CAAC,CAAC,SAAS,CAAC,GACR,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,uBAAuB,kBAAS,CACjD,GACS,EACZ,KAAC,SAAS,cACP,SAAS,CAAC,CAAC,CAAC,CACX,eAAK,SAAS,EAAC,8CAA8C,aAC1D,OAAO,CAAC,CAAC,CAAC,CACT,kBACE,SAAS,QACT,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;gCAC7D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oCAClB,UAAU,CAAC,MAAM,CACf,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EACrB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CACvC,CAAC;gCACJ,CAAC;qCAAM,CAAC;oCACN,UAAU,CAAC,KAAK,CAAC,CAAC;gCACpB,CAAC;4BACH,CAAC,EACD,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAC/B,QAAQ,EAAE,UAAU,CAAC,SAAS,EAC9B,SAAS,EAAC,yEAAyE,aAEnF,iBAAQ,KAAK,EAAC,QAAQ,YAAE,CAAC,CAAC,YAAY,CAAC,GAAU,EACjD,iBAAQ,KAAK,EAAC,OAAO,YAAE,CAAC,CAAC,WAAW,CAAC,GAAU,IACxC,CACV,CAAC,CAAC,CAAC,CACF,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAC/B,SAAS,EAAC,6CAA6C,YAEvD,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,GAC/B,GACM,EACjB,KAAC,cAAc,cAAE,CAAC,CAAC,gBAAgB,CAAC,GAAkB,IAC9C,CACX,EACA,gBAAgB,CAAC,CAAC,CAAC,CAClB,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EACzC,SAAS,EAAC,+FAA+F,YAExG,CAAC,CAAC,YAAY,CAAC,GACT,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,YAAY,CAAC,SAAS,EAChC,OAAO,EAAE,GAAG,EAAE,CACZ,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE;wCACzB,SAAS,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC;qCAC5C,CAAC,EAEJ,SAAS,EAAC,8FAA8F,YAEvG,CAAC,CAAC,YAAY,CAAC,GACT,IACL,CACP,CAAC,CAAC,CAAC,CACF,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,YAAY,CAAC,SAAS,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EACxC,SAAS,EAAC,8DAA8D,YAExE,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,GAC9B,GACM,EACjB,KAAC,cAAc,cAAE,CAAC,CAAC,kBAAkB,CAAC,GAAkB,IAChD,CACX,IACG,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,gCAAgC,kBAAQ,CACxD,GACS,IACH,CACZ,CAAC;AACJ,CAAC;AAOD,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,KAAK;SACF,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CACnB,CACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,qEAAqE;IACrE,mEAAmE;IACnE,qEAAqE;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,eAAe,EACf,OAAO,GAIR;IACC,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB;QAClD,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC9B,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAGtC,IAAI,CAAC,CAAC;IAEhB,MAAM,WAAW,GAAG,eAAe,KAAK,OAAO,CAAC;IAEhD,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CACH,MAAM;SACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;SAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAC1C,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,SAAS,QAAQ,CAAC,KAAa,EAAE,KAA2B;QAC1D,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED,SAAS,YAAY,CAAC,MAAgB,EAAE,IAAgB;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAC3B,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC9D,CAAC;YACF,MAAM,KAAK,GAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,6DAA6D;YAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAC7D,CAAC;YACF,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,UAAU,CAAC,IAAU;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC;oBACd,SAAS,EAAE,CAAC;oBACZ,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;iBACtE,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,MAAM;QACnB,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,qEAAqE;YACrE,kEAAkE;YAClE,qBAAqB;YACrB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrD,eAAe,CAAC;YACd,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;YAClC,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAC/C,CAAC;YACF,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,WAAW,YACvB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,eAAa,SAAS,EAAC,yBAAyB,aAC9C,gBACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACvD,WAAW,EAAC,uBAAuB,EACnC,SAAS,EAAC,gIAAgI,EAC1I,SAAS,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAClC,EACF,kBACE,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,QAAQ,CAAC,CAAC,EAAE;gCACV,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;6BACtD,CAAC,EAEJ,QAAQ,EAAE,CAAC,WAAW,EACtB,KAAK,EACH,WAAW;gCACT,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,+CAA+C,EAErD,SAAS,EAAC,uFAAuF,aAEjG,iBAAQ,KAAK,EAAC,QAAQ,uBAAgB,EACtC,iBAAQ,KAAK,EAAC,OAAO,sBAAe,IAC7B,EACR,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAErD,SAAS,EAAC,0CAA0C,YAEpD,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,GAAG,GAC1B,CACV,KArCO,CAAC,CAsCL,CACP,CAAC,GACE,EAEN,eAAK,SAAS,EAAC,mCAAmC,aAChD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAE/D,SAAS,EAAC,qHAAqH,aAE/H,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,mBAE7B,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACtC,SAAS,EAAC,qHAAqH,aAE/H,KAAC,YAAY,IAAC,SAAS,EAAC,aAAa,GAAG,kBAEjC,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EACvC,SAAS,EAAC,qHAAqH,aAE/H,KAAC,cAAc,IAAC,SAAS,EAAC,aAAa,GAAG,kBAEnC,EACT,gBACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,0BAA0B,EACjC,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;4BACjC,IAAI,IAAI;gCAAE,UAAU,CAAC,IAAI,CAAC,CAAC;4BAC3B,wDAAwD;4BACxD,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;wBACtB,CAAC,GACD,IACE,EAEL,SAAS,IAAI,CACZ,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,2CAA2C,kEAEpD,EACN,mBACE,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,gDAAmD,EAC/D,SAAS,EAAC,8HAA8H,GACxI,EACF,eAAK,SAAS,EAAC,yBAAyB,aACtC,kBACE,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAE/D,QAAQ,EAAE,CAAC,WAAW,EACtB,SAAS,EAAC,uFAAuF,aAEjG,iBAAQ,KAAK,EAAC,QAAQ,+BAAwB,EAC9C,iBAAQ,KAAK,EAAC,OAAO,8BAAuB,IACrC,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;oCACZ,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;oCACpD,aAAa,CAAC,EAAE,CAAC,CAAC;oCAClB,YAAY,CAAC,KAAK,CAAC,CAAC;gCACtB,CAAC,EACD,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EACjD,SAAS,EAAC,+GAA+G,oBAGlH,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;oCACZ,aAAa,CAAC,EAAE,CAAC,CAAC;oCAClB,YAAY,CAAC,KAAK,CAAC,CAAC;gCACtB,CAAC,EACD,SAAS,EAAC,6GAA6G,uBAGhH,IACL,IACF,CACP,EAED,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,SAAS,EAC1D,OAAO,EAAE,MAAM,EACf,SAAS,EAAC,+GAA+G,YAExH,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CACtB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,gBAAM,SAAS,EAAC,gCAAgC,aAC9C,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,WAC/B,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,EAClC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAC3C,CACR,GACM,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,6GAA6G,sBAGhH,IACL,EAEN,aAAG,SAAS,EAAC,mCAAmC,uEAE7C,WAAW;wBACV,CAAC,CAAC,oDAAoD;wBACtD,CAAC,CAAC,sDAAsD,IACxD,EAEH,YAAY,IAAI,CACf,eAAK,SAAS,EAAC,8DAA8D,aAC1E,YAAY,CAAC,SAAS,GAAG,CAAC,IAAI,CAC7B,aAAG,SAAS,EAAC,4BAA4B,aACvC,KAAC,SAAS,IAAC,SAAS,EAAC,wBAAwB,GAAG,WAAM,GAAG,EACxD,YAAY,CAAC,SAAS,EAAE,GAAG,EAC3B,YAAY,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,SAClD,CACL,EACA,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACjC,aAAI,SAAS,EAAC,sCAAsC,YACjD,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B,yBACE,KAAC,iBAAiB,IAAC,SAAS,EAAC,6BAA6B,GAAG,EAC5D,CAAC,CAAC,KAAK,QAAI,CAAC,CAAC,KAAK,KAFZ,CAAC,CAAC,KAAK,CAGX,CACN,CAAC,GACC,CACN,IACG,CACP,EAED,KAAC,SAAS,IAAC,KAAK,EAAE,UAAU,CAAC,KAAK,GAAI,IAClC,CACP,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,MAAM,EACN,UAAU,GAIX;IACC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAEhE,SAAS,IAAI;QACX,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,YAAY,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;YACnC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,mEAAmE,aAChF,cAAK,SAAS,EAAC,mEAAmE,uCAE5E,EACN,aAAG,SAAS,EAAC,mCAAmC,qJAG7C,SAAS,IAAI,GAAG,6EAEf,EACH,CAAC,OAAO,CAAC,CAAC,CAAC,CACV,cAAK,SAAS,EAAC,yBAAyB,YACrC,MAAM,CAAC,CAAC,CAAC,CACR,8BACE,gBAAM,SAAS,EAAC,sGAAsG,aACpH,KAAC,MAAM,IAAC,SAAS,EAAC,mCAAmC,GAAG,EACvD,MAAM,IACF,EACP,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;4CACZ,QAAQ,CAAC,MAAM,CAAC,CAAC;4CACjB,UAAU,CAAC,IAAI,CAAC,CAAC;wCACnB,CAAC,EACD,SAAS,EAAC,6CAA6C,YAEvD,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,GAC/B,GACM,EACjB,KAAC,cAAc,8BAA6B,IACpC,EACV,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,YAAY,CAAC,SAAS,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EACxC,SAAS,EAAC,8DAA8D,YAExE,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,GAAG,GAC1B,GACM,EACjB,KAAC,cAAc,gCAA+B,IACtC,IACT,CACJ,CAAC,CAAC,CAAC,CACF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,CAAC,SAAS,CAAC,CAAC;wBACpB,UAAU,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC,EACD,SAAS,EAAC,gHAAgH,aAE1H,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,YAC3B,SAAS,IAAI,aAAa,qBAC1B,CACV,GACG,CACP,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;4BACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;gCAAE,IAAI,EAAE,CAAC;4BAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gCAAE,UAAU,CAAC,KAAK,CAAC,CAAC;wBAC5C,CAAC,EACD,WAAW,EAAE,SAAS,IAAI,aAAa,EACvC,SAAS,EAAC,2HAA2H,EACrI,SAAS,SACT,EACF,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,YAAY,CAAC,SAAS,EAChC,OAAO,EAAE,IAAI,EACb,SAAS,EAAC,+GAA+G,YAExH,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CACxB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,MAAM,CACP,GACM,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAChC,SAAS,EAAC,6GAA6G,uBAGhH,IACL,CACP,EACD,KAAC,SAAS,IAAC,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,IACpC,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,MAAM,EAAyC;IACzE,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAC1C,IAAI,CACL,CAAC;IAEF,SAAS,eAAe;QACtB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9C,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,+CAA+C;IAC/C,SAAS,UAAU,CAAC,UAAmB;QACrC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE;YAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,aAAa,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,SAAS,UAAU;QACjB,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE;YAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,gEAAgE;gBAChE,8DAA8D;gBAC9D,qDAAqD;gBACrD,UAAU,CAAC,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,SAAS,UAAU;QACjB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE;YAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,aAAa,CAAC,EAAE,CAAC,CAAC;gBAClB,2DAA2D;gBAC3D,wDAAwD;gBACxD,UAAU,CAAC,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,OAAO,CACL,eAAK,SAAS,EAAC,mEAAmE,aAChF,cAAK,SAAS,EAAC,mEAAmE,yCAE5E,EACN,YAAG,SAAS,EAAC,mCAAmC,iJAG5C,EAEJ,eAAK,SAAS,EAAC,mCAAmC,aAChD,gBAAM,SAAS,EAAC,gHAAgH,aAC9H,KAAC,OAAO,IAAC,SAAS,EAAC,mCAAmC,GAAG,EACxD,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAChC,EACN,MAAM,IAAI,CACT,8BACE,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAC,6CAA6C,YAEtD,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,CACvC,CAAC,CAAC,CAAC,CACF,KAAC,OAAO,IAAC,SAAS,EAAC,aAAa,GAAG,CACpC,GACM,GACM,EACjB,KAAC,cAAc,cACZ,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,GAC5B,IACT,EACV,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,6CAA6C,YAEtD,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,SAAS,IAAC,SAAS,EAAC,4BAA4B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,CACrC,GACM,GACM,EACjB,KAAC,cAAc,8BAA6B,IACpC,IACT,CACJ,EACD,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,YAAY,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS,EAC3D,SAAS,EAAC,yIAAyI,aAElJ,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CACxB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,CACxC,kBAEM,GACM,EACjB,KAAC,cAAc,+DAEE,IACT,EACT,MAAM,IAAI,CACT,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAC3B,QAAQ,EAAE,YAAY,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS,EAC3D,SAAS,EAAC,yIAAyI,aAElJ,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CACzB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,CAC5C,oBAEM,GACM,EACjB,KAAC,cAAc,0DAEE,IACT,CACX,IACG,EAEL,aAAa,CAAC,SAAS,IAAI,CAC1B,YAAG,SAAS,EAAC,mCAAmC,gDAE5C,CACL,EAEA,UAAU,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,CACzC,eAAK,SAAS,EAAC,WAAW,aACxB,aAAG,SAAS,EAAC,mCAAmC,2BACnC,UAAU,CAAC,SAAS,OAAG,UAAU,CAAC,KAAK,UACjD,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EACjC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,SAC5D,EACH,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CACxB,aAAI,SAAS,EAAC,qDAAqD,YAChE,UAAU,CAAC,OAAO;6BAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;6BACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACV,yBACG,CAAC,CAAC,IAAI,QAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,KADxC,CAAC,CAAC,EAAE,CAER,CACN,CAAC,GACD,CACN,IACG,CACP,EAEA,CAAC,SAAS,CAAC,CAAC,CAAC,CACZ,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACjC,SAAS,EAAC,gHAAgH,aAE1H,KAAC,OAAO,IAAC,SAAS,EAAC,aAAa,GAAG,qCAE5B,CACV,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;4BACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;gCAAE,UAAU,EAAE,CAAC;4BACpC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gCACvB,YAAY,CAAC,KAAK,CAAC,CAAC;gCACpB,aAAa,CAAC,EAAE,CAAC,CAAC;4BACpB,CAAC;wBACH,CAAC,EACD,WAAW,EAAC,kBAAkB,EAC9B,SAAS,EAAC,4IAA4I,EACtJ,SAAS,SACT,EACF,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,SAAS,EACtD,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,+GAA+G,YAExH,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CACxB,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,MAAM,CACP,GACM,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;4BACZ,YAAY,CAAC,KAAK,CAAC,CAAC;4BACpB,aAAa,CAAC,EAAE,CAAC,CAAC;wBACpB,CAAC,EACD,SAAS,EAAC,6GAA6G,uBAGhH,IACL,CACP,EAED,KAAC,SAAS,IAAC,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,EACxC,KAAC,SAAS,IAAC,KAAK,EAAE,aAAa,CAAC,KAAK,GAAI,IACrC,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,MAAM,EACN,KAAK,EACL,SAAS,GAAG,IAAI,EAChB,oBAAoB,EACpB,SAAS,GACK;IACd,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1C,MAAM,OAAO,GAAG,CACd,eAAK,SAAS,EAAE,aAAa,SAAS,IAAI,WAAW,EAAE,aACpD,SAAS,CAAC,CAAC,CAAC,CACX,aAAI,SAAS,EAAC,mCAAmC,YAC9C,KAAK,IAAI,CAAC,CAAC,UAAU,CAAC,GACpB,CACN,CAAC,CAAC,CAAC,IAAI,EAEP,SAAS,IAAI,CACZ,kBAAS,SAAS,EAAC,6CAA6C,YAC9D,cAAK,SAAS,EAAC,+BAA+B,YAC3C,CAAC,CAAC,aAAa,CAAC,GACb,GACE,CACX,EAEA,CAAC,SAAS,IAAI,CACb,8BACE,KAAC,sBAAsB,KAAG,EACzB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CACb,8BACG,GAAG,EAAE,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CACrD,KAAC,gBAAgB,IAAC,OAAO,EAAE,GAAG,CAAC,aAAa,GAAI,CACjD,EACD,KAAC,aAAa,IAAC,WAAW,EAAE,oBAAoB,GAAI,IACnD,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,KAAG,CAChB,IACA,CACJ,IACG,CACP,CAAC;IAEF,MAAM,OAAO,GAAG,CACd,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YAAG,OAAO,GAAmB,CACjE,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,CAAC,4BAAG,MAAM,CAAC,OAAO,CAAC,GAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACnD,CAAC","sourcesContent":["import {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@agent-native/toolkit/ui/table\";\nimport {\n IconUserPlus,\n IconTrash,\n IconCrown,\n IconShieldCheck,\n IconLoader2,\n IconCheck,\n IconPencil,\n IconAt,\n IconX,\n IconKey,\n IconCopy,\n IconRefresh,\n IconEye,\n IconEyeOff,\n IconCloudUpload,\n IconFileImport,\n IconPlus,\n IconAlertTriangle,\n IconUsersGroup,\n} from \"@tabler/icons-react\";\nimport { useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport type { DomainMatchOrg } from \"../../org/types.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n useOrg,\n useOrgMembers,\n useOrgInvitations,\n useCreateOrg,\n useUpdateOrg,\n useBulkInviteMembers,\n useChangeMemberRole,\n useAcceptInvitation,\n useRemoveMember,\n useSwitchOrg,\n useSetOrgDomain,\n useSetA2ASecret,\n useSyncA2ASecret,\n useJoinByDomain,\n type InviteRole,\n type SyncA2ASecretResult,\n} from \"./hooks.js\";\n\nexport interface TeamPageProps {\n /**\n * Optional wrapper around the page contents. Templates pass their own Layout\n * component so the Team page renders inside the template's chrome.\n */\n layout?: (children: ReactNode) => ReactNode;\n /**\n * Title shown at the top of the page. Defaults to \"Team\".\n */\n title?: string;\n /**\n * Hide the page title when this is rendered inside another titled surface,\n * such as the Settings > Team tab.\n */\n showTitle?: boolean;\n /**\n * Description shown on the \"Create an Organization\" card. Defaults to\n * \"Set up a team to collaborate with your colleagues.\"\n */\n createOrgDescription?: string;\n /**\n * Class applied to the outer max-width container. Templates can use this to\n * tweak page width.\n */\n className?: string;\n}\n\nfunction RoleIcon({ role }: { role: string }) {\n if (role === \"owner\")\n return <IconCrown className=\"h-3.5 w-3.5 text-amber-500\" />;\n if (role === \"admin\")\n return <IconShieldCheck className=\"h-3.5 w-3.5 text-blue-500\" />;\n return null;\n}\n\nfunction ErrorText({ error }: { error: unknown }) {\n if (!error) return null;\n return (\n <p className=\"text-xs text-red-500\">\n {error instanceof Error ? error.message : String(error)}\n </p>\n );\n}\n\nfunction PendingInvitationsCard() {\n const t = useT();\n const { data: org } = useOrg();\n const acceptInvitation = useAcceptInvitation();\n\n if (!org?.pendingInvitations?.length) return null;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.pendingInvitations\")}</h3>\n {org.pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div>\n <div className=\"text-sm font-medium\">{inv.orgName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"org.invitedByLabel\", { name: inv.invitedBy })}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => acceptInvitation.mutate(inv.id)}\n disabled={acceptInvitation.isPending}\n className=\"rounded-md bg-green-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-green-700 disabled:opacity-50\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.accept\")\n )}\n </button>\n </div>\n ))}\n <ErrorText error={acceptInvitation.error} />\n </section>\n );\n}\n\nfunction JoinByDomainCard({ matches }: { matches: DomainMatchOrg[] }) {\n const t = useT();\n const joinByDomain = useJoinByDomain();\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.joinYourTeam\")}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {matches.length === 1\n ? t(\"org.joinDomainOne\")\n : t(\"org.joinDomainMany\")}\n </p>\n <div className=\"space-y-2\">\n {matches.map((m) => (\n <div\n key={m.orgId}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-blue-600/10\">\n <IconUsersGroup className=\"h-4 w-4 text-blue-600\" />\n </div>\n <div className=\"text-sm font-medium\">{m.orgName}</div>\n </div>\n <button\n type=\"button\"\n disabled={joinByDomain.isPending && pendingId === m.orgId}\n onClick={() => {\n setPendingId(m.orgId);\n joinByDomain.mutate(m.orgId, {\n onSettled: () => setPendingId(null),\n });\n }}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {joinByDomain.isPending && pendingId === m.orgId ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.join\")\n )}\n </button>\n </div>\n ))}\n </div>\n <ErrorText error={joinByDomain.error} />\n </section>\n );\n}\n\nfunction CreateOrgCard({ description }: { description?: string }) {\n const t = useT();\n const createOrg = useCreateOrg();\n const [name, setName] = useState(\"\");\n const [showForm, setShowForm] = useState(false);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">{t(\"org.createOrgCardTitle\")}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {description || t(\"org.createOrgCardDescription\")}\n </p>\n {!showForm ? (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90\"\n >\n {t(\"org.createOrganization\")}\n </button>\n ) : (\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Acme Inc.\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={!name.trim() || createOrg.isPending}\n onClick={() =>\n createOrg.mutate(name.trim(), {\n onSuccess: () => {\n setName(\"\");\n setShowForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n t(\"org.create\")\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowForm(false);\n setName(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n {t(\"org.cancel\")}\n </button>\n </div>\n <ErrorText error={createOrg.error} />\n </div>\n )}\n </section>\n );\n}\n\nfunction OrgNameDisplay({ name, canEdit }: { name: string; canEdit: boolean }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(name);\n const updateOrg = useUpdateOrg();\n\n if (!canEdit) return <div className=\"text-sm font-medium\">{name}</div>;\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(name);\n setEditing(true);\n }}\n className=\"group flex items-center gap-1.5 text-sm font-medium hover:text-foreground/80\"\n >\n {name}\n <IconPencil className=\"h-3 w-3 text-muted-foreground opacity-0 group-hover:opacity-100\" />\n </button>\n );\n }\n\n function save() {\n const trimmed = draft.trim();\n if (!trimmed || trimmed === name) {\n setEditing(false);\n return;\n }\n updateOrg.mutate(trimmed, { onSuccess: () => setEditing(false) });\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n onBlur={save}\n className=\"rounded border border-border bg-background px-1.5 py-0.5 text-sm font-medium focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <ErrorText error={updateOrg.error} />\n </div>\n );\n}\n\ninterface MemberListItem {\n email: string;\n role: string;\n}\n\ninterface PendingInviteListItem {\n id: string;\n email: string;\n role: string;\n}\n\nfunction MembersCard() {\n const t = useT();\n const { data: org } = useOrg();\n const { data: membersData, isLoading: isLoadingMembers } = useOrgMembers();\n const { data: invitationsData } = useOrgInvitations();\n const switchOrg = useSwitchOrg();\n\n const [showInviteForm, setShowInviteForm] = useState(false);\n\n if (!org?.orgId) return null;\n\n const isOwner = org.role === \"owner\";\n const isOwnerOrAdmin = isOwner || org.role === \"admin\";\n const members = membersData?.members ?? [];\n const pendingInvites = invitationsData?.invitations ?? [];\n const hasMultipleOrgs = (org.orgs?.length ?? 0) > 1;\n\n return (\n <div className=\"space-y-4\">\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-blue-600/10\">\n <IconUsersGroup className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div className=\"min-w-0\">\n <OrgNameDisplay\n name={org.orgName ?? \"\"}\n canEdit={isOwnerOrAdmin}\n />\n <div className=\"text-xs text-muted-foreground\">\n {t(\"org.memberCount\", { count: members.length })} ·{\" \"}\n {t(\"org.youAreRole\", { role: org.role })}\n </div>\n </div>\n </div>\n {hasMultipleOrgs && (\n <select\n value={org.orgId ?? \"\"}\n onChange={(e) => switchOrg.mutate(e.target.value || null)}\n disabled={switchOrg.isPending}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-xs sm:w-auto\"\n >\n {org.orgs.map((o) => (\n <option key={o.orgId} value={o.orgId}>\n {o.orgName}\n </option>\n ))}\n </select>\n )}\n </div>\n\n {isOwnerOrAdmin && (\n <div className=\"border-t border-border pt-4\">\n {!showInviteForm ? (\n <button\n type=\"button\"\n onClick={() => setShowInviteForm(true)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n {t(\"org.inviteMembers\")}\n </button>\n ) : (\n <BulkInviteForm\n currentUserRole={org.role}\n onClose={() => setShowInviteForm(false)}\n />\n )}\n </div>\n )}\n\n {isOwnerOrAdmin && (\n <div className=\"grid gap-5 border-t border-border pt-4 lg:grid-cols-2\">\n <DomainSettingsSection\n domain={org.allowedDomain}\n ownerEmail={org.email}\n />\n\n {isOwner && <A2ASecretSection secret={org.a2aSecret} />}\n </div>\n )}\n\n <ErrorText error={switchOrg.error} />\n </section>\n\n <MembersTableCard\n members={members}\n pendingInvites={pendingInvites}\n isLoadingMembers={isLoadingMembers}\n currentUserEmail={org.email}\n currentUserRole={org.role ?? null}\n />\n </div>\n );\n}\n\nfunction MembersTableCard({\n members,\n pendingInvites,\n isLoadingMembers,\n currentUserEmail,\n currentUserRole,\n}: {\n members: MemberListItem[];\n pendingInvites: PendingInviteListItem[];\n isLoadingMembers: boolean;\n currentUserEmail: string;\n currentUserRole: string | null;\n}) {\n const t = useT();\n\n return (\n <section className=\"rounded-lg border border-border bg-card\">\n <div className=\"flex flex-col gap-1 border-b border-border px-4 py-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h3 className=\"text-sm font-medium\">{t(\"org.members\")}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\"org.memberCount\", { count: members.length })}\n </p>\n </div>\n </div>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t(\"org.member\")}</TableHead>\n <TableHead>{t(\"org.role\")}</TableHead>\n <TableHead>{t(\"org.status\")}</TableHead>\n <TableHead className=\"text-end\">{t(\"org.actions\")}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoadingMembers && members.length === 0 ? (\n [0, 1, 2].map((i) => (\n <TableRow key={i}>\n <TableCell colSpan={4}>\n <div\n className=\"h-3.5 rounded bg-muted animate-pulse\"\n style={{ width: `${180 + i * 48}px` }}\n />\n </TableCell>\n </TableRow>\n ))\n ) : members.length === 0 && pendingInvites.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={4}\n className=\"py-8 text-center text-sm text-muted-foreground\"\n >\n {t(\"org.noMembers\")}\n </TableCell>\n </TableRow>\n ) : (\n <>\n {members.map((m) => (\n <MemberRow\n key={m.email}\n email={m.email}\n role={m.role}\n isCurrentUser={m.email === currentUserEmail}\n currentUserRole={currentUserRole}\n />\n ))}\n {pendingInvites.map((inv) => (\n <PendingInviteRow key={inv.id} invite={inv} />\n ))}\n </>\n )}\n </TableBody>\n </Table>\n </section>\n );\n}\n\nfunction roleLabel(role: string, t: ReturnType<typeof useT>) {\n if (role === \"owner\") return t(\"org.owner\");\n if (role === \"admin\") return t(\"org.admin\");\n return t(\"org.member\");\n}\n\nfunction RoleBadge({ role }: { role: string }) {\n const t = useT();\n return (\n <span className=\"inline-flex items-center gap-1.5 rounded border border-border px-2 py-1 text-xs text-muted-foreground\">\n <RoleIcon role={role} />\n {roleLabel(role, t)}\n </span>\n );\n}\n\nfunction PendingInviteRow({ invite }: { invite: PendingInviteListItem }) {\n const t = useT();\n return (\n <TableRow className=\"opacity-70\">\n <TableCell className=\"min-w-56\">\n <span className=\"truncate text-sm\">{invite.email}</span>\n </TableCell>\n <TableCell>\n <RoleBadge role={invite.role} />\n </TableCell>\n <TableCell>\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n {t(\"org.invited\")}\n </span>\n </TableCell>\n <TableCell className=\"text-end text-muted-foreground\">-</TableCell>\n </TableRow>\n );\n}\n\nfunction MemberRow({\n email,\n role,\n isCurrentUser,\n currentUserRole,\n}: {\n email: string;\n role: string;\n isCurrentUser: boolean;\n currentUserRole: string | null;\n}) {\n const t = useT();\n const removeMember = useRemoveMember();\n const changeRole = useChangeMemberRole();\n const [editing, setEditing] = useState(false);\n const [confirmingRemove, setConfirmingRemove] = useState(false);\n\n // Owners can manage admins + members. Admins can only manage members.\n // Owners themselves are immutable through this UI; current user can't\n // edit their own role here.\n const canManage =\n role !== \"owner\" &&\n !isCurrentUser &&\n (currentUserRole === \"owner\" ||\n (currentUserRole === \"admin\" && role === \"member\"));\n\n return (\n <TableRow>\n <TableCell className=\"min-w-56\">\n <span className=\"truncate text-sm\">{email}</span>\n </TableCell>\n <TableCell>\n <RoleBadge role={role} />\n </TableCell>\n <TableCell>\n {isCurrentUser ? (\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n {t(\"org.you\")}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">-</span>\n )}\n </TableCell>\n <TableCell>\n {canManage ? (\n <div className=\"flex shrink-0 items-center justify-end gap-1\">\n {editing ? (\n <select\n autoFocus\n value={role}\n onChange={(e) => {\n const next = e.target.value === \"admin\" ? \"admin\" : \"member\";\n if (next !== role) {\n changeRole.mutate(\n { email, role: next },\n { onSuccess: () => setEditing(false) },\n );\n } else {\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n disabled={changeRole.isPending}\n className=\"rounded-md border border-border bg-background px-1.5 py-0.5 text-[11px]\"\n >\n <option value=\"member\">{t(\"org.member\")}</option>\n <option value=\"admin\">{t(\"org.admin\")}</option>\n </select>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"org.changeRole\")}</TooltipContent>\n </Tooltip>\n )}\n {confirmingRemove ? (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingRemove(false)}\n className=\"rounded px-1.5 py-0.5 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {t(\"org.cancel\")}\n </button>\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() =>\n removeMember.mutate(email, {\n onSettled: () => setConfirmingRemove(false),\n })\n }\n className=\"rounded bg-red-500 px-1.5 py-0.5 text-[11px] text-white hover:bg-red-600 disabled:opacity-50\"\n >\n {t(\"org.remove\")}\n </button>\n </div>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() => setConfirmingRemove(true)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"org.removeMember\")}</TooltipContent>\n </Tooltip>\n )}\n </div>\n ) : (\n <div className=\"text-end text-muted-foreground\">-</div>\n )}\n </TableCell>\n </TableRow>\n );\n}\n\ninterface DraftInvite {\n email: string;\n role: InviteRole;\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction parseEmailList(input: string): string[] {\n return Array.from(\n new Set(\n input\n .split(/[\\s,;]+/)\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n ),\n );\n}\n\nfunction parseCsvEmails(text: string): string[] {\n // Tolerant CSV parse — split on lines, then on commas, take any cell\n // that looks like an email. Handles \"name,email,role\" rows or just\n // \"email\" per line. A robust full CSV parser would be overkill here.\n const cells: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n for (const cell of line.split(\",\")) {\n const trimmed = cell.trim().replace(/^\"|\"$/g, \"\");\n if (trimmed) cells.push(trimmed);\n }\n }\n return Array.from(\n new Set(cells.filter((c) => EMAIL_RE.test(c)).map((c) => c.toLowerCase())),\n );\n}\n\nfunction BulkInviteForm({\n currentUserRole,\n onClose,\n}: {\n currentUserRole: string | null;\n onClose: () => void;\n}) {\n const bulkInvite = useBulkInviteMembers();\n const fileRef = useRef<HTMLInputElement>(null);\n const [drafts, setDrafts] = useState<DraftInvite[]>([\n { email: \"\", role: \"member\" },\n ]);\n const [pasteOpen, setPasteOpen] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [pasteRole, setPasteRole] = useState<InviteRole>(\"member\");\n const [resultBanner, setResultBanner] = useState<{\n succeeded: number;\n failed: { email: string; error: string }[];\n } | null>(null);\n\n const canSetAdmin = currentUserRole === \"owner\";\n\n const validDrafts = useMemo(\n () =>\n drafts\n .map((d) => ({ ...d, email: d.email.trim().toLowerCase() }))\n .filter((d) => EMAIL_RE.test(d.email)),\n [drafts],\n );\n\n function setDraft(index: number, patch: Partial<DraftInvite>) {\n setDrafts((prev) =>\n prev.map((d, i) => (i === index ? { ...d, ...patch } : d)),\n );\n }\n\n function appendEmails(emails: string[], role: InviteRole) {\n if (!emails.length) return;\n setDrafts((prev) => {\n const existing = new Set(\n prev.map((d) => d.email.trim().toLowerCase()).filter(Boolean),\n );\n const fresh: DraftInvite[] = [];\n for (const e of emails) {\n if (!existing.has(e)) {\n fresh.push({ email: e, role });\n existing.add(e);\n }\n }\n // If the only existing row is an empty placeholder, drop it.\n const cleaned = prev.filter(\n (d, i) => !(i === 0 && !d.email.trim() && prev.length === 1),\n );\n return [...cleaned, ...fresh];\n });\n }\n\n function handleFile(file: File) {\n file.text().then((text) => {\n const emails = parseCsvEmails(text);\n if (emails.length) {\n appendEmails(emails, \"member\");\n } else {\n setResultBanner({\n succeeded: 0,\n failed: [{ email: file.name, error: \"No valid emails found in CSV\" }],\n });\n }\n });\n }\n\n async function submit() {\n setResultBanner(null);\n const dedup = new Map<string, DraftInvite>();\n for (const d of validDrafts) {\n // canSetAdmin guard mirrors server-side enforcement so an admin-only\n // user editing the form can't even attempt to grant admin (they'd\n // get a 403 anyway).\n const role = canSetAdmin ? d.role : \"member\";\n dedup.set(d.email, { ...d, role });\n }\n const invites = Array.from(dedup.values());\n if (invites.length === 0) return;\n\n const result = await bulkInvite.mutateAsync(invites);\n setResultBanner({\n succeeded: result.succeeded.length,\n failed: result.failed,\n });\n\n // Wipe drafts that succeeded; leave failed ones so the user can fix\n // and retry. If everything succeeded, reset to a single blank row.\n const failedEmails = new Set(result.failed.map((f) => f.email));\n setDrafts((prev) => {\n const remaining = prev.filter((d) =>\n failedEmails.has(d.email.trim().toLowerCase()),\n );\n return remaining.length > 0 ? remaining : [{ email: \"\", role: \"member\" }];\n });\n\n // Auto-close on full success.\n if (result.failed.length === 0 && result.succeeded.length > 0) {\n setTimeout(() => onClose(), 1200);\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n {drafts.map((draft, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <input\n type=\"email\"\n value={draft.email}\n onChange={(e) => setDraft(i, { email: e.target.value })}\n placeholder=\"colleague@company.com\"\n className=\"flex-1 rounded-md border border-border bg-background px-3 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus={i === drafts.length - 1}\n />\n <select\n value={draft.role}\n onChange={(e) =>\n setDraft(i, {\n role: e.target.value === \"admin\" ? \"admin\" : \"member\",\n })\n }\n disabled={!canSetAdmin}\n title={\n canSetAdmin\n ? undefined\n : \"Only the organization owner can invite admins\"\n }\n className=\"rounded-md border border-border bg-background px-2 py-1.5 text-xs disabled:opacity-50\"\n >\n <option value=\"member\">Member</option>\n <option value=\"admin\">Admin</option>\n </select>\n {drafts.length > 1 && (\n <button\n type=\"button\"\n onClick={() =>\n setDrafts((prev) => prev.filter((_, j) => j !== i))\n }\n className=\"text-muted-foreground hover:text-red-500\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n setDrafts((prev) => [...prev, { email: \"\", role: \"member\" }])\n }\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n Add another\n </button>\n <button\n type=\"button\"\n onClick={() => setPasteOpen((v) => !v)}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n Paste many\n </button>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconFileImport className=\"h-3.5 w-3.5\" />\n Import CSV\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".csv,text/csv,text/plain\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFile(file);\n // reset so re-uploading the same file re-fires onChange\n e.target.value = \"\";\n }}\n />\n </div>\n\n {pasteOpen && (\n <div className=\"space-y-2 rounded-md border border-border p-3\">\n <div className=\"text-xs font-medium text-muted-foreground\">\n Paste emails (comma, space, or newline separated)\n </div>\n <textarea\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n rows={4}\n placeholder=\"alice@acme.com, bob@acme.com&#10;charlie@acme.com\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n />\n <div className=\"flex items-center gap-2\">\n <select\n value={pasteRole}\n onChange={(e) =>\n setPasteRole(e.target.value === \"admin\" ? \"admin\" : \"member\")\n }\n disabled={!canSetAdmin}\n className=\"rounded-md border border-border bg-background px-2 py-1.5 text-xs disabled:opacity-50\"\n >\n <option value=\"member\">Add as members</option>\n <option value=\"admin\">Add as admins</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n appendEmails(parseEmailList(pasteValue), pasteRole);\n setPasteValue(\"\");\n setPasteOpen(false);\n }}\n disabled={parseEmailList(pasteValue).length === 0}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Add\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteValue(\"\");\n setPasteOpen(false);\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={validDrafts.length === 0 || bulkInvite.isPending}\n onClick={submit}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {bulkInvite.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n <IconCheck className=\"h-3.5 w-3.5\" />\n Send {validDrafts.length || \"\"}{\" \"}\n {validDrafts.length === 1 ? \"invite\" : \"invites\"}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Close\n </button>\n </div>\n\n <p className=\"text-[11px] text-muted-foreground\">\n Each invitee signs in with this exact email to accept.\n {canSetAdmin\n ? \" Admins can manage members and workspace settings.\"\n : \" Only the organization owner can grant admin access.\"}\n </p>\n\n {resultBanner && (\n <div className=\"space-y-1 rounded-md border border-border bg-accent/30 p-2.5\">\n {resultBanner.succeeded > 0 && (\n <p className=\"text-[11px] text-green-600\">\n <IconCheck className=\"inline h-3 w-3 -mt-0.5\" /> Sent{\" \"}\n {resultBanner.succeeded}{\" \"}\n {resultBanner.succeeded === 1 ? \"invite\" : \"invites\"}.\n </p>\n )}\n {resultBanner.failed.length > 0 && (\n <ul className=\"space-y-0.5 text-[11px] text-red-500\">\n {resultBanner.failed.map((f) => (\n <li key={f.email}>\n <IconAlertTriangle className=\"inline h-3 w-3 -mt-0.5 me-1\" />\n {f.email}: {f.error}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n <ErrorText error={bulkInvite.error} />\n </div>\n );\n}\n\nfunction DomainSettingsSection({\n domain,\n ownerEmail,\n}: {\n domain: string | null;\n ownerEmail: string;\n}) {\n const setOrgDomain = useSetOrgDomain();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(domain ?? \"\");\n\n const ownDomain = ownerEmail.split(\"@\")[1]?.toLowerCase() ?? \"\";\n\n function save() {\n const trimmed = draft.trim().toLowerCase();\n if (trimmed === (domain ?? \"\")) {\n setEditing(false);\n return;\n }\n setOrgDomain.mutate(trimmed || null, {\n onSuccess: () => setEditing(false),\n });\n }\n\n return (\n <div className=\"space-y-2 border-t border-border pt-3 first:border-t-0 first:pt-0\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Email domain auto-join\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Anyone who signs up with an email at this domain will join your\n organization automatically. You can only set your own email domain (\n {ownDomain || \"—\"}); free email providers like gmail.com or outlook.com\n aren&apos;t allowed.\n </p>\n {!editing ? (\n <div className=\"flex items-center gap-2\">\n {domain ? (\n <>\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm\">\n <IconAt className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {domain}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n setDraft(domain);\n setEditing(true);\n }}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Edit domain</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={() => setOrgDomain.mutate(null)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Remove domain</TooltipContent>\n </Tooltip>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(ownDomain);\n setEditing(true);\n }}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconAt className=\"h-3.5 w-3.5\" />\n Allow {ownDomain || \"your domain\"} to auto-join\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n placeholder={ownDomain || \"example.com\"}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={save}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setOrgDomain.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n <ErrorText error={setOrgDomain.error} />\n </div>\n );\n}\n\nfunction A2ASecretSection({ secret }: { secret: string | null | undefined }) {\n const setA2ASecret = useSetA2ASecret();\n const syncA2ASecret = useSyncA2ASecret();\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pasteMode, setPasteMode] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [syncResult, setSyncResult] = useState<SyncA2ASecretResult | null>(\n null,\n );\n\n function copyToClipboard() {\n if (!secret) return;\n navigator.clipboard.writeText(secret).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n // Push the current secret to all connected apps. Optionally pass the\n // PREVIOUS secret as `signSecret` so the receiving apps (which still\n // hold the previous value) can verify the JWT.\n function syncToApps(signSecret?: string) {\n setSyncResult(null);\n syncA2ASecret.mutate(signSecret ? { signSecret } : undefined, {\n onSuccess: (result) => {\n setSyncResult(result);\n },\n });\n }\n\n function regenerate() {\n setA2ASecret.mutate(undefined, {\n onSuccess: (result) => {\n setRevealed(false);\n // Auto-sync the new secret to all connected apps. Sign with the\n // PREVIOUS secret (which peers still hold) so verification on\n // their side succeeds and they accept the new value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n function saveSecret() {\n const trimmed = pasteValue.trim();\n if (!trimmed) return;\n setA2ASecret.mutate(trimmed, {\n onSuccess: (result) => {\n setPasteMode(false);\n setPasteValue(\"\");\n // Same auto-sync flow as regenerate: peers verify with the\n // previous secret, then update to the new pasted value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n const masked = secret ? \"****\" + secret.slice(-8) : \"Not set\";\n\n return (\n <div className=\"space-y-2 border-t border-border pt-3 first:border-t-0 first:pt-0\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Cross-app authentication\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n This secret authenticates cross-app delegation (e.g. Dispatch to\n Analytics). All apps in your organization need the same secret.\n </p>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono\">\n <IconKey className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {revealed && secret ? secret : masked}\n </span>\n {secret && (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRevealed(!revealed)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n {revealed ? (\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n ) : (\n <IconEye className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {revealed ? \"Hide secret\" : \"Reveal secret\"}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n {copied ? (\n <IconCheck className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent>Copy secret</TooltipContent>\n </Tooltip>\n </>\n )}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={regenerate}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconRefresh className=\"h-3.5 w-3.5\" />\n )}\n Regenerate\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Regenerate secret and sync to connected apps\n </TooltipContent>\n </Tooltip>\n {secret && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => syncToApps()}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n >\n {syncA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconCloudUpload className=\"h-3.5 w-3.5\" />\n )}\n Sync to apps\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Push this secret to every connected app\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n\n {syncA2ASecret.isPending && (\n <p className=\"text-[11px] text-muted-foreground\">\n Syncing to connected apps…\n </p>\n )}\n\n {syncResult && !syncA2ASecret.isPending && (\n <div className=\"space-y-1\">\n <p className=\"text-[11px] text-muted-foreground\">\n Synced to {syncResult.succeeded}/{syncResult.total} app\n {syncResult.total === 1 ? \"\" : \"s\"}\n {syncResult.failed > 0 ? ` (${syncResult.failed} failed)` : \"\"}.\n </p>\n {syncResult.failed > 0 && (\n <ul className=\"text-[11px] text-red-500 list-disc ps-5 space-y-0.5\">\n {syncResult.results\n .filter((r) => !r.ok)\n .map((r) => (\n <li key={r.id}>\n {r.name}: {r.error || `HTTP ${r.status ?? \"?\"}`}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {!pasteMode ? (\n <button\n type=\"button\"\n onClick={() => setPasteMode(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconKey className=\"h-3.5 w-3.5\" />\n Paste secret from another app\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") saveSecret();\n if (e.key === \"Escape\") {\n setPasteMode(false);\n setPasteValue(\"\");\n }\n }}\n placeholder=\"Paste A2A secret\"\n className=\"flex-1 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={!pasteValue.trim() || setA2ASecret.isPending}\n onClick={saveSecret}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteMode(false);\n setPasteValue(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <ErrorText error={setA2ASecret.error} />\n <ErrorText error={syncA2ASecret.error} />\n </div>\n );\n}\n\n/**\n * Default Team management page. Templates can route directly to this component\n * or wrap it with their own Layout via the `layout` prop.\n */\nexport function TeamPage({\n layout,\n title,\n showTitle = true,\n createOrgDescription,\n className,\n}: TeamPageProps) {\n const t = useT();\n const { data: org, isLoading } = useOrg();\n\n const content = (\n <div className={`space-y-6 ${className ?? \"max-w-2xl\"}`}>\n {showTitle ? (\n <h2 className=\"text-2xl font-bold tracking-tight\">\n {title ?? t(\"org.team\")}\n </h2>\n ) : null}\n\n {isLoading && (\n <section className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"text-sm text-muted-foreground\">\n {t(\"org.loading\")}\n </div>\n </section>\n )}\n\n {!isLoading && (\n <>\n <PendingInvitationsCard />\n {!org?.orgId ? (\n <>\n {org?.domainMatches && org.domainMatches.length > 0 && (\n <JoinByDomainCard matches={org.domainMatches} />\n )}\n <CreateOrgCard description={createOrgDescription} />\n </>\n ) : (\n <MembersCard />\n )}\n </>\n )}\n </div>\n );\n\n const wrapped = (\n <TooltipProvider delayDuration={200}>{content}</TooltipProvider>\n );\n\n return layout ? <>{layout(wrapped)}</> : wrapped;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * <DemoModeSection /> — toggle that replaces names, emails, and numbers with
3
- * realistic fake data everywhere (UI + what the agent sees) while preserving
4
- * IDs and structure so the app keeps working.
2
+ * <DemoModeSection /> — toggle that replaces contact/free-text names, emails,
3
+ * and numbers with realistic fake data everywhere (UI + what the agent sees)
4
+ * while preserving labels, IDs, and structure so the app keeps working.
5
5
  *
6
6
  * The toggle is stored in application_state under `demo-mode`
7
7
  * (`{ enabled: boolean }`) and written via `PUT
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * <DemoModeSection /> — toggle that replaces names, emails, and numbers with
4
- * realistic fake data everywhere (UI + what the agent sees) while preserving
5
- * IDs and structure so the app keeps working.
3
+ * <DemoModeSection /> — toggle that replaces contact/free-text names, emails,
4
+ * and numbers with realistic fake data everywhere (UI + what the agent sees)
5
+ * while preserving labels, IDs, and structure so the app keeps working.
6
6
  *
7
7
  * The toggle is stored in application_state under `demo-mode`
8
8
  * (`{ enabled: boolean }`) and written via `PUT
@@ -70,7 +70,7 @@ export function DemoModeSection() {
70
70
  setEnabled(previous);
71
71
  }
72
72
  };
73
- return (_jsxs("div", { className: "flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Enable demo mode" }), _jsx("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: "Replace names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. IDs and structure are preserved so the app keeps working." }), forced && (_jsxs("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: ["Enforced by the ", _jsx("code", { children: "DEMO_MODE" }), " environment variable \u2014 can't be turned off here."] }))] }), _jsx("button", { type: "button", role: "switch", "aria-checked": !!enabled, "aria-label": "Enable demo mode", disabled: enabled === null || forced, onClick: () => toggle(!enabled),
73
+ return (_jsxs("div", { className: "flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Enable demo mode" }), _jsx("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: "Replace contact/free-text names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. Labels, IDs, and structure are preserved so the app keeps working." }), forced && (_jsxs("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: ["Enforced by the ", _jsx("code", { children: "DEMO_MODE" }), " environment variable \u2014 can't be turned off here."] }))] }), _jsx("button", { type: "button", role: "switch", "aria-checked": !!enabled, "aria-label": "Enable demo mode", disabled: enabled === null || forced, onClick: () => toggle(!enabled),
74
74
  // Theme tokens; streaming agent owns layout.
75
75
  className: `relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${enabled
76
76
  ? "bg-primary"
@@ -1 +1 @@
1
- {"version":3,"file":"DemoModeSection.js","sourceRoot":"","sources":["../../../src/client/settings/DemoModeSection.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * <DemoModeSection /> — toggle that replaces names, emails, and numbers with\n * realistic fake data everywhere (UI + what the agent sees) while preserving\n * IDs and structure so the app keeps working.\n *\n * The toggle is stored in application_state under `demo-mode`\n * (`{ enabled: boolean }`) and written via `PUT\n * /_agent-native/application-state/demo-mode` (optimistic — flip first,\n * write in the background). It READS from `/_agent-native/demo/status`\n * instead, which ORs the per-user toggle with the `DEMO_MODE` env: a hosted\n * demo deployment is forced on and the switch is locked so it can't be\n * accidentally turned off on stage.\n */\n\nimport { IconEyeOff } from \"@tabler/icons-react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\n\ninterface DemoStatus {\n enabled?: boolean;\n forced?: boolean;\n}\n\nconst DEMO_STATUS_URL = agentNativePath(\"/_agent-native/demo/status\");\nconst DEMO_MODE_WRITE_URL = agentNativePath(\n \"/_agent-native/application-state/demo-mode\",\n);\n\nexport function DemoModeSection() {\n const [enabled, setEnabled] = useState<boolean | null>(null);\n\n const { data } = useQuery({\n queryKey: [\"agent-native\", \"demo-mode\"],\n queryFn: async () => {\n const res = await fetch(DEMO_STATUS_URL, {\n credentials: \"same-origin\",\n });\n if (!res.ok) return null;\n return (await res.json()) as DemoStatus | null;\n },\n refetchInterval: 4_000,\n staleTime: 2_000,\n });\n\n const serverEnabled = data?.enabled;\n const forced = data?.forced === true;\n\n // Surface the server value once it arrives (and on subsequent polls), but\n // never clobber an in-flight optimistic toggle with a stale read. When\n // forced by env, always reflect the locked-on state.\n useEffect(() => {\n if (forced) {\n setEnabled(true);\n } else if (typeof serverEnabled === \"boolean\") {\n setEnabled((prev) => (prev === null ? serverEnabled : prev));\n } else if (serverEnabled === undefined && data !== undefined) {\n setEnabled((prev) => (prev === null ? false : prev));\n }\n }, [serverEnabled, forced, data]);\n\n const toggle = async (next: boolean) => {\n if (forced) return;\n const previous = enabled;\n // Optimistic: flip immediately, write in the background.\n setEnabled(next);\n try {\n const res = await fetch(DEMO_MODE_WRITE_URL, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ enabled: next }),\n });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n } catch {\n setEnabled(previous);\n }\n };\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2\">\n <div className=\"min-w-0\">\n <div className=\"text-[11px] font-medium text-foreground\">\n Enable demo mode\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Replace names, emails, and numbers with realistic fake data everywhere\n — in the UI and what the agent sees. IDs and structure are preserved\n so the app keeps working.\n </p>\n {forced && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Enforced by the <code>DEMO_MODE</code> environment variable — can't\n be turned off here.\n </p>\n )}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!enabled}\n aria-label=\"Enable demo mode\"\n disabled={enabled === null || forced}\n onClick={() => toggle(!enabled)}\n // Theme tokens; streaming agent owns layout.\n className={`relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${\n enabled\n ? \"bg-primary\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n } ${enabled === null || forced ? \"opacity-60\" : \"\"}`}\n >\n <span\n className={`inline-block h-3 w-3 transform rounded-full bg-background transition-transform ${\n enabled ? \"translate-x-3.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n </div>\n );\n}\n\nexport function DemoModeIcon() {\n return <IconEyeOff size={14} />;\n}\n"]}
1
+ {"version":3,"file":"DemoModeSection.js","sourceRoot":"","sources":["../../../src/client/settings/DemoModeSection.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOjD,MAAM,eAAe,GAAG,eAAe,CAAC,4BAA4B,CAAC,CAAC;AACtE,MAAM,mBAAmB,GAAG,eAAe,CACzC,4CAA4C,CAC7C,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QACxB,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;QACvC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;gBACvC,WAAW,EAAE,aAAa;aAC3B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACjD,CAAC;QACD,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC,0EAA0E;IAC1E,uEAAuE;IACvE,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;YAC9C,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,aAAa,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAa,EAAE,EAAE;QACrC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,yDAAyD;QACzD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mBAAmB,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACxC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,iGAAiG,aAC9G,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,yCAAyC,iCAElD,EACN,YAAG,SAAS,EAAC,0CAA0C,sNAInD,EACH,MAAM,IAAI,CACT,aAAG,SAAS,EAAC,0CAA0C,iCACrC,uCAAsB,8DAEpC,CACL,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,kBACC,CAAC,CAAC,OAAO,gBACZ,kBAAkB,EAC7B,QAAQ,EAAE,OAAO,KAAK,IAAI,IAAI,MAAM,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBAC/B,6CAA6C;gBAC7C,SAAS,EAAE,oGACT,OAAO;oBACL,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,qDACN,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,YAEpD,eACE,SAAS,EAAE,kFACT,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAChC,EAAE,GACF,GACK,IACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;AAClC,CAAC","sourcesContent":["/**\n * <DemoModeSection /> — toggle that replaces contact/free-text names, emails,\n * and numbers with realistic fake data everywhere (UI + what the agent sees)\n * while preserving labels, IDs, and structure so the app keeps working.\n *\n * The toggle is stored in application_state under `demo-mode`\n * (`{ enabled: boolean }`) and written via `PUT\n * /_agent-native/application-state/demo-mode` (optimistic — flip first,\n * write in the background). It READS from `/_agent-native/demo/status`\n * instead, which ORs the per-user toggle with the `DEMO_MODE` env: a hosted\n * demo deployment is forced on and the switch is locked so it can't be\n * accidentally turned off on stage.\n */\n\nimport { IconEyeOff } from \"@tabler/icons-react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\n\ninterface DemoStatus {\n enabled?: boolean;\n forced?: boolean;\n}\n\nconst DEMO_STATUS_URL = agentNativePath(\"/_agent-native/demo/status\");\nconst DEMO_MODE_WRITE_URL = agentNativePath(\n \"/_agent-native/application-state/demo-mode\",\n);\n\nexport function DemoModeSection() {\n const [enabled, setEnabled] = useState<boolean | null>(null);\n\n const { data } = useQuery({\n queryKey: [\"agent-native\", \"demo-mode\"],\n queryFn: async () => {\n const res = await fetch(DEMO_STATUS_URL, {\n credentials: \"same-origin\",\n });\n if (!res.ok) return null;\n return (await res.json()) as DemoStatus | null;\n },\n refetchInterval: 4_000,\n staleTime: 2_000,\n });\n\n const serverEnabled = data?.enabled;\n const forced = data?.forced === true;\n\n // Surface the server value once it arrives (and on subsequent polls), but\n // never clobber an in-flight optimistic toggle with a stale read. When\n // forced by env, always reflect the locked-on state.\n useEffect(() => {\n if (forced) {\n setEnabled(true);\n } else if (typeof serverEnabled === \"boolean\") {\n setEnabled((prev) => (prev === null ? serverEnabled : prev));\n } else if (serverEnabled === undefined && data !== undefined) {\n setEnabled((prev) => (prev === null ? false : prev));\n }\n }, [serverEnabled, forced, data]);\n\n const toggle = async (next: boolean) => {\n if (forced) return;\n const previous = enabled;\n // Optimistic: flip immediately, write in the background.\n setEnabled(next);\n try {\n const res = await fetch(DEMO_MODE_WRITE_URL, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ enabled: next }),\n });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n } catch {\n setEnabled(previous);\n }\n };\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2\">\n <div className=\"min-w-0\">\n <div className=\"text-[11px] font-medium text-foreground\">\n Enable demo mode\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Replace contact/free-text names, emails, and numbers with realistic\n fake data everywhere — in the UI and what the agent sees. Labels, IDs,\n and structure are preserved so the app keeps working.\n </p>\n {forced && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Enforced by the <code>DEMO_MODE</code> environment variable — can't\n be turned off here.\n </p>\n )}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!enabled}\n aria-label=\"Enable demo mode\"\n disabled={enabled === null || forced}\n onClick={() => toggle(!enabled)}\n // Theme tokens; streaming agent owns layout.\n className={`relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${\n enabled\n ? \"bg-primary\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n } ${enabled === null || forced ? \"opacity-60\" : \"\"}`}\n >\n <span\n className={`inline-block h-3 w-3 transform rounded-full bg-background transition-transform ${\n enabled ? \"translate-x-3.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n </div>\n );\n}\n\nexport function DemoModeIcon() {\n return <IconEyeOff size={14} />;\n}\n"]}
@@ -1184,7 +1184,7 @@ function SettingsPanelContent({ isDevMode, onToggleDevMode, showDevToggle, devAp
1184
1184
  const nextIsDev = next === "development";
1185
1185
  if (nextIsDev !== isDevMode)
1186
1186
  onToggleDevMode();
1187
- } })) })), showCapabilityStrip && (_jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) })), shouldShowSection("account") && (_jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") })), shouldShowSection("llm") && (_jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") })), shouldShowSection("app-models") && (_jsx(AppModelDefaultsSectionInner, { open: openSection === "app-models", onToggle: () => toggle("app-models") })), shouldShowSection("limits") && (_jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") })), shouldShowSection("voice") && (_jsx(SettingsSection, { id: settingsSectionDomId("voice"), icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) })), shouldShowSection("demo-mode") && (_jsx(SettingsSection, { id: settingsSectionDomId("demo-mode"), icon: _jsx(IconEyeOff, { size: 14 }), title: "Demo mode", subtitle: "Replace names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. IDs and structure are preserved so the app keeps working.", open: openSection === "demo-mode", onToggle: () => toggle("demo-mode"), children: _jsx(DemoModeSection, {}) })), shouldShowSection("automations") && (_jsx(SettingsSection, { id: settingsSectionDomId("automations"), icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) })), shouldShowSection("secrets") && (_jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) })), shouldShowSection("hosting") && (_jsx(SettingsSection, { id: settingsSectionDomId("hosting"), icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "hosting_settings", trackingFlow: "hosting" }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) })), shouldShowSection("database") && (_jsx(SettingsSection, { id: settingsSectionDomId("database"), icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "database_settings", trackingFlow: "database" }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) })), shouldShowSection("uploads") && (_jsx(SettingsSection, { id: settingsSectionDomId("uploads"), icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "file_upload_settings", trackingFlow: "file_upload" }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) })), shouldShowSection("auth") && (_jsx(SettingsSection, { id: settingsSectionDomId("auth"), icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "auth_settings", trackingFlow: "auth" }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) })), shouldShowSection("email") && (_jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") })), shouldShowSection("browser") && (_jsx(SettingsSection, { id: settingsSectionDomId("browser"), icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "browser_settings", trackingFlow: "browser_automation" }) })), builderBranchesAvailable && shouldShowSection("background") && (_jsx(SettingsSection, { id: settingsSectionDomId("background"), icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "background_agent_settings", trackingFlow: "background_agent" }) })), shouldShowSection("integrations") && (_jsx(SettingsSection, { id: settingsSectionDomId("integrations"), icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) })), shouldShowSection("usage") && (_jsx(SettingsSection, { id: settingsSectionDomId("usage"), icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) })), shouldShowSection("a2a") && (_jsx(SettingsSection, { id: settingsSectionDomId("a2a"), icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) }))] }) }));
1187
+ } })) })), showCapabilityStrip && (_jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) })), shouldShowSection("account") && (_jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") })), shouldShowSection("llm") && (_jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") })), shouldShowSection("app-models") && (_jsx(AppModelDefaultsSectionInner, { open: openSection === "app-models", onToggle: () => toggle("app-models") })), shouldShowSection("limits") && (_jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") })), shouldShowSection("voice") && (_jsx(SettingsSection, { id: settingsSectionDomId("voice"), icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) })), shouldShowSection("demo-mode") && (_jsx(SettingsSection, { id: settingsSectionDomId("demo-mode"), icon: _jsx(IconEyeOff, { size: 14 }), title: "Demo mode", subtitle: "Replace contact/free-text names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. Labels, IDs, and structure are preserved so the app keeps working.", open: openSection === "demo-mode", onToggle: () => toggle("demo-mode"), children: _jsx(DemoModeSection, {}) })), shouldShowSection("automations") && (_jsx(SettingsSection, { id: settingsSectionDomId("automations"), icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) })), shouldShowSection("secrets") && (_jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) })), shouldShowSection("hosting") && (_jsx(SettingsSection, { id: settingsSectionDomId("hosting"), icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "hosting_settings", trackingFlow: "hosting" }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) })), shouldShowSection("database") && (_jsx(SettingsSection, { id: settingsSectionDomId("database"), icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "database_settings", trackingFlow: "database" }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) })), shouldShowSection("uploads") && (_jsx(SettingsSection, { id: settingsSectionDomId("uploads"), icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "file_upload_settings", trackingFlow: "file_upload" }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) })), shouldShowSection("auth") && (_jsx(SettingsSection, { id: settingsSectionDomId("auth"), icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "auth_settings", trackingFlow: "auth" }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) })), shouldShowSection("email") && (_jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") })), shouldShowSection("browser") && (_jsx(SettingsSection, { id: settingsSectionDomId("browser"), icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "browser_settings", trackingFlow: "browser_automation" }) })), builderBranchesAvailable && shouldShowSection("background") && (_jsx(SettingsSection, { id: settingsSectionDomId("background"), icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "background_agent_settings", trackingFlow: "background_agent" }) })), shouldShowSection("integrations") && (_jsx(SettingsSection, { id: settingsSectionDomId("integrations"), icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) })), shouldShowSection("usage") && (_jsx(SettingsSection, { id: settingsSectionDomId("usage"), icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) })), shouldShowSection("a2a") && (_jsx(SettingsSection, { id: settingsSectionDomId("a2a"), icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) }))] }) }));
1188
1188
  }
1189
1189
  export function SettingsPanel(props) {
1190
1190
  return _jsx(SettingsPanelContent, { ...props });