@tutti-os/workspace-app-center 0.0.10 → 0.0.12
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-2HXFGEJS.js +110 -0
- package/dist/chunk-2HXFGEJS.js.map +1 -0
- package/dist/{chunk-INI5PAWK.js → chunk-O3XCZVHE.js} +157 -27
- package/dist/chunk-O3XCZVHE.js.map +1 -0
- package/dist/{chunk-VLUZD2IT.js → chunk-PD2WLRHE.js} +3 -2
- package/dist/chunk-PD2WLRHE.js.map +1 -0
- package/dist/{chunk-QSAEUGFC.js → chunk-Y63TZ5JT.js} +1 -1
- package/dist/chunk-Y63TZ5JT.js.map +1 -0
- package/dist/contracts/index.d.ts +11 -4
- package/dist/contracts/index.js +2 -2
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +3 -3
- package/dist/i18n/index.js +8 -4
- package/dist/i18n/index.js.map +1 -1
- package/dist/{index-DtpWU9o1.d.ts → index-DT5o9P2u.d.ts} +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/ui/index.d.ts +3 -3
- package/dist/ui/index.js +82 -71
- package/dist/ui/index.js.map +1 -1
- package/dist/{viewModel-D0XZxZmO.d.ts → viewModel-BpgU7_M1.d.ts} +19 -2
- package/package.json +3 -3
- package/dist/chunk-INI5PAWK.js.map +0 -1
- package/dist/chunk-LBSZLLZK.js +0 -94
- package/dist/chunk-LBSZLLZK.js.map +0 -1
- package/dist/chunk-QSAEUGFC.js.map +0 -1
- package/dist/chunk-VLUZD2IT.js.map +0 -1
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { ReactElement } 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 UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkspaceAppCardViewModel } from \"../contracts/viewModel.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 openApp?: (appId: string) => 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 replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\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 function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\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 ? copy.t(\"actions.updateApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\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 hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = (): 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 === \"open\") {\n void actions.openApp?.(app.id);\n }\n };\n const executeCardAction = (): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id);\n }\n };\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={(event) => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n }}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={() => {\n void actions.replaceAppIcon?.(app.id);\n }}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n <Button\n className={cn(\n \"min-w-[56px]\",\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={statusLabel}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n {canExecutePrimaryAction ? primaryActionLabel : statusLabel}\n </Button>\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 </div>\n {app.updateAvailable && app.availableVersion ? (\n <button\n className={cn(\n \"mt-1 inline-flex max-w-full items-center rounded-[4px] bg-[color-mix(in_srgb,var(--state-warning)_12%,transparent)] px-2 py-0.5 text-[11px] leading-4 text-[var(--state-warning)] outline-none transition-colors hover:bg-[color-mix(in_srgb,var(--state-warning)_18%,transparent)] focus-visible:ring-2 focus-visible:ring-[color-mix(in_srgb,var(--state-warning)_42%,transparent)]\",\n app.canUpdate ? \"cursor-pointer\" : \"cursor-default\"\n )}\n disabled={!app.canUpdate}\n title={copy.t(\"actions.updateApp\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (app.canUpdate) {\n void actions.updateApp?.(app.id, \"badge_button\");\n }\n }}\n >\n <span className=\"truncate\">\n {copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })}\n </span>\n </button>\n ) : null}\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 || app.tags.length > 0 ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n {app.errorMessage ? (\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 ) : null}\n {app.tags.length > 0 ? (\n <div className=\"flex min-w-0 flex-wrap gap-1.5\">\n {app.tags.slice(0, 3).map((tag) => (\n <span\n className=\"inline-flex h-5 max-w-full items-center rounded-[4px] bg-[var(--transparency-block)] px-2 text-[11px] leading-4 text-[var(--text-secondary)]\"\n key={tag}\n >\n <span className=\"truncate\">{tag}</span>\n </span>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </article>\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 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.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 <span\n aria-hidden=\"true\"\n className=\"ml-2 size-1.5 flex-none rounded-full bg-[var(--state-danger)]\"\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 statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\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 Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n SelectSplitColumn,\n SelectSplitColumnItems,\n SelectSplitColumnLabel,\n SelectSplitDivider,\n SelectSplitLayout,\n SelectTrigger,\n SelectValue,\n SectionTabs,\n Spinner,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n UploadIcon as ImportIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.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 = \"weather\" | \"lookup\" | \"system\" | \"news\" | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"modelReasoning\" | \"permission\" | \"provider\";\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.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: \"tools\", labelKey: \"categories.tools\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"office\", labelKey: \"categories.office\" }\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 [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 cardActions: AppCenterHostActions = {\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 };\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\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 pb-6 pt-5 [container-type:inline-size]\">\n {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(\"factory.messages.factoryJobFailed\")}\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\n <section className=\"flex min-w-0 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 />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\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 <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] border border-[color:var(--line-2)] bg-[var(--background-fronted)] 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 <FactoryModelReasoningDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n modelOptions={modelOptions}\n open={openFactorySettingsMenu === \"modelReasoning\"}\n reasoningEffortOptions={reasoningEffortOptions}\n selectedModel={selectedModel}\n selectedReasoningEffort={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 ? \"modelReasoning\" : null\n )\n }\n onSelectModel={setSelectedModel}\n onSelectReasoningEffort={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={selectedOption?.provider}\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={selectedOption?.value}\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 ? \"animate-pulse\" : null,\n disabled\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 FactoryModelReasoningDropdown({\n copy,\n loading,\n modelOptions,\n onOpenChange,\n onSelectModel,\n onSelectReasoningEffort,\n open,\n reasoningEffortOptions,\n selectedModel,\n selectedReasoningEffort,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n modelOptions: readonly { label: string; value: string }[];\n onOpenChange: (open: boolean) => void;\n onSelectModel: (value: string) => void;\n onSelectReasoningEffort: (value: string) => void;\n open: boolean;\n reasoningEffortOptions: readonly { label: string; value: string }[];\n selectedModel: string;\n selectedReasoningEffort: string;\n triggerClassName?: string;\n}): ReactElement {\n const showModelSection = modelOptions.length > 0;\n const showReasoningSection = reasoningEffortOptions.length > 0;\n const disabled = loading || (!showModelSection && !showReasoningSection);\n const selectedModelLabel =\n modelOptions.find((option) => option.value === selectedModel)?.label ??\n selectedModel;\n const selectedReasoningLabel =\n reasoningEffortOptions.find(\n (option) => option.value === selectedReasoningEffort\n )?.label ?? selectedReasoningEffort;\n const triggerLabel = [selectedModelLabel, selectedReasoningLabel]\n .filter((value) => value.trim().length > 0)\n .join(\" \");\n const selectedValue = showModelSection\n ? selectedModel\n ? `model:${selectedModel}`\n : undefined\n : selectedReasoningEffort\n ? `reasoning:${selectedReasoningEffort}`\n : undefined;\n const applySettingsValue = (nextValue: string): void => {\n if (nextValue.startsWith(\"reasoning:\")) {\n onSelectReasoningEffort(nextValue.slice(\"reasoning:\".length));\n return;\n }\n if (nextValue.startsWith(\"model:\")) {\n onSelectModel(nextValue.slice(\"model:\".length));\n }\n };\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedValue}\n onOpenChange={onOpenChange}\n onValueChange={applySettingsValue}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.modelReasoning\")}\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 ? \"animate-pulse\" : null,\n disabled\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 gap-2 overflow-hidden\">\n {triggerLabel ? (\n selectedModelLabel && selectedReasoningLabel ? (\n <>\n <span className=\"min-w-0 truncate\">{selectedModelLabel}</span>\n <span className=\"shrink-0 text-[var(--text-secondary)]\">\n {selectedReasoningLabel}\n </span>\n </>\n ) : (\n <span className=\"min-w-0 truncate\">{triggerLabel}</span>\n )\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.noConfigurationOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className={cn(\n \"max-w-[min(100vw-32px,460px)] data-[side=top]:!translate-y-0\",\n showModelSection && showReasoningSection\n ? \"w-[430px]\"\n : \"w-max min-w-[240px]\"\n )}\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {showModelSection && showReasoningSection ? (\n <SelectSplitLayout>\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.model\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {modelOptions.map((option) => (\n <SelectItem\n key={option.value}\n value={`model:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n <SelectSplitDivider />\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.reasoningEffort\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {reasoningEffortOptions.map((option) => (\n <SelectItem\n forceSelectedIndicator={\n selectedReasoningEffort === option.value\n }\n key={option.value}\n value={`reasoning:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n </SelectSplitLayout>\n ) : showModelSection ? (\n modelOptions.map((option) => (\n <SelectItem key={option.value} value={`model:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : showReasoningSection ? (\n reasoningEffortOptions.map((option) => (\n <SelectItem key={option.value} value={`reasoning:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noConfigurationOptions\")}\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-[min(360px,45vh)] 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\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 );\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-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-2 focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"border border-[color:var(--line-1)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border border-transparent 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}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n}): ReactElement {\n return (\n <>\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;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,OACK;AAmKC,cAOA,YAPA;AA5ED,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,cAAc,KAAK,EAAE,IAAI,cAAc;AAC7C,QAAM,qBACJ,IAAI,kBAAkB,YAClB,KAAK,EAAE,oBAAoB,IAC3B,IAAI,kBAAkB,UACpB,KAAK,EAAE,kBAAkB,IACzB,IAAI,kBAAkB,WACpB,KAAK,EAAE,mBAAmB,IAC1B,KAAK,EAAE,iBAAiB;AAClC,QAAM,0BAA0B,IAAI,kBAAkB;AACtD,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,iBACJ,2BACA,yBACA,IAAI,aACJ,IAAI,aACJ,IAAI,kBACJ,IAAI,iBACJ,IAAI,wBACJ,IAAI;AACN,QAAM,uBAAuB,MAAY;AACvC,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,QAAQ;AAChC,WAAK,QAAQ,UAAU,IAAI,EAAE;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,oBAAoB,MAAY;AACpC,QAAI,iBAAiB;AACnB,WAAK,QAAQ,UAAU,IAAI,EAAE;AAAA,IAC/B;AAAA,EACF;AAEA,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,CAAC,UAAU;AACpB,YAAI,CAAC,mBAAoB,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAM;AACpE;AAAA,QACF;AACA,cAAM,eAAe;AACrB,0BAAkB;AAAA,MACpB;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,kBAAkB,KAAK,EAAE,qBAAqB;AAAA,cAC9C,eAAe,MAAM;AACnB,qBAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,cACtC;AAAA;AAAA,UACF;AAAA,UACA,qBAAC,SAAI,WAAU,oCACZ;AAAA,6BACC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,IACE;AAAA,YACJ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,CAAC,0BAA0B,mBAAmB;AAAA,kBAC9C,0BACI,IAAI,kBAAkB,UACpB,gBAAgB,IAAI,MAAM,IAC1B,+BACF,gBAAgB,IAAI,MAAM;AAAA,gBAChC;AAAA,gBACA,UAAU,CAAC;AAAA,gBACX,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AACtB,uCAAqB;AAAA,gBACvB;AAAA,gBAEC,oCAA0B,qBAAqB;AAAA;AAAA,YAClD;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,eACN;AAAA,YACC,IAAI,mBAAmB,IAAI,mBAC1B;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,IAAI,YAAY,mBAAmB;AAAA,gBACrC;AAAA,gBACA,UAAU,CAAC,IAAI;AAAA,gBACf,OAAO,KAAK,EAAE,mBAAmB;AAAA,gBACjC,MAAK;AAAA,gBACL,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AACtB,sBAAI,IAAI,WAAW;AACjB,yBAAK,QAAQ,YAAY,IAAI,IAAI,cAAc;AAAA,kBACjD;AAAA,gBACF;AAAA,gBAEA,8BAAC,UAAK,WAAU,YACb,eAAK,EAAE,0BAA0B;AAAA,kBAChC,SAAS,IAAI;AAAA,gBACf,CAAC,GACH;AAAA;AAAA,YACF,IACE;AAAA,YACH,IAAI,cACH,oBAAC,OAAE,WAAU,wFACV,cAAI,aACP,IACE;AAAA,aACN;AAAA,UAEC,IAAI,gBAAgB,IAAI,KAAK,SAAS,IACrC,qBAAC,SAAI,WAAU,4CACZ;AAAA,gBAAI,eACH;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,IAAI;AAAA,gBAEV,eAAK,EAAE,2BAA2B;AAAA;AAAA,YACrC,IACE;AAAA,YACH,IAAI,KAAK,SAAS,IACjB,oBAAC,SAAI,WAAU,kCACZ,cAAI,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QACzB;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBAGV,8BAAC,UAAK,WAAU,YAAY,eAAI;AAAA;AAAA,cAF3B;AAAA,YAGP,CACD,GACH,IACE;AAAA,aACN,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EACF;AAEJ;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,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,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,gBAAgB,QAAqD;AAC5E,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC5iBA,SAAS,WAAW,OAAO,SAAS,gBAAgB;AACpD;AAAA,EACE;AAAA,EACA;AAAA,EACA,UAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,MAAAC;AAAA,OACK;AAmdc,SAmpBP,UAnpBO,OAAAC,MAkCD,QAAAC,aAlCC;AA3arB,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;AACF;AAEA,IAAM,oCASA;AAAA,EACJ,EAAE,IAAI,OAAO,UAAU,KAAK;AAAA,EAC5B,EAAE,IAAI,SAAS,UAAU,mBAAmB;AAAA,EAC5C,EAAE,IAAI,oBAAoB,UAAU,6BAA6B;AAAA,EACjE,EAAE,IAAI,kBAAkB,UAAU,2BAA2B;AAAA,EAC7D,EAAE,IAAI,UAAU,UAAU,oBAAoB;AAChD;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,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,4BAA4B;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,cAAoC;AAAA,IACxC,GAAG;AAAA,IACH,WAAW,CAAC,OAAO,YAAY;AAC7B,0BAAoB;AAAA,QAClB,IAAI;AAAA,QACJ,WACE,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,GAAG,aAAa;AAAA,QAC/D,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,cAAc,CAAC,UAAU;AACvB,YAAM,MAAM,UAAU,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK;AAC3D,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AACA,6BAAuB;AAAA,QACrB,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,YAAY,IAAI;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;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;AAED,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,KAAK,EAAE,OAAO;AAAA,MAC1B,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,sBAAc,gBAAAF,KAAC,wBAAqB,OAAO,aAAa,IAAK;AAAA,QAC9D,gBAAAC,MAAC,SAAI,WAAU,gGACZ;AAAA,2BACC,gBAAAA,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,WAAWC;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,kCAAAD,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,EAAE,mCAAmC;AAAA;AAAA,oBAC7C,IAEA,gBAAAA,KAAC,OAAE,WAAU,oEACV,cAAI,QACP;AAAA,qBAEJ;AAAA,kBACA,gBAAAC,MAAC,SAAI,WAAU,oCACZ;AAAA,wBAAI,qBACH,gBAAAD;AAAA,sBAACG;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,gBAAAH;AAAA,sBAACG;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,gBAAAH;AAAA,sBAACG;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,gBAAAH;AAAA,sBAACG;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,0BAAAH,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,KAACI,aAAA,EAAW;AAAA;AAAA,oBACd,IACE;AAAA,qBACN;AAAA;AAAA;AAAA,cA9GK,IAAI;AAAA,YA+GX,CACD,GACH;AAAA,aACF,IACE;AAAA,UAEJ,gBAAAH,MAAC,aAAQ,WAAU,+BACjB;AAAA,4BAAAA,MAAC,SAAI,WAAU,uDACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,KAAK,EAAE,gBAAgB;AAAA,kBAClC,WAAU;AAAA,kBACV,MAAM;AAAA,oBACJ;AAAA,sBACE,OAAO,KAAK,EAAE,wBAAwB;AAAA,sBACtC,OAAO;AAAA,oBACT;AAAA,oBACA;AAAA,sBACE,OAAO,KAAK,EAAE,eAAe;AAAA,sBAC7B,OAAO;AAAA,oBACT;AAAA,kBACF;AAAA,kBACA,OAAO;AAAA,kBACP,eAAe;AAAA;AAAA,cACjB;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,wCACZ,2BAAiB,OAChB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,aAAa,MAAM;AACjB,sCAAkB;AAAA,kBACpB;AAAA,kBACA,aAAa,MAAM;AACjB,yBAAK,QAAQ,YAAY;AAAA,kBAC3B;AAAA;AAAA,cACF,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,SAAS;AAAA,kBACT,kBAAkB,MAAM;AACtB,yBAAK,QAAQ,iBAAiB;AAAA,kBAChC;AAAA;AAAA,cACF,GAEJ;AAAA,eACF;AAAA,YACC,UAAU,QACT,gBAAAA,KAAC,OAAE,WAAU,sDACV,eAAK,EAAE,gBAAgB,GAC1B,IACE;AAAA,YACH,iBAAiB,gBAChB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,eAAe;AAAA;AAAA,YACjB,IACE;AAAA,YACJ,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN;AAAA,gBACA,cAAc;AAAA,gBACd,OAAO;AAAA;AAAA,YACT;AAAA,aACF;AAAA,WACF;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,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;AAAA,oCACA,SAAS,gCAAgC;AAAA,oCACzC;AAAA,oCACA,MAAM,4BAA4B;AAAA,oCAClC;AAAA,oCACA;AAAA,oCACA;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,mBAAmB;AAAA,oCAChC;AAAA,oCAEF,eAAe;AAAA,oCACf,yBAAyB;AAAA;AAAA,gCAC3B;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,0BAACG;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,SAAS;AAAA,4BAER,eAAK,EAAE,wBAAwB;AAAA;AAAA,wBAClC;AAAA,wBACA,gBAAAH;AAAA,0BAACG;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,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,QAAQ,WAAW;AAAA,MAC7B;AAAA,MACA,OAAO,gBAAgB;AAAA,MACvB;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,sBAAsB;AAAA,YACzC,WAAWE;AAAA,cACT;AAAA,cACA,WAAW,QAAQ,WAAW,IAAI,kBAAkB;AAAA,cACpD;AAAA,YACF;AAAA,YAEA,0BAAAF,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,gBAAgB;AAAA,MACvB;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,uBAAuB;AAAA,YAC1C,WAAWE;AAAA,cACT;AAAA,cACA,UAAU,kBAAkB;AAAA,cAC5B,WACI,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAF,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,8BAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYiB;AACf,QAAM,mBAAmB,aAAa,SAAS;AAC/C,QAAM,uBAAuB,uBAAuB,SAAS;AAC7D,QAAM,WAAW,WAAY,CAAC,oBAAoB,CAAC;AACnD,QAAM,qBACJ,aAAa,KAAK,CAAC,WAAW,OAAO,UAAU,aAAa,GAAG,SAC/D;AACF,QAAM,yBACJ,uBAAuB;AAAA,IACrB,CAAC,WAAW,OAAO,UAAU;AAAA,EAC/B,GAAG,SAAS;AACd,QAAM,eAAe,CAAC,oBAAoB,sBAAsB,EAC7D,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,EACzC,KAAK,GAAG;AACX,QAAM,gBAAgB,mBAClB,gBACE,SAAS,aAAa,KACtB,SACF,0BACE,aAAa,uBAAuB,KACpC;AACN,QAAM,qBAAqB,CAAC,cAA4B;AACtD,QAAI,UAAU,WAAW,YAAY,GAAG;AACtC,8BAAwB,UAAU,MAAM,aAAa,MAAM,CAAC;AAC5D;AAAA,IACF;AACA,QAAI,UAAU,WAAW,QAAQ,GAAG;AAClC,oBAAc,UAAU,MAAM,SAAS,MAAM,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,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,+BAA+B;AAAA,YAClD,WAAWE;AAAA,cACT;AAAA,cACA,UAAU,kBAAkB;AAAA,cAC5B,WACI,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAF,KAAC,UAAK,WAAU,mDACb,yBACC,sBAAsB,yBACpB,gBAAAC,MAAA,YACE;AAAA,8BAAAD,KAAC,UAAK,WAAU,oBAAoB,8BAAmB;AAAA,cACvD,gBAAAA,KAAC,UAAK,WAAU,yCACb,kCACH;AAAA,eACF,IAEA,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,wBAAa,IAGnD,gBAAAA,KAAC,UAAK,WAAU,gDACb,oBACG,KAAK,EAAE,uCAAuC,IAC9C,KAAK,EAAE,yCAAyC,GACtD,GAEJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAWE;AAAA,cACT;AAAA,cACA,oBAAoB,uBAChB,cACA;AAAA,YACN;AAAA,YACA,YAAY;AAAA,YACZ,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,8BAAoB,uBACnB,gBAAAD,MAAC,qBACC;AAAA,8BAAAA,MAAC,qBACC;AAAA,gCAAAD,KAAC,0BACE,eAAK,EAAE,sBAAsB,GAChC;AAAA,gBACA,gBAAAA,KAAC,0BACE,uBAAa,IAAI,CAAC,WACjB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO,SAAS,OAAO,KAAK;AAAA,oBAE5B,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM;AAAA;AAAA,kBAH5C,OAAO;AAAA,gBAId,CACD,GACH;AAAA,iBACF;AAAA,cACA,gBAAAA,KAAC,sBAAmB;AAAA,cACpB,gBAAAC,MAAC,qBACC;AAAA,gCAAAD,KAAC,0BACE,eAAK,EAAE,gCAAgC,GAC1C;AAAA,gBACA,gBAAAA,KAAC,0BACE,iCAAuB,IAAI,CAAC,WAC3B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,wBACE,4BAA4B,OAAO;AAAA,oBAGrC,OAAO,aAAa,OAAO,KAAK;AAAA,oBAEhC,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM;AAAA;AAAA,kBAH5C,OAAO;AAAA,gBAId,CACD,GACH;AAAA,iBACF;AAAA,eACF,IACE,mBACF,aAAa,IAAI,CAAC,WAChB,gBAAAA,KAAC,cAA8B,OAAO,SAAS,OAAO,KAAK,IACzD,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM,KADlC,OAAO,KAExB,CACD,IACC,uBACF,uBAAuB,IAAI,CAAC,WAC1B,gBAAAA,KAAC,cAA8B,OAAO,aAAa,OAAO,KAAK,IAC7D,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM,KADlC,OAAO,KAExB,CACD,IAED,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,aACxB,eAAK,EAAE,yCAAyC,GACnD;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,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,eAAK,IAAI,CAAC,QACT,gBAAAA,KAAC,WAAQ,SAAkB,KAAU,QAAiB,IAAI,EAAI,CAC/D;AAAA;AAAA,EACH;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,WAAWC;AAAA,cACT;AAAA,cACA,WACI,kGACA;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,gBAAAF,KAAC,iBACC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,MAAI;AAAA,MACJ,QAAO;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,WAAWE;AAAA,QACT;AAAA,QACA,MAAM,SAAS,YACX,uFACA;AAAA,MACN;AAAA,MACA,gBAAgB;AAAA,MAChB,SAAS,MAAM;AAAA,MAEf,0BAAAF,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;AACF,GAIiB;AACf,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAA,MAAC,WACC;AAAA,sBAAAD,KAAC,kBAAe,SAAO,MACrB,0BAAAC;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET;AAAA,4BAAAH,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,MAACE;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS;AAAA,QAET;AAAA,0BAAAH,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,MAACG;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,0BAAAH,KAAC,eAAY,WAAW,UAAU,iBAAiB,QAAW;AAAA;AAAA,IAChE,GACF;AAAA,IACA,gBAAAA,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":["Button","DeleteIcon","cn","jsx","jsxs","cn","Button","DeleteIcon"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { ReactElement } 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 UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.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 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 replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\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 function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\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 ? copy.t(\"actions.updateApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\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 = createWorkspaceAppActionContext(app);\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = (): 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 === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n };\n const executeCardAction = (): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n };\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={(event) => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n }}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={() => {\n void actions.replaceAppIcon?.(app.id);\n }}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n <Button\n className={cn(\n \"min-w-[56px]\",\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={statusLabel}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n {canExecutePrimaryAction ? primaryActionLabel : statusLabel}\n </Button>\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 </div>\n {app.updateAvailable && app.availableVersion ? (\n <button\n className={cn(\n \"mt-1 inline-flex max-w-full items-center rounded-[4px] bg-[color-mix(in_srgb,var(--state-warning)_12%,transparent)] px-2 py-0.5 text-[11px] leading-4 text-[var(--state-warning)] outline-none transition-colors hover:bg-[color-mix(in_srgb,var(--state-warning)_18%,transparent)] focus-visible:ring-2 focus-visible:ring-[color-mix(in_srgb,var(--state-warning)_42%,transparent)]\",\n app.canUpdate ? \"cursor-pointer\" : \"cursor-default\"\n )}\n disabled={!app.canUpdate}\n title={copy.t(\"actions.updateApp\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (app.canUpdate) {\n void actions.updateApp?.(app.id, \"badge_button\");\n }\n }}\n >\n <span className=\"truncate\">\n {copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })}\n </span>\n </button>\n ) : null}\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 || app.tags.length > 0 ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n {app.errorMessage ? (\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 ) : null}\n {app.tags.length > 0 ? (\n <div className=\"flex min-w-0 flex-wrap gap-1.5\">\n {app.tags.slice(0, 3).map((tag) => (\n <span\n className=\"inline-flex h-5 max-w-full items-center rounded-[4px] bg-[var(--transparency-block)] px-2 text-[11px] leading-4 text-[var(--text-secondary)]\"\n key={tag}\n >\n <span className=\"truncate\">{tag}</span>\n </span>\n ))}\n </div>\n ) : null}\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 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.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 <span\n aria-hidden=\"true\"\n className=\"ml-2 size-1.5 flex-none rounded-full bg-[var(--state-danger)]\"\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 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 Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n SelectSplitColumn,\n SelectSplitColumnItems,\n SelectSplitColumnLabel,\n SelectSplitDivider,\n SelectSplitLayout,\n SelectTrigger,\n SelectValue,\n SectionTabs,\n Spinner,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n UploadIcon as ImportIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.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 = \"weather\" | \"lookup\" | \"system\" | \"news\" | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"modelReasoning\" | \"permission\" | \"provider\";\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.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: \"tools\", labelKey: \"categories.tools\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"office\", labelKey: \"categories.office\" }\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 [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 cardActions: AppCenterHostActions = {\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 };\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\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 pb-6 pt-5 [container-type:inline-size]\">\n <section className=\"flex min-w-0 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 />\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 <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] border border-[color:var(--line-2)] bg-[var(--background-fronted)] 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 <FactoryModelReasoningDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n modelOptions={modelOptions}\n open={openFactorySettingsMenu === \"modelReasoning\"}\n reasoningEffortOptions={reasoningEffortOptions}\n selectedModel={selectedModel}\n selectedReasoningEffort={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 ? \"modelReasoning\" : null\n )\n }\n onSelectModel={setSelectedModel}\n onSelectReasoningEffort={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={selectedOption?.provider}\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={selectedOption?.value}\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 ? \"animate-pulse\" : null,\n disabled\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 FactoryModelReasoningDropdown({\n copy,\n loading,\n modelOptions,\n onOpenChange,\n onSelectModel,\n onSelectReasoningEffort,\n open,\n reasoningEffortOptions,\n selectedModel,\n selectedReasoningEffort,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n modelOptions: readonly { label: string; value: string }[];\n onOpenChange: (open: boolean) => void;\n onSelectModel: (value: string) => void;\n onSelectReasoningEffort: (value: string) => void;\n open: boolean;\n reasoningEffortOptions: readonly { label: string; value: string }[];\n selectedModel: string;\n selectedReasoningEffort: string;\n triggerClassName?: string;\n}): ReactElement {\n const showModelSection = modelOptions.length > 0;\n const showReasoningSection = reasoningEffortOptions.length > 0;\n const disabled = loading || (!showModelSection && !showReasoningSection);\n const selectedModelLabel =\n modelOptions.find((option) => option.value === selectedModel)?.label ??\n selectedModel;\n const selectedReasoningLabel =\n reasoningEffortOptions.find(\n (option) => option.value === selectedReasoningEffort\n )?.label ?? selectedReasoningEffort;\n const triggerLabel = [selectedModelLabel, selectedReasoningLabel]\n .filter((value) => value.trim().length > 0)\n .join(\" \");\n const selectedValue = showModelSection\n ? selectedModel\n ? `model:${selectedModel}`\n : undefined\n : selectedReasoningEffort\n ? `reasoning:${selectedReasoningEffort}`\n : undefined;\n const applySettingsValue = (nextValue: string): void => {\n if (nextValue.startsWith(\"reasoning:\")) {\n onSelectReasoningEffort(nextValue.slice(\"reasoning:\".length));\n return;\n }\n if (nextValue.startsWith(\"model:\")) {\n onSelectModel(nextValue.slice(\"model:\".length));\n }\n };\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedValue}\n onOpenChange={onOpenChange}\n onValueChange={applySettingsValue}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.modelReasoning\")}\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 ? \"animate-pulse\" : null,\n disabled\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 gap-2 overflow-hidden\">\n {triggerLabel ? (\n selectedModelLabel && selectedReasoningLabel ? (\n <>\n <span className=\"min-w-0 truncate\">{selectedModelLabel}</span>\n <span className=\"shrink-0 text-[var(--text-secondary)]\">\n {selectedReasoningLabel}\n </span>\n </>\n ) : (\n <span className=\"min-w-0 truncate\">{triggerLabel}</span>\n )\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.noConfigurationOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className={cn(\n \"max-w-[min(100vw-32px,460px)] data-[side=top]:!translate-y-0\",\n showModelSection && showReasoningSection\n ? \"w-[430px]\"\n : \"w-max min-w-[240px]\"\n )}\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {showModelSection && showReasoningSection ? (\n <SelectSplitLayout>\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.model\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {modelOptions.map((option) => (\n <SelectItem\n key={option.value}\n value={`model:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n <SelectSplitDivider />\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.reasoningEffort\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {reasoningEffortOptions.map((option) => (\n <SelectItem\n forceSelectedIndicator={\n selectedReasoningEffort === option.value\n }\n key={option.value}\n value={`reasoning:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n </SelectSplitLayout>\n ) : showModelSection ? (\n modelOptions.map((option) => (\n <SelectItem key={option.value} value={`model:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : showReasoningSection ? (\n reasoningEffortOptions.map((option) => (\n <SelectItem key={option.value} value={`reasoning:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noConfigurationOptions\")}\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-[min(360px,45vh)] 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\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 );\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-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-2 focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"border border-[color:var(--line-1)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border border-transparent 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}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n}): ReactElement {\n return (\n <>\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":["Button","DeleteIcon","cn","jsx","jsxs","cn","Button","DeleteIcon"]}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
declare const workspaceAppRuntimeStatuses: readonly ["idle", "installing", "preparing", "starting", "running", "failed", "stopping"];
|
|
1
|
+
declare const workspaceAppRuntimeStatuses: readonly ["idle", "installing", "preparing", "starting", "running", "failed", "stopping", "unavailable"];
|
|
2
2
|
type WorkspaceAppRuntimeStatus = (typeof workspaceAppRuntimeStatuses)[number];
|
|
3
3
|
interface WorkspaceAppRuntimeError {
|
|
4
4
|
readonly code?: string;
|
|
5
5
|
readonly message: string;
|
|
6
6
|
}
|
|
7
7
|
interface WorkspaceAppRuntimeState {
|
|
8
|
+
readonly runtimeId?: string;
|
|
9
|
+
readonly installationId?: string;
|
|
8
10
|
readonly appId: string;
|
|
9
11
|
readonly status: WorkspaceAppRuntimeStatus;
|
|
12
|
+
readonly launchUrl?: string | null;
|
|
10
13
|
readonly error?: WorkspaceAppRuntimeError | null;
|
|
11
14
|
readonly startedAt?: string | null;
|
|
12
15
|
readonly updatedAt?: string | null;
|
|
@@ -22,6 +25,9 @@ interface WorkspaceAppManifestRuntime {
|
|
|
22
25
|
readonly bootstrap: string;
|
|
23
26
|
readonly healthcheckPath: string;
|
|
24
27
|
}
|
|
28
|
+
interface WorkspaceAppManifestReferences {
|
|
29
|
+
readonly listEndpoint: string;
|
|
30
|
+
}
|
|
25
31
|
type WorkspaceAppManifestWindowMinimizeBehavior = "hibernate" | "keep-mounted";
|
|
26
32
|
interface WorkspaceAppManifestWindow {
|
|
27
33
|
readonly minimizeBehavior?: WorkspaceAppManifestWindowMinimizeBehavior;
|
|
@@ -48,6 +54,7 @@ interface WorkspaceAppManifest {
|
|
|
48
54
|
readonly description: string;
|
|
49
55
|
readonly icon?: WorkspaceAppManifestIcon;
|
|
50
56
|
readonly runtime: WorkspaceAppManifestRuntime;
|
|
57
|
+
readonly references?: WorkspaceAppManifestReferences;
|
|
51
58
|
readonly window?: WorkspaceAppManifestWindow;
|
|
52
59
|
readonly author?: WorkspaceAppManifestAuthor;
|
|
53
60
|
readonly tags?: readonly string[];
|
|
@@ -72,7 +79,9 @@ interface WorkspaceAppCatalogEntry {
|
|
|
72
79
|
readonly source?: WorkspaceAppCatalogSource;
|
|
73
80
|
}
|
|
74
81
|
interface WorkspaceAppInstallRecord {
|
|
82
|
+
readonly installationId?: string;
|
|
75
83
|
readonly appId: string;
|
|
84
|
+
readonly version?: string | null;
|
|
76
85
|
readonly installedAt?: string | null;
|
|
77
86
|
readonly updatedAt?: string | null;
|
|
78
87
|
readonly catalogSourceId?: string | null;
|
|
@@ -90,8 +99,16 @@ interface WorkspaceAppRecord {
|
|
|
90
99
|
|
|
91
100
|
type WorkspaceAppStatusTone = "neutral" | "blue" | "green" | "amber" | "red";
|
|
92
101
|
type WorkspaceAppPrimaryAction = "install" | "open" | "retry" | "update" | "none";
|
|
102
|
+
interface WorkspaceAppActionContext {
|
|
103
|
+
readonly installationId?: string | null;
|
|
104
|
+
readonly runtimeId?: string | null;
|
|
105
|
+
readonly launchUrl?: string | null;
|
|
106
|
+
}
|
|
93
107
|
interface WorkspaceAppCardViewModel {
|
|
94
108
|
readonly id: string;
|
|
109
|
+
readonly installationId?: string | null;
|
|
110
|
+
readonly runtimeId?: string | null;
|
|
111
|
+
readonly launchUrl?: string | null;
|
|
95
112
|
readonly name: string;
|
|
96
113
|
readonly createdAtUnixMs: number | null;
|
|
97
114
|
readonly description?: string;
|
|
@@ -155,4 +172,4 @@ interface WorkspaceAppFactoryJobViewModel {
|
|
|
155
172
|
readonly updatedAtUnixMs: number;
|
|
156
173
|
}
|
|
157
174
|
|
|
158
|
-
export { type AppCenterViewModel as A, type
|
|
175
|
+
export { type AppCenterViewModel as A, type WorkspaceAppActionContext as W, type WorkspaceAppCardViewModel as a, type WorkspaceAppCatalogEntry as b, type WorkspaceAppCatalogLocalization as c, type WorkspaceAppCatalogSource as d, type WorkspaceAppCatalogSourceKind as e, type WorkspaceAppFactoryJobStatus as f, type WorkspaceAppFactoryJobViewModel as g, type WorkspaceAppInstallRecord as h, type WorkspaceAppManifest as i, type WorkspaceAppManifestAuthor as j, type WorkspaceAppManifestIcon as k, type WorkspaceAppManifestLocalizationFile as l, type WorkspaceAppManifestLocalizationInfo as m, type WorkspaceAppManifestReferences as n, type WorkspaceAppManifestRuntime as o, type WorkspaceAppManifestSchemaVersion as p, type WorkspaceAppManifestWindow as q, type WorkspaceAppManifestWindowMinimizeBehavior as r, type WorkspaceAppPrimaryAction as s, type WorkspaceAppRecord as t, type WorkspaceAppRuntimeError as u, type WorkspaceAppRuntimeState as v, type WorkspaceAppRuntimeStatus as w, type WorkspaceAppStatusTone as x, workspaceAppManifestSchemaVersion as y, workspaceAppRuntimeStatuses as z };
|