@opengeni/react 7.4.0 → 7.5.0-canary.36927100590001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -27
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +516 -1413
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-2E6R2Y4W.js → browser-viewer-Z7S7QEJL.js} +6 -5
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/{chunk-Y3QTZN2F.js → chunk-2VFNCX4E.js} +6 -6
- package/dist/{chunk-UDD6DLLT.js → chunk-3IJJEYW4.js} +15 -3
- package/dist/chunk-3IJJEYW4.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-5J4FOW6Q.js} +2 -10
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/{chunk-KVERXCFY.js → chunk-5KYZIQFY.js} +40 -3
- package/dist/chunk-5KYZIQFY.js.map +1 -0
- package/dist/{chunk-KNDIXZN6.js → chunk-7UAMYXJY.js} +25 -18
- package/dist/{chunk-KNDIXZN6.js.map → chunk-7UAMYXJY.js.map} +1 -1
- package/dist/{chunk-SEEVCT36.js → chunk-A4UJB2MM.js} +2 -2
- package/dist/{chunk-X4HIN6TV.js → chunk-AFLPWUQ7.js} +71 -162
- package/dist/chunk-AFLPWUQ7.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/{chunk-XEJEOAOV.js → chunk-B7WMS3CS.js} +51 -40
- package/dist/chunk-B7WMS3CS.js.map +1 -0
- package/dist/{chunk-S5JQ4R22.js → chunk-BDKR6BAR.js} +54 -24
- package/dist/chunk-BDKR6BAR.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-DYWBUX5Q.js} +24 -12
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/{chunk-YZ3YYMOM.js → chunk-E3G7SAYZ.js} +252 -624
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/{chunk-5AZSK6MV.js → chunk-LWNLETQT.js} +5 -5
- package/dist/{chunk-USXVQACU.js → chunk-M7LBYP63.js} +5 -4
- package/dist/{chunk-USXVQACU.js.map → chunk-M7LBYP63.js.map} +1 -1
- package/dist/{chunk-L4OSXQ6H.js → chunk-NBOHNRLJ.js} +1289 -1060
- package/dist/chunk-NBOHNRLJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-3E2AITTZ.js → chunk-WUISZ3WU.js} +32 -28
- package/dist/{chunk-3E2AITTZ.js.map → chunk-WUISZ3WU.js.map} +1 -1
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/{chunk-DUEBTL3N.js → chunk-Y2PRMYLC.js} +4 -3
- package/dist/{chunk-DUEBTL3N.js.map → chunk-Y2PRMYLC.js.map} +1 -1
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-V2ABIVYJ.js → chunk-ZXSEDZP7.js} +70 -6
- package/dist/chunk-ZXSEDZP7.js.map +1 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/index.d.ts +7 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/browser-select-control.d.ts +3 -1
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +20 -3
- package/dist/components/open-geni-links.d.ts +16 -0
- package/dist/components/session-conversation.d.ts +20 -1
- package/dist/components/timeline-pill-geometry.d.ts +8 -0
- package/dist/components/timeline-pill-placement.d.ts +24 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/composer.js +5 -5
- package/dist/{computer-viewer-WMJE6OA3.js → computer-viewer-KJWLH3GI.js} +7 -5
- package/dist/connect.js +7 -6
- package/dist/connect.js.map +1 -1
- package/dist/conversation-timeline.d.ts +1 -1
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +1 -1
- package/dist/hooks/use-composer.d.ts +4 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +460 -1386
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +8 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-QB4EUCW5.js → latest-question-IS445HOW.js} +3 -3
- package/dist/lib/format.d.ts +6 -1
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/machines.js +2 -2
- package/dist/{markdown-table-layout-PFUEZ2U4.js → markdown-table-layout-QXSLK4BY.js} +37 -5
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/{queue-surface-implementation-IM2HD3SK.js → queue-surface-implementation-2CAQAIHM.js} +2 -2
- package/dist/realtime.js +3 -3
- package/dist/{sandbox-files-PXPIZAFG.js → sandbox-files-AEJTWGT4.js} +8 -5
- package/dist/sandbox-files-AEJTWGT4.js.map +1 -0
- package/dist/session-ui.d.ts +9 -2
- package/dist/session-ui.js +39 -20
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +4 -4
- package/dist/sites.js +4 -289
- package/dist/sites.js.map +1 -1
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/genie-loading.d.ts +3 -1
- package/dist/timeline/types.d.ts +8 -1
- package/dist/{timeline-annotation-selection-ODLVF4OI.js → timeline-annotation-selection-DMLMM2TX.js} +6 -1
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-pill-geometry-Z23V243M.js +110 -0
- package/dist/timeline-pill-geometry-Z23V243M.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1073 -0
- package/dist/usage.js.map +1 -0
- package/package.json +19 -3
- package/src/artifacts.ts +37 -0
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +3 -1
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +34 -36
- package/src/components/artifacts/editable-presentation.tsx +21 -16
- package/src/components/artifacts/index.ts +41 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/browser-select-control.tsx +4 -1
- package/src/components/browser-viewer.tsx +81 -22
- package/src/components/code-editor.tsx +13 -16
- package/src/components/computer-viewer.tsx +51 -23
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/markdown-table-layout.ts +49 -5
- package/src/components/markdown.tsx +5 -2
- package/src/components/message-timeline.tsx +557 -516
- package/src/components/open-geni-links.tsx +24 -0
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/session-chrome.tsx +22 -3
- package/src/components/session-conversation.tsx +195 -102
- package/src/components/timeline-annotation-selection.tsx +7 -0
- package/src/components/timeline-pill-geometry.ts +169 -0
- package/src/components/timeline-pill-placement.ts +99 -0
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/conversation-timeline.ts +10 -2
- package/src/desktop.ts +24 -0
- package/src/editor.ts +13 -0
- package/src/hooks/use-available-models.ts +1 -1
- package/src/hooks/use-composer.ts +57 -2
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-usage.ts +100 -0
- package/src/index.ts +22 -0
- package/src/lib/format.ts +32 -6
- package/src/lib/workbench-peers.ts +62 -0
- package/src/session-ui.ts +22 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +5 -3
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/genie-loading.tsx +16 -6
- package/src/timeline/projection.ts +78 -4
- package/src/timeline/types.ts +8 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +325 -0
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-KVERXCFY.js.map +0 -1
- package/dist/chunk-L4OSXQ6H.js.map +0 -1
- package/dist/chunk-S5JQ4R22.js.map +0 -1
- package/dist/chunk-UDD6DLLT.js.map +0 -1
- package/dist/chunk-UGMKPUEM.js +0 -299
- package/dist/chunk-UGMKPUEM.js.map +0 -1
- package/dist/chunk-V2ABIVYJ.js.map +0 -1
- package/dist/chunk-X4HIN6TV.js.map +0 -1
- package/dist/chunk-XEJEOAOV.js.map +0 -1
- package/dist/chunk-YZ3YYMOM.js.map +0 -1
- package/dist/markdown-table-layout-PFUEZ2U4.js.map +0 -1
- package/dist/timeline-annotation-selection-ODLVF4OI.js.map +0 -1
- /package/dist/{browser-viewer-2E6R2Y4W.js.map → browser-viewer-Z7S7QEJL.js.map} +0 -0
- /package/dist/{computer-viewer-WMJE6OA3.js.map → chat-interactive-block-UGBTNB3L.js.map} +0 -0
- /package/dist/{chunk-Y3QTZN2F.js.map → chunk-2VFNCX4E.js.map} +0 -0
- /package/dist/{chunk-SEEVCT36.js.map → chunk-A4UJB2MM.js.map} +0 -0
- /package/dist/{chunk-5AZSK6MV.js.map → chunk-LWNLETQT.js.map} +0 -0
- /package/dist/{sandbox-files-PXPIZAFG.js.map → computer-viewer-KJWLH3GI.js.map} +0 -0
- /package/dist/{latest-question-QB4EUCW5.js.map → latest-question-IS445HOW.js.map} +0 -0
- /package/dist/{queue-surface-implementation-IM2HD3SK.js.map → queue-surface-implementation-2CAQAIHM.js.map} +0 -0
package/dist/connect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/capability-catalog-row.tsx","../src/skill-discovery.tsx","../src/discovery-cache.ts","../src/connect-setup.tsx","../src/connection-service-presentation.ts","../src/connection-catalog.tsx","../src/connection-logo.tsx","../src/connect-chooser.tsx","../src/connect-accounts.tsx","../src/connection-service-logo.tsx","../src/capability-logo-fallback.ts","../src/connect-account-identity.tsx","../src/connection-skeleton.tsx","../src/connect-panel.tsx","../src/connection-discovery.tsx","../src/device-authorization.tsx","../src/identity-link-consent.tsx","../src/identity-link-accounts.tsx","../src/connection-installed.tsx","../src/connection-type-picker.tsx","../src/plugin-discovery.tsx","../src/plugin-details.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from \"lucide-react\";\n\nexport type CapabilityCatalogStatus =\n | \"available\"\n | \"added\"\n | \"attention\"\n | \"unavailable\"\n | \"loading\";\n\nexport type CapabilityCatalogRowProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"onClick\" | \"name\"\n> & {\n name: string;\n description?: string | undefined;\n icon?: ReactNode;\n status?: CapabilityCatalogStatus;\n statusLabel?: string | undefined;\n /** Preserve opaque host status text when adopting this row without typed health. */\n showStatusLabel?: boolean;\n onOpen: () => void;\n};\n\nconst labels: Record<CapabilityCatalogStatus, string> = {\n available: \"Available to add\",\n added: \"Added\",\n attention: \"Needs attention\",\n unavailable: \"Unavailable\",\n loading: \"Working\",\n};\n\n/** A display-only state. The entire catalog row is the action, never this glyph. */\nexport function CapabilityCatalogIndicator({\n status = \"available\",\n label,\n showLabel = false,\n}: {\n status?: CapabilityCatalogStatus;\n label?: string | undefined;\n showLabel?: boolean;\n}) {\n const Icon =\n status === \"added\"\n ? CheckIcon\n : status === \"attention\" || status === \"unavailable\"\n ? AlertTriangleIcon\n : status === \"loading\"\n ? Loader2Icon\n : PlusIcon;\n return (\n <span className=\"og-capability-catalog-indicator\" data-status={status}>\n <Icon aria-hidden=\"true\" />\n <span\n className={\n showLabel || status === \"attention\" || status === \"unavailable\"\n ? \"og-capability-catalog-notice\"\n : \"og-capability-catalog-sr-only\"\n }\n >\n {label ?? labels[status]}\n </span>\n </span>\n );\n}\n\n/** Shared by connections, skills, and plugins: one row, one focus target, one action. */\nexport function CapabilityCatalogRow({\n name,\n description,\n icon,\n status = \"available\",\n statusLabel,\n showStatusLabel = false,\n onOpen,\n className = \"\",\n ...props\n}: CapabilityCatalogRowProps) {\n return (\n <button\n {...props}\n type=\"button\"\n className={`og-capability-catalog-row ${className}`}\n onClick={onOpen}\n >\n {icon ? <span className=\"og-capability-catalog-icon\">{icon}</span> : null}\n <span className=\"og-capability-catalog-copy\">\n <strong>{name}</strong>\n {description ? <span>{description}</span> : null}\n </span>\n <CapabilityCatalogIndicator status={status} label={statusLabel} showLabel={showStatusLabel} />\n </button>\n );\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { createDiscoveryCache } from \"./discovery-cache\";\nimport { BookOpenIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow, type CapabilityCatalogStatus } from \"./capability-catalog-row\";\n\nexport type SkillDiscoveryItem = {\n id: string;\n name: string;\n source: string;\n installs: number;\n url: string;\n};\nexport type SkillDiscoveryPage = { items: SkillDiscoveryItem[]; nextCursor: null };\nconst discoveryCache = createDiscoveryCache<SkillDiscoveryPage>();\n\nexport type SkillDiscoveryClient = {\n searchPublicSkills(workspaceId: string, query: string): Promise<SkillDiscoveryPage>;\n};\nexport type SkillDiscoveryProps = {\n installedSkills?: readonly { name: string; repositoryUrl: string; sourceUrl: string }[];\n client: SkillDiscoveryClient;\n workspaceId: string;\n query: string;\n onImport: (url: string) => void;\n canManage: boolean;\n localSkills?: readonly {\n id: string;\n name: string;\n description?: string;\n status?: CapabilityCatalogStatus;\n statusLabel?: string;\n onOpen: () => void;\n }[];\n resultLimit?: number;\n onShowMore?: () => void;\n onSearch?: (() => void) | undefined;\n /** Display name for a registry slug (\"agent-browser\" -> \"Agent browser\"). Defaults to the slug. */\n formatName?: (name: string) => string;\n /** The line under a remote skill (\"From vercel-labs on skills.sh\"). Defaults to the source. */\n formatSource?: (source: string) => string;\n /** The row tile. Defaults to a bare book glyph. */\n icon?: ReactNode;\n};\n\n/** Host-owned query and import flow; browse presentation is reusable independently. */\nexport function SkillDiscovery(props: SkillDiscoveryProps) {\n const query = props.query.trim();\n const discoveryQuery = query || \"agent\";\n return (\n <section className=\"og-skill-discovery\" aria-label=\"Discover skills\">\n <header>\n <h3>{props.resultLimit ? \"Skills\" : query ? \"Search skills\" : \"Browse skills\"}</h3>\n {!props.resultLimit ? (\n <a\n href=\"https://skills.sh/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"og-skill-discovery-browse\"\n >\n Browse skills.sh ↗\n </a>\n ) : null}\n </header>\n {!query ? (\n <p>Popular on skills.sh</p>\n ) : query.length < 2 ? (\n <p>Enter at least two characters to search skills.sh.</p>\n ) : null}\n <DiscoveryResults\n key={`${props.workspaceId}:${discoveryQuery}`}\n {...props}\n query={discoveryQuery}\n />\n </section>\n );\n}\n\nconst keepText = (value: string) => value;\nconst DEFAULT_ICON = <BookOpenIcon aria-hidden=\"true\" />;\nconst EMPTY_LOCAL_SKILLS: NonNullable<SkillDiscoveryProps[\"localSkills\"]> = [];\nconst EMPTY_INSTALLED_SKILLS: NonNullable<SkillDiscoveryProps[\"installedSkills\"]> = [];\n\nfunction DiscoveryResults({\n client,\n workspaceId,\n query,\n canManage,\n onImport,\n resultLimit,\n onShowMore,\n localSkills = EMPTY_LOCAL_SKILLS,\n installedSkills = EMPTY_INSTALLED_SKILLS,\n formatName = keepText,\n formatSource = keepText,\n icon = DEFAULT_ICON,\n}: SkillDiscoveryProps) {\n const cacheKey = JSON.stringify([workspaceId, query]);\n const cached = discoveryCache.peek(client, cacheKey);\n const [result, setResult] = useState<SkillDiscoveryPage | null>(cached ?? null);\n const [loading, setLoading] = useState(query.length >= 2 && !cached);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n useEffect(() => {\n let active = true;\n setError(false);\n if (query.length < 2) return;\n const existing = discoveryCache.peek(client, cacheKey);\n setLoading(!existing);\n let timer: ReturnType<typeof setTimeout>;\n const search = async (attempt: number) => {\n try {\n const data = await discoveryCache.read(client, cacheKey, () =>\n client.searchPublicSkills(workspaceId, query),\n );\n if (!active) return;\n setResult(data);\n setLoading(false);\n } catch (cause) {\n if (!active) return;\n const status =\n typeof cause === \"object\" && cause !== null && \"status\" in cause\n ? cause.status\n : undefined;\n const transient =\n cause instanceof TypeError ||\n (typeof status === \"number\" && status >= 500 && status <= 599);\n if (attempt === 0 && transient) {\n timer = setTimeout(() => void search(1), 750);\n return;\n }\n setError(true);\n setLoading(false);\n }\n };\n timer = setTimeout(() => void search(0), existing ? 0 : 300);\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, cacheKey, retry]);\n const remoteSkills =\n result?.items.filter(\n (skill) =>\n !localSkills.some((local) => local.name.toLowerCase() === skill.name.toLowerCase()),\n ) ?? [];\n return (\n <div aria-busy={loading}>\n <div className=\"og-skill-discovery-grid\">\n {localSkills.slice(0, resultLimit).map((skill) => (\n <CapabilityCatalogRow\n key={skill.id}\n name={skill.name}\n description={skill.description}\n icon={icon}\n status={skill.status ?? \"added\"}\n statusLabel={skill.statusLabel}\n onOpen={skill.onOpen}\n />\n ))}\n {remoteSkills\n .slice(\n 0,\n resultLimit === undefined ? undefined : Math.max(0, resultLimit - localSkills.length),\n )\n .map((skill) => {\n const installed = installedSkills.some(\n (entry) =>\n entry.sourceUrl.replace(/\\/$/, \"\").toLowerCase() === skill.url.toLowerCase() ||\n (entry.repositoryUrl.replace(/\\/$/, \"\").toLowerCase() ===\n `https://github.com/${skill.source}`.toLowerCase() &&\n entry.name.toLowerCase() === skill.name.toLowerCase()),\n );\n return (\n <CapabilityCatalogRow\n key={skill.id}\n disabled={!canManage}\n name={formatName(skill.name)}\n description={formatSource(skill.source)}\n icon={icon}\n status={!canManage ? \"unavailable\" : installed ? \"added\" : \"available\"}\n statusLabel={\n !canManage ? \"Admin required\" : installed ? \"Installed\" : \"Available to add\"\n }\n onOpen={() => onImport(skill.url)}\n />\n );\n })}\n </div>\n {resultLimit && remoteSkills.length + localSkills.length > resultLimit && !loading ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all skills\n </button>\n ) : null}\n {loading ? <p role=\"status\">Loading skills…</p> : null}\n {error ? (\n <div role=\"alert\" className=\"og-skill-discovery-error\">\n Could not load skills.\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </div>\n ) : null}\n {result && !remoteSkills.length && !localSkills.length && !loading && !error ? (\n <p role=\"status\">{`No matches for “${query}”.`}</p>\n ) : null}\n </div>\n );\n}\n","/** Short-lived presentation data only. Never cache installation or authorization state. */\nexport function createDiscoveryCache<T>(ttlMs = 60_000, capacity = 64) {\n const clients = new WeakMap<\n object,\n Map<string, { expires: number; value: T | undefined; pending: Promise<T> }>\n >();\n return {\n peek(client: object, key: string): T | undefined {\n const entry = clients.get(client)?.get(key);\n return entry && entry.expires > Date.now() ? entry.value : undefined;\n },\n read(client: object, key: string, fetch: () => Promise<T>): Promise<T> {\n let entries = clients.get(client);\n if (!entries) {\n entries = new Map();\n clients.set(client, entries);\n }\n const existing = entries.get(key);\n if (existing && existing.expires > Date.now()) return existing.pending;\n entries.delete(key);\n while (entries.size >= capacity) entries.delete(entries.keys().next().value!);\n const entry = {\n expires: Date.now() + ttlMs,\n value: undefined as T | undefined,\n pending: Promise.resolve().then(fetch),\n };\n entries.set(key, entry);\n entry.pending = entry.pending.then(\n (value) => {\n entry.value = value;\n entry.expires = Date.now() + ttlMs;\n return value;\n },\n (error) => {\n if (entries.get(key) === entry) entries.delete(key);\n throw error;\n },\n );\n return entry.pending;\n },\n };\n}\n","import { useState, type FormEvent } from \"react\";\nimport type { ConnectAttempt, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\n\nconst setupStatus: Record<ConnectAttempt[\"state\"], string> = {\n ready: \"Ready to connect\",\n requires_user_action: \"Authorize your account\",\n credential_input: \"Enter connection details\",\n provider_wait: \"Waiting for authorization\",\n account_selection: \"Choose an account\",\n resource_selection: \"Choose resources\",\n preview: \"Choose tools\",\n installing: \"Adding selected tools…\",\n connected_but_incomplete: \"Choose which tools to add\",\n complete: \"Connection ready\",\n cancelled: \"Setup cancelled\",\n expired: \"Setup expired\",\n failed: \"Setup could not finish\",\n uncertain: \"Setup outcome needs checking\",\n};\n\nfunction deviceVerificationUrl(action: ConnectAttempt[\"nextAction\"]): string | null {\n if (action.type !== \"wait\" || !action.verificationUrl) return null;\n try {\n const url = new URL(action.verificationUrl);\n return url.protocol === \"https:\" && !url.username && !url.password\n ? action.verificationUrl\n : null;\n } catch {\n return null;\n }\n}\n\nexport type ConnectSetupProps = {\n controller: ConnectController;\n /** Called synchronously in the click handler so a host can open a popup. */\n onAuthorize: (attempt: ConnectAttempt) => void | Promise<unknown>;\n /** Called synchronously on Continue; hosts can reserve a popup before advancing. */\n onSelectAccount?: (accountId: string) => void | Promise<unknown>;\n /** Host pagination must retain selections across pages and submit the final set. */\n onBrowseResources?: (attempt: ConnectAttempt) => void | Promise<unknown>;\n className?: string;\n /** Provider-specific label supplied by the embedding host. */\n authorizeLabel?: string | undefined;\n};\n\n/** Controller-backed setup surface, styled by opt-in connect.css. No provider secrets enter React state. Host owns\n * chooser, controller lifetime, navigation and recovery after full redirect. */\nexport function ConnectSetup(props: ConnectSetupProps) {\n // Attempt IDs/revisions are not a substitute for actor scope. A host can\n // recover the same attempt through a replacement controller; never preserve\n // a previous actor's unsent credential DOM or local errors across that swap.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedSetup key={generation} {...props} />;\n}\n\nfunction ScopedSetup({\n controller,\n onAuthorize,\n onBrowseResources,\n onSelectAccount,\n className,\n authorizeLabel = \"Authorize connection\",\n}: ConnectSetupProps) {\n const view = useConnect(controller);\n const [localError, setLocalError] = useState(false);\n const [navigating, setNavigating] = useState(false);\n const invoke = (operation: () => unknown | Promise<unknown>) => {\n setLocalError(false);\n try {\n void Promise.resolve(operation()).catch(() => setLocalError(true));\n } catch {\n setLocalError(true);\n }\n };\n const attempt = view.attempt;\n if (!attempt)\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n >\n <p role=\"status\">Choose a connection to begin.</p>\n </section>\n );\n const action = attempt.nextAction;\n const verificationUrl = deviceVerificationUrl(action);\n const terminal = [\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = event.currentTarget;\n const data = new FormData(form);\n if (view.busy || navigating) return;\n const key = crypto.randomUUID();\n if (action.type === \"credentials\") {\n const values = Object.fromEntries(\n action.fields.map((field, i) => [field.name, String(data.get(`field-${i}`) ?? \"\")]),\n );\n // Clear the DOM before awaiting remote work; controller never retains values.\n form.reset();\n invoke(() => view.advance({ type: \"credentials\", values }, key));\n } else if (action.type === \"select_account\") {\n const accountId = String(data.get(\"account\") ?? \"\");\n if (\n action.accounts.some((account) => account.id === accountId && account.status !== \"disabled\")\n )\n invoke(async () => {\n if (!onSelectAccount) return view.advance({ type: \"account\", accountId }, key);\n setNavigating(true);\n try {\n await onSelectAccount(accountId);\n } finally {\n setNavigating(false);\n }\n });\n } else if (action.type === \"select_resources\") {\n if (action.cursor) return;\n const resourceIds = data.getAll(\"resource\").map(String);\n invoke(() => view.advance({ type: \"resources\", resourceIds }, key));\n } else if (action.type === \"preview\") {\n const operationIds = data.getAll(\"operation\").map(String);\n invoke(() =>\n view.advance(\n {\n type: \"install\",\n previewId: action.previewId,\n contentHash: action.contentHash,\n operationIds,\n },\n key,\n ),\n );\n }\n };\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n aria-busy={view.busy || navigating}\n >\n <div className=\"og-connect-setup-summary\">\n <p className=\"og-connect-setup-scope\">\n {attempt.ownership === \"personal\" ? \"Personal connection\" : \"Workspace connection\"}\n </p>\n <p role=\"status\" className=\"og-connect-setup-status\">\n {setupStatus[attempt.state]}\n </p>\n <p className=\"og-connect-setup-description\">\n {attempt.ownership === \"personal\"\n ? \"Only your work can use this connection.\"\n : \"Work in this workspace can use this connection.\"}\n </p>\n </div>\n {attempt.account && <p>Account: {attempt.account.label}</p>}\n {(localError || view.error || attempt.error) && (\n <p role=\"alert\">\n {attempt.error?.code === \"source_changed\"\n ? \"The integration source changed. Review the updated tools before adding them.\"\n : \"Connection setup could not continue. Refresh its status before trying again.\"}\n </p>\n )}\n {!terminal && (\n <form key={`${attempt.id}:${attempt.revision}`} onSubmit={submit} autoComplete=\"off\">\n <fieldset disabled={view.busy || navigating}>\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) ? (\n <legend>Connection details</legend>\n ) : null}\n {attempt.state === \"connected_but_incomplete\" && action.type === \"none\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => view.advance({ type: \"retry\" }, crypto.randomUUID()))}\n >\n Choose tools\n </button>\n )}\n {action.type === \"credentials\" &&\n action.fields.map((field, i) => (\n <label key={field.name}>\n {field.label}\n {field.options ? (\n <select name={`field-${i}`} required={field.required} defaultValue=\"\">\n <option value=\"\">\n {field.required ? \"Choose an option\" : \"No account (public service)\"}\n </option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n name={`field-${i}`}\n type={field.secret ? \"password\" : \"text\"}\n required={field.required}\n autoComplete=\"off\"\n />\n )}\n </label>\n ))}\n {action.type === \"select_account\" && (\n <label>\n Account\n <select name=\"account\" required defaultValue=\"\">\n <option value=\"\" disabled>\n Choose an account\n </option>\n {action.accounts.map((account) => (\n <option\n key={account.id}\n value={account.id}\n disabled={account.status === \"disabled\"}\n >\n {account.label} — {account.id} ({account.ownership})\n </option>\n ))}\n </select>\n </label>\n )}\n {action.type === \"select_resources\" &&\n action.resources.map((resource) => (\n <label key={resource.id}>\n <input type=\"checkbox\" name=\"resource\" value={resource.id} />\n {resource.label} ({resource.kind})\n </label>\n ))}\n {action.type === \"select_resources\" && action.cursor && (\n <>\n <p>More resources are available. Review all pages before submitting a selection.</p>\n {onBrowseResources && (\n <button\n type=\"button\"\n onClick={() => invoke(() => onBrowseResources(structuredClone(attempt)))}\n >\n Browse all resources\n </button>\n )}\n </>\n )}\n {action.type === \"preview\" && (\n <>\n <p>Choose the tools agents can use with this account.</p>\n {action.operations.map((operation) => (\n <label key={operation.id}>\n <input type=\"checkbox\" name=\"operation\" value={operation.id} />\n {operation.label} ({operation.kind})\n </label>\n ))}\n </>\n )}\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) && (\n <button\n type=\"submit\"\n className=\"og-connect-setup-primary\"\n disabled={action.type === \"select_resources\" && Boolean(action.cursor)}\n >\n {action.type === \"preview\" ? \"Add selected tools\" : \"Continue\"}\n </button>\n )}\n {action.type === \"authorize\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => onAuthorize(structuredClone(attempt)))}\n >\n {navigating ? \"Waiting for authorization…\" : authorizeLabel}\n </button>\n )}\n {action.type === \"wait\" && (\n <>\n {action.userCode && (\n <p>\n Verification code: <code>{action.userCode}</code>\n </p>\n )}\n <p>Complete provider authorization, then check the connection status.</p>\n {verificationUrl && (\n <a href={verificationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Open provider verification page (new tab)\n </a>\n )}\n </>\n )}\n <div className=\"og-connect-setup-secondary\">\n <button type=\"button\" onClick={() => invoke(() => view.refresh())}>\n Check status\n </button>\n <button type=\"button\" onClick={() => invoke(() => view.cancel(crypto.randomUUID()))}>\n Cancel setup\n </button>\n </div>\n </fieldset>\n </form>\n )}\n </section>\n );\n}\n","import type { ConnectAccount, ConnectProvider } from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport gmailLogo from \"./assets/gmail.ico\";\nimport outlookLogo from \"./assets/outlook.ico\";\n\n/** Passive service identity only. Never selects an account or grants tool access. */\nconst services: Record<string, { name: string; logo: string; mcpUrl?: string }> = {\n gmail: { name: \"Gmail\", logo: gmailLogo, mcpUrl: \"https://gmailmcp.googleapis.com/mcp/v1\" },\n \"microsoft-outlook-mail\": { name: \"Outlook Mail\", logo: outlookLogo },\n \"microsoft-outlook-calendar\": { name: \"Outlook Calendar\", logo: outlookLogo },\n \"microsoft-outlook-contacts\": { name: \"Outlook Contacts\", logo: outlookLogo },\n};\n\nexport function connectionServicePresentation(provider: Pick<ConnectProvider, \"id\" | \"label\">) {\n return (\n (Object.hasOwn(services, provider.id) ? services[provider.id] : undefined) ?? {\n name: provider.label,\n logo: null,\n }\n );\n}\n\nexport function capabilityConnectProviderId(\n item: Partial<Pick<CapabilityCatalogItem, \"mcpUrl\">>,\n): string | undefined {\n return Object.entries(services).find(\n ([, service]) => service.mcpUrl && service.mcpUrl === item.mcpUrl,\n )?.[0];\n}\n\nexport function accountServiceCapability(account: ConnectAccount, items: CapabilityCatalogItem[]) {\n const exact = items.filter((item) => item.connectionRef?.connectionId === account.id);\n if (exact.length === 1) return exact[0];\n // Presentation may use the service definition even when a personal credential\n // has no workspace installation reference. The account id remains unchanged.\n return items.find((item) => capabilityConnectProviderId(item) === account.providerId);\n}\n\nexport function isServiceConnectProvider(provider: ConnectProvider): boolean {\n return (\n provider.readiness === \"available\" &&\n provider.ownership.length > 0 &&\n provider.family !== \"mcp\" &&\n !provider.setup.some((kind) => [\"installation\", \"openapi\", \"graphql\"].includes(kind))\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n CapabilityCatalogIndicator,\n CapabilityCatalogRow,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\n\n/** Status comes from the host/controller, never inferred from a display label. */\nexport type ConnectionCatalogOption = {\n id: string;\n name: string;\n description?: string | undefined;\n status: string;\n connected: boolean;\n /** Explicit health/availability. Omit to retain visible legacy status text. */\n state?: CapabilityCatalogStatus;\n onOpen: () => void;\n action?: ReactNode;\n};\nexport type ConnectionCatalogService = {\n id: string;\n name: string;\n logo?: ReactNode;\n options: ConnectionCatalogOption[];\n};\nexport type ConnectionCatalogProps = {\n services: ConnectionCatalogService[];\n query?: string;\n columns?: 1 | 2;\n resultLimit?: number;\n onShowMore?: () => void;\n /** Group capabilities by service, or show every capability independently. */\n grouped?: boolean;\n className?: string;\n emptyMessage?: string;\n};\n\nexport function ConnectionOptionRow({ option }: { option: ConnectionCatalogOption }) {\n return (\n <div className=\"og-connection-catalog-action-row og-connection-option\">\n <CapabilityCatalogRow\n name={option.name}\n description={option.description}\n status={option.state ?? (option.connected ? \"added\" : \"available\")}\n statusLabel={option.status}\n showStatusLabel={option.state === undefined}\n onOpen={option.onOpen}\n />\n {option.action ? <span className=\"og-connection-option-action\">{option.action}</span> : null}\n </div>\n );\n}\n\nexport function ConnectionServiceRow({ service }: { service: ConnectionCatalogService }) {\n if (!service.options.length) return null;\n const connected = service.options.filter((option) => option.connected).length;\n const attention = service.options.find(\n (option) => option.state === \"attention\" || option.state === \"unavailable\",\n );\n const groupState =\n attention?.state ??\n (service.options.some((option) => option.state === \"loading\")\n ? \"loading\"\n : connected === service.options.length\n ? \"added\"\n : \"available\");\n const identity = (\n <>\n <span className=\"og-capability-catalog-icon\">{service.logo}</span>\n <span className=\"og-capability-catalog-copy\">\n <strong>{service.name}</strong>\n <span>\n {service.options.length === 1\n ? service.options[0]?.description\n : service.options.map((option) => option.name).join(\" · \")}\n </span>\n </span>\n <CapabilityCatalogIndicator\n status={groupState}\n label={attention?.status ?? `${connected} of ${service.options.length} added`}\n />\n </>\n );\n return service.options.length === 1 ? (\n <div className=\"og-connection-catalog-action-row\">\n <CapabilityCatalogRow\n name={service.name}\n description={service.options[0]!.description}\n icon={service.logo}\n status={service.options[0]!.state ?? (connected ? \"added\" : \"available\")}\n statusLabel={service.options[0]!.status}\n showStatusLabel={service.options[0]!.state === undefined}\n onOpen={service.options[0]!.onOpen}\n />\n {service.options[0]?.action}\n </div>\n ) : (\n <details className=\"og-connection-catalog-service\">\n <summary className=\"og-capability-catalog-row\">\n {identity}\n <span aria-hidden className=\"og-connection-group-chevron\">\n ⌄\n </span>\n </summary>\n <div className=\"og-connection-catalog-options\">\n {service.options.map((option) => (\n <ConnectionOptionRow key={option.id} option={option} />\n ))}\n </div>\n </details>\n );\n}\n\nexport function ConnectionCatalog({\n services,\n query = \"\",\n columns = 1,\n grouped = true,\n resultLimit,\n onShowMore,\n className = \"\",\n emptyMessage = \"No connections match your search.\",\n}: ConnectionCatalogProps) {\n const search = query.trim().toLowerCase();\n const entries = grouped\n ? services\n : services.flatMap((service) =>\n service.options.map((option) => ({\n ...service,\n id: `${service.id}/${option.id}`,\n name:\n service.options.length > 1 && option.name !== service.name\n ? `${service.name} · ${option.name}`\n : service.name,\n options: [option],\n })),\n );\n const visible = entries.filter((service) =>\n [service.name, ...service.options.flatMap((option) => [option.name, option.description ?? \"\"])]\n .join(\" \")\n .toLowerCase()\n .includes(search),\n );\n return (\n <>\n <div className={`og-connection-catalog ${className}`} data-columns={columns}>\n {visible.length ? (\n visible\n .slice(0, resultLimit)\n .map((service) => <ConnectionServiceRow key={service.id} service={service} />)\n ) : (\n <p role=\"status\">{emptyMessage}</p>\n )}\n </div>\n {resultLimit && visible.length > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all connections\n </button>\n ) : null}\n </>\n );\n}\n","import { useState, type ReactNode } from \"react\";\n/** Brand identifier; failed/missing assets use the supplied fallback or stable initials. */\nexport function ConnectionLogo({\n src,\n name,\n size = 40,\n fallback,\n loading = false,\n}: {\n src: string | null;\n name: string;\n size?: number;\n fallback?: ReactNode;\n loading?: boolean;\n}) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n return (\n <span className=\"og-connection-logo\" aria-hidden=\"true\" style={{ width: size, height: size }}>\n {src && src !== failedSrc ? (\n <img src={src} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => setFailedSrc(src)} />\n ) : loading ? (\n <span className=\"og-connection-skeleton-mark\" />\n ) : (\n (fallback ?? (\n <span>\n {name\n .split(/\\s+/)\n .map((part) => part[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase()}\n </span>\n ))\n )}\n </span>\n );\n}\n","import { connectionServicePresentation } from \"./connection-service-presentation\";\nimport { ConnectionCatalog } from \"./connection-catalog\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { ConnectAccount, ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\n\nexport type ConnectChooserProps = {\n controller: ConnectController;\n /** Exact host return string; no completion parameters are added. */\n returnUrl: string;\n className?: string;\n presentation?: \"select\" | \"catalog\";\n /** Compact mechanism picker when service discovery is already shown by the host. */\n customOnly?: boolean;\n providerOnly?: boolean;\n compact?: boolean;\n /** Select a service from the unified discovery list. */\n initialProviderId?: string;\n};\n\n/** Catalog readiness is supplied by the authenticated backend, never inferred\n * from the existence of a provider definition. Host replaces the controller on\n * actor/workspace change. This form does not open OAuth windows itself. */\nexport function ConnectChooser(props: ConnectChooserProps) {\n // Remount scope-local selections synchronously when the controller changes,\n // before effects can expose a previous actor's inventory for one frame.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedChooser key={generation} {...props} />;\n}\n\nfunction ScopedChooser({\n controller,\n returnUrl,\n className,\n presentation = \"select\",\n customOnly = false,\n providerOnly = false,\n compact = false,\n initialProviderId = \"\",\n}: ConnectChooserProps) {\n const view = useConnect(controller);\n const [catalog, setCatalog] = useState<ConnectProvider[] | null>(null);\n const [accounts, setAccounts] = useState<ConnectAccount[]>([]);\n const [failed, setFailed] = useState(false);\n const [load, setLoad] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [providerId, setProviderId] = useState(initialProviderId);\n const [ownership, setOwnership] = useState(\"\");\n useEffect(() => {\n const abort = new AbortController();\n setCatalog(null);\n setAccounts([]);\n setFailed(false);\n setProviderId(initialProviderId);\n setOwnership(\"\");\n // Promise boundary also handles a synchronously throwing injected transport.\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return Promise.all([\n controller.transport.catalog(controller.workspaceId, { signal: abort.signal }),\n presentation === \"catalog\"\n ? controller.transport.accounts(controller.workspaceId, { signal: abort.signal })\n : Promise.resolve([] as ConnectAccount[]),\n ]);\n })\n .then(([providers, inventory]) => {\n if (!abort.signal.aborted) {\n setCatalog(\n structuredClone(\n providers.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n entry.ownership.length > 0 &&\n (!providerOnly ||\n (entry.family !== \"mcp\" &&\n !entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n ))) &&\n (!customOnly ||\n entry.family === \"mcp\" ||\n entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n )),\n ),\n ),\n );\n setAccounts(structuredClone(inventory));\n const initial = providers.find((entry) => entry.id === initialProviderId);\n if (initial)\n setOwnership(\n initial.ownership.includes(\"personal\") &&\n [\"google\", \"microsoft\"].includes(initial.family)\n ? \"personal\"\n : initial.ownership.includes(\"workspace\")\n ? \"workspace\"\n : (initial.ownership[0] ?? \"\"),\n );\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => abort.abort();\n }, [controller, load, presentation, customOnly, providerOnly, initialProviderId]);\n const provider = catalog?.find((entry) => entry.id === providerId);\n const canBegin =\n provider?.readiness === \"available\" &&\n (ownership === \"personal\" || ownership === \"workspace\") &&\n provider.ownership.includes(ownership);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (!canBegin || view.busy || (ownership !== \"personal\" && ownership !== \"workspace\")) return;\n setFailed(false);\n try {\n void controller\n .begin({ providerId, ownership, returnUrl, idempotencyKey: crypto.randomUUID() })\n .catch(() => setFailed(true));\n } catch {\n setFailed(true);\n }\n };\n // Optional adapters must not add a temporary section that disappears once\n // readiness arrives. The primary discovery surface already owns loading.\n if (compact && (!catalog || catalog.length === 0) && !failed) return null;\n return (\n <section\n className={className}\n aria-label=\"Choose a connection\"\n aria-busy={view.busy || (!catalog && !failed)}\n >\n {failed && (\n <p role=\"alert\">\n Connections could not be loaded or started. Check setup status before retrying.\n </p>\n )}\n {!catalog && !failed && <p role=\"status\">Loading connections…</p>}\n {catalog?.length === 0 && <p role=\"status\">No connections are available.</p>}\n {Boolean(catalog?.length) && (\n <form onSubmit={submit}>\n <fieldset disabled={view.busy}>\n <legend hidden={customOnly || compact}>\n {presentation === \"catalog\" ? \"Add a connection\" : \"Provider and ownership\"}\n </legend>\n {presentation === \"catalog\" && !provider ? (\n <>\n <label hidden={customOnly || compact}>\n Search connections\n <input\n type=\"search\"\n placeholder=\"Find a service…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n {[\n {\n name: \"Services\",\n entries: catalog!.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n entry.family !== \"mcp\" &&\n !entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n ),\n ),\n secondary: false,\n },\n {\n name: \"Custom connections\",\n entries: catalog!.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n (entry.family === \"mcp\" ||\n entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n )),\n ),\n secondary: true,\n },\n ].map((group) => {\n const entries = group.entries.filter((entry) =>\n entry.label.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim()),\n );\n if (!entries.length) return null;\n const rows = (\n <ConnectionCatalog\n services={entries.map((entry) => {\n const connected = accounts.some(\n (account) =>\n account.providerId === entry.id && account.status === \"connected\",\n );\n return {\n id: entry.id,\n name: entry.label,\n logo: (\n <ConnectionLogo\n src={connectionServicePresentation(entry).logo}\n name={entry.label}\n />\n ),\n options: [\n {\n id: entry.id,\n name: entry.label,\n status: connected\n ? \"Connected\"\n : entry.readiness === \"available\"\n ? \"Connect\"\n : \"Unavailable\",\n state: connected\n ? \"added\"\n : entry.readiness === \"available\"\n ? \"available\"\n : \"unavailable\",\n connected,\n onOpen: () => {\n if (!view.busy) {\n setProviderId(entry.id);\n setOwnership(\n entry.ownership.length === 1 ? entry.ownership[0]! : \"\",\n );\n }\n },\n },\n ],\n };\n })}\n />\n );\n return group.secondary && !customOnly ? (\n <details\n className=\"og-connect-secondary\"\n key={group.name}\n open={query.trim() ? true : undefined}\n >\n <summary>\n {group.name}\n <span>{entries.length}</span>\n </summary>\n {rows}\n </details>\n ) : (\n <div key={group.name}>{rows}</div>\n );\n })}\n {!catalog!.some((entry) =>\n entry.label.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim()),\n ) && <p role=\"status\">No services match your search.</p>}\n </>\n ) : null}\n {presentation === \"catalog\" && provider && !initialProviderId ? (\n <button\n type=\"button\"\n onClick={() => {\n setProviderId(\"\");\n setOwnership(\"\");\n }}\n >\n Back to connections\n </button>\n ) : null}\n <label hidden={presentation === \"catalog\"}>\n Provider\n <select\n required\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n setOwnership(\"\");\n }}\n >\n <option value=\"\" disabled>\n Choose a provider\n </option>\n {catalog!.map((entry) => (\n <option\n key={entry.id}\n value={entry.id}\n disabled={entry.readiness !== \"available\" || entry.ownership.length === 0}\n >\n {entry.label} — {entry.id} ({entry.readiness.replaceAll(\"_\", \" \")})\n </option>\n ))}\n </select>\n </label>\n {provider && (\n <>\n <strong>{presentation === \"catalog\" ? provider.label : null}</strong>\n {provider.readiness !== \"available\" && (\n <p role=\"status\">\n {provider.reason ??\n \"This service is not available in this environment. Contact your administrator to enable it.\"}\n </p>\n )}\n <label>\n Who can use this connection?\n <select\n required\n value={ownership}\n onChange={(event) => setOwnership(event.target.value)}\n >\n <option value=\"\" disabled>\n Choose ownership\n </option>\n {provider.ownership.map((choice) => (\n <option key={choice} value={choice}>\n {choice === \"personal\" ? \"Only me\" : \"Everyone in this workspace\"}\n </option>\n ))}\n </select>\n </label>\n </>\n )}\n <button\n hidden={presentation === \"catalog\" && !provider}\n type=\"submit\"\n disabled={!canBegin}\n >\n Continue\n </button>\n </fieldset>\n </form>\n )}\n <button hidden={!failed} type=\"button\" disabled={view.busy} onClick={() => setLoad(load + 1)}>\n Reload providers\n </button>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ConnectAccount, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\nimport { ConnectAccountIdentity } from \"./connect-account-identity\";\nimport { ConnectionSkeleton } from \"./connection-skeleton\";\nimport type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\n\nexport type ConnectAccountsProps = {\n controller: ConnectController;\n className?: string;\n /** Enables explicit account-bound reconnect. Host supplies the exact destination. */\n returnUrl?: string;\n /** Uses authenticated catalogue assets and exact connection references for service identity. */\n client?: OpenGeniClient | undefined;\n /** Reconcile surrounding service state after a confirmed account disconnect. */\n onDisconnected?: (() => void) | undefined;\n};\n\n/** Local credential revocation only. Unknown or changed versions must be\n * refreshed; this component never retries a destructive operation implicitly. */\nexport function ConnectAccounts(props: ConnectAccountsProps) {\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedAccounts key={generation} {...props} />;\n}\n\nfunction ScopedAccounts({\n controller,\n className,\n returnUrl,\n client,\n onDisconnected,\n}: ConnectAccountsProps) {\n const view = useConnect(controller);\n const [accounts, setAccounts] = useState<ConnectAccount[] | null>(null);\n const [selected, setSelected] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [reload, setReload] = useState(0);\n const [catalog, setCatalog] = useState<{\n client: OpenGeniClient;\n items: CapabilityCatalogItem[];\n } | null>(null);\n const mutation = useRef<AbortController | null>(null);\n useEffect(() => () => mutation.current?.abort(), []);\n useEffect(() => {\n const abort = new AbortController();\n setAccounts(null);\n setCatalog(null);\n setSelected(null);\n setError(false);\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return Promise.all([\n controller.transport.accounts(controller.workspaceId, { signal: abort.signal }),\n client?.listCapabilities(controller.workspaceId).catch(() => null) ?? null,\n ]);\n })\n .then(([result, metadata]) => {\n if (!abort.signal.aborted) {\n setAccounts(structuredClone(result.filter((account) => account.status !== \"disabled\")));\n if (client && metadata) setCatalog({ client, items: metadata.items });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setError(true);\n });\n return () => abort.abort();\n }, [client, controller, reload]);\n\n const disconnect = async (account: ConnectAccount) => {\n const expectedVersion = account.version;\n if (\n mutation.current ||\n view.busy ||\n expectedVersion === undefined ||\n !Number.isSafeInteger(expectedVersion) ||\n expectedVersion < 1\n )\n return;\n const abort = new AbortController();\n mutation.current = abort;\n setBusy(true);\n setError(false);\n try {\n await controller.transport.disconnect(controller.workspaceId, account.id, {\n expectedVersion,\n signal: abort.signal,\n });\n if (!abort.signal.aborted) {\n setReload((value) => value + 1);\n onDisconnected?.();\n }\n } catch {\n if (!abort.signal.aborted) {\n // Outcome may be unknown. Drop the inventory so a second click cannot\n // replay against the stale selection; let the host reload live state.\n setAccounts(null);\n setError(true);\n }\n } finally {\n if (!abort.signal.aborted) {\n mutation.current = null;\n setBusy(false);\n setSelected(null);\n }\n }\n };\n const reconnect = async (account: ConnectAccount) => {\n if (!returnUrl || mutation.current || view.busy) return;\n setError(false);\n try {\n await controller.begin({\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n returnUrl,\n idempotencyKey: crypto.randomUUID(),\n });\n } catch {\n setError(true);\n }\n };\n\n return (\n <section\n className={className}\n aria-label=\"Connected accounts\"\n aria-busy={busy || view.busy || (!accounts && !error)}\n >\n <h3>Your connections</h3>\n {error && (\n <p role=\"alert\">Account state could not be confirmed. Reload before trying again.</p>\n )}\n {!accounts && !error && <ConnectionSkeleton label=\"Loading accounts\" />}\n {accounts?.length === 0 && <p role=\"status\">No connected accounts.</p>}\n {accounts && accounts.length > 0 && (\n <ul>\n {accounts.map((account) => (\n <li className=\"og-connect-account\" key={`${account.providerId}:${account.id}`}>\n <details className=\"og-connect-account-details\">\n <summary className=\"og-connect-account-heading\">\n <ConnectAccountIdentity\n account={account}\n client={client}\n capabilities={catalog?.client === client ? (catalog?.items ?? []) : []}\n />\n <span className=\"og-connect-account-status\" data-status={account.status}>\n {account.status === \"connected\"\n ? \"✓ Connected\"\n : account.status === \"auth_needed\"\n ? \"Reconnect needed\"\n : \"Disconnected\"}\n </span>\n <svg\n className=\"og-connect-account-chevron\"\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n </summary>\n <div className=\"og-connect-account-actions\">\n {returnUrl && account.status === \"auth_needed\" && (\n <button\n type=\"button\"\n aria-label={`Reconnect ${account.label}`}\n disabled={busy || view.busy}\n onClick={() => void reconnect(account)}\n >\n Reconnect\n </button>\n )}\n {selected === `${account.providerId}:${account.id}` ? (\n <div role=\"group\" aria-label={`Disconnect ${account.label}`}>\n <p>\n This removes local Opengeni access. It does not revoke consent at the\n provider.\n </p>\n <button\n type=\"button\"\n disabled={busy || view.busy}\n onClick={() => void disconnect(account)}\n >\n Confirm disconnect\n </button>\n <button type=\"button\" disabled={busy} onClick={() => setSelected(null)}>\n Keep account\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n aria-label={`Disconnect ${account.label}`}\n disabled={\n busy ||\n view.busy ||\n account.status === \"disabled\" ||\n !Number.isSafeInteger(account.version) ||\n account.version! < 1\n }\n onClick={() => setSelected(`${account.providerId}:${account.id}`)}\n >\n Disconnect\n </button>\n )}\n </div>\n </details>\n </li>\n ))}\n </ul>\n )}\n <button\n hidden={!error}\n type=\"button\"\n disabled={busy}\n onClick={() => setReload((value) => value + 1)}\n >\n Reload accounts\n </button>\n </section>\n );\n}\n","import type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\nimport { useEffect, useState } from \"react\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { capabilityLogoFallback } from \"./capability-logo-fallback\";\n\n/** The same passive logo loading path for discovery and connected accounts. */\nexport function ConnectionServiceLogo({\n client,\n item,\n name,\n fallback = null,\n}: {\n client?: OpenGeniClient | undefined;\n item?: CapabilityCatalogItem | undefined;\n name: string;\n fallback?: string | null;\n}) {\n const path = item?.logoAssetPath;\n const [image, setImage] = useState<{\n client: OpenGeniClient;\n path: string;\n url: string | null;\n } | null>(null);\n useEffect(() => {\n if (!client || !path?.startsWith(\"catalog-assets/\")) return;\n const abort = new AbortController();\n let url: string | null = null;\n void client\n .downloadCatalogAsset(path, { signal: abort.signal })\n .then((blob) => {\n if (!abort.signal.aborted && blob.type.startsWith(\"image/\") && blob.size <= 2_000_000)\n url = URL.createObjectURL(blob);\n })\n .catch(() => {})\n .finally(() => {\n if (!abort.signal.aborted) setImage({ client, path, url });\n });\n return () => {\n abort.abort();\n if (url) URL.revokeObjectURL(url);\n };\n }, [client, path]);\n const current = image && image.client === client && image.path === path ? image : null;\n const loading = Boolean(client && path?.startsWith(\"catalog-assets/\") && !current);\n return (\n <ConnectionLogo\n name={name}\n loading={loading}\n src={\n current?.url ??\n (loading ? null : ((item ? capabilityLogoFallback(item) : null) ?? fallback))\n }\n />\n );\n}\n","import type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport gmailLogo from \"./assets/gmail.ico\";\n\n/** Passive catalogue identity, shared by embedded and console surfaces. */\nexport function capabilityLogoFallback(\n item: Pick<CapabilityCatalogItem, \"id\"> &\n Partial<Pick<CapabilityCatalogItem, \"metadata\" | \"mcpUrl\">>,\n): string | null {\n if (\n item.id.startsWith(\"mcp:integrations-sh:gmailmcp-googleapis-com-\") ||\n item.mcpUrl === \"https://gmailmcp.googleapis.com/mcp/v1\"\n )\n return gmailLogo;\n const original = item.metadata?.originalLogoUrl;\n if (typeof original !== \"string\") return null;\n try {\n const url = new URL(original);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : null;\n } catch {\n return null;\n }\n}\n","import type { ConnectAccount } from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\nimport { ConnectionServiceLogo } from \"./connection-service-logo\";\nimport {\n accountServiceCapability,\n connectionServicePresentation,\n} from \"./connection-service-presentation\";\n\n/** Service presentation never changes which exact credential is acted on. */\nexport function ConnectAccountIdentity({\n account,\n client,\n capabilities,\n}: {\n account: ConnectAccount;\n client?: OpenGeniClient | undefined;\n capabilities: CapabilityCatalogItem[];\n}) {\n const item = accountServiceCapability(account, capabilities);\n const service = connectionServicePresentation({ id: account.providerId, label: account.label });\n const name = item?.name ?? service.name;\n return (\n <>\n <ConnectionServiceLogo client={client} item={item} name={name} fallback={service.logo} />\n <div>\n <strong>{name}</strong>\n <small>\n {account.ownership === \"personal\" ? \"Only you\" : \"Workspace connection\"}\n {name !== account.label ? ` · ${account.label}` : \"\"}\n </small>\n </div>\n </>\n );\n}\n","/** Reserve the same row geometry as the loaded connection list. */\nexport function ConnectionSkeleton({ rows = 1, label }: { rows?: number; label: string }) {\n return (\n <div role=\"status\" aria-label={label} className=\"og-connection-skeleton\">\n {Array.from({ length: rows }, (_, index) => (\n <div className=\"og-connection-skeleton-row\" aria-hidden=\"true\" key={index}>\n <span className=\"og-connection-skeleton-mark\" />\n <span className=\"og-connection-skeleton-copy\">\n <span />\n <span />\n </span>\n </div>\n ))}\n </div>\n );\n}\n","import { ConnectAccounts } from \"./connect-accounts\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nimport { useConnect } from \"./hooks/use-connect\";\nimport type { OpenGeniClient } from \"@opengeni/sdk\";\nimport { useState } from \"react\";\nimport { connectionServicePresentation } from \"./connection-service-presentation\";\nimport { ConnectionDiscovery } from \"./connection-discovery\";\n\nexport type ConnectPanelProps = ConnectSetupProps & {\n returnUrl: string;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null;\n showAccounts?: boolean;\n /** Presentation only; the host backend owns acquisition admission. */\n showCustomConnections?: boolean;\n /** Include ready, non-custom adapters from the host's Connect catalogue. */\n showProviderConnections?: boolean;\n presentation?: \"select\" | \"catalog\";\n client?: OpenGeniClient | undefined;\n};\n\n/** Optional composition over the same unstyled surfaces. Import\n * @opengeni/react/connect.css for styling; the host retains navigation,\n * transport, actor admission, and controller lifetime. */\nexport function ConnectPanel({\n returnUrl,\n title = \"Connections\",\n showAccounts = true,\n showCustomConnections = true,\n showProviderConnections = false,\n presentation = \"select\",\n className,\n client,\n ...setup\n}: ConnectPanelProps) {\n const { attempt } = useConnect(setup.controller);\n const [inventoryRevision, setInventoryRevision] = useState(0);\n // Unknown/failed outcomes still need reconciliation or cancellation, not a\n // competing new acquisition. Unmounting observers never cancels controller work.\n const activeSetup =\n attempt !== null && ![\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const serviceName = attempt\n ? connectionServicePresentation({ id: attempt.providerId, label: \"\" }).name\n : \"\";\n return (\n <div className={[\"og-connect\", className].filter(Boolean).join(\" \")}>\n {title !== null && <h2>{title}</h2>}\n {showAccounts && !activeSetup && (\n <ConnectAccounts\n key={inventoryRevision}\n controller={setup.controller}\n returnUrl={returnUrl}\n client={client}\n onDisconnected={() => setInventoryRevision((value) => value + 1)}\n />\n )}\n {!activeSetup &&\n (client && presentation === \"catalog\" ? (\n <>\n <ConnectionDiscovery\n key={inventoryRevision}\n controller={showProviderConnections ? setup.controller : undefined}\n client={client}\n workspaceId={setup.controller.workspaceId}\n returnUrl={returnUrl}\n onConfigured={() => setInventoryRevision((value) => value + 1)}\n />\n {showCustomConnections && (\n <details className=\"og-connect-secondary\">\n <summary>Custom connection</summary>\n <ConnectChooser\n customOnly\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n </details>\n )}\n </>\n ) : (\n <ConnectChooser\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n ))}\n {activeSetup && (\n <ConnectSetup\n {...setup}\n authorizeLabel={\n setup.authorizeLabel ??\n (serviceName ? `Continue to ${serviceName}` : \"Authorize connection\")\n }\n />\n )}\n </div>\n );\n}\n","import type { ConnectAccount, ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport {\n capabilityConnectProviderId,\n connectionServicePresentation,\n isServiceConnectProvider,\n} from \"./connection-service-presentation\";\nimport type { CapabilityCatalogItem, ConnectionMetadata, OpenGeniClient } from \"@opengeni/sdk\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { ConnectionSkeleton } from \"./connection-skeleton\";\nimport { ConnectionServiceLogo } from \"./connection-service-logo\";\nimport { McpConnectionCard } from \"./components/session-mcp-capability-card\";\nimport { mcpConnectionDiscoveryState } from \"./mcp-connection-status\";\n\nexport type ConnectionDiscoveryProps = {\n client: OpenGeniClient;\n controller?: ConnectController | undefined;\n workspaceId: string;\n returnUrl: string;\n onConfigured?: (() => void | Promise<void>) | undefined;\n};\n\n/** Service discovery over the native catalogue. No host-owned OAuth state or\n * assumed account selection: details resolve current authority before acting. */\nexport function ConnectionDiscovery(props: ConnectionDiscoveryProps) {\n const [scope, setScope] = useState({ client: props.client, controller: props.controller });\n const [generation, setGeneration] = useState(0);\n if (scope.client !== props.client || scope.controller !== props.controller) {\n setScope({ client: props.client, controller: props.controller });\n setGeneration(generation + 1);\n }\n return <ScopedDiscovery key={`${generation}:${props.workspaceId}`} {...props} />;\n}\n\nfunction ScopedDiscovery({\n client,\n controller,\n workspaceId,\n returnUrl,\n onConfigured,\n}: ConnectionDiscoveryProps) {\n const [providers, setProviders] = useState<ConnectProvider[] | null>(null);\n const [accounts, setAccounts] = useState<ConnectAccount[]>([]);\n const [selectedProvider, setSelectedProvider] = useState<ConnectProvider | null>(null);\n const [providerFailed, setProviderFailed] = useState(false);\n const [items, setItems] = useState<CapabilityCatalogItem[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [connections, setConnections] = useState<ConnectionMetadata[]>([]);\n const [reload, setReload] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [limit, setLimit] = useState(12);\n const [selected, setSelected] = useState<CapabilityCatalogItem | null>(null);\n const opener = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const abort = new AbortController();\n // Capture each read independently: even a synchronously throwing transport\n // is captured by Promise.all, and cannot strand another read's rejection.\n const read = async <T,>(operation: () => Promise<T>): Promise<T> => {\n abort.signal.throwIfAborted();\n return operation();\n };\n setFailed(false);\n setSelectedProvider(null);\n setProviders(null);\n setItems(null);\n setProviderFailed(false);\n if (controller)\n void Promise.all([\n read(() => controller.transport.catalog(workspaceId, { signal: abort.signal })),\n read(() => controller.transport.accounts(workspaceId, { signal: abort.signal })),\n ])\n .then(([catalog, inventory]) => {\n if (!abort.signal.aborted) {\n setProviders(catalog.filter(isServiceConnectProvider));\n setAccounts(inventory);\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setProviderFailed(true);\n });\n void Promise.all([\n read(() => client.listCapabilities(workspaceId)),\n read(() => client.listConnections(workspaceId)),\n ])\n .then(([catalog, inventory]) => {\n if (!abort.signal.aborted) {\n setConnections(inventory);\n setItems(\n catalog.items.filter(\n (item) =>\n item.kind === \"mcp\" &&\n item.authKind === \"oauth2\" &&\n Boolean(item.mcpUrl ?? item.endpointUrl),\n ),\n );\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => {\n abort.abort();\n };\n }, [client, controller, workspaceId, reload]);\n const matches =\n items?.filter((item) =>\n `${item.name} ${item.description ?? \"\"} ${item.providerDomain ?? \"\"}`\n .toLocaleLowerCase()\n .includes(query.trim().toLocaleLowerCase()),\n ) ?? [];\n const providerMatches = (providers ?? []).filter(\n (provider) =>\n !items?.some((item) => capabilityConnectProviderId(item) === provider.id) &&\n provider.label.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()),\n );\n const loading = (!items && !failed) || Boolean(controller && !providers && !providerFailed);\n if (selectedProvider && controller)\n return (\n <section aria-label={`Connect ${selectedProvider.label}`}>\n <button type=\"button\" onClick={() => setSelectedProvider(null)}>\n Back to connections\n </button>\n <ConnectionLogo\n name={selectedProvider.label}\n src={connectionServicePresentation(selectedProvider).logo}\n />\n <ConnectChooser\n controller={controller}\n returnUrl={returnUrl}\n presentation=\"catalog\"\n providerOnly\n initialProviderId={selectedProvider.id}\n />\n </section>\n );\n return (\n <section className=\"og-connection-discovery\" aria-label=\"Find a connection\">\n <h3>Add a connection</h3>\n <label>\n <span className=\"og-capability-catalog-sr-only\">Search services</span>\n <input\n type=\"search\"\n placeholder=\"Search services…\"\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n setLimit(12);\n }}\n />\n </label>\n {(providerFailed || failed) && (\n <p role=\"alert\">\n Some services could not be loaded.{\" \"}\n <button type=\"button\" onClick={() => setReload((value) => value + 1)}>\n Retry\n </button>\n </p>\n )}\n <div className=\"og-connection-discovery-results\">\n {providerMatches.map((provider) => {\n const connected = accounts.some(\n (account) => account.providerId === provider.id && account.status === \"connected\",\n );\n return (\n <CapabilityCatalogRow\n key={provider.id}\n name={provider.label}\n icon={\n <ConnectionLogo\n name={provider.label}\n src={connectionServicePresentation(provider).logo}\n />\n }\n status={connected ? \"added\" : \"available\"}\n statusLabel={connected ? \"Connected\" : \"Connect\"}\n showStatusLabel\n onOpen={() => setSelectedProvider(provider)}\n />\n );\n })}\n {matches.slice(0, limit).map((item) => {\n const state = mcpConnectionDiscoveryState(item, connections);\n return (\n <CapabilityCatalogRow\n key={item.id}\n name={item.name}\n description={item.description ?? undefined}\n icon={<ConnectionServiceLogo client={client} item={item} name={item.name} />}\n status={state.status}\n statusLabel={state.label}\n showStatusLabel\n onOpen={() => {\n opener.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n setSelected(item);\n }}\n />\n );\n })}\n\n {loading && <ConnectionSkeleton rows={3} label=\"Loading services\" />}\n {!loading && !failed && !providerFailed && !matches.length && !providerMatches.length && (\n <p role=\"status\">No services match your search.</p>\n )}\n {matches.length > limit && (\n <button type=\"button\" onClick={() => setLimit((value) => value + 12)}>\n Show more services\n </button>\n )}\n </div>\n {selected ? (\n <McpConnectionCard\n client={client}\n workspaceId={workspaceId}\n capabilityId={selected.id}\n name={selected.name}\n returnUrl={returnUrl}\n dialogOnly\n onClose={() => {\n setSelected(null);\n queueMicrotask(() => {\n if (opener.current?.isConnected) opener.current.focus();\n });\n }}\n onConfigured={async () => {\n setReload((value) => value + 1);\n await onConfigured?.();\n }}\n />\n ) : null}\n </section>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { copyTextToClipboard } from \"./clipboard\";\n\nexport type DeviceAuthorizationProps = {\n userCode: string;\n verificationUri: string;\n providerLabel?: string;\n description?: string;\n className?: string;\n codeAttributes?: Record<`data-${string}`, string>;\n loadClipboard?: () => Promise<{ copyTextToClipboard(text: string): Promise<boolean> }>;\n onCopyResult?: (copied: boolean) => void;\n /** Optional host presentation; clipboard state and URL validation remain shared. */\n render?: (state: {\n copied: boolean;\n copyError: boolean;\n copy: () => Promise<void>;\n verificationHref: string | undefined;\n }) => ReactNode;\n};\n\n/** Optional presentation for the existing model-account device APIs. It neither\n * owns provider state nor assumes that opening a verification page completed it. */\nexport function DeviceAuthorization(props: DeviceAuthorizationProps) {\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState(false);\n const generation = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n generation.current++;\n setCopied(false);\n setCopyError(false);\n return () => {\n // This is a live async-operation counter, not a captured DOM ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n if (timer.current) clearTimeout(timer.current);\n };\n }, [props.userCode]);\n async function copy() {\n const revision = ++generation.current;\n if (timer.current) clearTimeout(timer.current);\n setCopied(false);\n setCopyError(false);\n try {\n const clipboard = props.loadClipboard ? await props.loadClipboard() : { copyTextToClipboard };\n if (revision !== generation.current) return;\n const success = await clipboard.copyTextToClipboard(props.userCode);\n if (revision !== generation.current) return;\n setCopied(success);\n setCopyError(!success);\n props.onCopyResult?.(success);\n if (success)\n timer.current = setTimeout(() => {\n if (revision === generation.current) setCopied(false);\n }, 1600);\n } catch {\n if (revision !== generation.current) return;\n setCopyError(true);\n props.onCopyResult?.(false);\n }\n }\n let href: string | undefined;\n try {\n const url = new URL(props.verificationUri);\n if ([\"https:\", \"http:\"].includes(url.protocol) && !url.username && !url.password)\n href = props.verificationUri;\n } catch {\n /* A malformed provider URL must never become an executable link. */\n }\n if (props.render) return props.render({ copied, copyError, copy, verificationHref: href });\n return (\n <section className={`og-connect ${props.className ?? \"\"}`} aria-label=\"Device authorization\">\n <p>{props.description ?? `Enter this code at ${props.providerLabel ?? \"the provider\"}.`}</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <code {...props.codeAttributes} style={{ overflowWrap: \"anywhere\" }}>\n {props.userCode}\n </code>\n <button\n type=\"button\"\n aria-label={copied ? \"Code copied\" : \"Copy code\"}\n onClick={() => void copy()}\n >\n {copied ? \"Copied\" : \"Copy code\"}\n </button>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n Open {props.providerLabel ?? \"auth page\"}\n </a>\n ) : (\n <span role=\"alert\">Authorization address unavailable.</span>\n )}\n </div>\n {copyError ? <p role=\"alert\">Couldn't copy the code. Copy it manually instead.</p> : null}\n <p role=\"status\">Waiting for authorization…</p>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n ExternalIdentityLink,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLinkPreview,\n} from \"@opengeni/sdk\";\n\nexport type IdentityLinkClient = {\n previewIdentityLink(\n workspaceId: string,\n linkId: string,\n challenge: string,\n ): Promise<ExternalIdentityLinkPreview>;\n confirmIdentityLink(\n workspaceId: string,\n linkId: string,\n input: ConfirmExternalIdentityLinkRequest,\n ): Promise<ExternalIdentityLink>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\nexport type IdentityLinkConsentProps = {\n client: IdentityLinkClient;\n workspaceId: string;\n linkId: string;\n challenge: string;\n /** Host label is explanatory, never proof of the requesting application. */\n className?: string;\n onComplete?: (link: ExternalIdentityLink) => void;\n};\n\n/** Optional native-login consent. Ordinary Connect does not use this surface.\n * Permission choices only narrow the server's request; no automatic approval. */\nexport function IdentityLinkConsent({\n client,\n workspaceId,\n linkId,\n challenge,\n className,\n onComplete,\n}: IdentityLinkConsentProps) {\n const [link, setLink] = useState<ExternalIdentityLink | null>(null);\n const [preview, setPreview] = useState<ExternalIdentityLinkPreview | null>(null);\n const [selected, setSelected] = useState<ExternalIdentityLink[\"permissions\"]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const generation = useRef(0);\n useEffect(() => {\n const current = ++generation.current;\n setLink(null);\n setPreview(null);\n setSelected([]);\n setBusy(true);\n setError(false);\n void client\n .previewIdentityLink(workspaceId, linkId, challenge)\n .then(\n (result) => {\n if (generation.current !== current) return;\n setPreview(result);\n setLink(result.link);\n setSelected(result.link.permissions);\n },\n () => {\n if (generation.current === current) setError(true);\n },\n )\n .finally(() => {\n if (generation.current === current) setBusy(false);\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, linkId, challenge, retry]);\n async function mutate(revoke: boolean) {\n if (!link || busy) return;\n const current = generation.current;\n setBusy(true);\n setError(false);\n try {\n const result = revoke\n ? await client.revokeIdentityLink(workspaceId, linkId, link.revision)\n : await client.confirmIdentityLink(workspaceId, linkId, {\n challenge,\n expectedRevision: link.revision,\n permissions: selected,\n });\n if (generation.current !== current) return;\n setLink(result);\n onComplete?.(result);\n } catch {\n if (generation.current === current) setError(true);\n } finally {\n if (generation.current === current) setBusy(false);\n }\n }\n return (\n <section\n className={[\"og-connect og-identity-link\", className].filter(Boolean).join(\" \")}\n aria-label=\"Link your account\"\n aria-busy={busy}\n >\n <h2>Link your Opengeni account</h2>\n <p>\n Only continue if you started this request in a product you trust. Linking lets that product\n act as your account with the permissions you select. It does not merge accounts or move\n existing work.\n </p>\n {preview && (\n <dl>\n <dt>Organization</dt>\n <dd>{preview.organizationId}</dd>\n <dt>Product user</dt>\n <dd>\n {preview.externalIdentity.externalId} ({preview.externalIdentity.source})\n </dd>\n <dt>Your Opengeni identity</dt>\n <dd>{preview.nativeSubjectId}</dd>\n </dl>\n )}\n {error && (\n <div role=\"alert\">\n This request could not be completed. It may have expired, changed, or require you to sign\n in to the right organization.\n {!link && (\n <button type=\"button\" disabled={busy} onClick={() => setRetry((value) => value + 1)}>\n Try again\n </button>\n )}\n </div>\n )}\n {!link && busy && <p role=\"status\">Loading the account-link request…</p>}\n {link?.status === \"pending\" && (\n <>\n <p>\n {link.expiresAt\n ? `Access ends ${new Date(link.expiresAt).toLocaleString()}.`\n : \"Access lasts until you or the product revoke this link.\"}{\" \"}\n Your current permissions still apply.\n </p>\n <fieldset disabled={busy}>\n <legend>Allow these permissions</legend>\n {link.permissions.map((permission) => (\n <label key={permission}>\n <input\n type=\"checkbox\"\n checked={selected.includes(permission)}\n onChange={(event) =>\n setSelected((values) =>\n event.target.checked\n ? [...values, permission]\n : values.filter((value) => value !== permission),\n )\n }\n />\n <span>{permission.replaceAll(\":\", \" · \")}</span>\n </label>\n ))}\n </fieldset>\n <button\n type=\"button\"\n disabled={busy || selected.length === 0}\n onClick={() => void mutate(false)}\n >\n {busy ? \"Saving…\" : \"Allow selected access\"}\n </button>\n <p>You can close this page without granting access.</p>\n </>\n )}\n {link?.status === \"active\" && (\n <>\n <p role=\"status\">Account linked. Return to your product to continue.</p>\n <button type=\"button\" disabled={busy} onClick={() => void mutate(true)}>\n Revoke this link\n </button>\n </>\n )}\n {link?.status === \"revoked\" && (\n <p role=\"status\">Link revoked. Your Opengeni account and existing work are unchanged.</p>\n )}\n {link?.status === \"expired\" && (\n <p role=\"status\">This request has expired. Start a new request from your product.</p>\n )}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ExternalIdentityLink, ExternalIdentityLinkPage } from \"@opengeni/sdk\";\n\nexport type IdentityLinkAccountsClient = {\n listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\n\n/** Participant-scoped inventory. Revocation never deletes native work or merges\n * identities. The caller remounts this component when the signed-in user changes. */\nexport function IdentityLinkAccounts({\n client,\n workspaceId,\n}: {\n client: IdentityLinkAccountsClient;\n workspaceId: string;\n}) {\n const [links, setLinks] = useState<ExternalIdentityLink[]>([]);\n const [cursor, setCursor] = useState<string | null>(null);\n const [busy, setBusy] = useState(true);\n const [error, setError] = useState(false);\n const [revision, setRevision] = useState(0);\n const generation = useRef(0);\n const inFlight = useRef(false);\n useEffect(() => {\n const current = ++generation.current;\n inFlight.current = true;\n setLinks([]);\n setCursor(null);\n setBusy(true);\n setError(false);\n void client\n .listIdentityLinks(workspaceId)\n .then(\n (page) => {\n if (current !== generation.current) return;\n setLinks(page.links);\n setCursor(page.nextCursor);\n },\n () => {\n if (current === generation.current) setError(true);\n },\n )\n .finally(() => {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, revision]);\n\n async function act(link?: ExternalIdentityLink) {\n if (inFlight.current || (!link && !cursor)) return;\n const current = generation.current;\n inFlight.current = true;\n setBusy(true);\n setError(false);\n try {\n if (link) {\n const updated = await client.revokeIdentityLink(workspaceId, link.id, link.revision);\n if (current === generation.current)\n setLinks((values) =>\n values.map((value) => (value.id === updated.id ? { ...value, ...updated } : value)),\n );\n } else {\n const page = await client.listIdentityLinks(workspaceId, cursor!);\n if (current === generation.current) {\n setLinks((values) => [\n ...new Map([...values, ...page.links].map((value) => [value.id, value])).values(),\n ]);\n setCursor(page.nextCursor);\n }\n }\n } catch {\n if (current === generation.current) setError(true);\n } finally {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n }\n return (\n <section\n className=\"og-connect og-identity-link\"\n aria-label=\"Linked product access\"\n aria-busy={busy}\n >\n <h2>Linked product access</h2>\n <p>\n Manage products allowed to act as your account in this organization. Revoking a link stops\n future linked access; it does not delete your work or undo an operation already started.\n </p>\n {/* The links sit in one card under the heading, like a settings section;\n the empty and loading lines are rows of that card. */}\n <div className=\"og-identity-link-card\">\n {error && (\n <div role=\"alert\">\n Could not update account links. Reload to see current access.\n <button type=\"button\" disabled={busy} onClick={() => setRevision((value) => value + 1)}>\n Reload links\n </button>\n </div>\n )}\n {busy && <p role=\"status\">Loading account links…</p>}\n {!busy && !error && links.length === 0 && (\n <p>No products have linked access to this account.</p>\n )}\n <ul>\n {links.map((link) => (\n <li key={link.id}>\n <p>\n {link.externalIdentity?.source || \"Product identity\"}{\" \"}\n <code>{link.externalIdentity?.externalId ?? link.externalIdentityId}</code>\n </p>\n <p>\n Status: {link.status}.{\" \"}\n {link.expiresAt\n ? `Expires ${new Date(link.expiresAt).toLocaleString()}.`\n : \"No automatic expiry.\"}\n </p>\n <p>{link.permissions.join(\", \")}</p>\n {(link.status === \"active\" || link.status === \"pending\") && (\n <button type=\"button\" disabled={busy} onClick={() => void act(link)}>\n Revoke access\n </button>\n )}\n </li>\n ))}\n </ul>\n {cursor && (\n <button type=\"button\" disabled={busy} onClick={() => void act()}>\n Load more links\n </button>\n )}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type ConnectionInstalledItem = {\n id: string;\n name: string;\n status: string;\n showStatus?: boolean;\n icon?: ReactNode;\n needsAttention?: boolean;\n disabled?: boolean;\n onOpen: () => void;\n};\n\n/** Compact account/service shortcuts. The host supplies authoritative status. */\nexport function ConnectionInstalled({\n items,\n title = \"Connected\",\n className = \"\",\n}: {\n items: ConnectionInstalledItem[];\n title?: string;\n className?: string;\n}) {\n if (!items.length) return null;\n return (\n <section aria-label={title} className={`og-connection-installed ${className}`}>\n <h2>\n {title} <span>{items.length}</span>\n </h2>\n <div>\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onOpen}\n disabled={item.disabled}\n title={item.status}\n aria-label={`${item.name} · ${item.status}`}\n >\n {item.icon}\n <span>{item.name}</span>\n {item.showStatus ? (\n <span className=\"og-connection-installed-status\">{item.status}</span>\n ) : null}\n {item.needsAttention ? <span aria-label=\"Needs attention\">!</span> : null}\n </button>\n ))}\n </div>\n </section>\n );\n}\n","import { useId } from \"react\";\nexport type ConnectionType = \"mcp\" | \"openapi\" | \"graphql\";\nexport function ConnectionTypePicker({\n value,\n onChange,\n disabled = false,\n}: {\n value: ConnectionType;\n onChange: (value: ConnectionType) => void;\n disabled?: boolean;\n}) {\n const name = useId();\n return (\n <fieldset className=\"og-connection-type-picker\" disabled={disabled}>\n <legend>Connection type</legend>\n {(\n [\n [\"mcp\", \"MCP server\"],\n [\"openapi\", \"OpenAPI\"],\n [\"graphql\", \"GraphQL\"],\n ] as const\n ).map(([type, label]) => (\n <label key={type} data-selected={value === type}>\n <input\n type=\"radio\"\n name={name}\n value={type}\n checked={value === type}\n onChange={() => onChange(type)}\n />\n {label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import { createDiscoveryCache } from \"./discovery-cache\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { PluginDiscoveryItem, PluginDiscoveryPage } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();\nconst spacedName = (name: string) => name.replace(/-/g, \" \");\nconst EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();\n\nexport type PluginDiscoveryProps = {\n client: {\n discoverPlugins(\n workspaceId: string,\n options?: { query?: string; provider?: string; offset?: number },\n ): Promise<PluginDiscoveryPage>;\n };\n workspaceId: string;\n query: string;\n /** Initially selected registry. Users can still switch registries or browse all. */\n defaultProvider?: \"\" | \"openai\" | \"anthropic\";\n /** Discovery identities already installed in the current workspace. */\n installedIds?: ReadonlySet<string>;\n resultLimit?: number;\n onShowMore?: () => void;\n onOpen: (item: PluginDiscoveryItem) => void;\n /** Display name for a registry slug. Defaults to the slug with dashes as spaces. */\n formatName?: (name: string) => string;\n /** The row tile. Defaults to the plugin logo with a glyph fallback. */\n renderIcon?: (item: PluginDiscoveryItem) => ReactNode;\n};\nexport function PluginDiscovery(props: PluginDiscoveryProps) {\n const [provider, setProvider] = useState(props.defaultProvider ?? \"\");\n return (\n <section\n className={`og-plugin-discovery ${props.resultLimit ? \"og-catalog-overview\" : \"\"}`}\n aria-label=\"Discover plugins\"\n >\n <header>\n <h3>{props.resultLimit ? \"Plugins\" : \"Browse plugins\"}</h3>\n {!props.resultLimit ? (\n <div className=\"og-plugin-filters\" role=\"group\" aria-label=\"Plugin registry\">\n {(\n [\n { value: \"\", label: \"All\" },\n { value: \"openai\", label: \"OpenAI plugin registry\" },\n { value: \"anthropic\", label: \"Anthropic plugin registry\" },\n ] as const\n ).map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={provider === option.value}\n onClick={() => setProvider(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n ) : null}\n </header>\n <Results\n key={`${props.workspaceId}:${props.query}:${provider}`}\n {...props}\n provider={provider}\n />\n </section>\n );\n}\nfunction Results({\n client,\n workspaceId,\n query,\n provider,\n installedIds = EMPTY_INSTALLED_IDS,\n onOpen,\n resultLimit,\n onShowMore,\n formatName = spacedName,\n renderIcon,\n}: PluginDiscoveryProps & { provider: string }) {\n const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));\n const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);\n const [offset, setOffset] = useState(0);\n const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);\n const [total, setTotal] = useState(initial?.total ?? 0);\n const [loading, setLoading] = useState(!initial);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const sentinel = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let active = true;\n const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);\n const cached = discoveryCache.peek(client, cacheKey);\n setLoading(!cached);\n setError(false);\n const timer = setTimeout(\n () => {\n void discoveryCache\n .read(client, cacheKey, () =>\n client.discoverPlugins(workspaceId, { query, provider, offset }),\n )\n .then(\n (page) => {\n if (!active) return;\n setItems((previous) => (offset ? [...previous, ...page.items] : page.items));\n setTotal(page.total);\n setNext(page.nextOffset);\n setLoading(false);\n },\n () => {\n if (active) {\n setError(true);\n setLoading(false);\n }\n },\n );\n },\n cached || offset ? 0 : 200,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, provider, offset, retry]);\n useEffect(() => {\n if (resultLimit || loading || error || next === null || !sentinel.current) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) setOffset(next);\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(sentinel.current);\n return () => observer.disconnect();\n }, [loading, error, next, resultLimit]);\n return (\n <>\n {!loading && !error ? (\n <p role=\"status\">\n {total\n ? \"Bundles of skills and connections\"\n : query.trim()\n ? `No matches for “${query.trim()}”.`\n : \"No plugins in this registry.\"}\n </p>\n ) : null}\n <div className=\"og-plugin-discovery-grid\">\n {items.slice(0, resultLimit).map((item) => (\n <CapabilityCatalogRow\n key={item.id}\n data-plugin-id={item.id}\n name={formatName(item.displayName)}\n description={item.description}\n status={installedIds.has(item.id) ? \"added\" : \"available\"}\n statusLabel={installedIds.has(item.id) ? \"Installed\" : \"Available to install\"}\n onOpen={() => onOpen(item)}\n icon={\n renderIcon ? (\n renderIcon(item)\n ) : (\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n )\n }\n />\n ))}\n </div>\n {loading ? <p role=\"status\">Loading plugins…</p> : null}\n {error ? (\n <p role=\"alert\">\n Couldn’t load plugins.{\" \"}\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </p>\n ) : null}\n {resultLimit && !loading && !error && total > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all plugins\n </button>\n ) : null}\n <div ref={sentinel}>\n {!resultLimit && next !== null && !loading && !error ? (\n <button className=\"og-plugin-more\" type=\"button\" onClick={() => setOffset(next)}>\n Show more plugins\n </button>\n ) : null}\n </div>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { pluginMcpUnavailableReason, type PluginDiscoveryItem } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { Markdown } from \"./components/markdown\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst componentLabels: Record<string, string> = {\n skills: \"Skills\",\n mcp: \"MCP connections\",\n apps: \"Hosted apps\",\n hooks: \"Hooks\",\n agents: \"Agents\",\n commands: \"Commands\",\n lsp: \"Language servers\",\n};\n\nconst EMPTY_CONNECTIONS: Record<string, boolean> = {};\n\n/** Embeddable plugin overview. Hosts own the dialog and installation actions. */\nexport function PluginDetails({\n item,\n onInstall,\n busy = false,\n installed = false,\n error,\n connections = EMPTY_CONNECTIONS,\n onConnect,\n}: {\n item: PluginDiscoveryItem;\n onInstall?: () => void;\n busy?: boolean;\n installed?: boolean;\n error?: string | null;\n connections?: Record<string, boolean>;\n onConnect?: (server: { name: string; endpoint: string | null }) => void;\n}) {\n const supported = (server: NonNullable<PluginDiscoveryItem[\"mcpServers\"]>[number]) =>\n pluginMcpUnavailableReason(server) === null;\n const contentsUnknown = item.skills == null || item.mcpServers == null;\n const installableCount =\n (item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);\n const exceedsInstallLimit = installableCount > 64;\n const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;\n const [expanded, setExpanded] = useState(false);\n const description = item.longDescription || item.description;\n const lengthy = description.length > 700;\n const registryLabel =\n item.provider === \"openai\"\n ? \"OpenAI plugin registry\"\n : item.provider === \"anthropic\"\n ? \"Anthropic plugin registry\"\n : \"Custom source\";\n return (\n <article className=\"og-plugin-details\">\n <header className=\"og-plugin-details-header\">\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n <div>\n <h2>{item.displayName.replace(/-/g, \" \")}</h2>\n {item.author?.name ? <p>By {item.author.name}</p> : null}\n </div>\n </header>\n <div className=\"og-plugin-details-meta\">\n <span>{registryLabel}</span>\n {item.category ? <span>{item.category}</span> : null}\n {item.version ? <span>v{item.version}</span> : null}\n </div>\n <section className=\"og-plugin-details-members\">\n <h3>\n Skills <span>{item.skills?.length ?? \"—\"}</span>\n </h3>\n {item.skills?.length ? (\n <ul>\n {item.skills.map((skill) => (\n <li key={skill.sourceUrl}>\n <a href={skill.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <strong>{skill.name}</strong>\n <span aria-hidden=\"true\">↗</span>\n </a>\n </li>\n ))}\n </ul>\n ) : (\n <p>\n {item.skills\n ? \"No bundled skills.\"\n : \"Contents haven’t been indexed for this repository.\"}\n </p>\n )}\n <h3>\n MCP servers <span>{item.mcpServers?.length ?? \"—\"}</span>\n </h3>\n {item.mcpServers?.length ? (\n <ul>\n {item.mcpServers.map((server) => {\n const connected = Boolean(server.endpoint && connections[server.endpoint]);\n // Existing connections remain manageable regardless of the source manifest's setup requirements.\n const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);\n return (\n <li\n key={server.name}\n className={unavailableReason ? \"og-plugin-member-disabled\" : undefined}\n >\n <div className=\"og-plugin-server-heading\">\n <strong>{server.name}</strong>\n {!unavailableReason && onConnect ? (\n <button type=\"button\" disabled={busy} onClick={() => onConnect(server)}>\n {connected ? \"Manage\" : \"Connect\"}\n </button>\n ) : null}\n </div>\n <small>\n {connected ? \"Connected · \" : \"\"}\n {unavailableReason ?? server.endpoint}\n </small>\n </li>\n );\n })}\n </ul>\n ) : (\n <p>\n {item.mcpServers ? \"No bundled MCP servers.\" : \"Server details haven’t been indexed.\"}\n </p>\n )}\n {item.components?.some((component) => ![\"skills\", \"mcp\"].includes(component)) ? (\n <div className=\"og-plugin-details-other\">\n Not installed here:{\" \"}\n {item.components\n .filter((component) => ![\"skills\", \"mcp\"].includes(component))\n .map((component) => componentLabels[component] ?? component)\n .join(\", \")}\n </div>\n ) : null}\n </section>\n <section className=\"og-plugin-details-overview\" aria-label=\"Overview\">\n <div className={lengthy && !expanded ? \"og-plugin-details-excerpt\" : undefined}>\n <Markdown>{description}</Markdown>\n </div>\n {lengthy ? (\n <button\n type=\"button\"\n className=\"og-plugin-details-more\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </section>\n <footer>\n {item.sourceUrl ? (\n <a href={item.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n View repository <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n {onInstall ? (\n <button\n className=\"og-plugin-install\"\n type=\"button\"\n disabled={!installable || busy || installed}\n onClick={onInstall}\n >\n {installed ? \"Installed\" : busy ? \"Installing…\" : \"Install plugin\"}\n </button>\n ) : null}\n {error ? <p role=\"alert\">{error}</p> : null}\n {exceedsInstallLimit ? (\n <p>This plugin exceeds the current 64-component installation limit.</p>\n ) : contentsUnknown ? (\n <p>\n Plugin contents are unavailable. Installation is disabled until the repository can be\n inspected.\n </p>\n ) : !installable ? (\n <p>No installable skills or remote MCP servers.</p>\n ) : (\n <p>Installs skills and adds connection references. Connect each server separately.</p>\n )}\n </footer>\n </article>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","services","useState","jsx","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","useEffect","useState","jsx","useState","useEffect","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","Fragment","jsx","jsxs","discoveryCache","useState","useRef","useEffect","useState","BoxesIcon","jsx","jsxs","useState","BoxesIcon"]}
|
|
1
|
+
{"version":3,"sources":["../src/capability-catalog-row.tsx","../src/skill-discovery.tsx","../src/discovery-cache.ts","../src/connect-setup.tsx","../src/connection-service-presentation.ts","../src/connection-catalog.tsx","../src/connection-logo.tsx","../src/connect-chooser.tsx","../src/connect-accounts.tsx","../src/connection-service-logo.tsx","../src/capability-logo-fallback.ts","../src/connect-account-identity.tsx","../src/connection-skeleton.tsx","../src/connect-panel.tsx","../src/connection-discovery.tsx","../src/device-authorization.tsx","../src/identity-link-consent.tsx","../src/identity-link-accounts.tsx","../src/connection-installed.tsx","../src/connection-type-picker.tsx","../src/plugin-discovery.tsx","../src/plugin-details.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from \"lucide-react\";\n\nexport type CapabilityCatalogStatus =\n | \"available\"\n | \"added\"\n | \"attention\"\n | \"unavailable\"\n | \"loading\";\n\nexport type CapabilityCatalogRowProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"onClick\" | \"name\"\n> & {\n name: string;\n description?: string | undefined;\n icon?: ReactNode;\n status?: CapabilityCatalogStatus;\n statusLabel?: string | undefined;\n /** Preserve opaque host status text when adopting this row without typed health. */\n showStatusLabel?: boolean;\n onOpen: () => void;\n};\n\nconst labels: Record<CapabilityCatalogStatus, string> = {\n available: \"Available to add\",\n added: \"Added\",\n attention: \"Needs attention\",\n unavailable: \"Unavailable\",\n loading: \"Working\",\n};\n\n/** A display-only state. The entire catalog row is the action, never this glyph. */\nexport function CapabilityCatalogIndicator({\n status = \"available\",\n label,\n showLabel = false,\n}: {\n status?: CapabilityCatalogStatus;\n label?: string | undefined;\n showLabel?: boolean;\n}) {\n const Icon =\n status === \"added\"\n ? CheckIcon\n : status === \"attention\" || status === \"unavailable\"\n ? AlertTriangleIcon\n : status === \"loading\"\n ? Loader2Icon\n : PlusIcon;\n return (\n <span className=\"og-capability-catalog-indicator\" data-status={status}>\n <Icon aria-hidden=\"true\" />\n <span\n className={\n showLabel || status === \"attention\" || status === \"unavailable\"\n ? \"og-capability-catalog-notice\"\n : \"og-capability-catalog-sr-only\"\n }\n >\n {label ?? labels[status]}\n </span>\n </span>\n );\n}\n\n/** Shared by connections, skills, and plugins: one row, one focus target, one action. */\nexport function CapabilityCatalogRow({\n name,\n description,\n icon,\n status = \"available\",\n statusLabel,\n showStatusLabel = false,\n onOpen,\n className = \"\",\n ...props\n}: CapabilityCatalogRowProps) {\n return (\n <button\n {...props}\n type=\"button\"\n className={`og-capability-catalog-row ${className}`}\n onClick={onOpen}\n >\n {icon ? <span className=\"og-capability-catalog-icon\">{icon}</span> : null}\n <span className=\"og-capability-catalog-copy\">\n <strong>{name}</strong>\n {description ? <span>{description}</span> : null}\n </span>\n <CapabilityCatalogIndicator status={status} label={statusLabel} showLabel={showStatusLabel} />\n </button>\n );\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { createDiscoveryCache } from \"./discovery-cache\";\nimport { BookOpenIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow, type CapabilityCatalogStatus } from \"./capability-catalog-row\";\n\nexport type SkillDiscoveryItem = {\n id: string;\n name: string;\n source: string;\n installs: number;\n url: string;\n};\nexport type SkillDiscoveryPage = { items: SkillDiscoveryItem[]; nextCursor: null };\nconst discoveryCache = createDiscoveryCache<SkillDiscoveryPage>();\n\nexport type SkillDiscoveryClient = {\n searchPublicSkills(workspaceId: string, query: string): Promise<SkillDiscoveryPage>;\n};\nexport type SkillDiscoveryProps = {\n installedSkills?: readonly { name: string; repositoryUrl: string; sourceUrl: string }[];\n client: SkillDiscoveryClient;\n workspaceId: string;\n query: string;\n onImport: (url: string) => void;\n canManage: boolean;\n localSkills?: readonly {\n id: string;\n name: string;\n description?: string;\n status?: CapabilityCatalogStatus;\n statusLabel?: string;\n onOpen: () => void;\n }[];\n resultLimit?: number;\n onShowMore?: () => void;\n onSearch?: (() => void) | undefined;\n /** Display name for a registry slug (\"agent-browser\" -> \"Agent browser\"). Defaults to the slug. */\n formatName?: (name: string) => string;\n /** The line under a remote skill (\"From vercel-labs on skills.sh\"). Defaults to the source. */\n formatSource?: (source: string) => string;\n /** The row tile. Defaults to a bare book glyph. */\n icon?: ReactNode;\n};\n\n/** Host-owned query and import flow; browse presentation is reusable independently. */\nexport function SkillDiscovery(props: SkillDiscoveryProps) {\n const query = props.query.trim();\n const discoveryQuery = query || \"agent\";\n return (\n <section className=\"og-skill-discovery\" aria-label=\"Discover skills\">\n <header>\n <h3>{props.resultLimit ? \"Skills\" : query ? \"Search skills\" : \"Browse skills\"}</h3>\n {!props.resultLimit ? (\n <a\n href=\"https://skills.sh/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"og-skill-discovery-browse\"\n >\n Browse skills.sh ↗\n </a>\n ) : null}\n </header>\n {!query ? (\n <p>Popular on skills.sh</p>\n ) : query.length < 2 ? (\n <p>Enter at least two characters to search skills.sh.</p>\n ) : null}\n <DiscoveryResults\n key={`${props.workspaceId}:${discoveryQuery}`}\n {...props}\n query={discoveryQuery}\n />\n </section>\n );\n}\n\nconst keepText = (value: string) => value;\nconst DEFAULT_ICON = <BookOpenIcon aria-hidden=\"true\" />;\nconst EMPTY_LOCAL_SKILLS: NonNullable<SkillDiscoveryProps[\"localSkills\"]> = [];\nconst EMPTY_INSTALLED_SKILLS: NonNullable<SkillDiscoveryProps[\"installedSkills\"]> = [];\n\nfunction DiscoveryResults({\n client,\n workspaceId,\n query,\n canManage,\n onImport,\n resultLimit,\n onShowMore,\n localSkills = EMPTY_LOCAL_SKILLS,\n installedSkills = EMPTY_INSTALLED_SKILLS,\n formatName = keepText,\n formatSource = keepText,\n icon = DEFAULT_ICON,\n}: SkillDiscoveryProps) {\n const cacheKey = JSON.stringify([workspaceId, query]);\n const cached = discoveryCache.peek(client, cacheKey);\n const [result, setResult] = useState<SkillDiscoveryPage | null>(cached ?? null);\n const [loading, setLoading] = useState(query.length >= 2 && !cached);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n useEffect(() => {\n let active = true;\n setError(false);\n if (query.length < 2) return;\n const existing = discoveryCache.peek(client, cacheKey);\n setLoading(!existing);\n let timer: ReturnType<typeof setTimeout>;\n const search = async (attempt: number) => {\n try {\n const data = await discoveryCache.read(client, cacheKey, () =>\n client.searchPublicSkills(workspaceId, query),\n );\n if (!active) return;\n setResult(data);\n setLoading(false);\n } catch (cause) {\n if (!active) return;\n const status =\n typeof cause === \"object\" && cause !== null && \"status\" in cause\n ? cause.status\n : undefined;\n const transient =\n cause instanceof TypeError ||\n (typeof status === \"number\" && status >= 500 && status <= 599);\n if (attempt === 0 && transient) {\n timer = setTimeout(() => void search(1), 750);\n return;\n }\n setError(true);\n setLoading(false);\n }\n };\n timer = setTimeout(() => void search(0), existing ? 0 : 300);\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, cacheKey, retry]);\n const remoteSkills =\n result?.items.filter(\n (skill) =>\n !localSkills.some((local) => local.name.toLowerCase() === skill.name.toLowerCase()),\n ) ?? [];\n return (\n <div aria-busy={loading}>\n <div className=\"og-skill-discovery-grid\">\n {localSkills.slice(0, resultLimit).map((skill) => (\n <CapabilityCatalogRow\n key={skill.id}\n name={skill.name}\n description={skill.description}\n icon={icon}\n status={skill.status ?? \"added\"}\n statusLabel={skill.statusLabel}\n onOpen={skill.onOpen}\n />\n ))}\n {remoteSkills\n .slice(\n 0,\n resultLimit === undefined ? undefined : Math.max(0, resultLimit - localSkills.length),\n )\n .map((skill) => {\n const installed = installedSkills.some(\n (entry) =>\n entry.sourceUrl.replace(/\\/$/, \"\").toLowerCase() === skill.url.toLowerCase() ||\n (entry.repositoryUrl.replace(/\\/$/, \"\").toLowerCase() ===\n `https://github.com/${skill.source}`.toLowerCase() &&\n entry.name.toLowerCase() === skill.name.toLowerCase()),\n );\n return (\n <CapabilityCatalogRow\n key={skill.id}\n disabled={!canManage}\n name={formatName(skill.name)}\n description={formatSource(skill.source)}\n icon={icon}\n status={!canManage ? \"unavailable\" : installed ? \"added\" : \"available\"}\n statusLabel={\n !canManage ? \"Admin required\" : installed ? \"Installed\" : \"Available to add\"\n }\n onOpen={() => onImport(skill.url)}\n />\n );\n })}\n </div>\n {resultLimit && remoteSkills.length + localSkills.length > resultLimit && !loading ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all skills\n </button>\n ) : null}\n {loading ? <p role=\"status\">Loading skills…</p> : null}\n {error ? (\n <div role=\"alert\" className=\"og-skill-discovery-error\">\n Could not load skills.\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </div>\n ) : null}\n {result && !remoteSkills.length && !localSkills.length && !loading && !error ? (\n <p role=\"status\">{`No matches for “${query}”.`}</p>\n ) : null}\n </div>\n );\n}\n","/** Short-lived presentation data only. Never cache installation or authorization state. */\nexport function createDiscoveryCache<T>(ttlMs = 60_000, capacity = 64) {\n const clients = new WeakMap<\n object,\n Map<string, { expires: number; value: T | undefined; pending: Promise<T> }>\n >();\n return {\n peek(client: object, key: string): T | undefined {\n const entry = clients.get(client)?.get(key);\n return entry && entry.expires > Date.now() ? entry.value : undefined;\n },\n read(client: object, key: string, fetch: () => Promise<T>): Promise<T> {\n let entries = clients.get(client);\n if (!entries) {\n entries = new Map();\n clients.set(client, entries);\n }\n const existing = entries.get(key);\n if (existing && existing.expires > Date.now()) return existing.pending;\n entries.delete(key);\n while (entries.size >= capacity) entries.delete(entries.keys().next().value!);\n const entry = {\n expires: Date.now() + ttlMs,\n value: undefined as T | undefined,\n pending: Promise.resolve().then(fetch),\n };\n entries.set(key, entry);\n entry.pending = entry.pending.then(\n (value) => {\n entry.value = value;\n entry.expires = Date.now() + ttlMs;\n return value;\n },\n (error) => {\n if (entries.get(key) === entry) entries.delete(key);\n throw error;\n },\n );\n return entry.pending;\n },\n };\n}\n","import { useState, type FormEvent } from \"react\";\nimport type { ConnectAttempt, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\n\nconst setupStatus: Record<ConnectAttempt[\"state\"], string> = {\n ready: \"Ready to connect\",\n requires_user_action: \"Authorize your account\",\n credential_input: \"Enter connection details\",\n provider_wait: \"Waiting for authorization\",\n account_selection: \"Choose an account\",\n resource_selection: \"Choose resources\",\n preview: \"Choose tools\",\n installing: \"Adding selected tools…\",\n connected_but_incomplete: \"Choose which tools to add\",\n complete: \"Connection ready\",\n cancelled: \"Setup cancelled\",\n expired: \"Setup expired\",\n failed: \"Setup could not finish\",\n uncertain: \"Setup outcome needs checking\",\n};\n\nfunction deviceVerificationUrl(action: ConnectAttempt[\"nextAction\"]): string | null {\n if (action.type !== \"wait\" || !action.verificationUrl) return null;\n try {\n const url = new URL(action.verificationUrl);\n return url.protocol === \"https:\" && !url.username && !url.password\n ? action.verificationUrl\n : null;\n } catch {\n return null;\n }\n}\n\nexport type ConnectSetupProps = {\n controller: ConnectController;\n /** Called synchronously in the click handler so a host can open a popup. */\n onAuthorize: (attempt: ConnectAttempt) => void | Promise<unknown>;\n /** Called synchronously on Continue; hosts can reserve a popup before advancing. */\n onSelectAccount?: (accountId: string) => void | Promise<unknown>;\n /** Host pagination must retain selections across pages and submit the final set. */\n onBrowseResources?: (attempt: ConnectAttempt) => void | Promise<unknown>;\n className?: string;\n /** Provider-specific label supplied by the embedding host. */\n authorizeLabel?: string | undefined;\n};\n\n/** Controller-backed setup surface, styled by opt-in connect.css. No provider secrets enter React state. Host owns\n * chooser, controller lifetime, navigation and recovery after full redirect. */\nexport function ConnectSetup(props: ConnectSetupProps) {\n // Attempt IDs/revisions are not a substitute for actor scope. A host can\n // recover the same attempt through a replacement controller; never preserve\n // a previous actor's unsent credential DOM or local errors across that swap.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedSetup key={generation} {...props} />;\n}\n\nfunction ScopedSetup({\n controller,\n onAuthorize,\n onBrowseResources,\n onSelectAccount,\n className,\n authorizeLabel = \"Authorize connection\",\n}: ConnectSetupProps) {\n const view = useConnect(controller);\n const [localError, setLocalError] = useState(false);\n const [navigating, setNavigating] = useState(false);\n const invoke = (operation: () => unknown | Promise<unknown>) => {\n setLocalError(false);\n try {\n void Promise.resolve(operation()).catch(() => setLocalError(true));\n } catch {\n setLocalError(true);\n }\n };\n const attempt = view.attempt;\n if (!attempt)\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n >\n <p role=\"status\">Choose a connection to begin.</p>\n </section>\n );\n const action = attempt.nextAction;\n const verificationUrl = deviceVerificationUrl(action);\n const terminal = [\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = event.currentTarget;\n const data = new FormData(form);\n if (view.busy || navigating) return;\n const key = crypto.randomUUID();\n if (action.type === \"credentials\") {\n const values = Object.fromEntries(\n action.fields.map((field, i) => [field.name, String(data.get(`field-${i}`) ?? \"\")]),\n );\n // Clear the DOM before awaiting remote work; controller never retains values.\n form.reset();\n invoke(() => view.advance({ type: \"credentials\", values }, key));\n } else if (action.type === \"select_account\") {\n const accountId = String(data.get(\"account\") ?? \"\");\n if (\n action.accounts.some((account) => account.id === accountId && account.status !== \"disabled\")\n )\n invoke(async () => {\n if (!onSelectAccount) return view.advance({ type: \"account\", accountId }, key);\n setNavigating(true);\n try {\n await onSelectAccount(accountId);\n } finally {\n setNavigating(false);\n }\n });\n } else if (action.type === \"select_resources\") {\n if (action.cursor) return;\n const resourceIds = data.getAll(\"resource\").map(String);\n invoke(() => view.advance({ type: \"resources\", resourceIds }, key));\n } else if (action.type === \"preview\") {\n const operationIds = data.getAll(\"operation\").map(String);\n invoke(() =>\n view.advance(\n {\n type: \"install\",\n previewId: action.previewId,\n contentHash: action.contentHash,\n operationIds,\n },\n key,\n ),\n );\n }\n };\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n aria-busy={view.busy || navigating}\n >\n <div className=\"og-connect-setup-summary\">\n <p className=\"og-connect-setup-scope\">\n {attempt.ownership === \"personal\" ? \"Personal connection\" : \"Workspace connection\"}\n </p>\n <p role=\"status\" className=\"og-connect-setup-status\">\n {setupStatus[attempt.state]}\n </p>\n <p className=\"og-connect-setup-description\">\n {attempt.ownership === \"personal\"\n ? \"Only your work can use this connection.\"\n : \"Work in this workspace can use this connection.\"}\n </p>\n </div>\n {attempt.account && <p>Account: {attempt.account.label}</p>}\n {(localError || view.error || attempt.error) && (\n <p role=\"alert\">\n {attempt.error?.code === \"source_changed\"\n ? \"The integration source changed. Review the updated tools before adding them.\"\n : \"Connection setup could not continue. Refresh its status before trying again.\"}\n </p>\n )}\n {!terminal && (\n <form key={`${attempt.id}:${attempt.revision}`} onSubmit={submit} autoComplete=\"off\">\n <fieldset disabled={view.busy || navigating}>\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) ? (\n <legend>Connection details</legend>\n ) : null}\n {attempt.state === \"connected_but_incomplete\" && action.type === \"none\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => view.advance({ type: \"retry\" }, crypto.randomUUID()))}\n >\n Choose tools\n </button>\n )}\n {action.type === \"credentials\" &&\n action.fields.map((field, i) => (\n <label key={field.name}>\n {field.label}\n {field.options ? (\n <select name={`field-${i}`} required={field.required} defaultValue=\"\">\n <option value=\"\">\n {field.required ? \"Choose an option\" : \"No account (public service)\"}\n </option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n name={`field-${i}`}\n type={field.secret ? \"password\" : \"text\"}\n required={field.required}\n autoComplete=\"off\"\n />\n )}\n </label>\n ))}\n {action.type === \"select_account\" && (\n <label>\n Account\n <select name=\"account\" required defaultValue=\"\">\n <option value=\"\" disabled>\n Choose an account\n </option>\n {action.accounts.map((account) => (\n <option\n key={account.id}\n value={account.id}\n disabled={account.status === \"disabled\"}\n >\n {account.label} — {account.id} ({account.ownership})\n </option>\n ))}\n </select>\n </label>\n )}\n {action.type === \"select_resources\" &&\n action.resources.map((resource) => (\n <label key={resource.id}>\n <input type=\"checkbox\" name=\"resource\" value={resource.id} />\n {resource.label} ({resource.kind})\n </label>\n ))}\n {action.type === \"select_resources\" && action.cursor && (\n <>\n <p>More resources are available. Review all pages before submitting a selection.</p>\n {onBrowseResources && (\n <button\n type=\"button\"\n onClick={() => invoke(() => onBrowseResources(structuredClone(attempt)))}\n >\n Browse all resources\n </button>\n )}\n </>\n )}\n {action.type === \"preview\" && (\n <>\n <p>Choose the tools agents can use with this account.</p>\n {action.operations.map((operation) => (\n <label key={operation.id}>\n <input type=\"checkbox\" name=\"operation\" value={operation.id} />\n {operation.label} ({operation.kind})\n </label>\n ))}\n </>\n )}\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) && (\n <button\n type=\"submit\"\n className=\"og-connect-setup-primary\"\n disabled={action.type === \"select_resources\" && Boolean(action.cursor)}\n >\n {action.type === \"preview\" ? \"Add selected tools\" : \"Continue\"}\n </button>\n )}\n {action.type === \"authorize\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => onAuthorize(structuredClone(attempt)))}\n >\n {navigating ? \"Waiting for authorization…\" : authorizeLabel}\n </button>\n )}\n {action.type === \"wait\" && (\n <>\n {action.userCode && (\n <p>\n Verification code: <code>{action.userCode}</code>\n </p>\n )}\n <p>Complete provider authorization, then check the connection status.</p>\n {verificationUrl && (\n <a href={verificationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Open provider verification page (new tab)\n </a>\n )}\n </>\n )}\n <div className=\"og-connect-setup-secondary\">\n <button type=\"button\" onClick={() => invoke(() => view.refresh())}>\n Check status\n </button>\n <button type=\"button\" onClick={() => invoke(() => view.cancel(crypto.randomUUID()))}>\n Cancel setup\n </button>\n </div>\n </fieldset>\n </form>\n )}\n </section>\n );\n}\n","import type { ConnectAccount, ConnectProvider } from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport gmailLogo from \"./assets/gmail.ico\";\nimport outlookLogo from \"./assets/outlook.ico\";\n\n/** Passive service identity only. Never selects an account or grants tool access. */\nconst services: Record<string, { name: string; logo: string; mcpUrl?: string }> = {\n gmail: { name: \"Gmail\", logo: gmailLogo, mcpUrl: \"https://gmailmcp.googleapis.com/mcp/v1\" },\n \"microsoft-outlook-mail\": { name: \"Outlook Mail\", logo: outlookLogo },\n \"microsoft-outlook-calendar\": { name: \"Outlook Calendar\", logo: outlookLogo },\n \"microsoft-outlook-contacts\": { name: \"Outlook Contacts\", logo: outlookLogo },\n};\n\nexport function connectionServicePresentation(provider: Pick<ConnectProvider, \"id\" | \"label\">) {\n return (\n (Object.hasOwn(services, provider.id) ? services[provider.id] : undefined) ?? {\n name: provider.label,\n logo: null,\n }\n );\n}\n\nexport function capabilityConnectProviderId(\n item: Partial<Pick<CapabilityCatalogItem, \"mcpUrl\">>,\n): string | undefined {\n return Object.entries(services).find(\n ([, service]) => service.mcpUrl && service.mcpUrl === item.mcpUrl,\n )?.[0];\n}\n\nexport function accountServiceCapability(account: ConnectAccount, items: CapabilityCatalogItem[]) {\n const exact = items.filter((item) => item.connectionRef?.connectionId === account.id);\n if (exact.length === 1) return exact[0];\n // Presentation may use the service definition even when a personal credential\n // has no workspace installation reference. The account id remains unchanged.\n return items.find((item) => capabilityConnectProviderId(item) === account.providerId);\n}\n\nexport function isServiceConnectProvider(provider: ConnectProvider): boolean {\n return (\n provider.readiness === \"available\" &&\n provider.ownership.length > 0 &&\n provider.family !== \"mcp\" &&\n !provider.setup.some((kind) => [\"installation\", \"openapi\", \"graphql\"].includes(kind))\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n CapabilityCatalogIndicator,\n CapabilityCatalogRow,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\n\n/** Status comes from the host/controller, never inferred from a display label. */\nexport type ConnectionCatalogOption = {\n id: string;\n name: string;\n description?: string | undefined;\n status: string;\n connected: boolean;\n /** Explicit health/availability. Omit to retain visible legacy status text. */\n state?: CapabilityCatalogStatus;\n onOpen: () => void;\n action?: ReactNode;\n};\nexport type ConnectionCatalogService = {\n id: string;\n name: string;\n logo?: ReactNode;\n options: ConnectionCatalogOption[];\n};\nexport type ConnectionCatalogProps = {\n services: ConnectionCatalogService[];\n query?: string;\n columns?: 1 | 2;\n resultLimit?: number;\n onShowMore?: () => void;\n /** Group capabilities by service, or show every capability independently. */\n grouped?: boolean;\n className?: string;\n emptyMessage?: string;\n};\n\nexport function ConnectionOptionRow({ option }: { option: ConnectionCatalogOption }) {\n return (\n <div className=\"og-connection-catalog-action-row og-connection-option\">\n <CapabilityCatalogRow\n name={option.name}\n description={option.description}\n status={option.state ?? (option.connected ? \"added\" : \"available\")}\n statusLabel={option.status}\n showStatusLabel={option.state === undefined}\n onOpen={option.onOpen}\n />\n {option.action ? <span className=\"og-connection-option-action\">{option.action}</span> : null}\n </div>\n );\n}\n\nexport function ConnectionServiceRow({ service }: { service: ConnectionCatalogService }) {\n if (!service.options.length) return null;\n const connected = service.options.filter((option) => option.connected).length;\n const attention = service.options.find(\n (option) => option.state === \"attention\" || option.state === \"unavailable\",\n );\n const groupState =\n attention?.state ??\n (service.options.some((option) => option.state === \"loading\")\n ? \"loading\"\n : connected === service.options.length\n ? \"added\"\n : \"available\");\n const identity = (\n <>\n <span className=\"og-capability-catalog-icon\">{service.logo}</span>\n <span className=\"og-capability-catalog-copy\">\n <strong>{service.name}</strong>\n <span>\n {service.options.length === 1\n ? service.options[0]?.description\n : service.options.map((option) => option.name).join(\" · \")}\n </span>\n </span>\n <CapabilityCatalogIndicator\n status={groupState}\n label={attention?.status ?? `${connected} of ${service.options.length} added`}\n />\n </>\n );\n return service.options.length === 1 ? (\n <div className=\"og-connection-catalog-action-row\">\n <CapabilityCatalogRow\n name={service.name}\n description={service.options[0]!.description}\n icon={service.logo}\n status={service.options[0]!.state ?? (connected ? \"added\" : \"available\")}\n statusLabel={service.options[0]!.status}\n showStatusLabel={service.options[0]!.state === undefined}\n onOpen={service.options[0]!.onOpen}\n />\n {service.options[0]?.action}\n </div>\n ) : (\n <details className=\"og-connection-catalog-service\">\n <summary className=\"og-capability-catalog-row\">\n {identity}\n <span aria-hidden className=\"og-connection-group-chevron\">\n ⌄\n </span>\n </summary>\n <div className=\"og-connection-catalog-options\">\n {service.options.map((option) => (\n <ConnectionOptionRow key={option.id} option={option} />\n ))}\n </div>\n </details>\n );\n}\n\nexport function ConnectionCatalog({\n services,\n query = \"\",\n columns = 1,\n grouped = true,\n resultLimit,\n onShowMore,\n className = \"\",\n emptyMessage = \"No connections match your search.\",\n}: ConnectionCatalogProps) {\n const search = query.trim().toLowerCase();\n const entries = grouped\n ? services\n : services.flatMap((service) =>\n service.options.map((option) => ({\n ...service,\n id: `${service.id}/${option.id}`,\n name:\n service.options.length > 1 && option.name !== service.name\n ? `${service.name} · ${option.name}`\n : service.name,\n options: [option],\n })),\n );\n const visible = entries.filter((service) =>\n [service.name, ...service.options.flatMap((option) => [option.name, option.description ?? \"\"])]\n .join(\" \")\n .toLowerCase()\n .includes(search),\n );\n return (\n <>\n <div className={`og-connection-catalog ${className}`} data-columns={columns}>\n {visible.length ? (\n visible\n .slice(0, resultLimit)\n .map((service) => <ConnectionServiceRow key={service.id} service={service} />)\n ) : (\n <p role=\"status\">{emptyMessage}</p>\n )}\n </div>\n {resultLimit && visible.length > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all connections\n </button>\n ) : null}\n </>\n );\n}\n","import { useState, type ReactNode } from \"react\";\n/** Brand identifier; failed/missing assets use the supplied fallback or stable initials. */\nexport function ConnectionLogo({\n src,\n name,\n size = 40,\n fallback,\n loading = false,\n}: {\n src: string | null;\n name: string;\n size?: number;\n fallback?: ReactNode;\n loading?: boolean;\n}) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n return (\n <span className=\"og-connection-logo\" aria-hidden=\"true\" style={{ width: size, height: size }}>\n {src && src !== failedSrc ? (\n <img src={src} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => setFailedSrc(src)} />\n ) : loading ? (\n <span className=\"og-connection-skeleton-mark\" />\n ) : (\n (fallback ?? (\n <span>\n {name\n .split(/\\s+/)\n .map((part) => part[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase()}\n </span>\n ))\n )}\n </span>\n );\n}\n","import { connectionServicePresentation } from \"./connection-service-presentation\";\nimport { ConnectionCatalog } from \"./connection-catalog\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { ConnectAccount, ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\n\nexport type ConnectChooserProps = {\n controller: ConnectController;\n /** Exact host return string; no completion parameters are added. */\n returnUrl: string;\n className?: string;\n presentation?: \"select\" | \"catalog\";\n /** Compact mechanism picker when service discovery is already shown by the host. */\n customOnly?: boolean;\n providerOnly?: boolean;\n compact?: boolean;\n /** Select a service from the unified discovery list. */\n initialProviderId?: string;\n};\n\n/** Catalog readiness is supplied by the authenticated backend, never inferred\n * from the existence of a provider definition. Host replaces the controller on\n * actor/workspace change. This form does not open OAuth windows itself. */\nexport function ConnectChooser(props: ConnectChooserProps) {\n // Remount scope-local selections synchronously when the controller changes,\n // before effects can expose a previous actor's inventory for one frame.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedChooser key={generation} {...props} />;\n}\n\nfunction ScopedChooser({\n controller,\n returnUrl,\n className,\n presentation = \"select\",\n customOnly = false,\n providerOnly = false,\n compact = false,\n initialProviderId = \"\",\n}: ConnectChooserProps) {\n const view = useConnect(controller);\n const [catalog, setCatalog] = useState<ConnectProvider[] | null>(null);\n const [accounts, setAccounts] = useState<ConnectAccount[]>([]);\n const [failed, setFailed] = useState(false);\n const [load, setLoad] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [providerId, setProviderId] = useState(initialProviderId);\n const [ownership, setOwnership] = useState(\"\");\n useEffect(() => {\n const abort = new AbortController();\n setCatalog(null);\n setAccounts([]);\n setFailed(false);\n setProviderId(initialProviderId);\n setOwnership(\"\");\n // Promise boundary also handles a synchronously throwing injected transport.\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return Promise.all([\n controller.transport.catalog(controller.workspaceId, { signal: abort.signal }),\n presentation === \"catalog\"\n ? controller.transport.accounts(controller.workspaceId, { signal: abort.signal })\n : Promise.resolve([] as ConnectAccount[]),\n ]);\n })\n .then(([providers, inventory]) => {\n if (!abort.signal.aborted) {\n setCatalog(\n structuredClone(\n providers.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n entry.ownership.length > 0 &&\n (!providerOnly ||\n (entry.family !== \"mcp\" &&\n !entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n ))) &&\n (!customOnly ||\n entry.family === \"mcp\" ||\n entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n )),\n ),\n ),\n );\n setAccounts(structuredClone(inventory));\n const initial = providers.find((entry) => entry.id === initialProviderId);\n if (initial)\n setOwnership(\n initial.ownership.includes(\"personal\") &&\n [\"google\", \"microsoft\"].includes(initial.family)\n ? \"personal\"\n : initial.ownership.includes(\"workspace\")\n ? \"workspace\"\n : (initial.ownership[0] ?? \"\"),\n );\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => abort.abort();\n }, [controller, load, presentation, customOnly, providerOnly, initialProviderId]);\n const provider = catalog?.find((entry) => entry.id === providerId);\n const canBegin =\n provider?.readiness === \"available\" &&\n (ownership === \"personal\" || ownership === \"workspace\") &&\n provider.ownership.includes(ownership);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (!canBegin || view.busy || (ownership !== \"personal\" && ownership !== \"workspace\")) return;\n setFailed(false);\n try {\n void controller\n .begin({ providerId, ownership, returnUrl, idempotencyKey: crypto.randomUUID() })\n .catch(() => setFailed(true));\n } catch {\n setFailed(true);\n }\n };\n // Optional adapters must not add a temporary section that disappears once\n // readiness arrives. The primary discovery surface already owns loading.\n if (compact && (!catalog || catalog.length === 0) && !failed) return null;\n return (\n <section\n className={className}\n aria-label=\"Choose a connection\"\n aria-busy={view.busy || (!catalog && !failed)}\n >\n {failed && (\n <p role=\"alert\">\n Connections could not be loaded or started. Check setup status before retrying.\n </p>\n )}\n {!catalog && !failed && <p role=\"status\">Loading connections…</p>}\n {catalog?.length === 0 && <p role=\"status\">No connections are available.</p>}\n {Boolean(catalog?.length) && (\n <form onSubmit={submit}>\n <fieldset disabled={view.busy}>\n <legend hidden={customOnly || compact}>\n {presentation === \"catalog\" ? \"Add a connection\" : \"Provider and ownership\"}\n </legend>\n {presentation === \"catalog\" && !provider ? (\n <>\n <label hidden={customOnly || compact}>\n Search connections\n <input\n type=\"search\"\n placeholder=\"Find a service…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n {[\n {\n name: \"Services\",\n entries: catalog!.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n entry.family !== \"mcp\" &&\n !entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n ),\n ),\n secondary: false,\n },\n {\n name: \"Custom connections\",\n entries: catalog!.filter(\n (entry) =>\n entry.readiness === \"available\" &&\n (entry.family === \"mcp\" ||\n entry.setup.some((kind) =>\n [\"installation\", \"openapi\", \"graphql\"].includes(kind),\n )),\n ),\n secondary: true,\n },\n ].map((group) => {\n const entries = group.entries.filter((entry) =>\n entry.label.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim()),\n );\n if (!entries.length) return null;\n const rows = (\n <ConnectionCatalog\n services={entries.map((entry) => {\n const connected = accounts.some(\n (account) =>\n account.providerId === entry.id && account.status === \"connected\",\n );\n return {\n id: entry.id,\n name: entry.label,\n logo: (\n <ConnectionLogo\n src={connectionServicePresentation(entry).logo}\n name={entry.label}\n />\n ),\n options: [\n {\n id: entry.id,\n name: entry.label,\n status: connected\n ? \"Connected\"\n : entry.readiness === \"available\"\n ? \"Connect\"\n : \"Unavailable\",\n state: connected\n ? \"added\"\n : entry.readiness === \"available\"\n ? \"available\"\n : \"unavailable\",\n connected,\n onOpen: () => {\n if (!view.busy) {\n setProviderId(entry.id);\n setOwnership(\n entry.ownership.length === 1 ? entry.ownership[0]! : \"\",\n );\n }\n },\n },\n ],\n };\n })}\n />\n );\n return group.secondary && !customOnly ? (\n <details\n className=\"og-connect-secondary\"\n key={group.name}\n open={query.trim() ? true : undefined}\n >\n <summary>\n {group.name}\n <span>{entries.length}</span>\n </summary>\n {rows}\n </details>\n ) : (\n <div key={group.name}>{rows}</div>\n );\n })}\n {!catalog!.some((entry) =>\n entry.label.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim()),\n ) && <p role=\"status\">No services match your search.</p>}\n </>\n ) : null}\n {presentation === \"catalog\" && provider && !initialProviderId ? (\n <button\n type=\"button\"\n onClick={() => {\n setProviderId(\"\");\n setOwnership(\"\");\n }}\n >\n Back to connections\n </button>\n ) : null}\n <label hidden={presentation === \"catalog\"}>\n Provider\n <select\n required\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n setOwnership(\"\");\n }}\n >\n <option value=\"\" disabled>\n Choose a provider\n </option>\n {catalog!.map((entry) => (\n <option\n key={entry.id}\n value={entry.id}\n disabled={entry.readiness !== \"available\" || entry.ownership.length === 0}\n >\n {entry.label} — {entry.id} ({entry.readiness.replaceAll(\"_\", \" \")})\n </option>\n ))}\n </select>\n </label>\n {provider && (\n <>\n <strong>{presentation === \"catalog\" ? provider.label : null}</strong>\n {provider.readiness !== \"available\" && (\n <p role=\"status\">\n {provider.reason ??\n \"This service is not available in this environment. Contact your administrator to enable it.\"}\n </p>\n )}\n <label>\n Who can use this connection?\n <select\n required\n value={ownership}\n onChange={(event) => setOwnership(event.target.value)}\n >\n <option value=\"\" disabled>\n Choose ownership\n </option>\n {provider.ownership.map((choice) => (\n <option key={choice} value={choice}>\n {choice === \"personal\" ? \"Only me\" : \"Everyone in this workspace\"}\n </option>\n ))}\n </select>\n </label>\n </>\n )}\n <button\n hidden={presentation === \"catalog\" && !provider}\n type=\"submit\"\n disabled={!canBegin}\n >\n Continue\n </button>\n </fieldset>\n </form>\n )}\n <button hidden={!failed} type=\"button\" disabled={view.busy} onClick={() => setLoad(load + 1)}>\n Reload providers\n </button>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ConnectAccount, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./hooks/use-connect\";\nimport { ConnectAccountIdentity } from \"./connect-account-identity\";\nimport { ConnectionSkeleton } from \"./connection-skeleton\";\nimport type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\n\nexport type ConnectAccountsProps = {\n controller: ConnectController;\n className?: string;\n /** Enables explicit account-bound reconnect. Host supplies the exact destination. */\n returnUrl?: string;\n /** Uses authenticated catalogue assets and exact connection references for service identity. */\n client?: OpenGeniClient | undefined;\n /** Reconcile surrounding service state after a confirmed account disconnect. */\n onDisconnected?: (() => void) | undefined;\n};\n\n/** Local credential revocation only. Unknown or changed versions must be\n * refreshed; this component never retries a destructive operation implicitly. */\nexport function ConnectAccounts(props: ConnectAccountsProps) {\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedAccounts key={generation} {...props} />;\n}\n\nfunction ScopedAccounts({\n controller,\n className,\n returnUrl,\n client,\n onDisconnected,\n}: ConnectAccountsProps) {\n const view = useConnect(controller);\n const [accounts, setAccounts] = useState<ConnectAccount[] | null>(null);\n const [selected, setSelected] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [reload, setReload] = useState(0);\n const [catalog, setCatalog] = useState<{\n client: OpenGeniClient;\n items: CapabilityCatalogItem[];\n } | null>(null);\n const mutation = useRef<AbortController | null>(null);\n useEffect(() => () => mutation.current?.abort(), []);\n useEffect(() => {\n const abort = new AbortController();\n setAccounts(null);\n setCatalog(null);\n setSelected(null);\n setError(false);\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return Promise.all([\n controller.transport.accounts(controller.workspaceId, { signal: abort.signal }),\n client?.listCapabilities(controller.workspaceId).catch(() => null) ?? null,\n ]);\n })\n .then(([result, metadata]) => {\n if (!abort.signal.aborted) {\n setAccounts(structuredClone(result.filter((account) => account.status !== \"disabled\")));\n if (client && metadata) setCatalog({ client, items: metadata.items });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setError(true);\n });\n return () => abort.abort();\n }, [client, controller, reload]);\n\n const disconnect = async (account: ConnectAccount) => {\n const expectedVersion = account.version;\n if (\n mutation.current ||\n view.busy ||\n expectedVersion === undefined ||\n !Number.isSafeInteger(expectedVersion) ||\n expectedVersion < 1\n )\n return;\n const abort = new AbortController();\n mutation.current = abort;\n setBusy(true);\n setError(false);\n try {\n await controller.transport.disconnect(controller.workspaceId, account.id, {\n expectedVersion,\n signal: abort.signal,\n });\n if (!abort.signal.aborted) {\n setReload((value) => value + 1);\n onDisconnected?.();\n }\n } catch {\n if (!abort.signal.aborted) {\n // Outcome may be unknown. Drop the inventory so a second click cannot\n // replay against the stale selection; let the host reload live state.\n setAccounts(null);\n setError(true);\n }\n } finally {\n if (!abort.signal.aborted) {\n mutation.current = null;\n setBusy(false);\n setSelected(null);\n }\n }\n };\n const reconnect = async (account: ConnectAccount) => {\n if (!returnUrl || mutation.current || view.busy) return;\n setError(false);\n try {\n await controller.begin({\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n returnUrl,\n idempotencyKey: crypto.randomUUID(),\n });\n } catch {\n setError(true);\n }\n };\n\n return (\n <section\n className={className}\n aria-label=\"Connected accounts\"\n aria-busy={busy || view.busy || (!accounts && !error)}\n >\n <h3>Your connections</h3>\n {error && (\n <p role=\"alert\">Account state could not be confirmed. Reload before trying again.</p>\n )}\n {!accounts && !error && <ConnectionSkeleton label=\"Loading accounts\" />}\n {accounts?.length === 0 && <p role=\"status\">No connected accounts.</p>}\n {accounts && accounts.length > 0 && (\n <ul>\n {accounts.map((account) => (\n <li className=\"og-connect-account\" key={`${account.providerId}:${account.id}`}>\n <details className=\"og-connect-account-details\">\n <summary className=\"og-connect-account-heading\">\n <ConnectAccountIdentity\n account={account}\n client={client}\n capabilities={catalog?.client === client ? (catalog?.items ?? []) : []}\n />\n <span className=\"og-connect-account-status\" data-status={account.status}>\n {account.status === \"connected\"\n ? \"✓ Connected\"\n : account.status === \"auth_needed\"\n ? \"Reconnect needed\"\n : \"Disconnected\"}\n </span>\n <svg\n className=\"og-connect-account-chevron\"\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n </summary>\n <div className=\"og-connect-account-actions\">\n {returnUrl && account.status === \"auth_needed\" && (\n <button\n type=\"button\"\n aria-label={`Reconnect ${account.label}`}\n disabled={busy || view.busy}\n onClick={() => void reconnect(account)}\n >\n Reconnect\n </button>\n )}\n {selected === `${account.providerId}:${account.id}` ? (\n <div role=\"group\" aria-label={`Disconnect ${account.label}`}>\n <p>\n This removes local Opengeni access. It does not revoke consent at the\n provider.\n </p>\n <button\n type=\"button\"\n disabled={busy || view.busy}\n onClick={() => void disconnect(account)}\n >\n Confirm disconnect\n </button>\n <button type=\"button\" disabled={busy} onClick={() => setSelected(null)}>\n Keep account\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n aria-label={`Disconnect ${account.label}`}\n disabled={\n busy ||\n view.busy ||\n account.status === \"disabled\" ||\n !Number.isSafeInteger(account.version) ||\n account.version! < 1\n }\n onClick={() => setSelected(`${account.providerId}:${account.id}`)}\n >\n Disconnect\n </button>\n )}\n </div>\n </details>\n </li>\n ))}\n </ul>\n )}\n <button\n hidden={!error}\n type=\"button\"\n disabled={busy}\n onClick={() => setReload((value) => value + 1)}\n >\n Reload accounts\n </button>\n </section>\n );\n}\n","import type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\nimport { useEffect, useState } from \"react\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { capabilityLogoFallback } from \"./capability-logo-fallback\";\n\n/** The same passive logo loading path for discovery and connected accounts. */\nexport function ConnectionServiceLogo({\n client,\n item,\n name,\n fallback = null,\n}: {\n client?: OpenGeniClient | undefined;\n item?: CapabilityCatalogItem | undefined;\n name: string;\n fallback?: string | null;\n}) {\n const path = item?.logoAssetPath;\n const [image, setImage] = useState<{\n client: OpenGeniClient;\n path: string;\n url: string | null;\n } | null>(null);\n useEffect(() => {\n if (!client || !path?.startsWith(\"catalog-assets/\")) return;\n const abort = new AbortController();\n let url: string | null = null;\n void client\n .downloadCatalogAsset(path, { signal: abort.signal })\n .then((blob) => {\n if (!abort.signal.aborted && blob.type.startsWith(\"image/\") && blob.size <= 2_000_000)\n url = URL.createObjectURL(blob);\n })\n .catch(() => {})\n .finally(() => {\n if (!abort.signal.aborted) setImage({ client, path, url });\n });\n return () => {\n abort.abort();\n if (url) URL.revokeObjectURL(url);\n };\n }, [client, path]);\n const current = image && image.client === client && image.path === path ? image : null;\n const loading = Boolean(client && path?.startsWith(\"catalog-assets/\") && !current);\n return (\n <ConnectionLogo\n name={name}\n loading={loading}\n src={\n current?.url ??\n (loading ? null : ((item ? capabilityLogoFallback(item) : null) ?? fallback))\n }\n />\n );\n}\n","import type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport gmailLogo from \"./assets/gmail.ico\";\n\n/** Passive catalogue identity, shared by embedded and console surfaces. */\nexport function capabilityLogoFallback(\n item: Pick<CapabilityCatalogItem, \"id\"> &\n Partial<Pick<CapabilityCatalogItem, \"metadata\" | \"mcpUrl\">>,\n): string | null {\n if (\n item.id.startsWith(\"mcp:integrations-sh:gmailmcp-googleapis-com-\") ||\n item.mcpUrl === \"https://gmailmcp.googleapis.com/mcp/v1\"\n )\n return gmailLogo;\n const original = item.metadata?.originalLogoUrl;\n if (typeof original !== \"string\") return null;\n try {\n const url = new URL(original);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : null;\n } catch {\n return null;\n }\n}\n","import type { ConnectAccount } from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem, OpenGeniClient } from \"@opengeni/sdk\";\nimport { ConnectionServiceLogo } from \"./connection-service-logo\";\nimport {\n accountServiceCapability,\n connectionServicePresentation,\n} from \"./connection-service-presentation\";\n\n/** Service presentation never changes which exact credential is acted on. */\nexport function ConnectAccountIdentity({\n account,\n client,\n capabilities,\n}: {\n account: ConnectAccount;\n client?: OpenGeniClient | undefined;\n capabilities: CapabilityCatalogItem[];\n}) {\n const item = accountServiceCapability(account, capabilities);\n const service = connectionServicePresentation({ id: account.providerId, label: account.label });\n const name = item?.name ?? service.name;\n return (\n <>\n <ConnectionServiceLogo client={client} item={item} name={name} fallback={service.logo} />\n <div>\n <strong>{name}</strong>\n <small>\n {account.ownership === \"personal\" ? \"Only you\" : \"Workspace connection\"}\n {name !== account.label ? ` · ${account.label}` : \"\"}\n </small>\n </div>\n </>\n );\n}\n","/** Reserve the same row geometry as the loaded connection list. */\nexport function ConnectionSkeleton({ rows = 1, label }: { rows?: number; label: string }) {\n return (\n <div role=\"status\" aria-label={label} className=\"og-connection-skeleton\">\n {Array.from({ length: rows }, (_, index) => (\n <div className=\"og-connection-skeleton-row\" aria-hidden=\"true\" key={index}>\n <span className=\"og-connection-skeleton-mark\" />\n <span className=\"og-connection-skeleton-copy\">\n <span />\n <span />\n </span>\n </div>\n ))}\n </div>\n );\n}\n","import { ConnectAccounts } from \"./connect-accounts\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nimport { useConnect } from \"./hooks/use-connect\";\nimport type { OpenGeniClient } from \"@opengeni/sdk\";\nimport { useState } from \"react\";\nimport { connectionServicePresentation } from \"./connection-service-presentation\";\nimport { ConnectionDiscovery } from \"./connection-discovery\";\n\nexport type ConnectPanelProps = ConnectSetupProps & {\n returnUrl: string;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null;\n showAccounts?: boolean;\n /** Presentation only; the host backend owns acquisition admission. */\n showCustomConnections?: boolean;\n /** Include ready, non-custom adapters from the host's Connect catalogue. */\n showProviderConnections?: boolean;\n presentation?: \"select\" | \"catalog\";\n client?: OpenGeniClient | undefined;\n};\n\n/** Optional composition over the same unstyled surfaces. Import\n * @opengeni/react/connect.css for styling; the host retains navigation,\n * transport, actor admission, and controller lifetime. */\nexport function ConnectPanel({\n returnUrl,\n title = \"Connections\",\n showAccounts = true,\n showCustomConnections = true,\n showProviderConnections = false,\n presentation = \"select\",\n className,\n client,\n ...setup\n}: ConnectPanelProps) {\n const { attempt } = useConnect(setup.controller);\n const [inventoryRevision, setInventoryRevision] = useState(0);\n // Unknown/failed outcomes still need reconciliation or cancellation, not a\n // competing new acquisition. Unmounting observers never cancels controller work.\n const activeSetup =\n attempt !== null && ![\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const serviceName = attempt\n ? connectionServicePresentation({ id: attempt.providerId, label: \"\" }).name\n : \"\";\n return (\n <div className={[\"og-connect\", className].filter(Boolean).join(\" \")}>\n {title !== null && <h2>{title}</h2>}\n {showAccounts && !activeSetup && (\n <ConnectAccounts\n key={inventoryRevision}\n controller={setup.controller}\n returnUrl={returnUrl}\n client={client}\n onDisconnected={() => setInventoryRevision((value) => value + 1)}\n />\n )}\n {!activeSetup &&\n (client && presentation === \"catalog\" ? (\n <>\n <ConnectionDiscovery\n key={inventoryRevision}\n controller={showProviderConnections ? setup.controller : undefined}\n client={client}\n workspaceId={setup.controller.workspaceId}\n returnUrl={returnUrl}\n onConfigured={() => setInventoryRevision((value) => value + 1)}\n />\n {showCustomConnections && (\n <details className=\"og-connect-secondary\">\n <summary>Custom connection</summary>\n <ConnectChooser\n customOnly\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n </details>\n )}\n </>\n ) : (\n <ConnectChooser\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n ))}\n {activeSetup && (\n <ConnectSetup\n {...setup}\n authorizeLabel={\n setup.authorizeLabel ??\n (serviceName ? `Continue to ${serviceName}` : \"Authorize connection\")\n }\n />\n )}\n </div>\n );\n}\n","import type { ConnectAccount, ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport {\n capabilityConnectProviderId,\n connectionServicePresentation,\n isServiceConnectProvider,\n} from \"./connection-service-presentation\";\nimport type { CapabilityCatalogItem, ConnectionMetadata, OpenGeniClient } from \"@opengeni/sdk\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\nimport { ConnectionSkeleton } from \"./connection-skeleton\";\nimport { ConnectionServiceLogo } from \"./connection-service-logo\";\nimport { McpConnectionCard } from \"./components/session-mcp-capability-card\";\nimport { mcpConnectionDiscoveryState } from \"./mcp-connection-status\";\n\nexport type ConnectionDiscoveryProps = {\n client: OpenGeniClient;\n controller?: ConnectController | undefined;\n workspaceId: string;\n returnUrl: string;\n onConfigured?: (() => void | Promise<void>) | undefined;\n};\n\n/** Service discovery over the native catalogue. No host-owned OAuth state or\n * assumed account selection: details resolve current authority before acting. */\nexport function ConnectionDiscovery(props: ConnectionDiscoveryProps) {\n const [scope, setScope] = useState({ client: props.client, controller: props.controller });\n const [generation, setGeneration] = useState(0);\n if (scope.client !== props.client || scope.controller !== props.controller) {\n setScope({ client: props.client, controller: props.controller });\n setGeneration(generation + 1);\n }\n return <ScopedDiscovery key={`${generation}:${props.workspaceId}`} {...props} />;\n}\n\nfunction ScopedDiscovery({\n client,\n controller,\n workspaceId,\n returnUrl,\n onConfigured,\n}: ConnectionDiscoveryProps) {\n const [providers, setProviders] = useState<ConnectProvider[] | null>(null);\n const [accounts, setAccounts] = useState<ConnectAccount[]>([]);\n const [selectedProvider, setSelectedProvider] = useState<ConnectProvider | null>(null);\n const [providerFailed, setProviderFailed] = useState(false);\n const [items, setItems] = useState<CapabilityCatalogItem[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [connections, setConnections] = useState<ConnectionMetadata[]>([]);\n const [reload, setReload] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [limit, setLimit] = useState(12);\n const [selected, setSelected] = useState<CapabilityCatalogItem | null>(null);\n const opener = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const abort = new AbortController();\n // Capture each read independently: even a synchronously throwing transport\n // is captured by Promise.all, and cannot strand another read's rejection.\n const read = async <T,>(operation: () => Promise<T>): Promise<T> => {\n abort.signal.throwIfAborted();\n return operation();\n };\n setFailed(false);\n setSelectedProvider(null);\n setProviders(null);\n setItems(null);\n setProviderFailed(false);\n if (controller)\n void Promise.all([\n read(() => controller.transport.catalog(workspaceId, { signal: abort.signal })),\n read(() => controller.transport.accounts(workspaceId, { signal: abort.signal })),\n ])\n .then(([catalog, inventory]) => {\n if (!abort.signal.aborted) {\n setProviders(catalog.filter(isServiceConnectProvider));\n setAccounts(inventory);\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setProviderFailed(true);\n });\n void Promise.all([\n read(() => client.listCapabilities(workspaceId)),\n read(() => client.listConnections(workspaceId)),\n ])\n .then(([catalog, inventory]) => {\n if (!abort.signal.aborted) {\n setConnections(inventory);\n setItems(\n catalog.items.filter(\n (item) =>\n item.kind === \"mcp\" &&\n item.authKind === \"oauth2\" &&\n Boolean(item.mcpUrl ?? item.endpointUrl),\n ),\n );\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => {\n abort.abort();\n };\n }, [client, controller, workspaceId, reload]);\n const matches =\n items?.filter((item) =>\n `${item.name} ${item.description ?? \"\"} ${item.providerDomain ?? \"\"}`\n .toLocaleLowerCase()\n .includes(query.trim().toLocaleLowerCase()),\n ) ?? [];\n const providerMatches = (providers ?? []).filter(\n (provider) =>\n !items?.some((item) => capabilityConnectProviderId(item) === provider.id) &&\n provider.label.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()),\n );\n const loading = (!items && !failed) || Boolean(controller && !providers && !providerFailed);\n if (selectedProvider && controller)\n return (\n <section aria-label={`Connect ${selectedProvider.label}`}>\n <button type=\"button\" onClick={() => setSelectedProvider(null)}>\n Back to connections\n </button>\n <ConnectionLogo\n name={selectedProvider.label}\n src={connectionServicePresentation(selectedProvider).logo}\n />\n <ConnectChooser\n controller={controller}\n returnUrl={returnUrl}\n presentation=\"catalog\"\n providerOnly\n initialProviderId={selectedProvider.id}\n />\n </section>\n );\n return (\n <section className=\"og-connection-discovery\" aria-label=\"Find a connection\">\n <h3>Add a connection</h3>\n <label>\n <span className=\"og-capability-catalog-sr-only\">Search services</span>\n <input\n type=\"search\"\n placeholder=\"Search services…\"\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n setLimit(12);\n }}\n />\n </label>\n {(providerFailed || failed) && (\n <p role=\"alert\">\n Some services could not be loaded.{\" \"}\n <button type=\"button\" onClick={() => setReload((value) => value + 1)}>\n Retry\n </button>\n </p>\n )}\n <div className=\"og-connection-discovery-results\">\n {providerMatches.map((provider) => {\n const connected = accounts.some(\n (account) => account.providerId === provider.id && account.status === \"connected\",\n );\n return (\n <CapabilityCatalogRow\n key={provider.id}\n name={provider.label}\n icon={\n <ConnectionLogo\n name={provider.label}\n src={connectionServicePresentation(provider).logo}\n />\n }\n status={connected ? \"added\" : \"available\"}\n statusLabel={connected ? \"Connected\" : \"Connect\"}\n showStatusLabel\n onOpen={() => setSelectedProvider(provider)}\n />\n );\n })}\n {matches.slice(0, limit).map((item) => {\n const state = mcpConnectionDiscoveryState(item, connections);\n return (\n <CapabilityCatalogRow\n key={item.id}\n name={item.name}\n description={item.description ?? undefined}\n icon={<ConnectionServiceLogo client={client} item={item} name={item.name} />}\n status={state.status}\n statusLabel={state.label}\n showStatusLabel\n onOpen={() => {\n opener.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n setSelected(item);\n }}\n />\n );\n })}\n\n {loading && <ConnectionSkeleton rows={3} label=\"Loading services\" />}\n {!loading && !failed && !providerFailed && !matches.length && !providerMatches.length && (\n <p role=\"status\">No services match your search.</p>\n )}\n {matches.length > limit && (\n <button type=\"button\" onClick={() => setLimit((value) => value + 12)}>\n Show more services\n </button>\n )}\n </div>\n {selected ? (\n <McpConnectionCard\n client={client}\n workspaceId={workspaceId}\n capabilityId={selected.id}\n name={selected.name}\n returnUrl={returnUrl}\n dialogOnly\n onClose={() => {\n setSelected(null);\n queueMicrotask(() => {\n if (opener.current?.isConnected) opener.current.focus();\n });\n }}\n onConfigured={async () => {\n setReload((value) => value + 1);\n await onConfigured?.();\n }}\n />\n ) : null}\n </section>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { copyTextToClipboard } from \"./clipboard\";\n\nexport type DeviceAuthorizationProps = {\n userCode: string;\n verificationUri: string;\n providerLabel?: string;\n description?: string;\n className?: string;\n codeAttributes?: Record<`data-${string}`, string>;\n loadClipboard?: () => Promise<{ copyTextToClipboard(text: string): Promise<boolean> }>;\n onCopyResult?: (copied: boolean) => void;\n /** Optional host presentation; clipboard state and URL validation remain shared. */\n render?: (state: {\n copied: boolean;\n copyError: boolean;\n copy: () => Promise<void>;\n verificationHref: string | undefined;\n }) => ReactNode;\n};\n\n/** Optional presentation for the existing model-account device APIs. It neither\n * owns provider state nor assumes that opening a verification page completed it. */\nexport function DeviceAuthorization(props: DeviceAuthorizationProps) {\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState(false);\n const generation = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n generation.current++;\n setCopied(false);\n setCopyError(false);\n return () => {\n // This is a live async-operation counter, not a captured DOM ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n if (timer.current) clearTimeout(timer.current);\n };\n }, [props.userCode]);\n async function copy() {\n const revision = ++generation.current;\n if (timer.current) clearTimeout(timer.current);\n setCopied(false);\n setCopyError(false);\n try {\n const clipboard = props.loadClipboard ? await props.loadClipboard() : { copyTextToClipboard };\n if (revision !== generation.current) return;\n const success = await clipboard.copyTextToClipboard(props.userCode);\n if (revision !== generation.current) return;\n setCopied(success);\n setCopyError(!success);\n props.onCopyResult?.(success);\n if (success)\n timer.current = setTimeout(() => {\n if (revision === generation.current) setCopied(false);\n }, 1600);\n } catch {\n if (revision !== generation.current) return;\n setCopyError(true);\n props.onCopyResult?.(false);\n }\n }\n let href: string | undefined;\n try {\n const url = new URL(props.verificationUri);\n if ([\"https:\", \"http:\"].includes(url.protocol) && !url.username && !url.password)\n href = props.verificationUri;\n } catch {\n /* A malformed provider URL must never become an executable link. */\n }\n if (props.render) return props.render({ copied, copyError, copy, verificationHref: href });\n return (\n <section className={`og-connect ${props.className ?? \"\"}`} aria-label=\"Device authorization\">\n <p>{props.description ?? `Enter this code at ${props.providerLabel ?? \"the provider\"}.`}</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <code {...props.codeAttributes} style={{ overflowWrap: \"anywhere\" }}>\n {props.userCode}\n </code>\n <button\n type=\"button\"\n aria-label={copied ? \"Code copied\" : \"Copy code\"}\n onClick={() => void copy()}\n >\n {copied ? \"Copied\" : \"Copy code\"}\n </button>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n Open {props.providerLabel ?? \"auth page\"}\n </a>\n ) : (\n <span role=\"alert\">Authorization address unavailable.</span>\n )}\n </div>\n {copyError ? <p role=\"alert\">Couldn't copy the code. Copy it manually instead.</p> : null}\n <p role=\"status\">Waiting for authorization…</p>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n ExternalIdentityLink,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLinkPreview,\n} from \"@opengeni/sdk\";\n\nexport type IdentityLinkClient = {\n previewIdentityLink(\n workspaceId: string,\n linkId: string,\n challenge: string,\n ): Promise<ExternalIdentityLinkPreview>;\n confirmIdentityLink(\n workspaceId: string,\n linkId: string,\n input: ConfirmExternalIdentityLinkRequest,\n ): Promise<ExternalIdentityLink>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\nexport type IdentityLinkConsentProps = {\n client: IdentityLinkClient;\n workspaceId: string;\n linkId: string;\n challenge: string;\n /** Host label is explanatory, never proof of the requesting application. */\n className?: string;\n onComplete?: (link: ExternalIdentityLink) => void;\n};\n\n/** Optional native-login consent. Ordinary Connect does not use this surface.\n * Permission choices only narrow the server's request; no automatic approval. */\nexport function IdentityLinkConsent({\n client,\n workspaceId,\n linkId,\n challenge,\n className,\n onComplete,\n}: IdentityLinkConsentProps) {\n const [link, setLink] = useState<ExternalIdentityLink | null>(null);\n const [preview, setPreview] = useState<ExternalIdentityLinkPreview | null>(null);\n const [selected, setSelected] = useState<ExternalIdentityLink[\"permissions\"]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const generation = useRef(0);\n useEffect(() => {\n const current = ++generation.current;\n setLink(null);\n setPreview(null);\n setSelected([]);\n setBusy(true);\n setError(false);\n void client\n .previewIdentityLink(workspaceId, linkId, challenge)\n .then(\n (result) => {\n if (generation.current !== current) return;\n setPreview(result);\n setLink(result.link);\n setSelected(result.link.permissions);\n },\n () => {\n if (generation.current === current) setError(true);\n },\n )\n .finally(() => {\n if (generation.current === current) setBusy(false);\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, linkId, challenge, retry]);\n async function mutate(revoke: boolean) {\n if (!link || busy) return;\n const current = generation.current;\n setBusy(true);\n setError(false);\n try {\n const result = revoke\n ? await client.revokeIdentityLink(workspaceId, linkId, link.revision)\n : await client.confirmIdentityLink(workspaceId, linkId, {\n challenge,\n expectedRevision: link.revision,\n permissions: selected,\n });\n if (generation.current !== current) return;\n setLink(result);\n onComplete?.(result);\n } catch {\n if (generation.current === current) setError(true);\n } finally {\n if (generation.current === current) setBusy(false);\n }\n }\n return (\n <section\n className={[\"og-connect og-identity-link\", className].filter(Boolean).join(\" \")}\n aria-label=\"Link your account\"\n aria-busy={busy}\n >\n <h2>Link your Opengeni account</h2>\n <p>\n Only continue if you started this request in a product you trust. Linking lets that product\n act as your account with the permissions you select. It does not merge accounts or move\n existing work.\n </p>\n {preview && (\n <dl>\n <dt>Organization</dt>\n <dd>{preview.organizationId}</dd>\n <dt>Product user</dt>\n <dd>\n {preview.externalIdentity.externalId} ({preview.externalIdentity.source})\n </dd>\n <dt>Your Opengeni identity</dt>\n <dd>{preview.nativeSubjectId}</dd>\n </dl>\n )}\n {error && (\n <div role=\"alert\">\n This request could not be completed. It may have expired, changed, or require you to sign\n in to the right organization.\n {!link && (\n <button type=\"button\" disabled={busy} onClick={() => setRetry((value) => value + 1)}>\n Try again\n </button>\n )}\n </div>\n )}\n {!link && busy && <p role=\"status\">Loading the account-link request…</p>}\n {link?.status === \"pending\" && (\n <>\n <p>\n {link.expiresAt\n ? `Access ends ${new Date(link.expiresAt).toLocaleString()}.`\n : \"Access lasts until you or the product revoke this link.\"}{\" \"}\n Your current permissions still apply.\n </p>\n <fieldset disabled={busy}>\n <legend>Allow these permissions</legend>\n {link.permissions.map((permission) => (\n <label key={permission}>\n <input\n type=\"checkbox\"\n checked={selected.includes(permission)}\n onChange={(event) =>\n setSelected((values) =>\n event.target.checked\n ? [...values, permission]\n : values.filter((value) => value !== permission),\n )\n }\n />\n <span>{permission.replaceAll(\":\", \" · \")}</span>\n </label>\n ))}\n </fieldset>\n <button\n type=\"button\"\n disabled={busy || selected.length === 0}\n onClick={() => void mutate(false)}\n >\n {busy ? \"Saving…\" : \"Allow selected access\"}\n </button>\n <p>You can close this page without granting access.</p>\n </>\n )}\n {link?.status === \"active\" && (\n <>\n <p role=\"status\">Account linked. Return to your product to continue.</p>\n <button type=\"button\" disabled={busy} onClick={() => void mutate(true)}>\n Revoke this link\n </button>\n </>\n )}\n {link?.status === \"revoked\" && (\n <p role=\"status\">Link revoked. Your Opengeni account and existing work are unchanged.</p>\n )}\n {link?.status === \"expired\" && (\n <p role=\"status\">This request has expired. Start a new request from your product.</p>\n )}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ExternalIdentityLink, ExternalIdentityLinkPage } from \"@opengeni/sdk\";\n\nexport type IdentityLinkAccountsClient = {\n listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\n\n/** Participant-scoped inventory. Revocation never deletes native work or merges\n * identities. The caller remounts this component when the signed-in user changes. */\nexport function IdentityLinkAccounts({\n client,\n workspaceId,\n}: {\n client: IdentityLinkAccountsClient;\n workspaceId: string;\n}) {\n const [links, setLinks] = useState<ExternalIdentityLink[]>([]);\n const [cursor, setCursor] = useState<string | null>(null);\n const [busy, setBusy] = useState(true);\n const [error, setError] = useState(false);\n const [revision, setRevision] = useState(0);\n const generation = useRef(0);\n const inFlight = useRef(false);\n useEffect(() => {\n const current = ++generation.current;\n inFlight.current = true;\n setLinks([]);\n setCursor(null);\n setBusy(true);\n setError(false);\n void client\n .listIdentityLinks(workspaceId)\n .then(\n (page) => {\n if (current !== generation.current) return;\n setLinks(page.links);\n setCursor(page.nextCursor);\n },\n () => {\n if (current === generation.current) setError(true);\n },\n )\n .finally(() => {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, revision]);\n\n async function act(link?: ExternalIdentityLink) {\n if (inFlight.current || (!link && !cursor)) return;\n const current = generation.current;\n inFlight.current = true;\n setBusy(true);\n setError(false);\n try {\n if (link) {\n const updated = await client.revokeIdentityLink(workspaceId, link.id, link.revision);\n if (current === generation.current)\n setLinks((values) =>\n values.map((value) => (value.id === updated.id ? { ...value, ...updated } : value)),\n );\n } else {\n const page = await client.listIdentityLinks(workspaceId, cursor!);\n if (current === generation.current) {\n setLinks((values) => [\n ...new Map([...values, ...page.links].map((value) => [value.id, value])).values(),\n ]);\n setCursor(page.nextCursor);\n }\n }\n } catch {\n if (current === generation.current) setError(true);\n } finally {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n }\n return (\n <section\n className=\"og-connect og-identity-link\"\n aria-label=\"Linked product access\"\n aria-busy={busy}\n >\n <h2>Linked product access</h2>\n <p>\n Manage products allowed to act as your account in this organization. Revoking a link stops\n future linked access; it does not delete your work or undo an operation already started.\n </p>\n {/* The links sit in one card under the heading, like a settings section;\n the empty and loading lines are rows of that card. */}\n <div className=\"og-identity-link-card\">\n {error && (\n <div role=\"alert\">\n Could not update account links. Reload to see current access.\n <button type=\"button\" disabled={busy} onClick={() => setRevision((value) => value + 1)}>\n Reload links\n </button>\n </div>\n )}\n {busy && <p role=\"status\">Loading account links…</p>}\n {!busy && !error && links.length === 0 && (\n <p>No products have linked access to this account.</p>\n )}\n <ul>\n {links.map((link) => (\n <li key={link.id}>\n <p>\n {link.externalIdentity?.source || \"Product identity\"}{\" \"}\n <code>{link.externalIdentity?.externalId ?? link.externalIdentityId}</code>\n </p>\n <p>\n Status: {link.status}.{\" \"}\n {link.expiresAt\n ? `Expires ${new Date(link.expiresAt).toLocaleString()}.`\n : \"No automatic expiry.\"}\n </p>\n <p>{link.permissions.join(\", \")}</p>\n {(link.status === \"active\" || link.status === \"pending\") && (\n <button type=\"button\" disabled={busy} onClick={() => void act(link)}>\n Revoke access\n </button>\n )}\n </li>\n ))}\n </ul>\n {cursor && (\n <button type=\"button\" disabled={busy} onClick={() => void act()}>\n Load more links\n </button>\n )}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type ConnectionInstalledItem = {\n id: string;\n name: string;\n status: string;\n showStatus?: boolean;\n icon?: ReactNode;\n needsAttention?: boolean;\n disabled?: boolean;\n onOpen: () => void;\n};\n\n/** Compact account/service shortcuts. The host supplies authoritative status. */\nexport function ConnectionInstalled({\n items,\n title = \"Connected\",\n className = \"\",\n}: {\n items: ConnectionInstalledItem[];\n title?: string;\n className?: string;\n}) {\n if (!items.length) return null;\n return (\n <section aria-label={title} className={`og-connection-installed ${className}`}>\n <h2>\n {title} <span>{items.length}</span>\n </h2>\n <div>\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onOpen}\n disabled={item.disabled}\n title={item.status}\n aria-label={`${item.name} · ${item.status}`}\n >\n {item.icon}\n <span>{item.name}</span>\n {item.showStatus ? (\n <span className=\"og-connection-installed-status\">{item.status}</span>\n ) : null}\n {item.needsAttention ? <span aria-label=\"Needs attention\">!</span> : null}\n </button>\n ))}\n </div>\n </section>\n );\n}\n","import { useId } from \"react\";\nexport type ConnectionType = \"mcp\" | \"openapi\" | \"graphql\";\nexport function ConnectionTypePicker({\n value,\n onChange,\n disabled = false,\n}: {\n value: ConnectionType;\n onChange: (value: ConnectionType) => void;\n disabled?: boolean;\n}) {\n const name = useId();\n return (\n <fieldset className=\"og-connection-type-picker\" disabled={disabled}>\n <legend>Connection type</legend>\n {(\n [\n [\"mcp\", \"MCP server\"],\n [\"openapi\", \"OpenAPI\"],\n [\"graphql\", \"GraphQL\"],\n ] as const\n ).map(([type, label]) => (\n <label key={type} data-selected={value === type}>\n <input\n type=\"radio\"\n name={name}\n value={type}\n checked={value === type}\n onChange={() => onChange(type)}\n />\n {label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import { createDiscoveryCache } from \"./discovery-cache\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { PluginDiscoveryItem, PluginDiscoveryPage } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();\nconst spacedName = (name: string) => name.replace(/-/g, \" \");\nconst EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();\n\nexport type PluginDiscoveryProps = {\n client: {\n discoverPlugins(\n workspaceId: string,\n options?: { query?: string; provider?: string; offset?: number },\n ): Promise<PluginDiscoveryPage>;\n };\n workspaceId: string;\n query: string;\n /** Initially selected registry. Users can still switch registries or browse all. */\n defaultProvider?: \"\" | \"openai\" | \"anthropic\";\n /** Discovery identities already installed in the current workspace. */\n installedIds?: ReadonlySet<string>;\n resultLimit?: number;\n onShowMore?: () => void;\n onOpen: (item: PluginDiscoveryItem) => void;\n /** Display name for a registry slug. Defaults to the slug with dashes as spaces. */\n formatName?: (name: string) => string;\n /** The row tile. Defaults to the plugin logo with a glyph fallback. */\n renderIcon?: (item: PluginDiscoveryItem) => ReactNode;\n};\nexport function PluginDiscovery(props: PluginDiscoveryProps) {\n const [provider, setProvider] = useState(props.defaultProvider ?? \"\");\n return (\n <section\n className={`og-plugin-discovery ${props.resultLimit ? \"og-catalog-overview\" : \"\"}`}\n aria-label=\"Discover plugins\"\n >\n <header>\n <h3>{props.resultLimit ? \"Plugins\" : \"Browse plugins\"}</h3>\n {!props.resultLimit ? (\n <div className=\"og-plugin-filters\" role=\"group\" aria-label=\"Plugin registry\">\n {(\n [\n { value: \"\", label: \"All\" },\n { value: \"openai\", label: \"OpenAI plugin registry\" },\n { value: \"anthropic\", label: \"Anthropic plugin registry\" },\n ] as const\n ).map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={provider === option.value}\n onClick={() => setProvider(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n ) : null}\n </header>\n <Results\n key={`${props.workspaceId}:${props.query}:${provider}`}\n {...props}\n provider={provider}\n />\n </section>\n );\n}\nfunction Results({\n client,\n workspaceId,\n query,\n provider,\n installedIds = EMPTY_INSTALLED_IDS,\n onOpen,\n resultLimit,\n onShowMore,\n formatName = spacedName,\n renderIcon,\n}: PluginDiscoveryProps & { provider: string }) {\n const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));\n const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);\n const [offset, setOffset] = useState(0);\n const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);\n const [total, setTotal] = useState(initial?.total ?? 0);\n const [loading, setLoading] = useState(!initial);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const sentinel = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let active = true;\n const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);\n const cached = discoveryCache.peek(client, cacheKey);\n setLoading(!cached);\n setError(false);\n const timer = setTimeout(\n () => {\n void discoveryCache\n .read(client, cacheKey, () =>\n client.discoverPlugins(workspaceId, { query, provider, offset }),\n )\n .then(\n (page) => {\n if (!active) return;\n setItems((previous) => (offset ? [...previous, ...page.items] : page.items));\n setTotal(page.total);\n setNext(page.nextOffset);\n setLoading(false);\n },\n () => {\n if (active) {\n setError(true);\n setLoading(false);\n }\n },\n );\n },\n cached || offset ? 0 : 200,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, provider, offset, retry]);\n useEffect(() => {\n if (resultLimit || loading || error || next === null || !sentinel.current) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) setOffset(next);\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(sentinel.current);\n return () => observer.disconnect();\n }, [loading, error, next, resultLimit]);\n return (\n <>\n {!loading && !error ? (\n <p role=\"status\">\n {total\n ? \"Bundles of skills and connections\"\n : query.trim()\n ? `No matches for “${query.trim()}”.`\n : \"No plugins in this registry.\"}\n </p>\n ) : null}\n <div className=\"og-plugin-discovery-grid\">\n {items.slice(0, resultLimit).map((item) => (\n <CapabilityCatalogRow\n key={item.id}\n data-plugin-id={item.id}\n name={formatName(item.displayName)}\n description={item.description}\n status={installedIds.has(item.id) ? \"added\" : \"available\"}\n statusLabel={installedIds.has(item.id) ? \"Installed\" : \"Available to install\"}\n onOpen={() => onOpen(item)}\n icon={\n renderIcon ? (\n renderIcon(item)\n ) : (\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n )\n }\n />\n ))}\n </div>\n {loading ? <p role=\"status\">Loading plugins…</p> : null}\n {error ? (\n <p role=\"alert\">\n Couldn’t load plugins.{\" \"}\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </p>\n ) : null}\n {resultLimit && !loading && !error && total > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all plugins\n </button>\n ) : null}\n <div ref={sentinel}>\n {!resultLimit && next !== null && !loading && !error ? (\n <button className=\"og-plugin-more\" type=\"button\" onClick={() => setOffset(next)}>\n Show more plugins\n </button>\n ) : null}\n </div>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { pluginMcpUnavailableReason, type PluginDiscoveryItem } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { Markdown } from \"./components/markdown\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst componentLabels: Record<string, string> = {\n skills: \"Skills\",\n mcp: \"MCP connections\",\n apps: \"Hosted apps\",\n hooks: \"Hooks\",\n agents: \"Agents\",\n commands: \"Commands\",\n lsp: \"Language servers\",\n};\n\nconst EMPTY_CONNECTIONS: Record<string, boolean> = {};\n\n/** Embeddable plugin overview. Hosts own the dialog and installation actions. */\nexport function PluginDetails({\n item,\n onInstall,\n busy = false,\n installed = false,\n error,\n connections = EMPTY_CONNECTIONS,\n onConnect,\n}: {\n item: PluginDiscoveryItem;\n onInstall?: () => void;\n busy?: boolean;\n installed?: boolean;\n error?: string | null;\n connections?: Record<string, boolean>;\n onConnect?: (server: { name: string; endpoint: string | null }) => void;\n}) {\n const supported = (server: NonNullable<PluginDiscoveryItem[\"mcpServers\"]>[number]) =>\n pluginMcpUnavailableReason(server) === null;\n const contentsUnknown = item.skills == null || item.mcpServers == null;\n const installableCount =\n (item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);\n const exceedsInstallLimit = installableCount > 64;\n const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;\n const [expanded, setExpanded] = useState(false);\n const description = item.longDescription || item.description;\n const lengthy = description.length > 700;\n const registryLabel =\n item.provider === \"openai\"\n ? \"OpenAI plugin registry\"\n : item.provider === \"anthropic\"\n ? \"Anthropic plugin registry\"\n : \"Custom source\";\n return (\n <article className=\"og-plugin-details\">\n <header className=\"og-plugin-details-header\">\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n <div>\n <h2>{item.displayName.replace(/-/g, \" \")}</h2>\n {item.author?.name ? <p>By {item.author.name}</p> : null}\n </div>\n </header>\n <div className=\"og-plugin-details-meta\">\n <span>{registryLabel}</span>\n {item.category ? <span>{item.category}</span> : null}\n {item.version ? <span>v{item.version}</span> : null}\n </div>\n <section className=\"og-plugin-details-members\">\n <h3>\n Skills <span>{item.skills?.length ?? \"—\"}</span>\n </h3>\n {item.skills?.length ? (\n <ul>\n {item.skills.map((skill) => (\n <li key={skill.sourceUrl}>\n <a href={skill.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <strong>{skill.name}</strong>\n <span aria-hidden=\"true\">↗</span>\n </a>\n </li>\n ))}\n </ul>\n ) : (\n <p>\n {item.skills\n ? \"No bundled skills.\"\n : \"Contents haven’t been indexed for this repository.\"}\n </p>\n )}\n <h3>\n MCP servers <span>{item.mcpServers?.length ?? \"—\"}</span>\n </h3>\n {item.mcpServers?.length ? (\n <ul>\n {item.mcpServers.map((server) => {\n const connected = Boolean(server.endpoint && connections[server.endpoint]);\n // Existing connections remain manageable regardless of the source manifest's setup requirements.\n const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);\n return (\n <li\n key={server.name}\n className={unavailableReason ? \"og-plugin-member-disabled\" : undefined}\n >\n <div className=\"og-plugin-server-heading\">\n <strong>{server.name}</strong>\n {!unavailableReason && onConnect ? (\n <button type=\"button\" disabled={busy} onClick={() => onConnect(server)}>\n {connected ? \"Manage\" : \"Connect\"}\n </button>\n ) : null}\n </div>\n <small>\n {connected ? \"Connected · \" : \"\"}\n {unavailableReason ?? server.endpoint}\n </small>\n </li>\n );\n })}\n </ul>\n ) : (\n <p>\n {item.mcpServers ? \"No bundled MCP servers.\" : \"Server details haven’t been indexed.\"}\n </p>\n )}\n {item.components?.some((component) => ![\"skills\", \"mcp\"].includes(component)) ? (\n <div className=\"og-plugin-details-other\">\n Not installed here:{\" \"}\n {item.components\n .filter((component) => ![\"skills\", \"mcp\"].includes(component))\n .map((component) => componentLabels[component] ?? component)\n .join(\", \")}\n </div>\n ) : null}\n </section>\n <section className=\"og-plugin-details-overview\" aria-label=\"Overview\">\n <div className={lengthy && !expanded ? \"og-plugin-details-excerpt\" : undefined}>\n <Markdown>{description}</Markdown>\n </div>\n {lengthy ? (\n <button\n type=\"button\"\n className=\"og-plugin-details-more\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </section>\n <footer>\n {item.sourceUrl ? (\n <a href={item.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n View repository <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n {onInstall ? (\n <button\n className=\"og-plugin-install\"\n type=\"button\"\n disabled={!installable || busy || installed}\n onClick={onInstall}\n >\n {installed ? \"Installed\" : busy ? \"Installing…\" : \"Install plugin\"}\n </button>\n ) : null}\n {error ? <p role=\"alert\">{error}</p> : null}\n {exceedsInstallLimit ? (\n <p>This plugin exceeds the current 64-component installation limit.</p>\n ) : contentsUnknown ? (\n <p>\n Plugin contents are unavailable. Installation is disabled until the repository can be\n inspected.\n </p>\n ) : !installable ? (\n <p>No installable skills or remote MCP servers.</p>\n ) : (\n <p>Installs skills and adds connection references. Connect each server separately.</p>\n )}\n </footer>\n </article>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,SAAS,mBAAmB,WAAW,aAAa,gBAAgB;AAkDhE,SACE,KADF;AA3BJ,IAAM,SAAkD;AAAA,EACtD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AACX;AAGO,SAAS,2BAA2B;AAAA,EACzC,SAAS;AAAA,EACT;AAAA,EACA,YAAY;AACd,GAIG;AACD,QAAM,OACJ,WAAW,UACP,YACA,WAAW,eAAe,WAAW,gBACnC,oBACA,WAAW,YACT,cACA;AACV,SACE,qBAAC,UAAK,WAAU,mCAAkC,eAAa,QAC7D;AAAA,wBAAC,QAAK,eAAY,QAAO;AAAA,IACzB;AAAA,MAAC;AAAA;AAAA,QACC,WACE,aAAa,WAAW,eAAe,WAAW,gBAC9C,iCACA;AAAA,QAGL,mBAAS,OAAO,MAAM;AAAA;AAAA,IACzB;AAAA,KACF;AAEJ;AAGO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,WAAW,6BAA6B,SAAS;AAAA,MACjD,SAAS;AAAA,MAER;AAAA,eAAO,oBAAC,UAAK,WAAU,8BAA8B,gBAAK,IAAU;AAAA,QACrE,qBAAC,UAAK,WAAU,8BACd;AAAA,8BAAC,YAAQ,gBAAK;AAAA,UACb,cAAc,oBAAC,UAAM,uBAAY,IAAU;AAAA,WAC9C;AAAA,QACA,oBAAC,8BAA2B,QAAgB,OAAO,aAAa,WAAW,iBAAiB;AAAA;AAAA;AAAA,EAC9F;AAEJ;;;AC7FA,SAAS,WAAW,gBAAgC;;;ACC7C,SAAS,qBAAwB,QAAQ,KAAQ,WAAW,IAAI;AACrE,QAAM,UAAU,oBAAI,QAGlB;AACF,SAAO;AAAA,IACL,KAAK,QAAgB,KAA4B;AAC/C,YAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,IAAI,GAAG;AAC1C,aAAO,SAAS,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,QAAQ;AAAA,IAC7D;AAAA,IACA,KAAK,QAAgB,KAAa,OAAqC;AACrE,UAAI,UAAU,QAAQ,IAAI,MAAM;AAChC,UAAI,CAAC,SAAS;AACZ,kBAAU,oBAAI,IAAI;AAClB,gBAAQ,IAAI,QAAQ,OAAO;AAAA,MAC7B;AACA,YAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,UAAI,YAAY,SAAS,UAAU,KAAK,IAAI,EAAG,QAAO,SAAS;AAC/D,cAAQ,OAAO,GAAG;AAClB,aAAO,QAAQ,QAAQ,SAAU,SAAQ,OAAO,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAM;AAC5E,YAAM,QAAQ;AAAA,QACZ,SAAS,KAAK,IAAI,IAAI;AAAA,QACtB,OAAO;AAAA,QACP,SAAS,QAAQ,QAAQ,EAAE,KAAK,KAAK;AAAA,MACvC;AACA,cAAQ,IAAI,KAAK,KAAK;AACtB,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,CAAC,UAAU;AACT,gBAAM,QAAQ;AACd,gBAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,iBAAO;AAAA,QACT;AAAA,QACA,CAAC,UAAU;AACT,cAAI,QAAQ,IAAI,GAAG,MAAM,MAAO,SAAQ,OAAO,GAAG;AAClD,gBAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;;;ADvCA,SAAS,oBAAoB;AAgDvB,SACE,OAAAA,MADF,QAAAC,aAAA;AArCN,IAAM,iBAAiB,qBAAyC;AAgCzD,SAAS,eAAe,OAA4B;AACzD,QAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,QAAM,iBAAiB,SAAS;AAChC,SACE,gBAAAA,MAAC,aAAQ,WAAU,sBAAqB,cAAW,mBACjD;AAAA,oBAAAA,MAAC,YACC;AAAA,sBAAAD,KAAC,QAAI,gBAAM,cAAc,WAAW,QAAQ,kBAAkB,iBAAgB;AAAA,MAC7E,CAAC,MAAM,cACN,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED,IACE;AAAA,OACN;AAAA,IACC,CAAC,QACA,gBAAAA,KAAC,OAAE,kCAAoB,IACrB,MAAM,SAAS,IACjB,gBAAAA,KAAC,OAAE,gEAAkD,IACnD;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEE,GAAG;AAAA,QACJ,OAAO;AAAA;AAAA,MAFF,GAAG,MAAM,WAAW,IAAI,cAAc;AAAA,IAG7C;AAAA,KACF;AAEJ;AAEA,IAAM,WAAW,CAAC,UAAkB;AACpC,IAAM,eAAe,gBAAAA,KAAC,gBAAa,eAAY,QAAO;AACtD,IAAM,qBAAsE,CAAC;AAC7E,IAAM,yBAA8E,CAAC;AAErF,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,OAAO;AACT,GAAwB;AACtB,QAAM,WAAW,KAAK,UAAU,CAAC,aAAa,KAAK,CAAC;AACpD,QAAM,SAAS,eAAe,KAAK,QAAQ,QAAQ;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAoC,UAAU,IAAI;AAC9E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,MAAM,UAAU,KAAK,CAAC,MAAM;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC;AACpC,YAAU,MAAM;AACd,QAAI,SAAS;AACb,aAAS,KAAK;AACd,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,WAAW,eAAe,KAAK,QAAQ,QAAQ;AACrD,eAAW,CAAC,QAAQ;AACpB,QAAI;AACJ,UAAM,SAAS,OAAO,YAAoB;AACxC,UAAI;AACF,cAAM,OAAO,MAAM,eAAe;AAAA,UAAK;AAAA,UAAQ;AAAA,UAAU,MACvD,OAAO,mBAAmB,aAAa,KAAK;AAAA,QAC9C;AACA,YAAI,CAAC,OAAQ;AACb,kBAAU,IAAI;AACd,mBAAW,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,YAAI,CAAC,OAAQ;AACb,cAAM,SACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,QACvD,MAAM,SACN;AACN,cAAM,YACJ,iBAAiB,aAChB,OAAO,WAAW,YAAY,UAAU,OAAO,UAAU;AAC5D,YAAI,YAAY,KAAK,WAAW;AAC9B,kBAAQ,WAAW,MAAM,KAAK,OAAO,CAAC,GAAG,GAAG;AAC5C;AAAA,QACF;AACA,iBAAS,IAAI;AACb,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,YAAQ,WAAW,MAAM,KAAK,OAAO,CAAC,GAAG,WAAW,IAAI,GAAG;AAC3D,WAAO,MAAM;AACX,eAAS;AACT,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,OAAO,UAAU,KAAK,CAAC;AAChD,QAAM,eACJ,QAAQ,MAAM;AAAA,IACZ,CAAC,UACC,CAAC,YAAY,KAAK,CAAC,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,KAAK,YAAY,CAAC;AAAA,EACtF,KAAK,CAAC;AACR,SACE,gBAAAC,MAAC,SAAI,aAAW,SACd;AAAA,oBAAAA,MAAC,SAAI,WAAU,2BACZ;AAAA,kBAAY,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,UACtC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB;AAAA,UACA,QAAQ,MAAM,UAAU;AAAA,UACxB,aAAa,MAAM;AAAA,UACnB,QAAQ,MAAM;AAAA;AAAA,QANT,MAAM;AAAA,MAOb,CACD;AAAA,MACA,aACE;AAAA,QACC;AAAA,QACA,gBAAgB,SAAY,SAAY,KAAK,IAAI,GAAG,cAAc,YAAY,MAAM;AAAA,MACtF,EACC,IAAI,CAAC,UAAU;AACd,cAAM,YAAY,gBAAgB;AAAA,UAChC,CAAC,UACC,MAAM,UAAU,QAAQ,OAAO,EAAE,EAAE,YAAY,MAAM,MAAM,IAAI,YAAY,KAC1E,MAAM,cAAc,QAAQ,OAAO,EAAE,EAAE,YAAY,MAClD,sBAAsB,MAAM,MAAM,GAAG,YAAY,KACjD,MAAM,KAAK,YAAY,MAAM,MAAM,KAAK,YAAY;AAAA,QAC1D;AACA,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,UAAU,CAAC;AAAA,YACX,MAAM,WAAW,MAAM,IAAI;AAAA,YAC3B,aAAa,aAAa,MAAM,MAAM;AAAA,YACtC;AAAA,YACA,QAAQ,CAAC,YAAY,gBAAgB,YAAY,UAAU;AAAA,YAC3D,aACE,CAAC,YAAY,mBAAmB,YAAY,cAAc;AAAA,YAE5D,QAAQ,MAAM,SAAS,MAAM,GAAG;AAAA;AAAA,UAT3B,MAAM;AAAA,QAUb;AAAA,MAEJ,CAAC;AAAA,OACL;AAAA,IACC,eAAe,aAAa,SAAS,YAAY,SAAS,eAAe,CAAC,UACzE,gBAAAA,KAAC,YAAO,WAAU,mBAAkB,MAAK,UAAS,SAAS,YAAY,6BAEvE,IACE;AAAA,IACH,UAAU,gBAAAA,KAAC,OAAE,MAAK,UAAS,kCAAe,IAAO;AAAA,IACjD,QACC,gBAAAC,MAAC,SAAI,MAAK,SAAQ,WAAU,4BAA2B;AAAA;AAAA,MAErD,gBAAAD,KAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,CAAC,UAAU,QAAQ,CAAC,GAAG,mBAErE;AAAA,OACF,IACE;AAAA,IACH,UAAU,CAAC,aAAa,UAAU,CAAC,YAAY,UAAU,CAAC,WAAW,CAAC,QACrE,gBAAAA,KAAC,OAAE,MAAK,UAAU,kCAAmB,KAAK,WAAK,IAC7C;AAAA,KACN;AAEJ;;;AE/MA,SAAS,YAAAE,iBAAgC;AA0DhC,SAiLK,UAjLL,OAAAC,MAuFH,QAAAC,aAvFG;AAtDT,IAAM,cAAuD;AAAA,EAC3D,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAEA,SAAS,sBAAsB,QAAqD;AAClF,MAAI,OAAO,SAAS,UAAU,CAAC,OAAO,gBAAiB,QAAO;AAC9D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO,eAAe;AAC1C,WAAO,IAAI,aAAa,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,WACtD,OAAO,kBACP;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAiBO,SAAS,aAAa,OAA0B;AAIrD,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,MAAM,UAAU;AACnD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,MAAI,UAAU,MAAM,YAAY;AAC9B,aAAS,MAAM,UAAU;AACzB,kBAAc,aAAa,CAAC;AAAA,EAC9B;AACA,SAAO,gBAAAF,KAAC,eAA8B,GAAG,SAAhB,UAAuB;AAClD;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,OAAO,WAAW,UAAU;AAClC,QAAM,CAAC,YAAY,aAAa,IAAIE,UAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,SAAS,CAAC,cAAgD;AAC9D,kBAAc,KAAK;AACnB,QAAI;AACF,WAAK,QAAQ,QAAQ,UAAU,CAAC,EAAE,MAAM,MAAM,cAAc,IAAI,CAAC;AAAA,IACnE,QAAQ;AACN,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF;AACA,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC;AACH,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,oBAAoB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACnE,cAAW;AAAA,QAEX,0BAAAA,KAAC,OAAE,MAAK,UAAS,2CAA6B;AAAA;AAAA,IAChD;AAEJ,QAAM,SAAS,QAAQ;AACvB,QAAM,kBAAkB,sBAAsB,MAAM;AACpD,QAAM,WAAW,CAAC,YAAY,aAAa,SAAS,EAAE,SAAS,QAAQ,KAAK;AAC5E,QAAM,SAAS,CAAC,UAAsC;AACpD,UAAM,eAAe;AACrB,UAAM,OAAO,MAAM;AACnB,UAAM,OAAO,IAAI,SAAS,IAAI;AAC9B,QAAI,KAAK,QAAQ,WAAY;AAC7B,UAAM,MAAM,OAAO,WAAW;AAC9B,QAAI,OAAO,SAAS,eAAe;AACjC,YAAM,SAAS,OAAO;AAAA,QACpB,OAAO,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,MAAM,OAAO,KAAK,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,MACpF;AAEA,WAAK,MAAM;AACX,aAAO,MAAM,KAAK,QAAQ,EAAE,MAAM,eAAe,OAAO,GAAG,GAAG,CAAC;AAAA,IACjE,WAAW,OAAO,SAAS,kBAAkB;AAC3C,YAAM,YAAY,OAAO,KAAK,IAAI,SAAS,KAAK,EAAE;AAClD,UACE,OAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,aAAa,QAAQ,WAAW,UAAU;AAE3F,eAAO,YAAY;AACjB,cAAI,CAAC,gBAAiB,QAAO,KAAK,QAAQ,EAAE,MAAM,WAAW,UAAU,GAAG,GAAG;AAC7E,wBAAc,IAAI;AAClB,cAAI;AACF,kBAAM,gBAAgB,SAAS;AAAA,UACjC,UAAE;AACA,0BAAc,KAAK;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,IACL,WAAW,OAAO,SAAS,oBAAoB;AAC7C,UAAI,OAAO,OAAQ;AACnB,YAAM,cAAc,KAAK,OAAO,UAAU,EAAE,IAAI,MAAM;AACtD,aAAO,MAAM,KAAK,QAAQ,EAAE,MAAM,aAAa,YAAY,GAAG,GAAG,CAAC;AAAA,IACpE,WAAW,OAAO,SAAS,WAAW;AACpC,YAAM,eAAe,KAAK,OAAO,WAAW,EAAE,IAAI,MAAM;AACxD;AAAA,QAAO,MACL,KAAK;AAAA,UACH;AAAA,YACE,MAAM;AAAA,YACN,WAAW,OAAO;AAAA,YAClB,aAAa,OAAO;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,oBAAoB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACnE,cAAW;AAAA,MACX,aAAW,KAAK,QAAQ;AAAA,MAExB;AAAA,wBAAAA,MAAC,SAAI,WAAU,4BACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,0BACV,kBAAQ,cAAc,aAAa,wBAAwB,wBAC9D;AAAA,UACA,gBAAAA,KAAC,OAAE,MAAK,UAAS,WAAU,2BACxB,sBAAY,QAAQ,KAAK,GAC5B;AAAA,UACA,gBAAAA,KAAC,OAAE,WAAU,gCACV,kBAAQ,cAAc,aACnB,4CACA,mDACN;AAAA,WACF;AAAA,QACC,QAAQ,WAAW,gBAAAC,MAAC,OAAE;AAAA;AAAA,UAAU,QAAQ,QAAQ;AAAA,WAAM;AAAA,SACrD,cAAc,KAAK,SAAS,QAAQ,UACpC,gBAAAD,KAAC,OAAE,MAAK,SACL,kBAAQ,OAAO,SAAS,mBACrB,iFACA,gFACN;AAAA,QAED,CAAC,YACA,gBAAAA,KAAC,UAA+C,UAAU,QAAQ,cAAa,OAC7E,0BAAAC,MAAC,cAAS,UAAU,KAAK,QAAQ,YAC9B;AAAA,WAAC,eAAe,kBAAkB,oBAAoB,SAAS,EAAE;AAAA,YAChE,OAAO;AAAA,UACT,IACE,gBAAAD,KAAC,YAAO,gCAAkB,IACxB;AAAA,UACH,QAAQ,UAAU,8BAA8B,OAAO,SAAS,UAC/D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,MAAM,QAAQ,GAAG,OAAO,WAAW,CAAC,CAAC;AAAA,cACjF;AAAA;AAAA,UAED;AAAA,UAED,OAAO,SAAS,iBACf,OAAO,OAAO,IAAI,CAAC,OAAO,MACxB,gBAAAC,MAAC,WACE;AAAA,kBAAM;AAAA,YACN,MAAM,UACL,gBAAAA,MAAC,YAAO,MAAM,SAAS,CAAC,IAAI,UAAU,MAAM,UAAU,cAAa,IACjE;AAAA,8BAAAD,KAAC,YAAO,OAAM,IACX,gBAAM,WAAW,qBAAqB,+BACzC;AAAA,cACC,MAAM,QAAQ,IAAI,CAAC,WAClB,gBAAAA,KAAC,YAA0B,OAAO,OAAO,OACtC,iBAAO,SADG,OAAO,KAEpB,CACD;AAAA,eACH,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,SAAS,CAAC;AAAA,gBAChB,MAAM,MAAM,SAAS,aAAa;AAAA,gBAClC,UAAU,MAAM;AAAA,gBAChB,cAAa;AAAA;AAAA,YACf;AAAA,eAnBQ,MAAM,IAqBlB,CACD;AAAA,UACF,OAAO,SAAS,oBACf,gBAAAC,MAAC,WAAM;AAAA;AAAA,YAEL,gBAAAA,MAAC,YAAO,MAAK,WAAU,UAAQ,MAAC,cAAa,IAC3C;AAAA,8BAAAD,KAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,+BAE1B;AAAA,cACC,OAAO,SAAS,IAAI,CAAC,YACpB,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO,QAAQ;AAAA,kBACf,UAAU,QAAQ,WAAW;AAAA,kBAE5B;AAAA,4BAAQ;AAAA,oBAAM;AAAA,oBAAI,QAAQ;AAAA,oBAAG;AAAA,oBAAG,QAAQ;AAAA,oBAAU;AAAA;AAAA;AAAA,gBAJ9C,QAAQ;AAAA,cAKf,CACD;AAAA,eACH;AAAA,aACF;AAAA,UAED,OAAO,SAAS,sBACf,OAAO,UAAU,IAAI,CAAC,aACpB,gBAAAA,MAAC,WACC;AAAA,4BAAAD,KAAC,WAAM,MAAK,YAAW,MAAK,YAAW,OAAO,SAAS,IAAI;AAAA,YAC1D,SAAS;AAAA,YAAM;AAAA,YAAG,SAAS;AAAA,YAAK;AAAA,eAFvB,SAAS,EAGrB,CACD;AAAA,UACF,OAAO,SAAS,sBAAsB,OAAO,UAC5C,gBAAAC,MAAA,YACE;AAAA,4BAAAD,KAAC,OAAE,2FAA6E;AAAA,YAC/E,qBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,OAAO,MAAM,kBAAkB,gBAAgB,OAAO,CAAC,CAAC;AAAA,gBACxE;AAAA;AAAA,YAED;AAAA,aAEJ;AAAA,UAED,OAAO,SAAS,aACf,gBAAAC,MAAA,YACE;AAAA,4BAAAD,KAAC,OAAE,gEAAkD;AAAA,YACpD,OAAO,WAAW,IAAI,CAAC,cACtB,gBAAAC,MAAC,WACC;AAAA,8BAAAD,KAAC,WAAM,MAAK,YAAW,MAAK,aAAY,OAAO,UAAU,IAAI;AAAA,cAC5D,UAAU;AAAA,cAAM;AAAA,cAAG,UAAU;AAAA,cAAK;AAAA,iBAFzB,UAAU,EAGtB,CACD;AAAA,aACH;AAAA,UAED,CAAC,eAAe,kBAAkB,oBAAoB,SAAS,EAAE;AAAA,YAChE,OAAO;AAAA,UACT,KACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU,OAAO,SAAS,sBAAsB,QAAQ,OAAO,MAAM;AAAA,cAEpE,iBAAO,SAAS,YAAY,uBAAuB;AAAA;AAAA,UACtD;AAAA,UAED,OAAO,SAAS,eACf,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,OAAO,MAAM,YAAY,gBAAgB,OAAO,CAAC,CAAC;AAAA,cAEhE,uBAAa,oCAA+B;AAAA;AAAA,UAC/C;AAAA,UAED,OAAO,SAAS,UACf,gBAAAC,MAAA,YACG;AAAA,mBAAO,YACN,gBAAAA,MAAC,OAAE;AAAA;AAAA,cACkB,gBAAAD,KAAC,UAAM,iBAAO,UAAS;AAAA,eAC5C;AAAA,YAEF,gBAAAA,KAAC,OAAE,gFAAkE;AAAA,YACpE,mBACC,gBAAAA,KAAC,OAAE,MAAM,iBAAiB,QAAO,UAAS,KAAI,uBAAsB,uDAEpE;AAAA,aAEJ;AAAA,UAEF,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,4BAAAD,KAAC,YAAO,MAAK,UAAS,SAAS,MAAM,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,0BAEnE;AAAA,YACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,SAAS,MAAM,OAAO,MAAM,KAAK,OAAO,OAAO,WAAW,CAAC,CAAC,GAAG,0BAErF;AAAA,aACF;AAAA,WACF,KAtIS,GAAG,QAAQ,EAAE,IAAI,QAAQ,QAAQ,EAuI5C;AAAA;AAAA;AAAA,EAEJ;AAEJ;A;;;;;;;;AC5SA,IAAM,WAA4E;AAAA,EAChF,OAAO,EAAE,MAAM,SAAS,MAAM,eAAW,QAAQ,yCAAyC;AAAA,EAC1F,0BAA0B,EAAE,MAAM,gBAAgB,MAAM,gBAAY;AAAA,EACpE,8BAA8B,EAAE,MAAM,oBAAoB,MAAM,gBAAY;AAAA,EAC5E,8BAA8B,EAAE,MAAM,oBAAoB,MAAM,gBAAY;AAC9E;AAEO,SAAS,8BAA8B,UAAiD;AAC7F,UACG,OAAO,OAAO,UAAU,SAAS,EAAE,IAAI,SAAS,SAAS,EAAE,IAAI,WAAc;AAAA,IAC5E,MAAM,SAAS;AAAA,IACf,MAAM;AAAA,EACR;AAEJ;AAEO,SAAS,4BACd,MACoB;AACpB,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC9B,CAAC,CAAC,EAAE,OAAO,MAAM,QAAQ,UAAU,QAAQ,WAAW,KAAK;AAAA,EAC7D,IAAI,CAAC;AACP;AAEO,SAAS,yBAAyB,SAAyB,OAAgC;AAChG,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,eAAe,iBAAiB,QAAQ,EAAE;AACpF,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AAGtC,SAAO,MAAM,KAAK,CAAC,SAAS,4BAA4B,IAAI,MAAM,QAAQ,UAAU;AACtF;AAEO,SAAS,yBAAyB,UAAoC;AAC3E,SACE,SAAS,cAAc,eACvB,SAAS,UAAU,SAAS,KAC5B,SAAS,WAAW,SACpB,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,CAAC,gBAAgB,WAAW,SAAS,EAAE,SAAS,IAAI,CAAC;AAExF;;;ACNI,SA4BA,YAAAG,WA3BE,OAAAC,MADF,QAAAC,aAAA;AAFG,SAAS,oBAAoB,EAAE,OAAO,GAAwC;AACnF,SACE,gBAAAA,MAAC,SAAI,WAAU,yDACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,QAAQ,OAAO,UAAU,OAAO,YAAY,UAAU;AAAA,QACtD,aAAa,OAAO;AAAA,QACpB,iBAAiB,OAAO,UAAU;AAAA,QAClC,QAAQ,OAAO;AAAA;AAAA,IACjB;AAAA,IACC,OAAO,SAAS,gBAAAA,KAAC,UAAK,WAAU,+BAA+B,iBAAO,QAAO,IAAU;AAAA,KAC1F;AAEJ;AAEO,SAAS,qBAAqB,EAAE,QAAQ,GAA0C;AACvF,MAAI,CAAC,QAAQ,QAAQ,OAAQ,QAAO;AACpC,QAAM,YAAY,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,EAAE;AACvE,QAAM,YAAY,QAAQ,QAAQ;AAAA,IAChC,CAAC,WAAW,OAAO,UAAU,eAAe,OAAO,UAAU;AAAA,EAC/D;AACA,QAAM,aACJ,WAAW,UACV,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,SAAS,IACxD,YACA,cAAc,QAAQ,QAAQ,SAC5B,UACA;AACR,QAAM,WACJ,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,UAAK,WAAU,8BAA8B,kBAAQ,MAAK;AAAA,IAC3D,gBAAAC,MAAC,UAAK,WAAU,8BACd;AAAA,sBAAAD,KAAC,YAAQ,kBAAQ,MAAK;AAAA,MACtB,gBAAAA,KAAC,UACE,kBAAQ,QAAQ,WAAW,IACxB,QAAQ,QAAQ,CAAC,GAAG,cACpB,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,EAAE,KAAK,QAAK,GAC7D;AAAA,OACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,OAAO,WAAW,UAAU,GAAG,SAAS,OAAO,QAAQ,QAAQ,MAAM;AAAA;AAAA,IACvE;AAAA,KACF;AAEF,SAAO,QAAQ,QAAQ,WAAW,IAChC,gBAAAC,MAAC,SAAI,WAAU,oCACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ,QAAQ,CAAC,EAAG;AAAA,QACjC,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ,QAAQ,CAAC,EAAG,UAAU,YAAY,UAAU;AAAA,QAC5D,aAAa,QAAQ,QAAQ,CAAC,EAAG;AAAA,QACjC,iBAAiB,QAAQ,QAAQ,CAAC,EAAG,UAAU;AAAA,QAC/C,QAAQ,QAAQ,QAAQ,CAAC,EAAG;AAAA;AAAA,IAC9B;AAAA,IACC,QAAQ,QAAQ,CAAC,GAAG;AAAA,KACvB,IAEA,gBAAAC,MAAC,aAAQ,WAAU,iCACjB;AAAA,oBAAAA,MAAC,aAAQ,WAAU,6BAChB;AAAA;AAAA,MACD,gBAAAD,KAAC,UAAK,eAAW,MAAC,WAAU,+BAA8B,oBAE1D;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,iCACZ,kBAAQ,QAAQ,IAAI,CAAC,WACpB,gBAAAA,KAAC,uBAAoC,UAAX,OAAO,EAAoB,CACtD,GACH;AAAA,KACF;AAEJ;AAEO,SAAS,kBAAkB;AAAA,EAChC,UAAAE;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AACjB,GAA2B;AACzB,QAAM,SAAS,MAAM,KAAK,EAAE,YAAY;AACxC,QAAM,UAAU,UACZA,YACAA,UAAS;AAAA,IAAQ,CAAC,YAChB,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC/B,GAAG;AAAA,MACH,IAAI,GAAG,QAAQ,EAAE,IAAI,OAAO,EAAE;AAAA,MAC9B,MACE,QAAQ,QAAQ,SAAS,KAAK,OAAO,SAAS,QAAQ,OAClD,GAAG,QAAQ,IAAI,SAAM,OAAO,IAAI,KAChC,QAAQ;AAAA,MACd,SAAS,CAAC,MAAM;AAAA,IAClB,EAAE;AAAA,EACJ;AACJ,QAAM,UAAU,QAAQ;AAAA,IAAO,CAAC,YAC9B,CAAC,QAAQ,MAAM,GAAG,QAAQ,QAAQ,QAAQ,CAAC,WAAW,CAAC,OAAO,MAAM,OAAO,eAAe,EAAE,CAAC,CAAC,EAC3F,KAAK,GAAG,EACR,YAAY,EACZ,SAAS,MAAM;AAAA,EACpB;AACA,SACE,gBAAAD,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,SAAI,WAAW,yBAAyB,SAAS,IAAI,gBAAc,SACjE,kBAAQ,SACP,QACG,MAAM,GAAG,WAAW,EACpB,IAAI,CAAC,YAAY,gBAAAA,KAAC,wBAAsC,WAAZ,QAAQ,EAAsB,CAAE,IAE/E,gBAAAA,KAAC,OAAE,MAAK,UAAU,wBAAa,GAEnC;AAAA,IACC,eAAe,QAAQ,SAAS,cAC/B,gBAAAA,KAAC,YAAO,WAAU,mBAAkB,MAAK,UAAS,SAAS,YAAY,kCAEvE,IACE;AAAA,KACN;AAEJ;;;ACjKA,SAAS,YAAAG,iBAAgC;AAmBjC,gBAAAC,YAAA;AAjBD,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AACZ,GAMG;AACD,QAAM,CAAC,WAAW,YAAY,IAAID,UAAwB,IAAI;AAC9D,SACE,gBAAAC,KAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK,GACxF,iBAAO,QAAQ,YACd,gBAAAA,KAAC,SAAI,KAAU,KAAI,IAAG,SAAQ,QAAO,UAAS,SAAQ,SAAS,MAAM,aAAa,GAAG,GAAG,IACtF,UACF,gBAAAA,KAAC,UAAK,WAAU,+BAA8B,IAE7C,YACC,gBAAAA,KAAC,UACE,eACE,MAAM,KAAK,EACX,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE,EACP,MAAM,GAAG,CAAC,EACV,YAAY,GACjB,GAGN;AAEJ;;;ACjCA,SAAS,aAAAC,YAAW,YAAAC,iBAAgC;AA8B3C,SAsHK,YAAAC,WAtHL,OAAAC,MAuHO,QAAAC,aAvHP;AATF,SAAS,eAAe,OAA4B;AAGzD,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,MAAM,UAAU;AACnD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,MAAI,UAAU,MAAM,YAAY;AAC9B,aAAS,MAAM,UAAU;AACzB,kBAAc,aAAa,CAAC;AAAA,EAC9B;AACA,SAAO,gBAAAF,KAAC,iBAAgC,GAAG,SAAhB,UAAuB;AACpD;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,oBAAoB;AACtB,GAAwB;AACtB,QAAM,OAAO,WAAW,UAAU;AAClC,QAAM,CAAC,SAAS,UAAU,IAAIE,UAAmC,IAAI;AACrE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAA2B,CAAC,CAAC;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,CAAC;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,iBAAiB;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,EAAE;AAC7C,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,IAAI,gBAAgB;AAClC,eAAW,IAAI;AACf,gBAAY,CAAC,CAAC;AACd,cAAU,KAAK;AACf,kBAAc,iBAAiB;AAC/B,iBAAa,EAAE;AAEf,SAAK,QAAQ,QAAQ,EAClB,KAAK,MAAM;AACV,YAAM,OAAO,eAAe;AAC5B,aAAO,QAAQ,IAAI;AAAA,QACjB,WAAW,UAAU,QAAQ,WAAW,aAAa,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC7E,iBAAiB,YACb,WAAW,UAAU,SAAS,WAAW,aAAa,EAAE,QAAQ,MAAM,OAAO,CAAC,IAC9E,QAAQ,QAAQ,CAAC,CAAqB;AAAA,MAC5C,CAAC;AAAA,IACH,CAAC,EACA,KAAK,CAAC,CAAC,WAAW,SAAS,MAAM;AAChC,UAAI,CAAC,MAAM,OAAO,SAAS;AACzB;AAAA,UACE;AAAA,YACE,UAAU;AAAA,cACR,CAAC,UACC,MAAM,cAAc,eACpB,MAAM,UAAU,SAAS,MACxB,CAAC,gBACC,MAAM,WAAW,SAChB,CAAC,MAAM,MAAM;AAAA,gBAAK,CAAC,SACjB,CAAC,gBAAgB,WAAW,SAAS,EAAE,SAAS,IAAI;AAAA,cACtD,OACH,CAAC,cACA,MAAM,WAAW,SACjB,MAAM,MAAM;AAAA,gBAAK,CAAC,SAChB,CAAC,gBAAgB,WAAW,SAAS,EAAE,SAAS,IAAI;AAAA,cACtD;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,oBAAY,gBAAgB,SAAS,CAAC;AACtC,cAAM,UAAU,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,iBAAiB;AACxE,YAAI;AACF;AAAA,YACE,QAAQ,UAAU,SAAS,UAAU,KACnC,CAAC,UAAU,WAAW,EAAE,SAAS,QAAQ,MAAM,IAC7C,aACA,QAAQ,UAAU,SAAS,WAAW,IACpC,cACC,QAAQ,UAAU,CAAC,KAAK;AAAA,UACjC;AAAA,MACJ;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,MAAM,OAAO,QAAS,WAAU,IAAI;AAAA,IAC3C,CAAC;AACH,WAAO,MAAM,MAAM,MAAM;AAAA,EAC3B,GAAG,CAAC,YAAY,MAAM,cAAc,YAAY,cAAc,iBAAiB,CAAC;AAChF,QAAM,WAAW,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU;AACjE,QAAM,WACJ,UAAU,cAAc,gBACvB,cAAc,cAAc,cAAc,gBAC3C,SAAS,UAAU,SAAS,SAAS;AACvC,QAAM,SAAS,CAAC,UAAqB;AACnC,UAAM,eAAe;AACrB,QAAI,CAAC,YAAY,KAAK,QAAS,cAAc,cAAc,cAAc,YAAc;AACvF,cAAU,KAAK;AACf,QAAI;AACF,WAAK,WACF,MAAM,EAAE,YAAY,WAAW,WAAW,gBAAgB,OAAO,WAAW,EAAE,CAAC,EAC/E,MAAM,MAAM,UAAU,IAAI,CAAC;AAAA,IAChC,QAAQ;AACN,gBAAU,IAAI;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,YAAY,CAAC,WAAW,QAAQ,WAAW,MAAM,CAAC,OAAQ,QAAO;AACrE,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAW;AAAA,MACX,aAAW,KAAK,QAAS,CAAC,WAAW,CAAC;AAAA,MAErC;AAAA,kBACC,gBAAAD,KAAC,OAAE,MAAK,SAAQ,6FAEhB;AAAA,QAED,CAAC,WAAW,CAAC,UAAU,gBAAAA,KAAC,OAAE,MAAK,UAAS,uCAAoB;AAAA,QAC5D,SAAS,WAAW,KAAK,gBAAAA,KAAC,OAAE,MAAK,UAAS,2CAA6B;AAAA,QACvE,QAAQ,SAAS,MAAM,KACtB,gBAAAA,KAAC,UAAK,UAAU,QACd,0BAAAC,MAAC,cAAS,UAAU,KAAK,MACvB;AAAA,0BAAAD,KAAC,YAAO,QAAQ,cAAc,SAC3B,2BAAiB,YAAY,qBAAqB,0BACrD;AAAA,UACC,iBAAiB,aAAa,CAAC,WAC9B,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAE,MAAC,WAAM,QAAQ,cAAc,SAAS;AAAA;AAAA,cAEpC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,aAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA;AAAA,cAClD;AAAA,eACF;AAAA,YACC;AAAA,cACC;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,QAAS;AAAA,kBAChB,CAAC,UACC,MAAM,cAAc,eACpB,MAAM,WAAW,SACjB,CAAC,MAAM,MAAM;AAAA,oBAAK,CAAC,SACjB,CAAC,gBAAgB,WAAW,SAAS,EAAE,SAAS,IAAI;AAAA,kBACtD;AAAA,gBACJ;AAAA,gBACA,WAAW;AAAA,cACb;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,QAAS;AAAA,kBAChB,CAAC,UACC,MAAM,cAAc,gBACnB,MAAM,WAAW,SAChB,MAAM,MAAM;AAAA,oBAAK,CAAC,SAChB,CAAC,gBAAgB,WAAW,SAAS,EAAE,SAAS,IAAI;AAAA,kBACtD;AAAA,gBACN;AAAA,gBACA,WAAW;AAAA,cACb;AAAA,YACF,EAAE,IAAI,CAAC,UAAU;AACf,oBAAM,UAAU,MAAM,QAAQ;AAAA,gBAAO,CAAC,UACpC,MAAM,MAAM,kBAAkB,EAAE,SAAS,MAAM,kBAAkB,EAAE,KAAK,CAAC;AAAA,cAC3E;AACA,kBAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,oBAAM,OACJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,QAAQ,IAAI,CAAC,UAAU;AAC/B,0BAAM,YAAY,SAAS;AAAA,sBACzB,CAAC,YACC,QAAQ,eAAe,MAAM,MAAM,QAAQ,WAAW;AAAA,oBAC1D;AACA,2BAAO;AAAA,sBACL,IAAI,MAAM;AAAA,sBACV,MAAM,MAAM;AAAA,sBACZ,MACE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK,8BAA8B,KAAK,EAAE;AAAA,0BAC1C,MAAM,MAAM;AAAA;AAAA,sBACd;AAAA,sBAEF,SAAS;AAAA,wBACP;AAAA,0BACE,IAAI,MAAM;AAAA,0BACV,MAAM,MAAM;AAAA,0BACZ,QAAQ,YACJ,cACA,MAAM,cAAc,cAClB,YACA;AAAA,0BACN,OAAO,YACH,UACA,MAAM,cAAc,cAClB,cACA;AAAA,0BACN;AAAA,0BACA,QAAQ,MAAM;AACZ,gCAAI,CAAC,KAAK,MAAM;AACd,4CAAc,MAAM,EAAE;AACtB;AAAA,gCACE,MAAM,UAAU,WAAW,IAAI,MAAM,UAAU,CAAC,IAAK;AAAA,8BACvD;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF,CAAC;AAAA;AAAA,cACH;AAEF,qBAAO,MAAM,aAAa,CAAC,aACzB,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBAEV,MAAM,MAAM,KAAK,IAAI,OAAO;AAAA,kBAE5B;AAAA,oCAAAA,MAAC,aACE;AAAA,4BAAM;AAAA,sBACP,gBAAAD,KAAC,UAAM,kBAAQ,QAAO;AAAA,uBACxB;AAAA,oBACC;AAAA;AAAA;AAAA,gBAPI,MAAM;AAAA,cAQb,IAEA,gBAAAA,KAAC,SAAsB,kBAAb,MAAM,IAAY;AAAA,YAEhC,CAAC;AAAA,YACA,CAAC,QAAS;AAAA,cAAK,CAAC,UACf,MAAM,MAAM,kBAAkB,EAAE,SAAS,MAAM,kBAAkB,EAAE,KAAK,CAAC;AAAA,YAC3E,KAAK,gBAAAA,KAAC,OAAE,MAAK,UAAS,4CAA8B;AAAA,aACtD,IACE;AAAA,UACH,iBAAiB,aAAa,YAAY,CAAC,oBAC1C,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;AACb,8BAAc,EAAE;AAChB,6BAAa,EAAE;AAAA,cACjB;AAAA,cACD;AAAA;AAAA,UAED,IACE;AAAA,UACJ,gBAAAC,MAAC,WAAM,QAAQ,iBAAiB,WAAW;AAAA;AAAA,YAEzC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,UAAU,CAAC,UAAU;AACnB,gCAAc,MAAM,OAAO,KAAK;AAChC,+BAAa,EAAE;AAAA,gBACjB;AAAA,gBAEA;AAAA,kCAAAD,KAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,+BAE1B;AAAA,kBACC,QAAS,IAAI,CAAC,UACb,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEC,OAAO,MAAM;AAAA,sBACb,UAAU,MAAM,cAAc,eAAe,MAAM,UAAU,WAAW;AAAA,sBAEvE;AAAA,8BAAM;AAAA,wBAAM;AAAA,wBAAI,MAAM;AAAA,wBAAG;AAAA,wBAAG,MAAM,UAAU,WAAW,KAAK,GAAG;AAAA,wBAAE;AAAA;AAAA;AAAA,oBAJ7D,MAAM;AAAA,kBAKb,CACD;AAAA;AAAA;AAAA,YACH;AAAA,aACF;AAAA,UACC,YACC,gBAAAA,MAAAF,WAAA,EACE;AAAA,4BAAAC,KAAC,YAAQ,2BAAiB,YAAY,SAAS,QAAQ,MAAK;AAAA,YAC3D,SAAS,cAAc,eACtB,gBAAAA,KAAC,OAAE,MAAK,UACL,mBAAS,UACR,+FACJ;AAAA,YAEF,gBAAAC,MAAC,WAAM;AAAA;AAAA,cAEL,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,UAAU,CAAC,UAAU,aAAa,MAAM,OAAO,KAAK;AAAA,kBAEpD;AAAA,oCAAAD,KAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,8BAE1B;AAAA,oBACC,SAAS,UAAU,IAAI,CAAC,WACvB,gBAAAA,KAAC,YAAoB,OAAO,QACzB,qBAAW,aAAa,YAAY,gCAD1B,MAEb,CACD;AAAA;AAAA;AAAA,cACH;AAAA,eACF;AAAA,aACF;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ,iBAAiB,aAAa,CAAC;AAAA,cACvC,MAAK;AAAA,cACL,UAAU,CAAC;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,WACF,GACF;AAAA,QAEF,gBAAAA,KAAC,YAAO,QAAQ,CAAC,QAAQ,MAAK,UAAS,UAAU,KAAK,MAAM,SAAS,MAAM,QAAQ,OAAO,CAAC,GAAG,8BAE9F;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/UA,SAAS,aAAAI,YAAW,QAAQ,YAAAC,iBAAgB;;;ACC5C,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;;;ACG7B,SAAS,uBACd,MAEe;AACf,MACE,KAAK,GAAG,WAAW,8CAA8C,KACjE,KAAK,WAAW;AAEhB,WAAO;AACT,QAAM,WAAW,KAAK,UAAU;AAChC,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,WAAO,IAAI,aAAa,YAAY,IAAI,aAAa,UAAU,IAAI,OAAO;AAAA,EAC5E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADwBI,gBAAAC,YAAA;AAvCG,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAKG;AACD,QAAM,OAAO,MAAM;AACnB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAIhB,IAAI;AACd,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,MAAM,WAAW,iBAAiB,EAAG;AACrD,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,MAAqB;AACzB,SAAK,OACF,qBAAqB,MAAM,EAAE,QAAQ,MAAM,OAAO,CAAC,EACnD,KAAK,CAAC,SAAS;AACd,UAAI,CAAC,MAAM,OAAO,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,QAAQ;AAC1E,cAAM,IAAI,gBAAgB,IAAI;AAAA,IAClC,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC,EACd,QAAQ,MAAM;AACb,UAAI,CAAC,MAAM,OAAO,QAAS,UAAS,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC3D,CAAC;AACH,WAAO,MAAM;AACX,YAAM,MAAM;AACZ,UAAI,IAAK,KAAI,gBAAgB,GAAG;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,CAAC;AACjB,QAAM,UAAU,SAAS,MAAM,WAAW,UAAU,MAAM,SAAS,OAAO,QAAQ;AAClF,QAAM,UAAU,QAAQ,UAAU,MAAM,WAAW,iBAAiB,KAAK,CAAC,OAAO;AACjF,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,KACE,SAAS,QACR,UAAU,QAAS,OAAO,uBAAuB,IAAI,IAAI,SAAS;AAAA;AAAA,EAEvE;AAEJ;;;AEhCI,qBAAAG,WACE,OAAAC,MAGE,QAAAC,aAJJ;AAbG,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,OAAO,yBAAyB,SAAS,YAAY;AAC3D,QAAM,UAAU,8BAA8B,EAAE,IAAI,QAAQ,YAAY,OAAO,QAAQ,MAAM,CAAC;AAC9F,QAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,SACE,gBAAAA,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,yBAAsB,QAAgB,MAAY,MAAY,UAAU,QAAQ,MAAM;AAAA,IACvF,gBAAAC,MAAC,SACC;AAAA,sBAAAD,KAAC,YAAQ,gBAAK;AAAA,MACd,gBAAAC,MAAC,WACE;AAAA,gBAAQ,cAAc,aAAa,aAAa;AAAA,QAChD,SAAS,QAAQ,QAAQ,SAAM,QAAQ,KAAK,KAAK;AAAA,SACpD;AAAA,OACF;AAAA,KACF;AAEJ;;;AC3BU,gBAAAC,MACA,QAAAC,aADA;AALH,SAAS,mBAAmB,EAAE,OAAO,GAAG,MAAM,GAAqC;AACxF,SACE,gBAAAD,KAAC,SAAI,MAAK,UAAS,cAAY,OAAO,WAAU,0BAC7C,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,UAChC,gBAAAC,MAAC,SAAI,WAAU,8BAA6B,eAAY,QACtD;AAAA,oBAAAD,KAAC,UAAK,WAAU,+BAA8B;AAAA,IAC9C,gBAAAC,MAAC,UAAK,WAAU,+BACd;AAAA,sBAAAD,KAAC,UAAK;AAAA,MACN,gBAAAA,KAAC,UAAK;AAAA,OACR;AAAA,OALkE,KAMpE,CACD,GACH;AAEJ;;;AJYS,gBAAAE,OAuHO,QAAAC,aAvHP;AAPF,SAAS,gBAAgB,OAA6B;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,MAAM,UAAU;AACnD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,MAAI,UAAU,MAAM,YAAY;AAC9B,aAAS,MAAM,UAAU;AACzB,kBAAc,aAAa,CAAC;AAAA,EAC9B;AACA,SAAO,gBAAAF,MAAC,kBAAiC,GAAG,SAAhB,UAAuB;AACrD;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,OAAO,WAAW,UAAU;AAClC,QAAM,CAAC,UAAU,WAAW,IAAIE,UAAkC,IAAI;AACtE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,IAAI;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,KAAK;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AACtC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAGpB,IAAI;AACd,QAAM,WAAW,OAA+B,IAAI;AACpD,EAAAC,WAAU,MAAM,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC,CAAC;AACnD,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,IAAI,gBAAgB;AAClC,gBAAY,IAAI;AAChB,eAAW,IAAI;AACf,gBAAY,IAAI;AAChB,aAAS,KAAK;AACd,SAAK,QAAQ,QAAQ,EAClB,KAAK,MAAM;AACV,YAAM,OAAO,eAAe;AAC5B,aAAO,QAAQ,IAAI;AAAA,QACjB,WAAW,UAAU,SAAS,WAAW,aAAa,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC9E,QAAQ,iBAAiB,WAAW,WAAW,EAAE,MAAM,MAAM,IAAI,KAAK;AAAA,MACxE,CAAC;AAAA,IACH,CAAC,EACA,KAAK,CAAC,CAAC,QAAQ,QAAQ,MAAM;AAC5B,UAAI,CAAC,MAAM,OAAO,SAAS;AACzB,oBAAY,gBAAgB,OAAO,OAAO,CAAC,YAAY,QAAQ,WAAW,UAAU,CAAC,CAAC;AACtF,YAAI,UAAU,SAAU,YAAW,EAAE,QAAQ,OAAO,SAAS,MAAM,CAAC;AAAA,MACtE;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,MAAM,OAAO,QAAS,UAAS,IAAI;AAAA,IAC1C,CAAC;AACH,WAAO,MAAM,MAAM,MAAM;AAAA,EAC3B,GAAG,CAAC,QAAQ,YAAY,MAAM,CAAC;AAE/B,QAAM,aAAa,OAAO,YAA4B;AACpD,UAAM,kBAAkB,QAAQ;AAChC,QACE,SAAS,WACT,KAAK,QACL,oBAAoB,UACpB,CAAC,OAAO,cAAc,eAAe,KACrC,kBAAkB;AAElB;AACF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,aAAS,UAAU;AACnB,YAAQ,IAAI;AACZ,aAAS,KAAK;AACd,QAAI;AACF,YAAM,WAAW,UAAU,WAAW,WAAW,aAAa,QAAQ,IAAI;AAAA,QACxE;AAAA,QACA,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,UAAI,CAAC,MAAM,OAAO,SAAS;AACzB,kBAAU,CAAC,UAAU,QAAQ,CAAC;AAC9B,yBAAiB;AAAA,MACnB;AAAA,IACF,QAAQ;AACN,UAAI,CAAC,MAAM,OAAO,SAAS;AAGzB,oBAAY,IAAI;AAChB,iBAAS,IAAI;AAAA,MACf;AAAA,IACF,UAAE;AACA,UAAI,CAAC,MAAM,OAAO,SAAS;AACzB,iBAAS,UAAU;AACnB,gBAAQ,KAAK;AACb,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,QAAM,YAAY,OAAO,YAA4B;AACnD,QAAI,CAAC,aAAa,SAAS,WAAW,KAAK,KAAM;AACjD,aAAS,KAAK;AACd,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,oBAAoB,QAAQ;AAAA,QAC5B;AAAA,QACA,gBAAgB,OAAO,WAAW;AAAA,MACpC,CAAC;AAAA,IACH,QAAQ;AACN,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAW;AAAA,MACX,aAAW,QAAQ,KAAK,QAAS,CAAC,YAAY,CAAC;AAAA,MAE/C;AAAA,wBAAAD,MAAC,QAAG,8BAAgB;AAAA,QACnB,SACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,+EAAiE;AAAA,QAElF,CAAC,YAAY,CAAC,SAAS,gBAAAA,MAAC,sBAAmB,OAAM,oBAAmB;AAAA,QACpE,UAAU,WAAW,KAAK,gBAAAA,MAAC,OAAE,MAAK,UAAS,oCAAsB;AAAA,QACjE,YAAY,SAAS,SAAS,KAC7B,gBAAAA,MAAC,QACE,mBAAS,IAAI,CAAC,YACb,gBAAAA,MAAC,QAAG,WAAU,sBACZ,0BAAAC,MAAC,aAAQ,WAAU,8BACjB;AAAA,0BAAAA,MAAC,aAAQ,WAAU,8BACjB;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,cAAc,SAAS,WAAW,SAAU,SAAS,SAAS,CAAC,IAAK,CAAC;AAAA;AAAA,YACvE;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,6BAA4B,eAAa,QAAQ,QAC9D,kBAAQ,WAAW,cAChB,qBACA,QAAQ,WAAW,gBACjB,qBACA,gBACR;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,eAAY;AAAA,gBACZ,OAAM;AAAA,gBACN,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,aAAY;AAAA,gBAEZ,0BAAAA,MAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,YACzB;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,8BACZ;AAAA,yBAAa,QAAQ,WAAW,iBAC/B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,aAAa,QAAQ,KAAK;AAAA,gBACtC,UAAU,QAAQ,KAAK;AAAA,gBACvB,SAAS,MAAM,KAAK,UAAU,OAAO;AAAA,gBACtC;AAAA;AAAA,YAED;AAAA,YAED,aAAa,GAAG,QAAQ,UAAU,IAAI,QAAQ,EAAE,KAC/C,gBAAAC,MAAC,SAAI,MAAK,SAAQ,cAAY,cAAc,QAAQ,KAAK,IACvD;AAAA,8BAAAD,MAAC,OAAE,6FAGH;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU,QAAQ,KAAK;AAAA,kBACvB,SAAS,MAAM,KAAK,WAAW,OAAO;AAAA,kBACvC;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,YAAY,IAAI,GAAG,0BAExE;AAAA,eACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,cAAc,QAAQ,KAAK;AAAA,gBACvC,UACE,QACA,KAAK,QACL,QAAQ,WAAW,cACnB,CAAC,OAAO,cAAc,QAAQ,OAAO,KACrC,QAAQ,UAAW;AAAA,gBAErB,SAAS,MAAM,YAAY,GAAG,QAAQ,UAAU,IAAI,QAAQ,EAAE,EAAE;AAAA,gBACjE;AAAA;AAAA,YAED;AAAA,aAEJ;AAAA,WACF,KAzEsC,GAAG,QAAQ,UAAU,IAAI,QAAQ,EAAE,EA0E3E,CACD,GACH;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,CAAC;AAAA,YACT,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,UAAU,CAAC,UAAU,QAAQ,CAAC;AAAA,YAC9C;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EACF;AAEJ;;;AKnOA,SAAS,YAAAI,iBAAgB;;;ACGzB,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAyBnC,gBAAAC,OAuFH,QAAAC,aAvFG;AAPF,SAAS,oBAAoB,OAAiC;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE,QAAQ,MAAM,QAAQ,YAAY,MAAM,WAAW,CAAC;AACzF,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,MAAI,MAAM,WAAW,MAAM,UAAU,MAAM,eAAe,MAAM,YAAY;AAC1E,aAAS,EAAE,QAAQ,MAAM,QAAQ,YAAY,MAAM,WAAW,CAAC;AAC/D,kBAAc,aAAa,CAAC;AAAA,EAC9B;AACA,SAAO,gBAAAF,MAAC,mBAA4D,GAAG,SAA1C,GAAG,UAAU,IAAI,MAAM,WAAW,EAAe;AAChF;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,CAAC,WAAW,YAAY,IAAIE,UAAmC,IAAI;AACzE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAA2B,CAAC,CAAC;AAC7D,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAiC,IAAI;AACrF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAyC,IAAI;AACvE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA+B,CAAC,CAAC;AACvE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAuC,IAAI;AAC3E,QAAM,SAASC,QAA2B,IAAI;AAC9C,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,IAAI,gBAAgB;AAGlC,UAAM,OAAO,OAAW,cAA4C;AAClE,YAAM,OAAO,eAAe;AAC5B,aAAO,UAAU;AAAA,IACnB;AACA,cAAU,KAAK;AACf,wBAAoB,IAAI;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,sBAAkB,KAAK;AACvB,QAAI;AACF,WAAK,QAAQ,IAAI;AAAA,QACf,KAAK,MAAM,WAAW,UAAU,QAAQ,aAAa,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,QAC9E,KAAK,MAAM,WAAW,UAAU,SAAS,aAAa,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,MACjF,CAAC,EACE,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM;AAC9B,YAAI,CAAC,MAAM,OAAO,SAAS;AACzB,uBAAa,QAAQ,OAAO,wBAAwB,CAAC;AACrD,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF,CAAC,EACA,MAAM,MAAM;AACX,YAAI,CAAC,MAAM,OAAO,QAAS,mBAAkB,IAAI;AAAA,MACnD,CAAC;AACL,SAAK,QAAQ,IAAI;AAAA,MACf,KAAK,MAAM,OAAO,iBAAiB,WAAW,CAAC;AAAA,MAC/C,KAAK,MAAM,OAAO,gBAAgB,WAAW,CAAC;AAAA,IAChD,CAAC,EACE,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM;AAC9B,UAAI,CAAC,MAAM,OAAO,SAAS;AACzB,uBAAe,SAAS;AACxB;AAAA,UACE,QAAQ,MAAM;AAAA,YACZ,CAAC,SACC,KAAK,SAAS,SACd,KAAK,aAAa,YAClB,QAAQ,KAAK,UAAU,KAAK,WAAW;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,MAAM,OAAO,QAAS,WAAU,IAAI;AAAA,IAC3C,CAAC;AACH,WAAO,MAAM;AACX,YAAM,MAAM;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,aAAa,MAAM,CAAC;AAC5C,QAAM,UACJ,OAAO;AAAA,IAAO,CAAC,SACb,GAAG,KAAK,IAAI,IAAI,KAAK,eAAe,EAAE,IAAI,KAAK,kBAAkB,EAAE,GAChE,kBAAkB,EAClB,SAAS,MAAM,KAAK,EAAE,kBAAkB,CAAC;AAAA,EAC9C,KAAK,CAAC;AACR,QAAM,mBAAmB,aAAa,CAAC,GAAG;AAAA,IACxC,CAAC,aACC,CAAC,OAAO,KAAK,CAAC,SAAS,4BAA4B,IAAI,MAAM,SAAS,EAAE,KACxE,SAAS,MAAM,kBAAkB,EAAE,SAAS,MAAM,KAAK,EAAE,kBAAkB,CAAC;AAAA,EAChF;AACA,QAAM,UAAW,CAAC,SAAS,CAAC,UAAW,QAAQ,cAAc,CAAC,aAAa,CAAC,cAAc;AAC1F,MAAI,oBAAoB;AACtB,WACE,gBAAAH,MAAC,aAAQ,cAAY,WAAW,iBAAiB,KAAK,IACpD;AAAA,sBAAAD,MAAC,YAAO,MAAK,UAAS,SAAS,MAAM,oBAAoB,IAAI,GAAG,iCAEhE;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,iBAAiB;AAAA,UACvB,KAAK,8BAA8B,gBAAgB,EAAE;AAAA;AAAA,MACvD;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,cAAa;AAAA,UACb,cAAY;AAAA,UACZ,mBAAmB,iBAAiB;AAAA;AAAA,MACtC;AAAA,OACF;AAEJ,SACE,gBAAAC,MAAC,aAAQ,WAAU,2BAA0B,cAAW,qBACtD;AAAA,oBAAAD,MAAC,QAAG,8BAAgB;AAAA,IACpB,gBAAAC,MAAC,WACC;AAAA,sBAAAD,MAAC,UAAK,WAAU,iCAAgC,6BAAe;AAAA,MAC/D,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,UAAU;AACnB,qBAAS,MAAM,OAAO,KAAK;AAC3B,qBAAS,EAAE;AAAA,UACb;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACE,kBAAkB,WAClB,gBAAAC,MAAC,OAAE,MAAK,SAAQ;AAAA;AAAA,MACqB;AAAA,MACnC,gBAAAD,MAAC,YAAO,MAAK,UAAS,SAAS,MAAM,UAAU,CAAC,UAAU,QAAQ,CAAC,GAAG,mBAEtE;AAAA,OACF;AAAA,IAEF,gBAAAC,MAAC,SAAI,WAAU,mCACZ;AAAA,sBAAgB,IAAI,CAAC,aAAa;AACjC,cAAM,YAAY,SAAS;AAAA,UACzB,CAAC,YAAY,QAAQ,eAAe,SAAS,MAAM,QAAQ,WAAW;AAAA,QACxE;AACA,eACE,gBAAAD;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,SAAS;AAAA,YACf,MACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,SAAS;AAAA,gBACf,KAAK,8BAA8B,QAAQ,EAAE;AAAA;AAAA,YAC/C;AAAA,YAEF,QAAQ,YAAY,UAAU;AAAA,YAC9B,aAAa,YAAY,cAAc;AAAA,YACvC,iBAAe;AAAA,YACf,QAAQ,MAAM,oBAAoB,QAAQ;AAAA;AAAA,UAXrC,SAAS;AAAA,QAYhB;AAAA,MAEJ,CAAC;AAAA,MACA,QAAQ,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS;AACrC,cAAM,QAAQ,4BAA4B,MAAM,WAAW;AAC3D,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,aAAa,KAAK,eAAe;AAAA,YACjC,MAAM,gBAAAA,MAAC,yBAAsB,QAAgB,MAAY,MAAM,KAAK,MAAM;AAAA,YAC1E,QAAQ,MAAM;AAAA,YACd,aAAa,MAAM;AAAA,YACnB,iBAAe;AAAA,YACf,QAAQ,MAAM;AACZ,qBAAO,UACL,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;AAC3E,0BAAY,IAAI;AAAA,YAClB;AAAA;AAAA,UAXK,KAAK;AAAA,QAYZ;AAAA,MAEJ,CAAC;AAAA,MAEA,WAAW,gBAAAA,MAAC,sBAAmB,MAAM,GAAG,OAAM,oBAAmB;AAAA,MACjE,CAAC,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,UAAU,CAAC,gBAAgB,UAC7E,gBAAAA,MAAC,OAAE,MAAK,UAAS,4CAA8B;AAAA,MAEhD,QAAQ,SAAS,SAChB,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,CAAC,UAAU,QAAQ,EAAE,GAAG,gCAEtE;AAAA,OAEJ;AAAA,IACC,WACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,cAAc,SAAS;AAAA,QACvB,MAAM,SAAS;AAAA,QACf;AAAA,QACA,YAAU;AAAA,QACV,SAAS,MAAM;AACb,sBAAY,IAAI;AAChB,yBAAe,MAAM;AACnB,gBAAI,OAAO,SAAS,YAAa,QAAO,QAAQ,MAAM;AAAA,UACxD,CAAC;AAAA,QACH;AAAA,QACA,cAAc,YAAY;AACxB,oBAAU,CAAC,UAAU,QAAQ,CAAC;AAC9B,gBAAM,eAAe;AAAA,QACvB;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ;;;AD3LyB,SAYf,YAAAK,WAZe,OAAAC,OAsBX,QAAAC,cAtBW;AAtBlB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,EAAE,QAAQ,IAAI,WAAW,MAAM,UAAU;AAC/C,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,UAAS,CAAC;AAG5D,QAAM,cACJ,YAAY,QAAQ,CAAC,CAAC,YAAY,aAAa,SAAS,EAAE,SAAS,QAAQ,KAAK;AAClF,QAAM,cAAc,UAChB,8BAA8B,EAAE,IAAI,QAAQ,YAAY,OAAO,GAAG,CAAC,EAAE,OACrE;AACJ,SACE,gBAAAD,OAAC,SAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D;AAAA,cAAU,QAAQ,gBAAAD,MAAC,QAAI,iBAAM;AAAA,IAC7B,gBAAgB,CAAC,eAChB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,YAAY,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA,gBAAgB,MAAM,qBAAqB,CAAC,UAAU,QAAQ,CAAC;AAAA;AAAA,MAJ1D;AAAA,IAKP;AAAA,IAED,CAAC,gBACC,UAAU,iBAAiB,YAC1B,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,YAAY,0BAA0B,MAAM,aAAa;AAAA,UACzD;AAAA,UACA,aAAa,MAAM,WAAW;AAAA,UAC9B;AAAA,UACA,cAAc,MAAM,qBAAqB,CAAC,UAAU,QAAQ,CAAC;AAAA;AAAA,QALxD;AAAA,MAMP;AAAA,MACC,yBACC,gBAAAC,OAAC,aAAQ,WAAU,wBACjB;AAAA,wBAAAD,MAAC,aAAQ,+BAAiB;AAAA,QAC1B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAU;AAAA,YACV;AAAA,YACA,YAAY,MAAM;AAAA,YAClB;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OAEJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,YAAY,MAAM;AAAA,QAClB;AAAA;AAAA,IACF;AAAA,IAEH,eACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,gBACE,MAAM,mBACL,cAAc,eAAe,WAAW,KAAK;AAAA;AAAA,IAElD;AAAA,KAEJ;AAEJ;;;AElGA,SAAS,aAAAG,YAAW,UAAAC,SAAQ,YAAAC,iBAAgC;AAyEtD,gBAAAC,OAaI,QAAAC,cAbJ;AAlDC,SAAS,oBAAoB,OAAiC;AACnE,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,aAAaC,QAAO,CAAC;AAC3B,QAAM,QAAQA,QAA6C,IAAI;AAC/D,EAAAC,WAAU,MAAM;AACd,eAAW;AACX,cAAU,KAAK;AACf,iBAAa,KAAK;AAClB,WAAO,MAAM;AAGX,iBAAW;AACX,UAAI,MAAM,QAAS,cAAa,MAAM,OAAO;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AACnB,iBAAe,OAAO;AACpB,UAAM,WAAW,EAAE,WAAW;AAC9B,QAAI,MAAM,QAAS,cAAa,MAAM,OAAO;AAC7C,cAAU,KAAK;AACf,iBAAa,KAAK;AAClB,QAAI;AACF,YAAM,YAAY,MAAM,gBAAgB,MAAM,MAAM,cAAc,IAAI,EAAE,oBAAoB;AAC5F,UAAI,aAAa,WAAW,QAAS;AACrC,YAAM,UAAU,MAAM,UAAU,oBAAoB,MAAM,QAAQ;AAClE,UAAI,aAAa,WAAW,QAAS;AACrC,gBAAU,OAAO;AACjB,mBAAa,CAAC,OAAO;AACrB,YAAM,eAAe,OAAO;AAC5B,UAAI;AACF,cAAM,UAAU,WAAW,MAAM;AAC/B,cAAI,aAAa,WAAW,QAAS,WAAU,KAAK;AAAA,QACtD,GAAG,IAAI;AAAA,IACX,QAAQ;AACN,UAAI,aAAa,WAAW,QAAS;AACrC,mBAAa,IAAI;AACjB,YAAM,eAAe,KAAK;AAAA,IAC5B;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM,eAAe;AACzC,QAAI,CAAC,UAAU,OAAO,EAAE,SAAS,IAAI,QAAQ,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI;AACtE,aAAO,MAAM;AAAA,EACjB,QAAQ;AAAA,EAER;AACA,MAAI,MAAM,OAAQ,QAAO,MAAM,OAAO,EAAE,QAAQ,WAAW,MAAM,kBAAkB,KAAK,CAAC;AACzF,SACE,gBAAAH,OAAC,aAAQ,WAAW,cAAc,MAAM,aAAa,EAAE,IAAI,cAAW,wBACpE;AAAA,oBAAAD,MAAC,OAAG,gBAAM,eAAe,sBAAsB,MAAM,iBAAiB,cAAc,KAAI;AAAA,IACxF,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,UAAU,YAAY,SAAS,GACnF;AAAA,sBAAAD,MAAC,UAAM,GAAG,MAAM,gBAAgB,OAAO,EAAE,cAAc,WAAW,GAC/D,gBAAM,UACT;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAY,SAAS,gBAAgB;AAAA,UACrC,SAAS,MAAM,KAAK,KAAK;AAAA,UAExB,mBAAS,WAAW;AAAA;AAAA,MACvB;AAAA,MACC,OACC,gBAAAC,OAAC,OAAE,MAAY,QAAO,UAAS,KAAI,uBAAsB;AAAA;AAAA,QACjD,MAAM,iBAAiB;AAAA,SAC/B,IAEA,gBAAAD,MAAC,UAAK,MAAK,SAAQ,gDAAkC;AAAA,OAEzD;AAAA,IACC,YAAY,gBAAAA,MAAC,OAAE,MAAK,SAAQ,+DAAiD,IAAO;AAAA,IACrF,gBAAAA,MAAC,OAAE,MAAK,UAAS,6CAA0B;AAAA,KAC7C;AAEJ;;;ACjGA,SAAS,aAAAK,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AA4GtC,SA+BE,YAAAC,WA/BF,OAAAC,OAWI,QAAAC,cAXJ;AAxEC,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,CAAC,MAAM,OAAO,IAAIH,WAAsC,IAAI;AAClE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAA6C,IAAI;AAC/E,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA8C,CAAC,CAAC;AAChF,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,CAAC;AACpC,QAAM,aAAaD,QAAO,CAAC;AAC3B,EAAAD,WAAU,MAAM;AACd,UAAM,UAAU,EAAE,WAAW;AAC7B,YAAQ,IAAI;AACZ,eAAW,IAAI;AACf,gBAAY,CAAC,CAAC;AACd,YAAQ,IAAI;AACZ,aAAS,KAAK;AACd,SAAK,OACF,oBAAoB,aAAa,QAAQ,SAAS,EAClD;AAAA,MACC,CAAC,WAAW;AACV,YAAI,WAAW,YAAY,QAAS;AACpC,mBAAW,MAAM;AACjB,gBAAQ,OAAO,IAAI;AACnB,oBAAY,OAAO,KAAK,WAAW;AAAA,MACrC;AAAA,MACA,MAAM;AACJ,YAAI,WAAW,YAAY,QAAS,UAAS,IAAI;AAAA,MACnD;AAAA,IACF,EACC,QAAQ,MAAM;AACb,UAAI,WAAW,YAAY,QAAS,SAAQ,KAAK;AAAA,IACnD,CAAC;AACH,WAAO,MAAM;AAGX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,QAAQ,WAAW,KAAK,CAAC;AAClD,iBAAe,OAAO,QAAiB;AACrC,QAAI,CAAC,QAAQ,KAAM;AACnB,UAAM,UAAU,WAAW;AAC3B,YAAQ,IAAI;AACZ,aAAS,KAAK;AACd,QAAI;AACF,YAAM,SAAS,SACX,MAAM,OAAO,mBAAmB,aAAa,QAAQ,KAAK,QAAQ,IAClE,MAAM,OAAO,oBAAoB,aAAa,QAAQ;AAAA,QACpD;AAAA,QACA,kBAAkB,KAAK;AAAA,QACvB,aAAa;AAAA,MACf,CAAC;AACL,UAAI,WAAW,YAAY,QAAS;AACpC,cAAQ,MAAM;AACd,mBAAa,MAAM;AAAA,IACrB,QAAQ;AACN,UAAI,WAAW,YAAY,QAAS,UAAS,IAAI;AAAA,IACnD,UAAE;AACA,UAAI,WAAW,YAAY,QAAS,SAAQ,KAAK;AAAA,IACnD;AAAA,EACF;AACA,SACE,gBAAAK;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,+BAA+B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9E,cAAW;AAAA,MACX,aAAW;AAAA,MAEX;AAAA,wBAAAD,MAAC,QAAG,wCAA0B;AAAA,QAC9B,gBAAAA,MAAC,OAAE,gNAIH;AAAA,QACC,WACC,gBAAAC,OAAC,QACC;AAAA,0BAAAD,MAAC,QAAG,0BAAY;AAAA,UAChB,gBAAAA,MAAC,QAAI,kBAAQ,gBAAe;AAAA,UAC5B,gBAAAA,MAAC,QAAG,0BAAY;AAAA,UAChB,gBAAAC,OAAC,QACE;AAAA,oBAAQ,iBAAiB;AAAA,YAAW;AAAA,YAAG,QAAQ,iBAAiB;AAAA,YAAO;AAAA,aAC1E;AAAA,UACA,gBAAAD,MAAC,QAAG,oCAAsB;AAAA,UAC1B,gBAAAA,MAAC,QAAI,kBAAQ,iBAAgB;AAAA,WAC/B;AAAA,QAED,SACC,gBAAAC,OAAC,SAAI,MAAK,SAAQ;AAAA;AAAA,UAGf,CAAC,QACA,gBAAAD,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,SAAS,CAAC,UAAU,QAAQ,CAAC,GAAG,uBAErF;AAAA,WAEJ;AAAA,QAED,CAAC,QAAQ,QAAQ,gBAAAA,MAAC,OAAE,MAAK,UAAS,oDAAiC;AAAA,QACnE,MAAM,WAAW,aAChB,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAE,OAAC,OACE;AAAA,iBAAK,YACF,eAAe,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,CAAC,MACxD;AAAA,YAA2D;AAAA,YAAI;AAAA,aAErE;AAAA,UACA,gBAAAA,OAAC,cAAS,UAAU,MAClB;AAAA,4BAAAD,MAAC,YAAO,qCAAuB;AAAA,YAC9B,KAAK,YAAY,IAAI,CAAC,eACrB,gBAAAC,OAAC,WACC;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,SAAS,SAAS,UAAU;AAAA,kBACrC,UAAU,CAAC,UACT;AAAA,oBAAY,CAAC,WACX,MAAM,OAAO,UACT,CAAC,GAAG,QAAQ,UAAU,IACtB,OAAO,OAAO,CAAC,UAAU,UAAU,UAAU;AAAA,kBACnD;AAAA;AAAA,cAEJ;AAAA,cACA,gBAAAA,MAAC,UAAM,qBAAW,WAAW,KAAK,QAAK,GAAE;AAAA,iBAZ/B,UAaZ,CACD;AAAA,aACH;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,QAAQ,SAAS,WAAW;AAAA,cACtC,SAAS,MAAM,KAAK,OAAO,KAAK;AAAA,cAE/B,iBAAO,iBAAY;AAAA;AAAA,UACtB;AAAA,UACA,gBAAAA,MAAC,OAAE,8DAAgD;AAAA,WACrD;AAAA,QAED,MAAM,WAAW,YAChB,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,OAAE,MAAK,UAAS,iEAAmD;AAAA,UACpE,gBAAAA,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,KAAK,OAAO,IAAI,GAAG,8BAExE;AAAA,WACF;AAAA,QAED,MAAM,WAAW,aAChB,gBAAAA,MAAC,OAAE,MAAK,UAAS,kFAAoE;AAAA,QAEtF,MAAM,WAAW,aAChB,gBAAAA,MAAC,OAAE,MAAK,UAAS,8EAAgE;AAAA;AAAA;AAAA,EAErF;AAEJ;;;AC/LA,SAAS,aAAAE,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AAiGtC,gBAAAC,OASI,QAAAC,cATJ;AAnFC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAIF,WAAiC,CAAC,CAAC;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwB,IAAI;AACxD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,IAAI;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,KAAK;AACxC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,CAAC;AAC1C,QAAM,aAAaD,QAAO,CAAC;AAC3B,QAAM,WAAWA,QAAO,KAAK;AAC7B,EAAAD,WAAU,MAAM;AACd,UAAM,UAAU,EAAE,WAAW;AAC7B,aAAS,UAAU;AACnB,aAAS,CAAC,CAAC;AACX,cAAU,IAAI;AACd,YAAQ,IAAI;AACZ,aAAS,KAAK;AACd,SAAK,OACF,kBAAkB,WAAW,EAC7B;AAAA,MACC,CAAC,SAAS;AACR,YAAI,YAAY,WAAW,QAAS;AACpC,iBAAS,KAAK,KAAK;AACnB,kBAAU,KAAK,UAAU;AAAA,MAC3B;AAAA,MACA,MAAM;AACJ,YAAI,YAAY,WAAW,QAAS,UAAS,IAAI;AAAA,MACnD;AAAA,IACF,EACC,QAAQ,MAAM;AACb,UAAI,YAAY,WAAW,SAAS;AAClC,iBAAS,UAAU;AACnB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AACH,WAAO,MAAM;AAGX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,QAAQ,CAAC;AAElC,iBAAe,IAAI,MAA6B;AAC9C,QAAI,SAAS,WAAY,CAAC,QAAQ,CAAC,OAAS;AAC5C,UAAM,UAAU,WAAW;AAC3B,aAAS,UAAU;AACnB,YAAQ,IAAI;AACZ,aAAS,KAAK;AACd,QAAI;AACF,UAAI,MAAM;AACR,cAAM,UAAU,MAAM,OAAO,mBAAmB,aAAa,KAAK,IAAI,KAAK,QAAQ;AACnF,YAAI,YAAY,WAAW;AACzB;AAAA,YAAS,CAAC,WACR,OAAO,IAAI,CAAC,UAAW,MAAM,OAAO,QAAQ,KAAK,EAAE,GAAG,OAAO,GAAG,QAAQ,IAAI,KAAM;AAAA,UACpF;AAAA,MACJ,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,kBAAkB,aAAa,MAAO;AAChE,YAAI,YAAY,WAAW,SAAS;AAClC,mBAAS,CAAC,WAAW;AAAA,YACnB,GAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,KAAK,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO;AAAA,UAClF,CAAC;AACD,oBAAU,KAAK,UAAU;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,QAAQ;AACN,UAAI,YAAY,WAAW,QAAS,UAAS,IAAI;AAAA,IACnD,UAAE;AACA,UAAI,YAAY,WAAW,SAAS;AAClC,iBAAS,UAAU;AACnB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAW;AAAA,MACX,aAAW;AAAA,MAEX;AAAA,wBAAAD,MAAC,QAAG,mCAAqB;AAAA,QACzB,gBAAAA,MAAC,OAAE,iMAGH;AAAA,QAGA,gBAAAC,OAAC,SAAI,WAAU,yBACZ;AAAA,mBACC,gBAAAA,OAAC,SAAI,MAAK,SAAQ;AAAA;AAAA,YAEhB,gBAAAD,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,YAAY,CAAC,UAAU,QAAQ,CAAC,GAAG,0BAExF;AAAA,aACF;AAAA,UAED,QAAQ,gBAAAA,MAAC,OAAE,MAAK,UAAS,yCAAsB;AAAA,UAC/C,CAAC,QAAQ,CAAC,SAAS,MAAM,WAAW,KACnC,gBAAAA,MAAC,OAAE,6DAA+C;AAAA,UAEpD,gBAAAA,MAAC,QACE,gBAAM,IAAI,CAAC,SACV,gBAAAC,OAAC,QACC;AAAA,4BAAAA,OAAC,OACE;AAAA,mBAAK,kBAAkB,UAAU;AAAA,cAAoB;AAAA,cACtD,gBAAAD,MAAC,UAAM,eAAK,kBAAkB,cAAc,KAAK,oBAAmB;AAAA,eACtE;AAAA,YACA,gBAAAC,OAAC,OAAE;AAAA;AAAA,cACQ,KAAK;AAAA,cAAO;AAAA,cAAE;AAAA,cACtB,KAAK,YACF,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,CAAC,MACpD;AAAA,eACN;AAAA,YACA,gBAAAD,MAAC,OAAG,eAAK,YAAY,KAAK,IAAI,GAAE;AAAA,aAC9B,KAAK,WAAW,YAAY,KAAK,WAAW,cAC5C,gBAAAA,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,KAAK,IAAI,IAAI,GAAG,2BAErE;AAAA,eAfK,KAAK,EAiBd,CACD,GACH;AAAA,UACC,UACC,gBAAAA,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,KAAK,IAAI,GAAG,6BAEjE;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACzHM,SACU,OAAAE,OADV,QAAAC,cAAA;AAZC,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AACd,GAIG;AACD,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,SACE,gBAAAA,OAAC,aAAQ,cAAY,OAAO,WAAW,2BAA2B,SAAS,IACzE;AAAA,oBAAAA,OAAC,QACE;AAAA;AAAA,MAAM;AAAA,MAAC,gBAAAD,MAAC,UAAM,gBAAM,QAAO;AAAA,OAC9B;AAAA,IACA,gBAAAA,MAAC,SACE,gBAAM,IAAI,CAAC,SACV,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,cAAY,GAAG,KAAK,IAAI,SAAM,KAAK,MAAM;AAAA,QAExC;AAAA,eAAK;AAAA,UACN,gBAAAD,MAAC,UAAM,eAAK,MAAK;AAAA,UAChB,KAAK,aACJ,gBAAAA,MAAC,UAAK,WAAU,kCAAkC,eAAK,QAAO,IAC5D;AAAA,UACH,KAAK,iBAAiB,gBAAAA,MAAC,UAAK,cAAW,mBAAkB,eAAC,IAAU;AAAA;AAAA;AAAA,MAZhE,KAAK;AAAA,IAaZ,CACD,GACH;AAAA,KACF;AAEJ;;;AClDA,SAAS,aAAa;AAchB,gBAAAE,OAQE,QAAAC,cARF;AAZC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAIG;AACD,QAAM,OAAO,MAAM;AACnB,SACE,gBAAAA,OAAC,cAAS,WAAU,6BAA4B,UAC9C;AAAA,oBAAAD,MAAC,YAAO,6BAAe;AAAA,IAErB;AAAA,MACE,CAAC,OAAO,YAAY;AAAA,MACpB,CAAC,WAAW,SAAS;AAAA,MACrB,CAAC,WAAW,SAAS;AAAA,IACvB,EACA,IAAI,CAAC,CAAC,MAAM,KAAK,MACjB,gBAAAC,OAAC,WAAiB,iBAAe,UAAU,MACzC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA,OAAO;AAAA,UACP,SAAS,UAAU;AAAA,UACnB,UAAU,MAAM,SAAS,IAAI;AAAA;AAAA,MAC/B;AAAA,MACC;AAAA,SARS,IASZ,CACD;AAAA,KACH;AAEJ;;;AClCA,SAAS,aAAAE,YAAW,UAAAC,SAAQ,YAAAC,kBAAgC;AAE5D,SAAS,iBAAiB;AAoCpB,SAmGF,YAAAC,WAlGI,OAAAC,OADF,QAAAC,cAAA;AAhCN,IAAMC,kBAAiB,qBAA0C;AACjE,IAAM,aAAa,CAAC,SAAiB,KAAK,QAAQ,MAAM,GAAG;AAC3D,IAAM,sBAA2C,oBAAI,IAAI;AAuBlD,SAAS,gBAAgB,OAA6B;AAC3D,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAS,MAAM,mBAAmB,EAAE;AACpE,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,uBAAuB,MAAM,cAAc,wBAAwB,EAAE;AAAA,MAChF,cAAW;AAAA,MAEX;AAAA,wBAAAA,OAAC,YACC;AAAA,0BAAAD,MAAC,QAAI,gBAAM,cAAc,YAAY,kBAAiB;AAAA,UACrD,CAAC,MAAM,cACN,gBAAAA,MAAC,SAAI,WAAU,qBAAoB,MAAK,SAAQ,cAAW,mBAEvD;AAAA,YACE,EAAE,OAAO,IAAI,OAAO,MAAM;AAAA,YAC1B,EAAE,OAAO,UAAU,OAAO,yBAAyB;AAAA,YACnD,EAAE,OAAO,aAAa,OAAO,4BAA4B;AAAA,UAC3D,EACA,IAAI,CAAC,WACL,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,gBAAc,aAAa,OAAO;AAAA,cAClC,SAAS,MAAM,YAAY,OAAO,KAAK;AAAA,cAEtC,iBAAO;AAAA;AAAA,YALH,OAAO;AAAA,UAMd,CACD,GACH,IACE;AAAA,WACN;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEE,GAAG;AAAA,YACJ;AAAA;AAAA,UAFK,GAAG,MAAM,WAAW,IAAI,MAAM,KAAK,IAAI,QAAQ;AAAA,QAGtD;AAAA;AAAA;AAAA,EACF;AAEJ;AACA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACF,GAAgD;AAC9C,QAAM,UAAUE,gBAAe,KAAK,QAAQ,KAAK,UAAU,CAAC,aAAa,OAAO,UAAU,CAAC,CAAC,CAAC;AAC7F,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAgC,SAAS,SAAS,CAAC,CAAC;AAC9E,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,CAAC;AACtC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAwB,SAAS,cAAc,IAAI;AAC3E,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,SAAS,SAAS,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,CAAC,OAAO;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,CAAC;AACpC,QAAM,WAAWC,QAAuB,IAAI;AAC5C,EAAAC,WAAU,MAAM;AACd,QAAI,SAAS;AACb,UAAM,WAAW,KAAK,UAAU,CAAC,aAAa,OAAO,UAAU,MAAM,CAAC;AACtE,UAAM,SAASH,gBAAe,KAAK,QAAQ,QAAQ;AACnD,eAAW,CAAC,MAAM;AAClB,aAAS,KAAK;AACd,UAAM,QAAQ;AAAA,MACZ,MAAM;AACJ,aAAKA,gBACF;AAAA,UAAK;AAAA,UAAQ;AAAA,UAAU,MACtB,OAAO,gBAAgB,aAAa,EAAE,OAAO,UAAU,OAAO,CAAC;AAAA,QACjE,EACC;AAAA,UACC,CAAC,SAAS;AACR,gBAAI,CAAC,OAAQ;AACb,qBAAS,CAAC,aAAc,SAAS,CAAC,GAAG,UAAU,GAAG,KAAK,KAAK,IAAI,KAAK,KAAM;AAC3E,qBAAS,KAAK,KAAK;AACnB,oBAAQ,KAAK,UAAU;AACvB,uBAAW,KAAK;AAAA,UAClB;AAAA,UACA,MAAM;AACJ,gBAAI,QAAQ;AACV,uBAAS,IAAI;AACb,yBAAW,KAAK;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACJ;AAAA,MACA,UAAU,SAAS,IAAI;AAAA,IACzB;AACA,WAAO,MAAM;AACX,eAAS;AACT,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,OAAO,UAAU,QAAQ,KAAK,CAAC;AACxD,EAAAG,WAAU,MAAM;AACd,QAAI,eAAe,WAAW,SAAS,SAAS,QAAQ,CAAC,SAAS,QAAS;AAC3E,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,YAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,EAAG,WAAU,IAAI;AAAA,MACnE;AAAA,MACA,EAAE,YAAY,QAAQ;AAAA,IACxB;AACA,aAAS,QAAQ,SAAS,OAAO;AACjC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,SAAS,OAAO,MAAM,WAAW,CAAC;AACtC,SACE,gBAAAJ,OAAAF,WAAA,EACG;AAAA,KAAC,WAAW,CAAC,QACZ,gBAAAC,MAAC,OAAE,MAAK,UACL,kBACG,sCACA,MAAM,KAAK,IACT,wBAAmB,MAAM,KAAK,CAAC,YAC/B,gCACR,IACE;AAAA,IACJ,gBAAAA,MAAC,SAAI,WAAU,4BACZ,gBAAM,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,SAChC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,kBAAgB,KAAK;AAAA,QACrB,MAAM,WAAW,KAAK,WAAW;AAAA,QACjC,aAAa,KAAK;AAAA,QAClB,QAAQ,aAAa,IAAI,KAAK,EAAE,IAAI,UAAU;AAAA,QAC9C,aAAa,aAAa,IAAI,KAAK,EAAE,IAAI,cAAc;AAAA,QACvD,QAAQ,MAAM,OAAO,IAAI;AAAA,QACzB,MACE,aACE,WAAW,IAAI,IAEf,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,KAAK;AAAA,YACV,MAAM,KAAK;AAAA,YACX,UAAU,gBAAAA,MAAC,aAAU,eAAY,QAAO;AAAA;AAAA,QAC1C;AAAA;AAAA,MAfC,KAAK;AAAA,IAkBZ,CACD,GACH;AAAA,IACC,UAAU,gBAAAA,MAAC,OAAE,MAAK,UAAS,mCAAgB,IAAO;AAAA,IAClD,QACC,gBAAAC,OAAC,OAAE,MAAK,SAAQ;AAAA;AAAA,MACS;AAAA,MACvB,gBAAAD,MAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,CAAC,UAAU,QAAQ,CAAC,GAAG,mBAErE;AAAA,OACF,IACE;AAAA,IACH,eAAe,CAAC,WAAW,CAAC,SAAS,QAAQ,cAC5C,gBAAAA,MAAC,YAAO,WAAU,mBAAkB,MAAK,UAAS,SAAS,YAAY,8BAEvE,IACE;AAAA,IACJ,gBAAAA,MAAC,SAAI,KAAK,UACP,WAAC,eAAe,SAAS,QAAQ,CAAC,WAAW,CAAC,QAC7C,gBAAAA,MAAC,YAAO,WAAU,kBAAiB,MAAK,UAAS,SAAS,MAAM,UAAU,IAAI,GAAG,+BAEjF,IACE,MACN;AAAA,KACF;AAEJ;;;ACnMA,SAAS,YAAAM,kBAAgB;AACzB,SAAS,kCAA4D;AACrE,SAAS,aAAAC,kBAAiB;AAwDN,gBAAAC,OAIW,QAAAC,cAJX;AApDpB,IAAM,kBAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AACP;AAEA,IAAM,oBAA6C,CAAC;AAG7C,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAQG;AACD,QAAM,YAAY,CAAC,WACjB,2BAA2B,MAAM,MAAM;AACzC,QAAM,kBAAkB,KAAK,UAAU,QAAQ,KAAK,cAAc;AAClE,QAAM,oBACH,KAAK,QAAQ,UAAU,MAAM,KAAK,YAAY,OAAO,SAAS,EAAE,UAAU;AAC7E,QAAM,sBAAsB,mBAAmB;AAC/C,QAAM,cAAc,CAAC,mBAAmB,mBAAmB,KAAK,CAAC;AACjE,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAS,KAAK;AAC9C,QAAM,cAAc,KAAK,mBAAmB,KAAK;AACjD,QAAM,UAAU,YAAY,SAAS;AACrC,QAAM,gBACJ,KAAK,aAAa,WACd,2BACA,KAAK,aAAa,cAChB,8BACA;AACR,SACE,gBAAAD,OAAC,aAAQ,WAAU,qBACjB;AAAA,oBAAAA,OAAC,YAAO,WAAU,4BAChB;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,UAAU,gBAAAA,MAACG,YAAA,EAAU,eAAY,QAAO;AAAA;AAAA,MAC1C;AAAA,MACA,gBAAAF,OAAC,SACC;AAAA,wBAAAD,MAAC,QAAI,eAAK,YAAY,QAAQ,MAAM,GAAG,GAAE;AAAA,QACxC,KAAK,QAAQ,OAAO,gBAAAC,OAAC,OAAE;AAAA;AAAA,UAAI,KAAK,OAAO;AAAA,WAAK,IAAO;AAAA,SACtD;AAAA,OACF;AAAA,IACA,gBAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,sBAAAD,MAAC,UAAM,yBAAc;AAAA,MACpB,KAAK,WAAW,gBAAAA,MAAC,UAAM,eAAK,UAAS,IAAU;AAAA,MAC/C,KAAK,UAAU,gBAAAC,OAAC,UAAK;AAAA;AAAA,QAAE,KAAK;AAAA,SAAQ,IAAU;AAAA,OACjD;AAAA,IACA,gBAAAA,OAAC,aAAQ,WAAU,6BACjB;AAAA,sBAAAA,OAAC,QAAG;AAAA;AAAA,QACK,gBAAAD,MAAC,UAAM,eAAK,QAAQ,UAAU,UAAI;AAAA,SAC3C;AAAA,MACC,KAAK,QAAQ,SACZ,gBAAAA,MAAC,QACE,eAAK,OAAO,IAAI,CAAC,UAChB,gBAAAA,MAAC,QACC,0BAAAC,OAAC,OAAE,MAAM,MAAM,WAAW,QAAO,UAAS,KAAI,uBAC5C;AAAA,wBAAAD,MAAC,YAAQ,gBAAM,MAAK;AAAA,QACpB,gBAAAA,MAAC,UAAK,eAAY,QAAO,oBAAC;AAAA,SAC5B,KAJO,MAAM,SAKf,CACD,GACH,IAEA,gBAAAA,MAAC,OACE,eAAK,SACF,uBACA,2DACN;AAAA,MAEF,gBAAAC,OAAC,QAAG;AAAA;AAAA,QACU,gBAAAD,MAAC,UAAM,eAAK,YAAY,UAAU,UAAI;AAAA,SACpD;AAAA,MACC,KAAK,YAAY,SAChB,gBAAAA,MAAC,QACE,eAAK,WAAW,IAAI,CAAC,WAAW;AAC/B,cAAM,YAAY,QAAQ,OAAO,YAAY,YAAY,OAAO,QAAQ,CAAC;AAEzE,cAAM,oBAAoB,YAAY,OAAO,2BAA2B,MAAM;AAC9E,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,oBAAoB,8BAA8B;AAAA,YAE7D;AAAA,8BAAAA,OAAC,SAAI,WAAU,4BACb;AAAA,gCAAAD,MAAC,YAAQ,iBAAO,MAAK;AAAA,gBACpB,CAAC,qBAAqB,YACrB,gBAAAA,MAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,GAClE,sBAAY,WAAW,WAC1B,IACE;AAAA,iBACN;AAAA,cACA,gBAAAC,OAAC,WACE;AAAA,4BAAY,oBAAiB;AAAA,gBAC7B,qBAAqB,OAAO;AAAA,iBAC/B;AAAA;AAAA;AAAA,UAdK,OAAO;AAAA,QAed;AAAA,MAEJ,CAAC,GACH,IAEA,gBAAAD,MAAC,OACE,eAAK,aAAa,4BAA4B,6CACjD;AAAA,MAED,KAAK,YAAY,KAAK,CAAC,cAAc,CAAC,CAAC,UAAU,KAAK,EAAE,SAAS,SAAS,CAAC,IAC1E,gBAAAC,OAAC,SAAI,WAAU,2BAA0B;AAAA;AAAA,QACnB;AAAA,QACnB,KAAK,WACH,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,KAAK,EAAE,SAAS,SAAS,CAAC,EAC5D,IAAI,CAAC,cAAc,gBAAgB,SAAS,KAAK,SAAS,EAC1D,KAAK,IAAI;AAAA,SACd,IACE;AAAA,OACN;AAAA,IACA,gBAAAA,OAAC,aAAQ,WAAU,8BAA6B,cAAW,YACzD;AAAA,sBAAAD,MAAC,SAAI,WAAW,WAAW,CAAC,WAAW,8BAA8B,QACnE,0BAAAA,MAAC,YAAU,uBAAY,GACzB;AAAA,MACC,UACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,iBAAe;AAAA,UACf,SAAS,MAAM,YAAY,CAAC,UAAU,CAAC,KAAK;AAAA,UAE3C,qBAAW,cAAc;AAAA;AAAA,MAC5B,IACE;AAAA,OACN;AAAA,IACA,gBAAAC,OAAC,YACE;AAAA,WAAK,YACJ,gBAAAA,OAAC,OAAE,MAAM,KAAK,WAAW,QAAO,UAAS,KAAI,uBAAsB;AAAA;AAAA,QACjD,gBAAAD,MAAC,UAAK,eAAY,QAAO,oBAAC;AAAA,SAC5C,IACE;AAAA,MACH,YACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,UAAU,CAAC,eAAe,QAAQ;AAAA,UAClC,SAAS;AAAA,UAER,sBAAY,cAAc,OAAO,qBAAgB;AAAA;AAAA,MACpD,IACE;AAAA,MACH,QAAQ,gBAAAA,MAAC,OAAE,MAAK,SAAS,iBAAM,IAAO;AAAA,MACtC,sBACC,gBAAAA,MAAC,OAAE,8EAAgE,IACjE,kBACF,gBAAAA,MAAC,OAAE,8GAGH,IACE,CAAC,cACH,gBAAAA,MAAC,OAAE,0DAA4C,IAE/C,gBAAAA,MAAC,OAAE,6FAA+E;AAAA,OAEtF;AAAA,KACF;AAEJ;","names":["jsx","jsxs","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","services","useState","jsx","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","useEffect","useState","jsx","useState","useEffect","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","Fragment","jsx","jsxs","discoveryCache","useState","useRef","useEffect","useState","BoxesIcon","jsx","jsxs","useState","BoxesIcon"]}
|