@tutti-os/workspace-app-center 0.0.43 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-TEGNWC7E.js → chunk-N4YVSUX5.js} +17 -2
- package/dist/{chunk-TEGNWC7E.js.map → chunk-N4YVSUX5.js.map} +1 -1
- package/dist/contracts/index.d.ts +22 -0
- package/dist/core/index.js +1 -1
- package/dist/i18n/index.js +12 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/ui/index.d.ts +5 -1
- package/dist/ui/index.js +263 -25
- package/dist/ui/index.js.map +1 -1
- package/package.json +3 -3
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { KeyboardEvent, ReactElement } from \"react\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n RefreshIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppInstallProgress } from \"../contracts/runtime.ts\";\nimport type {\n WorkspaceAppLocalRepairAgentRequest,\n WorkspaceAppLocalRepairRequest\n} from \"../contracts/host.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\n\nexport interface AppCenterFactoryProviderOption {\n readonly disabled?: boolean;\n readonly disabledReason?: string;\n readonly iconUrl?: string | null;\n readonly label: string;\n readonly provider: string;\n}\n\nexport interface AppCenterFactoryModelOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryReasoningOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryPermissionOption {\n readonly label: string;\n readonly semantic?: string | null;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryProviderConfiguration {\n readonly defaultModel?: string | null;\n readonly defaultPermissionModeId?: string | null;\n readonly defaultReasoningEffort?: string | null;\n readonly modelOptions: readonly AppCenterFactoryModelOption[];\n readonly permissionModeOptions: readonly AppCenterFactoryPermissionOption[];\n readonly reasoningEffortOptions: readonly AppCenterFactoryReasoningOption[];\n}\n\nexport interface AppCenterHostActions {\n readonly cancelFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly createFactoryJob?: (input: {\n displayName: string;\n model?: string;\n permissionModeId?: string;\n provider?: string;\n prompt: string;\n reasoningEffort?: string;\n }) => Promise<void> | void;\n readonly deleteApp?: (appId: string, appName: string) => Promise<void> | void;\n readonly deleteFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly exportApp?: (appId: string) => Promise<void> | void;\n readonly fixFactoryJob?: (\n jobId: string,\n prompt: string\n ) => Promise<void> | void;\n readonly importApp?: () => Promise<void> | void;\n readonly installApp?: (appId: string) => Promise<void> | void;\n readonly loadLocalApp?: () =>\n | Promise<WorkspaceAppLocalRepairRequest | null | void>\n | WorkspaceAppLocalRepairRequest\n | null\n | void;\n readonly openApp?: (\n appId: string,\n context?: WorkspaceAppActionContext\n ) => Promise<void> | void;\n readonly openAppFolder?: (appId: string) => Promise<void> | void;\n readonly openAppPackageFolder?: (appId: string) => Promise<void> | void;\n readonly openFactoryJobAgentSession?: (\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly modifyAppWithAgent?: (\n jobId: string,\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly publishFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly repairLocalApp?: (\n request: WorkspaceAppLocalRepairAgentRequest\n ) => Promise<void> | void;\n readonly replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly reloadLocalApp?: (appId: string) => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\n readonly restartAndOpenApp?: (appId: string) => Promise<void> | void;\n readonly shouldConfirmAppUpdate?: (appId: string) => boolean;\n readonly updateApp?: (\n appId: string,\n trigger: \"badge_button\" | \"primary_action\"\n ) => Promise<void> | void;\n readonly uninstallApp?: (appId: string) => Promise<void> | void;\n}\n\nexport interface AppCardProps {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n}\n\nexport const AppCard = memo(function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const installBusy =\n app.installProgress != null || app.status === \"installing\";\n const busyStatusLabel = installBusy\n ? copy.t(\"status.installing\")\n : statusLabel;\n const showInstallProgressRing = installBusy;\n const statusButtonTitle = app.installProgress\n ? resolveInstallProgressTitle(copy, app.installProgress, busyStatusLabel)\n : statusLabel;\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? app.availableVersion\n ? copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })\n : copy.t(\"actions.updateApp\")\n : app.primaryAction === \"restartAndOpen\"\n ? copy.t(\"actions.restartAndOpenApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\n const primaryActionTitle = canExecutePrimaryAction\n ? primaryActionLabel\n : statusButtonTitle;\n const canOpenFromCard = app.canOpen;\n const canPublishFactoryUpdate =\n app.canPublishFactoryUpdate && !!app.factoryJobId;\n const canOpenFactorySession =\n app.canOpenFactorySession &&\n !!app.factoryAgentSessionId &&\n !!app.factoryJobId;\n const actionContext = useMemo(\n () => createWorkspaceAppActionContext(app),\n [app]\n );\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canReloadLocal ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = useCallback((): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"restartAndOpen\") {\n void actions.restartAndOpenApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, app.primaryAction]);\n const executeCardAction = useCallback((): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, canOpenFromCard]);\n const handleCardKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): void => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n },\n [canOpenFromCard, executeCardAction]\n );\n const handleReplaceIcon = useCallback((): void => {\n void actions.replaceAppIcon?.(app.id);\n }, [actions, app.id]);\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={handleReplaceIcon}\n />\n <div className=\"flex min-w-0 flex-1 items-center justify-end gap-1\">\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Button\n className={cn(\n \"min-w-0 max-w-full shrink truncate px-2\",\n !canExecutePrimaryAction ? \"cursor-default\" : null,\n canExecutePrimaryAction\n ? app.primaryAction === \"retry\"\n ? statusClassName(app.status)\n : \"text-[var(--text-primary)]\"\n : statusClassName(app.status)\n )}\n disabled={!canExecutePrimaryAction}\n size=\"default\"\n title={primaryActionTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n <span className=\"block min-w-0 max-w-full truncate\">\n {canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel}\n </span>\n </Button>\n {showInstallProgressRing ? (\n <AppInstallProgressRing\n ariaLabel={copy.t(\"status.installProgress.progressAria\")}\n fallbackPercent={0}\n progress={app.installProgress}\n />\n ) : null}\n </div>\n </div>\n </div>\n\n <div className=\"mt-5 flex min-h-0 min-w-0 flex-1 flex-col p-1\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h3 className=\"block min-w-0 truncate text-[15px] font-semibold leading-6 tracking-[0] text-[var(--text-primary)]\">\n {app.name}\n </h3>\n {app.version ? (\n <span className=\"min-w-0 flex-none text-[11px] leading-4 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\">\n {copy.t(\"labels.version\", { version: app.version })}\n </span>\n ) : null}\n {app.canReloadLocal ? (\n <span className=\"min-w-0 flex-none rounded-[5px] border border-[color:var(--line-2)] px-1.5 py-0 text-[10px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.localDev\")}\n </span>\n ) : null}\n </div>\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n </div>\n ) : null}\n </div>\n </article>\n );\n});\n\nfunction createWorkspaceAppActionContext(\n app: WorkspaceAppCardViewModel\n): WorkspaceAppActionContext {\n return {\n installationId: app.installationId ?? null,\n runtimeId: app.runtimeId ?? null,\n launchUrl: app.launchUrl ?? null\n };\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n if (app.factoryEditAction === \"open_session\") {\n void actions.openFactoryJobAgentSession?.(\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n return;\n }\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.canReloadLocal) {\n menuItems.push({\n icon: <RefreshIcon />,\n key: \"reload-local\",\n label: copy.t(\"actions.reloadLocalApp\"),\n onSelect: () => {\n void actions.reloadLocalApp?.(app.id);\n }\n });\n }\n\n if (app.canOpenFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-folder\",\n label: copy.t(\"actions.openAppFolder\"),\n onSelect: () => {\n void actions.openAppFolder?.(app.id);\n }\n });\n }\n\n if (app.canOpenPackageFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-package-folder\",\n label: copy.t(\"actions.openAppPackageFolder\"),\n onSelect: () => {\n void actions.openAppPackageFolder?.(app.id);\n }\n });\n }\n\n if (app.canExport) {\n menuItems.push({\n icon: <UploadIcon />,\n key: \"export\",\n label: copy.t(\"actions.exportApp\"),\n onSelect: () => {\n void actions.exportApp?.(app.id);\n }\n });\n }\n\n if (app.canUninstall) {\n menuItems.push({\n icon: <UninstallIcon />,\n key: \"uninstall\",\n label: copy.t(\"actions.uninstallApp\"),\n onSelect: () => {\n void actions.uninstallApp?.(app.id);\n },\n variant: \"destructive\"\n });\n }\n\n if (app.canDelete) {\n menuItems.push({\n icon: <DeleteIcon />,\n key: \"delete\",\n label: copy.t(\n app.installed ? \"actions.uninstallAndDeleteApp\" : \"actions.deleteApp\"\n ),\n onSelect: () => {\n void actions.deleteApp?.(app.id, app.name);\n },\n variant: \"destructive\"\n });\n }\n\n return (\n <AppCenterActionMenu\n ariaLabel={copy.t(\"actions.moreActions\")}\n attention={canPublishFactoryUpdate}\n items={menuItems}\n triggerTitle={copy.t(\"actions.moreActions\")}\n />\n );\n}\n\ninterface AppCenterActionMenuItem {\n readonly attention?: boolean;\n readonly icon: ReactElement;\n readonly key: string;\n readonly label: string;\n readonly onSelect: () => void;\n readonly variant?: \"default\" | \"destructive\";\n}\n\nfunction AppCenterActionMenu({\n ariaLabel,\n attention = false,\n items,\n triggerTitle\n}: {\n readonly ariaLabel: string;\n readonly attention?: boolean;\n readonly items: readonly AppCenterActionMenuItem[];\n readonly triggerTitle: string;\n}): ReactElement {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={ariaLabel}\n className=\"relative\"\n size=\"icon\"\n title={triggerTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon />\n {attention ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-[var(--state-danger)] shadow-[0_0_0_2px_var(--background-fronted)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[192px]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <DropdownMenuGroup className=\"gap-[2px]\">\n {items.map((item) => (\n <DropdownMenuItem\n className=\"font-normal\"\n key={item.key}\n variant={item.variant}\n onSelect={(event) => {\n event.stopPropagation();\n item.onSelect();\n }}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.attention ? (\n <i\n aria-hidden=\"true\"\n className=\"ml-2 block size-1.5 shrink-0 rounded-full bg-[var(--state-danger)] not-italic\"\n />\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AppIcon({\n app,\n onReplaceIcon,\n replaceIconLabel\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly onReplaceIcon: () => void;\n readonly replaceIconLabel: string;\n}): ReactElement {\n const icon =\n app.icon?.type === \"asset\" ? (\n <img\n alt=\"\"\n className=\"size-11 flex-none rounded-[10px] object-contain object-center select-none\"\n draggable={false}\n src={app.icon.src}\n />\n ) : (\n <span className=\"flex size-11 flex-none items-center justify-center rounded-[10px] bg-[var(--transparency-block)] text-[var(--text-secondary)]\">\n <NavApplicationsFilledIcon className=\"size-[22px]\" />\n </span>\n );\n\n return (\n <span className=\"group/app-icon relative block size-11 flex-none\">\n {icon}\n {app.canReplaceIcon ? (\n <button\n aria-label={replaceIconLabel}\n className=\"absolute inset-0 flex size-11 items-center justify-center rounded-[10px] bg-black/55 p-0 text-white opacity-0 transition-opacity duration-150 group-hover/app-icon:opacity-100 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)]\"\n title={replaceIconLabel}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.blur();\n onReplaceIcon();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <EditIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AppInstallProgressRing({\n ariaLabel,\n fallbackPercent,\n progress\n}: {\n readonly ariaLabel: string;\n readonly fallbackPercent: number;\n readonly progress: WorkspaceAppInstallProgress | null | undefined;\n}): ReactElement {\n const percent =\n progress == null\n ? Math.max(0, Math.min(100, Math.round(fallbackPercent)))\n : Math.max(0, Math.min(100, Math.round(progress.overallPercent)));\n\n return (\n <span\n aria-label={ariaLabel}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={percent}\n className=\"relative inline-flex size-[14px] shrink-0 items-center justify-center rounded-full\"\n role=\"progressbar\"\n style={{\n background: `conic-gradient(var(--text-secondary) ${percent}%, color-mix(in srgb, var(--text-secondary) 24%, transparent) 0)`\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-[2px] rounded-full bg-[var(--surface-panel)]\"\n />\n </span>\n );\n}\n\nfunction resolveInstallProgressTitle(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress,\n statusLabel: string\n): string {\n const byteLabel = formatInstallProgressBytes(copy, progress);\n const percent = Math.max(\n 0,\n Math.min(100, Math.round(progress.overallPercent))\n );\n if (byteLabel) {\n return `${statusLabel} · ${byteLabel} · ${percent}%`;\n }\n return `${statusLabel} · ${percent}%`;\n}\n\nfunction formatInstallProgressBytes(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress\n): string | null {\n if (\n progress.userPhase !== \"downloading\" ||\n progress.downloadedBytes == null\n ) {\n return null;\n }\n const downloaded = formatByteSize(progress.downloadedBytes);\n if (progress.totalBytes == null || progress.totalBytes <= 0) {\n return downloaded;\n }\n return copy.t(\"status.installProgress.downloadedOfTotal\", {\n downloaded,\n total: formatByteSize(progress.totalBytes)\n });\n}\n\nfunction formatByteSize(value: number): string {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n const precision = size >= 10 || unitIndex === 0 ? 0 : 1;\n return `${size.toFixed(precision)} ${units[unitIndex]}`;\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"unavailable\") {\n return \"text-[var(--state-warning)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n ImportLinedIcon as ImportIcon,\n Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SectionTabs,\n Spinner,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n UploadFolderIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppLocalRepairRequest } from \"../contracts/host.ts\";\nimport {\n sortMyAppsByCreatedDesc,\n sortRecommendedApps,\n sortRecommendedAppsForAllTab\n} from \"../core/appCenterAppOrdering.ts\";\nimport {\n resolveDefaultAppFactoryProvider,\n resolveSelectedAppFactoryProvider\n} from \"../core/appFactoryProviderDefaults.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\nimport {\n AppCard,\n type AppCenterFactoryProviderConfiguration,\n type AppCenterFactoryProviderOption,\n type AppCenterFactoryPermissionOption,\n type AppCenterHostActions\n} from \"./AppCard.tsx\";\n\ntype FactoryTemplateID =\n | \"lovart\"\n | \"weather\"\n | \"lookup\"\n | \"system\"\n | \"news\"\n | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"model\" | \"permission\" | \"provider\" | \"reasoning\";\n\ninterface FactoryTemplate {\n readonly id: FactoryTemplateID;\n readonly defaultNameKey: string;\n readonly promptKey: string;\n readonly titleKey: string;\n}\n\nconst factoryTemplates: readonly FactoryTemplate[] = [\n {\n defaultNameKey: \"factory.templates.lovart.defaultName\",\n id: \"lovart\",\n promptKey: \"factory.templates.lovart.prompt\",\n titleKey: \"factory.templates.lovart.title\"\n },\n {\n defaultNameKey: \"factory.templates.weather.defaultName\",\n id: \"weather\",\n promptKey: \"factory.templates.weather.prompt\",\n titleKey: \"factory.templates.weather.title\"\n },\n {\n defaultNameKey: \"factory.templates.lookup.defaultName\",\n id: \"lookup\",\n promptKey: \"factory.templates.lookup.prompt\",\n titleKey: \"factory.templates.lookup.title\"\n },\n {\n defaultNameKey: \"factory.templates.system.defaultName\",\n id: \"system\",\n promptKey: \"factory.templates.system.prompt\",\n titleKey: \"factory.templates.system.title\"\n },\n {\n defaultNameKey: \"factory.templates.news.defaultName\",\n id: \"news\",\n promptKey: \"factory.templates.news.prompt\",\n titleKey: \"factory.templates.news.title\"\n },\n {\n defaultNameKey: \"factory.templates.gomoku.defaultName\",\n id: \"gomoku\",\n promptKey: \"factory.templates.gomoku.prompt\",\n titleKey: \"factory.templates.gomoku.title\"\n }\n];\n\nconst recommendedCategoryTabDefinitions: readonly (\n | {\n readonly id: \"all\";\n readonly labelKey: null;\n }\n | {\n readonly id: Exclude<RecommendedCategoryTabID, \"all\">;\n readonly labelKey: string;\n }\n)[] = [\n { id: \"all\", labelKey: null },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"office\", labelKey: \"categories.office\" },\n { id: \"tools\", labelKey: \"categories.tools\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [pendingLocalRepairRequest, setPendingLocalRepairRequest] =\n useState<WorkspaceAppLocalRepairRequest | null>(null);\n const [updateAppBusy, setUpdateAppBusy] = useState(false);\n const [localRepairBusy, setLocalRepairBusy] = useState(false);\n const [pendingUpdateApp, setPendingUpdateApp] = useState<{\n id: string;\n name: string;\n trigger: \"badge_button\" | \"primary_action\";\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const loadLocalApp = (): void => {\n void Promise.resolve(actions.loadLocalApp?.()).then((request) => {\n if (request) {\n setPendingLocalRepairRequest(request);\n }\n });\n };\n const cardActions = useMemo<AppCenterHostActions>(\n () => ({\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n },\n updateApp: (appId, trigger) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n const shouldConfirmUpdate =\n app.installed &&\n app.status === \"running\" &&\n (actions.shouldConfirmAppUpdate?.(app.id) ?? true);\n if (shouldConfirmUpdate) {\n setPendingUpdateApp({\n id: app.id,\n name: app.name,\n trigger\n });\n return;\n }\n void actions.updateApp?.(appId, trigger);\n }\n }),\n [actions, viewModel.apps]\n );\n const loadingMessage =\n catalogStatus === \"loading\" ? copy.t(\"messages.catalogLoading\") : null;\n const catalogLoading = catalogStatus === \"loading\";\n const failedMessage =\n catalogStatus === \"failed\" ? copy.t(\"messages.catalogFailed\") : null;\n const statusToast =\n errorMessage != null\n ? {\n busy: false,\n message: errorMessage,\n tone: \"destructive\" as const\n }\n : failedMessage != null\n ? {\n busy: false,\n message: failedMessage,\n tone: \"destructive\" as const\n }\n : loadingMessage != null\n ? {\n busy: true,\n message: loadingMessage,\n tone: \"default\" as const\n }\n : null;\n const myApps = sortMyAppsByCreatedDesc(\n viewModel.apps.filter((app) => app.sourceKind === \"local\")\n );\n const recommendedSourceApps = viewModel.apps.filter(\n (app) => app.sourceKind !== \"local\"\n );\n const recommendedApps = sortRecommendedApps(recommendedSourceApps);\n const recommendedAppsForAllTab = sortRecommendedAppsForAllTab(\n recommendedSourceApps\n );\n const recommendedCategoryTabs = createRecommendedCategoryTabs(\n recommendedApps,\n copy\n );\n const activeRecommendedCategoryLabel =\n recommendedCategoryTabs.find(\n (tab) => tab.id === activeRecommendedCategoryTab\n )?.category ?? null;\n const activeRecommendedApps =\n activeRecommendedCategoryLabel == null\n ? recommendedAppsForAllTab\n : recommendedApps.filter(\n (app) => app.category === activeRecommendedCategoryLabel\n );\n const activeApps =\n activeAppTab === \"recommended\" ? activeRecommendedApps : myApps;\n const activeAppTabTitle =\n activeAppTab === \"recommended\"\n ? copy.t(\"labels.recommendedApps\")\n : copy.t(\"labels.myApps\");\n const activeAppEmptyMessage =\n activeAppTab === \"recommended\"\n ? copy.t(\"messages.recommendedAppsEmpty\")\n : copy.t(\"messages.myAppsEmpty\");\n const pendingDeleteAppInstalled = pendingDeleteApp?.installed ?? false;\n const deleteAppConfirmLabel = copy.t(\n pendingDeleteAppInstalled\n ? \"actions.uninstallAndDeleteApp\"\n : \"actions.deleteApp\"\n );\n const deleteAppConfirmDescription = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppDescription\"\n : \"confirmations.deleteAppDescription\"\n );\n const deleteAppConfirmTitle = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppTitle\"\n : \"confirmations.deleteAppTitle\",\n {\n name: pendingDeleteApp?.name ?? \"\"\n }\n );\n const pendingUninstallAppLocal = pendingUninstallApp?.sourceKind === \"local\";\n const uninstallAppConfirmDescription = copy.t(\n pendingUninstallAppLocal\n ? \"confirmations.uninstallAppDescriptionLocal\"\n : \"confirmations.uninstallAppDescriptionRecommended\"\n );\n const uninstallAppConfirmTitle = copy.t(\"confirmations.uninstallAppTitle\", {\n name: pendingUninstallApp?.name ?? \"\"\n });\n const updateAppConfirmTitle = copy.t(\"confirmations.updateAppTitle\", {\n name: pendingUpdateApp?.name ?? \"\"\n });\n const localRepairDialogTitle = copy.t(\"localDev.repairDialog.title\");\n const localRepairDialogDescription = copy.t(\n \"localDev.repairDialog.description\"\n );\n\n return (\n <section\n aria-label={copy.t(\"title\")}\n className={cn(\n \"relative flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)]\",\n className\n )}\n >\n {statusToast ? <AppCenterStatusToast toast={statusToast} /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-auto px-6 pt-5 [container-type:inline-size]\">\n <section className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex h-8 min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n className=\"h-8\"\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex h-8 shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n onLoadLocalApp={loadLocalApp}\n />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\n {activeAppTab === \"my\" && hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[11px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\n job.canFix\n ? \"factory.messages.factoryJobFailedWithFix\"\n : \"factory.messages.factoryJobFailed\"\n )}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[11px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={updateAppBusy}\n confirmLabel={copy.t(\"actions.updateApp\")}\n description={copy.t(\"confirmations.updateRunningAppDescription\")}\n open={pendingUpdateApp != null}\n title={updateAppConfirmTitle}\n onConfirm={() => {\n const app = pendingUpdateApp;\n if (!app) {\n return;\n }\n setUpdateAppBusy(true);\n void Promise.resolve(\n actions.updateApp?.(app.id, app.trigger)\n ).finally(() => {\n setUpdateAppBusy(false);\n setPendingUpdateApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !updateAppBusy) {\n setPendingUpdateApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={localRepairBusy}\n confirmLabel={copy.t(\"localDev.repairDialog.confirm\")}\n description={localRepairDialogDescription}\n open={pendingLocalRepairRequest != null}\n title={localRepairDialogTitle}\n onConfirm={() => {\n const request = pendingLocalRepairRequest;\n if (!request) {\n return;\n }\n setLocalRepairBusy(true);\n void Promise.resolve(\n actions.repairLocalApp?.({\n ...request,\n prompt: copy.t(\"localDev.repairPrompt\", {\n cwd: request.projectDir\n })\n })\n ).finally(() => {\n setLocalRepairBusy(false);\n setPendingLocalRepairRequest(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !localRepairBusy) {\n setPendingLocalRepairRequest(null);\n }\n }}\n />\n <Dialog\n open={factoryDialogOpen}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n closeFactoryDialog();\n return;\n }\n openFactoryDialog();\n }}\n >\n <DialogContent\n className=\"sm:max-w-[min(640px,calc(100%-2rem))]\"\n showCloseButton={false}\n >\n <form\n className=\"grid max-h-[min(760px,calc(100vh-64px))] min-w-0 gap-4 overflow-auto\"\n onSubmit={submitCreate}\n >\n <DialogHeader>\n <DialogTitle>{copy.t(\"factory.labels.create\")}</DialogTitle>\n </DialogHeader>\n <label className=\"grid min-w-0 gap-2\">\n <span className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.appName\")}\n </span>\n <Input\n autoFocus\n className=\"h-9 rounded-[8px]\"\n placeholder={copy.t(\"factory.placeholders.appName\")}\n value={displayName}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n />\n </label>\n <div className=\"grid min-w-0 gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <label\n className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n htmlFor={promptTextareaId}\n >\n {copy.t(\"factory.labels.prompt\")}\n </label>\n <div className=\"relative min-w-0\">\n <Textarea\n className=\"min-h-[148px] resize-none rounded-[10px] pb-14 leading-[1.45] sm:pb-8\"\n id={promptTextareaId}\n placeholder={copy.t(\"factory.placeholders.prompt\")}\n value={prompt}\n onChange={(event) => setPrompt(event.currentTarget.value)}\n />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-1.5 flex min-w-0 flex-wrap items-end justify-between gap-2\">\n {providerErrorMessage &&\n normalizedProviderOptions.length === 0 ? (\n <p className=\"pointer-events-auto max-w-[240px] text-[11px] leading-4 text-[var(--state-danger)]\">\n {providerErrorMessage}\n </p>\n ) : (\n <span aria-hidden=\"true\" className=\"min-h-4 flex-1\" />\n )}\n <div className=\"pointer-events-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-0.5 px-0.5 py-0\">\n <FactoryProviderSelect\n copy={copy}\n errorMessage={providerErrorMessage}\n loading={providerLoading}\n open={openFactorySettingsMenu === \"provider\"}\n options={normalizedProviderOptions}\n selectedProvider={selectedProvider}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent data-[placeholder]:text-[var(--text-tertiary)]\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"provider\" : null\n )\n }\n onSelectProvider={setSelectedProvider}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryPermissionDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n open={openFactorySettingsMenu === \"permission\"}\n options={permissionModeOptions}\n selectedPermissionModeId={selectedPermissionModeId}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"permission\" : null\n )\n }\n onSelectPermissionMode={setSelectedPermissionModeId}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryOptionDropdown\n ariaLabel={copy.t(\"factory.labels.model\")}\n emptyMessage={copy.t(\"factory.messages.noModelOptions\")}\n loading={providerConfigurationStatus === \"loading\"}\n loadingMessage={copy.t(\n \"factory.messages.loadingConfiguration\"\n )}\n open={openFactorySettingsMenu === \"model\"}\n options={modelOptions}\n selectedValue={selectedModel}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(nextOpen ? \"model\" : null)\n }\n onSelectValue={setSelectedModel}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryOptionDropdown\n ariaLabel={copy.t(\"factory.labels.reasoningEffort\")}\n emptyMessage={copy.t(\n \"factory.messages.noReasoningEffortOptions\"\n )}\n loading={providerConfigurationStatus === \"loading\"}\n loadingMessage={copy.t(\n \"factory.messages.loadingConfiguration\"\n )}\n open={openFactorySettingsMenu === \"reasoning\"}\n options={reasoningEffortOptions}\n selectedValue={selectedReasoningEffort}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"reasoning\" : null\n )\n }\n onSelectValue={setSelectedReasoningEffort}\n />\n </div>\n </div>\n </div>\n </div>\n <fieldset className=\"min-w-0 border-0 p-0\">\n <legend className=\"sr-only\">\n {copy.t(\"factory.labels.templates\")}\n </legend>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">\n <span className=\"shrink-0 text-[13px] font-medium leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.templateInspirationPrefix\")}\n </span>\n {factoryTemplates.map((template) => (\n <button\n className=\"inline-flex max-w-full items-center gap-1 border-0 bg-transparent p-0 text-[13px] font-medium leading-5 text-[var(--text-secondary)] transition-colors duration-150 hover:text-[var(--text-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\"\n key={template.id}\n type=\"button\"\n onClick={() => selectTemplate(template)}\n >\n <span className=\"truncate\">\n {copy.t(template.titleKey)}\n </span>\n <OpenSessionsFilledIcon\n aria-hidden=\"true\"\n className=\"shrink-0\"\n size={14}\n />\n </button>\n ))}\n </div>\n </fieldset>\n </div>\n <DialogFooter>\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={closeFactoryDialog}\n >\n {copy.t(\"factory.actions.cancel\")}\n </Button>\n <Button\n disabled={!canCreateFactoryJob}\n size=\"dialog\"\n type=\"submit\"\n >\n {copy.t(\"factory.actions.create\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </section>\n );\n}\n\nfunction FactoryProviderSelect({\n copy,\n errorMessage,\n loading,\n onOpenChange,\n onSelectProvider,\n open,\n options,\n selectedProvider,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n errorMessage?: string | null;\n loading?: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectProvider: (provider: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryProviderOption[];\n selectedProvider: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.provider === selectedProvider) ?? null;\n const placeholder =\n options.length > 0\n ? copy.t(\"factory.messages.noAgentProviders\")\n : loading\n ? copy.t(\"factory.messages.loadingProviders\")\n : errorMessage?.trim() || copy.t(\"factory.messages.noAgentProviders\");\n\n return (\n <Select\n disabled={options.length === 0}\n open={open}\n value={selectedProvider}\n onOpenChange={onOpenChange}\n onValueChange={onSelectProvider}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.agent\")}\n className={cn(\n \"h-9 w-full rounded-[8px] px-3 font-normal [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:min-w-0 [&_[data-slot=select-value]]:items-center [&_[data-slot=select-value]]:gap-2\",\n loading && options.length === 0 ? \"animate-pulse\" : null,\n triggerClassName\n )}\n >\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={selectedOption.iconUrl} />\n <span className=\"truncate\">{selectedOption.label}</span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n className=\"w-[300px] min-w-[240px] max-w-[min(100vw-64px,480px)]\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length === 0 ? (\n <SelectItem disabled value=\"__no-provider__\">\n {copy.t(\"factory.messages.noAgentProviders\")}\n </SelectItem>\n ) : (\n options.map((option) => (\n <SelectItem\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n value={option.provider}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={option.iconUrl} />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryPermissionDropdown({\n copy,\n loading,\n onOpenChange,\n onSelectPermissionMode,\n open,\n options,\n selectedPermissionModeId,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectPermissionMode: (value: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryPermissionOption[];\n selectedPermissionModeId: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.value === selectedPermissionModeId) ?? null;\n const disabled = loading || options.length === 0;\n const selectedLabel = selectedOption\n ? permissionOptionLabel(copy, selectedOption)\n : selectedPermissionModeId;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedPermissionModeId}\n onOpenChange={onOpenChange}\n onValueChange={onSelectPermissionMode}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.review\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center overflow-hidden\">\n {selectedLabel ? (\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noPermissionOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[220px] max-w-[min(100vw-32px,360px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">\n {permissionOptionLabel(copy, option)}\n </span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noPermissionOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryOptionDropdown({\n ariaLabel,\n emptyMessage,\n loading,\n loadingMessage,\n onOpenChange,\n onSelectValue,\n open,\n options,\n selectedValue,\n triggerClassName\n}: {\n ariaLabel: string;\n emptyMessage: string;\n loading: boolean;\n loadingMessage: string;\n onOpenChange: (open: boolean) => void;\n onSelectValue: (value: string) => void;\n open: boolean;\n options: readonly { label: string; value: string }[];\n selectedValue: string;\n triggerClassName?: string;\n}): ReactElement {\n const disabled = loading || options.length === 0;\n const selectedLabel =\n options.find((option) => option.value === selectedValue)?.label ??\n selectedValue;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedValue}\n onOpenChange={onOpenChange}\n onValueChange={onSelectValue}\n >\n <SelectTrigger\n aria-label={ariaLabel}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedLabel ? (\n selectedLabel\n ) : (\n <span className=\"text-[var(--text-tertiary)]\">\n {loading ? loadingMessage : emptyMessage}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[200px] max-w-[min(100vw-32px,320px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {emptyMessage}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction permissionOptionLabel(\n copy: AppCenterI18nRuntime,\n option: AppCenterFactoryPermissionOption\n): string {\n const semantic = option.semantic?.trim();\n if (semantic) {\n const key = `factory.permissionSemantics.${semantic}.label`;\n const translated = copy.t(key);\n if (translated !== key) {\n return translated;\n }\n }\n return option.label.trim() || option.value;\n}\n\nfunction AppCenterAgentProviderIcon({\n iconUrl\n}: {\n iconUrl?: string | null;\n}): ReactElement {\n const normalizedIconUrl = iconUrl?.trim();\n if (!normalizedIconUrl) {\n return (\n <span aria-hidden=\"true\" className=\"size-4 shrink-0 rounded-[4px]\" />\n );\n }\n\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 rounded-[4px] object-contain\"\n decoding=\"async\"\n draggable={false}\n src={normalizedIconUrl}\n />\n );\n}\n\nfunction resolveSelectedFactoryOptionValue(\n currentValue: string,\n options: readonly { value: string }[],\n defaultValue?: string | null\n): string {\n if (options.some((option) => option.value === currentValue)) {\n return currentValue;\n }\n const normalizedDefault = defaultValue?.trim() ?? \"\";\n if (\n normalizedDefault &&\n options.some((option) => option.value === normalizedDefault)\n ) {\n return normalizedDefault;\n }\n return options[0]?.value ?? \"\";\n}\n\nfunction AppCardGrid({\n actions,\n apps,\n copy,\n emptyMessage,\n title\n}: {\n readonly actions: AppCenterHostActions;\n readonly apps: AppCenterViewModel[\"apps\"];\n readonly copy: AppCenterI18nRuntime;\n readonly emptyMessage: string;\n readonly title: string;\n}): ReactElement {\n if (apps.length === 0) {\n return (\n <div\n aria-label={title}\n className=\"flex min-h-0 min-w-0 flex-1 items-center justify-center rounded-[8px] px-6 text-center text-[13px] leading-5 text-[var(--text-secondary)]\"\n role=\"status\"\n >\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-w-0 shrink-0 flex-col\">\n <div\n aria-label={title}\n className=\"grid min-h-0 min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,260px),1fr))] gap-3\"\n role=\"list\"\n >\n {apps.map((app) => (\n <AppCard actions={actions} app={app} copy={copy} key={app.id} />\n ))}\n </div>\n <div aria-hidden=\"true\" className=\"h-6 shrink-0\" />\n </div>\n );\n}\n\ninterface RecommendedCategoryTab {\n readonly category: string | null;\n readonly count: number;\n readonly id: RecommendedCategoryTabID;\n readonly label: string;\n}\n\nfunction createRecommendedCategoryTabs(\n apps: AppCenterViewModel[\"apps\"],\n copy: AppCenterI18nRuntime\n): RecommendedCategoryTab[] {\n const categoryCounts = new Map<string, number>();\n\n for (const app of apps) {\n const category = app.category?.trim();\n if (!category) {\n continue;\n }\n categoryCounts.set(category, (categoryCounts.get(category) ?? 0) + 1);\n }\n\n return recommendedCategoryTabDefinitions.map((definition) => {\n if (definition.id === \"all\") {\n return {\n category: null,\n count: apps.length,\n id: definition.id,\n label: copy.t(\"labels.allApps\")\n };\n }\n\n const category = copy.t(definition.labelKey);\n return {\n category,\n count: categoryCounts.get(category) ?? 0,\n id: definition.id,\n label: category\n };\n });\n}\n\nfunction RecommendedCategoryTabs({\n copy,\n tabs,\n value,\n onValueChange\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly tabs: readonly RecommendedCategoryTab[];\n readonly value: RecommendedCategoryTabID;\n readonly onValueChange: (value: RecommendedCategoryTabID) => void;\n}): ReactElement {\n return (\n <div\n aria-label={copy.t(\"labels.appCategories\")}\n className=\"-mx-1 flex min-h-10 min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-[inset_0_0_0_1px_var(--line-1)]\"\n : \"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[11px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[11px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp,\n onLoadLocalApp\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n readonly onLoadLocalApp: () => void;\n}): ReactElement {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onLoadLocalApp}\n >\n <UploadFolderIcon />\n <span>{copy.t(\"actions.loadUnpackedApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.loadUnpackedAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onImportApp}\n >\n <ImportIcon />\n <span>{copy.t(\"actions.importApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.importAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreateApp}\n >\n <FileCreateIcon />\n {copy.t(\"factory.actions.create\")}\n </Button>\n </>\n );\n}\n\nfunction AppCenterRecommendedHeaderActions({\n copy,\n loading,\n onRefreshCatalog\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly loading: boolean;\n readonly onRefreshCatalog: () => void;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={copy.t(\"actions.refreshCatalog\")}\n disabled={loading}\n size=\"icon-sm\"\n title={copy.t(\"actions.refreshCatalog\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefreshCatalog}\n >\n <RefreshIcon className={loading ? \"animate-spin\" : undefined} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.refreshCatalog\")}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction FactoryJobStatusIndicator({\n copy,\n job\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly job: WorkspaceAppFactoryJobViewModel;\n}): ReactElement {\n const statusLabel = copy.t(job.statusLabelKey);\n if (job.status === \"generating\") {\n return (\n <span\n aria-label={statusLabel}\n className=\"inline-flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n title={statusLabel}\n >\n <Spinner\n className=\"text-[var(--text-tertiary)]\"\n size={12}\n strokeWidth={2}\n trackColor=\"var(--line-2)\"\n />\n </span>\n );\n }\n return (\n <Badge variant={job.status === \"failed\" ? \"destructive\" : \"secondary\"}>\n {statusLabel}\n </Badge>\n );\n}\n"],"mappings":";;;;;;;;;AACA,SAAS,MAAM,aAAa,eAAe;AAC3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA2NC,cAiBE,YAjBF;AA9GD,IAAM,UAAU,KAAK,SAASA,SAAQ;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,cAAc,KAAK,EAAE,IAAI,cAAc;AAC7C,QAAM,cACJ,IAAI,mBAAmB,QAAQ,IAAI,WAAW;AAChD,QAAM,kBAAkB,cACpB,KAAK,EAAE,mBAAmB,IAC1B;AACJ,QAAM,0BAA0B;AAChC,QAAM,oBAAoB,IAAI,kBAC1B,4BAA4B,MAAM,IAAI,iBAAiB,eAAe,IACtE;AACJ,QAAM,qBACJ,IAAI,kBAAkB,YAClB,KAAK,EAAE,oBAAoB,IAC3B,IAAI,kBAAkB,UACpB,KAAK,EAAE,kBAAkB,IACzB,IAAI,kBAAkB,WACpB,IAAI,mBACF,KAAK,EAAE,0BAA0B;AAAA,IAC/B,SAAS,IAAI;AAAA,EACf,CAAC,IACD,KAAK,EAAE,mBAAmB,IAC5B,IAAI,kBAAkB,mBACpB,KAAK,EAAE,2BAA2B,IAClC,KAAK,EAAE,iBAAiB;AACpC,QAAM,0BAA0B,IAAI,kBAAkB;AACtD,QAAM,qBAAqB,0BACvB,qBACA;AACJ,QAAM,kBAAkB,IAAI;AAC5B,QAAM,0BACJ,IAAI,2BAA2B,CAAC,CAAC,IAAI;AACvC,QAAM,wBACJ,IAAI,yBACJ,CAAC,CAAC,IAAI,yBACN,CAAC,CAAC,IAAI;AACR,QAAM,gBAAgB;AAAA,IACpB,MAAM,gCAAgC,GAAG;AAAA,IACzC,CAAC,GAAG;AAAA,EACN;AACA,QAAM,iBACJ,2BACA,yBACA,IAAI,aACJ,IAAI,aACJ,IAAI,kBACJ,IAAI,kBACJ,IAAI,iBACJ,IAAI,wBACJ,IAAI;AACN,QAAM,uBAAuB,YAAY,MAAY;AACnD,QAAI,IAAI,kBAAkB,SAAS;AACjC,WAAK,QAAQ,WAAW,IAAI,EAAE;AAC9B;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,WAAW;AACnC,WAAK,QAAQ,aAAa,IAAI,EAAE;AAChC;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,UAAU;AAClC,WAAK,QAAQ,YAAY,IAAI,IAAI,gBAAgB;AACjD;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,kBAAkB;AAC1C,WAAK,QAAQ,oBAAoB,IAAI,EAAE;AACvC;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,QAAQ;AAChC,WAAK,QAAQ,UAAU,IAAI,IAAI,aAAa;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,IAAI,IAAI,IAAI,aAAa,CAAC;AACtD,QAAM,oBAAoB,YAAY,MAAY;AAChD,QAAI,iBAAiB;AACnB,WAAK,QAAQ,UAAU,IAAI,IAAI,aAAa;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,IAAI,IAAI,eAAe,CAAC;AACpD,QAAM,oBAAoB;AAAA,IACxB,CAAC,UAA4C;AAC3C,UAAI,CAAC,mBAAoB,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAM;AACpE;AAAA,MACF;AACA,YAAM,eAAe;AACrB,wBAAkB;AAAA,IACpB;AAAA,IACA,CAAC,iBAAiB,iBAAiB;AAAA,EACrC;AACA,QAAM,oBAAoB,YAAY,MAAY;AAChD,SAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,EACtC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;AAEpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,kBAAkB,SAAY;AAAA,MAC7C,WAAW;AAAA,QACT;AAAA,QACA,kBAAkB,mBAAmB;AAAA,QACrC;AAAA,MACF;AAAA,MACA,0BAAwB,IAAI;AAAA,MAC5B,MAAK;AAAA,MACL,UAAU,kBAAkB,IAAI;AAAA,MAChC,SAAS;AAAA,MACT,WAAW;AAAA,MAEX;AAAA,6BAAC,SAAI,WAAU,kDACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,kBAAkB,KAAK,EAAE,qBAAqB;AAAA,cAC9C,eAAe;AAAA;AAAA,UACjB;AAAA,UACA,qBAAC,SAAI,WAAU,sDACb;AAAA,gCAAC,SAAI,WAAU,oDACZ,2BACC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,IACE,MACN;AAAA,YACA,qBAAC,SAAI,WAAU,qCACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,CAAC,0BAA0B,mBAAmB;AAAA,oBAC9C,0BACI,IAAI,kBAAkB,UACpB,gBAAgB,IAAI,MAAM,IAC1B,+BACF,gBAAgB,IAAI,MAAM;AAAA,kBAChC;AAAA,kBACA,UAAU,CAAC;AAAA,kBACX,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,CAAC,UAAU;AAClB,0BAAM,gBAAgB;AACtB,yCAAqB;AAAA,kBACvB;AAAA,kBAEA,8BAAC,UAAK,WAAU,qCACb,oCAA0B,qBAAqB,iBAClD;AAAA;AAAA,cACF;AAAA,cACC,0BACC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,KAAK,EAAE,qCAAqC;AAAA,kBACvD,iBAAiB;AAAA,kBACjB,UAAU,IAAI;AAAA;AAAA,cAChB,IACE;AAAA,eACN;AAAA,aACF;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,iDACb;AAAA,+BAAC,SAAI,WAAU,WACb;AAAA,iCAAC,SAAI,WAAU,qCACb;AAAA,kCAAC,QAAG,WAAU,sGACX,cAAI,MACP;AAAA,cACC,IAAI,UACH,oBAAC,UAAK,WAAU,wKACb,eAAK,EAAE,kBAAkB,EAAE,SAAS,IAAI,QAAQ,CAAC,GACpD,IACE;AAAA,cACH,IAAI,iBACH,oBAAC,UAAK,WAAU,kJACb,eAAK,EAAE,iBAAiB,GAC3B,IACE;AAAA,eACN;AAAA,YACC,IAAI,cACH,oBAAC,OAAE,WAAU,wFACV,cAAI,aACP,IACE;AAAA,aACN;AAAA,UAEC,IAAI,eACH,oBAAC,SAAI,WAAU,4CACb;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,IAAI;AAAA,cAEV,eAAK,EAAE,2BAA2B;AAAA;AAAA,UACrC,GACF,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,gCACP,KAC2B;AAC3B,SAAO;AAAA,IACL,gBAAgB,IAAI,kBAAkB;AAAA,IACtC,WAAW,IAAI,aAAa;AAAA,IAC5B,WAAW,IAAI,aAAa;AAAA,EAC9B;AACF;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMiB;AACf,QAAM,YAAuC,CAAC;AAE9C,MAAI,yBAAyB;AAC3B,cAAU,KAAK;AAAA,MACb,WAAW;AAAA,MACX,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,0BAA0B;AAAA,MACxC,UAAU,MAAM;AACd,aAAK,QAAQ,oBAAoB,IAAI,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,uBAAuB;AACzB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,YAAS;AAAA,MAChB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,4BAA4B;AAAA,MAC1C,UAAU,MAAM;AACd,YAAI,IAAI,sBAAsB,gBAAgB;AAC5C,eAAK,QAAQ;AAAA,YACX,IAAI,yBAAyB;AAAA,YAC7B,IAAI;AAAA,UACN;AACA;AAAA,QACF;AACA,aAAK,QAAQ;AAAA,UACX,IAAI,gBAAgB;AAAA,UACpB,IAAI,yBAAyB;AAAA,UAC7B,IAAI;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,gBAAgB;AACtB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,YAAS;AAAA,MAChB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,qBAAqB;AAAA,MACnC,UAAU,MAAM;AACd,aAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,gBAAgB;AACtB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,eAAY;AAAA,MACnB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,MACtC,UAAU,MAAM;AACd,aAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,eAAe;AACrB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,uBAAuB;AAAA,MACrC,UAAU,MAAM;AACd,aAAK,QAAQ,gBAAgB,IAAI,EAAE;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,sBAAsB;AAC5B,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,8BAA8B;AAAA,MAC5C,UAAU,MAAM;AACd,aAAK,QAAQ,uBAAuB,IAAI,EAAE;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,WAAW;AACjB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,mBAAmB;AAAA,MACjC,UAAU,MAAM;AACd,aAAK,QAAQ,YAAY,IAAI,EAAE;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,cAAc;AACpB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,iBAAc;AAAA,MACrB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,sBAAsB;AAAA,MACpC,UAAU,MAAM;AACd,aAAK,QAAQ,eAAe,IAAI,EAAE;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,WAAW;AACjB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK;AAAA,QACV,IAAI,YAAY,kCAAkC;AAAA,MACpD;AAAA,MACA,UAAU,MAAM;AACd,aAAK,QAAQ,YAAY,IAAI,IAAI,IAAI,IAAI;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,KAAK,EAAE,qBAAqB;AAAA,MACvC,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,KAAK,EAAE,qBAAqB;AAAA;AAAA,EAC5C;AAEJ;AAWA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAKiB;AACf,SACE,qBAAC,gBACC;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA;AAAA,8BAAC,sBAAmB;AAAA,UACnB,YACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAU;AAAA,QACV,kBAAkB;AAAA,QAClB,MAAK;AAAA,QACL,OAAO,EAAE,QAAQ,yBAAyB;AAAA,QAC1C,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,WAAW,CAAC,UAAU;AACpB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA,8BAAC,qBAAkB,WAAU,aAC1B,gBAAM,IAAI,CAAC,SACV;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YAEV,SAAS,KAAK;AAAA,YACd,UAAU,CAAC,UAAU;AACnB,oBAAM,gBAAgB;AACtB,mBAAK,SAAS;AAAA,YAChB;AAAA,YAEC;AAAA,mBAAK;AAAA,cACN,oBAAC,UAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,cACrD,KAAK,YACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA;AAAA,cACZ,IACE;AAAA;AAAA;AAAA,UAdC,KAAK;AAAA,QAeZ,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIiB;AACf,QAAM,OACJ,IAAI,MAAM,SAAS,UACjB;AAAA,IAAC;AAAA;AAAA,MACC,KAAI;AAAA,MACJ,WAAU;AAAA,MACV,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA;AAAA,EAChB,IAEA,oBAAC,UAAK,WAAU,iIACd,8BAAC,6BAA0B,WAAU,eAAc,GACrD;AAGJ,SACE,qBAAC,UAAK,WAAU,mDACb;AAAA;AAAA,IACA,IAAI,iBACH;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAK;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AACtB,gBAAM,cAAc,KAAK;AACzB,wBAAc;AAAA,QAChB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA,8BAAC,YAAS,WAAU,YAAW;AAAA;AAAA,IACjC,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIiB;AACf,QAAM,UACJ,YAAY,OACR,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,IACtD,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,SAAS,cAAc,CAAC,CAAC;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,WAAU;AAAA,MACV,MAAK;AAAA,MACL,OAAO;AAAA,QACL,YAAY,wCAAwC,OAAO;AAAA,MAC7D;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,4BACP,MACA,UACA,aACQ;AACR,QAAM,YAAY,2BAA2B,MAAM,QAAQ;AAC3D,QAAM,UAAU,KAAK;AAAA,IACnB;AAAA,IACA,KAAK,IAAI,KAAK,KAAK,MAAM,SAAS,cAAc,CAAC;AAAA,EACnD;AACA,MAAI,WAAW;AACb,WAAO,GAAG,WAAW,SAAM,SAAS,SAAM,OAAO;AAAA,EACnD;AACA,SAAO,GAAG,WAAW,SAAM,OAAO;AACpC;AAEA,SAAS,2BACP,MACA,UACe;AACf,MACE,SAAS,cAAc,iBACvB,SAAS,mBAAmB,MAC5B;AACA,WAAO;AAAA,EACT;AACA,QAAM,aAAa,eAAe,SAAS,eAAe;AAC1D,MAAI,SAAS,cAAc,QAAQ,SAAS,cAAc,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,SAAO,KAAK,EAAE,4CAA4C;AAAA,IACxD;AAAA,IACA,OAAO,eAAe,SAAS,UAAU;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,SAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,GAAG;AACnD,YAAQ;AACR,iBAAa;AAAA,EACf;AACA,QAAM,YAAY,QAAQ,MAAM,cAAc,IAAI,IAAI;AACtD,SAAO,GAAG,KAAK,QAAQ,SAAS,CAAC,IAAI,MAAM,SAAS,CAAC;AACvD;AAEA,SAAS,gBAAgB,QAAqD;AAC5E,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,eAAe;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACrsBA,SAAS,WAAW,OAAO,WAAAC,UAAS,gBAAgB;AACpD;AAAA,EACE;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,oBAAoB;AAAA,EACpB,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,OACK;AA6gBc,SA88BjB,UA98BiB,OAAAC,MAGX,QAAAC,aAHW;AA9drB,IAAM,mBAA+C;AAAA,EACnD;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,oCASA;AAAA,EACJ,EAAE,IAAI,OAAO,UAAU,KAAK;AAAA,EAC5B,EAAE,IAAI,kBAAkB,UAAU,2BAA2B;AAAA,EAC7D,EAAE,IAAI,oBAAoB,UAAU,6BAA6B;AAAA,EACjE,EAAE,IAAI,UAAU,UAAU,oBAAoB;AAAA,EAC9C,EAAE,IAAI,SAAS,UAAU,mBAAmB;AAC9C;AAoBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB,CAAC;AAAA,EACnB;AACF,GAAsC;AACpC,QAAM,mBAAmB,MAAM;AAC/B,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAItC,IAAI;AACd,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAI5C,IAAI;AACd,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAgD,IAAI;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAItC,IAAI;AACd,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,uBAAuB,wBAAwB,IACpD,SAAuD,IAAI;AAC7D,QAAM,CAAC,6BAA6B,8BAA8B,IAChE,SAAuC,MAAM;AAC/C,QAAM,CAAC,yBAAyB,0BAA0B,IACxD,SAAqC,IAAI;AAC3C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE;AACrD,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,EAAE;AAC3E,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAS,EAAE;AACzE,QAAM,4BAA4BC;AAAA,IAChC,MACE,gBACG,IAAI,CAAC,WAAW;AACf,YAAM,WAAW,OAAO,SAAS,KAAK;AACtC,YAAM,QAAQ,OAAO,MAAM,KAAK,KAAK;AACrC,UAAI,CAAC,YAAY,CAAC,OAAO;AACvB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,OAAO,gBAAgB,KAAK,IAC5B,EAAE,gBAAgB,OAAO,eAAe,KAAK,EAAE,IAC/C,CAAC;AAAA,QACL,GAAI,OAAO,SAAS,KAAK,IACrB,EAAE,SAAS,OAAO,QAAQ,KAAK,EAAE,IACjC,CAAC;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC,EACA,OAAO,CAAC,WAAW,UAAU,IAAI;AAAA,IACtC,CAAC,eAAe;AAAA,EAClB;AACA,QAAM,CAAC,kBAAkB,mBAAmB,IAAI;AAAA,IAAS,MACvD;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,0BAA0B,2BAA2B,IAC1D,SAA0B,aAAa;AACzC,QAAM,CAAC,8BAA8B,+BAA+B,IAClE,SAAmC,KAAK;AAC1C,QAAM,eAAe,0BAA0B;AAC/C,YAAU,MAAM;AACd;AAAA,MAAoB,CAAC,YACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,sBAAsB,yBAAyB,CAAC;AACpD,QAAM,yBACJ,0BAA0B;AAAA,IACxB,CAAC,WAAW,OAAO,aAAa;AAAA,EAClC,KAAK;AACP,YAAU,MAAM;AACd,QAAI,CAAC,mBAAmB;AACtB,+BAAyB,IAAI;AAC7B,qCAA+B,MAAM;AACrC;AAAA,IACF;AACA,UAAM,WAAW,wBAAwB,UAAU,KAAK,KAAK;AAC7D,QAAI,CAAC,YAAY,CAAC,2BAA2B;AAC3C,+BAAyB,IAAI;AAC7B,qCAA+B,OAAO;AACtC;AAAA,IACF;AACA,QAAI,WAAW;AACf,6BAAyB,IAAI;AAC7B,mCAA+B,SAAS;AACxC,SAAK,0BAA0B,QAAQ,EACpC,KAAK,CAAC,kBAAkB;AACvB,UAAI,UAAU;AACZ;AAAA,MACF;AACA,+BAAyB,aAAa;AACtC,qCAA+B,OAAO;AAAA,IACxC,CAAC,EACA,MAAM,MAAM;AACX,UAAI,UAAU;AACZ;AAAA,MACF;AACA,+BAAyB,IAAI;AAC7B,qCAA+B,OAAO;AAAA,IACxC,CAAC;AACH,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,EAC1B,CAAC;AACD,QAAM,eAAe,uBAAuB,gBAAgB,CAAC;AAC7D,QAAM,wBACJ,uBAAuB,yBAAyB,CAAC;AACnD,QAAM,yBACJ,uBAAuB,0BAA0B,CAAC;AACpD,YAAU,MAAM;AACd;AAAA,MAAiB,CAAC,YAChB;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,uBAAuB,YAAY,CAAC;AACtD,YAAU,MAAM;AACd;AAAA,MAA4B,CAAC,YAC3B;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,uBAAuB,uBAAuB,uBAAuB,CAAC;AAC1E,YAAU,MAAM;AACd;AAAA,MAA2B,CAAC,YAC1B;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,uBAAuB,wBAAwB,sBAAsB,CAAC;AAC1E,QAAM,kBAAkB,CAAC,QAA+B;AACtD,QAAI,2BAA2B,QAAW;AACxC,kCAA4B,GAAG;AAAA,IACjC;AACA,2BAAuB,GAAG;AAAA,EAC5B;AACA,QAAM,cAAc,UAAU,eAAe,CAAC;AAC9C,QAAM,iBAAiB,YAAY,SAAS;AAC5C,QAAM,qBAAqB,MAAY;AACrC,yBAAqB,KAAK;AAC1B,mBAAe,EAAE;AACjB,cAAU,EAAE;AACZ,6BAAyB,IAAI;AAC7B,mCAA+B,MAAM;AACrC,+BAA2B,IAAI;AAC/B,qBAAiB,EAAE;AACnB,gCAA4B,EAAE;AAC9B,+BAA2B,EAAE;AAAA,EAC/B;AACA,QAAM,oBAAoB,MAAY;AACpC;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,qBAAiB,EAAE;AACnB,gCAA4B,EAAE;AAC9B,+BAA2B,EAAE;AAC7B,6BAAyB,IAAI;AAC7B,mCAA+B,MAAM;AACrC,+BAA2B,IAAI;AAC/B,yBAAqB,IAAI;AAAA,EAC3B;AACA,QAAM,sBACJ,CAAC,CAAC,YAAY,KAAK,KACnB,CAAC,CAAC,OAAO,KAAK,KACd,gCAAgC,aAChC,CAAC,CAAC,0BACF,uBAAuB,aAAa;AACtC,QAAM,eAAe,CAAC,UAA2B;AAC/C,UAAM,eAAe;AACrB,UAAM,wBAAwB,YAAY,KAAK;AAC/C,UAAM,mBAAmB,OAAO,KAAK;AACrC,QACE,CAAC,yBACD,CAAC,oBACD,CAAC,0BACD,uBAAuB,aAAa,MACpC;AACA;AAAA,IACF;AACA,mBAAe,EAAE;AACjB,cAAU,EAAE;AACZ,yBAAqB,KAAK;AAC1B,SAAK,QAAQ,mBAAmB;AAAA,MAC9B,aAAa;AAAA,MACb,GAAI,cAAc,KAAK,IAAI,EAAE,OAAO,cAAc,KAAK,EAAE,IAAI,CAAC;AAAA,MAC9D,GAAI,yBAAyB,KAAK,IAC9B,EAAE,kBAAkB,yBAAyB,KAAK,EAAE,IACpD,CAAC;AAAA,MACL,UAAU,uBAAuB;AAAA,MACjC,QAAQ;AAAA,MACR,GAAI,wBAAwB,KAAK,IAC7B,EAAE,iBAAiB,wBAAwB,KAAK,EAAE,IAClD,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,QAAM,iBAAiB,CAAC,aAAoC;AAC1D,mBAAe,KAAK,EAAE,SAAS,cAAc,CAAC;AAC9C,cAAU,KAAK,EAAE,SAAS,SAAS,CAAC;AAAA,EACtC;AACA,QAAM,6BAA6B,CAAC,QAGxB;AACV,UAAM,iBAAiB,IAAI,gBAAgB,KAAK;AAChD,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AACA,SAAK,QAAQ,6BAA6B,gBAAgB,IAAI,QAAQ;AAAA,EACxE;AACA,QAAM,eAAe,MAAY;AAC/B,SAAK,QAAQ,QAAQ,QAAQ,eAAe,CAAC,EAAE,KAAK,CAAC,YAAY;AAC/D,UAAI,SAAS;AACX,qCAA6B,OAAO;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,cAAcA;AAAA,IAClB,OAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAW,CAAC,OAAO,YAAY;AAC7B,4BAAoB;AAAA,UAClB,IAAI;AAAA,UACJ,WACE,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,GAAG,aAAa;AAAA,UAC/D,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,cAAc,CAAC,UAAU;AACvB,cAAM,MAAM,UAAU,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK;AAC3D,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AACA,+BAAuB;AAAA,UACrB,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,YAAY,IAAI;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,WAAW,CAAC,OAAO,YAAY;AAC7B,cAAM,MAAM,UAAU,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK;AAC3D,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AACA,cAAM,sBACJ,IAAI,aACJ,IAAI,WAAW,cACd,QAAQ,yBAAyB,IAAI,EAAE,KAAK;AAC/C,YAAI,qBAAqB;AACvB,8BAAoB;AAAA,YAClB,IAAI,IAAI;AAAA,YACR,MAAM,IAAI;AAAA,YACV;AAAA,UACF,CAAC;AACD;AAAA,QACF;AACA,aAAK,QAAQ,YAAY,OAAO,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,IACA,CAAC,SAAS,UAAU,IAAI;AAAA,EAC1B;AACA,QAAM,iBACJ,kBAAkB,YAAY,KAAK,EAAE,yBAAyB,IAAI;AACpE,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,gBACJ,kBAAkB,WAAW,KAAK,EAAE,wBAAwB,IAAI;AAClE,QAAM,cACJ,gBAAgB,OACZ;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA,iBAAiB,OACf;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA,kBAAkB,OAChB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA;AACV,QAAM,SAAS;AAAA,IACb,UAAU,KAAK,OAAO,CAAC,QAAQ,IAAI,eAAe,OAAO;AAAA,EAC3D;AACA,QAAM,wBAAwB,UAAU,KAAK;AAAA,IAC3C,CAAC,QAAQ,IAAI,eAAe;AAAA,EAC9B;AACA,QAAM,kBAAkB,oBAAoB,qBAAqB;AACjE,QAAM,2BAA2B;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,QAAM,iCACJ,wBAAwB;AAAA,IACtB,CAAC,QAAQ,IAAI,OAAO;AAAA,EACtB,GAAG,YAAY;AACjB,QAAM,wBACJ,kCAAkC,OAC9B,2BACA,gBAAgB;AAAA,IACd,CAAC,QAAQ,IAAI,aAAa;AAAA,EAC5B;AACN,QAAM,aACJ,iBAAiB,gBAAgB,wBAAwB;AAC3D,QAAM,oBACJ,iBAAiB,gBACb,KAAK,EAAE,wBAAwB,IAC/B,KAAK,EAAE,eAAe;AAC5B,QAAM,wBACJ,iBAAiB,gBACb,KAAK,EAAE,+BAA+B,IACtC,KAAK,EAAE,sBAAsB;AACnC,QAAM,4BAA4B,kBAAkB,aAAa;AACjE,QAAM,wBAAwB,KAAK;AAAA,IACjC,4BACI,kCACA;AAAA,EACN;AACA,QAAM,8BAA8B,KAAK;AAAA,IACvC,4BACI,mDACA;AAAA,EACN;AACA,QAAM,wBAAwB,KAAK;AAAA,IACjC,4BACI,6CACA;AAAA,IACJ;AAAA,MACE,MAAM,kBAAkB,QAAQ;AAAA,IAClC;AAAA,EACF;AACA,QAAM,2BAA2B,qBAAqB,eAAe;AACrE,QAAM,iCAAiC,KAAK;AAAA,IAC1C,2BACI,+CACA;AAAA,EACN;AACA,QAAM,2BAA2B,KAAK,EAAE,mCAAmC;AAAA,IACzE,MAAM,qBAAqB,QAAQ;AAAA,EACrC,CAAC;AACD,QAAM,wBAAwB,KAAK,EAAE,gCAAgC;AAAA,IACnE,MAAM,kBAAkB,QAAQ;AAAA,EAClC,CAAC;AACD,QAAM,yBAAyB,KAAK,EAAE,6BAA6B;AACnE,QAAM,+BAA+B,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,KAAK,EAAE,OAAO;AAAA,MAC1B,WAAWE;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,sBAAc,gBAAAH,KAAC,wBAAqB,OAAO,aAAa,IAAK;AAAA,QAC9D,gBAAAA,KAAC,SAAI,WAAU,2FACb,0BAAAC,MAAC,aAAQ,WAAU,8CACjB;AAAA,0BAAAA,MAAC,SAAI,WAAU,uDACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,KAAK,EAAE,gBAAgB;AAAA,gBAClC,WAAU;AAAA,gBACV,MAAM;AAAA,kBACJ;AAAA,oBACE,OAAO,KAAK,EAAE,wBAAwB;AAAA,oBACtC,OAAO;AAAA,kBACT;AAAA,kBACA;AAAA,oBACE,OAAO,KAAK,EAAE,eAAe;AAAA,oBAC7B,OAAO;AAAA,kBACT;AAAA,gBACF;AAAA,gBACA,OAAO;AAAA,gBACP,eAAe;AAAA;AAAA,YACjB;AAAA,YACA,gBAAAA,KAAC,SAAI,WAAU,wCACZ,2BAAiB,OAChB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,aAAa,MAAM;AACjB,oCAAkB;AAAA,gBACpB;AAAA,gBACA,aAAa,MAAM;AACjB,uBAAK,QAAQ,YAAY;AAAA,gBAC3B;AAAA,gBACA,gBAAgB;AAAA;AAAA,YAClB,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,SAAS;AAAA,gBACT,kBAAkB,MAAM;AACtB,uBAAK,QAAQ,iBAAiB;AAAA,gBAChC;AAAA;AAAA,YACF,GAEJ;AAAA,aACF;AAAA,UACC,iBAAiB,QAAQ,iBACxB,gBAAAC,MAAC,aAAQ,WAAU,WACjB;AAAA,4BAAAD,KAAC,QAAG,WAAU,oFACX,eAAK,EAAE,qBAAqB,GAC/B;AAAA,YACA,gBAAAA,KAAC,SAAI,WAAU,+BACZ,sBAAY,IAAI,CAAC,QAChB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,iBAAe,IAAI,sBAAsB,SAAY;AAAA,gBACrD,WAAWE;AAAA,kBACT;AAAA,kBACA,IAAI,sBACA,wDACA;AAAA,gBACN;AAAA,gBAEA,MAAK;AAAA,gBACL,UAAU,IAAI,sBAAsB,IAAI;AAAA,gBACxC,SAAS,MAAM,2BAA2B,GAAG;AAAA,gBAC7C,WAAW,CAAC,UAAU;AACpB,sBACE,CAAC,IAAI,uBACL,MAAM,kBAAkB,MAAM,UAC7B,MAAM,QAAQ,WAAW,MAAM,QAAQ,KACxC;AACA;AAAA,kBACF;AACA,wBAAM,eAAe;AACrB,6CAA2B,GAAG;AAAA,gBAChC;AAAA,gBAEA;AAAA,kCAAAF,MAAC,SAAI,WAAU,WACb;AAAA,oCAAAA,MAAC,SAAI,WAAU,mCACb;AAAA,sCAAAD,KAAC,QAAG,WAAU,2EACX,cAAI,OACP;AAAA,sBACA,gBAAAA,KAAC,6BAA0B,MAAY,KAAU;AAAA,uBACnD;AAAA,oBACC,IAAI,gBACH,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO,IAAI;AAAA,wBAEV,eAAK;AAAA,0BACJ,IAAI,SACA,6CACA;AAAA,wBACN;AAAA;AAAA,oBACF,IAEA,gBAAAA,KAAC,OAAE,WAAU,oEACV,cAAI,QACP;AAAA,qBAEJ;AAAA,kBACA,gBAAAC,MAAC,SAAI,WAAU,oCACZ;AAAA,wBAAI,qBACH,gBAAAD;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,yBAAyB,IAAI,EAAE;AAAA,wBAC9C;AAAA,wBAEC,eAAK,EAAE,0BAA0B;AAAA;AAAA,oBACpC,IACE;AAAA,oBACH,IAAI,aACH,gBAAAJ;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,oBAAoB,IAAI,EAAE;AAAA,wBACzC;AAAA,wBAEC,eAAK,EAAE,yBAAyB;AAAA;AAAA,oBACnC,IACE;AAAA,oBACH,IAAI,SACH,gBAAAJ;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ;AAAA,4BACX,IAAI;AAAA,4BACJ,KAAK,EAAE,4BAA4B;AAAA,0BACrC;AAAA,wBACF;AAAA,wBAEC,eAAK,EAAE,qBAAqB;AAAA;AAAA,oBAC/B,IACE;AAAA,oBACH,IAAI,YACH,gBAAAJ;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,cAAY,KAAK,EAAE,wBAAwB;AAAA,wBAC3C,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,wBACtC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,mBAAmB,IAAI,EAAE;AAAA,wBACxC;AAAA,wBAEA,0BAAAJ,KAAC,aAAU;AAAA;AAAA,oBACb,IACE;AAAA,oBACH,IAAI,YACH,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,cAAY,KAAK,EAAE,wBAAwB;AAAA,wBAC3C,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,wBACtC,MAAK;AAAA,wBACL,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,mBAAmB,IAAI,EAAE;AAAA,wBACxC;AAAA,wBAEA,0BAAAA,KAACK,aAAA,EAAW;AAAA;AAAA,oBACd,IACE;AAAA,qBACN;AAAA;AAAA;AAAA,cAlHK,IAAI;AAAA,YAmHX,CACD,GACH;AAAA,aACF,IACE;AAAA,UACH,UAAU,QACT,gBAAAL,KAAC,OAAE,WAAU,sDACV,eAAK,EAAE,gBAAgB,GAC1B,IACE;AAAA,UACH,iBAAiB,gBAChB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAM;AAAA,cACN,OAAO;AAAA,cACP,eAAe;AAAA;AAAA,UACjB,IACE;AAAA,UACJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,MAAM;AAAA,cACN;AAAA,cACA,cAAc;AAAA,cACd,OAAO;AAAA;AAAA,UACT;AAAA,WACF,GACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,MAAK;AAAA,YACL,WAAW,MAAM;AACf,oBAAM,MAAM;AACZ,kBAAI,CAAC,KAAK;AACR;AAAA,cACF;AACA,+BAAiB,IAAI;AACrB,mBAAK,QAAQ,QAAQ,QAAQ,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;AAAA,gBAC1D,MAAM;AACJ,mCAAiB,KAAK;AACtB,sCAAoB,IAAI;AAAA,gBAC1B;AAAA,cACF;AAAA,YACF;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,eAAe;AAC/B,oCAAoB,IAAI;AAAA,cAC1B;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc,KAAK,EAAE,sBAAsB;AAAA,YAC3C,aAAa;AAAA,YACb,MAAM,uBAAuB;AAAA,YAC7B,OAAO;AAAA,YACP,MAAK;AAAA,YACL,WAAW,MAAM;AACf,oBAAM,MAAM;AACZ,kBAAI,CAAC,KAAK;AACR;AAAA,cACF;AACA,kCAAoB,IAAI;AACxB,mBAAK,QAAQ,QAAQ,QAAQ,eAAe,IAAI,EAAE,CAAC,EAAE,QAAQ,MAAM;AACjE,oCAAoB,KAAK;AACzB,uCAAuB,IAAI;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,kBAAkB;AAClC,uCAAuB,IAAI;AAAA,cAC7B;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc,KAAK,EAAE,mBAAmB;AAAA,YACxC,aAAa,KAAK,EAAE,2CAA2C;AAAA,YAC/D,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,WAAW,MAAM;AACf,oBAAM,MAAM;AACZ,kBAAI,CAAC,KAAK;AACR;AAAA,cACF;AACA,+BAAiB,IAAI;AACrB,mBAAK,QAAQ;AAAA,gBACX,QAAQ,YAAY,IAAI,IAAI,IAAI,OAAO;AAAA,cACzC,EAAE,QAAQ,MAAM;AACd,iCAAiB,KAAK;AACtB,oCAAoB,IAAI;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,eAAe;AAC/B,oCAAoB,IAAI;AAAA,cAC1B;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc,KAAK,EAAE,+BAA+B;AAAA,YACpD,aAAa;AAAA,YACb,MAAM,6BAA6B;AAAA,YACnC,OAAO;AAAA,YACP,WAAW,MAAM;AACf,oBAAM,UAAU;AAChB,kBAAI,CAAC,SAAS;AACZ;AAAA,cACF;AACA,iCAAmB,IAAI;AACvB,mBAAK,QAAQ;AAAA,gBACX,QAAQ,iBAAiB;AAAA,kBACvB,GAAG;AAAA,kBACH,QAAQ,KAAK,EAAE,yBAAyB;AAAA,oBACtC,KAAK,QAAQ;AAAA,kBACf,CAAC;AAAA,gBACH,CAAC;AAAA,cACH,EAAE,QAAQ,MAAM;AACd,mCAAmB,KAAK;AACxB,6CAA6B,IAAI;AAAA,cACnC,CAAC;AAAA,YACH;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,iBAAiB;AACjC,6CAA6B,IAAI;AAAA,cACnC;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,UAAU;AACb,mCAAmB;AACnB;AAAA,cACF;AACA,gCAAkB;AAAA,YACpB;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,iBAAiB;AAAA,gBAEjB,0BAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,UAAU;AAAA,oBAEV;AAAA,sCAAAD,KAAC,gBACC,0BAAAA,KAAC,eAAa,eAAK,EAAE,uBAAuB,GAAE,GAChD;AAAA,sBACA,gBAAAC,MAAC,WAAM,WAAU,sBACf;AAAA,wCAAAD,KAAC,UAAK,WAAU,oEACb,eAAK,EAAE,wBAAwB,GAClC;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAS;AAAA,4BACT,WAAU;AAAA,4BACV,aAAa,KAAK,EAAE,8BAA8B;AAAA,4BAClD,OAAO;AAAA,4BACP,UAAU,CAAC,UAAU,eAAe,MAAM,cAAc,KAAK;AAAA;AAAA,wBAC/D;AAAA,yBACF;AAAA,sBACA,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,wCAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,0CAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,SAAS;AAAA,8BAER,eAAK,EAAE,uBAAuB;AAAA;AAAA,0BACjC;AAAA,0BACA,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,4CAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCACV,IAAI;AAAA,gCACJ,aAAa,KAAK,EAAE,6BAA6B;AAAA,gCACjD,OAAO;AAAA,gCACP,UAAU,CAAC,UAAU,UAAU,MAAM,cAAc,KAAK;AAAA;AAAA,4BAC1D;AAAA,4BACA,gBAAAC,MAAC,SAAI,WAAU,4GACZ;AAAA,sDACD,0BAA0B,WAAW,IACnC,gBAAAD,KAAC,OAAE,WAAU,sFACV,gCACH,IAEA,gBAAAA,KAAC,UAAK,eAAY,QAAO,WAAU,kBAAiB;AAAA,8BAEtD,gBAAAC,MAAC,SAAI,WAAU,sGACb;AAAA,gDAAAD;AAAA,kCAAC;AAAA;AAAA,oCACC;AAAA,oCACA,cAAc;AAAA,oCACd,SAAS;AAAA,oCACT,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,aAAa;AAAA,oCAC1B;AAAA,oCAEF,kBAAkB;AAAA;AAAA,gCACpB;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAY;AAAA,oCACZ,WAAU;AAAA;AAAA,gCACZ;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC;AAAA,oCACA,SAAS,gCAAgC;AAAA,oCACzC,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,eAAe;AAAA,oCAC5B;AAAA,oCAEF,wBAAwB;AAAA;AAAA,gCAC1B;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAY;AAAA,oCACZ,WAAU;AAAA;AAAA,gCACZ;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,WAAW,KAAK,EAAE,sBAAsB;AAAA,oCACxC,cAAc,KAAK,EAAE,iCAAiC;AAAA,oCACtD,SAAS,gCAAgC;AAAA,oCACzC,gBAAgB,KAAK;AAAA,sCACnB;AAAA,oCACF;AAAA,oCACA,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT,eAAe;AAAA,oCACf,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb,2BAA2B,WAAW,UAAU,IAAI;AAAA,oCAEtD,eAAe;AAAA;AAAA,gCACjB;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAY;AAAA,oCACZ,WAAU;AAAA;AAAA,gCACZ;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,WAAW,KAAK,EAAE,gCAAgC;AAAA,oCAClD,cAAc,KAAK;AAAA,sCACjB;AAAA,oCACF;AAAA,oCACA,SAAS,gCAAgC;AAAA,oCACzC,gBAAgB,KAAK;AAAA,sCACnB;AAAA,oCACF;AAAA,oCACA,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT,eAAe;AAAA,oCACf,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,cAAc;AAAA,oCAC3B;AAAA,oCAEF,eAAe;AAAA;AAAA,gCACjB;AAAA,iCACF;AAAA,+BACF;AAAA,6BACF;AAAA,2BACF;AAAA,wBACA,gBAAAC,MAAC,cAAS,WAAU,wBAClB;AAAA,0CAAAD,KAAC,YAAO,WAAU,WACf,eAAK,EAAE,0BAA0B,GACpC;AAAA,0BACA,gBAAAC,MAAC,SAAI,WAAU,uDACb;AAAA,4CAAAD,KAAC,UAAK,WAAU,2EACb,eAAK,EAAE,0CAA0C,GACpD;AAAA,4BACC,iBAAiB,IAAI,CAAC,aACrB,gBAAAC;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCAEV,MAAK;AAAA,gCACL,SAAS,MAAM,eAAe,QAAQ;AAAA,gCAEtC;AAAA,kDAAAD,KAAC,UAAK,WAAU,YACb,eAAK,EAAE,SAAS,QAAQ,GAC3B;AAAA,kCACA,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCACC,eAAY;AAAA,sCACZ,WAAU;AAAA,sCACV,MAAM;AAAA;AAAA,kCACR;AAAA;AAAA;AAAA,8BAXK,SAAS;AAAA,4BAYhB,CACD;AAAA,6BACH;AAAA,2BACF;AAAA,yBACF;AAAA,sBACA,gBAAAC,MAAC,gBACC;AAAA,wCAAAD;AAAA,0BAACI;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,SAAS;AAAA,4BAER,eAAK,EAAE,wBAAwB;AAAA;AAAA,wBAClC;AAAA,wBACA,gBAAAJ;AAAA,0BAACI;AAAA,0BAAA;AAAA,4BACC,UAAU,CAAC;AAAA,4BACX,MAAK;AAAA,4BACL,MAAK;AAAA,4BAEJ,eAAK,EAAE,wBAAwB;AAAA;AAAA,wBAClC;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUiB;AACf,QAAM,iBACJ,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,gBAAgB,KAAK;AACpE,QAAM,cACJ,QAAQ,SAAS,IACb,KAAK,EAAE,mCAAmC,IAC1C,UACE,KAAK,EAAE,mCAAmC,IAC1C,cAAc,KAAK,KAAK,KAAK,EAAE,mCAAmC;AAE1E,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,QAAQ,WAAW;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,sBAAsB;AAAA,YACzC,WAAWG;AAAA,cACT;AAAA,cACA,WAAW,QAAQ,WAAW,IAAI,kBAAkB;AAAA,cACpD;AAAA,YACF;AAAA,YAEA,0BAAAH,KAAC,eAAY,aACV,2BACC,gBAAAC,MAAC,UAAK,WAAU,mCACd;AAAA,8BAAAD,KAAC,8BAA2B,SAAS,eAAe,SAAS;AAAA,cAC7D,gBAAAA,KAAC,UAAK,WAAU,YAAY,yBAAe,OAAM;AAAA,eACnD,IACE,MACN;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,kBAAQ,WAAW,IAClB,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,mBACxB,eAAK,EAAE,mCAAmC,GAC7C,IAEA,QAAQ,IAAI,CAAC,WACX,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU,OAAO,aAAa;AAAA,gBAE9B,OAAO,OAAO;AAAA,gBACd,OAAO,OAAO;AAAA,gBAEd,0BAAAC,MAAC,UAAK,WAAU,mCACd;AAAA,kCAAAD,KAAC,8BAA2B,SAAS,OAAO,SAAS;AAAA,kBACrD,gBAAAA,KAAC,UAAK,WAAU,YAAY,iBAAO,OAAM;AAAA,mBAC3C;AAAA;AAAA,cAPK,OAAO;AAAA,YAQd,CACD;AAAA;AAAA,QAEL;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASiB;AACf,QAAM,iBACJ,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,wBAAwB,KAAK;AACzE,QAAM,WAAW,WAAW,QAAQ,WAAW;AAC/C,QAAM,gBAAgB,iBAClB,sBAAsB,MAAM,cAAc,IAC1C;AAEJ,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,uBAAuB;AAAA,YAC1C,WAAWG;AAAA,cACT;AAAA,cACA,UACI,gKACA;AAAA,cACJ,YAAY,CAAC,UACT,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAH,KAAC,UAAK,WAAU,6CACb,0BACC,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,yBAAc,IAElD,gBAAAA,KAAC,UAAK,WAAU,gDACb,oBACG,KAAK,EAAE,uCAAuC,IAC9C,KAAK,EAAE,sCAAsC,GACnD,GAEJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,kBAAQ,SAAS,IAChB,QAAQ,IAAI,CAAC,WACX,gBAAAA,KAAC,cAA8B,OAAO,OAAO,OAC3C,0BAAAA,KAAC,UAAK,WAAU,oBACb,gCAAsB,MAAM,MAAM,GACrC,KAHe,OAAO,KAIxB,CACD,IAED,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,aACxB,eAAK,EAAE,sCAAsC,GAChD;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWiB;AACf,QAAM,WAAW,WAAW,QAAQ,WAAW;AAC/C,QAAM,gBACJ,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,aAAa,GAAG,SAC1D;AAEF,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY;AAAA,YACZ,WAAWG;AAAA,cACT;AAAA,cACA,UACI,gKACA;AAAA,cACJ,YAAY,CAAC,UACT,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAH,KAAC,UAAK,WAAU,oBACb,0BACC,gBAEA,gBAAAA,KAAC,UAAK,WAAU,+BACb,oBAAU,iBAAiB,cAC9B,GAEJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,kBAAQ,SAAS,IAChB,QAAQ,IAAI,CAAC,WACX,gBAAAA,KAAC,cAA8B,OAAO,OAAO,OAC3C,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM,KADlC,OAAO,KAExB,CACD,IAED,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,aACxB,wBACH;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBACP,MACA,QACQ;AACR,QAAM,WAAW,OAAO,UAAU,KAAK;AACvC,MAAI,UAAU;AACZ,UAAM,MAAM,+BAA+B,QAAQ;AACnD,UAAM,aAAa,KAAK,EAAE,GAAG;AAC7B,QAAI,eAAe,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,MAAM,KAAK,KAAK,OAAO;AACvC;AAEA,SAAS,2BAA2B;AAAA,EAClC;AACF,GAEiB;AACf,QAAM,oBAAoB,SAAS,KAAK;AACxC,MAAI,CAAC,mBAAmB;AACtB,WACE,gBAAAA,KAAC,UAAK,eAAY,QAAO,WAAU,iCAAgC;AAAA,EAEvE;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAI;AAAA,MACJ,eAAY;AAAA,MACZ,WAAU;AAAA,MACV,UAAS;AAAA,MACT,WAAW;AAAA,MACX,KAAK;AAAA;AAAA,EACP;AAEJ;AAEA,SAAS,kCACP,cACA,SACA,cACQ;AACR,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,cAAc,KAAK,KAAK;AAClD,MACE,qBACA,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,iBAAiB,GAC3D;AACA,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,CAAC,GAAG,SAAS;AAC9B;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMiB;AACf,MAAI,KAAK,WAAW,GAAG;AACrB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,kCACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ,eAAK,IAAI,CAAC,QACT,gBAAAA,KAAC,WAAQ,SAAkB,KAAU,QAAiB,IAAI,EAAI,CAC/D;AAAA;AAAA,IACH;AAAA,IACA,gBAAAA,KAAC,SAAI,eAAY,QAAO,WAAU,gBAAe;AAAA,KACnD;AAEJ;AASA,SAAS,8BACP,MACA,MAC0B;AAC1B,QAAM,iBAAiB,oBAAI,IAAoB;AAE/C,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,IAAI,UAAU,KAAK;AACpC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,mBAAe,IAAI,WAAW,eAAe,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EACtE;AAEA,SAAO,kCAAkC,IAAI,CAAC,eAAe;AAC3D,QAAI,WAAW,OAAO,OAAO;AAC3B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,IAAI,WAAW;AAAA,QACf,OAAO,KAAK,EAAE,gBAAgB;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,EAAE,WAAW,QAAQ;AAC3C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,eAAe,IAAI,QAAQ,KAAK;AAAA,MACvC,IAAI,WAAW;AAAA,MACf,OAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKiB;AACf,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,KAAK,EAAE,sBAAsB;AAAA,MACzC,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,eAAK,IAAI,CAAC,QAAQ;AACjB,cAAM,WAAW,IAAI,OAAO;AAC5B,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,iBAAe;AAAA,YACf,WAAWE;AAAA,cACT;AAAA,cACA,WACI,qGACA;AAAA,YACN;AAAA,YAEA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI,EAAE;AAAA,YAElC;AAAA,kBAAI;AAAA,cAAM;AAAA,cAAE,IAAI;AAAA;AAAA;AAAA,UALZ,IAAI;AAAA,QAMX;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AACF,GAMiB;AACf,SACE,gBAAAH,KAAC,iBACC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,MAAI;AAAA,MACJ,QAAO;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,WAAWG;AAAA,QACT;AAAA,QACA,MAAM,SAAS,YACX,uFACA;AAAA,MACN;AAAA,MACA,gBAAgB;AAAA,MAChB,SAAS,MAAM;AAAA,MAEf,0BAAAH,KAAC,cAAW,WAAU,8DACpB,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,gBAAM,SAAQ,GACpD;AAAA;AAAA,IAfK,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAAA,EAgBrC,GACF;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKiB;AACf,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAA,MAAC,WACC;AAAA,sBAAAD,KAAC,kBAAe,SAAO,MACrB,0BAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET;AAAA,4BAAAJ,KAAC,oBAAiB;AAAA,YAClB,gBAAAA,KAAC,UAAM,eAAK,EAAE,yBAAyB,GAAE;AAAA;AAAA;AAAA,MAC3C,GACF;AAAA,MACA,gBAAAA,KAAC,kBAAe,MAAK,UAClB,eAAK,EAAE,gCAAgC,GAC1C;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WACC;AAAA,sBAAAD,KAAC,kBAAe,SAAO,MACrB,0BAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET;AAAA,4BAAAJ,KAAC,cAAW;AAAA,YACZ,gBAAAA,KAAC,UAAM,eAAK,EAAE,mBAAmB,GAAE;AAAA;AAAA;AAAA,MACrC,GACF;AAAA,MACA,gBAAAA,KAAC,kBAAe,MAAK,UAClB,eAAK,EAAE,0BAA0B,GACpC;AAAA,OACF;AAAA,IACA,gBAAAC;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS;AAAA,QAET;AAAA,0BAAAJ,KAAC,kBAAe;AAAA,UACf,KAAK,EAAE,wBAAwB;AAAA;AAAA;AAAA,IAClC;AAAA,KACF;AAEJ;AAEA,SAAS,kCAAkC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,GAIiB;AACf,SACE,gBAAAC,MAAC,WACC;AAAA,oBAAAD,KAAC,kBAAe,SAAO,MACrB,0BAAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,cAAY,KAAK,EAAE,wBAAwB;AAAA,QAC3C,UAAU;AAAA,QACV,MAAK;AAAA,QACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,QACtC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS;AAAA,QAET,0BAAAJ,KAACM,cAAA,EAAY,WAAW,UAAU,iBAAiB,QAAW;AAAA;AAAA,IAChE,GACF;AAAA,IACA,gBAAAN,KAAC,kBAAe,MAAK,UAClB,eAAK,EAAE,wBAAwB,GAClC;AAAA,KACF;AAEJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AACF,GAGiB;AACf,QAAM,cAAc,KAAK,EAAE,IAAI,cAAc;AAC7C,MAAI,IAAI,WAAW,cAAc;AAC/B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,OAAO;AAAA,QAEP,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAM;AAAA,YACN,aAAa;AAAA,YACb,YAAW;AAAA;AAAA,QACb;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SACE,gBAAAA,KAAC,SAAM,SAAS,IAAI,WAAW,WAAW,gBAAgB,aACvD,uBACH;AAEJ;","names":["AppCard","useMemo","Button","DeleteIcon","RefreshIcon","cn","jsx","jsxs","useMemo","cn","Button","DeleteIcon","RefreshIcon"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { KeyboardEvent, ReactElement } from \"react\";\nimport { memo, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n GitHubBrandIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n Popover,\n PopoverContent,\n PopoverTrigger,\n RefreshIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppAuthorViewModel,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppInstallProgress } from \"../contracts/runtime.ts\";\nimport type {\n WorkspaceAppLocalRepairAgentRequest,\n WorkspaceAppLocalRepairRequest\n} from \"../contracts/host.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\n\nexport interface AppCenterFactoryProviderOption {\n readonly disabled?: boolean;\n readonly disabledReason?: string;\n readonly iconUrl?: string | null;\n readonly label: string;\n readonly provider: string;\n}\n\nexport interface AppCenterFactoryModelOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryReasoningOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryPermissionOption {\n readonly label: string;\n readonly semantic?: string | null;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryProviderConfiguration {\n readonly defaultModel?: string | null;\n readonly defaultPermissionModeId?: string | null;\n readonly defaultReasoningEffort?: string | null;\n readonly modelOptions: readonly AppCenterFactoryModelOption[];\n readonly permissionModeOptions: readonly AppCenterFactoryPermissionOption[];\n readonly reasoningEffortOptions: readonly AppCenterFactoryReasoningOption[];\n}\n\nexport interface AppCenterHostActions {\n readonly cancelFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly createFactoryJob?: (input: {\n displayName: string;\n model?: string;\n permissionModeId?: string;\n provider?: string;\n prompt: string;\n reasoningEffort?: string;\n }) => Promise<void> | void;\n readonly deleteApp?: (appId: string, appName: string) => Promise<void> | void;\n readonly deleteFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly exportApp?: (appId: string) => Promise<void> | void;\n readonly fixFactoryJob?: (\n jobId: string,\n prompt: string\n ) => Promise<void> | void;\n readonly importApp?: () => Promise<void> | void;\n readonly installApp?: (appId: string) => Promise<void> | void;\n readonly loadLocalApp?: () =>\n | Promise<WorkspaceAppLocalRepairRequest | null | void>\n | WorkspaceAppLocalRepairRequest\n | null\n | void;\n readonly openApp?: (\n appId: string,\n context?: WorkspaceAppActionContext\n ) => Promise<void> | void;\n readonly openAppFolder?: (appId: string) => Promise<void> | void;\n readonly openAppPackageFolder?: (appId: string) => Promise<void> | void;\n readonly openFactoryJobAgentSession?: (\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly modifyAppWithAgent?: (\n jobId: string,\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly publishFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly repairLocalApp?: (\n request: WorkspaceAppLocalRepairAgentRequest\n ) => Promise<void> | void;\n readonly replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly reloadLocalApp?: (appId: string) => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\n readonly restartAndOpenApp?: (appId: string) => Promise<void> | void;\n readonly shouldConfirmAppUpdate?: (appId: string) => boolean;\n readonly updateApp?: (\n appId: string,\n trigger: \"badge_button\" | \"primary_action\"\n ) => Promise<void> | void;\n readonly uninstallApp?: (appId: string) => Promise<void> | void;\n}\n\nexport interface AppCardProps {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly officialDeveloperIconUrl?: string | null;\n readonly showDeveloperSources?: boolean;\n}\n\nexport const AppCard = memo(function AppCard({\n actions,\n app,\n className,\n copy,\n officialDeveloperIconUrl = null,\n showDeveloperSources = false\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const installBusy =\n app.installProgress != null || app.status === \"installing\";\n const busyStatusLabel = installBusy\n ? copy.t(\"status.installing\")\n : statusLabel;\n const showInstallProgressRing = installBusy;\n const statusButtonTitle = app.installProgress\n ? resolveInstallProgressTitle(copy, app.installProgress, busyStatusLabel)\n : statusLabel;\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? app.availableVersion\n ? copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })\n : copy.t(\"actions.updateApp\")\n : app.primaryAction === \"restartAndOpen\"\n ? copy.t(\"actions.restartAndOpenApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\n const primaryActionTitle = canExecutePrimaryAction\n ? primaryActionLabel\n : statusButtonTitle;\n const canOpenFromCard = app.canOpen;\n const canPublishFactoryUpdate =\n app.canPublishFactoryUpdate && !!app.factoryJobId;\n const canOpenFactorySession =\n app.canOpenFactorySession &&\n !!app.factoryAgentSessionId &&\n !!app.factoryJobId;\n const actionContext = useMemo(\n () => createWorkspaceAppActionContext(app),\n [app]\n );\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canReloadLocal ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = useCallback((): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"restartAndOpen\") {\n void actions.restartAndOpenApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, app.primaryAction]);\n const executeCardAction = useCallback((): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, canOpenFromCard]);\n const handleCardKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): void => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n },\n [canOpenFromCard, executeCardAction]\n );\n const handleReplaceIcon = useCallback((): void => {\n void actions.replaceAppIcon?.(app.id);\n }, [actions, app.id]);\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={handleReplaceIcon}\n />\n <div className=\"flex min-w-0 flex-1 items-center justify-end gap-1\">\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Button\n className={cn(\n \"min-w-0 max-w-full shrink truncate px-2\",\n !canExecutePrimaryAction ? \"cursor-default\" : null,\n canExecutePrimaryAction\n ? app.primaryAction === \"retry\"\n ? statusClassName(app.status)\n : \"text-[var(--text-primary)]\"\n : statusClassName(app.status)\n )}\n disabled={!canExecutePrimaryAction}\n size=\"default\"\n title={primaryActionTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n <span className=\"block min-w-0 max-w-full truncate\">\n {canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel}\n </span>\n </Button>\n {showInstallProgressRing ? (\n <AppInstallProgressRing\n ariaLabel={copy.t(\"status.installProgress.progressAria\")}\n fallbackPercent={0}\n progress={app.installProgress}\n />\n ) : null}\n </div>\n </div>\n </div>\n\n <div className=\"mt-5 flex min-h-0 min-w-0 flex-1 flex-col p-1\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h3 className=\"block min-w-0 truncate text-[15px] font-semibold leading-6 tracking-[0] text-[var(--text-primary)]\">\n {app.name}\n </h3>\n {app.version ? (\n <span className=\"min-w-0 flex-none text-[11px] leading-4 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\">\n {copy.t(\"labels.version\", { version: app.version })}\n </span>\n ) : null}\n {app.canReloadLocal ? (\n <span className=\"min-w-0 flex-none rounded-[5px] border border-[color:var(--line-2)] px-1.5 py-0 text-[10px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.localDev\")}\n </span>\n ) : null}\n </div>\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n </div>\n ) : null}\n\n {showDeveloperSources ? (\n <AppDeveloperSourceRow\n app={app}\n copy={copy}\n officialDeveloperIconUrl={officialDeveloperIconUrl}\n />\n ) : null}\n </div>\n </article>\n );\n});\n\nfunction createWorkspaceAppActionContext(\n app: WorkspaceAppCardViewModel\n): WorkspaceAppActionContext {\n return {\n installationId: app.installationId ?? null,\n runtimeId: app.runtimeId ?? null,\n launchUrl: app.launchUrl ?? null\n };\n}\n\nfunction AppDeveloperSourceRow({\n app,\n copy,\n officialDeveloperIconUrl\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly copy: AppCenterI18nRuntime;\n readonly officialDeveloperIconUrl?: string | null;\n}): ReactElement | null {\n const sourceAuthors = app.authors ?? [];\n const repository = app.repository ?? null;\n const authors =\n sourceAuthors.length > 0\n ? sourceAuthors\n : app.sourceKind === \"bundled\"\n ? [{ name: \"Tutti\" }]\n : [];\n const [popoverOpen, setPopoverOpen] = useState(false);\n const closeTimerRef = useRef<number | null>(null);\n const clearCloseTimer = useCallback((): void => {\n if (closeTimerRef.current === null) {\n return;\n }\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }, []);\n const openPopover = useCallback((): void => {\n clearCloseTimer();\n setPopoverOpen(true);\n }, [clearCloseTimer]);\n const scheduleClosePopover = useCallback((): void => {\n clearCloseTimer();\n closeTimerRef.current = window.setTimeout(() => {\n setPopoverOpen(false);\n closeTimerRef.current = null;\n }, 120);\n }, [clearCloseTimer]);\n if (authors.length === 0 && repository === null) {\n return null;\n }\n\n const primaryAuthor = authors[0] ?? null;\n const rowLabel =\n authors.length > 1\n ? copy.t(\"sources.developerCount\", { count: String(authors.length) })\n : primaryAuthor?.name ||\n (repository ? copy.t(\"sources.githubRepository\") : \"\");\n const official = isOfficialAuthor(primaryAuthor?.name);\n const canOpenPopover =\n repository !== null || authors.some((author) => Boolean(author.url));\n\n const content = (\n <div className=\"mt-auto min-w-0 pt-3\">\n <div className=\"group/source flex min-h-7 min-w-0 items-center gap-2 border-t border-[color:var(--line-2)] pt-2 text-[12px] leading-4 text-[var(--text-secondary)]\">\n <AvatarStack\n authors={authors}\n fallbackIconUrl={official ? officialDeveloperIconUrl : null}\n />\n <span className=\"min-w-0 flex-1 truncate\">{rowLabel}</span>\n {official ? (\n <span className=\"shrink-0 rounded-[5px] border border-[color:var(--line-2)] px-1.5 py-0 text-[10px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"sources.official\")}\n </span>\n ) : null}\n {canOpenPopover ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center text-[var(--text-secondary)]\">\n <GitHubBrandIcon className=\"size-4 group-hover/source:hidden\" />\n <span\n aria-hidden=\"true\"\n className=\"hidden text-[18px] leading-none group-hover/source:block\"\n >\n ›\n </span>\n </span>\n ) : null}\n </div>\n </div>\n );\n\n if (!canOpenPopover) {\n return content;\n }\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"block w-full min-w-0 border-0 bg-transparent p-0 text-left\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerEnter={openPopover}\n onPointerLeave={scheduleClosePopover}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {content}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-[280px] max-w-[min(280px,calc(100vw-32px))]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onPointerEnter={openPopover}\n onPointerLeave={scheduleClosePopover}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <div className=\"px-2 py-1.5 text-[12px] font-semibold leading-4 text-[var(--text-primary)]\">\n {copy.t(\"sources.title\")}\n </div>\n <div className=\"flex flex-col gap-[2px]\">\n {authors.map((author, index) => (\n <button\n className=\"flex min-h-8 min-w-0 items-center gap-2 rounded-[6px] px-2 py-1 text-left text-[12px] font-normal leading-4 text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-default disabled:opacity-60\"\n disabled={!author.url}\n key={`${author.name}:${author.url ?? \"\"}`}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n openExternalURL(author.url);\n }}\n >\n <AuthorAvatar\n author={author}\n fallbackIconUrl={\n index === 0 && isOfficialAuthor(author.name)\n ? officialDeveloperIconUrl\n : null\n }\n />\n <span className=\"min-w-0 flex-1 truncate\">{author.name}</span>\n </button>\n ))}\n {repository ? (\n <button\n className=\"flex min-h-8 min-w-0 items-center gap-2 rounded-[6px] px-2 py-1 text-left text-[12px] font-normal leading-4 text-[var(--text-primary)] hover:bg-[var(--transparency-hover)]\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n openExternalURL(repository.url);\n }}\n >\n <GitHubBrandIcon className=\"size-4\" />\n <span className=\"min-w-0 flex-1 truncate\">\n {displayRepositoryURL(repository.url)}\n </span>\n </button>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction AvatarStack({\n authors,\n fallbackIconUrl\n}: {\n readonly authors: readonly WorkspaceAppAuthorViewModel[];\n readonly fallbackIconUrl?: string | null;\n}): ReactElement {\n const visibleAuthors = authors.slice(0, 2);\n if (visibleAuthors.length === 0) {\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-[var(--transparency-block)]\">\n <GitHubBrandIcon className=\"size-3.5\" />\n </span>\n );\n }\n return (\n <span className=\"flex shrink-0 -space-x-1\">\n {visibleAuthors.map((author, index) => (\n <AuthorAvatar\n author={author}\n fallbackIconUrl={index === 0 ? fallbackIconUrl : null}\n key={`${author.name}:${author.url ?? \"\"}`}\n />\n ))}\n </span>\n );\n}\n\nfunction AuthorAvatar({\n author,\n fallbackIconUrl\n}: {\n readonly author: WorkspaceAppAuthorViewModel;\n readonly fallbackIconUrl?: string | null;\n}): ReactElement {\n if (author.avatarUrl) {\n return (\n <img\n alt=\"\"\n className=\"size-5 shrink-0 rounded-full border border-[var(--background-fronted)] object-cover\"\n draggable={false}\n src={author.avatarUrl}\n />\n );\n }\n if (fallbackIconUrl) {\n return (\n <img\n alt=\"\"\n className=\"size-5 shrink-0 rounded-[5px] border border-[var(--background-fronted)] object-contain\"\n draggable={false}\n src={fallbackIconUrl}\n />\n );\n }\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full border border-[var(--background-fronted)] bg-[var(--transparency-block)] text-[10px] font-semibold uppercase text-[var(--text-secondary)]\">\n {author.name.slice(0, 1)}\n </span>\n );\n}\n\nfunction isOfficialAuthor(name: string | null | undefined): boolean {\n const normalized = name?.trim().toLowerCase() ?? \"\";\n return normalized === \"tutti\" || normalized === \"tutti official\";\n}\n\nfunction displayRepositoryURL(url: string): string {\n return url.replace(/^https?:\\/\\//u, \"\");\n}\n\nfunction openExternalURL(url: string | null | undefined): void {\n const target = url?.trim();\n if (!target) {\n return;\n }\n window.open(target, \"_blank\", \"noopener,noreferrer\");\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n if (app.factoryEditAction === \"open_session\") {\n void actions.openFactoryJobAgentSession?.(\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n return;\n }\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.canReloadLocal) {\n menuItems.push({\n icon: <RefreshIcon />,\n key: \"reload-local\",\n label: copy.t(\"actions.reloadLocalApp\"),\n onSelect: () => {\n void actions.reloadLocalApp?.(app.id);\n }\n });\n }\n\n if (app.canOpenFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-folder\",\n label: copy.t(\"actions.openAppFolder\"),\n onSelect: () => {\n void actions.openAppFolder?.(app.id);\n }\n });\n }\n\n if (app.canOpenPackageFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-package-folder\",\n label: copy.t(\"actions.openAppPackageFolder\"),\n onSelect: () => {\n void actions.openAppPackageFolder?.(app.id);\n }\n });\n }\n\n if (app.canExport) {\n menuItems.push({\n icon: <UploadIcon />,\n key: \"export\",\n label: copy.t(\"actions.exportApp\"),\n onSelect: () => {\n void actions.exportApp?.(app.id);\n }\n });\n }\n\n if (app.canUninstall) {\n menuItems.push({\n icon: <UninstallIcon />,\n key: \"uninstall\",\n label: copy.t(\"actions.uninstallApp\"),\n onSelect: () => {\n void actions.uninstallApp?.(app.id);\n },\n variant: \"destructive\"\n });\n }\n\n if (app.canDelete) {\n menuItems.push({\n icon: <DeleteIcon />,\n key: \"delete\",\n label: copy.t(\n app.installed ? \"actions.uninstallAndDeleteApp\" : \"actions.deleteApp\"\n ),\n onSelect: () => {\n void actions.deleteApp?.(app.id, app.name);\n },\n variant: \"destructive\"\n });\n }\n\n return (\n <AppCenterActionMenu\n ariaLabel={copy.t(\"actions.moreActions\")}\n attention={canPublishFactoryUpdate}\n items={menuItems}\n triggerTitle={copy.t(\"actions.moreActions\")}\n />\n );\n}\n\ninterface AppCenterActionMenuItem {\n readonly attention?: boolean;\n readonly icon: ReactElement;\n readonly key: string;\n readonly label: string;\n readonly onSelect: () => void;\n readonly variant?: \"default\" | \"destructive\";\n}\n\nfunction AppCenterActionMenu({\n ariaLabel,\n attention = false,\n items,\n triggerTitle\n}: {\n readonly ariaLabel: string;\n readonly attention?: boolean;\n readonly items: readonly AppCenterActionMenuItem[];\n readonly triggerTitle: string;\n}): ReactElement {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={ariaLabel}\n className=\"relative\"\n size=\"icon\"\n title={triggerTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon />\n {attention ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-[var(--state-danger)] shadow-[0_0_0_2px_var(--background-fronted)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[192px]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <DropdownMenuGroup className=\"gap-[2px]\">\n {items.map((item) => (\n <DropdownMenuItem\n className=\"font-normal\"\n key={item.key}\n variant={item.variant}\n onSelect={(event) => {\n event.stopPropagation();\n item.onSelect();\n }}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.attention ? (\n <i\n aria-hidden=\"true\"\n className=\"ml-2 block size-1.5 shrink-0 rounded-full bg-[var(--state-danger)] not-italic\"\n />\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AppIcon({\n app,\n onReplaceIcon,\n replaceIconLabel\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly onReplaceIcon: () => void;\n readonly replaceIconLabel: string;\n}): ReactElement {\n const icon =\n app.icon?.type === \"asset\" ? (\n <img\n alt=\"\"\n className=\"size-11 flex-none rounded-[10px] object-contain object-center select-none\"\n draggable={false}\n src={app.icon.src}\n />\n ) : (\n <span className=\"flex size-11 flex-none items-center justify-center rounded-[10px] bg-[var(--transparency-block)] text-[var(--text-secondary)]\">\n <NavApplicationsFilledIcon className=\"size-[22px]\" />\n </span>\n );\n\n return (\n <span className=\"group/app-icon relative block size-11 flex-none\">\n {icon}\n {app.canReplaceIcon ? (\n <button\n aria-label={replaceIconLabel}\n className=\"absolute inset-0 flex size-11 items-center justify-center rounded-[10px] bg-black/55 p-0 text-white opacity-0 transition-opacity duration-150 group-hover/app-icon:opacity-100 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)]\"\n title={replaceIconLabel}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.blur();\n onReplaceIcon();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <EditIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AppInstallProgressRing({\n ariaLabel,\n fallbackPercent,\n progress\n}: {\n readonly ariaLabel: string;\n readonly fallbackPercent: number;\n readonly progress: WorkspaceAppInstallProgress | null | undefined;\n}): ReactElement {\n const percent =\n progress == null\n ? Math.max(0, Math.min(100, Math.round(fallbackPercent)))\n : Math.max(0, Math.min(100, Math.round(progress.overallPercent)));\n\n return (\n <span\n aria-label={ariaLabel}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={percent}\n className=\"relative inline-flex size-[14px] shrink-0 items-center justify-center rounded-full\"\n role=\"progressbar\"\n style={{\n background: `conic-gradient(var(--text-secondary) ${percent}%, color-mix(in srgb, var(--text-secondary) 24%, transparent) 0)`\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-[2px] rounded-full bg-[var(--surface-panel)]\"\n />\n </span>\n );\n}\n\nfunction resolveInstallProgressTitle(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress,\n statusLabel: string\n): string {\n const byteLabel = formatInstallProgressBytes(copy, progress);\n const percent = Math.max(\n 0,\n Math.min(100, Math.round(progress.overallPercent))\n );\n if (byteLabel) {\n return `${statusLabel} · ${byteLabel} · ${percent}%`;\n }\n return `${statusLabel} · ${percent}%`;\n}\n\nfunction formatInstallProgressBytes(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress\n): string | null {\n if (\n progress.userPhase !== \"downloading\" ||\n progress.downloadedBytes == null\n ) {\n return null;\n }\n const downloaded = formatByteSize(progress.downloadedBytes);\n if (progress.totalBytes == null || progress.totalBytes <= 0) {\n return downloaded;\n }\n return copy.t(\"status.installProgress.downloadedOfTotal\", {\n downloaded,\n total: formatByteSize(progress.totalBytes)\n });\n}\n\nfunction formatByteSize(value: number): string {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n const precision = size >= 10 || unitIndex === 0 ? 0 : 1;\n return `${size.toFixed(precision)} ${units[unitIndex]}`;\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"unavailable\") {\n return \"text-[var(--state-warning)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n ImportLinedIcon as ImportIcon,\n Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SectionTabs,\n Spinner,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n UploadFolderIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppLocalRepairRequest } from \"../contracts/host.ts\";\nimport {\n sortMyAppsByCreatedDesc,\n sortRecommendedApps,\n sortRecommendedAppsForAllTab\n} from \"../core/appCenterAppOrdering.ts\";\nimport {\n resolveDefaultAppFactoryProvider,\n resolveSelectedAppFactoryProvider\n} from \"../core/appFactoryProviderDefaults.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\nimport {\n AppCard,\n type AppCenterFactoryProviderConfiguration,\n type AppCenterFactoryProviderOption,\n type AppCenterFactoryPermissionOption,\n type AppCenterHostActions\n} from \"./AppCard.tsx\";\n\ntype FactoryTemplateID =\n | \"lovart\"\n | \"weather\"\n | \"lookup\"\n | \"system\"\n | \"news\"\n | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"model\" | \"permission\" | \"provider\" | \"reasoning\";\n\ninterface FactoryTemplate {\n readonly id: FactoryTemplateID;\n readonly defaultNameKey: string;\n readonly promptKey: string;\n readonly titleKey: string;\n}\n\nconst factoryTemplates: readonly FactoryTemplate[] = [\n {\n defaultNameKey: \"factory.templates.lovart.defaultName\",\n id: \"lovart\",\n promptKey: \"factory.templates.lovart.prompt\",\n titleKey: \"factory.templates.lovart.title\"\n },\n {\n defaultNameKey: \"factory.templates.weather.defaultName\",\n id: \"weather\",\n promptKey: \"factory.templates.weather.prompt\",\n titleKey: \"factory.templates.weather.title\"\n },\n {\n defaultNameKey: \"factory.templates.lookup.defaultName\",\n id: \"lookup\",\n promptKey: \"factory.templates.lookup.prompt\",\n titleKey: \"factory.templates.lookup.title\"\n },\n {\n defaultNameKey: \"factory.templates.system.defaultName\",\n id: \"system\",\n promptKey: \"factory.templates.system.prompt\",\n titleKey: \"factory.templates.system.title\"\n },\n {\n defaultNameKey: \"factory.templates.news.defaultName\",\n id: \"news\",\n promptKey: \"factory.templates.news.prompt\",\n titleKey: \"factory.templates.news.title\"\n },\n {\n defaultNameKey: \"factory.templates.gomoku.defaultName\",\n id: \"gomoku\",\n promptKey: \"factory.templates.gomoku.prompt\",\n titleKey: \"factory.templates.gomoku.title\"\n }\n];\n\nconst recommendedCategoryTabDefinitions: readonly (\n | {\n readonly id: \"all\";\n readonly labelKey: null;\n }\n | {\n readonly id: Exclude<RecommendedCategoryTabID, \"all\">;\n readonly labelKey: string;\n }\n)[] = [\n { id: \"all\", labelKey: null },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"office\", labelKey: \"categories.office\" },\n { id: \"tools\", labelKey: \"categories.tools\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly officialDeveloperIconUrl?: string | null;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly showDeveloperSources?: boolean;\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n officialDeveloperIconUrl = null,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n showDeveloperSources = false,\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [pendingLocalRepairRequest, setPendingLocalRepairRequest] =\n useState<WorkspaceAppLocalRepairRequest | null>(null);\n const [updateAppBusy, setUpdateAppBusy] = useState(false);\n const [localRepairBusy, setLocalRepairBusy] = useState(false);\n const [pendingUpdateApp, setPendingUpdateApp] = useState<{\n id: string;\n name: string;\n trigger: \"badge_button\" | \"primary_action\";\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const loadLocalApp = (): void => {\n void Promise.resolve(actions.loadLocalApp?.()).then((request) => {\n if (request) {\n setPendingLocalRepairRequest(request);\n }\n });\n };\n const cardActions = useMemo<AppCenterHostActions>(\n () => ({\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n },\n updateApp: (appId, trigger) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n const shouldConfirmUpdate =\n app.installed &&\n app.status === \"running\" &&\n (actions.shouldConfirmAppUpdate?.(app.id) ?? true);\n if (shouldConfirmUpdate) {\n setPendingUpdateApp({\n id: app.id,\n name: app.name,\n trigger\n });\n return;\n }\n void actions.updateApp?.(appId, trigger);\n }\n }),\n [actions, viewModel.apps]\n );\n const loadingMessage =\n catalogStatus === \"loading\" ? copy.t(\"messages.catalogLoading\") : null;\n const catalogLoading = catalogStatus === \"loading\";\n const failedMessage =\n catalogStatus === \"failed\" ? copy.t(\"messages.catalogFailed\") : null;\n const statusToast =\n errorMessage != null\n ? {\n busy: false,\n message: errorMessage,\n tone: \"destructive\" as const\n }\n : failedMessage != null\n ? {\n busy: false,\n message: failedMessage,\n tone: \"destructive\" as const\n }\n : loadingMessage != null\n ? {\n busy: true,\n message: loadingMessage,\n tone: \"default\" as const\n }\n : null;\n const myApps = sortMyAppsByCreatedDesc(\n viewModel.apps.filter((app) => app.sourceKind === \"local\")\n );\n const recommendedSourceApps = viewModel.apps.filter(\n (app) => app.sourceKind !== \"local\"\n );\n const recommendedApps = sortRecommendedApps(recommendedSourceApps);\n const recommendedAppsForAllTab = sortRecommendedAppsForAllTab(\n recommendedSourceApps\n );\n const recommendedCategoryTabs = createRecommendedCategoryTabs(\n recommendedApps,\n copy\n );\n const activeRecommendedCategoryLabel =\n recommendedCategoryTabs.find(\n (tab) => tab.id === activeRecommendedCategoryTab\n )?.category ?? null;\n const activeRecommendedApps =\n activeRecommendedCategoryLabel == null\n ? recommendedAppsForAllTab\n : recommendedApps.filter(\n (app) => app.category === activeRecommendedCategoryLabel\n );\n const activeApps =\n activeAppTab === \"recommended\" ? activeRecommendedApps : myApps;\n const activeAppTabTitle =\n activeAppTab === \"recommended\"\n ? copy.t(\"labels.recommendedApps\")\n : copy.t(\"labels.myApps\");\n const activeAppEmptyMessage =\n activeAppTab === \"recommended\"\n ? copy.t(\"messages.recommendedAppsEmpty\")\n : copy.t(\"messages.myAppsEmpty\");\n const pendingDeleteAppInstalled = pendingDeleteApp?.installed ?? false;\n const deleteAppConfirmLabel = copy.t(\n pendingDeleteAppInstalled\n ? \"actions.uninstallAndDeleteApp\"\n : \"actions.deleteApp\"\n );\n const deleteAppConfirmDescription = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppDescription\"\n : \"confirmations.deleteAppDescription\"\n );\n const deleteAppConfirmTitle = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppTitle\"\n : \"confirmations.deleteAppTitle\",\n {\n name: pendingDeleteApp?.name ?? \"\"\n }\n );\n const pendingUninstallAppLocal = pendingUninstallApp?.sourceKind === \"local\";\n const uninstallAppConfirmDescription = copy.t(\n pendingUninstallAppLocal\n ? \"confirmations.uninstallAppDescriptionLocal\"\n : \"confirmations.uninstallAppDescriptionRecommended\"\n );\n const uninstallAppConfirmTitle = copy.t(\"confirmations.uninstallAppTitle\", {\n name: pendingUninstallApp?.name ?? \"\"\n });\n const updateAppConfirmTitle = copy.t(\"confirmations.updateAppTitle\", {\n name: pendingUpdateApp?.name ?? \"\"\n });\n const localRepairDialogTitle = copy.t(\"localDev.repairDialog.title\");\n const localRepairDialogDescription = copy.t(\n \"localDev.repairDialog.description\"\n );\n\n return (\n <section\n aria-label={copy.t(\"title\")}\n className={cn(\n \"relative flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)]\",\n className\n )}\n >\n {statusToast ? <AppCenterStatusToast toast={statusToast} /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-auto px-6 pt-5 [container-type:inline-size]\">\n <section className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex h-8 min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n className=\"h-8\"\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex h-8 shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n onLoadLocalApp={loadLocalApp}\n />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\n {activeAppTab === \"my\" && hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[11px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\n job.canFix\n ? \"factory.messages.factoryJobFailedWithFix\"\n : \"factory.messages.factoryJobFailed\"\n )}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[11px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n officialDeveloperIconUrl={officialDeveloperIconUrl}\n showDeveloperSources={showDeveloperSources}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={updateAppBusy}\n confirmLabel={copy.t(\"actions.updateApp\")}\n description={copy.t(\"confirmations.updateRunningAppDescription\")}\n open={pendingUpdateApp != null}\n title={updateAppConfirmTitle}\n onConfirm={() => {\n const app = pendingUpdateApp;\n if (!app) {\n return;\n }\n setUpdateAppBusy(true);\n void Promise.resolve(\n actions.updateApp?.(app.id, app.trigger)\n ).finally(() => {\n setUpdateAppBusy(false);\n setPendingUpdateApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !updateAppBusy) {\n setPendingUpdateApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={localRepairBusy}\n confirmLabel={copy.t(\"localDev.repairDialog.confirm\")}\n description={localRepairDialogDescription}\n open={pendingLocalRepairRequest != null}\n title={localRepairDialogTitle}\n onConfirm={() => {\n const request = pendingLocalRepairRequest;\n if (!request) {\n return;\n }\n setLocalRepairBusy(true);\n void Promise.resolve(\n actions.repairLocalApp?.({\n ...request,\n prompt: copy.t(\"localDev.repairPrompt\", {\n cwd: request.projectDir\n })\n })\n ).finally(() => {\n setLocalRepairBusy(false);\n setPendingLocalRepairRequest(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !localRepairBusy) {\n setPendingLocalRepairRequest(null);\n }\n }}\n />\n <Dialog\n open={factoryDialogOpen}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n closeFactoryDialog();\n return;\n }\n openFactoryDialog();\n }}\n >\n <DialogContent\n className=\"sm:max-w-[min(640px,calc(100%-2rem))]\"\n showCloseButton={false}\n >\n <form\n className=\"grid max-h-[min(760px,calc(100vh-64px))] min-w-0 gap-4 overflow-auto\"\n onSubmit={submitCreate}\n >\n <DialogHeader>\n <DialogTitle>{copy.t(\"factory.labels.create\")}</DialogTitle>\n </DialogHeader>\n <label className=\"grid min-w-0 gap-2\">\n <span className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.appName\")}\n </span>\n <Input\n autoFocus\n className=\"h-9 rounded-[8px]\"\n placeholder={copy.t(\"factory.placeholders.appName\")}\n value={displayName}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n />\n </label>\n <div className=\"grid min-w-0 gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <label\n className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n htmlFor={promptTextareaId}\n >\n {copy.t(\"factory.labels.prompt\")}\n </label>\n <div className=\"relative min-w-0\">\n <Textarea\n className=\"min-h-[148px] resize-none rounded-[10px] pb-14 leading-[1.45] sm:pb-8\"\n id={promptTextareaId}\n placeholder={copy.t(\"factory.placeholders.prompt\")}\n value={prompt}\n onChange={(event) => setPrompt(event.currentTarget.value)}\n />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-1.5 flex min-w-0 flex-wrap items-end justify-between gap-2\">\n {providerErrorMessage &&\n normalizedProviderOptions.length === 0 ? (\n <p className=\"pointer-events-auto max-w-[240px] text-[11px] leading-4 text-[var(--state-danger)]\">\n {providerErrorMessage}\n </p>\n ) : (\n <span aria-hidden=\"true\" className=\"min-h-4 flex-1\" />\n )}\n <div className=\"pointer-events-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-0.5 px-0.5 py-0\">\n <FactoryProviderSelect\n copy={copy}\n errorMessage={providerErrorMessage}\n loading={providerLoading}\n open={openFactorySettingsMenu === \"provider\"}\n options={normalizedProviderOptions}\n selectedProvider={selectedProvider}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent data-[placeholder]:text-[var(--text-tertiary)]\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"provider\" : null\n )\n }\n onSelectProvider={setSelectedProvider}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryPermissionDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n open={openFactorySettingsMenu === \"permission\"}\n options={permissionModeOptions}\n selectedPermissionModeId={selectedPermissionModeId}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"permission\" : null\n )\n }\n onSelectPermissionMode={setSelectedPermissionModeId}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryOptionDropdown\n ariaLabel={copy.t(\"factory.labels.model\")}\n emptyMessage={copy.t(\"factory.messages.noModelOptions\")}\n loading={providerConfigurationStatus === \"loading\"}\n loadingMessage={copy.t(\n \"factory.messages.loadingConfiguration\"\n )}\n open={openFactorySettingsMenu === \"model\"}\n options={modelOptions}\n selectedValue={selectedModel}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(nextOpen ? \"model\" : null)\n }\n onSelectValue={setSelectedModel}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryOptionDropdown\n ariaLabel={copy.t(\"factory.labels.reasoningEffort\")}\n emptyMessage={copy.t(\n \"factory.messages.noReasoningEffortOptions\"\n )}\n loading={providerConfigurationStatus === \"loading\"}\n loadingMessage={copy.t(\n \"factory.messages.loadingConfiguration\"\n )}\n open={openFactorySettingsMenu === \"reasoning\"}\n options={reasoningEffortOptions}\n selectedValue={selectedReasoningEffort}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"reasoning\" : null\n )\n }\n onSelectValue={setSelectedReasoningEffort}\n />\n </div>\n </div>\n </div>\n </div>\n <fieldset className=\"min-w-0 border-0 p-0\">\n <legend className=\"sr-only\">\n {copy.t(\"factory.labels.templates\")}\n </legend>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">\n <span className=\"shrink-0 text-[13px] font-medium leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.templateInspirationPrefix\")}\n </span>\n {factoryTemplates.map((template) => (\n <button\n className=\"inline-flex max-w-full items-center gap-1 border-0 bg-transparent p-0 text-[13px] font-medium leading-5 text-[var(--text-secondary)] transition-colors duration-150 hover:text-[var(--text-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\"\n key={template.id}\n type=\"button\"\n onClick={() => selectTemplate(template)}\n >\n <span className=\"truncate\">\n {copy.t(template.titleKey)}\n </span>\n <OpenSessionsFilledIcon\n aria-hidden=\"true\"\n className=\"shrink-0\"\n size={14}\n />\n </button>\n ))}\n </div>\n </fieldset>\n </div>\n <DialogFooter>\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={closeFactoryDialog}\n >\n {copy.t(\"factory.actions.cancel\")}\n </Button>\n <Button\n disabled={!canCreateFactoryJob}\n size=\"dialog\"\n type=\"submit\"\n >\n {copy.t(\"factory.actions.create\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </section>\n );\n}\n\nfunction FactoryProviderSelect({\n copy,\n errorMessage,\n loading,\n onOpenChange,\n onSelectProvider,\n open,\n options,\n selectedProvider,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n errorMessage?: string | null;\n loading?: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectProvider: (provider: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryProviderOption[];\n selectedProvider: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.provider === selectedProvider) ?? null;\n const placeholder =\n options.length > 0\n ? copy.t(\"factory.messages.noAgentProviders\")\n : loading\n ? copy.t(\"factory.messages.loadingProviders\")\n : errorMessage?.trim() || copy.t(\"factory.messages.noAgentProviders\");\n\n return (\n <Select\n disabled={options.length === 0}\n open={open}\n value={selectedProvider}\n onOpenChange={onOpenChange}\n onValueChange={onSelectProvider}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.agent\")}\n className={cn(\n \"h-9 w-full rounded-[8px] px-3 font-normal [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:min-w-0 [&_[data-slot=select-value]]:items-center [&_[data-slot=select-value]]:gap-2\",\n loading && options.length === 0 ? \"animate-pulse\" : null,\n triggerClassName\n )}\n >\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={selectedOption.iconUrl} />\n <span className=\"truncate\">{selectedOption.label}</span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n className=\"w-[300px] min-w-[240px] max-w-[min(100vw-64px,480px)]\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length === 0 ? (\n <SelectItem disabled value=\"__no-provider__\">\n {copy.t(\"factory.messages.noAgentProviders\")}\n </SelectItem>\n ) : (\n options.map((option) => (\n <SelectItem\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n value={option.provider}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={option.iconUrl} />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryPermissionDropdown({\n copy,\n loading,\n onOpenChange,\n onSelectPermissionMode,\n open,\n options,\n selectedPermissionModeId,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectPermissionMode: (value: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryPermissionOption[];\n selectedPermissionModeId: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.value === selectedPermissionModeId) ?? null;\n const disabled = loading || options.length === 0;\n const selectedLabel = selectedOption\n ? permissionOptionLabel(copy, selectedOption)\n : selectedPermissionModeId;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedPermissionModeId}\n onOpenChange={onOpenChange}\n onValueChange={onSelectPermissionMode}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.review\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center overflow-hidden\">\n {selectedLabel ? (\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noPermissionOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[220px] max-w-[min(100vw-32px,360px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">\n {permissionOptionLabel(copy, option)}\n </span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noPermissionOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryOptionDropdown({\n ariaLabel,\n emptyMessage,\n loading,\n loadingMessage,\n onOpenChange,\n onSelectValue,\n open,\n options,\n selectedValue,\n triggerClassName\n}: {\n ariaLabel: string;\n emptyMessage: string;\n loading: boolean;\n loadingMessage: string;\n onOpenChange: (open: boolean) => void;\n onSelectValue: (value: string) => void;\n open: boolean;\n options: readonly { label: string; value: string }[];\n selectedValue: string;\n triggerClassName?: string;\n}): ReactElement {\n const disabled = loading || options.length === 0;\n const selectedLabel =\n options.find((option) => option.value === selectedValue)?.label ??\n selectedValue;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedValue}\n onOpenChange={onOpenChange}\n onValueChange={onSelectValue}\n >\n <SelectTrigger\n aria-label={ariaLabel}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedLabel ? (\n selectedLabel\n ) : (\n <span className=\"text-[var(--text-tertiary)]\">\n {loading ? loadingMessage : emptyMessage}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[200px] max-w-[min(100vw-32px,320px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {emptyMessage}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction permissionOptionLabel(\n copy: AppCenterI18nRuntime,\n option: AppCenterFactoryPermissionOption\n): string {\n const semantic = option.semantic?.trim();\n if (semantic) {\n const key = `factory.permissionSemantics.${semantic}.label`;\n const translated = copy.t(key);\n if (translated !== key) {\n return translated;\n }\n }\n return option.label.trim() || option.value;\n}\n\nfunction AppCenterAgentProviderIcon({\n iconUrl\n}: {\n iconUrl?: string | null;\n}): ReactElement {\n const normalizedIconUrl = iconUrl?.trim();\n if (!normalizedIconUrl) {\n return (\n <span aria-hidden=\"true\" className=\"size-4 shrink-0 rounded-[4px]\" />\n );\n }\n\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 rounded-[4px] object-contain\"\n decoding=\"async\"\n draggable={false}\n src={normalizedIconUrl}\n />\n );\n}\n\nfunction resolveSelectedFactoryOptionValue(\n currentValue: string,\n options: readonly { value: string }[],\n defaultValue?: string | null\n): string {\n if (options.some((option) => option.value === currentValue)) {\n return currentValue;\n }\n const normalizedDefault = defaultValue?.trim() ?? \"\";\n if (\n normalizedDefault &&\n options.some((option) => option.value === normalizedDefault)\n ) {\n return normalizedDefault;\n }\n return options[0]?.value ?? \"\";\n}\n\nfunction AppCardGrid({\n actions,\n apps,\n copy,\n emptyMessage,\n officialDeveloperIconUrl,\n showDeveloperSources,\n title\n}: {\n readonly actions: AppCenterHostActions;\n readonly apps: AppCenterViewModel[\"apps\"];\n readonly copy: AppCenterI18nRuntime;\n readonly emptyMessage: string;\n readonly officialDeveloperIconUrl?: string | null;\n readonly showDeveloperSources: boolean;\n readonly title: string;\n}): ReactElement {\n if (apps.length === 0) {\n return (\n <div\n aria-label={title}\n className=\"flex min-h-0 min-w-0 flex-1 items-center justify-center rounded-[8px] px-6 text-center text-[13px] leading-5 text-[var(--text-secondary)]\"\n role=\"status\"\n >\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-w-0 shrink-0 flex-col\">\n <div\n aria-label={title}\n className=\"grid min-h-0 min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,260px),1fr))] gap-3\"\n role=\"list\"\n >\n {apps.map((app) => (\n <AppCard\n actions={actions}\n app={app}\n copy={copy}\n key={app.id}\n officialDeveloperIconUrl={officialDeveloperIconUrl}\n showDeveloperSources={showDeveloperSources}\n />\n ))}\n </div>\n <div aria-hidden=\"true\" className=\"h-6 shrink-0\" />\n </div>\n );\n}\n\ninterface RecommendedCategoryTab {\n readonly category: string | null;\n readonly count: number;\n readonly id: RecommendedCategoryTabID;\n readonly label: string;\n}\n\nfunction createRecommendedCategoryTabs(\n apps: AppCenterViewModel[\"apps\"],\n copy: AppCenterI18nRuntime\n): RecommendedCategoryTab[] {\n const categoryCounts = new Map<string, number>();\n\n for (const app of apps) {\n const category = app.category?.trim();\n if (!category) {\n continue;\n }\n categoryCounts.set(category, (categoryCounts.get(category) ?? 0) + 1);\n }\n\n return recommendedCategoryTabDefinitions.map((definition) => {\n if (definition.id === \"all\") {\n return {\n category: null,\n count: apps.length,\n id: definition.id,\n label: copy.t(\"labels.allApps\")\n };\n }\n\n const category = copy.t(definition.labelKey);\n return {\n category,\n count: categoryCounts.get(category) ?? 0,\n id: definition.id,\n label: category\n };\n });\n}\n\nfunction RecommendedCategoryTabs({\n copy,\n tabs,\n value,\n onValueChange\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly tabs: readonly RecommendedCategoryTab[];\n readonly value: RecommendedCategoryTabID;\n readonly onValueChange: (value: RecommendedCategoryTabID) => void;\n}): ReactElement {\n return (\n <div\n aria-label={copy.t(\"labels.appCategories\")}\n className=\"-mx-1 flex min-h-10 min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-[inset_0_0_0_1px_var(--line-1)]\"\n : \"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[11px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[11px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp,\n onLoadLocalApp\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n readonly onLoadLocalApp: () => void;\n}): ReactElement {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onLoadLocalApp}\n >\n <UploadFolderIcon />\n <span>{copy.t(\"actions.loadUnpackedApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.loadUnpackedAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onImportApp}\n >\n <ImportIcon />\n <span>{copy.t(\"actions.importApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.importAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreateApp}\n >\n <FileCreateIcon />\n {copy.t(\"factory.actions.create\")}\n </Button>\n </>\n );\n}\n\nfunction AppCenterRecommendedHeaderActions({\n copy,\n loading,\n onRefreshCatalog\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly loading: boolean;\n readonly onRefreshCatalog: () => void;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={copy.t(\"actions.refreshCatalog\")}\n disabled={loading}\n size=\"icon-sm\"\n title={copy.t(\"actions.refreshCatalog\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefreshCatalog}\n >\n <RefreshIcon className={loading ? \"animate-spin\" : undefined} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.refreshCatalog\")}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction FactoryJobStatusIndicator({\n copy,\n job\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly job: WorkspaceAppFactoryJobViewModel;\n}): ReactElement {\n const statusLabel = copy.t(job.statusLabelKey);\n if (job.status === \"generating\") {\n return (\n <span\n aria-label={statusLabel}\n className=\"inline-flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n title={statusLabel}\n >\n <Spinner\n className=\"text-[var(--text-tertiary)]\"\n size={12}\n strokeWidth={2}\n trackColor=\"var(--line-2)\"\n />\n </span>\n );\n }\n return (\n <Badge variant={job.status === \"failed\" ? \"destructive\" : \"secondary\"}>\n {statusLabel}\n </Badge>\n );\n}\n"],"mappings":"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","names":["AppCard","useMemo","useState","Button","DeleteIcon","RefreshIcon","cn","jsx","jsxs","useState","useMemo","cn","Button","DeleteIcon","RefreshIcon"]}
|