@xopcai/xopc 0.0.75 → 0.0.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js → agents-DN3vr8pb.js} +2 -2
  4. package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js.map → agents-DN3vr8pb.js.map} +1 -1
  5. package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js → apps-page-BUn41aPi.js} +2 -2
  6. package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js.map → apps-page-BUn41aPi.js.map} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js → channels-settings-CYMmWDtP.js} +2 -2
  8. package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js.map → channels-settings-CYMmWDtP.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js → channels-status-swr-sJj4ueTp.js} +2 -2
  10. package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js.map → channels-status-swr-sJj4ueTp.js.map} +1 -1
  11. package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js → cron-api-CLxnaHdq.js} +2 -2
  12. package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js.map → cron-api-CLxnaHdq.js.map} +1 -1
  13. package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js → cron-page-BAQ8xSnJ.js} +2 -2
  14. package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js.map → cron-page-BAQ8xSnJ.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{dist-DXGDHevt.js → dist-BfJYxiK5.js} +2 -2
  16. package/dist/gateway/static/root/assets/{dist-DXGDHevt.js.map → dist-BfJYxiK5.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js → extension-debug-page-bgvVs-Sy.js} +2 -2
  18. package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js.map → extension-debug-page-bgvVs-Sy.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js → extension-page-SG4TVv-u.js} +2 -2
  20. package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js.map → extension-page-SG4TVv-u.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js → extension-settings-page-CJZRTsjF.js} +2 -2
  22. package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js.map → extension-settings-page-CJZRTsjF.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js → field-primitives-Z76hyBYS.js} +2 -2
  24. package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js.map → field-primitives-Z76hyBYS.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js → heartbeat-config-api-BqfDabSI.js} +2 -2
  26. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js.map → heartbeat-config-api-BqfDabSI.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{index-S3bgG2JF.js → index-ChiUhJAs.js} +44 -41
  28. package/dist/gateway/static/root/assets/{index-S3bgG2JF.js.map → index-ChiUhJAs.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js → logs-page-DrIMhDE2.js} +2 -2
  30. package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js.map → logs-page-DrIMhDE2.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js → sessions-page-B-RGO3N0.js} +2 -2
  32. package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js.map → sessions-page-B-RGO3N0.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js → settings-form-section-Csvl1iL6.js} +2 -2
  34. package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js.map → settings-form-section-Csvl1iL6.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js → settings-page-nxAc0ta1.js} +2 -2
  36. package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js.map → settings-page-nxAc0ta1.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js → skills-page-dHwx2vh0.js} +2 -2
  38. package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js.map → skills-page-dHwx2vh0.js.map} +1 -1
  39. package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js → utils-COYrNFF7.js} +2 -2
  40. package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js.map → utils-COYrNFF7.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js → voice-api-key-field-5WZZaxH3.js} +2 -2
  42. package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js.map → voice-api-key-field-5WZZaxH3.js.map} +1 -1
  43. package/dist/gateway/static/root/index.html +1 -1
  44. package/dist/package.js +1 -1
  45. package/dist/src/agent/embedded/session-manager-init.js +5 -1
  46. package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
  47. package/dist/src/channels/index.js +1 -1
  48. package/dist/src/channels/manager.js +1 -1
  49. package/dist/src/cli/commands/channels.js +1 -1
  50. package/dist/src/gateway/heartbeat/service.js +1 -1
  51. package/dist/src/gateway/service.js +1 -1
  52. package/dist/src/heartbeat/index.js +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"apps-page-DitlAmYZ.js","names":["AppsMainTab","parseAppsMainTab","raw","apiFetch","apiUrl","ExtensionMarketplacePackageDetail","id","name","type","description","readme","downloads","author","username","avatarUrl","latestVersion","version","changelog","publishedAt","readErrorMessage","res","Response","Promise","j","json","error","message","statusText","status","getExtensionMarketplacePackageDetail","packageName","enc","encodeURIComponent","trim","cache","ok","Error","data","payload","installExtensionFromMarketplace","opts","overwrite","extensionId","requiresGatewayRestart","method","headers","body","JSON","stringify","postBundledExtensionActivation","enabled","uninstallExtensionFromDisk","Dialog","ArrowLeft","CheckCircle","Loader2","Package","Search","Trash2","X","useCallback","useEffect","useReducer","useState","uiPatchReducer","Link","useSWR","useSWRConfig","MarkdownView","getExtensionMarketplacePackageDetail","installExtensionFromMarketplace","uninstallExtensionFromDisk","useExtensions","ExtensionApiRow","messages","MessageBundle","cn","fetchJson","apiUrl","useGatewayStore","useLocaleStore","RegistryEntry","id","name","description","npmPackage","version","categories","tags","verified","homepage","author","MarketplaceResponse","ok","extensions","extensionInstallKind","catalogId","row","find","x","source","MarketplaceUi","q","debounced","detailPkg","rowBusy","actionError","restartHint","initialMarketplaceUi","ExtensionMarketplacePanel","className","language","s","m","copy","appsPage","hasToken","Boolean","token","mutate","ui","dispatch","listKey","t","window","setTimeout","type","patch","trim","clearTimeout","data","isLoading","error","url","length","encodeURIComponent","revalidateOnFocus","refetchExtensions","dispatchEvent","CustomEvent","runInstall","packageName","overwrite","payload","requiresGatewayRestart","marketplaceRestartHint","e","Error","message","marketplaceInstallFailed","runUninstall","extensionId","marketplaceUninstallFailed","extensionsList","target","value","marketplaceSearchPlaceholder","marketplaceLoadFailed","marketplaceEmpty","map","kind","busy","marketplaceDetailTitle","ev","key","preventDefault","c","stopPropagation","marketplaceBuiltin","marketplaceInstalled","confirm","marketplaceUninstallConfirm","catch","marketplaceUninstall","marketplaceInstall","ExtensionMarketplaceDetailDialog","t0","$","_c","onClose","onInstall","onUninstall","setBusy","_temp","t1","t2","Symbol","for","t3","installKind","userInstalled","t4","marketplaceNoReadme","readme","readmeMd","t5","o","t6","t7","t8","detailBack","t9","t10","t11","detailClose","t12","t13","marketplaceAuthor","marketplaceDetailLoadFailed","marketplaceDetailReadmeHeading","marketplaceDownloads","marketplaceVersion","username","latestVersion","downloads","t14","t15","marketplaceBuiltinGoBuiltin","marketplaceBuiltinManageHint","marketplaceReinstall","marketplaceReinstallConfirm","_temp3","finally","then","_temp4","t16","_temp2","t17","Dialog","ArrowLeft","Check","ExternalLink","Loader2","Plus","Search","Settings","X","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Link","useSearchParams","useSWRConfig","Button","parseAppsMainTab","AppsMainTab","extensionHasProviderCredentialsSettings","extensionShellUiReachable","useExtensions","useExtensionsLoading","ExtensionMarketplacePanel","postBundledExtensionActivation","extensionPagePath","ExtensionApiRow","PageContribution","messages","MessageBundle","cn","usePageHeaderStore","useLocaleStore","AppsPageCopy","AppsPage","language","s","m","setPageHeader","clearPageHeader","extensions","loading","searchParams","setSearchParams","initialTab","get","initialQ","mainTab","setMainTab","search","setSearch","detail","setDetail","searchParamsKey","toString","trackedSearchParamsKeyRef","current","nextTab","nextQ","prev","params","URLSearchParams","qq","trim","set","delete","replace","bundledExtensions","filter","e","source","userExtensions","listForTab","filtered","q","toLowerCase","list","name","includes","id","description","toSorted","a","b","hasUi","localeCompare","next","find","eligPrev","activationEligibleFor","eligNext","active","startExtra","main","appsPage","title","end","showSearch","length","subtitle","appsNavAria","tabMarketplace","tabBuiltin","tabUser","target","value","searchPlaceholder","emptyBuiltin","emptyUser","noSearchResults","map","ext","activationEligible","providerLabel","copy","providerBundled","providerGlobal","providerWorkspace","providerOther","installSourceBadgeLabel","badgeSourceGlobal","badgeSourceWorkspace","badgeSourceOther","bundledRunCaption","eligible","runStateLive","runStatePendingOn","runStatePendingOff","runStateOff","ExtensionAppCard","t0","$","_c","extension","showSourceBadge","onOpen","t1","uiTitle","cardTooltipHasUi","cardTooltipNoUi","t2","Symbol","for","t3","t4","charAt","toUpperCase","t5","t6","t7","version","t8","t9","statusEnabled","t10","t11","cardNoDescription","t12","t13","badgeKindUi","badgeKindBackend","t14","t15","badgeBundled","t16","t17","t18","t19","ExtensionDetailDialog","onClose","mutate","bundledToggleBusy","setBundledToggleBusy","bundledToggleErr","setBundledToggleErr","bundledRestartHint","setBundledRestartHint","bundledConfiguredOn","onBundledActivationToggle","requiresGatewayRestart","extensionId","enabled","window","dispatchEvent","CustomEvent","Error","message","builtinToggleFailed","pages","ui","contributions","settingsPanels","chatWidgets","sidebarPanels","primaryPage","p","showInNav","primarySettingsPanel","openPath","settingsPath","hasConfigSchema","o","preventDefault","detailBack","detailTitle","detailClose","detailProviderPrefix","detailNoDescription","backendOnlyHint","builtinConfigHint","builtinRuntimeToggle","builtinToggleBusy","builtinToggleDisable","builtinToggleEnable","builtinToggleRestartHint","cliManageHint","detailSectionFeatures","badgePages","badgeSettings","badgeWidgets","badgeSidebar","open","openSettings","restartNote","ContributionBadge","template","count","hidden","String","AppsPageSkeleton","const","_temp","k","EmptyAppsState"],"sources":["../../../../../web/src/features/apps/apps-page.constants.ts","../../../../../web/src/features/extensions/extension-marketplace-api.ts","../../../../../web/src/features/extensions/extension-marketplace.tsx","../../../../../web/src/pages/apps-page.tsx"],"sourcesContent":["export type AppsMainTab = 'marketplace' | 'builtin' | 'user';\n\nexport function parseAppsMainTab(raw: string | null): AppsMainTab {\n if (raw === 'builtin' || raw === 'user') return raw;\n return 'marketplace';\n}\n","import { apiFetch } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type ExtensionMarketplacePackageDetail = {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n};\n\nasync function readErrorMessage(res: Response): Promise<string> {\n try {\n const j = (await res.json()) as {\n error?: string | { message?: string };\n message?: string;\n };\n if (typeof j.error === 'string') return j.error;\n if (j.error && typeof j.error === 'object' && typeof j.error.message === 'string') {\n return j.error.message;\n }\n if (typeof j.message === 'string') return j.message;\n } catch {\n /* ignore */\n }\n return res.statusText || `HTTP ${res.status}`;\n}\n\nexport async function getExtensionMarketplacePackageDetail(\n packageName: string,\n): Promise<ExtensionMarketplacePackageDetail> {\n const enc = encodeURIComponent(packageName.trim());\n const res = await apiFetch(apiUrl(`/api/marketplace/packages/${enc}`), { cache: 'no-store' });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: ExtensionMarketplacePackageDetail;\n };\n if (!data.ok || !data.payload?.id) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n\nexport async function installExtensionFromMarketplace(opts: {\n name: string;\n version?: string;\n overwrite?: boolean;\n}): Promise<{ extensionId: string; version: string; requiresGatewayRestart: boolean }> {\n const res = await apiFetch(apiUrl('/api/marketplace/install'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(opts),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: { extensionId: string; version: string; requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload?.extensionId) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n\n/** Persist `extensions.enabled` / `extensions.disabled` for a bundled extension (gateway may need restart to load code). */\nexport async function postBundledExtensionActivation(opts: {\n extensionId: string;\n enabled: boolean;\n}): Promise<{ requiresGatewayRestart: boolean }> {\n const res = await apiFetch(apiUrl('/api/extensions/bundled/activation'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ extensionId: opts.extensionId.trim(), enabled: opts.enabled }),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: { message?: string };\n payload?: { requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload) {\n throw new Error(data.error?.message ?? 'Invalid response');\n }\n return data.payload;\n}\n\nexport async function uninstallExtensionFromDisk(extensionId: string): Promise<{\n requiresGatewayRestart: boolean;\n}> {\n const res = await apiFetch(apiUrl('/api/marketplace/uninstall'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ extensionId }),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: { requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { ArrowLeft, CheckCircle, Loader2, Package, Search, Trash2, X } from 'lucide-react';\nimport { useCallback, useEffect, useReducer, useState } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { Link } from 'react-router-dom';\nimport useSWR, { useSWRConfig } from 'swr';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport {\n getExtensionMarketplacePackageDetail,\n installExtensionFromMarketplace,\n uninstallExtensionFromDisk,\n} from '@/features/extensions/extension-marketplace-api';\nimport { useExtensions } from '@/features/extensions/extension-provider';\nimport type { ExtensionApiRow } from '@/features/extensions/types';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype RegistryEntry = {\n id: string;\n name: string;\n description?: string;\n npmPackage: string;\n version?: string;\n categories?: string[];\n tags?: string[];\n verified?: boolean;\n homepage?: string;\n author?: string;\n};\n\ntype MarketplaceResponse = { ok: boolean; extensions: RegistryEntry[] };\n\n/** Same catalog id on disk: bundled vs user/global/workspace. */\nfunction extensionInstallKind(\n extensions: ExtensionApiRow[],\n catalogId: string,\n): 'absent' | 'bundled' | 'user' {\n const row = extensions.find((x) => x.id === catalogId);\n if (!row) return 'absent';\n if (row.source === 'bundled') return 'bundled';\n return 'user';\n}\n\ntype MarketplaceUi = {\n q: string;\n debounced: string;\n detailPkg: string | null;\n rowBusy: string | null;\n actionError: string | null;\n restartHint: string | null;\n};\n\nconst initialMarketplaceUi: MarketplaceUi = {\n q: '',\n debounced: '',\n detailPkg: null,\n rowBusy: null,\n actionError: null,\n restartHint: null,\n};\n\nexport function ExtensionMarketplacePanel({ className }: { className?: string }) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const copy = m.appsPage;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const extensions = useExtensions();\n const { mutate } = useSWRConfig();\n const [ui, dispatch] = useReducer(uiPatchReducer<MarketplaceUi>, initialMarketplaceUi);\n const { q, debounced, detailPkg, rowBusy, actionError, restartHint } = ui;\n const listKey = hasToken ? `marketplace-${debounced}` : null;\n\n useEffect(() => {\n const t = window.setTimeout(() => dispatch({ type: 'patch', patch: { debounced: q.trim() } }), 300);\n return () => window.clearTimeout(t);\n }, [q]);\n\n const { data, isLoading, error } = useSWR(\n listKey,\n async () => {\n const url =\n debounced.length > 0\n ? apiUrl(`/api/marketplace?q=${encodeURIComponent(debounced)}`)\n : apiUrl('/api/marketplace');\n return fetchJson<MarketplaceResponse>(url);\n },\n { revalidateOnFocus: false },\n );\n\n const refetchExtensions = useCallback(() => {\n void mutate('gateway-extensions-list');\n window.dispatchEvent(new CustomEvent('config-reload'));\n }, [mutate]);\n\n const runInstall = useCallback(\n async (packageName: string, overwrite: boolean) => {\n dispatch({ type: 'patch', patch: { actionError: null, restartHint: null, rowBusy: packageName } });\n try {\n const payload = await installExtensionFromMarketplace({ name: packageName, overwrite });\n refetchExtensions();\n if (payload.requiresGatewayRestart) {\n dispatch({ type: 'patch', patch: { restartHint: copy.marketplaceRestartHint } });\n }\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : copy.marketplaceInstallFailed },\n });\n throw e;\n } finally {\n dispatch({ type: 'patch', patch: { rowBusy: null } });\n }\n },\n [copy.marketplaceInstallFailed, copy.marketplaceRestartHint, refetchExtensions],\n );\n\n const runUninstall = useCallback(\n async (extensionId: string) => {\n dispatch({ type: 'patch', patch: { actionError: null, restartHint: null, rowBusy: extensionId } });\n try {\n const payload = await uninstallExtensionFromDisk(extensionId);\n refetchExtensions();\n if (payload.requiresGatewayRestart) {\n dispatch({ type: 'patch', patch: { restartHint: copy.marketplaceRestartHint } });\n }\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : copy.marketplaceUninstallFailed },\n });\n throw e;\n } finally {\n dispatch({ type: 'patch', patch: { rowBusy: null } });\n }\n },\n [copy.marketplaceRestartHint, copy.marketplaceUninstallFailed, refetchExtensions],\n );\n\n const extensionsList = data?.extensions ?? [];\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n value={q}\n onChange={(e) => dispatch({ type: 'patch', patch: { q: e.target.value } })}\n placeholder={copy.marketplaceSearchPlaceholder}\n className=\"ui-input h-10 w-full rounded-lg border border-edge bg-surface-base pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted\"\n />\n </div>\n\n {error ? (\n <p className=\"text-sm text-fg-muted\">\n {error instanceof Error ? error.message : copy.marketplaceLoadFailed}\n </p>\n ) : null}\n {actionError ? <p className=\"text-sm text-red-600 dark:text-red-400\">{actionError}</p> : null}\n {restartHint ? <p className=\"text-sm text-fg-muted\">{restartHint}</p> : null}\n\n {isLoading && !data ? (\n <p className=\"text-sm text-fg-muted\">…</p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {extensionsList.length === 0 ? (\n <li className=\"text-sm text-fg-muted\">{copy.marketplaceEmpty}</li>\n ) : (\n extensionsList.map((e) => {\n const kind = extensionInstallKind(extensions, e.id);\n const busy = rowBusy === e.id;\n return (\n <li key={e.id} className=\"list-none\">\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={`${e.name}, ${copy.marketplaceDetailTitle}`}\n onClick={() => dispatch({ type: 'patch', patch: { detailPkg: e.id } })}\n onKeyDown={(ev) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n dispatch({ type: 'patch', patch: { detailPkg: e.id } });\n }\n }}\n className={cn(\n 'flex w-full cursor-pointer flex-wrap items-start gap-3 rounded-xl border border-edge bg-surface-base p-4 text-left shadow-surface',\n 'transition-[transform,background-color,border-color,box-shadow] duration-150 ease-out',\n 'hover:border-edge-subtle hover:bg-surface-hover/40',\n 'active:scale-[0.992] active:bg-surface-hover/55',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'dark:hover:bg-surface-hover/25 dark:active:bg-surface-hover/35',\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-semibold text-fg\">{e.name}</h3>\n {e.verified ? (\n <CheckCircle\n className=\"size-4 shrink-0 text-emerald-600 dark:text-emerald-400\"\n strokeWidth={1.75}\n aria-label=\"Verified\"\n />\n ) : null}\n {e.version ? (\n <span className=\"text-xs text-fg-muted\">{e.version}</span>\n ) : null}\n </div>\n {e.description ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-fg-muted\">{e.description}</p>\n ) : null}\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {(e.categories ?? []).map((c) => (\n <span\n key={c}\n className=\"rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-[11px] text-fg-muted\"\n >\n {c}\n </span>\n ))}\n </div>\n <p className=\"mt-2 flex items-center gap-1.5 text-xs text-fg-muted\">\n <Package className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <code className=\"rounded bg-surface-panel px-1 py-0.5\">{e.npmPackage}</code>\n </p>\n </div>\n <div\n role=\"group\"\n className=\"flex shrink-0 flex-col items-end gap-2 sm:min-w-[9rem]\"\n onClick={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n >\n {kind === 'bundled' ? (\n <span className=\"rounded-md bg-surface-hover px-2 py-1 text-[11px] font-medium text-fg-muted\">\n {copy.marketplaceBuiltin}\n </span>\n ) : kind === 'user' ? (\n <>\n <span className=\"text-[11px] font-medium text-fg-muted\">\n {copy.marketplaceInstalled}\n </span>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (!window.confirm(copy.marketplaceUninstallConfirm)) return;\n void runUninstall(e.id).catch(() => {\n /* error surfaced via actionError */\n });\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-xs font-medium text-fg',\n 'transition-colors active:scale-[0.98] active:bg-surface-hover/80',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? (\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-3.5\" strokeWidth={2} aria-hidden />\n )}\n {copy.marketplaceUninstall}\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n void runInstall(e.id, false).catch(() => {\n /* surfaced */\n });\n }}\n className={cn(\n 'inline-flex w-full items-center justify-center rounded-lg bg-accent px-3 py-2 text-xs font-medium text-white',\n 'shadow-surface transition-[transform,background-color] active:scale-[0.98]',\n 'hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? (\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n ) : null}\n {copy.marketplaceInstall}\n </button>\n )}\n </div>\n </div>\n </li>\n );\n })\n )}\n </ul>\n )}\n\n {detailPkg ? (\n <ExtensionMarketplaceDetailDialog\n packageName={detailPkg}\n copy={copy}\n extensions={extensions}\n onClose={() => dispatch({ type: 'patch', patch: { detailPkg: null } })}\n onInstall={runInstall}\n onUninstall={runUninstall}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ExtensionMarketplaceDetailDialog({\n packageName,\n copy,\n extensions,\n onClose,\n onInstall,\n onUninstall,\n}: {\n packageName: string;\n copy: MessageBundle['appsPage'];\n extensions: ExtensionApiRow[];\n onClose: () => void;\n onInstall: (name: string, overwrite: boolean) => Promise<void>;\n onUninstall: (id: string) => Promise<void>;\n}) {\n const [busy, setBusy] = useState(false);\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const key = hasToken ? `ext-mp-detail-${packageName}` : null;\n const { data, error, isLoading } = useSWR(\n key,\n async () => getExtensionMarketplacePackageDetail(packageName),\n { revalidateOnFocus: false },\n );\n\n const installKind = extensionInstallKind(extensions, packageName);\n const userInstalled = installKind === 'user';\n\n const readmeMd =\n data?.readme?.trim() ||\n (data?.description?.trim() ? `### ${data.name}\\n\\n${data.description}` : `*${copy.marketplaceNoReadme}*`);\n\n return (\n <Dialog.Root defaultOpen onOpenChange={(o) => !o && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim\" />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailBack}\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg\">\n {copy.marketplaceDetailTitle}\n </Dialog.Title>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailClose}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">\n {isLoading && !data ? (\n <p className=\"text-sm text-fg-muted\">…</p>\n ) : error ? (\n <p className=\"text-sm text-fg-muted\">{copy.marketplaceDetailLoadFailed}</p>\n ) : data ? (\n <>\n <h3 className=\"text-lg font-semibold text-fg\">{data.name}</h3>\n <p className=\"mt-1 text-xs text-fg-muted\">\n <code className=\"rounded bg-surface-panel px-1 py-0.5\">{data.id}</code>\n </p>\n <dl className=\"mt-3 grid gap-2 text-xs text-fg-muted sm:grid-cols-2\">\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceAuthor}</dt>\n <dd>{data.author.username}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceVersion}</dt>\n <dd>{data.latestVersion.version}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceDownloads}</dt>\n <dd>{data.downloads}</dd>\n </div>\n </dl>\n {data.readme?.trim() ? (\n <h4 className=\"mb-2 mt-6 text-sm font-semibold text-fg\">\n {copy.marketplaceDetailReadmeHeading}\n </h4>\n ) : null}\n <div className=\"markdown-content min-w-0 break-words text-sm\">\n <MarkdownView content={readmeMd} />\n </div>\n </>\n ) : null}\n </div>\n\n {data ? (\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-edge-subtle px-5 py-4\">\n {installKind === 'bundled' ? (\n <div className=\"flex w-full flex-col items-stretch gap-2\">\n <p className=\"text-sm leading-relaxed text-fg-muted\">{copy.marketplaceBuiltinManageHint}</p>\n <Link\n to=\"/apps?tab=builtin\"\n onClick={onClose}\n className=\"inline-flex w-fit items-center justify-center rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {copy.marketplaceBuiltinGoBuiltin}\n </Link>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (userInstalled) {\n if (!window.confirm(copy.marketplaceReinstallConfirm)) return;\n }\n setBusy(true);\n void onInstall(packageName, userInstalled)\n .catch(() => {\n /* parent sets actionError */\n })\n .finally(() => setBusy(false));\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium',\n 'bg-accent text-white shadow-surface hover:bg-accent-hover',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : null}\n {userInstalled ? copy.marketplaceReinstall : copy.marketplaceInstall}\n </button>\n {userInstalled ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (!window.confirm(copy.marketplaceUninstallConfirm)) return;\n setBusy(true);\n void onUninstall(packageName)\n .then(() => onClose())\n .catch(() => {\n /* parent */\n })\n .finally(() => setBusy(false));\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <Trash2 className=\"size-4 shrink-0\" aria-hidden />\n {copy.marketplaceUninstall}\n </button>\n ) : null}\n </>\n )}\n </div>\n ) : null}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { ArrowLeft, Check, ExternalLink, Loader2, Plus, Search, Settings, X } from 'lucide-react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useSWRConfig } from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { parseAppsMainTab, type AppsMainTab } from '@/features/apps/apps-page.constants';\nimport {\n extensionHasProviderCredentialsSettings,\n extensionShellUiReachable,\n useExtensions,\n useExtensionsLoading,\n} from '@/features/extensions/extension-provider';\nimport { ExtensionMarketplacePanel } from '@/features/extensions/extension-marketplace';\nimport { postBundledExtensionActivation } from '@/features/extensions/extension-marketplace-api';\nimport { extensionPagePath } from '@/features/extensions/extension-paths';\nimport type { ExtensionApiRow, PageContribution } from '@/features/extensions/types';\nimport { messages } from '@/i18n/messages';\nimport type { MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype AppsPageCopy = MessageBundle['appsPage'];\n\nexport function AppsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n const extensions = useExtensions();\n const loading = useExtensionsLoading();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const initialTab = parseAppsMainTab(searchParams.get('tab'));\n const initialQ = searchParams.get('q') ?? '';\n const [mainTab, setMainTab] = useState<AppsMainTab>(initialTab);\n const [search, setSearch] = useState(initialQ);\n const [detail, setDetail] = useState<ExtensionApiRow | null>(null);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\n const nextTab = parseAppsMainTab(searchParams.get('tab'));\n const nextQ = searchParams.get('q') ?? '';\n setMainTab((prev) => (prev === nextTab ? prev : nextTab));\n setSearch((prev) => (prev === nextQ ? prev : nextQ));\n }\n\n useEffect(() => {\n setSearchParams(\n (prev) => {\n const params = new URLSearchParams(prev);\n const qq = search.trim();\n if (qq) params.set('q', qq);\n else params.delete('q');\n if (mainTab !== 'marketplace') params.set('tab', mainTab);\n else params.delete('tab');\n if (params.toString() === prev.toString()) return prev;\n return params;\n },\n { replace: true },\n );\n }, [mainTab, search, setSearchParams]);\n\n const bundledExtensions = useMemo(\n () => extensions.filter((e) => e.source === 'bundled'),\n [extensions],\n );\n const userExtensions = useMemo(\n () => extensions.filter((e) => e.source !== 'bundled'),\n [extensions],\n );\n\n const listForTab = mainTab === 'builtin' ? bundledExtensions : userExtensions;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n let list = listForTab;\n if (q) {\n list = list.filter(\n (e) =>\n (e.name ?? '').toLowerCase().includes(q) ||\n e.id.toLowerCase().includes(q) ||\n (e.description ?? '').toLowerCase().includes(q),\n );\n }\n return list.toSorted((a, b) => {\n if (a.hasUi !== b.hasUi) return a.hasUi ? -1 : 1;\n return (a.name || a.id).localeCompare(b.name || b.id, language);\n });\n }, [listForTab, search, language]);\n\n /** Keep dialog + cards in sync after SWR refetch (detail was a stale row reference). */\n useEffect(() => {\n setDetail((prev) => {\n if (!prev) return prev;\n const next = extensions.find((e) => e.id === prev.id);\n if (!next) return null;\n const eligPrev = activationEligibleFor(prev);\n const eligNext = activationEligibleFor(next);\n if (eligPrev === eligNext && prev.active === next.active) return prev;\n return next;\n });\n }, [extensions]);\n\n useLayoutEffect(() => {\n setPageHeader({\n startExtra: null,\n main: (\n <div className=\"w-full min-w-0 px-3 sm:px-5 xl:px-6\">\n <h1 className=\"min-w-0 truncate text-base font-semibold tracking-tight text-fg\">{m.appsPage.title}</h1>\n </div>\n ),\n end: null,\n });\n return () => clearPageHeader();\n }, [clearPageHeader, m.appsPage.title, setPageHeader]);\n\n if (loading && mainTab !== 'marketplace') {\n return <AppsPageSkeleton />;\n }\n\n const showSearch = mainTab !== 'marketplace' && listForTab.length > 0;\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-fg\">{m.appsPage.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{m.appsPage.subtitle}</p>\n </header>\n\n <div className=\"mb-5 flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle\">\n <div\n className=\"flex flex-wrap gap-x-1 gap-y-1\"\n role=\"tablist\"\n aria-label={m.appsPage.appsNavAria}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'marketplace'}\n className={cn(\n 'relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center',\n mainTab === 'marketplace' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'marketplace' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('marketplace')}\n >\n {m.appsPage.tabMarketplace}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'builtin'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'builtin' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'builtin' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('builtin')}\n >\n {m.appsPage.tabBuiltin}\n <span className=\"ml-1 tabular-nums text-fg-muted\">({bundledExtensions.length})</span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'user'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'user' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'user' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('user')}\n >\n {m.appsPage.tabUser}\n <span className=\"ml-1 tabular-nums text-fg-muted\">({userExtensions.length})</span>\n </button>\n </div>\n {showSearch ? (\n <div className=\"relative w-full min-w-0 sm:max-w-xs\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted\"\n aria-hidden\n />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={m.appsPage.searchPlaceholder}\n className=\"w-full rounded-lg border border-edge bg-surface-base py-2 pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n autoComplete=\"off\"\n />\n </div>\n ) : null}\n </div>\n\n {mainTab === 'marketplace' ? (\n <ExtensionMarketplacePanel />\n ) : mainTab === 'builtin' && bundledExtensions.length === 0 ? (\n <EmptyAppsState message={m.appsPage.emptyBuiltin} />\n ) : mainTab === 'user' && userExtensions.length === 0 ? (\n <EmptyAppsState message={m.appsPage.emptyUser} />\n ) : filtered.length === 0 ? (\n <p className=\"rounded-xl border border-dashed border-edge-subtle bg-surface-hover/30 px-4 py-8 text-center text-sm text-fg-muted dark:bg-surface-hover/15\">\n {m.appsPage.noSearchResults}\n </p>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((ext) => (\n <ExtensionAppCard\n key={ext.id}\n extension={ext}\n copy={m.appsPage}\n showSourceBadge={mainTab === 'user'}\n onOpen={() => setDetail(ext)}\n />\n ))}\n </div>\n )}\n </div>\n\n {detail ? (\n <ExtensionDetailDialog key={detail.id} extension={detail} copy={m.appsPage} onClose={() => setDetail(null)} />\n ) : null}\n </div>\n );\n}\n\nfunction activationEligibleFor(ext: ExtensionApiRow): boolean {\n return ext.activationEligible ?? ext.active;\n}\n\nfunction providerLabel(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n if (ext.source === 'bundled') return copy.providerBundled;\n if (ext.source === 'global') return copy.providerGlobal;\n if (ext.source === 'workspace') return copy.providerWorkspace;\n return copy.providerOther;\n}\n\nfunction installSourceBadgeLabel(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n if (ext.source === 'global') return copy.badgeSourceGlobal;\n if (ext.source === 'workspace') return copy.badgeSourceWorkspace;\n return copy.badgeSourceOther;\n}\n\nfunction bundledRunCaption(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n const eligible = activationEligibleFor(ext);\n if (eligible && ext.active) return copy.runStateLive;\n if (eligible && !ext.active) return copy.runStatePendingOn;\n if (!eligible && ext.active) return copy.runStatePendingOff;\n return copy.runStateOff;\n}\n\nfunction ExtensionAppCard({\n extension: ext,\n copy,\n showSourceBadge,\n onOpen,\n}: {\n extension: ExtensionApiRow;\n copy: AppsPageCopy;\n /** When true, show a short global/workspace/other pill (user-installed tab). */\n showSourceBadge: boolean;\n onOpen: () => void;\n}) {\n const eligible = activationEligibleFor(ext);\n const uiTitle = ext.hasUi ? copy.cardTooltipHasUi : copy.cardTooltipNoUi;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'group flex w-full flex-col rounded-xl border border-edge bg-surface-base p-4 text-left shadow-sm transition-colors',\n 'hover:border-edge-subtle hover:bg-surface-hover/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'dark:hover:bg-surface-hover/25',\n )}\n >\n <div className=\"flex gap-3\">\n <div\n className=\"flex size-12 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-base font-semibold text-accent-fg\"\n aria-hidden\n >\n {(ext.name || ext.id).charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-fg\">{ext.name}</h2>\n {ext.version ? (\n <span className=\"text-[11px] text-fg-muted\">v{ext.version}</span>\n ) : null}\n </div>\n {eligible ? (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted\">\n <Check className=\"size-3\" strokeWidth={2.5} aria-hidden />\n {copy.statusEnabled}\n </span>\n ) : (\n <span\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full border-2 border-accent text-accent\"\n aria-hidden\n >\n <Plus className=\"size-4\" strokeWidth={2.5} />\n </span>\n )}\n </div>\n <p className=\"mt-2 line-clamp-2 text-xs leading-relaxed text-fg-muted\">\n {ext.description?.trim() || copy.cardNoDescription}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n <span\n title={uiTitle}\n className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\"\n >\n {ext.hasUi ? copy.badgeKindUi : copy.badgeKindBackend}\n </span>\n {ext.source === 'bundled' ? (\n <span className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\">\n {copy.badgeBundled}\n </span>\n ) : showSourceBadge ? (\n <span\n title={providerLabel(ext, copy)}\n className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\"\n >\n {installSourceBadgeLabel(ext, copy)}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction ExtensionDetailDialog({\n extension: ext,\n copy,\n onClose,\n}: {\n extension: ExtensionApiRow;\n copy: AppsPageCopy;\n onClose: () => void;\n}) {\n const { mutate } = useSWRConfig();\n const [bundledToggleBusy, setBundledToggleBusy] = useState(false);\n const [bundledToggleErr, setBundledToggleErr] = useState<string | null>(null);\n const [bundledRestartHint, setBundledRestartHint] = useState(false);\n\n // Reflect *user intent* — the persisted enabled/disabled config — rather than\n // whether the gateway has actually loaded the process yet. Without this,\n // disabling a still-running extension leaves the button labelled \"停用\",\n // making the toggle look like it did nothing on subsequent clicks.\n const bundledConfiguredOn = ext.activationEligible === true;\n\n const onBundledActivationToggle = useCallback(async () => {\n if (ext.source !== 'bundled') return;\n setBundledToggleErr(null);\n setBundledRestartHint(false);\n setBundledToggleBusy(true);\n try {\n const { requiresGatewayRestart } = await postBundledExtensionActivation({\n extensionId: ext.id,\n enabled: !bundledConfiguredOn,\n });\n await mutate('gateway-extensions-list');\n window.dispatchEvent(new CustomEvent('config-reload'));\n setBundledRestartHint(requiresGatewayRestart);\n } catch (e) {\n setBundledToggleErr(e instanceof Error ? e.message : copy.builtinToggleFailed);\n } finally {\n setBundledToggleBusy(false);\n }\n }, [bundledConfiguredOn, copy.builtinToggleFailed, ext.id, ext.source, mutate]);\n\n const pages = ext.ui?.contributions?.pages ?? [];\n const settingsPanels = ext.ui?.contributions?.settingsPanels ?? [];\n const chatWidgets = ext.ui?.contributions?.chatWidgets ?? [];\n const sidebarPanels = ext.ui?.contributions?.sidebarPanels ?? [];\n const primaryPage: PageContribution | undefined = pages.find((p) => p.showInNav) ?? pages[0];\n const primarySettingsPanel = settingsPanels[0];\n const openPath = primaryPage ? extensionPagePath(ext.id, primaryPage) : null;\n const settingsPath = primarySettingsPanel\n ? `/settings/ext/${ext.id}/${primarySettingsPanel.id}`\n : ext.hasConfigSchema || extensionHasProviderCredentialsSettings(ext)\n ? `/settings/ext/${ext.id}`\n : null;\n\n return (\n <Dialog.Root defaultOpen onOpenChange={(o) => !o && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim\" />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailBack}\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg\">\n {copy.detailTitle}\n </Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n {ext.name} ({ext.id})\n </Dialog.Description>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailClose}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">\n <div className=\"flex flex-wrap items-start gap-4\">\n <div\n className=\"flex size-16 shrink-0 items-center justify-center rounded-2xl bg-accent-soft text-xl font-semibold text-accent-fg\"\n aria-hidden\n >\n {(ext.name || ext.id).charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-lg font-semibold text-fg\">{ext.name}</h3>\n <p className=\"mt-0.5 text-sm text-fg-muted\">\n {copy.detailProviderPrefix} {providerLabel(ext, copy)}\n </p>\n {ext.version ? (\n <p className=\"mt-1 text-xs text-fg-muted\">v{ext.version}</p>\n ) : null}\n </div>\n </div>\n\n <p className=\"mt-5 text-sm leading-relaxed text-fg\">\n {ext.description?.trim() || copy.detailNoDescription}\n </p>\n\n {!ext.hasUi ? (\n <p className=\"mt-3 text-xs text-fg-muted\">{copy.backendOnlyHint}</p>\n ) : null}\n\n <p className=\"mt-2 text-xs text-fg-muted\">{bundledRunCaption(ext, copy)}</p>\n\n {ext.source === 'bundled' ? (\n <>\n <p className=\"mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20\">\n {copy.builtinConfigHint}\n </p>\n <div className=\"mt-3 rounded-lg border border-edge-subtle bg-surface-hover/40 p-3 dark:bg-surface-hover/20\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-fg\">{copy.builtinRuntimeToggle}</span>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={bundledToggleBusy}\n onClick={() => void onBundledActivationToggle()}\n className=\"shrink-0 py-1.5 text-xs\"\n >\n {bundledToggleBusy ? (\n <>\n <Loader2 className=\"mr-1.5 size-3.5 shrink-0 animate-spin\" aria-hidden />\n {copy.builtinToggleBusy}\n </>\n ) : bundledConfiguredOn ? (\n copy.builtinToggleDisable\n ) : (\n copy.builtinToggleEnable\n )}\n </Button>\n </div>\n {bundledToggleErr ? (\n <p className=\"mt-2 text-xs text-rose-600 dark:text-rose-400\">{bundledToggleErr}</p>\n ) : null}\n {bundledRestartHint ? (\n <p className=\"mt-2 text-xs text-fg-muted\">{copy.builtinToggleRestartHint}</p>\n ) : null}\n </div>\n </>\n ) : (\n <p className=\"mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20\">\n {copy.cliManageHint}\n </p>\n )}\n\n {ext.hasUi && (pages.length > 0 || settingsPanels.length > 0 || chatWidgets.length > 0) ? (\n <section className=\"mt-8\">\n <h4 className=\"mb-3 text-sm font-semibold text-fg\">{copy.detailSectionFeatures}</h4>\n <div className=\"flex flex-wrap gap-1.5\">\n <ContributionBadge\n template={copy.badgePages}\n count={pages.length}\n hidden={pages.length === 0}\n />\n <ContributionBadge\n template={copy.badgeSettings}\n count={settingsPanels.length}\n hidden={settingsPanels.length === 0}\n />\n <ContributionBadge\n template={copy.badgeWidgets}\n count={chatWidgets.length}\n hidden={chatWidgets.length === 0}\n />\n <ContributionBadge\n template={copy.badgeSidebar}\n count={sidebarPanels.length}\n hidden={sidebarPanels.length === 0}\n />\n </div>\n </section>\n ) : null}\n\n {extensionShellUiReachable(ext) && (openPath || settingsPath) ? (\n <div className=\"mt-6 flex flex-wrap gap-2 border-t border-edge-subtle pt-4\">\n {openPath ? (\n <Link\n to={openPath}\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <ExternalLink className=\"size-4 shrink-0 opacity-80\" aria-hidden />\n {copy.open}\n </Link>\n ) : null}\n {settingsPath ? (\n <Link\n to={settingsPath}\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <Settings className=\"size-4 shrink-0 opacity-80\" aria-hidden />\n {copy.openSettings}\n </Link>\n ) : null}\n </div>\n ) : null}\n\n <p className=\"mt-6 text-[11px] leading-relaxed text-fg-muted\">{copy.restartNote}</p>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nfunction ContributionBadge({\n template,\n count,\n hidden,\n}: {\n template: string;\n count: number;\n hidden: boolean;\n}) {\n if (hidden || count === 0) return null;\n return (\n <span className=\"inline-flex items-center rounded-md bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted\">\n {template.replace(/\\{\\{count\\}\\}/g, String(count))}\n </span>\n );\n}\n\nfunction AppsPageSkeleton() {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <div className=\"mb-6 h-8 w-40 max-w-full animate-pulse rounded-md bg-surface-hover\" />\n <div className=\"mb-2 h-4 w-full max-w-md animate-pulse rounded bg-surface-hover\" />\n <div className=\"mb-5 h-9 w-full max-w-lg animate-pulse rounded-full bg-surface-hover\" />\n <div className=\"mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {(['ap0', 'ap1', 'ap2', 'ap3', 'ap4', 'ap5'] as const).map((k) => (\n <div key={k} className=\"h-36 animate-pulse rounded-xl border border-edge bg-surface-base\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction EmptyAppsState({ message }: { message: string }) {\n return (\n <div className=\"flex min-h-[min(40vh,16rem)] flex-col items-center justify-center rounded-xl border border-dashed border-edge-subtle bg-surface-hover/40 px-4 py-12 text-center dark:bg-surface-hover/20\">\n <p className=\"text-sm text-fg-muted\">{message}</p>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"apps-page-BUn41aPi.js","names":["AppsMainTab","parseAppsMainTab","raw","apiFetch","apiUrl","ExtensionMarketplacePackageDetail","id","name","type","description","readme","downloads","author","username","avatarUrl","latestVersion","version","changelog","publishedAt","readErrorMessage","res","Response","Promise","j","json","error","message","statusText","status","getExtensionMarketplacePackageDetail","packageName","enc","encodeURIComponent","trim","cache","ok","Error","data","payload","installExtensionFromMarketplace","opts","overwrite","extensionId","requiresGatewayRestart","method","headers","body","JSON","stringify","postBundledExtensionActivation","enabled","uninstallExtensionFromDisk","Dialog","ArrowLeft","CheckCircle","Loader2","Package","Search","Trash2","X","useCallback","useEffect","useReducer","useState","uiPatchReducer","Link","useSWR","useSWRConfig","MarkdownView","getExtensionMarketplacePackageDetail","installExtensionFromMarketplace","uninstallExtensionFromDisk","useExtensions","ExtensionApiRow","messages","MessageBundle","cn","fetchJson","apiUrl","useGatewayStore","useLocaleStore","RegistryEntry","id","name","description","npmPackage","version","categories","tags","verified","homepage","author","MarketplaceResponse","ok","extensions","extensionInstallKind","catalogId","row","find","x","source","MarketplaceUi","q","debounced","detailPkg","rowBusy","actionError","restartHint","initialMarketplaceUi","ExtensionMarketplacePanel","className","language","s","m","copy","appsPage","hasToken","Boolean","token","mutate","ui","dispatch","listKey","t","window","setTimeout","type","patch","trim","clearTimeout","data","isLoading","error","url","length","encodeURIComponent","revalidateOnFocus","refetchExtensions","dispatchEvent","CustomEvent","runInstall","packageName","overwrite","payload","requiresGatewayRestart","marketplaceRestartHint","e","Error","message","marketplaceInstallFailed","runUninstall","extensionId","marketplaceUninstallFailed","extensionsList","target","value","marketplaceSearchPlaceholder","marketplaceLoadFailed","marketplaceEmpty","map","kind","busy","marketplaceDetailTitle","ev","key","preventDefault","c","stopPropagation","marketplaceBuiltin","marketplaceInstalled","confirm","marketplaceUninstallConfirm","catch","marketplaceUninstall","marketplaceInstall","ExtensionMarketplaceDetailDialog","t0","$","_c","onClose","onInstall","onUninstall","setBusy","_temp","t1","t2","Symbol","for","t3","installKind","userInstalled","t4","marketplaceNoReadme","readme","readmeMd","t5","o","t6","t7","t8","detailBack","t9","t10","t11","detailClose","t12","t13","marketplaceAuthor","marketplaceDetailLoadFailed","marketplaceDetailReadmeHeading","marketplaceDownloads","marketplaceVersion","username","latestVersion","downloads","t14","t15","marketplaceBuiltinGoBuiltin","marketplaceBuiltinManageHint","marketplaceReinstall","marketplaceReinstallConfirm","_temp3","finally","then","_temp4","t16","_temp2","t17","Dialog","ArrowLeft","Check","ExternalLink","Loader2","Plus","Search","Settings","X","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Link","useSearchParams","useSWRConfig","Button","parseAppsMainTab","AppsMainTab","extensionHasProviderCredentialsSettings","extensionShellUiReachable","useExtensions","useExtensionsLoading","ExtensionMarketplacePanel","postBundledExtensionActivation","extensionPagePath","ExtensionApiRow","PageContribution","messages","MessageBundle","cn","usePageHeaderStore","useLocaleStore","AppsPageCopy","AppsPage","language","s","m","setPageHeader","clearPageHeader","extensions","loading","searchParams","setSearchParams","initialTab","get","initialQ","mainTab","setMainTab","search","setSearch","detail","setDetail","searchParamsKey","toString","trackedSearchParamsKeyRef","current","nextTab","nextQ","prev","params","URLSearchParams","qq","trim","set","delete","replace","bundledExtensions","filter","e","source","userExtensions","listForTab","filtered","q","toLowerCase","list","name","includes","id","description","toSorted","a","b","hasUi","localeCompare","next","find","eligPrev","activationEligibleFor","eligNext","active","startExtra","main","appsPage","title","end","showSearch","length","subtitle","appsNavAria","tabMarketplace","tabBuiltin","tabUser","target","value","searchPlaceholder","emptyBuiltin","emptyUser","noSearchResults","map","ext","activationEligible","providerLabel","copy","providerBundled","providerGlobal","providerWorkspace","providerOther","installSourceBadgeLabel","badgeSourceGlobal","badgeSourceWorkspace","badgeSourceOther","bundledRunCaption","eligible","runStateLive","runStatePendingOn","runStatePendingOff","runStateOff","ExtensionAppCard","t0","$","_c","extension","showSourceBadge","onOpen","t1","uiTitle","cardTooltipHasUi","cardTooltipNoUi","t2","Symbol","for","t3","t4","charAt","toUpperCase","t5","t6","t7","version","t8","t9","statusEnabled","t10","t11","cardNoDescription","t12","t13","badgeKindUi","badgeKindBackend","t14","t15","badgeBundled","t16","t17","t18","t19","ExtensionDetailDialog","onClose","mutate","bundledToggleBusy","setBundledToggleBusy","bundledToggleErr","setBundledToggleErr","bundledRestartHint","setBundledRestartHint","bundledConfiguredOn","onBundledActivationToggle","requiresGatewayRestart","extensionId","enabled","window","dispatchEvent","CustomEvent","Error","message","builtinToggleFailed","pages","ui","contributions","settingsPanels","chatWidgets","sidebarPanels","primaryPage","p","showInNav","primarySettingsPanel","openPath","settingsPath","hasConfigSchema","o","preventDefault","detailBack","detailTitle","detailClose","detailProviderPrefix","detailNoDescription","backendOnlyHint","builtinConfigHint","builtinRuntimeToggle","builtinToggleBusy","builtinToggleDisable","builtinToggleEnable","builtinToggleRestartHint","cliManageHint","detailSectionFeatures","badgePages","badgeSettings","badgeWidgets","badgeSidebar","open","openSettings","restartNote","ContributionBadge","template","count","hidden","String","AppsPageSkeleton","const","_temp","k","EmptyAppsState"],"sources":["../../../../../web/src/features/apps/apps-page.constants.ts","../../../../../web/src/features/extensions/extension-marketplace-api.ts","../../../../../web/src/features/extensions/extension-marketplace.tsx","../../../../../web/src/pages/apps-page.tsx"],"sourcesContent":["export type AppsMainTab = 'marketplace' | 'builtin' | 'user';\n\nexport function parseAppsMainTab(raw: string | null): AppsMainTab {\n if (raw === 'builtin' || raw === 'user') return raw;\n return 'marketplace';\n}\n","import { apiFetch } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type ExtensionMarketplacePackageDetail = {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n};\n\nasync function readErrorMessage(res: Response): Promise<string> {\n try {\n const j = (await res.json()) as {\n error?: string | { message?: string };\n message?: string;\n };\n if (typeof j.error === 'string') return j.error;\n if (j.error && typeof j.error === 'object' && typeof j.error.message === 'string') {\n return j.error.message;\n }\n if (typeof j.message === 'string') return j.message;\n } catch {\n /* ignore */\n }\n return res.statusText || `HTTP ${res.status}`;\n}\n\nexport async function getExtensionMarketplacePackageDetail(\n packageName: string,\n): Promise<ExtensionMarketplacePackageDetail> {\n const enc = encodeURIComponent(packageName.trim());\n const res = await apiFetch(apiUrl(`/api/marketplace/packages/${enc}`), { cache: 'no-store' });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: ExtensionMarketplacePackageDetail;\n };\n if (!data.ok || !data.payload?.id) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n\nexport async function installExtensionFromMarketplace(opts: {\n name: string;\n version?: string;\n overwrite?: boolean;\n}): Promise<{ extensionId: string; version: string; requiresGatewayRestart: boolean }> {\n const res = await apiFetch(apiUrl('/api/marketplace/install'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(opts),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: { extensionId: string; version: string; requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload?.extensionId) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n\n/** Persist `extensions.enabled` / `extensions.disabled` for a bundled extension (gateway may need restart to load code). */\nexport async function postBundledExtensionActivation(opts: {\n extensionId: string;\n enabled: boolean;\n}): Promise<{ requiresGatewayRestart: boolean }> {\n const res = await apiFetch(apiUrl('/api/extensions/bundled/activation'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ extensionId: opts.extensionId.trim(), enabled: opts.enabled }),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: { message?: string };\n payload?: { requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload) {\n throw new Error(data.error?.message ?? 'Invalid response');\n }\n return data.payload;\n}\n\nexport async function uninstallExtensionFromDisk(extensionId: string): Promise<{\n requiresGatewayRestart: boolean;\n}> {\n const res = await apiFetch(apiUrl('/api/marketplace/uninstall'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ extensionId }),\n });\n if (!res.ok) {\n throw new Error(await readErrorMessage(res));\n }\n const data = (await res.json()) as {\n ok?: boolean;\n error?: string;\n payload?: { requiresGatewayRestart: boolean };\n };\n if (!data.ok || !data.payload) {\n throw new Error(data.error ?? 'Invalid response');\n }\n return data.payload;\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { ArrowLeft, CheckCircle, Loader2, Package, Search, Trash2, X } from 'lucide-react';\nimport { useCallback, useEffect, useReducer, useState } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { Link } from 'react-router-dom';\nimport useSWR, { useSWRConfig } from 'swr';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport {\n getExtensionMarketplacePackageDetail,\n installExtensionFromMarketplace,\n uninstallExtensionFromDisk,\n} from '@/features/extensions/extension-marketplace-api';\nimport { useExtensions } from '@/features/extensions/extension-provider';\nimport type { ExtensionApiRow } from '@/features/extensions/types';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype RegistryEntry = {\n id: string;\n name: string;\n description?: string;\n npmPackage: string;\n version?: string;\n categories?: string[];\n tags?: string[];\n verified?: boolean;\n homepage?: string;\n author?: string;\n};\n\ntype MarketplaceResponse = { ok: boolean; extensions: RegistryEntry[] };\n\n/** Same catalog id on disk: bundled vs user/global/workspace. */\nfunction extensionInstallKind(\n extensions: ExtensionApiRow[],\n catalogId: string,\n): 'absent' | 'bundled' | 'user' {\n const row = extensions.find((x) => x.id === catalogId);\n if (!row) return 'absent';\n if (row.source === 'bundled') return 'bundled';\n return 'user';\n}\n\ntype MarketplaceUi = {\n q: string;\n debounced: string;\n detailPkg: string | null;\n rowBusy: string | null;\n actionError: string | null;\n restartHint: string | null;\n};\n\nconst initialMarketplaceUi: MarketplaceUi = {\n q: '',\n debounced: '',\n detailPkg: null,\n rowBusy: null,\n actionError: null,\n restartHint: null,\n};\n\nexport function ExtensionMarketplacePanel({ className }: { className?: string }) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const copy = m.appsPage;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const extensions = useExtensions();\n const { mutate } = useSWRConfig();\n const [ui, dispatch] = useReducer(uiPatchReducer<MarketplaceUi>, initialMarketplaceUi);\n const { q, debounced, detailPkg, rowBusy, actionError, restartHint } = ui;\n const listKey = hasToken ? `marketplace-${debounced}` : null;\n\n useEffect(() => {\n const t = window.setTimeout(() => dispatch({ type: 'patch', patch: { debounced: q.trim() } }), 300);\n return () => window.clearTimeout(t);\n }, [q]);\n\n const { data, isLoading, error } = useSWR(\n listKey,\n async () => {\n const url =\n debounced.length > 0\n ? apiUrl(`/api/marketplace?q=${encodeURIComponent(debounced)}`)\n : apiUrl('/api/marketplace');\n return fetchJson<MarketplaceResponse>(url);\n },\n { revalidateOnFocus: false },\n );\n\n const refetchExtensions = useCallback(() => {\n void mutate('gateway-extensions-list');\n window.dispatchEvent(new CustomEvent('config-reload'));\n }, [mutate]);\n\n const runInstall = useCallback(\n async (packageName: string, overwrite: boolean) => {\n dispatch({ type: 'patch', patch: { actionError: null, restartHint: null, rowBusy: packageName } });\n try {\n const payload = await installExtensionFromMarketplace({ name: packageName, overwrite });\n refetchExtensions();\n if (payload.requiresGatewayRestart) {\n dispatch({ type: 'patch', patch: { restartHint: copy.marketplaceRestartHint } });\n }\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : copy.marketplaceInstallFailed },\n });\n throw e;\n } finally {\n dispatch({ type: 'patch', patch: { rowBusy: null } });\n }\n },\n [copy.marketplaceInstallFailed, copy.marketplaceRestartHint, refetchExtensions],\n );\n\n const runUninstall = useCallback(\n async (extensionId: string) => {\n dispatch({ type: 'patch', patch: { actionError: null, restartHint: null, rowBusy: extensionId } });\n try {\n const payload = await uninstallExtensionFromDisk(extensionId);\n refetchExtensions();\n if (payload.requiresGatewayRestart) {\n dispatch({ type: 'patch', patch: { restartHint: copy.marketplaceRestartHint } });\n }\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : copy.marketplaceUninstallFailed },\n });\n throw e;\n } finally {\n dispatch({ type: 'patch', patch: { rowBusy: null } });\n }\n },\n [copy.marketplaceRestartHint, copy.marketplaceUninstallFailed, refetchExtensions],\n );\n\n const extensionsList = data?.extensions ?? [];\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n value={q}\n onChange={(e) => dispatch({ type: 'patch', patch: { q: e.target.value } })}\n placeholder={copy.marketplaceSearchPlaceholder}\n className=\"ui-input h-10 w-full rounded-lg border border-edge bg-surface-base pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted\"\n />\n </div>\n\n {error ? (\n <p className=\"text-sm text-fg-muted\">\n {error instanceof Error ? error.message : copy.marketplaceLoadFailed}\n </p>\n ) : null}\n {actionError ? <p className=\"text-sm text-red-600 dark:text-red-400\">{actionError}</p> : null}\n {restartHint ? <p className=\"text-sm text-fg-muted\">{restartHint}</p> : null}\n\n {isLoading && !data ? (\n <p className=\"text-sm text-fg-muted\">…</p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {extensionsList.length === 0 ? (\n <li className=\"text-sm text-fg-muted\">{copy.marketplaceEmpty}</li>\n ) : (\n extensionsList.map((e) => {\n const kind = extensionInstallKind(extensions, e.id);\n const busy = rowBusy === e.id;\n return (\n <li key={e.id} className=\"list-none\">\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={`${e.name}, ${copy.marketplaceDetailTitle}`}\n onClick={() => dispatch({ type: 'patch', patch: { detailPkg: e.id } })}\n onKeyDown={(ev) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n dispatch({ type: 'patch', patch: { detailPkg: e.id } });\n }\n }}\n className={cn(\n 'flex w-full cursor-pointer flex-wrap items-start gap-3 rounded-xl border border-edge bg-surface-base p-4 text-left shadow-surface',\n 'transition-[transform,background-color,border-color,box-shadow] duration-150 ease-out',\n 'hover:border-edge-subtle hover:bg-surface-hover/40',\n 'active:scale-[0.992] active:bg-surface-hover/55',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'dark:hover:bg-surface-hover/25 dark:active:bg-surface-hover/35',\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-semibold text-fg\">{e.name}</h3>\n {e.verified ? (\n <CheckCircle\n className=\"size-4 shrink-0 text-emerald-600 dark:text-emerald-400\"\n strokeWidth={1.75}\n aria-label=\"Verified\"\n />\n ) : null}\n {e.version ? (\n <span className=\"text-xs text-fg-muted\">{e.version}</span>\n ) : null}\n </div>\n {e.description ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-fg-muted\">{e.description}</p>\n ) : null}\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {(e.categories ?? []).map((c) => (\n <span\n key={c}\n className=\"rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-[11px] text-fg-muted\"\n >\n {c}\n </span>\n ))}\n </div>\n <p className=\"mt-2 flex items-center gap-1.5 text-xs text-fg-muted\">\n <Package className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <code className=\"rounded bg-surface-panel px-1 py-0.5\">{e.npmPackage}</code>\n </p>\n </div>\n <div\n role=\"group\"\n className=\"flex shrink-0 flex-col items-end gap-2 sm:min-w-[9rem]\"\n onClick={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n >\n {kind === 'bundled' ? (\n <span className=\"rounded-md bg-surface-hover px-2 py-1 text-[11px] font-medium text-fg-muted\">\n {copy.marketplaceBuiltin}\n </span>\n ) : kind === 'user' ? (\n <>\n <span className=\"text-[11px] font-medium text-fg-muted\">\n {copy.marketplaceInstalled}\n </span>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (!window.confirm(copy.marketplaceUninstallConfirm)) return;\n void runUninstall(e.id).catch(() => {\n /* error surfaced via actionError */\n });\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-xs font-medium text-fg',\n 'transition-colors active:scale-[0.98] active:bg-surface-hover/80',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? (\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-3.5\" strokeWidth={2} aria-hidden />\n )}\n {copy.marketplaceUninstall}\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n void runInstall(e.id, false).catch(() => {\n /* surfaced */\n });\n }}\n className={cn(\n 'inline-flex w-full items-center justify-center rounded-lg bg-accent px-3 py-2 text-xs font-medium text-white',\n 'shadow-surface transition-[transform,background-color] active:scale-[0.98]',\n 'hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? (\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n ) : null}\n {copy.marketplaceInstall}\n </button>\n )}\n </div>\n </div>\n </li>\n );\n })\n )}\n </ul>\n )}\n\n {detailPkg ? (\n <ExtensionMarketplaceDetailDialog\n packageName={detailPkg}\n copy={copy}\n extensions={extensions}\n onClose={() => dispatch({ type: 'patch', patch: { detailPkg: null } })}\n onInstall={runInstall}\n onUninstall={runUninstall}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ExtensionMarketplaceDetailDialog({\n packageName,\n copy,\n extensions,\n onClose,\n onInstall,\n onUninstall,\n}: {\n packageName: string;\n copy: MessageBundle['appsPage'];\n extensions: ExtensionApiRow[];\n onClose: () => void;\n onInstall: (name: string, overwrite: boolean) => Promise<void>;\n onUninstall: (id: string) => Promise<void>;\n}) {\n const [busy, setBusy] = useState(false);\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const key = hasToken ? `ext-mp-detail-${packageName}` : null;\n const { data, error, isLoading } = useSWR(\n key,\n async () => getExtensionMarketplacePackageDetail(packageName),\n { revalidateOnFocus: false },\n );\n\n const installKind = extensionInstallKind(extensions, packageName);\n const userInstalled = installKind === 'user';\n\n const readmeMd =\n data?.readme?.trim() ||\n (data?.description?.trim() ? `### ${data.name}\\n\\n${data.description}` : `*${copy.marketplaceNoReadme}*`);\n\n return (\n <Dialog.Root defaultOpen onOpenChange={(o) => !o && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim\" />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailBack}\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg\">\n {copy.marketplaceDetailTitle}\n </Dialog.Title>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailClose}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">\n {isLoading && !data ? (\n <p className=\"text-sm text-fg-muted\">…</p>\n ) : error ? (\n <p className=\"text-sm text-fg-muted\">{copy.marketplaceDetailLoadFailed}</p>\n ) : data ? (\n <>\n <h3 className=\"text-lg font-semibold text-fg\">{data.name}</h3>\n <p className=\"mt-1 text-xs text-fg-muted\">\n <code className=\"rounded bg-surface-panel px-1 py-0.5\">{data.id}</code>\n </p>\n <dl className=\"mt-3 grid gap-2 text-xs text-fg-muted sm:grid-cols-2\">\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceAuthor}</dt>\n <dd>{data.author.username}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceVersion}</dt>\n <dd>{data.latestVersion.version}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-fg\">{copy.marketplaceDownloads}</dt>\n <dd>{data.downloads}</dd>\n </div>\n </dl>\n {data.readme?.trim() ? (\n <h4 className=\"mb-2 mt-6 text-sm font-semibold text-fg\">\n {copy.marketplaceDetailReadmeHeading}\n </h4>\n ) : null}\n <div className=\"markdown-content min-w-0 break-words text-sm\">\n <MarkdownView content={readmeMd} />\n </div>\n </>\n ) : null}\n </div>\n\n {data ? (\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-edge-subtle px-5 py-4\">\n {installKind === 'bundled' ? (\n <div className=\"flex w-full flex-col items-stretch gap-2\">\n <p className=\"text-sm leading-relaxed text-fg-muted\">{copy.marketplaceBuiltinManageHint}</p>\n <Link\n to=\"/apps?tab=builtin\"\n onClick={onClose}\n className=\"inline-flex w-fit items-center justify-center rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {copy.marketplaceBuiltinGoBuiltin}\n </Link>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (userInstalled) {\n if (!window.confirm(copy.marketplaceReinstallConfirm)) return;\n }\n setBusy(true);\n void onInstall(packageName, userInstalled)\n .catch(() => {\n /* parent sets actionError */\n })\n .finally(() => setBusy(false));\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium',\n 'bg-accent text-white shadow-surface hover:bg-accent-hover',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n {busy ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : null}\n {userInstalled ? copy.marketplaceReinstall : copy.marketplaceInstall}\n </button>\n {userInstalled ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n if (!window.confirm(copy.marketplaceUninstallConfirm)) return;\n setBusy(true);\n void onUninstall(packageName)\n .then(() => onClose())\n .catch(() => {\n /* parent */\n })\n .finally(() => setBusy(false));\n }}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <Trash2 className=\"size-4 shrink-0\" aria-hidden />\n {copy.marketplaceUninstall}\n </button>\n ) : null}\n </>\n )}\n </div>\n ) : null}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { ArrowLeft, Check, ExternalLink, Loader2, Plus, Search, Settings, X } from 'lucide-react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useSWRConfig } from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { parseAppsMainTab, type AppsMainTab } from '@/features/apps/apps-page.constants';\nimport {\n extensionHasProviderCredentialsSettings,\n extensionShellUiReachable,\n useExtensions,\n useExtensionsLoading,\n} from '@/features/extensions/extension-provider';\nimport { ExtensionMarketplacePanel } from '@/features/extensions/extension-marketplace';\nimport { postBundledExtensionActivation } from '@/features/extensions/extension-marketplace-api';\nimport { extensionPagePath } from '@/features/extensions/extension-paths';\nimport type { ExtensionApiRow, PageContribution } from '@/features/extensions/types';\nimport { messages } from '@/i18n/messages';\nimport type { MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype AppsPageCopy = MessageBundle['appsPage'];\n\nexport function AppsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n const extensions = useExtensions();\n const loading = useExtensionsLoading();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const initialTab = parseAppsMainTab(searchParams.get('tab'));\n const initialQ = searchParams.get('q') ?? '';\n const [mainTab, setMainTab] = useState<AppsMainTab>(initialTab);\n const [search, setSearch] = useState(initialQ);\n const [detail, setDetail] = useState<ExtensionApiRow | null>(null);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\n const nextTab = parseAppsMainTab(searchParams.get('tab'));\n const nextQ = searchParams.get('q') ?? '';\n setMainTab((prev) => (prev === nextTab ? prev : nextTab));\n setSearch((prev) => (prev === nextQ ? prev : nextQ));\n }\n\n useEffect(() => {\n setSearchParams(\n (prev) => {\n const params = new URLSearchParams(prev);\n const qq = search.trim();\n if (qq) params.set('q', qq);\n else params.delete('q');\n if (mainTab !== 'marketplace') params.set('tab', mainTab);\n else params.delete('tab');\n if (params.toString() === prev.toString()) return prev;\n return params;\n },\n { replace: true },\n );\n }, [mainTab, search, setSearchParams]);\n\n const bundledExtensions = useMemo(\n () => extensions.filter((e) => e.source === 'bundled'),\n [extensions],\n );\n const userExtensions = useMemo(\n () => extensions.filter((e) => e.source !== 'bundled'),\n [extensions],\n );\n\n const listForTab = mainTab === 'builtin' ? bundledExtensions : userExtensions;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n let list = listForTab;\n if (q) {\n list = list.filter(\n (e) =>\n (e.name ?? '').toLowerCase().includes(q) ||\n e.id.toLowerCase().includes(q) ||\n (e.description ?? '').toLowerCase().includes(q),\n );\n }\n return list.toSorted((a, b) => {\n if (a.hasUi !== b.hasUi) return a.hasUi ? -1 : 1;\n return (a.name || a.id).localeCompare(b.name || b.id, language);\n });\n }, [listForTab, search, language]);\n\n /** Keep dialog + cards in sync after SWR refetch (detail was a stale row reference). */\n useEffect(() => {\n setDetail((prev) => {\n if (!prev) return prev;\n const next = extensions.find((e) => e.id === prev.id);\n if (!next) return null;\n const eligPrev = activationEligibleFor(prev);\n const eligNext = activationEligibleFor(next);\n if (eligPrev === eligNext && prev.active === next.active) return prev;\n return next;\n });\n }, [extensions]);\n\n useLayoutEffect(() => {\n setPageHeader({\n startExtra: null,\n main: (\n <div className=\"w-full min-w-0 px-3 sm:px-5 xl:px-6\">\n <h1 className=\"min-w-0 truncate text-base font-semibold tracking-tight text-fg\">{m.appsPage.title}</h1>\n </div>\n ),\n end: null,\n });\n return () => clearPageHeader();\n }, [clearPageHeader, m.appsPage.title, setPageHeader]);\n\n if (loading && mainTab !== 'marketplace') {\n return <AppsPageSkeleton />;\n }\n\n const showSearch = mainTab !== 'marketplace' && listForTab.length > 0;\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-fg\">{m.appsPage.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{m.appsPage.subtitle}</p>\n </header>\n\n <div className=\"mb-5 flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle\">\n <div\n className=\"flex flex-wrap gap-x-1 gap-y-1\"\n role=\"tablist\"\n aria-label={m.appsPage.appsNavAria}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'marketplace'}\n className={cn(\n 'relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center',\n mainTab === 'marketplace' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'marketplace' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('marketplace')}\n >\n {m.appsPage.tabMarketplace}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'builtin'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'builtin' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'builtin' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('builtin')}\n >\n {m.appsPage.tabBuiltin}\n <span className=\"ml-1 tabular-nums text-fg-muted\">({bundledExtensions.length})</span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'user'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'user' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'user' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('user')}\n >\n {m.appsPage.tabUser}\n <span className=\"ml-1 tabular-nums text-fg-muted\">({userExtensions.length})</span>\n </button>\n </div>\n {showSearch ? (\n <div className=\"relative w-full min-w-0 sm:max-w-xs\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted\"\n aria-hidden\n />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={m.appsPage.searchPlaceholder}\n className=\"w-full rounded-lg border border-edge bg-surface-base py-2 pl-9 pr-3 text-sm text-fg placeholder:text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n autoComplete=\"off\"\n />\n </div>\n ) : null}\n </div>\n\n {mainTab === 'marketplace' ? (\n <ExtensionMarketplacePanel />\n ) : mainTab === 'builtin' && bundledExtensions.length === 0 ? (\n <EmptyAppsState message={m.appsPage.emptyBuiltin} />\n ) : mainTab === 'user' && userExtensions.length === 0 ? (\n <EmptyAppsState message={m.appsPage.emptyUser} />\n ) : filtered.length === 0 ? (\n <p className=\"rounded-xl border border-dashed border-edge-subtle bg-surface-hover/30 px-4 py-8 text-center text-sm text-fg-muted dark:bg-surface-hover/15\">\n {m.appsPage.noSearchResults}\n </p>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((ext) => (\n <ExtensionAppCard\n key={ext.id}\n extension={ext}\n copy={m.appsPage}\n showSourceBadge={mainTab === 'user'}\n onOpen={() => setDetail(ext)}\n />\n ))}\n </div>\n )}\n </div>\n\n {detail ? (\n <ExtensionDetailDialog key={detail.id} extension={detail} copy={m.appsPage} onClose={() => setDetail(null)} />\n ) : null}\n </div>\n );\n}\n\nfunction activationEligibleFor(ext: ExtensionApiRow): boolean {\n return ext.activationEligible ?? ext.active;\n}\n\nfunction providerLabel(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n if (ext.source === 'bundled') return copy.providerBundled;\n if (ext.source === 'global') return copy.providerGlobal;\n if (ext.source === 'workspace') return copy.providerWorkspace;\n return copy.providerOther;\n}\n\nfunction installSourceBadgeLabel(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n if (ext.source === 'global') return copy.badgeSourceGlobal;\n if (ext.source === 'workspace') return copy.badgeSourceWorkspace;\n return copy.badgeSourceOther;\n}\n\nfunction bundledRunCaption(ext: ExtensionApiRow, copy: AppsPageCopy): string {\n const eligible = activationEligibleFor(ext);\n if (eligible && ext.active) return copy.runStateLive;\n if (eligible && !ext.active) return copy.runStatePendingOn;\n if (!eligible && ext.active) return copy.runStatePendingOff;\n return copy.runStateOff;\n}\n\nfunction ExtensionAppCard({\n extension: ext,\n copy,\n showSourceBadge,\n onOpen,\n}: {\n extension: ExtensionApiRow;\n copy: AppsPageCopy;\n /** When true, show a short global/workspace/other pill (user-installed tab). */\n showSourceBadge: boolean;\n onOpen: () => void;\n}) {\n const eligible = activationEligibleFor(ext);\n const uiTitle = ext.hasUi ? copy.cardTooltipHasUi : copy.cardTooltipNoUi;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'group flex w-full flex-col rounded-xl border border-edge bg-surface-base p-4 text-left shadow-sm transition-colors',\n 'hover:border-edge-subtle hover:bg-surface-hover/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'dark:hover:bg-surface-hover/25',\n )}\n >\n <div className=\"flex gap-3\">\n <div\n className=\"flex size-12 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-base font-semibold text-accent-fg\"\n aria-hidden\n >\n {(ext.name || ext.id).charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-fg\">{ext.name}</h2>\n {ext.version ? (\n <span className=\"text-[11px] text-fg-muted\">v{ext.version}</span>\n ) : null}\n </div>\n {eligible ? (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted\">\n <Check className=\"size-3\" strokeWidth={2.5} aria-hidden />\n {copy.statusEnabled}\n </span>\n ) : (\n <span\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full border-2 border-accent text-accent\"\n aria-hidden\n >\n <Plus className=\"size-4\" strokeWidth={2.5} />\n </span>\n )}\n </div>\n <p className=\"mt-2 line-clamp-2 text-xs leading-relaxed text-fg-muted\">\n {ext.description?.trim() || copy.cardNoDescription}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n <span\n title={uiTitle}\n className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\"\n >\n {ext.hasUi ? copy.badgeKindUi : copy.badgeKindBackend}\n </span>\n {ext.source === 'bundled' ? (\n <span className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\">\n {copy.badgeBundled}\n </span>\n ) : showSourceBadge ? (\n <span\n title={providerLabel(ext, copy)}\n className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\"\n >\n {installSourceBadgeLabel(ext, copy)}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction ExtensionDetailDialog({\n extension: ext,\n copy,\n onClose,\n}: {\n extension: ExtensionApiRow;\n copy: AppsPageCopy;\n onClose: () => void;\n}) {\n const { mutate } = useSWRConfig();\n const [bundledToggleBusy, setBundledToggleBusy] = useState(false);\n const [bundledToggleErr, setBundledToggleErr] = useState<string | null>(null);\n const [bundledRestartHint, setBundledRestartHint] = useState(false);\n\n // Reflect *user intent* — the persisted enabled/disabled config — rather than\n // whether the gateway has actually loaded the process yet. Without this,\n // disabling a still-running extension leaves the button labelled \"停用\",\n // making the toggle look like it did nothing on subsequent clicks.\n const bundledConfiguredOn = ext.activationEligible === true;\n\n const onBundledActivationToggle = useCallback(async () => {\n if (ext.source !== 'bundled') return;\n setBundledToggleErr(null);\n setBundledRestartHint(false);\n setBundledToggleBusy(true);\n try {\n const { requiresGatewayRestart } = await postBundledExtensionActivation({\n extensionId: ext.id,\n enabled: !bundledConfiguredOn,\n });\n await mutate('gateway-extensions-list');\n window.dispatchEvent(new CustomEvent('config-reload'));\n setBundledRestartHint(requiresGatewayRestart);\n } catch (e) {\n setBundledToggleErr(e instanceof Error ? e.message : copy.builtinToggleFailed);\n } finally {\n setBundledToggleBusy(false);\n }\n }, [bundledConfiguredOn, copy.builtinToggleFailed, ext.id, ext.source, mutate]);\n\n const pages = ext.ui?.contributions?.pages ?? [];\n const settingsPanels = ext.ui?.contributions?.settingsPanels ?? [];\n const chatWidgets = ext.ui?.contributions?.chatWidgets ?? [];\n const sidebarPanels = ext.ui?.contributions?.sidebarPanels ?? [];\n const primaryPage: PageContribution | undefined = pages.find((p) => p.showInNav) ?? pages[0];\n const primarySettingsPanel = settingsPanels[0];\n const openPath = primaryPage ? extensionPagePath(ext.id, primaryPage) : null;\n const settingsPath = primarySettingsPanel\n ? `/settings/ext/${ext.id}/${primarySettingsPanel.id}`\n : ext.hasConfigSchema || extensionHasProviderCredentialsSettings(ext)\n ? `/settings/ext/${ext.id}`\n : null;\n\n return (\n <Dialog.Root defaultOpen onOpenChange={(o) => !o && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[130] bg-scrim\" />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-[131] flex max-h-[min(90vh,44rem)] w-[min(42rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-elevated\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailBack}\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-center text-sm font-semibold text-fg\">\n {copy.detailTitle}\n </Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n {ext.name} ({ext.id})\n </Dialog.Description>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"inline-flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label={copy.detailClose}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">\n <div className=\"flex flex-wrap items-start gap-4\">\n <div\n className=\"flex size-16 shrink-0 items-center justify-center rounded-2xl bg-accent-soft text-xl font-semibold text-accent-fg\"\n aria-hidden\n >\n {(ext.name || ext.id).charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-lg font-semibold text-fg\">{ext.name}</h3>\n <p className=\"mt-0.5 text-sm text-fg-muted\">\n {copy.detailProviderPrefix} {providerLabel(ext, copy)}\n </p>\n {ext.version ? (\n <p className=\"mt-1 text-xs text-fg-muted\">v{ext.version}</p>\n ) : null}\n </div>\n </div>\n\n <p className=\"mt-5 text-sm leading-relaxed text-fg\">\n {ext.description?.trim() || copy.detailNoDescription}\n </p>\n\n {!ext.hasUi ? (\n <p className=\"mt-3 text-xs text-fg-muted\">{copy.backendOnlyHint}</p>\n ) : null}\n\n <p className=\"mt-2 text-xs text-fg-muted\">{bundledRunCaption(ext, copy)}</p>\n\n {ext.source === 'bundled' ? (\n <>\n <p className=\"mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20\">\n {copy.builtinConfigHint}\n </p>\n <div className=\"mt-3 rounded-lg border border-edge-subtle bg-surface-hover/40 p-3 dark:bg-surface-hover/20\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-fg\">{copy.builtinRuntimeToggle}</span>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={bundledToggleBusy}\n onClick={() => void onBundledActivationToggle()}\n className=\"shrink-0 py-1.5 text-xs\"\n >\n {bundledToggleBusy ? (\n <>\n <Loader2 className=\"mr-1.5 size-3.5 shrink-0 animate-spin\" aria-hidden />\n {copy.builtinToggleBusy}\n </>\n ) : bundledConfiguredOn ? (\n copy.builtinToggleDisable\n ) : (\n copy.builtinToggleEnable\n )}\n </Button>\n </div>\n {bundledToggleErr ? (\n <p className=\"mt-2 text-xs text-rose-600 dark:text-rose-400\">{bundledToggleErr}</p>\n ) : null}\n {bundledRestartHint ? (\n <p className=\"mt-2 text-xs text-fg-muted\">{copy.builtinToggleRestartHint}</p>\n ) : null}\n </div>\n </>\n ) : (\n <p className=\"mt-4 rounded-lg border border-edge-subtle bg-surface-hover/40 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/20\">\n {copy.cliManageHint}\n </p>\n )}\n\n {ext.hasUi && (pages.length > 0 || settingsPanels.length > 0 || chatWidgets.length > 0) ? (\n <section className=\"mt-8\">\n <h4 className=\"mb-3 text-sm font-semibold text-fg\">{copy.detailSectionFeatures}</h4>\n <div className=\"flex flex-wrap gap-1.5\">\n <ContributionBadge\n template={copy.badgePages}\n count={pages.length}\n hidden={pages.length === 0}\n />\n <ContributionBadge\n template={copy.badgeSettings}\n count={settingsPanels.length}\n hidden={settingsPanels.length === 0}\n />\n <ContributionBadge\n template={copy.badgeWidgets}\n count={chatWidgets.length}\n hidden={chatWidgets.length === 0}\n />\n <ContributionBadge\n template={copy.badgeSidebar}\n count={sidebarPanels.length}\n hidden={sidebarPanels.length === 0}\n />\n </div>\n </section>\n ) : null}\n\n {extensionShellUiReachable(ext) && (openPath || settingsPath) ? (\n <div className=\"mt-6 flex flex-wrap gap-2 border-t border-edge-subtle pt-4\">\n {openPath ? (\n <Link\n to={openPath}\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <ExternalLink className=\"size-4 shrink-0 opacity-80\" aria-hidden />\n {copy.open}\n </Link>\n ) : null}\n {settingsPath ? (\n <Link\n to={settingsPath}\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <Settings className=\"size-4 shrink-0 opacity-80\" aria-hidden />\n {copy.openSettings}\n </Link>\n ) : null}\n </div>\n ) : null}\n\n <p className=\"mt-6 text-[11px] leading-relaxed text-fg-muted\">{copy.restartNote}</p>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nfunction ContributionBadge({\n template,\n count,\n hidden,\n}: {\n template: string;\n count: number;\n hidden: boolean;\n}) {\n if (hidden || count === 0) return null;\n return (\n <span className=\"inline-flex items-center rounded-md bg-surface-hover px-2 py-0.5 text-[11px] font-medium text-fg-muted\">\n {template.replace(/\\{\\{count\\}\\}/g, String(count))}\n </span>\n );\n}\n\nfunction AppsPageSkeleton() {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <div className=\"mb-6 h-8 w-40 max-w-full animate-pulse rounded-md bg-surface-hover\" />\n <div className=\"mb-2 h-4 w-full max-w-md animate-pulse rounded bg-surface-hover\" />\n <div className=\"mb-5 h-9 w-full max-w-lg animate-pulse rounded-full bg-surface-hover\" />\n <div className=\"mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {(['ap0', 'ap1', 'ap2', 'ap3', 'ap4', 'ap5'] as const).map((k) => (\n <div key={k} className=\"h-36 animate-pulse rounded-xl border border-edge bg-surface-base\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction EmptyAppsState({ message }: { message: string }) {\n return (\n <div className=\"flex min-h-[min(40vh,16rem)] flex-col items-center justify-center rounded-xl border border-dashed border-edge-subtle bg-surface-hover/40 px-4 py-12 text-center dark:bg-surface-hover/20\">\n <p className=\"text-sm text-fg-muted\">{message}</p>\n </div>\n );\n}\n"],"mappings":"+jBAEA,SAAA,EAAA,EAAA,iDAGA,CCaA,eAAemB,EAAiBC,EAAgC,CAC9D,GAAI,CACF,IAAMG,EAAK,MAAMH,EAAII,KAAK,EAI1B,GAAI,OAAOD,EAAEE,OAAU,SAAU,OAAOF,EAAEE,MAC1C,GAAIF,EAAEE,OAAS,OAAOF,EAAEE,OAAU,UAAY,OAAOF,EAAEE,MAAMC,SAAY,SACvE,OAAOH,EAAEE,MAAMC,QAEjB,GAAI,OAAOH,EAAEG,SAAY,SAAU,OAAOH,EAAEG,OAC9C,MAAQ,CACN,CAEF,OAAON,EAAIO,YAAc,QAAQP,EAAIQ,QACvC,CAEA,eAAsBC,GACpBC,EAC4C,CAE5C,IAAMV,EAAM,MAAMjB,EAASC,EAAO,6BADtB4B,mBAAmBF,EAAYG,KAAK,CACeF,GAAK,EAAG,CAAEG,MAAO,UAAW,CAAC,EAC5F,GAAI,CAACd,EAAIe,GACP,MAAUC,MAAM,MAAMjB,EAAiBC,CAAG,CAAC,EAE7C,IAAMiB,EAAQ,MAAMjB,EAAII,KAAK,EAK7B,GAAI,CAACa,EAAKF,IAAM,CAACE,EAAKC,SAAShC,GAC7B,MAAU8B,MAAMC,EAAKZ,OAAS,kBAAkB,EAElD,OAAOY,EAAKC,OACd,CAEA,eAAsBC,EAAgCC,EAIiC,CACrF,IAAMpB,EAAM,MAAMjB,EAASC,EAAO,0BAA0B,EAAG,CAC7DwC,OAAQ,OACRC,QAAS,CAAE,eAAgB,kBAAmB,EAC9CC,KAAMC,KAAKC,UAAUR,CAAI,CAC3B,CAAC,EACD,GAAI,CAACpB,EAAIe,GACP,MAAUC,MAAM,MAAMjB,EAAiBC,CAAG,CAAC,EAE7C,IAAMiB,EAAQ,MAAMjB,EAAII,KAAK,EAK7B,GAAI,CAACa,EAAKF,IAAM,CAACE,EAAKC,SAASI,YAC7B,MAAUN,MAAMC,EAAKZ,OAAS,kBAAkB,EAElD,OAAOY,EAAKC,OACd,CAGA,eAAsBW,EAA+BT,EAGJ,CAC/C,IAAMpB,EAAM,MAAMjB,EAASC,EAAO,oCAAoC,EAAG,CACvEwC,OAAQ,OACRC,QAAS,CAAE,eAAgB,kBAAmB,EAC9CC,KAAMC,KAAKC,UAAU,CAAEN,YAAaF,EAAKE,YAAYT,KAAK,EAAGiB,QAASV,EAAKU,OAAQ,CAAC,CACtF,CAAC,EACD,GAAI,CAAC9B,EAAIe,GACP,MAAUC,MAAM,MAAMjB,EAAiBC,CAAG,CAAC,EAE7C,IAAMiB,EAAQ,MAAMjB,EAAII,KAAK,EAK7B,GAAI,CAACa,EAAKF,IAAM,CAACE,EAAKC,QACpB,MAAUF,MAAMC,EAAKZ,OAAOC,SAAW,kBAAkB,EAE3D,OAAOW,EAAKC,OACd,CAEA,eAAsBa,EAA2BT,EAE9C,CACD,IAAMtB,EAAM,MAAMjB,EAASC,EAAO,4BAA4B,EAAG,CAC/DwC,OAAQ,OACRC,QAAS,CAAE,eAAgB,kBAAmB,EAC9CC,KAAMC,KAAKC,UAAU,CAAEN,aAAY,CAAC,CACtC,CAAC,EACD,GAAI,CAACtB,EAAIe,GACP,MAAUC,MAAM,MAAMjB,EAAiBC,CAAG,CAAC,EAE7C,IAAMiB,EAAQ,MAAMjB,EAAII,KAAK,EAK7B,GAAI,CAACa,EAAKF,IAAM,CAACE,EAAKC,QACpB,MAAUF,MAAMC,EAAKZ,OAAS,kBAAkB,EAElD,OAAOY,EAAKC,OACd,WCnFA,SAASyD,EACPD,EACAE,EAC+B,CAC/B,IAAMC,EAAMH,EAAWI,KAAMC,GAAMA,EAAEjB,KAAOc,CAAS,EAGrD,OAFKC,EACDA,EAAIG,SAAW,UAAkB,UAC9B,OAFU,QAGnB,CAWA,IAAMQ,EAAsC,CAC1CN,EAAG,GACHC,UAAW,GACXC,UAAW,KACXC,QAAS,KACTC,YAAa,KACbC,YAAa,IACf,EAEA,SAAgBE,EAA0B,CAAEC,aAAqC,CAG/E,IAAMI,EADIxC,EADOM,EAAgBgC,GAAMA,EAAED,QACtBA,CACNE,EAAEE,SACTC,EAAWrC,EAAiBiC,GAAMK,EAAQL,EAAEM,KAAM,EAClDxB,EAAatB,EAAc,EAC3B,CAAE+C,UAAWpD,EAAa,EAC1B,CAACqD,EAAIC,IAAAA,EAAAA,EAAAA,YAAuBzD,EAA+B4C,CAAoB,EAC/E,CAAEN,IAAGC,YAAWC,YAAWC,UAASC,cAAaC,eAAgBa,EACjEE,EAAUN,EAAW,eAAeb,IAAc,MAExD1C,EAAAA,EAAAA,eAAgB,CACd,IAAM8D,EAAIC,OAAOC,eAAiBJ,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAExB,UAAWD,EAAE0B,KAAK,CAAE,CAAE,CAAC,EAAG,GAAG,EAClG,UAAaJ,OAAOK,aAAaN,CAAC,CACpC,EAAG,CAACrB,CAAC,CAAC,EAEN,GAAM,CAAE4B,OAAMC,YAAWC,SAAUlE,EACjCwD,EACA,SAKS7C,EAHL0B,EAAU+B,OAAS,EACfxD,EAAO,sBAAsByD,mBAAmBhC,CAAS,GAAG,EAC5DzB,EAAO,kBAAkB,CACU,EAE3C,CAAE0D,kBAAmB,EAAM,CAC7B,EAEMC,GAAAA,EAAAA,EAAAA,iBAAsC,CAC1C,EAAY,yBAAyB,EACrCb,OAAOc,cAAc,IAAIC,YAAY,eAAe,CAAC,CACvD,EAAG,CAACpB,CAAM,CAAC,EAELqB,GAAAA,EAAAA,EAAAA,aACJ,MAAOC,EAAqBC,IAAuB,CACjDrB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAErB,YAAa,KAAMC,YAAa,KAAMF,QAASoC,CAAY,CAAE,CAAC,EACjG,GAAI,CACF,IAAME,EAAU,MAAMzE,EAAgC,CAAEa,KAAM0D,EAAaC,WAAU,CAAC,EACtFL,EAAkB,EACdM,EAAQC,wBACVvB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEpB,YAAaO,EAAK+B,sBAAuB,CAAE,CAAC,CAEnF,OAASC,EAAG,CAKV,MAJAzB,EAAS,CACPK,KAAM,QACNC,MAAO,CAAErB,YAAawC,aAAaC,MAAQD,EAAEE,QAAUlC,EAAKmC,wBAAyB,CACvF,CAAC,EACKH,CACR,QAAU,CACRzB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEtB,QAAS,IAAK,CAAE,CAAC,CACtD,CACF,EACA,CAACS,EAAKmC,yBAA0BnC,EAAK+B,uBAAwBR,CAAiB,CAChF,EAEMa,GAAAA,EAAAA,EAAAA,aACJ,KAAOC,IAAwB,CAC7B9B,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAErB,YAAa,KAAMC,YAAa,KAAMF,QAAS8C,CAAY,CAAE,CAAC,EACjG,GAAI,CACF,IAAMR,EAAU,MAAMxE,EAA2BgF,CAAW,EAC5Dd,EAAkB,EACdM,EAAQC,wBACVvB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEpB,YAAaO,EAAK+B,sBAAuB,CAAE,CAAC,CAEnF,OAASC,EAAG,CAKV,MAJAzB,EAAS,CACPK,KAAM,QACNC,MAAO,CAAErB,YAAawC,aAAaC,MAAQD,EAAEE,QAAUlC,EAAKsC,0BAA2B,CACzF,CAAC,EACKN,CACR,QAAU,CACRzB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEtB,QAAS,IAAK,CAAE,CAAC,CACtD,CACF,EACA,CAACS,EAAK+B,uBAAwB/B,EAAKsC,2BAA4Bf,CAAiB,CAClF,EAEMgB,EAAiBvB,GAAMpC,YAAc,CAAA,EAE3C,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAWlB,EAAG,sBAAuBkC,CAAS,WAAnD,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oBAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,oFACV,YAAa,KACb,cAAA,EAAW,CAAA,GAEb,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,SACL,MAAOR,EACP,SAAW4C,GAAMzB,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEzB,EAAG4C,EAAEQ,OAAOC,KAAM,CAAE,CAAC,EACzE,YAAazC,EAAK0C,6BAClB,UAAU,wHAAwH,CAAA,CAEjI,IAEJxB,GACC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iCACVA,aAAiBe,MAAQf,EAAMgB,QAAUlC,EAAK2C,qBAC9C,CAAA,EACD,KACHnD,GAAc,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kDAA0CA,CAAe,CAAA,EAAI,KACxFC,GAAc,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iCAAyBA,CAAe,CAAA,EAAI,KAEvEwB,GAAa,CAACD,GACb,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iCAAwB,GAAI,CAAA,GAEzC,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,+BACXuB,EAAenB,SAAW,GACzB,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,iCAAyBpB,EAAK4C,gBAAqB,CAAA,EAEjEL,EAAeM,IAAKb,GAAM,CACxB,IAAMc,EAAOjE,EAAqBD,EAAYoD,EAAEhE,EAAE,EAC5C+E,EAAOxD,IAAYyC,EAAEhE,GAC3B,OACE,EAAA,EAAA,KAAC,KAAD,CAAe,UAAU,sBACvB,EAAA,EAAA,MAAC,MAAD,CACE,KAAK,SACL,SAAU,EACV,aAAY,GAAGgE,EAAE/D,KAAI,IAAK+B,EAAKgD,yBAC/B,YAAezC,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEvB,UAAW0C,EAAEhE,EAAG,CAAE,CAAC,EACrE,UAAYiF,GAAO,EACbA,EAAGC,MAAQ,SAAWD,EAAGC,MAAQ,OACnCD,EAAGE,eAAe,EAClB5C,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEvB,UAAW0C,EAAEhE,EAAG,CAAE,CAAC,EAE1D,EACA,UAAWN,EACT,oIACA,wFACA,qDACA,kDACA,gJACA,gEACF,WAlBF,EAoBE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,iCAAyBsE,EAAE/D,IAAS,CAAA,EACjD+D,EAAEzD,UACD,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,yDACV,YAAa,KACb,aAAW,UAAU,CAAA,EAErB,KACHyD,EAAE5D,SACD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iCAAyB4D,EAAE5D,OAAc,CAAA,EACvD,IACD,IACJ4D,EAAE9D,aACD,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,mDAA2C8D,EAAE9D,WAAe,CAAA,EACvE,MACJ,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCACX8D,EAAE3D,YAAc,CAAA,GAAIwE,IAAKO,IACzB,EAAA,EAAA,KAAC,OAAD,CAEE,UAAU,gGAETA,CACG,EAJCA,CAID,CACP,CACE,CAAA,GACL,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,gEAAb,EACE,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,oBAAoB,YAAa,KAAM,cAAA,EAAW,CAAA,GACrE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gDAAwCpB,EAAE7D,UAAiB,CAAA,CAC1E,GACA,KACL,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,QACL,UAAU,yDACV,QAAU8E,GAAOA,EAAGI,gBAAgB,EACpC,UAAYJ,GAAOA,EAAGI,gBAAgB,WAErCP,IAAS,WACR,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,uFACb9C,EAAKsD,kBACF,CAAA,EACJR,IAAS,QACX,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iDACb9C,EAAKuD,oBACF,CAAA,GACN,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,SAAUR,EACV,YAAe,CACRrC,OAAO8C,QAAQxD,EAAKyD,2BAA2B,GACpD,EAAkBzB,EAAEhE,EAAE,EAAE0F,UAAY,CAClC,CACD,CACH,EACA,UAAWhG,EACT,sHACA,mEACA,mGACA,kDACF,WAdF,CAgBGqF,GACC,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,wBAAwB,cAAA,EAAW,CAAA,GAEtD,EAAA,EAAA,KAAC,EAAD,CAAQ,UAAU,WAAW,YAAa,EAAG,cAAA,EAAW,CAAA,EAEzD/C,EAAK2D,oBACA,GACV,CAAA,CAAA,GAEA,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,SAAUZ,EACV,YAAe,CACb,EAAgBf,EAAEhE,GAAI,EAAK,EAAE0F,UAAY,CACvC,CACD,CACH,EACA,UAAWhG,EACT,+GACA,6EACA,qKACA,kDACF,WAbF,CAeGqF,GACC,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,wBAAwB,cAAA,EAAW,CAAA,EACpD,KACH/C,EAAK4D,kBACA,GAEP,CAAA,CACF,GACH,EApHK5B,EAAEhE,EAoHP,CAER,CAAC,CAED,CAAA,EAGLsB,GACC,EAAA,EAAA,KAAC,GAAD,CACE,YAAaA,EACPU,OACMpB,aACZ,YAAe2B,EAAS,CAAEK,KAAM,QAASC,MAAO,CAAEvB,UAAW,IAAK,CAAE,CAAC,EACrE,UAAWoC,EACX,YAAaU,CAAa,CAAA,EAE1B,IACD,GAET,CAEA,SAAAyB,GAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAA0C,CAAApC,cAAA3B,OAAApB,aAAAqF,UAAAC,YAAAC,eAAAL,EAexC,CAAAf,EAAAqB,IAAAA,EAAAA,EAAAA,UAAiC,EAAK,EAEtClB,EADiBrF,EAAgBwG,EACrBnE,EAAA,iBAA4ByB,IAA5B,KAAiD2C,EAAAP,EAAA,KAAApC,EAGE2C,EAAAP,EAAA,IAA7DO,EAAA,SAAYnH,GAAqCwE,CAAW,EAACoC,EAAA,GAAApC,EAAAoC,EAAA,GAAAO,GAAA,IAAAC,EAAAR,EAAA,KAAAS,OAAAC,IAAA,2BAAA,GAC7DF,EAAA,CAAAjD,kBAAqB,EAAM,EAACyC,EAAA,GAAAQ,GAAAA,EAAAR,EAAA,GAH9B,GAAA,CAAA/C,OAAAE,QAAAD,aAAmCjE,EACjCkG,EACAoB,EACAC,CACF,EAAEG,EAAAX,EAAA,KAAAnF,GAAAmF,EAAA,KAAApC,GAEkB+C,EAAA7F,EAAqBD,EAAY+C,CAAW,EAACoC,EAAA,GAAAnF,EAAAmF,EAAA,GAAApC,EAAAoC,EAAA,GAAAW,GAAAA,EAAAX,EAAA,GAAjE,IAAAY,EAAoBD,EACpBE,EAAsBD,IAAgB,OAAOE,EAAAd,EAAA,KAAA/D,EAAA8E,qBAAAf,EAAA,KAAA/C,GAG3C6D,EAAA7D,GAAI+D,QAAcjE,KACsF,IAAvGE,GAAI9C,aAAmB4C,KAA+E,EAAtG,OAAmCE,EAAI/C,KAAK,MAAO+C,EAAI9C,cAAvD,IAA4E8B,EAAI8E,oBAAoB,IAAIf,EAAA,GAAA/D,EAAA8E,oBAAAf,EAAA,GAAA/C,EAAA+C,EAAA,GAAAc,GAAAA,EAAAd,EAAA,GAF3G,IAAAiB,EACEH,EAC0GI,EAAAlB,EAAA,KAAAE,EAG7CgB,EAAAlB,EAAA,KAAtBkB,EAAAC,GAAO,CAACA,GAAKjB,EAAQ,EAACF,EAAA,GAAAE,EAAAF,EAAA,IAAAkB,GAAA,IAAAE,EAAApB,EAAA,MAAAS,OAAAC,IAAA,2BAAA,GAEzDU,GAAA,EAAA,EAAA,KAAA,EAAA,CAA0B,UAAA,oDAAoD,CAAA,EAAGpB,EAAA,IAAAoB,GAAAA,EAAApB,EAAA,IAAA,IAAAqB,EAAArB,EAAA,MAAAS,OAAAC,IAAA,2BAAA,GAY3EW,GAAA,EAAA,EAAA,KAAC,EAAD,CAAqB,UAAA,QAAQ,CAAA,EAAGrB,EAAA,IAAAqB,GAAAA,EAAArB,EAAA,IAAA,IAAAsB,EAAAtB,EAAA,MAAA/D,EAAAsF,YAAAvB,EAAA,MAAAE,GANlCoB,GAAA,EAAA,EAAA,KAAA,SAAA,CACO,KAAA,SACIpB,QAAAA,EACC,UAAA,yLACE,aAAAjE,EAAIsF,oBAEhBF,CACO,CAAA,EAAArB,EAAA,IAAA/D,EAAAsF,WAAAvB,EAAA,IAAAE,EAAAF,EAAA,IAAAsB,GAAAA,EAAAtB,EAAA,IAAA,IAAAwB,EAAAxB,EAAA,MAAA/D,EAAAgD,uBAGMuC,EAAAxB,EAAA,KAFfwB,GAAA,EAAA,EAAA,KAAA,EAAA,CAAwB,UAAA,6EACrBvF,EAAIgD,sBACP,CAAA,EAAee,EAAA,IAAA/D,EAAAgD,uBAAAe,EAAA,IAAAwB,GAAA,IAAAC,EAAAzB,EAAA,MAAAS,OAAAC,IAAA,2BAAA,GAObe,GAAA,EAAA,EAAA,KAAC,EAAD,CAAa,UAAA,QAAQ,CAAA,EAAGzB,EAAA,IAAAyB,GAAAA,EAAAzB,EAAA,IAAA,IAAA0B,EAAA1B,EAAA,MAAA/D,EAAA0F,aAAA3B,EAAA,MAAAE,GAN1BwB,GAAA,EAAA,EAAA,KAAA,SAAA,CACO,KAAA,SACIxB,QAAAA,EACC,UAAA,yLACE,aAAAjE,EAAI0F,qBAEhBF,CACO,CAAA,EAAAzB,EAAA,IAAA/D,EAAA0F,YAAA3B,EAAA,IAAAE,EAAAF,EAAA,IAAA0B,GAAAA,EAAA1B,EAAA,IAAA,IAAA4B,EAAA5B,EAAA,MAAA0B,GAAA1B,EAAA,MAAAsB,GAAAtB,EAAA,MAAAwB,GAnBXI,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,2FAAf,CACEN,EAQAE,EAGAE,CAQI,IAAA1B,EAAA,IAAA0B,EAAA1B,EAAA,IAAAsB,EAAAtB,EAAA,IAAAwB,EAAAxB,EAAA,IAAA4B,GAAAA,EAAA5B,EAAA,IAAA,IAAA6B,EAAA7B,EAAA,MAAA/D,EAAA6F,mBAAA9B,EAAA,MAAA/D,EAAA8F,6BAAA/B,EAAA,MAAA/D,EAAA+F,gCAAAhC,EAAA,MAAA/D,EAAAgG,sBAAAjC,EAAA,MAAA/D,EAAAiG,oBAAAlC,EAAA,MAAA/C,GAAA+C,EAAA,MAAA7C,GAAA6C,EAAA,MAAA9C,GAAA8C,EAAA,MAAAiB,GAGHY,EAAA3E,GAAA,CAAcD,GACb,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,iCAAwB,GAAK,CAAA,EACxCE,GACF,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,iCAAyBlB,EAAI8F,2BAAiC,CAAA,EACzE9E,GAAA,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EAEA,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,yCAAiCA,EAAI/C,IAAW,CAAA,GAC9D,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,uCACX,EAAA,EAAA,KAAA,OAAA,CAAgB,UAAA,gDAAwC+C,EAAIhD,EAAW,CAAA,CACrE,CAAA,GACJ,EAAA,EAAA,MAAA,KAAA,CAAc,UAAA,gEAAd,EACE,EAAA,EAAA,MAAA,MAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,+BAAuBgC,EAAI6F,iBAAwB,CAAA,GACjE,EAAA,EAAA,KAAA,KAAA,CAAA,SAAK7E,EAAIvC,OAAOyH,QAAe,CAAA,CAC3B,CAAA,CAAA,GACN,EAAA,EAAA,MAAA,MAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,+BAAuBlG,EAAIiG,kBAAyB,CAAA,GAClE,EAAA,EAAA,KAAA,KAAA,CAAA,SAAKjF,EAAImF,cAAc/H,OAAc,CAAA,CACjC,CAAA,CAAA,GACN,EAAA,EAAA,MAAA,MAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,+BAAuB4B,EAAIgG,oBAA2B,CAAA,GACpE,EAAA,EAAA,KAAA,KAAA,CAAA,SAAKhF,EAAIoF,SAAgB,CAAA,CACrB,CAAA,CAAA,CACH,IACJpF,EAAI+D,QAAajE,KAIX,GAHL,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,mDACXd,EAAI+F,8BACF,CAAA,EAHN,MAKD,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,yDACb,EAAA,EAAA,KAAC,EAAD,CAAuBf,QAAAA,CAAQ,CAAA,CAC3B,CAAA,CAAA,CAAA,CAAA,EA3BN,KA6BIjB,EAAA,IAAA/D,EAAA6F,kBAAA9B,EAAA,IAAA/D,EAAA8F,4BAAA/B,EAAA,IAAA/D,EAAA+F,+BAAAhC,EAAA,IAAA/D,EAAAgG,qBAAAjC,EAAA,IAAA/D,EAAAiG,mBAAAlC,EAAA,IAAA/C,EAAA+C,EAAA,IAAA7C,EAAA6C,EAAA,IAAA9C,EAAA8C,EAAA,IAAAiB,EAAAjB,EAAA,IAAA6B,GAAAA,EAAA7B,EAAA,IAAA,IAAAsC,EAAAtC,EAAA,MAAA6B,EACJS,EAAAtC,EAAA,KAnCNsC,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,8CACZT,CAkCG,CAAA,EAAA7B,EAAA,IAAA6B,EAAA7B,EAAA,IAAAsC,GAAA,IAAAC,EAAAvC,EAAA,MAAAhB,GAAAgB,EAAA,MAAA/D,EAAAuG,6BAAAxC,EAAA,MAAA/D,EAAAwG,8BAAAzC,EAAA,MAAA/D,EAAA4D,oBAAAG,EAAA,MAAA/D,EAAAyG,sBAAA1C,EAAA,MAAA/D,EAAA0G,6BAAA3C,EAAA,MAAA/D,EAAA2D,sBAAAI,EAAA,MAAA/D,EAAAyD,6BAAAM,EAAA,MAAA/C,GAAA+C,EAAA,MAAAY,GAAAZ,EAAA,MAAAE,GAAAF,EAAA,MAAAG,GAAAH,EAAA,MAAAI,GAAAJ,EAAA,MAAApC,GAAAoC,EAAA,MAAAa,GAEL0B,EAAAtF,GACC,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,wGACZ2D,IAAgB,WACf,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,oDAAf,EACE,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,iDAAyC3E,EAAIwG,4BAAkC,CAAA,GAC5F,EAAA,EAAA,KAAC,EAAD,CACK,GAAA,oBACMvC,QAAAA,EACC,UAAA,8NAETjE,EAAIuG,2BALF,CAAA,CAOD,KAVP,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EAaG,EAAA,EAAA,MAAA,SAAA,CACO,KAAA,SACKxD,SAAAA,EACD,YAAA,CACH6B,GACE,CAAClE,OAAM8C,QAASxD,EAAI0G,2BAA4B,IAEtDtC,EAAQ,EAAI,EACPF,EAAUvC,EAAaiD,CAAa,EAAClB,MACjCiD,EAEN,EAACC,YACaxC,EAAQ,EAAK,CAAC,EAAC,EAEvB,UAAA1G,EACT,2FACA,4DACA,gJACA,kDACF,WAnBF,CAqBGqF,GAAO,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAA,sBAAsB,cAAA,EAAW,CAAA,EAA3D,KACA6B,EAAgB5E,EAAIyG,qBAAwBzG,EAAI4D,kBAC1C,IACRgB,GACC,EAAA,EAAA,MAAA,SAAA,CACO,KAAA,SACK7B,SAAAA,EACD,YAAA,CACFrC,OAAM8C,QAASxD,EAAIyD,2BAA4B,IACpDW,EAAQ,EAAI,EACPD,EAAYxC,CAAW,EAACkF,SACf5C,EAAQ,CAAC,EAACP,MACfoD,EAEN,EAACF,YACaxC,EAAQ,EAAK,CAAC,EAAC,EAEvB,UAAA1G,EACT,sHACA,mGACA,kDACF,WAjBF,EAmBE,EAAA,EAAA,KAAC,EAAD,CAAkB,UAAA,kBAAkB,cAAA,EAAW,CAAA,EAC9CsC,EAAI2D,oBACE,IAtBV,IAuBO,CAAA,CAAA,CAGR,CAAA,EAjEP,KAkEOI,EAAA,IAAAhB,EAAAgB,EAAA,IAAA/D,EAAAuG,4BAAAxC,EAAA,IAAA/D,EAAAwG,6BAAAzC,EAAA,IAAA/D,EAAA4D,mBAAAG,EAAA,IAAA/D,EAAAyG,qBAAA1C,EAAA,IAAA/D,EAAA0G,4BAAA3C,EAAA,IAAA/D,EAAA2D,qBAAAI,EAAA,IAAA/D,EAAAyD,4BAAAM,EAAA,IAAA/C,EAAA+C,EAAA,IAAAY,EAAAZ,EAAA,IAAAE,EAAAF,EAAA,IAAAG,EAAAH,EAAA,IAAAI,EAAAJ,EAAA,IAAApC,EAAAoC,EAAA,IAAAa,EAAAb,EAAA,IAAAuC,GAAAA,EAAAvC,EAAA,IAAA,IAAAgD,EAAAhD,EAAA,MAAA4B,GAAA5B,EAAA,MAAAsC,GAAAtC,EAAA,MAAAuC,GAnIZS,GAAA,EAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CACE5B,GACA,EAAA,EAAA,MAAA,EAAA,CACY,UAAA,0NACO,gBAAA6B,YAFnB,CAIErB,EAsBAU,EAqCCC,CAmEH,GACF,CAAA,CAAA,EAAgBvC,EAAA,IAAA4B,EAAA5B,EAAA,IAAAsC,EAAAtC,EAAA,IAAAuC,EAAAvC,EAAA,IAAAgD,GAAAA,EAAAhD,EAAA,IAAA,IAAAkD,EACJ,OADIlD,EAAA,MAAAgD,GAAAhD,EAAA,MAAAkB,GAtIlBgC,GAAA,EAAA,EAAA,KAAA,EAAA,CAAa,YAAA,GAA0B,aAAAhC,WACrC8B,CAsIF,CAAA,EAAchD,EAAA,IAAAgD,EAAAhD,EAAA,IAAAkB,EAAAlB,EAAA,IAAAkD,GAAAA,EAAAlD,EAAA,IAvIdkD,CAuIc,CAvKlB,SAAAH,IAAA,CAAA,CAAA,SAAAH,IAAA,CAAA,CAAA,SAAAK,GAAAhF,EAAA,CAAA,OAqCkCA,EAACmB,eAAgB,CAAC,CArCpD,SAAAkB,GAAAvE,EAAA,CAAA,MAgB0CK,EAAQL,EAACM,KAAO,CCrT1D,SAAgBkJ,IAAW,CACzB,IAAMC,EAAWH,EAAgBI,GAAMA,EAAED,QAAQ,EAC3CE,EAAIT,EAASO,CAAQ,EACrBG,EAAgBP,EAAoBK,GAAMA,EAAEE,aAAa,EACzDC,EAAkBR,EAAoBK,GAAMA,EAAEG,eAAe,EAC7DC,EAAanB,EAAc,EAC3BoB,EAAUnB,EAAqB,EAC/B,CAACoB,EAAcC,GAAmB7B,EAAgB,EAElD8B,EAAa3B,EAAiByB,EAAaG,IAAI,KAAK,CAAC,EACrDC,EAAWJ,EAAaG,IAAI,GAAG,GAAK,GACpC,CAACE,EAASC,IAAAA,EAAAA,EAAAA,UAAoCJ,CAAU,EACxD,CAACK,EAAQC,IAAAA,EAAAA,EAAAA,UAAsBJ,CAAQ,EACvC,CAACK,EAAQC,IAAAA,EAAAA,EAAAA,UAA8C,IAAI,EAG3DC,EAAkBX,EAAaY,SAAS,EACxCC,GAAAA,EAAAA,EAAAA,QAAmCF,CAAe,EACxD,GAAIE,EAA0BC,UAAYH,EAAiB,CACzDE,EAA0BC,QAAUH,EACpC,IAAMI,EAAUxC,EAAiByB,EAAaG,IAAI,KAAK,CAAC,EAClDa,EAAQhB,EAAaG,IAAI,GAAG,GAAK,GACvCG,EAAYW,GAAUA,IAASF,EAAUE,EAAOF,CAAQ,EACxDP,EAAWS,GAAUA,IAASD,EAAQC,EAAOD,CAAM,CACrD,EAEAlD,EAAAA,EAAAA,eAAgB,CACdmC,EACGgB,GAAS,CACR,IAAMC,EAAS,IAAIC,gBAAgBF,CAAI,EACjCG,EAAKb,EAAOc,KAAK,EAMvB,OALID,EAAIF,EAAOI,IAAI,IAAKF,CAAE,EACrBF,EAAOK,OAAO,GAAG,EAClBlB,IAAY,cACXa,EAAOK,OAAO,KAAK,EADOL,EAAOI,IAAI,MAAOjB,CAAO,EAEpDa,EAAON,SAAS,IAAMK,EAAKL,SAAS,EAAUK,EAC3CC,CACT,EACA,CAAEM,QAAS,EAAK,CAClB,CACF,EAAG,CAACnB,EAASE,EAAQN,CAAe,CAAC,EAErC,IAAMwB,GAAAA,EAAAA,EAAAA,aACE3B,EAAW4B,OAAQC,GAAMA,EAAEC,SAAW,SAAS,EACrD,CAAC9B,CAAU,CACb,EACM+B,GAAAA,EAAAA,EAAAA,aACE/B,EAAW4B,OAAQC,GAAMA,EAAEC,SAAW,SAAS,EACrD,CAAC9B,CAAU,CACb,EAEMgC,EAAazB,IAAY,UAAYoB,EAAoBI,EAEzDE,GAAAA,EAAAA,EAAAA,aAAyB,CAC7B,IAAMC,EAAIzB,EAAOc,KAAK,EAAEY,YAAY,EAChCC,EAAOJ,EASX,OARIE,IACFE,EAAOA,EAAKR,OACTC,IACEA,EAAEQ,MAAQ,IAAIF,YAAY,EAAEG,SAASJ,CAAC,GACvCL,EAAEU,GAAGJ,YAAY,EAAEG,SAASJ,CAAC,IAC5BL,EAAEW,aAAe,IAAIL,YAAY,EAAEG,SAASJ,CAAC,CAClD,GAEKE,EAAKK,UAAUC,EAAGC,IACnBD,EAAEE,QAAUD,EAAEC,OACVF,EAAEL,MAAQK,EAAEH,IAAIM,cAAcF,EAAEN,MAAQM,EAAEJ,GAAI5C,CAAQ,EAD9B+C,EAAEE,MAAQ,GAAK,CAEhD,CACH,EAAG,CAACZ,EAAYvB,EAAQd,CAAQ,CAAC,EA4BjC,IAzBA3B,EAAAA,EAAAA,eAAgB,CACd4C,EAAWO,GAAS,CAClB,GAAI,CAACA,EAAM,OAAOA,EAClB,IAAM2B,EAAO9C,EAAW+C,KAAMlB,GAAMA,EAAEU,KAAOpB,EAAKoB,EAAE,EAKpD,OAJKO,EACYG,EAAsB9B,CAEnC6B,IADaC,EAAsBH,CACtBI,GAAY/B,EAAKgC,SAAWL,EAAKK,OAAehC,EAC1D2B,EAJW,IAKpB,CAAC,CACH,EAAG,CAAC9C,CAAU,CAAC,GAEf/B,EAAAA,EAAAA,sBACE6B,EAAc,CACZsD,WAAY,KACZC,MACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gDACb,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,2EAAmExD,EAAEyD,SAASC,KAAU,CAAA,CACnG,CAAA,EAEPC,IAAK,IACP,CAAC,MACYzD,EAAgB,GAC5B,CAACA,EAAiBF,EAAEyD,SAASC,MAAOzD,CAAa,CAAC,EAEjDG,GAAWM,IAAY,cACzB,OAAO,EAAA,EAAA,KAAC,GAAD,CAAiB,CAAA,EAG1B,IAAMkD,EAAalD,IAAY,eAAiByB,EAAW0B,OAAS,EAEpE,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,iEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mDAAf,EACE,EAAA,EAAA,MAAC,SAAD,CAAQ,UAAU,gBAAlB,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,yCAAiC7D,EAAEyD,SAASC,KAAU,CAAA,GACpE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8B1D,EAAEyD,SAASK,QAAY,CAAA,CAC5D,KAER,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4IAAf,EACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAU,iCACV,KAAK,UACL,aAAY9D,EAAEyD,SAASM,qBAHzB,EAKE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,KAAK,MACL,gBAAerD,IAAY,cAC3B,UAAWjB,EACT,0GACAiB,IAAY,cAAgB,UAAY,8BACxCA,IAAY,eACV,8HACJ,EACA,YAAeC,EAAW,aAAa,WAEtCX,EAAEyD,SAASO,cACN,CAAA,GACR,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,KAAK,MACL,gBAAetD,IAAY,UAC3B,UAAWjB,EACT,sEACAiB,IAAY,UAAY,UAAY,8BACpCA,IAAY,WACV,8HACJ,EACA,YAAeC,EAAW,SAAS,WAVrC,CAYGX,EAAEyD,SAASQ,YACZ,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2CAAhB,CAAkD,IAAEnC,EAAkB+B,OAAO,GAAO,GAC9E,KACR,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,KAAK,MACL,gBAAenD,IAAY,OAC3B,UAAWjB,EACT,sEACAiB,IAAY,OAAS,UAAY,8BACjCA,IAAY,QACV,8HACJ,EACA,YAAeC,EAAW,MAAM,WAVlC,CAYGX,EAAEyD,SAASS,SACZ,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2CAAhB,CAAkD,IAAEhC,EAAe2B,OAAO,GAAO,GAC3E,GACL,IACJD,GACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+CAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,oFACV,cAAA,EAAW,CAAA,GAEb,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,SACL,MAAOhD,EACP,SAAWoB,GAAMnB,EAAUmB,EAAEmC,OAAOC,KAAK,EACzC,YAAapE,EAAEyD,SAASY,kBACxB,UAAU,0LACV,aAAa,KAAK,CAAA,CAEjB,IACH,IACD,IAEJ3D,IAAY,eACX,EAAA,EAAA,KAAC,EAAD,CAA0B,CAAA,EACxBA,IAAY,WAAaoB,EAAkB+B,SAAW,GACxD,EAAA,EAAA,KAAC,GAAD,CAAgB,QAAS7D,EAAEyD,SAASa,YAAa,CAAA,EAC/C5D,IAAY,QAAUwB,EAAe2B,SAAW,GAClD,EAAA,EAAA,KAAC,GAAD,CAAgB,QAAS7D,EAAEyD,SAASc,SAAU,CAAA,EAC5CnC,EAASyB,SAAW,GACtB,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,uJACV7D,EAAEyD,SAASe,eACX,CAAA,GAEH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oDACZpC,EAASqC,IAAKC,IACb,EAAA,EAAA,KAAC,GAAD,CAEE,UAAWA,EACX,KAAM1E,EAAEyD,SACR,gBAAiB/C,IAAY,OAC7B,WAAcK,EAAU2D,CAAG,CAAE,EAJxBA,EAAIhC,EAIoB,CAEhC,CACE,CAAA,CAEJ,IAEJ5B,GACC,EAAA,EAAA,KAAC,GAAD,CAAuC,UAAWA,EAAQ,KAAMd,EAAEyD,SAAU,YAAe1C,EAAU,IAAI,CAAE,EAA/ED,EAAO4B,EAAwE,EACzG,IACD,GAET,CAEA,SAASU,EAAsBsB,EAA+B,CAC5D,OAAOA,EAAIC,oBAAsBD,EAAIpB,MACvC,CAEA,SAASsB,GAAcF,EAAsBG,EAA4B,CAIvE,OAHIH,EAAIzC,SAAW,UAAkB4C,EAAKC,gBACtCJ,EAAIzC,SAAW,SAAiB4C,EAAKE,eACrCL,EAAIzC,SAAW,YAAoB4C,EAAKG,kBACrCH,EAAKI,aACd,CAEA,SAASC,GAAwBR,EAAsBG,EAA4B,CAGjF,OAFIH,EAAIzC,SAAW,SAAiB4C,EAAKM,kBACrCT,EAAIzC,SAAW,YAAoB4C,EAAKO,qBACrCP,EAAKQ,gBACd,CAEA,SAASC,GAAkBZ,EAAsBG,EAA4B,CAC3E,IAAMU,EAAWnC,EAAsBsB,CAAG,EAI1C,OAHIa,GAAYb,EAAIpB,OAAeuB,EAAKW,aACpCD,GAAY,CAACb,EAAIpB,OAAeuB,EAAKY,kBACrC,CAACF,GAAYb,EAAIpB,OAAeuB,EAAKa,mBAClCb,EAAKc,WACd,CAEA,SAAAC,GAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAA0B,CAAAE,UAAAtB,EAAAG,OAAAoB,kBAAAC,UAAAL,EAWzBM,EAAAL,EAAA,KAAApB,EAC4CyB,EAAAL,EAAA,IAA1BK,EAAA/C,EAAsBsB,CAAG,EAACoB,EAAA,GAAApB,EAAAoB,EAAA,GAAAK,GAA3C,IAAAZ,EAAiBY,EACjBC,EAAgB1B,EAAG3B,MAAS8B,EAAIwB,iBAAoBxB,EAAIyB,gBAAiBC,EAAAT,EAAA,KAAAU,OAAAC,IAAA,2BAAA,GAM1DF,EAAA9G,EACT,qHACA,+HACA,gCACF,EAACqG,EAAA,GAAAS,GAAAA,EAAAT,EAAA,GAOK,IAAAY,EAAAhC,EAAGlC,MAASkC,EAAGhC,GAAGiE,EAAAb,EAAA,KAAAY,EAAyBC,EAAAb,EAAA,IAA5Ca,EAACD,EAAkBE,OAAS,CAAC,EAACC,YAAa,EAACf,EAAA,GAAAY,EAAAZ,EAAA,GAAAa,GAAA,IAAAG,EAAAhB,EAAA,KAAAa,EACzCG,EAAAhB,EAAA,IALNgB,GAAA,EAAA,EAAA,KAAA,MAAA,CACY,UAAA,qHACV,cAAA,YAECH,CACG,CAAA,EAAAb,EAAA,GAAAa,EAAAb,EAAA,GAAAgB,GAAA,IAAAC,EAAAjB,EAAA,KAAApB,EAAAlC,KAIsEuE,EAAAjB,EAAA,IAAtEiB,GAAA,EAAA,EAAA,KAAA,KAAA,CAAc,UAAA,kDAA0CrC,EAAGlC,IAAW,CAAA,EAAAsD,EAAA,GAAApB,EAAAlC,KAAAsD,EAAA,GAAAiB,GAAA,IAAAC,EAAAlB,EAAA,KAAApB,EAAAuC,QAG9DD,EAAAlB,EAAA,KAFPkB,EAAAtC,EAAGuC,SACF,EAAA,EAAA,MAAA,OAAA,CAAgB,UAAA,qCAAhB,CAA4C,IAAEvC,EAAGuC,OAAgB,IADlE,KAEOnB,EAAA,GAAApB,EAAAuC,QAAAnB,EAAA,IAAAkB,GAAA,IAAAE,EAAApB,EAAA,MAAAiB,GAAAjB,EAAA,MAAAkB,GAJVE,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,mBAAf,CACEH,EACCC,CAGG,IAAAlB,EAAA,IAAAiB,EAAAjB,EAAA,IAAAkB,EAAAlB,EAAA,IAAAoB,GAAAA,EAAApB,EAAA,IAAA,IAAAqB,EAAArB,EAAA,MAAAjB,EAAAuC,eAAAtB,EAAA,MAAAP,GACL4B,EAAA5B,GACC,EAAA,EAAA,MAAA,OAAA,CAAgB,UAAA,mIAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,SAAsB,YAAA,IAAK,cAAA,EAAW,CAAA,EACtDV,EAAIuC,aACA,KAEP,EAAA,EAAA,KAAA,OAAA,CACY,UAAA,mGACV,cAAA,aAEA,EAAA,EAAA,KAAC,EAAD,CAAgB,UAAA,SAAsB,YAAA,GAAG,CAAA,CACpC,CAAA,EACRtB,EAAA,IAAAjB,EAAAuC,cAAAtB,EAAA,IAAAP,EAAAO,EAAA,IAAAqB,GAAAA,EAAArB,EAAA,IAAA,IAAAuB,EAAAvB,EAAA,MAAAoB,GAAApB,EAAA,MAAAqB,GAnBHE,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,kDAAf,CACEH,EAMCC,CAaG,IAAArB,EAAA,IAAAoB,EAAApB,EAAA,IAAAqB,EAAArB,EAAA,IAAAuB,GAAAA,EAAAvB,EAAA,IAAA,IAAAwB,EAAAxB,EAAA,MAAAjB,EAAA0C,mBAAAzB,EAAA,MAAApB,EAAA/B,aAEH2E,EAAA5C,EAAG/B,aAAkBjB,KAA2B,GAArBmD,EAAI0C,kBAAkBzB,EAAA,IAAAjB,EAAA0C,kBAAAzB,EAAA,IAAApB,EAAA/B,YAAAmD,EAAA,IAAAwB,GAAAA,EAAAxB,EAAA,IAAA,IAAA0B,EAAA1B,EAAA,MAAAwB,EAChDE,EAAA1B,EAAA,KAFJ0B,GAAA,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,mEACVF,CACC,CAAA,EAAAxB,EAAA,IAAAwB,EAAAxB,EAAA,IAAA0B,GAMC,IAAAC,EAAA/C,EAAG3B,MAAS8B,EAAI6C,YAAe7C,EAAI8C,iBAAiBC,EAAA9B,EAAA,MAAA2B,GAAA3B,EAAA,MAAAM,GAJvDwB,GAAA,EAAA,EAAA,KAAA,OAAA,CACSxB,MAAAA,EACG,UAAA,mHAETqB,CACI,CAAA,EAAA3B,EAAA,IAAA2B,EAAA3B,EAAA,IAAAM,EAAAN,EAAA,IAAA8B,GAAAA,EAAA9B,EAAA,IAAA,IAAA+B,EAAA/B,EAAA,MAAAjB,GAAAiB,EAAA,MAAApB,GAAAoB,EAAA,MAAAG,GACN4B,EAAAnD,EAAGzC,SAAY,WACd,EAAA,EAAA,KAAA,OAAA,CAAgB,UAAA,mHACb4C,EAAIiD,YACA,CAAA,EACL7B,GACF,EAAA,EAAA,KAAA,OAAA,CACS,MAAArB,GAAcF,EAAKG,CAAI,EACpB,UAAA,mHAETK,GAAwBR,EAAKG,CAAI,CAC7B,CAAA,EANL,KAOIiB,EAAA,IAAAjB,EAAAiB,EAAA,IAAApB,EAAAoB,EAAA,IAAAG,EAAAH,EAAA,IAAA+B,GAAAA,EAAA/B,EAAA,IAAA,IAAAiC,EAAAjC,EAAA,MAAA8B,GAAA9B,EAAA,MAAA+B,GAlBVE,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,uCAAf,CACEH,EAMCC,CAYG,IAAA/B,EAAA,IAAA8B,EAAA9B,EAAA,IAAA+B,EAAA/B,EAAA,IAAAiC,GAAAA,EAAAjC,EAAA,IAAA,IAAAkC,EAAAlC,EAAA,MAAAuB,GAAAvB,EAAA,MAAA0B,GAAA1B,EAAA,MAAAiC,GA5CRC,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,0BAAf,CACEX,EAqBAG,EAGAO,CAoBI,IAAAjC,EAAA,IAAAuB,EAAAvB,EAAA,IAAA0B,EAAA1B,EAAA,IAAAiC,EAAAjC,EAAA,IAAAkC,GAAAA,EAAAlC,EAAA,IAAA,IAAAmC,EAAAnC,EAAA,MAAAkC,GAAAlC,EAAA,MAAAgB,GApDRmB,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,sBAAf,CACEnB,EAMAkB,CA8CI,IAAAlC,EAAA,IAAAkC,EAAAlC,EAAA,IAAAgB,EAAAhB,EAAA,IAAAmC,GAAAA,EAAAnC,EAAA,IAAA,IAAAoC,EACC,OADDpC,EAAA,MAAAI,GAAAJ,EAAA,MAAAmC,GA9DRC,GAAA,EAAA,EAAA,KAAA,SAAA,CACO,KAAA,SACIhC,QAAAA,EACE,UAAAK,WAMX0B,CAsDO,CAAA,EAAAnC,EAAA,IAAAI,EAAAJ,EAAA,IAAAmC,EAAAnC,EAAA,IAAAoC,GAAAA,EAAApC,EAAA,IA/DToC,CA+DS,CAIb,SAASC,GAAsB,CAC7BnC,UAAWtB,EACXG,OACAuD,WAKC,CACD,GAAM,CAAEC,UAAW3J,EAAa,EAC1B,CAAC4J,EAAmBC,IAAAA,EAAAA,EAAAA,UAAiC,EAAK,EAC1D,CAACC,EAAkBC,IAAAA,EAAAA,EAAAA,UAA+C,IAAI,EACtE,CAACC,EAAoBC,IAAAA,EAAAA,EAAAA,UAAkC,EAAK,EAM5DC,EAAsBlE,EAAIC,qBAAuB,GAEjDkE,GAAAA,EAAAA,EAAAA,aAAwC,SAAY,CACpDnE,KAAIzC,SAAW,UAGnBsG,CAFAE,EAAoB,IAAI,EACxBE,EAAsB,EAAK,EAC3BJ,EAAqB,EAAI,EACzB,GAAI,CACF,GAAM,CAAEO,0BAA2B,MAAM3J,EAA+B,CACtE4J,YAAarE,EAAIhC,GACjBsG,QAAS,CAACJ,CACZ,CAAC,EACD,MAAMP,EAAO,yBAAyB,EACtCY,OAAOC,cAAc,IAAIC,YAAY,eAAe,CAAC,EACrDR,EAAsBG,CAAsB,CAC9C,OAAS9G,EAAG,CACVyG,EAAoBzG,aAAaoH,MAAQpH,EAAEqH,QAAUxE,EAAKyE,mBAAmB,CAC/E,QAAU,CACRf,EAAqB,EAAK,CAC5B,CAbyB,CAc3B,EAAG,CAACK,EAAqB/D,EAAKyE,oBAAqB5E,EAAIhC,GAAIgC,EAAIzC,OAAQoG,CAAM,CAAC,EAExEkB,EAAQ7E,EAAI8E,IAAIC,eAAeF,OAAS,CAAA,EACxCG,EAAiBhF,EAAI8E,IAAIC,eAAeC,gBAAkB,CAAA,EAC1DC,EAAcjF,EAAI8E,IAAIC,eAAeE,aAAe,CAAA,EACpDC,EAAgBlF,EAAI8E,IAAIC,eAAeG,eAAiB,CAAA,EACxDC,EAA4CN,EAAMrG,KAAM4G,GAAMA,EAAEC,SAAS,GAAKR,EAAM,GACpFS,EAAuBN,EAAe,GACtCO,EAAWJ,EAAczK,EAAkBsF,EAAIhC,GAAImH,CAAW,EAAI,KAClEK,EAAeF,EACjB,iBAAiBtF,EAAIhC,GAAE,GAAIsH,EAAqBtH,KAChDgC,EAAIyF,iBAAmBrL,EAAwC4F,CAAG,EAChE,iBAAiBA,EAAIhC,KACrB,KAEN,OACE,EAAA,EAAA,KAAC,EAAD,CAAa,YAAA,GAAY,aAAe0H,GAAM,CAACA,GAAKhC,EAAQ,YAC1D,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAgB,UAAU,oDAAoD,CAAA,GAC9E,EAAA,EAAA,MAAC,EAAD,CACE,UAAU,0NACV,gBAAkBpG,GAAMA,EAAEqI,eAAe,WAF3C,EAIE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2FAAf,EACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAASjC,EACT,UAAU,yLACV,aAAYvD,EAAKyF,qBAEjB,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,QAAQ,CAAA,CACvB,CAAA,GACR,EAAA,EAAA,KAAC,EAAD,CAAc,UAAU,6EACrBzF,EAAK0F,WACM,CAAA,GACd,EAAA,EAAA,MAAC,EAAD,CAAoB,UAAU,mBAA9B,CACG7F,EAAIlC,KAAK,KAAGkC,EAAIhC,GAAG,GACF,KACpB,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAAS0F,EACT,UAAU,yLACV,aAAYvD,EAAK2F,sBAEjB,EAAA,EAAA,KAAC,EAAD,CAAG,UAAU,QAAQ,CAAA,CACf,CAAA,CACL,KAEL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,8CAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4CAAf,EACE,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,oHACV,cAAA,aAEE9F,EAAIlC,MAAQkC,EAAIhC,IAAIkE,OAAO,CAAC,EAAEC,YAAY,CACzC,CAAA,GACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,yCAAiCnC,EAAIlC,IAAS,CAAA,GAC5D,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,wCAAb,CACGqC,EAAK4F,qBAAqB,IAAE7F,GAAcF,EAAKG,CAAI,CACnD,IACFH,EAAIuC,SACH,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,sCAAb,CAA0C,IAAEvC,EAAIuC,OAAW,IACzD,IACD,GACF,KAEL,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gDACVvC,EAAI/B,aAAajB,KAAK,GAAKmD,EAAK6F,mBAChC,CAAA,EAEDhG,EAAI3B,MAEF,MADF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8B8B,EAAK8F,eAAmB,CAAA,GAGrE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8BrF,GAAkBZ,EAAKG,CAAI,CAAK,CAAA,EAE1EH,EAAIzC,SAAW,WACd,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kIACV4C,EAAK+F,iBACL,CAAA,GACH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sGAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6DAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,uCAA+B/F,EAAKgG,oBAA2B,CAAA,GAC/E,EAAA,EAAA,KAAC,EAAD,CACE,KAAK,SACL,QAAQ,YACR,SAAUvC,EACV,YAAe,KAAKO,EAA0B,EAC9C,UAAU,mCAETP,GACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,wCAAwC,cAAA,EAAW,CAAA,EACrEzD,EAAKiG,iBACR,CAAA,CAAA,EACElC,EACF/D,EAAKkG,qBAELlG,EAAKmG,mBAED,CAAA,CACL,IACJxC,GACC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,yDAAiDA,CAAoB,CAAA,EAChF,KACHE,GACC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8B7D,EAAKoG,wBAA4B,CAAA,EAC1E,IACD,GACP,CAAA,CAAA,GAEA,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kIACVpG,EAAKqG,aACL,CAAA,EAGJxG,EAAI3B,QAAUwG,EAAM1F,OAAS,GAAK6F,EAAe7F,OAAS,GAAK8F,EAAY9F,OAAS,IACnF,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,gBAAnB,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,8CAAsCgB,EAAKsG,qBAA0B,CAAA,GACnF,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAUtG,EAAKuG,WACf,MAAO7B,EAAM1F,OACb,OAAQ0F,EAAM1F,SAAW,CAAE,CAAA,GAE7B,EAAA,EAAA,KAAC,EAAD,CACE,SAAUgB,EAAKwG,cACf,MAAO3B,EAAe7F,OACtB,OAAQ6F,EAAe7F,SAAW,CAAE,CAAA,GAEtC,EAAA,EAAA,KAAC,EAAD,CACE,SAAUgB,EAAKyG,aACf,MAAO3B,EAAY9F,OACnB,OAAQ8F,EAAY9F,SAAW,CAAE,CAAA,GAEnC,EAAA,EAAA,KAAC,EAAD,CACE,SAAUgB,EAAK0G,aACf,MAAO3B,EAAc/F,OACrB,OAAQ+F,EAAc/F,SAAW,CAAE,CAAA,CAElC,GACE,IACP,KAEH9E,EAA0B2F,CAAG,IAAMuF,GAAYC,IAC9C,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sEAAf,CACGD,GACC,EAAA,EAAA,MAAC,EAAD,CACE,GAAIA,EACJ,QAAS7B,EACT,UAAW3I,EACT,uGACA,kGACF,WANF,EAQE,EAAA,EAAA,KAAC,EAAD,CAAc,UAAU,6BAA6B,cAAA,EAAW,CAAA,EAC/DoF,EAAK2G,IACF,IACJ,KACHtB,GACC,EAAA,EAAA,MAAC,EAAD,CACE,GAAIA,EACJ,QAAS9B,EACT,UAAW3I,EACT,uGACA,kGACF,WANF,EAQE,EAAA,EAAA,KAAC,EAAD,CAAU,UAAU,6BAA6B,cAAA,EAAW,CAAA,EAC3DoF,EAAK4G,YACF,IACJ,IACD,IACH,MAEJ,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,0DAAkD5G,EAAK6G,WAAe,CAAA,CAChF,GACS,GACH,CAAA,CAAA,CACJ,CAAA,CAEjB,CAEA,SAAAC,EAAA9F,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAA2B,CAAA8F,WAAAC,QAAAC,UAAAjG,EASzB,GAAIiG,GAAUD,IAAU,EAAC,OAAS,KAAK,IAAA1F,EAAA,GAAAL,EAAA,KAAA+F,GAAA/F,EAAA,KAAA8F,EAAA,CAAA,IAAArF,EAAAT,EAAA,KAAAU,OAAAC,IAAA,2BAAA,GAGjBF,EAAA,iBAAgBT,EAAA,GAAAS,GAAAA,EAAAT,EAAA,GAAjCK,EAAAyF,EAAQ/J,QAAS0E,EAAkBwF,OAAOF,CAAK,CAAC,EAAC/F,EAAA,GAAA+F,EAAA/F,EAAA,GAAA8F,EAAA9F,EAAA,GAAAK,CAAA,MAAAA,EAAAL,EAAA,GAAA,IAAAS,EAC7C,OAD6CT,EAAA,KAAAK,EAC7CI,EAAAT,EAAA,IAFPS,GAAA,EAAA,EAAA,KAAA,OAAA,CAAgB,UAAA,kHACbJ,CACI,CAAA,EAAAL,EAAA,GAAAK,EAAAL,EAAA,GAAAS,GAFPA,CAEO,CAIX,SAAAyF,IAAA,CAAA,IAAAlG,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAAD,EAAAM,EAAAI,EAAAT,EAAA,KAAAU,OAAAC,IAAA,2BAAA,GAIQZ,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,oEAAoE,CAAA,EACnFM,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,iEAAiE,CAAA,EAChFI,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,sEAAsE,CAAA,EAAGT,EAAA,GAAAD,EAAAC,EAAA,GAAAK,EAAAL,EAAA,GAAAS,IAAAV,EAAAC,EAAA,GAAAK,EAAAL,EAAA,GAAAS,EAAAT,EAAA,IAAA,IAAAY,EAAAZ,EAAA,KAAAU,OAAAC,IAAA,2BAAA,GAEpFC,EAAA,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAACZ,EAAA,GAAAY,GAAAA,EAAAZ,EAAA,GAAA,IAAAa,EAK5C,OAL4Cb,EAAA,KAAAU,OAAAC,IAAA,2BAAA,GANlDE,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,kEACb,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,mDAAf,CACEd,EACAM,EACAI,GACA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,yDACXG,EAAmDjC,IAAMyH,EAE1D,CACG,CAAA,CACF,GACF,CAAA,EAAApG,EAAA,GAAAa,GAAAA,EAAAb,EAAA,GAXNa,CAWM,CAbV,SAAAuF,GAAAC,EAAA,CAAA,OASY,EAAA,EAAA,KAAA,MAAA,CAAuB,UAAA,kEAAkE,EAA/EA,CAA+E,CAAG,CAQxG,SAAAC,GAAAvG,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAwB,CAAAuD,WAAAxD,EAAgCM,EAI9C,OAJ8CL,EAAA,KAAAuD,EAI9ClD,EAAAL,EAAA,IAFNK,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,qMACb,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,iCAAyBkD,CAAY,CAAA,CAC9C,CAAA,EAAAvD,EAAA,GAAAuD,EAAAvD,EAAA,GAAAK,GAFNA,CAEM"}