@tutti-os/workspace-app-center 0.0.12 → 0.0.13

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.
@@ -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 {\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
+ {"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { KeyboardEvent, ReactElement } from \"react\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppInstallProgress } from \"../contracts/runtime.ts\";\nimport type { 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 const AppCard = memo(function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const installBusy =\n app.installProgress != null || app.status === \"installing\";\n const busyStatusLabel = installBusy\n ? copy.t(\"status.installing\")\n : statusLabel;\n const showInstallProgressRing = installBusy;\n const statusButtonTitle = app.installProgress\n ? resolveInstallProgressTitle(copy, app.installProgress, busyStatusLabel)\n : statusLabel;\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? app.availableVersion\n ? copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })\n : copy.t(\"actions.updateApp\")\n : 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 = useMemo(\n () => createWorkspaceAppActionContext(app),\n [app]\n );\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = useCallback((): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, app.primaryAction]);\n const executeCardAction = useCallback((): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, canOpenFromCard]);\n const handleCardKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): void => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n },\n [canOpenFromCard, executeCardAction]\n );\n const handleReplaceIcon = useCallback((): void => {\n void actions.replaceAppIcon?.(app.id);\n }, [actions, app.id]);\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={handleReplaceIcon}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Button\n className={cn(\n \"min-w-[56px] shrink-0\",\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={statusButtonTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n {canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel}\n </Button>\n {showInstallProgressRing ? (\n <AppInstallProgressRing\n ariaLabel={copy.t(\"status.installProgress.progressAria\")}\n fallbackPercent={0}\n progress={app.installProgress}\n />\n ) : null}\n </div>\n </div>\n </div>\n\n <div className=\"mt-5 flex min-h-0 min-w-0 flex-1 flex-col p-1\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h3 className=\"block min-w-0 truncate text-[15px] font-semibold leading-6 tracking-[0] text-[var(--text-primary)]\">\n {app.name}\n </h3>\n {app.version ? (\n <span className=\"min-w-0 flex-none text-[11px] leading-4 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\">\n {copy.t(\"labels.version\", { version: app.version })}\n </span>\n ) : null}\n </div>\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n </div>\n ) : null}\n </div>\n </article>\n );\n});\n\nfunction createWorkspaceAppActionContext(\n app: WorkspaceAppCardViewModel\n): WorkspaceAppActionContext {\n return {\n installationId: app.installationId ?? null,\n runtimeId: app.runtimeId ?? null,\n launchUrl: app.launchUrl ?? null\n };\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n if (app.factoryEditAction === \"open_session\") {\n void actions.openFactoryJobAgentSession?.(\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n return;\n }\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.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 AppInstallProgressRing({\n ariaLabel,\n fallbackPercent,\n progress\n}: {\n readonly ariaLabel: string;\n readonly fallbackPercent: number;\n readonly progress: WorkspaceAppInstallProgress | null | undefined;\n}): ReactElement {\n const percent =\n progress == null\n ? Math.max(0, Math.min(100, Math.round(fallbackPercent)))\n : Math.max(0, Math.min(100, Math.round(progress.overallPercent)));\n\n return (\n <span\n aria-label={ariaLabel}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={percent}\n className=\"relative inline-flex size-[14px] shrink-0 items-center justify-center rounded-full\"\n role=\"progressbar\"\n style={{\n background: `conic-gradient(var(--text-secondary) ${percent}%, color-mix(in srgb, var(--text-secondary) 24%, transparent) 0)`\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-[2px] rounded-full bg-[var(--surface-panel)]\"\n />\n </span>\n );\n}\n\nfunction resolveInstallProgressTitle(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress,\n statusLabel: string\n): string {\n const byteLabel = formatInstallProgressBytes(copy, progress);\n const percent = Math.max(\n 0,\n Math.min(100, Math.round(progress.overallPercent))\n );\n if (byteLabel) {\n return `${statusLabel} · ${byteLabel} · ${percent}%`;\n }\n return `${statusLabel} · ${percent}%`;\n}\n\nfunction formatInstallProgressBytes(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress\n): string | null {\n if (\n progress.userPhase !== \"downloading\" ||\n progress.downloadedBytes == null\n ) {\n return null;\n }\n const downloaded = formatByteSize(progress.downloadedBytes);\n if (progress.totalBytes == null || progress.totalBytes <= 0) {\n return downloaded;\n }\n return copy.t(\"status.installProgress.downloadedOfTotal\", {\n downloaded,\n total: formatByteSize(progress.totalBytes)\n });\n}\n\nfunction formatByteSize(value: number): string {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n const precision = size >= 10 || unitIndex === 0 ? 0 : 1;\n return `${size.toFixed(precision)} ${units[unitIndex]}`;\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"unavailable\") {\n return \"text-[var(--state-warning)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n 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: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"office\", labelKey: \"categories.office\" },\n { id: \"tools\", labelKey: \"categories.tools\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [updateAppBusy, setUpdateAppBusy] = useState(false);\n const [pendingUpdateApp, setPendingUpdateApp] = useState<{\n id: string;\n name: string;\n trigger: \"badge_button\" | \"primary_action\";\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const cardActions = useMemo<AppCenterHostActions>(\n () => ({\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n },\n updateApp: (appId, trigger) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n if (app.installed && app.status === \"running\") {\n setPendingUpdateApp({\n id: app.id,\n name: app.name,\n trigger\n });\n return;\n }\n void actions.updateApp?.(appId, trigger);\n }\n }),\n [actions, viewModel.apps]\n );\n const loadingMessage =\n catalogStatus === \"loading\" ? copy.t(\"messages.catalogLoading\") : null;\n const catalogLoading = catalogStatus === \"loading\";\n const failedMessage =\n catalogStatus === \"failed\" ? copy.t(\"messages.catalogFailed\") : null;\n const statusToast =\n errorMessage != null\n ? {\n busy: false,\n message: errorMessage,\n tone: \"destructive\" as const\n }\n : failedMessage != null\n ? {\n busy: false,\n message: failedMessage,\n tone: \"destructive\" as const\n }\n : loadingMessage != null\n ? {\n busy: true,\n message: loadingMessage,\n tone: \"default\" as const\n }\n : null;\n const myApps = sortMyAppsByCreatedDesc(\n viewModel.apps.filter((app) => app.sourceKind === \"local\")\n );\n const recommendedSourceApps = viewModel.apps.filter(\n (app) => app.sourceKind !== \"local\"\n );\n const recommendedApps = sortRecommendedApps(recommendedSourceApps);\n const recommendedAppsForAllTab = sortRecommendedAppsForAllTab(\n recommendedSourceApps\n );\n const recommendedCategoryTabs = createRecommendedCategoryTabs(\n recommendedApps,\n copy\n );\n const activeRecommendedCategoryLabel =\n recommendedCategoryTabs.find(\n (tab) => tab.id === activeRecommendedCategoryTab\n )?.category ?? null;\n const activeRecommendedApps =\n activeRecommendedCategoryLabel == null\n ? recommendedAppsForAllTab\n : recommendedApps.filter(\n (app) => app.category === activeRecommendedCategoryLabel\n );\n const activeApps =\n activeAppTab === \"recommended\" ? activeRecommendedApps : myApps;\n const activeAppTabTitle =\n activeAppTab === \"recommended\"\n ? copy.t(\"labels.recommendedApps\")\n : copy.t(\"labels.myApps\");\n const activeAppEmptyMessage =\n activeAppTab === \"recommended\"\n ? copy.t(\"messages.recommendedAppsEmpty\")\n : copy.t(\"messages.myAppsEmpty\");\n const pendingDeleteAppInstalled = pendingDeleteApp?.installed ?? false;\n const deleteAppConfirmLabel = copy.t(\n pendingDeleteAppInstalled\n ? \"actions.uninstallAndDeleteApp\"\n : \"actions.deleteApp\"\n );\n const deleteAppConfirmDescription = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppDescription\"\n : \"confirmations.deleteAppDescription\"\n );\n const deleteAppConfirmTitle = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppTitle\"\n : \"confirmations.deleteAppTitle\",\n {\n name: pendingDeleteApp?.name ?? \"\"\n }\n );\n const pendingUninstallAppLocal = pendingUninstallApp?.sourceKind === \"local\";\n const uninstallAppConfirmDescription = copy.t(\n pendingUninstallAppLocal\n ? \"confirmations.uninstallAppDescriptionLocal\"\n : \"confirmations.uninstallAppDescriptionRecommended\"\n );\n const uninstallAppConfirmTitle = copy.t(\"confirmations.uninstallAppTitle\", {\n name: pendingUninstallApp?.name ?? \"\"\n });\n const updateAppConfirmTitle = copy.t(\"confirmations.updateAppTitle\", {\n name: pendingUpdateApp?.name ?? \"\"\n });\n\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-h-0 min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex h-8 min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n className=\"h-8\"\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex h-8 shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\n {activeAppTab === \"my\" && hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[11px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\n job.canFix\n ? \"factory.messages.factoryJobFailedWithFix\"\n : \"factory.messages.factoryJobFailed\"\n )}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[11px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={updateAppBusy}\n confirmLabel={copy.t(\"actions.updateApp\")}\n description={copy.t(\"confirmations.updateRunningAppDescription\")}\n open={pendingUpdateApp != null}\n title={updateAppConfirmTitle}\n onConfirm={() => {\n const app = pendingUpdateApp;\n if (!app) {\n return;\n }\n setUpdateAppBusy(true);\n void Promise.resolve(\n actions.updateApp?.(app.id, app.trigger)\n ).finally(() => {\n setUpdateAppBusy(false);\n setPendingUpdateApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !updateAppBusy) {\n setPendingUpdateApp(null);\n }\n }}\n />\n <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-0 min-w-0 flex-1 items-center justify-center rounded-[8px] px-6 text-center text-[13px] leading-5 text-[var(--text-secondary)]\"\n role=\"status\"\n >\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div\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-h-10 min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-[inset_0_0_0_1px_var(--line-1)]\"\n : \"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[11px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[11px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp\n}: {\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":["AppCard","useMemo","Button","DeleteIcon","cn","jsx","jsxs","useMemo","cn","Button","DeleteIcon"]}
@@ -4,12 +4,21 @@ interface WorkspaceAppRuntimeError {
4
4
  readonly code?: string;
5
5
  readonly message: string;
6
6
  }
7
+ type WorkspaceAppInstallUserPhase = "downloading" | "installing" | "starting";
8
+ interface WorkspaceAppInstallProgress {
9
+ readonly userPhase: WorkspaceAppInstallUserPhase;
10
+ readonly overallPercent: number;
11
+ readonly downloadedBytes?: number | null;
12
+ readonly totalBytes?: number | null;
13
+ readonly indeterminate: boolean;
14
+ }
7
15
  interface WorkspaceAppRuntimeState {
8
16
  readonly runtimeId?: string;
9
17
  readonly installationId?: string;
10
18
  readonly appId: string;
11
19
  readonly status: WorkspaceAppRuntimeStatus;
12
20
  readonly launchUrl?: string | null;
21
+ readonly installProgress?: WorkspaceAppInstallProgress | null;
13
22
  readonly error?: WorkspaceAppRuntimeError | null;
14
23
  readonly startedAt?: string | null;
15
24
  readonly updatedAt?: string | null;
@@ -99,6 +108,7 @@ interface WorkspaceAppRecord {
99
108
 
100
109
  type WorkspaceAppStatusTone = "neutral" | "blue" | "green" | "amber" | "red";
101
110
  type WorkspaceAppPrimaryAction = "install" | "open" | "retry" | "update" | "none";
111
+ type WorkspaceAppFactoryEditAction = "open_session" | "prepare_modification";
102
112
  interface WorkspaceAppActionContext {
103
113
  readonly installationId?: string | null;
104
114
  readonly runtimeId?: string | null;
@@ -140,6 +150,8 @@ interface WorkspaceAppCardViewModel {
140
150
  readonly canRetry: boolean;
141
151
  readonly canUpdate: boolean;
142
152
  readonly errorMessage?: string;
153
+ readonly installProgress?: WorkspaceAppInstallProgress | null;
154
+ readonly factoryEditAction?: WorkspaceAppFactoryEditAction | null;
143
155
  readonly factoryAgentSessionId?: string | null;
144
156
  readonly factoryJobId?: string | null;
145
157
  readonly factoryProvider?: string | null;
@@ -172,4 +184,4 @@ interface WorkspaceAppFactoryJobViewModel {
172
184
  readonly updatedAtUnixMs: number;
173
185
  }
174
186
 
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 };
187
+ export { type AppCenterViewModel as A, workspaceAppManifestSchemaVersion as B, workspaceAppRuntimeStatuses as C, 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 WorkspaceAppFactoryEditAction as f, type WorkspaceAppFactoryJobStatus as g, type WorkspaceAppFactoryJobViewModel as h, type WorkspaceAppInstallProgress as i, type WorkspaceAppInstallRecord as j, type WorkspaceAppManifest as k, type WorkspaceAppManifestAuthor as l, type WorkspaceAppManifestIcon as m, type WorkspaceAppManifestLocalizationFile as n, type WorkspaceAppManifestLocalizationInfo as o, type WorkspaceAppManifestReferences as p, type WorkspaceAppManifestRuntime as q, type WorkspaceAppManifestSchemaVersion as r, type WorkspaceAppManifestWindow as s, type WorkspaceAppManifestWindowMinimizeBehavior as t, type WorkspaceAppPrimaryAction as u, type WorkspaceAppRecord as v, type WorkspaceAppRuntimeError as w, type WorkspaceAppRuntimeState as x, type WorkspaceAppRuntimeStatus as y, type WorkspaceAppStatusTone as z };