@tutti-os/workspace-app-center 0.0.28 → 0.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/ui/index.js +7 -6
- package/dist/ui/index.js.map +1 -1
- package/package.json +3 -3
package/dist/i18n/index.js
CHANGED
|
@@ -226,7 +226,7 @@ var appCenterEn = {
|
|
|
226
226
|
myApps: "My apps",
|
|
227
227
|
recommendedApps: "Recommended apps",
|
|
228
228
|
runningCount: "{{count}} running",
|
|
229
|
-
updateAvailable: "Update {{version}}
|
|
229
|
+
updateAvailable: "Update to {{version}}",
|
|
230
230
|
version: "Version {{version}}"
|
|
231
231
|
},
|
|
232
232
|
localDev: {
|
|
@@ -477,7 +477,7 @@ var appCenterZhCN = {
|
|
|
477
477
|
myApps: "\u6211\u7684\u5E94\u7528",
|
|
478
478
|
recommendedApps: "\u63A8\u8350\u5E94\u7528",
|
|
479
479
|
runningCount: "{{count}} \u4E2A\u8FD0\u884C\u4E2D",
|
|
480
|
-
updateAvailable: "\
|
|
480
|
+
updateAvailable: "\u66F4\u65B0\u5230 {{version}}",
|
|
481
481
|
version: "\u7248\u672C {{version}}"
|
|
482
482
|
},
|
|
483
483
|
localDev: {
|
package/dist/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/i18n/appCenterI18n.ts"],"sourcesContent":["import {\n createI18nRuntime,\n createScopedI18nRuntime,\n createScopedLocaleObjectsI18nModuleManifest,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype AppCenterI18nLocale = \"en\" | \"zh-CN\";\n\nexport const appCenterI18nNamespace = \"appCenter\";\nexport const tuttiI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"appCenterEn\",\n \"zh-CN\": \"appCenterZhCN\"\n },\n name: \"workspace-app-center\",\n namespace: \"appCenter\",\n sourceRoot: \"packages/workspace/app-center/src/ui\"\n});\n\nexport const appCenterEn = {\n actions: {\n cancel: \"Cancel\",\n deleteApp: \"Delete app\",\n exportApp: \"Export\",\n importApp: \"Import\",\n importAppTooltip:\n \"Only valid Tutti app .zip packages are supported. You can export an app and import it here.\",\n installApp: \"Install\",\n loadUnpackedApp: \"Load unpacked\",\n loadUnpackedAppTooltip:\n \"Select a Tutti app directory or a project root with .tutti/dev-app.\",\n moreActions: \"More actions\",\n openApp: \"Open\",\n openAppFolder: \"Open data folder\",\n openAppPackageFolder: \"Open app folder\",\n modifyAppWithAgent: \"Edit with agent\",\n publishAppUpdate: \"Republish\",\n refreshCatalog: \"Refresh catalog\",\n reloadLocalApp: \"Reload\",\n replaceIcon: \"Replace icon\",\n retryApp: \"Retry\",\n restartAndOpenApp: \"Restart and open\",\n updateApp: \"Update\",\n uninstallAndDeleteApp: \"Uninstall and delete\",\n uninstallApp: \"Uninstall\"\n },\n confirmations: {\n deleteAppDescription:\n \"This removes the app from your local apps and deletes its app data.\",\n deleteAppTitle: 'Delete \"{{name}}\"?',\n uninstallAppDescriptionLocal:\n \"This uninstalls the app from this workspace and deletes this workspace's app data. The app stays in My apps.\",\n uninstallAppDescriptionRecommended:\n \"This uninstalls the app from this workspace and deletes this workspace's app data.\",\n uninstallAppTitle: 'Uninstall \"{{name}}\"?',\n updateAppTitle: 'Update \"{{name}}\"?',\n updateRunningAppDescription:\n \"The app will restart after the update finishes to apply changes.\",\n uninstallAndDeleteAppDescription:\n \"This uninstalls the app, deletes its app data, and removes it from your local apps.\",\n uninstallAndDeleteAppTitle: 'Uninstall and delete \"{{name}}\"?'\n },\n factory: {\n actions: {\n cancel: \"Cancel\",\n create: \"Create app\",\n delete: \"Delete\",\n fix: \"Fix\",\n publish: \"Add to my apps\",\n validate: \"Validate\"\n },\n labels: {\n agent: \"Agent\",\n appName: \"App name\",\n create: \"Create app\",\n jobs: \"In progress\",\n model: \"Model\",\n modelReasoning: \"Model and thinking depth\",\n prompt: \"Prompt\",\n reasoningEffort: \"Thinking depth\",\n review: \"Review\",\n templateInspirationPrefix: \"Try these inspirations:\",\n templates: \"Start from\"\n },\n messages: {\n factoryJobFailed: \"Creation failed. Open the agent session for details.\",\n factoryJobFailedWithFix:\n \"Creation failed. Open the agent session or use Fix for details.\",\n loadingConfiguration: \"Loading configuration...\",\n loadingProviders: \"Loading agent providers...\",\n noAgentProviders: \"No available agent providers.\",\n noConfigurationOptions: \"No configuration options available.\",\n noModelOptions: \"No models available.\",\n noPermissionOptions: \"No review options available.\",\n noReasoningEffortOptions: \"No thinking depth options available.\"\n },\n placeholders: {\n appName: \"Name your app\",\n prompt: \"Describe the app to create\"\n },\n prompts: {\n fixDefault: \"Fix the draft so it passes validation.\"\n },\n permissionSemantics: {\n \"accept-edits\": {\n label: \"Accept edits\"\n },\n \"ask-before-write\": {\n label: \"Ask for approval\"\n },\n auto: {\n label: \"Approve for me\"\n },\n \"full-access\": {\n label: \"Full access\"\n },\n \"locked-down\": {\n label: \"Don't ask\"\n },\n unconfigurable: {\n label: \"Fixed mode\"\n }\n },\n templates: {\n lovart: {\n defaultName: \"Lovart Studio\",\n prompt:\n \"Create a local AI brand design studio inspired by Lovart. The app should turn one brand or campaign brief into a coordinated asset board. Provide a concise brief form for brand name, audience, tone, colors, deliverables, and constraints; generate an editable creative direction with palette, typography notes, messaging angles, and art direction; create a checklist of assets such as logo concepts, hero image, product mockups, social posts, ad banners, landing page sections, and short video storyboard frames; produce copy-ready image prompts for each asset with aspect ratio, style, and negative prompt guidance; render the assets in a canvas-like grid with status, notes, and iteration history; let users refine a selected asset with natural-language instructions; keep projects, briefs, generated prompts, notes, and asset states in app data. Use mock generated thumbnails locally unless a host-provided image generation API is available, and clearly show retryable generation errors.\",\n summary:\n \"Brand briefs, coordinated asset boards, and prompt workflows.\",\n title: \"Lovart Studio\"\n },\n lookup: {\n defaultName: \"Answer Book\",\n prompt:\n \"Create an offline answer-book app for playful quick guidance. Let the user type a question, draw one random short answer from a built-in answer deck, show the answer prominently with a redraw action, and keep recent questions and draws in app data. Do not use external network or factual lookup APIs.\",\n summary: \"Offline random answers for user-entered questions.\",\n title: \"Answer book\"\n },\n news: {\n defaultName: \"News Brief\",\n prompt:\n \"Create a news reader app backed by user-configurable RSS or Atom feeds that can be fetched without API keys. On refresh, fetch all saved feeds once, parse and deduplicate items by link or title, and show a concise feed with source names, timestamps, saved topics, and a short brief view. Keep feed and topic preferences in app data, and make feed fetch failures visible and retryable.\",\n summary: \"RSS and Atom feeds, brief views, and saved topics.\",\n title: \"News\"\n },\n gomoku: {\n defaultName: \"Gomoku\",\n prompt:\n \"Create a local Gomoku game app. Render a 15 by 15 board, let two local players alternate black and white stones, detect five in a row horizontally, vertically, or diagonally, show the winner or draw state, and provide restart and undo controls. Keep recent match results and settings in app data, and do not depend on external network services.\",\n summary: \"Local two-player Gomoku with win detection.\",\n title: \"Gomoku\"\n },\n system: {\n defaultName: \"System Monitor\",\n prompt:\n \"Create a local system dashboard inspired by btop. Show CPU, memory, process, network, and disk usage in a dense readable layout. Refresh automatically, keep settings in app data, and avoid external network dependencies.\",\n summary: \"CPU, memory, network, process, and disk usage.\",\n title: \"System dashboard\"\n },\n weather: {\n defaultName: \"Weather Watch\",\n prompt:\n \"Create a weather lookup app backed by Open-Meteo APIs that can be fetched without API keys. Use Open-Meteo geocoding to search locations and Open-Meteo forecast data for current conditions, hourly forecasts, and daily forecasts. Let the user enter and save locations, keep saved locations in app data, refresh selected locations on demand, and clearly surface retryable refresh errors.\",\n summary: \"Current conditions and forecasts for saved locations.\",\n title: \"Weather\"\n }\n },\n status: {\n canceled: \"Canceled\",\n failed: \"Failed\",\n generating: \"Generating\",\n preparing: \"Preparing\",\n published: \"Published\",\n queued: \"Queued\",\n ready: \"Completed\",\n validating: \"Validating\"\n }\n },\n catalogApps: {\n issueManager: {\n description: \"Manage workspace tasks and runs.\",\n name: \"Task Manager\"\n }\n },\n comingSoonApps: {\n productCompetition: {\n category: \"Product design\",\n description:\n \"Compare competitor positioning, features, and experience to support product decisions.\",\n name: \"Competitor Analysis\"\n },\n designReview: {\n category: \"Product design\",\n description:\n \"Review flows, interfaces, and experience issues before release.\",\n name: \"Design Review\"\n },\n groupChat: {\n category: \"Other tools\",\n description: \"Collaborate with multiple agents in a group chat.\",\n name: \"Group Chat\"\n },\n aiPpt: {\n category: \"Daily office\",\n description:\n \"Generate presentation outlines, slide structure, and first-draft content.\",\n name: \"AI PPT\"\n },\n aiDocument: {\n category: \"Daily office\",\n description: \"Draft, rewrite, and organize documents.\",\n name: \"AI Document\"\n },\n aiSheet: {\n category: \"Daily office\",\n description: \"Build spreadsheets and analyze data with AI assistance.\",\n name: \"AI Spreadsheet\"\n },\n openCut: {\n category: \"Content creation\",\n description:\n \"Open-source video editor with media arrangement and timeline editing.\",\n name: \"Open Cut\"\n },\n documentSummarizer: {\n category: \"Other tools\",\n description:\n \"Extract conclusions, key points, and action items from long documents.\",\n name: \"Document Summarizer\"\n }\n },\n categories: {\n contentCreation: \"Content creation\",\n office: \"Daily office\",\n productDesign: \"Product design\",\n tools: \"Other tools\"\n },\n labels: {\n allApps: \"All\",\n appCategories: \"App categories\",\n appList: \"App Center\",\n appPlural: \"Apps\",\n appSingular: \"App\",\n failedCount: \"{{count}} failed\",\n installedAppsTitle: \"{{count}} installed {{appLabel}}\",\n installedCount: \"{{count}} installed\",\n localDev: \"local-dev\",\n myApps: \"My apps\",\n recommendedApps: \"Recommended apps\",\n runningCount: \"{{count}} running\",\n updateAvailable: \"Update {{version}} available\",\n version: \"Version {{version}}\"\n },\n localDev: {\n repairDialog: {\n confirm: \"Ask Agent to fix\",\n description: \"Ask Agent to fix it with one click.\",\n title: \".tutti files not found\"\n },\n repairPrompt:\n 'Load the skill https://github.com/tutti-os/tutti-agent-skills/tree/main/plugins/tutti/skills/tutti-workspace-app-factory and adapt project directory \"{{cwd}}\" into a Tutti local debug app. Generate .tutti/dev-app/; bootstrap.sh must read the host-injected TUTTI_APP_HOST and TUTTI_APP_PORT, and must not hard-code a port.'\n },\n messages: {\n appRuntimeFailed:\n \"The app failed to start. Open its session or logs for details.\",\n catalogFailed:\n \"Remote app catalog is unavailable. Local apps are still available.\",\n catalogLoading: \"Loading remote app catalog...\",\n empty: \"No apps installed yet\",\n myAppsEmpty: \"Imported and created apps will appear here.\",\n recommendedAppsEmpty: \"No recommended apps available.\"\n },\n status: {\n comingSoon: \"Coming soon\",\n failed: \"Failed\",\n installProgress: {\n downloadedOfTotal: \"{{downloaded}} / {{total}}\",\n downloading: \"Downloading…\",\n installing: \"Installing…\",\n progressAria: \"App install progress\",\n starting: \"Starting…\"\n },\n installing: \"Installing\",\n installedPendingRestart: \"New version installed. Restart to apply.\",\n preparing: \"Preparing\",\n running: \"Running\",\n starting: \"Starting\",\n stopping: \"Stopping\",\n unavailable: \"Unavailable\"\n },\n title: \"App Center\"\n} as const satisfies I18nDictionary;\n\nexport const appCenterZhCN = {\n actions: {\n cancel: \"取消\",\n deleteApp: \"删除应用\",\n exportApp: \"导出\",\n importApp: \"导入\",\n importAppTooltip:\n \"仅支持符合规范的 Tutti 应用 .zip 包。你可以先导出应用,再在这里导入。\",\n installApp: \"安装\",\n loadUnpackedApp: \"加载未打包的本地程序\",\n loadUnpackedAppTooltip:\n \"选择 Tutti 应用目录,或包含 .tutti/dev-app 的项目根目录。\",\n moreActions: \"更多操作\",\n openApp: \"打开\",\n openAppFolder: \"打开数据目录\",\n openAppPackageFolder: \"打开应用目录\",\n modifyAppWithAgent: \"用智能体编辑\",\n publishAppUpdate: \"重新发布\",\n refreshCatalog: \"刷新目录\",\n reloadLocalApp: \"重新加载\",\n replaceIcon: \"替换图标\",\n retryApp: \"重试\",\n restartAndOpenApp: \"重启并打开\",\n updateApp: \"更新\",\n uninstallAndDeleteApp: \"卸载并删除\",\n uninstallApp: \"卸载\"\n },\n confirmations: {\n deleteAppDescription: \"这会从本地应用列表删除该应用,并删除它的应用数据。\",\n deleteAppTitle: \"删除“{{name}}”?\",\n uninstallAppDescriptionLocal:\n \"这会从当前工作区卸载该应用,并删除此工作区中的应用数据。应用本体仍保留在我的应用中。\",\n uninstallAppDescriptionRecommended:\n \"这会从当前工作区卸载该应用,并删除此工作区中的应用数据。\",\n uninstallAppTitle: \"卸载“{{name}}”?\",\n updateAppTitle: \"更新“{{name}}”?\",\n updateRunningAppDescription: \"更新完成后会重启应用以应用更改。\",\n uninstallAndDeleteAppDescription:\n \"这会卸载该应用、删除应用数据,并从本地应用列表移除。\",\n uninstallAndDeleteAppTitle: \"卸载并删除“{{name}}”?\"\n },\n factory: {\n actions: {\n cancel: \"取消\",\n create: \"创建应用\",\n delete: \"删除\",\n fix: \"修复\",\n publish: \"添加至我的应用\",\n validate: \"验证\"\n },\n labels: {\n agent: \"Agent\",\n appName: \"应用名称\",\n create: \"创建应用\",\n jobs: \"进行中\",\n model: \"模型\",\n modelReasoning: \"模型与思考深度\",\n prompt: \"提示词\",\n reasoningEffort: \"思考深度\",\n review: \"审查\",\n templateInspirationPrefix: \"试试这些灵感:\",\n templates: \"选择起点\"\n },\n messages: {\n factoryJobFailed: \"创建失败,打开 Agent 会话查看详情。\",\n factoryJobFailedWithFix: \"创建失败,打开 Agent 会话或使用修复查看详情。\",\n loadingConfiguration: \"正在加载配置...\",\n loadingProviders: \"正在加载 Agent Provider...\",\n noAgentProviders: \"暂无可用的 Agent Provider。\",\n noConfigurationOptions: \"暂无可用配置项。\",\n noModelOptions: \"暂无可用模型。\",\n noPermissionOptions: \"暂无可用的审查选项。\",\n noReasoningEffortOptions: \"暂无可用的思考深度选项。\"\n },\n placeholders: {\n appName: \"输入应用名称\",\n prompt: \"描述要创建的应用\"\n },\n prompts: {\n fixDefault: \"修复当前草稿,让它通过验证。\"\n },\n permissionSemantics: {\n \"accept-edits\": {\n label: \"接受编辑\"\n },\n \"ask-before-write\": {\n label: \"请求批准\"\n },\n auto: {\n label: \"替我审批\"\n },\n \"full-access\": {\n label: \"完全访问\"\n },\n \"locked-down\": {\n label: \"不再询问\"\n },\n unconfigurable: {\n label: \"固定模式\"\n }\n },\n templates: {\n lovart: {\n defaultName: \"Lovart Studio\",\n prompt:\n \"创建一个受 Lovart 启发的本地 AI 品牌设计工作室应用。应用需要把一句品牌或营销活动 brief 转成一组统一风格的资产看板。提供简洁的 brief 表单,字段包括品牌名、受众、语气、颜色、交付物和约束;生成可编辑的创意方向,包含色板、字体建议、信息表达角度和视觉方向;创建资产清单,例如 logo 概念、主视觉、产品 mockup、社媒帖子、广告横幅、落地页区块和短视频分镜;为每个资产生成可复制的图片提示词,包含画幅比例、风格和负面提示词建议;用类似画布的网格展示资产、状态、备注和迭代历史;允许用户用自然语言细化选中的资产;把项目、brief、生成提示词、备注和资产状态保存在应用数据目录。没有宿主提供的图片生成 API 时使用本地 mock 缩略图,并清楚展示可重试的生成失败状态。\",\n summary: \"品牌 brief、统一资产看板和提示词工作流。\",\n title: \"Lovart Studio\"\n },\n lookup: {\n defaultName: \"答案之书\",\n prompt:\n \"创建一个离线的答案之书应用,用于给用户输入的问题提供轻量随机指引。允许用户输入问题,从内置答案卡组里随机抽取一句短答案,突出展示答案,并提供重新抽取操作;把最近问题和抽取记录保存在应用数据目录。不要依赖外部网络或事实查询 API。\",\n summary: \"面向用户输入问题的离线随机答案。\",\n title: \"答案之书\"\n },\n news: {\n defaultName: \"新闻简报\",\n prompt:\n \"创建一个新闻阅读应用,使用用户可配置且无需 API Key 的 RSS 或 Atom feed 作为数据源。刷新时一次性抓取所有已保存 feed,解析并按链接或标题去重,展示简洁信息流、来源名称、时间、已保存主题和简报视图;把 feed 和主题偏好保存在应用数据目录,并让 feed 抓取失败状态可见且可重试。\",\n summary: \"RSS 和 Atom 信息流、简报视图和关注主题。\",\n title: \"新闻\"\n },\n gomoku: {\n defaultName: \"五子棋\",\n prompt:\n \"创建一个本地五子棋小游戏应用。渲染 15 x 15 棋盘,支持两名本地玩家轮流落黑白棋,检测横向、纵向和斜向五子连珠,展示胜负或平局状态,并提供重新开始和悔棋控制。把最近对局结果和设置保存在应用数据目录,不依赖外部网络服务。\",\n summary: \"带胜负检测的本地双人五子棋。\",\n title: \"五子棋\"\n },\n system: {\n defaultName: \"系统监控\",\n prompt:\n \"创建一个类似 btop 的本地系统看板。用紧凑清晰的布局展示 CPU、内存、进程、网络和磁盘占用;自动刷新,把设置保存在应用数据目录,并避免依赖外部网络。\",\n summary: \"CPU、内存、网络、进程和磁盘占用。\",\n title: \"系统看板\"\n },\n weather: {\n defaultName: \"天气查询\",\n prompt:\n \"创建一个天气查询应用,使用无需 API Key 的 Open-Meteo 数据源。用 Open-Meteo geocoding 搜索地点,用 Open-Meteo forecast 获取当前天气、小时预报和每日预报;允许用户输入并保存地点,把保存的地点放在应用数据目录,支持按需刷新选中地点,并清楚展示可重试的刷新失败状态。\",\n summary: \"保存地点的当前天气和预报。\",\n title: \"天气\"\n }\n },\n status: {\n canceled: \"已取消\",\n failed: \"失败\",\n generating: \"生成中\",\n preparing: \"准备中\",\n published: \"已发布\",\n queued: \"排队中\",\n ready: \"已完成\",\n validating: \"验证中\"\n }\n },\n catalogApps: {\n issueManager: {\n description: \"管理工作区任务和运行记录。\",\n name: \"任务管理\"\n }\n },\n comingSoonApps: {\n productCompetition: {\n category: \"产品设计\",\n description: \"对比竞品定位、功能和体验,辅助产品决策\",\n name: \"竞品分析\"\n },\n designReview: {\n category: \"产品设计\",\n description: \"检查流程、界面和体验问题\",\n name: \"设计评审\"\n },\n groupChat: {\n category: \"其他工具\",\n description: \"在群里和多个 Agent 一起协作\",\n name: \"群聊\"\n },\n aiPpt: {\n category: \"日常办公\",\n description: \"生成演示大纲、页面结构和初稿内容\",\n name: \"AI PPT\"\n },\n aiDocument: {\n category: \"日常办公\",\n description: \"起草、改写和整理文档\",\n name: \"AI 文档\"\n },\n aiSheet: {\n category: \"日常办公\",\n description: \"用 AI 辅助搭建表格、分析数据\",\n name: \"AI 表格\"\n },\n openCut: {\n category: \"内容创作\",\n description: \"开源视频剪辑工具,支持素材编排和时间线编辑\",\n name: \"Open Cut\"\n },\n documentSummarizer: {\n category: \"其他工具\",\n description: \"提炼长文档的结论、要点和行动项\",\n name: \"文档总结器\"\n }\n },\n categories: {\n contentCreation: \"内容创作\",\n office: \"日常办公\",\n productDesign: \"产品设计\",\n tools: \"其他工具\"\n },\n labels: {\n allApps: \"全部\",\n appCategories: \"应用分类\",\n appList: \"应用中心\",\n appPlural: \"App\",\n appSingular: \"App\",\n failedCount: \"{{count}} 个失败\",\n installedAppsTitle: \"已安装 {{count}} 个 {{appLabel}}\",\n installedCount: \"已安装 {{count}} 个\",\n localDev: \"本地调试\",\n myApps: \"我的应用\",\n recommendedApps: \"推荐应用\",\n runningCount: \"{{count}} 个运行中\",\n updateAvailable: \"可更新到 {{version}}\",\n version: \"版本 {{version}}\"\n },\n localDev: {\n repairDialog: {\n confirm: \"让 Agent 修复\",\n description: \"可一键让 Agent 为你修复。\",\n title: \"目录未识别到 .tutti 文件\"\n },\n repairPrompt:\n \"加载 skill https://github.com/tutti-os/tutti-agent-skills/tree/main/plugins/tutti/skills/tutti-workspace-app-factory,将项目目录“{{cwd}}”适配成本地调试 Tutti 应用。生成 .tutti/dev-app/;bootstrap.sh 必须读取宿主注入的 TUTTI_APP_HOST 和 TUTTI_APP_PORT,不要硬编码端口。\"\n },\n messages: {\n appRuntimeFailed: \"应用启动失败。请打开会话或日志查看详情。\",\n catalogFailed: \"无法加载远程应用目录,本地应用仍可用。\",\n catalogLoading: \"正在加载远程应用目录...\",\n empty: \"还没有安装应用\",\n myAppsEmpty: \"导入或创建的应用会显示在这里\",\n recommendedAppsEmpty: \"暂无推荐应用\"\n },\n status: {\n comingSoon: \"敬请期待\",\n failed: \"失败\",\n installProgress: {\n downloadedOfTotal: \"{{downloaded}} / {{total}}\",\n downloading: \"正在下载…\",\n installing: \"正在安装…\",\n progressAria: \"应用安装进度\",\n starting: \"正在启动…\"\n },\n installing: \"安装中\",\n installedPendingRestart: \"新版已安装,重启后生效\",\n preparing: \"准备中\",\n running: \"运行中\",\n starting: \"启动中\",\n stopping: \"停止中\",\n unavailable: \"不可用\"\n },\n title: \"应用中心\"\n} as const satisfies I18nDictionary;\n\nexport type AppCenterI18nKey = string;\n\nexport type AppCenterI18nRuntime = I18nRuntime<AppCenterI18nKey>;\n\nconst appCenterDefaults: Record<AppCenterI18nLocale, I18nDictionary> = {\n en: appCenterEn,\n \"zh-CN\": appCenterZhCN\n};\n\nexport const appCenterI18nResources = {\n en: {\n [appCenterI18nNamespace]: appCenterDefaults.en\n },\n \"zh-CN\": {\n [appCenterI18nNamespace]: appCenterDefaults[\"zh-CN\"]\n }\n} as const satisfies Record<AppCenterI18nLocale, I18nDictionary>;\n\nconst defaultAppCenterI18n = createI18nRuntime({\n dictionaries: [appCenterI18nResources.en]\n});\n\nexport function createAppCenterI18nRuntime(\n runtime: I18nRuntime<string> | undefined\n): AppCenterI18nRuntime {\n return createScopedI18nRuntime<AppCenterI18nKey>(\n runtime ?? defaultAppCenterI18n,\n appCenterI18nNamespace\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/i18n/appCenterI18n.ts"],"sourcesContent":["import {\n createI18nRuntime,\n createScopedI18nRuntime,\n createScopedLocaleObjectsI18nModuleManifest,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype AppCenterI18nLocale = \"en\" | \"zh-CN\";\n\nexport const appCenterI18nNamespace = \"appCenter\";\nexport const tuttiI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"appCenterEn\",\n \"zh-CN\": \"appCenterZhCN\"\n },\n name: \"workspace-app-center\",\n namespace: \"appCenter\",\n sourceRoot: \"packages/workspace/app-center/src/ui\"\n});\n\nexport const appCenterEn = {\n actions: {\n cancel: \"Cancel\",\n deleteApp: \"Delete app\",\n exportApp: \"Export\",\n importApp: \"Import\",\n importAppTooltip:\n \"Only valid Tutti app .zip packages are supported. You can export an app and import it here.\",\n installApp: \"Install\",\n loadUnpackedApp: \"Load unpacked\",\n loadUnpackedAppTooltip:\n \"Select a Tutti app directory or a project root with .tutti/dev-app.\",\n moreActions: \"More actions\",\n openApp: \"Open\",\n openAppFolder: \"Open data folder\",\n openAppPackageFolder: \"Open app folder\",\n modifyAppWithAgent: \"Edit with agent\",\n publishAppUpdate: \"Republish\",\n refreshCatalog: \"Refresh catalog\",\n reloadLocalApp: \"Reload\",\n replaceIcon: \"Replace icon\",\n retryApp: \"Retry\",\n restartAndOpenApp: \"Restart and open\",\n updateApp: \"Update\",\n uninstallAndDeleteApp: \"Uninstall and delete\",\n uninstallApp: \"Uninstall\"\n },\n confirmations: {\n deleteAppDescription:\n \"This removes the app from your local apps and deletes its app data.\",\n deleteAppTitle: 'Delete \"{{name}}\"?',\n uninstallAppDescriptionLocal:\n \"This uninstalls the app from this workspace and deletes this workspace's app data. The app stays in My apps.\",\n uninstallAppDescriptionRecommended:\n \"This uninstalls the app from this workspace and deletes this workspace's app data.\",\n uninstallAppTitle: 'Uninstall \"{{name}}\"?',\n updateAppTitle: 'Update \"{{name}}\"?',\n updateRunningAppDescription:\n \"The app will restart after the update finishes to apply changes.\",\n uninstallAndDeleteAppDescription:\n \"This uninstalls the app, deletes its app data, and removes it from your local apps.\",\n uninstallAndDeleteAppTitle: 'Uninstall and delete \"{{name}}\"?'\n },\n factory: {\n actions: {\n cancel: \"Cancel\",\n create: \"Create app\",\n delete: \"Delete\",\n fix: \"Fix\",\n publish: \"Add to my apps\",\n validate: \"Validate\"\n },\n labels: {\n agent: \"Agent\",\n appName: \"App name\",\n create: \"Create app\",\n jobs: \"In progress\",\n model: \"Model\",\n modelReasoning: \"Model and thinking depth\",\n prompt: \"Prompt\",\n reasoningEffort: \"Thinking depth\",\n review: \"Review\",\n templateInspirationPrefix: \"Try these inspirations:\",\n templates: \"Start from\"\n },\n messages: {\n factoryJobFailed: \"Creation failed. Open the agent session for details.\",\n factoryJobFailedWithFix:\n \"Creation failed. Open the agent session or use Fix for details.\",\n loadingConfiguration: \"Loading configuration...\",\n loadingProviders: \"Loading agent providers...\",\n noAgentProviders: \"No available agent providers.\",\n noConfigurationOptions: \"No configuration options available.\",\n noModelOptions: \"No models available.\",\n noPermissionOptions: \"No review options available.\",\n noReasoningEffortOptions: \"No thinking depth options available.\"\n },\n placeholders: {\n appName: \"Name your app\",\n prompt: \"Describe the app to create\"\n },\n prompts: {\n fixDefault: \"Fix the draft so it passes validation.\"\n },\n permissionSemantics: {\n \"accept-edits\": {\n label: \"Accept edits\"\n },\n \"ask-before-write\": {\n label: \"Ask for approval\"\n },\n auto: {\n label: \"Approve for me\"\n },\n \"full-access\": {\n label: \"Full access\"\n },\n \"locked-down\": {\n label: \"Don't ask\"\n },\n unconfigurable: {\n label: \"Fixed mode\"\n }\n },\n templates: {\n lovart: {\n defaultName: \"Lovart Studio\",\n prompt:\n \"Create a local AI brand design studio inspired by Lovart. The app should turn one brand or campaign brief into a coordinated asset board. Provide a concise brief form for brand name, audience, tone, colors, deliverables, and constraints; generate an editable creative direction with palette, typography notes, messaging angles, and art direction; create a checklist of assets such as logo concepts, hero image, product mockups, social posts, ad banners, landing page sections, and short video storyboard frames; produce copy-ready image prompts for each asset with aspect ratio, style, and negative prompt guidance; render the assets in a canvas-like grid with status, notes, and iteration history; let users refine a selected asset with natural-language instructions; keep projects, briefs, generated prompts, notes, and asset states in app data. Use mock generated thumbnails locally unless a host-provided image generation API is available, and clearly show retryable generation errors.\",\n summary:\n \"Brand briefs, coordinated asset boards, and prompt workflows.\",\n title: \"Lovart Studio\"\n },\n lookup: {\n defaultName: \"Answer Book\",\n prompt:\n \"Create an offline answer-book app for playful quick guidance. Let the user type a question, draw one random short answer from a built-in answer deck, show the answer prominently with a redraw action, and keep recent questions and draws in app data. Do not use external network or factual lookup APIs.\",\n summary: \"Offline random answers for user-entered questions.\",\n title: \"Answer book\"\n },\n news: {\n defaultName: \"News Brief\",\n prompt:\n \"Create a news reader app backed by user-configurable RSS or Atom feeds that can be fetched without API keys. On refresh, fetch all saved feeds once, parse and deduplicate items by link or title, and show a concise feed with source names, timestamps, saved topics, and a short brief view. Keep feed and topic preferences in app data, and make feed fetch failures visible and retryable.\",\n summary: \"RSS and Atom feeds, brief views, and saved topics.\",\n title: \"News\"\n },\n gomoku: {\n defaultName: \"Gomoku\",\n prompt:\n \"Create a local Gomoku game app. Render a 15 by 15 board, let two local players alternate black and white stones, detect five in a row horizontally, vertically, or diagonally, show the winner or draw state, and provide restart and undo controls. Keep recent match results and settings in app data, and do not depend on external network services.\",\n summary: \"Local two-player Gomoku with win detection.\",\n title: \"Gomoku\"\n },\n system: {\n defaultName: \"System Monitor\",\n prompt:\n \"Create a local system dashboard inspired by btop. Show CPU, memory, process, network, and disk usage in a dense readable layout. Refresh automatically, keep settings in app data, and avoid external network dependencies.\",\n summary: \"CPU, memory, network, process, and disk usage.\",\n title: \"System dashboard\"\n },\n weather: {\n defaultName: \"Weather Watch\",\n prompt:\n \"Create a weather lookup app backed by Open-Meteo APIs that can be fetched without API keys. Use Open-Meteo geocoding to search locations and Open-Meteo forecast data for current conditions, hourly forecasts, and daily forecasts. Let the user enter and save locations, keep saved locations in app data, refresh selected locations on demand, and clearly surface retryable refresh errors.\",\n summary: \"Current conditions and forecasts for saved locations.\",\n title: \"Weather\"\n }\n },\n status: {\n canceled: \"Canceled\",\n failed: \"Failed\",\n generating: \"Generating\",\n preparing: \"Preparing\",\n published: \"Published\",\n queued: \"Queued\",\n ready: \"Completed\",\n validating: \"Validating\"\n }\n },\n catalogApps: {\n issueManager: {\n description: \"Manage workspace tasks and runs.\",\n name: \"Task Manager\"\n }\n },\n comingSoonApps: {\n productCompetition: {\n category: \"Product design\",\n description:\n \"Compare competitor positioning, features, and experience to support product decisions.\",\n name: \"Competitor Analysis\"\n },\n designReview: {\n category: \"Product design\",\n description:\n \"Review flows, interfaces, and experience issues before release.\",\n name: \"Design Review\"\n },\n groupChat: {\n category: \"Other tools\",\n description: \"Collaborate with multiple agents in a group chat.\",\n name: \"Group Chat\"\n },\n aiPpt: {\n category: \"Daily office\",\n description:\n \"Generate presentation outlines, slide structure, and first-draft content.\",\n name: \"AI PPT\"\n },\n aiDocument: {\n category: \"Daily office\",\n description: \"Draft, rewrite, and organize documents.\",\n name: \"AI Document\"\n },\n aiSheet: {\n category: \"Daily office\",\n description: \"Build spreadsheets and analyze data with AI assistance.\",\n name: \"AI Spreadsheet\"\n },\n openCut: {\n category: \"Content creation\",\n description:\n \"Open-source video editor with media arrangement and timeline editing.\",\n name: \"Open Cut\"\n },\n documentSummarizer: {\n category: \"Other tools\",\n description:\n \"Extract conclusions, key points, and action items from long documents.\",\n name: \"Document Summarizer\"\n }\n },\n categories: {\n contentCreation: \"Content creation\",\n office: \"Daily office\",\n productDesign: \"Product design\",\n tools: \"Other tools\"\n },\n labels: {\n allApps: \"All\",\n appCategories: \"App categories\",\n appList: \"App Center\",\n appPlural: \"Apps\",\n appSingular: \"App\",\n failedCount: \"{{count}} failed\",\n installedAppsTitle: \"{{count}} installed {{appLabel}}\",\n installedCount: \"{{count}} installed\",\n localDev: \"local-dev\",\n myApps: \"My apps\",\n recommendedApps: \"Recommended apps\",\n runningCount: \"{{count}} running\",\n updateAvailable: \"Update to {{version}}\",\n version: \"Version {{version}}\"\n },\n localDev: {\n repairDialog: {\n confirm: \"Ask Agent to fix\",\n description: \"Ask Agent to fix it with one click.\",\n title: \".tutti files not found\"\n },\n repairPrompt:\n 'Load the skill https://github.com/tutti-os/tutti-agent-skills/tree/main/plugins/tutti/skills/tutti-workspace-app-factory and adapt project directory \"{{cwd}}\" into a Tutti local debug app. Generate .tutti/dev-app/; bootstrap.sh must read the host-injected TUTTI_APP_HOST and TUTTI_APP_PORT, and must not hard-code a port.'\n },\n messages: {\n appRuntimeFailed:\n \"The app failed to start. Open its session or logs for details.\",\n catalogFailed:\n \"Remote app catalog is unavailable. Local apps are still available.\",\n catalogLoading: \"Loading remote app catalog...\",\n empty: \"No apps installed yet\",\n myAppsEmpty: \"Imported and created apps will appear here.\",\n recommendedAppsEmpty: \"No recommended apps available.\"\n },\n status: {\n comingSoon: \"Coming soon\",\n failed: \"Failed\",\n installProgress: {\n downloadedOfTotal: \"{{downloaded}} / {{total}}\",\n downloading: \"Downloading…\",\n installing: \"Installing…\",\n progressAria: \"App install progress\",\n starting: \"Starting…\"\n },\n installing: \"Installing\",\n installedPendingRestart: \"New version installed. Restart to apply.\",\n preparing: \"Preparing\",\n running: \"Running\",\n starting: \"Starting\",\n stopping: \"Stopping\",\n unavailable: \"Unavailable\"\n },\n title: \"App Center\"\n} as const satisfies I18nDictionary;\n\nexport const appCenterZhCN = {\n actions: {\n cancel: \"取消\",\n deleteApp: \"删除应用\",\n exportApp: \"导出\",\n importApp: \"导入\",\n importAppTooltip:\n \"仅支持符合规范的 Tutti 应用 .zip 包。你可以先导出应用,再在这里导入。\",\n installApp: \"安装\",\n loadUnpackedApp: \"加载未打包的本地程序\",\n loadUnpackedAppTooltip:\n \"选择 Tutti 应用目录,或包含 .tutti/dev-app 的项目根目录。\",\n moreActions: \"更多操作\",\n openApp: \"打开\",\n openAppFolder: \"打开数据目录\",\n openAppPackageFolder: \"打开应用目录\",\n modifyAppWithAgent: \"用智能体编辑\",\n publishAppUpdate: \"重新发布\",\n refreshCatalog: \"刷新目录\",\n reloadLocalApp: \"重新加载\",\n replaceIcon: \"替换图标\",\n retryApp: \"重试\",\n restartAndOpenApp: \"重启并打开\",\n updateApp: \"更新\",\n uninstallAndDeleteApp: \"卸载并删除\",\n uninstallApp: \"卸载\"\n },\n confirmations: {\n deleteAppDescription: \"这会从本地应用列表删除该应用,并删除它的应用数据。\",\n deleteAppTitle: \"删除“{{name}}”?\",\n uninstallAppDescriptionLocal:\n \"这会从当前工作区卸载该应用,并删除此工作区中的应用数据。应用本体仍保留在我的应用中。\",\n uninstallAppDescriptionRecommended:\n \"这会从当前工作区卸载该应用,并删除此工作区中的应用数据。\",\n uninstallAppTitle: \"卸载“{{name}}”?\",\n updateAppTitle: \"更新“{{name}}”?\",\n updateRunningAppDescription: \"更新完成后会重启应用以应用更改。\",\n uninstallAndDeleteAppDescription:\n \"这会卸载该应用、删除应用数据,并从本地应用列表移除。\",\n uninstallAndDeleteAppTitle: \"卸载并删除“{{name}}”?\"\n },\n factory: {\n actions: {\n cancel: \"取消\",\n create: \"创建应用\",\n delete: \"删除\",\n fix: \"修复\",\n publish: \"添加至我的应用\",\n validate: \"验证\"\n },\n labels: {\n agent: \"Agent\",\n appName: \"应用名称\",\n create: \"创建应用\",\n jobs: \"进行中\",\n model: \"模型\",\n modelReasoning: \"模型与思考深度\",\n prompt: \"提示词\",\n reasoningEffort: \"思考深度\",\n review: \"审查\",\n templateInspirationPrefix: \"试试这些灵感:\",\n templates: \"选择起点\"\n },\n messages: {\n factoryJobFailed: \"创建失败,打开 Agent 会话查看详情。\",\n factoryJobFailedWithFix: \"创建失败,打开 Agent 会话或使用修复查看详情。\",\n loadingConfiguration: \"正在加载配置...\",\n loadingProviders: \"正在加载 Agent Provider...\",\n noAgentProviders: \"暂无可用的 Agent Provider。\",\n noConfigurationOptions: \"暂无可用配置项。\",\n noModelOptions: \"暂无可用模型。\",\n noPermissionOptions: \"暂无可用的审查选项。\",\n noReasoningEffortOptions: \"暂无可用的思考深度选项。\"\n },\n placeholders: {\n appName: \"输入应用名称\",\n prompt: \"描述要创建的应用\"\n },\n prompts: {\n fixDefault: \"修复当前草稿,让它通过验证。\"\n },\n permissionSemantics: {\n \"accept-edits\": {\n label: \"接受编辑\"\n },\n \"ask-before-write\": {\n label: \"请求批准\"\n },\n auto: {\n label: \"替我审批\"\n },\n \"full-access\": {\n label: \"完全访问\"\n },\n \"locked-down\": {\n label: \"不再询问\"\n },\n unconfigurable: {\n label: \"固定模式\"\n }\n },\n templates: {\n lovart: {\n defaultName: \"Lovart Studio\",\n prompt:\n \"创建一个受 Lovart 启发的本地 AI 品牌设计工作室应用。应用需要把一句品牌或营销活动 brief 转成一组统一风格的资产看板。提供简洁的 brief 表单,字段包括品牌名、受众、语气、颜色、交付物和约束;生成可编辑的创意方向,包含色板、字体建议、信息表达角度和视觉方向;创建资产清单,例如 logo 概念、主视觉、产品 mockup、社媒帖子、广告横幅、落地页区块和短视频分镜;为每个资产生成可复制的图片提示词,包含画幅比例、风格和负面提示词建议;用类似画布的网格展示资产、状态、备注和迭代历史;允许用户用自然语言细化选中的资产;把项目、brief、生成提示词、备注和资产状态保存在应用数据目录。没有宿主提供的图片生成 API 时使用本地 mock 缩略图,并清楚展示可重试的生成失败状态。\",\n summary: \"品牌 brief、统一资产看板和提示词工作流。\",\n title: \"Lovart Studio\"\n },\n lookup: {\n defaultName: \"答案之书\",\n prompt:\n \"创建一个离线的答案之书应用,用于给用户输入的问题提供轻量随机指引。允许用户输入问题,从内置答案卡组里随机抽取一句短答案,突出展示答案,并提供重新抽取操作;把最近问题和抽取记录保存在应用数据目录。不要依赖外部网络或事实查询 API。\",\n summary: \"面向用户输入问题的离线随机答案。\",\n title: \"答案之书\"\n },\n news: {\n defaultName: \"新闻简报\",\n prompt:\n \"创建一个新闻阅读应用,使用用户可配置且无需 API Key 的 RSS 或 Atom feed 作为数据源。刷新时一次性抓取所有已保存 feed,解析并按链接或标题去重,展示简洁信息流、来源名称、时间、已保存主题和简报视图;把 feed 和主题偏好保存在应用数据目录,并让 feed 抓取失败状态可见且可重试。\",\n summary: \"RSS 和 Atom 信息流、简报视图和关注主题。\",\n title: \"新闻\"\n },\n gomoku: {\n defaultName: \"五子棋\",\n prompt:\n \"创建一个本地五子棋小游戏应用。渲染 15 x 15 棋盘,支持两名本地玩家轮流落黑白棋,检测横向、纵向和斜向五子连珠,展示胜负或平局状态,并提供重新开始和悔棋控制。把最近对局结果和设置保存在应用数据目录,不依赖外部网络服务。\",\n summary: \"带胜负检测的本地双人五子棋。\",\n title: \"五子棋\"\n },\n system: {\n defaultName: \"系统监控\",\n prompt:\n \"创建一个类似 btop 的本地系统看板。用紧凑清晰的布局展示 CPU、内存、进程、网络和磁盘占用;自动刷新,把设置保存在应用数据目录,并避免依赖外部网络。\",\n summary: \"CPU、内存、网络、进程和磁盘占用。\",\n title: \"系统看板\"\n },\n weather: {\n defaultName: \"天气查询\",\n prompt:\n \"创建一个天气查询应用,使用无需 API Key 的 Open-Meteo 数据源。用 Open-Meteo geocoding 搜索地点,用 Open-Meteo forecast 获取当前天气、小时预报和每日预报;允许用户输入并保存地点,把保存的地点放在应用数据目录,支持按需刷新选中地点,并清楚展示可重试的刷新失败状态。\",\n summary: \"保存地点的当前天气和预报。\",\n title: \"天气\"\n }\n },\n status: {\n canceled: \"已取消\",\n failed: \"失败\",\n generating: \"生成中\",\n preparing: \"准备中\",\n published: \"已发布\",\n queued: \"排队中\",\n ready: \"已完成\",\n validating: \"验证中\"\n }\n },\n catalogApps: {\n issueManager: {\n description: \"管理工作区任务和运行记录。\",\n name: \"任务管理\"\n }\n },\n comingSoonApps: {\n productCompetition: {\n category: \"产品设计\",\n description: \"对比竞品定位、功能和体验,辅助产品决策\",\n name: \"竞品分析\"\n },\n designReview: {\n category: \"产品设计\",\n description: \"检查流程、界面和体验问题\",\n name: \"设计评审\"\n },\n groupChat: {\n category: \"其他工具\",\n description: \"在群里和多个 Agent 一起协作\",\n name: \"群聊\"\n },\n aiPpt: {\n category: \"日常办公\",\n description: \"生成演示大纲、页面结构和初稿内容\",\n name: \"AI PPT\"\n },\n aiDocument: {\n category: \"日常办公\",\n description: \"起草、改写和整理文档\",\n name: \"AI 文档\"\n },\n aiSheet: {\n category: \"日常办公\",\n description: \"用 AI 辅助搭建表格、分析数据\",\n name: \"AI 表格\"\n },\n openCut: {\n category: \"内容创作\",\n description: \"开源视频剪辑工具,支持素材编排和时间线编辑\",\n name: \"Open Cut\"\n },\n documentSummarizer: {\n category: \"其他工具\",\n description: \"提炼长文档的结论、要点和行动项\",\n name: \"文档总结器\"\n }\n },\n categories: {\n contentCreation: \"内容创作\",\n office: \"日常办公\",\n productDesign: \"产品设计\",\n tools: \"其他工具\"\n },\n labels: {\n allApps: \"全部\",\n appCategories: \"应用分类\",\n appList: \"应用中心\",\n appPlural: \"App\",\n appSingular: \"App\",\n failedCount: \"{{count}} 个失败\",\n installedAppsTitle: \"已安装 {{count}} 个 {{appLabel}}\",\n installedCount: \"已安装 {{count}} 个\",\n localDev: \"本地调试\",\n myApps: \"我的应用\",\n recommendedApps: \"推荐应用\",\n runningCount: \"{{count}} 个运行中\",\n updateAvailable: \"更新到 {{version}}\",\n version: \"版本 {{version}}\"\n },\n localDev: {\n repairDialog: {\n confirm: \"让 Agent 修复\",\n description: \"可一键让 Agent 为你修复。\",\n title: \"目录未识别到 .tutti 文件\"\n },\n repairPrompt:\n \"加载 skill https://github.com/tutti-os/tutti-agent-skills/tree/main/plugins/tutti/skills/tutti-workspace-app-factory,将项目目录“{{cwd}}”适配成本地调试 Tutti 应用。生成 .tutti/dev-app/;bootstrap.sh 必须读取宿主注入的 TUTTI_APP_HOST 和 TUTTI_APP_PORT,不要硬编码端口。\"\n },\n messages: {\n appRuntimeFailed: \"应用启动失败。请打开会话或日志查看详情。\",\n catalogFailed: \"无法加载远程应用目录,本地应用仍可用。\",\n catalogLoading: \"正在加载远程应用目录...\",\n empty: \"还没有安装应用\",\n myAppsEmpty: \"导入或创建的应用会显示在这里\",\n recommendedAppsEmpty: \"暂无推荐应用\"\n },\n status: {\n comingSoon: \"敬请期待\",\n failed: \"失败\",\n installProgress: {\n downloadedOfTotal: \"{{downloaded}} / {{total}}\",\n downloading: \"正在下载…\",\n installing: \"正在安装…\",\n progressAria: \"应用安装进度\",\n starting: \"正在启动…\"\n },\n installing: \"安装中\",\n installedPendingRestart: \"新版已安装,重启后生效\",\n preparing: \"准备中\",\n running: \"运行中\",\n starting: \"启动中\",\n stopping: \"停止中\",\n unavailable: \"不可用\"\n },\n title: \"应用中心\"\n} as const satisfies I18nDictionary;\n\nexport type AppCenterI18nKey = string;\n\nexport type AppCenterI18nRuntime = I18nRuntime<AppCenterI18nKey>;\n\nconst appCenterDefaults: Record<AppCenterI18nLocale, I18nDictionary> = {\n en: appCenterEn,\n \"zh-CN\": appCenterZhCN\n};\n\nexport const appCenterI18nResources = {\n en: {\n [appCenterI18nNamespace]: appCenterDefaults.en\n },\n \"zh-CN\": {\n [appCenterI18nNamespace]: appCenterDefaults[\"zh-CN\"]\n }\n} as const satisfies Record<AppCenterI18nLocale, I18nDictionary>;\n\nconst defaultAppCenterI18n = createI18nRuntime({\n dictionaries: [appCenterI18nResources.en]\n});\n\nexport function createAppCenterI18nRuntime(\n runtime: I18nRuntime<string> | undefined\n): AppCenterI18nRuntime {\n return createScopedI18nRuntime<AppCenterI18nKey>(\n runtime ?? defaultAppCenterI18n,\n appCenterI18nNamespace\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/ui/index.js
CHANGED
|
@@ -42,6 +42,7 @@ var AppCard = memo(function AppCard2({
|
|
|
42
42
|
version: app.availableVersion
|
|
43
43
|
}) : copy.t("actions.updateApp") : app.primaryAction === "restartAndOpen" ? copy.t("actions.restartAndOpenApp") : copy.t("actions.openApp");
|
|
44
44
|
const canExecutePrimaryAction = app.primaryAction !== "none";
|
|
45
|
+
const primaryActionTitle = canExecutePrimaryAction ? primaryActionLabel : statusButtonTitle;
|
|
45
46
|
const canOpenFromCard = app.canOpen;
|
|
46
47
|
const canPublishFactoryUpdate = app.canPublishFactoryUpdate && !!app.factoryJobId;
|
|
47
48
|
const canOpenFactorySession = app.canOpenFactorySession && !!app.factoryAgentSessionId && !!app.factoryJobId;
|
|
@@ -104,7 +105,7 @@ var AppCard = memo(function AppCard2({
|
|
|
104
105
|
onClick: executeCardAction,
|
|
105
106
|
onKeyDown: handleCardKeyDown,
|
|
106
107
|
children: [
|
|
107
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
108
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start justify-between gap-3", children: [
|
|
108
109
|
/* @__PURE__ */ jsx(
|
|
109
110
|
AppIcon,
|
|
110
111
|
{
|
|
@@ -113,7 +114,7 @@ var AppCard = memo(function AppCard2({
|
|
|
113
114
|
onReplaceIcon: handleReplaceIcon
|
|
114
115
|
}
|
|
115
116
|
),
|
|
116
|
-
/* @__PURE__ */ jsxs("div", { className: "flex
|
|
117
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center justify-end gap-1", children: [
|
|
117
118
|
/* @__PURE__ */ jsx("div", { className: "flex size-8 shrink-0 items-center justify-center", children: hasMoreActions ? /* @__PURE__ */ jsx(
|
|
118
119
|
AppCardMoreActions,
|
|
119
120
|
{
|
|
@@ -124,25 +125,25 @@ var AppCard = memo(function AppCard2({
|
|
|
124
125
|
copy
|
|
125
126
|
}
|
|
126
127
|
) : null }),
|
|
127
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
128
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
128
129
|
/* @__PURE__ */ jsx(
|
|
129
130
|
Button,
|
|
130
131
|
{
|
|
131
132
|
className: cn(
|
|
132
|
-
"min-w-
|
|
133
|
+
"min-w-0 max-w-full shrink truncate px-2",
|
|
133
134
|
!canExecutePrimaryAction ? "cursor-default" : null,
|
|
134
135
|
canExecutePrimaryAction ? app.primaryAction === "retry" ? statusClassName(app.status) : "text-[var(--text-primary)]" : statusClassName(app.status)
|
|
135
136
|
),
|
|
136
137
|
disabled: !canExecutePrimaryAction,
|
|
137
138
|
size: "default",
|
|
138
|
-
title:
|
|
139
|
+
title: primaryActionTitle,
|
|
139
140
|
type: "button",
|
|
140
141
|
variant: "ghost",
|
|
141
142
|
onClick: (event) => {
|
|
142
143
|
event.stopPropagation();
|
|
143
144
|
executePrimaryAction();
|
|
144
145
|
},
|
|
145
|
-
children: canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel
|
|
146
|
+
children: /* @__PURE__ */ jsx("span", { className: "block min-w-0 max-w-full truncate", children: canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel })
|
|
146
147
|
}
|
|
147
148
|
),
|
|
148
149
|
showInstallProgressRing ? /* @__PURE__ */ jsx(
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { KeyboardEvent, ReactElement } from \"react\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n RefreshIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppInstallProgress } from \"../contracts/runtime.ts\";\nimport type {\n WorkspaceAppLocalRepairAgentRequest,\n WorkspaceAppLocalRepairRequest\n} from \"../contracts/host.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\n\nexport interface AppCenterFactoryProviderOption {\n readonly disabled?: boolean;\n readonly disabledReason?: string;\n readonly iconUrl?: string | null;\n readonly label: string;\n readonly provider: string;\n}\n\nexport interface AppCenterFactoryModelOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryReasoningOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryPermissionOption {\n readonly label: string;\n readonly semantic?: string | null;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryProviderConfiguration {\n readonly defaultModel?: string | null;\n readonly defaultPermissionModeId?: string | null;\n readonly defaultReasoningEffort?: string | null;\n readonly modelOptions: readonly AppCenterFactoryModelOption[];\n readonly permissionModeOptions: readonly AppCenterFactoryPermissionOption[];\n readonly reasoningEffortOptions: readonly AppCenterFactoryReasoningOption[];\n}\n\nexport interface AppCenterHostActions {\n readonly cancelFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly createFactoryJob?: (input: {\n displayName: string;\n model?: string;\n permissionModeId?: string;\n provider?: string;\n prompt: string;\n reasoningEffort?: string;\n }) => Promise<void> | void;\n readonly deleteApp?: (appId: string, appName: string) => Promise<void> | void;\n readonly deleteFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly exportApp?: (appId: string) => Promise<void> | void;\n readonly fixFactoryJob?: (\n jobId: string,\n prompt: string\n ) => Promise<void> | void;\n readonly importApp?: () => Promise<void> | void;\n readonly installApp?: (appId: string) => Promise<void> | void;\n readonly loadLocalApp?: () =>\n | Promise<WorkspaceAppLocalRepairRequest | null | void>\n | WorkspaceAppLocalRepairRequest\n | null\n | void;\n readonly openApp?: (\n appId: string,\n context?: WorkspaceAppActionContext\n ) => Promise<void> | void;\n readonly openAppFolder?: (appId: string) => Promise<void> | void;\n readonly openAppPackageFolder?: (appId: string) => Promise<void> | void;\n readonly openFactoryJobAgentSession?: (\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly modifyAppWithAgent?: (\n jobId: string,\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly publishFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly repairLocalApp?: (\n request: WorkspaceAppLocalRepairAgentRequest\n ) => Promise<void> | void;\n readonly replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly reloadLocalApp?: (appId: string) => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\n readonly restartAndOpenApp?: (appId: string) => Promise<void> | void;\n readonly updateApp?: (\n appId: string,\n trigger: \"badge_button\" | \"primary_action\"\n ) => Promise<void> | void;\n readonly uninstallApp?: (appId: string) => Promise<void> | void;\n}\n\nexport interface AppCardProps {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n}\n\nexport const AppCard = memo(function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const installBusy =\n app.installProgress != null || app.status === \"installing\";\n const busyStatusLabel = installBusy\n ? copy.t(\"status.installing\")\n : statusLabel;\n const showInstallProgressRing = installBusy;\n const statusButtonTitle = app.installProgress\n ? resolveInstallProgressTitle(copy, app.installProgress, busyStatusLabel)\n : statusLabel;\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? app.availableVersion\n ? copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })\n : copy.t(\"actions.updateApp\")\n : app.primaryAction === \"restartAndOpen\"\n ? copy.t(\"actions.restartAndOpenApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\n const canOpenFromCard = app.canOpen;\n const canPublishFactoryUpdate =\n app.canPublishFactoryUpdate && !!app.factoryJobId;\n const canOpenFactorySession =\n app.canOpenFactorySession &&\n !!app.factoryAgentSessionId &&\n !!app.factoryJobId;\n const actionContext = useMemo(\n () => createWorkspaceAppActionContext(app),\n [app]\n );\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canReloadLocal ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = useCallback((): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"restartAndOpen\") {\n void actions.restartAndOpenApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, app.primaryAction]);\n const executeCardAction = useCallback((): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, canOpenFromCard]);\n const handleCardKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): void => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n },\n [canOpenFromCard, executeCardAction]\n );\n const handleReplaceIcon = useCallback((): void => {\n void actions.replaceAppIcon?.(app.id);\n }, [actions, app.id]);\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"flex 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 {app.canReloadLocal ? (\n <span className=\"min-w-0 flex-none rounded-[5px] border border-[color:var(--line-2)] px-1.5 py-0 text-[10px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.localDev\")}\n </span>\n ) : null}\n </div>\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n </div>\n ) : null}\n </div>\n </article>\n );\n});\n\nfunction createWorkspaceAppActionContext(\n app: WorkspaceAppCardViewModel\n): WorkspaceAppActionContext {\n return {\n installationId: app.installationId ?? null,\n runtimeId: app.runtimeId ?? null,\n launchUrl: app.launchUrl ?? null\n };\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n if (app.factoryEditAction === \"open_session\") {\n void actions.openFactoryJobAgentSession?.(\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n return;\n }\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.canReloadLocal) {\n menuItems.push({\n icon: <RefreshIcon />,\n key: \"reload-local\",\n label: copy.t(\"actions.reloadLocalApp\"),\n onSelect: () => {\n void actions.reloadLocalApp?.(app.id);\n }\n });\n }\n\n if (app.canOpenFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-folder\",\n label: copy.t(\"actions.openAppFolder\"),\n onSelect: () => {\n void actions.openAppFolder?.(app.id);\n }\n });\n }\n\n if (app.canOpenPackageFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-package-folder\",\n label: copy.t(\"actions.openAppPackageFolder\"),\n onSelect: () => {\n void actions.openAppPackageFolder?.(app.id);\n }\n });\n }\n\n if (app.canExport) {\n menuItems.push({\n icon: <UploadIcon />,\n key: \"export\",\n label: copy.t(\"actions.exportApp\"),\n onSelect: () => {\n void actions.exportApp?.(app.id);\n }\n });\n }\n\n if (app.canUninstall) {\n menuItems.push({\n icon: <UninstallIcon />,\n key: \"uninstall\",\n label: copy.t(\"actions.uninstallApp\"),\n onSelect: () => {\n void actions.uninstallApp?.(app.id);\n },\n variant: \"destructive\"\n });\n }\n\n if (app.canDelete) {\n menuItems.push({\n icon: <DeleteIcon />,\n key: \"delete\",\n label: copy.t(\n app.installed ? \"actions.uninstallAndDeleteApp\" : \"actions.deleteApp\"\n ),\n onSelect: () => {\n void actions.deleteApp?.(app.id, app.name);\n },\n variant: \"destructive\"\n });\n }\n\n return (\n <AppCenterActionMenu\n ariaLabel={copy.t(\"actions.moreActions\")}\n attention={canPublishFactoryUpdate}\n items={menuItems}\n triggerTitle={copy.t(\"actions.moreActions\")}\n />\n );\n}\n\ninterface AppCenterActionMenuItem {\n readonly attention?: boolean;\n readonly icon: ReactElement;\n readonly key: string;\n readonly label: string;\n readonly onSelect: () => void;\n readonly variant?: \"default\" | \"destructive\";\n}\n\nfunction AppCenterActionMenu({\n ariaLabel,\n attention = false,\n items,\n triggerTitle\n}: {\n readonly ariaLabel: string;\n readonly attention?: boolean;\n readonly items: readonly AppCenterActionMenuItem[];\n readonly triggerTitle: string;\n}): ReactElement {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={ariaLabel}\n className=\"relative\"\n size=\"icon\"\n title={triggerTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon />\n {attention ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-[var(--state-danger)] shadow-[0_0_0_2px_var(--background-fronted)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[192px]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <DropdownMenuGroup className=\"gap-[2px]\">\n {items.map((item) => (\n <DropdownMenuItem\n className=\"font-normal\"\n key={item.key}\n variant={item.variant}\n onSelect={(event) => {\n event.stopPropagation();\n item.onSelect();\n }}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.attention ? (\n <i\n aria-hidden=\"true\"\n className=\"ml-2 block size-1.5 shrink-0 rounded-full bg-[var(--state-danger)] not-italic\"\n />\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AppIcon({\n app,\n onReplaceIcon,\n replaceIconLabel\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly onReplaceIcon: () => void;\n readonly replaceIconLabel: string;\n}): ReactElement {\n const icon =\n app.icon?.type === \"asset\" ? (\n <img\n alt=\"\"\n className=\"size-11 flex-none rounded-[10px] object-contain object-center select-none\"\n draggable={false}\n src={app.icon.src}\n />\n ) : (\n <span className=\"flex size-11 flex-none items-center justify-center rounded-[10px] bg-[var(--transparency-block)] text-[var(--text-secondary)]\">\n <NavApplicationsFilledIcon className=\"size-[22px]\" />\n </span>\n );\n\n return (\n <span className=\"group/app-icon relative block size-11 flex-none\">\n {icon}\n {app.canReplaceIcon ? (\n <button\n aria-label={replaceIconLabel}\n className=\"absolute inset-0 flex size-11 items-center justify-center rounded-[10px] bg-black/55 p-0 text-white opacity-0 transition-opacity duration-150 group-hover/app-icon:opacity-100 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)]\"\n title={replaceIconLabel}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.blur();\n onReplaceIcon();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <EditIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AppInstallProgressRing({\n ariaLabel,\n fallbackPercent,\n progress\n}: {\n readonly ariaLabel: string;\n readonly fallbackPercent: number;\n readonly progress: WorkspaceAppInstallProgress | null | undefined;\n}): ReactElement {\n const percent =\n progress == null\n ? Math.max(0, Math.min(100, Math.round(fallbackPercent)))\n : Math.max(0, Math.min(100, Math.round(progress.overallPercent)));\n\n return (\n <span\n aria-label={ariaLabel}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={percent}\n className=\"relative inline-flex size-[14px] shrink-0 items-center justify-center rounded-full\"\n role=\"progressbar\"\n style={{\n background: `conic-gradient(var(--text-secondary) ${percent}%, color-mix(in srgb, var(--text-secondary) 24%, transparent) 0)`\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-[2px] rounded-full bg-[var(--surface-panel)]\"\n />\n </span>\n );\n}\n\nfunction resolveInstallProgressTitle(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress,\n statusLabel: string\n): string {\n const byteLabel = formatInstallProgressBytes(copy, progress);\n const percent = Math.max(\n 0,\n Math.min(100, Math.round(progress.overallPercent))\n );\n if (byteLabel) {\n return `${statusLabel} · ${byteLabel} · ${percent}%`;\n }\n return `${statusLabel} · ${percent}%`;\n}\n\nfunction formatInstallProgressBytes(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress\n): string | null {\n if (\n progress.userPhase !== \"downloading\" ||\n progress.downloadedBytes == null\n ) {\n return null;\n }\n const downloaded = formatByteSize(progress.downloadedBytes);\n if (progress.totalBytes == null || progress.totalBytes <= 0) {\n return downloaded;\n }\n return copy.t(\"status.installProgress.downloadedOfTotal\", {\n downloaded,\n total: formatByteSize(progress.totalBytes)\n });\n}\n\nfunction formatByteSize(value: number): string {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n const precision = size >= 10 || unitIndex === 0 ? 0 : 1;\n return `${size.toFixed(precision)} ${units[unitIndex]}`;\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"unavailable\") {\n return \"text-[var(--state-warning)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n ImportLinedIcon as ImportIcon,\n Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n 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 UploadFolderIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppLocalRepairRequest } from \"../contracts/host.ts\";\nimport {\n sortMyAppsByCreatedDesc,\n sortRecommendedApps,\n sortRecommendedAppsForAllTab\n} from \"../core/appCenterAppOrdering.ts\";\nimport {\n resolveDefaultAppFactoryProvider,\n resolveSelectedAppFactoryProvider\n} from \"../core/appFactoryProviderDefaults.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\nimport {\n AppCard,\n type AppCenterFactoryProviderConfiguration,\n type AppCenterFactoryProviderOption,\n type AppCenterFactoryPermissionOption,\n type AppCenterHostActions\n} from \"./AppCard.tsx\";\n\ntype FactoryTemplateID =\n | \"lovart\"\n | \"weather\"\n | \"lookup\"\n | \"system\"\n | \"news\"\n | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"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.lovart.defaultName\",\n id: \"lovart\",\n promptKey: \"factory.templates.lovart.prompt\",\n titleKey: \"factory.templates.lovart.title\"\n },\n {\n defaultNameKey: \"factory.templates.weather.defaultName\",\n id: \"weather\",\n promptKey: \"factory.templates.weather.prompt\",\n titleKey: \"factory.templates.weather.title\"\n },\n {\n defaultNameKey: \"factory.templates.lookup.defaultName\",\n id: \"lookup\",\n promptKey: \"factory.templates.lookup.prompt\",\n titleKey: \"factory.templates.lookup.title\"\n },\n {\n defaultNameKey: \"factory.templates.system.defaultName\",\n id: \"system\",\n promptKey: \"factory.templates.system.prompt\",\n titleKey: \"factory.templates.system.title\"\n },\n {\n defaultNameKey: \"factory.templates.news.defaultName\",\n id: \"news\",\n promptKey: \"factory.templates.news.prompt\",\n titleKey: \"factory.templates.news.title\"\n },\n {\n defaultNameKey: \"factory.templates.gomoku.defaultName\",\n id: \"gomoku\",\n promptKey: \"factory.templates.gomoku.prompt\",\n titleKey: \"factory.templates.gomoku.title\"\n }\n];\n\nconst recommendedCategoryTabDefinitions: readonly (\n | {\n readonly id: \"all\";\n readonly labelKey: null;\n }\n | {\n readonly id: Exclude<RecommendedCategoryTabID, \"all\">;\n readonly labelKey: string;\n }\n)[] = [\n { id: \"all\", labelKey: null },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"office\", labelKey: \"categories.office\" },\n { id: \"tools\", labelKey: \"categories.tools\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [pendingLocalRepairRequest, setPendingLocalRepairRequest] =\n useState<WorkspaceAppLocalRepairRequest | null>(null);\n const [updateAppBusy, setUpdateAppBusy] = useState(false);\n const [localRepairBusy, setLocalRepairBusy] = useState(false);\n const [pendingUpdateApp, setPendingUpdateApp] = useState<{\n id: string;\n name: string;\n trigger: \"badge_button\" | \"primary_action\";\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const loadLocalApp = (): void => {\n void Promise.resolve(actions.loadLocalApp?.()).then((request) => {\n if (request) {\n setPendingLocalRepairRequest(request);\n }\n });\n };\n const cardActions = useMemo<AppCenterHostActions>(\n () => ({\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n },\n updateApp: (appId, trigger) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n 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 const localRepairDialogTitle = copy.t(\"localDev.repairDialog.title\");\n const localRepairDialogDescription = copy.t(\n \"localDev.repairDialog.description\"\n );\n\n return (\n <section\n aria-label={copy.t(\"title\")}\n className={cn(\n \"relative flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)]\",\n className\n )}\n >\n {statusToast ? <AppCenterStatusToast toast={statusToast} /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-auto px-6 pt-5 [container-type:inline-size]\">\n <section className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex h-8 min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n className=\"h-8\"\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex h-8 shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n onLoadLocalApp={loadLocalApp}\n />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\n {activeAppTab === \"my\" && hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[11px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\n job.canFix\n ? \"factory.messages.factoryJobFailedWithFix\"\n : \"factory.messages.factoryJobFailed\"\n )}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[11px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={updateAppBusy}\n confirmLabel={copy.t(\"actions.updateApp\")}\n description={copy.t(\"confirmations.updateRunningAppDescription\")}\n open={pendingUpdateApp != null}\n title={updateAppConfirmTitle}\n onConfirm={() => {\n const app = pendingUpdateApp;\n if (!app) {\n return;\n }\n setUpdateAppBusy(true);\n void Promise.resolve(\n actions.updateApp?.(app.id, app.trigger)\n ).finally(() => {\n setUpdateAppBusy(false);\n setPendingUpdateApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !updateAppBusy) {\n setPendingUpdateApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={localRepairBusy}\n confirmLabel={copy.t(\"localDev.repairDialog.confirm\")}\n description={localRepairDialogDescription}\n open={pendingLocalRepairRequest != null}\n title={localRepairDialogTitle}\n onConfirm={() => {\n const request = pendingLocalRepairRequest;\n if (!request) {\n return;\n }\n setLocalRepairBusy(true);\n void Promise.resolve(\n actions.repairLocalApp?.({\n ...request,\n prompt: copy.t(\"localDev.repairPrompt\", {\n cwd: request.projectDir\n })\n })\n ).finally(() => {\n setLocalRepairBusy(false);\n setPendingLocalRepairRequest(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !localRepairBusy) {\n setPendingLocalRepairRequest(null);\n }\n }}\n />\n <Dialog\n open={factoryDialogOpen}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n closeFactoryDialog();\n return;\n }\n openFactoryDialog();\n }}\n >\n <DialogContent\n className=\"sm:max-w-[min(640px,calc(100%-2rem))]\"\n showCloseButton={false}\n >\n <form\n className=\"grid max-h-[min(760px,calc(100vh-64px))] min-w-0 gap-4 overflow-auto\"\n onSubmit={submitCreate}\n >\n <DialogHeader>\n <DialogTitle>{copy.t(\"factory.labels.create\")}</DialogTitle>\n </DialogHeader>\n <label className=\"grid min-w-0 gap-2\">\n <span className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.appName\")}\n </span>\n <Input\n autoFocus\n className=\"h-9 rounded-[8px]\"\n placeholder={copy.t(\"factory.placeholders.appName\")}\n value={displayName}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n />\n </label>\n <div className=\"grid min-w-0 gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <label\n className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n htmlFor={promptTextareaId}\n >\n {copy.t(\"factory.labels.prompt\")}\n </label>\n <div className=\"relative min-w-0\">\n <Textarea\n className=\"min-h-[148px] resize-none rounded-[10px] pb-14 leading-[1.45] sm:pb-8\"\n id={promptTextareaId}\n placeholder={copy.t(\"factory.placeholders.prompt\")}\n value={prompt}\n onChange={(event) => setPrompt(event.currentTarget.value)}\n />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-1.5 flex min-w-0 flex-wrap items-end justify-between gap-2\">\n {providerErrorMessage &&\n normalizedProviderOptions.length === 0 ? (\n <p className=\"pointer-events-auto max-w-[240px] text-[11px] leading-4 text-[var(--state-danger)]\">\n {providerErrorMessage}\n </p>\n ) : (\n <span aria-hidden=\"true\" className=\"min-h-4 flex-1\" />\n )}\n <div className=\"pointer-events-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-0.5 px-0.5 py-0\">\n <FactoryProviderSelect\n copy={copy}\n errorMessage={providerErrorMessage}\n loading={providerLoading}\n open={openFactorySettingsMenu === \"provider\"}\n options={normalizedProviderOptions}\n selectedProvider={selectedProvider}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent data-[placeholder]:text-[var(--text-tertiary)]\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"provider\" : null\n )\n }\n onSelectProvider={setSelectedProvider}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryPermissionDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n open={openFactorySettingsMenu === \"permission\"}\n options={permissionModeOptions}\n selectedPermissionModeId={selectedPermissionModeId}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"permission\" : null\n )\n }\n onSelectPermissionMode={setSelectedPermissionModeId}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <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={selectedProvider}\n onOpenChange={onOpenChange}\n onValueChange={onSelectProvider}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.agent\")}\n className={cn(\n \"h-9 w-full rounded-[8px] px-3 font-normal [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:min-w-0 [&_[data-slot=select-value]]:items-center [&_[data-slot=select-value]]:gap-2\",\n loading && options.length === 0 ? \"animate-pulse\" : null,\n triggerClassName\n )}\n >\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={selectedOption.iconUrl} />\n <span className=\"truncate\">{selectedOption.label}</span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n className=\"w-[300px] min-w-[240px] max-w-[min(100vw-64px,480px)]\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length === 0 ? (\n <SelectItem disabled value=\"__no-provider__\">\n {copy.t(\"factory.messages.noAgentProviders\")}\n </SelectItem>\n ) : (\n options.map((option) => (\n <SelectItem\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n value={option.provider}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={option.iconUrl} />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryPermissionDropdown({\n copy,\n loading,\n onOpenChange,\n onSelectPermissionMode,\n open,\n options,\n selectedPermissionModeId,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectPermissionMode: (value: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryPermissionOption[];\n selectedPermissionModeId: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.value === selectedPermissionModeId) ?? null;\n const disabled = loading || options.length === 0;\n const selectedLabel = selectedOption\n ? permissionOptionLabel(copy, selectedOption)\n : selectedPermissionModeId;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedPermissionModeId}\n onOpenChange={onOpenChange}\n onValueChange={onSelectPermissionMode}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.review\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center overflow-hidden\">\n {selectedLabel ? (\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noPermissionOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[220px] max-w-[min(100vw-32px,360px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">\n {permissionOptionLabel(copy, option)}\n </span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noPermissionOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction 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 : \"\"\n : selectedReasoningEffort\n ? `reasoning:${selectedReasoningEffort}`\n : \"\";\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\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center 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 className=\"flex min-w-0 shrink-0 flex-col\">\n <div\n aria-label={title}\n className=\"grid min-h-0 min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,260px),1fr))] gap-3\"\n role=\"list\"\n >\n {apps.map((app) => (\n <AppCard actions={actions} app={app} copy={copy} key={app.id} />\n ))}\n </div>\n <div aria-hidden=\"true\" className=\"h-6 shrink-0\" />\n </div>\n );\n}\n\ninterface RecommendedCategoryTab {\n readonly category: string | null;\n readonly count: number;\n readonly id: RecommendedCategoryTabID;\n readonly label: string;\n}\n\nfunction createRecommendedCategoryTabs(\n apps: AppCenterViewModel[\"apps\"],\n copy: AppCenterI18nRuntime\n): RecommendedCategoryTab[] {\n const categoryCounts = new Map<string, number>();\n\n for (const app of apps) {\n const category = app.category?.trim();\n if (!category) {\n continue;\n }\n categoryCounts.set(category, (categoryCounts.get(category) ?? 0) + 1);\n }\n\n return recommendedCategoryTabDefinitions.map((definition) => {\n if (definition.id === \"all\") {\n return {\n category: null,\n count: apps.length,\n id: definition.id,\n label: copy.t(\"labels.allApps\")\n };\n }\n\n const category = copy.t(definition.labelKey);\n return {\n category,\n count: categoryCounts.get(category) ?? 0,\n id: definition.id,\n label: category\n };\n });\n}\n\nfunction RecommendedCategoryTabs({\n copy,\n tabs,\n value,\n onValueChange\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly tabs: readonly RecommendedCategoryTab[];\n readonly value: RecommendedCategoryTabID;\n readonly onValueChange: (value: RecommendedCategoryTabID) => void;\n}): ReactElement {\n return (\n <div\n aria-label={copy.t(\"labels.appCategories\")}\n className=\"-mx-1 flex min-h-10 min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-[inset_0_0_0_1px_var(--line-1)]\"\n : \"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[11px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[11px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp,\n onLoadLocalApp\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n readonly onLoadLocalApp: () => void;\n}): ReactElement {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onLoadLocalApp}\n >\n <UploadFolderIcon />\n <span>{copy.t(\"actions.loadUnpackedApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.loadUnpackedAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onImportApp}\n >\n <ImportIcon />\n <span>{copy.t(\"actions.importApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.importAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreateApp}\n >\n <FileCreateIcon />\n {copy.t(\"factory.actions.create\")}\n </Button>\n </>\n );\n}\n\nfunction AppCenterRecommendedHeaderActions({\n copy,\n loading,\n onRefreshCatalog\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly loading: boolean;\n readonly onRefreshCatalog: () => void;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={copy.t(\"actions.refreshCatalog\")}\n disabled={loading}\n size=\"icon-sm\"\n title={copy.t(\"actions.refreshCatalog\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefreshCatalog}\n >\n <RefreshIcon className={loading ? \"animate-spin\" : undefined} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.refreshCatalog\")}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction FactoryJobStatusIndicator({\n copy,\n job\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly job: WorkspaceAppFactoryJobViewModel;\n}): ReactElement {\n const statusLabel = copy.t(job.statusLabelKey);\n if (job.status === \"generating\") {\n return (\n <span\n aria-label={statusLabel}\n className=\"inline-flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n title={statusLabel}\n >\n <Spinner\n className=\"text-[var(--text-tertiary)]\"\n size={12}\n strokeWidth={2}\n trackColor=\"var(--line-2)\"\n />\n </span>\n );\n }\n return (\n <Badge variant={job.status === \"failed\" ? \"destructive\" : \"secondary\"}>\n {statusLabel}\n </Badge>\n );\n}\n"],"mappings":"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","names":["AppCard","useMemo","Button","DeleteIcon","RefreshIcon","cn","jsx","jsxs","useMemo","cn","Button","DeleteIcon","RefreshIcon"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { KeyboardEvent, ReactElement } from \"react\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n RefreshIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceAppActionContext,\n WorkspaceAppCardViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppInstallProgress } from \"../contracts/runtime.ts\";\nimport type {\n WorkspaceAppLocalRepairAgentRequest,\n WorkspaceAppLocalRepairRequest\n} from \"../contracts/host.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\n\nexport interface AppCenterFactoryProviderOption {\n readonly disabled?: boolean;\n readonly disabledReason?: string;\n readonly iconUrl?: string | null;\n readonly label: string;\n readonly provider: string;\n}\n\nexport interface AppCenterFactoryModelOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryReasoningOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryPermissionOption {\n readonly label: string;\n readonly semantic?: string | null;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryProviderConfiguration {\n readonly defaultModel?: string | null;\n readonly defaultPermissionModeId?: string | null;\n readonly defaultReasoningEffort?: string | null;\n readonly modelOptions: readonly AppCenterFactoryModelOption[];\n readonly permissionModeOptions: readonly AppCenterFactoryPermissionOption[];\n readonly reasoningEffortOptions: readonly AppCenterFactoryReasoningOption[];\n}\n\nexport interface AppCenterHostActions {\n readonly cancelFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly createFactoryJob?: (input: {\n displayName: string;\n model?: string;\n permissionModeId?: string;\n provider?: string;\n prompt: string;\n reasoningEffort?: string;\n }) => Promise<void> | void;\n readonly deleteApp?: (appId: string, appName: string) => Promise<void> | void;\n readonly deleteFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly exportApp?: (appId: string) => Promise<void> | void;\n readonly fixFactoryJob?: (\n jobId: string,\n prompt: string\n ) => Promise<void> | void;\n readonly importApp?: () => Promise<void> | void;\n readonly installApp?: (appId: string) => Promise<void> | void;\n readonly loadLocalApp?: () =>\n | Promise<WorkspaceAppLocalRepairRequest | null | void>\n | WorkspaceAppLocalRepairRequest\n | null\n | void;\n readonly openApp?: (\n appId: string,\n context?: WorkspaceAppActionContext\n ) => Promise<void> | void;\n readonly openAppFolder?: (appId: string) => Promise<void> | void;\n readonly openAppPackageFolder?: (appId: string) => Promise<void> | void;\n readonly openFactoryJobAgentSession?: (\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly modifyAppWithAgent?: (\n jobId: string,\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly publishFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly repairLocalApp?: (\n request: WorkspaceAppLocalRepairAgentRequest\n ) => Promise<void> | void;\n readonly replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly refreshCatalog?: () => Promise<void> | void;\n readonly reloadLocalApp?: (appId: string) => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\n readonly restartAndOpenApp?: (appId: string) => Promise<void> | void;\n readonly updateApp?: (\n appId: string,\n trigger: \"badge_button\" | \"primary_action\"\n ) => Promise<void> | void;\n readonly uninstallApp?: (appId: string) => Promise<void> | void;\n}\n\nexport interface AppCardProps {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n}\n\nexport const AppCard = memo(function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const installBusy =\n app.installProgress != null || app.status === \"installing\";\n const busyStatusLabel = installBusy\n ? copy.t(\"status.installing\")\n : statusLabel;\n const showInstallProgressRing = installBusy;\n const statusButtonTitle = app.installProgress\n ? resolveInstallProgressTitle(copy, app.installProgress, busyStatusLabel)\n : statusLabel;\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? app.availableVersion\n ? copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })\n : copy.t(\"actions.updateApp\")\n : app.primaryAction === \"restartAndOpen\"\n ? copy.t(\"actions.restartAndOpenApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\n const primaryActionTitle = canExecutePrimaryAction\n ? primaryActionLabel\n : statusButtonTitle;\n const canOpenFromCard = app.canOpen;\n const canPublishFactoryUpdate =\n app.canPublishFactoryUpdate && !!app.factoryJobId;\n const canOpenFactorySession =\n app.canOpenFactorySession &&\n !!app.factoryAgentSessionId &&\n !!app.factoryJobId;\n const actionContext = useMemo(\n () => createWorkspaceAppActionContext(app),\n [app]\n );\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canReloadLocal ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = useCallback((): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"restartAndOpen\") {\n void actions.restartAndOpenApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, app.primaryAction]);\n const executeCardAction = useCallback((): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id, actionContext);\n }\n }, [actionContext, actions, app.id, canOpenFromCard]);\n const handleCardKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): void => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n },\n [canOpenFromCard, executeCardAction]\n );\n const handleReplaceIcon = useCallback((): void => {\n void actions.replaceAppIcon?.(app.id);\n }, [actions, app.id]);\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={handleReplaceIcon}\n />\n <div className=\"flex min-w-0 flex-1 items-center justify-end gap-1\">\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Button\n className={cn(\n \"min-w-0 max-w-full shrink truncate px-2\",\n !canExecutePrimaryAction ? \"cursor-default\" : null,\n canExecutePrimaryAction\n ? app.primaryAction === \"retry\"\n ? statusClassName(app.status)\n : \"text-[var(--text-primary)]\"\n : statusClassName(app.status)\n )}\n disabled={!canExecutePrimaryAction}\n size=\"default\"\n title={primaryActionTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n <span className=\"block min-w-0 max-w-full truncate\">\n {canExecutePrimaryAction ? primaryActionLabel : busyStatusLabel}\n </span>\n </Button>\n {showInstallProgressRing ? (\n <AppInstallProgressRing\n ariaLabel={copy.t(\"status.installProgress.progressAria\")}\n fallbackPercent={0}\n progress={app.installProgress}\n />\n ) : null}\n </div>\n </div>\n </div>\n\n <div className=\"mt-5 flex min-h-0 min-w-0 flex-1 flex-col p-1\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h3 className=\"block min-w-0 truncate text-[15px] font-semibold leading-6 tracking-[0] text-[var(--text-primary)]\">\n {app.name}\n </h3>\n {app.version ? (\n <span className=\"min-w-0 flex-none text-[11px] leading-4 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\">\n {copy.t(\"labels.version\", { version: app.version })}\n </span>\n ) : null}\n {app.canReloadLocal ? (\n <span className=\"min-w-0 flex-none rounded-[5px] border border-[color:var(--line-2)] px-1.5 py-0 text-[10px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.localDev\")}\n </span>\n ) : null}\n </div>\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n </div>\n ) : null}\n </div>\n </article>\n );\n});\n\nfunction createWorkspaceAppActionContext(\n app: WorkspaceAppCardViewModel\n): WorkspaceAppActionContext {\n return {\n installationId: app.installationId ?? null,\n runtimeId: app.runtimeId ?? null,\n launchUrl: app.launchUrl ?? null\n };\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n if (app.factoryEditAction === \"open_session\") {\n void actions.openFactoryJobAgentSession?.(\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n return;\n }\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.canReloadLocal) {\n menuItems.push({\n icon: <RefreshIcon />,\n key: \"reload-local\",\n label: copy.t(\"actions.reloadLocalApp\"),\n onSelect: () => {\n void actions.reloadLocalApp?.(app.id);\n }\n });\n }\n\n if (app.canOpenFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-folder\",\n label: copy.t(\"actions.openAppFolder\"),\n onSelect: () => {\n void actions.openAppFolder?.(app.id);\n }\n });\n }\n\n if (app.canOpenPackageFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-package-folder\",\n label: copy.t(\"actions.openAppPackageFolder\"),\n onSelect: () => {\n void actions.openAppPackageFolder?.(app.id);\n }\n });\n }\n\n if (app.canExport) {\n menuItems.push({\n icon: <UploadIcon />,\n key: \"export\",\n label: copy.t(\"actions.exportApp\"),\n onSelect: () => {\n void actions.exportApp?.(app.id);\n }\n });\n }\n\n if (app.canUninstall) {\n menuItems.push({\n icon: <UninstallIcon />,\n key: \"uninstall\",\n label: copy.t(\"actions.uninstallApp\"),\n onSelect: () => {\n void actions.uninstallApp?.(app.id);\n },\n variant: \"destructive\"\n });\n }\n\n if (app.canDelete) {\n menuItems.push({\n icon: <DeleteIcon />,\n key: \"delete\",\n label: copy.t(\n app.installed ? \"actions.uninstallAndDeleteApp\" : \"actions.deleteApp\"\n ),\n onSelect: () => {\n void actions.deleteApp?.(app.id, app.name);\n },\n variant: \"destructive\"\n });\n }\n\n return (\n <AppCenterActionMenu\n ariaLabel={copy.t(\"actions.moreActions\")}\n attention={canPublishFactoryUpdate}\n items={menuItems}\n triggerTitle={copy.t(\"actions.moreActions\")}\n />\n );\n}\n\ninterface AppCenterActionMenuItem {\n readonly attention?: boolean;\n readonly icon: ReactElement;\n readonly key: string;\n readonly label: string;\n readonly onSelect: () => void;\n readonly variant?: \"default\" | \"destructive\";\n}\n\nfunction AppCenterActionMenu({\n ariaLabel,\n attention = false,\n items,\n triggerTitle\n}: {\n readonly ariaLabel: string;\n readonly attention?: boolean;\n readonly items: readonly AppCenterActionMenuItem[];\n readonly triggerTitle: string;\n}): ReactElement {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={ariaLabel}\n className=\"relative\"\n size=\"icon\"\n title={triggerTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon />\n {attention ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-[var(--state-danger)] shadow-[0_0_0_2px_var(--background-fronted)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[192px]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <DropdownMenuGroup className=\"gap-[2px]\">\n {items.map((item) => (\n <DropdownMenuItem\n className=\"font-normal\"\n key={item.key}\n variant={item.variant}\n onSelect={(event) => {\n event.stopPropagation();\n item.onSelect();\n }}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.attention ? (\n <i\n aria-hidden=\"true\"\n className=\"ml-2 block size-1.5 shrink-0 rounded-full bg-[var(--state-danger)] not-italic\"\n />\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AppIcon({\n app,\n onReplaceIcon,\n replaceIconLabel\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly onReplaceIcon: () => void;\n readonly replaceIconLabel: string;\n}): ReactElement {\n const icon =\n app.icon?.type === \"asset\" ? (\n <img\n alt=\"\"\n className=\"size-11 flex-none rounded-[10px] object-contain object-center select-none\"\n draggable={false}\n src={app.icon.src}\n />\n ) : (\n <span className=\"flex size-11 flex-none items-center justify-center rounded-[10px] bg-[var(--transparency-block)] text-[var(--text-secondary)]\">\n <NavApplicationsFilledIcon className=\"size-[22px]\" />\n </span>\n );\n\n return (\n <span className=\"group/app-icon relative block size-11 flex-none\">\n {icon}\n {app.canReplaceIcon ? (\n <button\n aria-label={replaceIconLabel}\n className=\"absolute inset-0 flex size-11 items-center justify-center rounded-[10px] bg-black/55 p-0 text-white opacity-0 transition-opacity duration-150 group-hover/app-icon:opacity-100 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)]\"\n title={replaceIconLabel}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.blur();\n onReplaceIcon();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <EditIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AppInstallProgressRing({\n ariaLabel,\n fallbackPercent,\n progress\n}: {\n readonly ariaLabel: string;\n readonly fallbackPercent: number;\n readonly progress: WorkspaceAppInstallProgress | null | undefined;\n}): ReactElement {\n const percent =\n progress == null\n ? Math.max(0, Math.min(100, Math.round(fallbackPercent)))\n : Math.max(0, Math.min(100, Math.round(progress.overallPercent)));\n\n return (\n <span\n aria-label={ariaLabel}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={percent}\n className=\"relative inline-flex size-[14px] shrink-0 items-center justify-center rounded-full\"\n role=\"progressbar\"\n style={{\n background: `conic-gradient(var(--text-secondary) ${percent}%, color-mix(in srgb, var(--text-secondary) 24%, transparent) 0)`\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-[2px] rounded-full bg-[var(--surface-panel)]\"\n />\n </span>\n );\n}\n\nfunction resolveInstallProgressTitle(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress,\n statusLabel: string\n): string {\n const byteLabel = formatInstallProgressBytes(copy, progress);\n const percent = Math.max(\n 0,\n Math.min(100, Math.round(progress.overallPercent))\n );\n if (byteLabel) {\n return `${statusLabel} · ${byteLabel} · ${percent}%`;\n }\n return `${statusLabel} · ${percent}%`;\n}\n\nfunction formatInstallProgressBytes(\n copy: AppCenterI18nRuntime,\n progress: WorkspaceAppInstallProgress\n): string | null {\n if (\n progress.userPhase !== \"downloading\" ||\n progress.downloadedBytes == null\n ) {\n return null;\n }\n const downloaded = formatByteSize(progress.downloadedBytes);\n if (progress.totalBytes == null || progress.totalBytes <= 0) {\n return downloaded;\n }\n return copy.t(\"status.installProgress.downloadedOfTotal\", {\n downloaded,\n total: formatByteSize(progress.totalBytes)\n });\n}\n\nfunction formatByteSize(value: number): string {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n const precision = size >= 10 || unitIndex === 0 ? 0 : 1;\n return `${size.toFixed(precision)} ${units[unitIndex]}`;\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"unavailable\") {\n return \"text-[var(--state-warning)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n ImportLinedIcon as ImportIcon,\n Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n RefreshIcon,\n Select,\n SelectContent,\n SelectItem,\n 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 UploadFolderIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.ts\";\nimport type { WorkspaceAppLocalRepairRequest } from \"../contracts/host.ts\";\nimport {\n sortMyAppsByCreatedDesc,\n sortRecommendedApps,\n sortRecommendedAppsForAllTab\n} from \"../core/appCenterAppOrdering.ts\";\nimport {\n resolveDefaultAppFactoryProvider,\n resolveSelectedAppFactoryProvider\n} from \"../core/appFactoryProviderDefaults.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\nimport {\n AppCard,\n type AppCenterFactoryProviderConfiguration,\n type AppCenterFactoryProviderOption,\n type AppCenterFactoryPermissionOption,\n type AppCenterHostActions\n} from \"./AppCard.tsx\";\n\ntype FactoryTemplateID =\n | \"lovart\"\n | \"weather\"\n | \"lookup\"\n | \"system\"\n | \"news\"\n | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"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.lovart.defaultName\",\n id: \"lovart\",\n promptKey: \"factory.templates.lovart.prompt\",\n titleKey: \"factory.templates.lovart.title\"\n },\n {\n defaultNameKey: \"factory.templates.weather.defaultName\",\n id: \"weather\",\n promptKey: \"factory.templates.weather.prompt\",\n titleKey: \"factory.templates.weather.title\"\n },\n {\n defaultNameKey: \"factory.templates.lookup.defaultName\",\n id: \"lookup\",\n promptKey: \"factory.templates.lookup.prompt\",\n titleKey: \"factory.templates.lookup.title\"\n },\n {\n defaultNameKey: \"factory.templates.system.defaultName\",\n id: \"system\",\n promptKey: \"factory.templates.system.prompt\",\n titleKey: \"factory.templates.system.title\"\n },\n {\n defaultNameKey: \"factory.templates.news.defaultName\",\n id: \"news\",\n promptKey: \"factory.templates.news.prompt\",\n titleKey: \"factory.templates.news.title\"\n },\n {\n defaultNameKey: \"factory.templates.gomoku.defaultName\",\n id: \"gomoku\",\n promptKey: \"factory.templates.gomoku.prompt\",\n titleKey: \"factory.templates.gomoku.title\"\n }\n];\n\nconst recommendedCategoryTabDefinitions: readonly (\n | {\n readonly id: \"all\";\n readonly labelKey: null;\n }\n | {\n readonly id: Exclude<RecommendedCategoryTabID, \"all\">;\n readonly labelKey: string;\n }\n)[] = [\n { id: \"all\", labelKey: null },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"office\", labelKey: \"categories.office\" },\n { id: \"tools\", labelKey: \"categories.tools\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [pendingLocalRepairRequest, setPendingLocalRepairRequest] =\n useState<WorkspaceAppLocalRepairRequest | null>(null);\n const [updateAppBusy, setUpdateAppBusy] = useState(false);\n const [localRepairBusy, setLocalRepairBusy] = useState(false);\n const [pendingUpdateApp, setPendingUpdateApp] = useState<{\n id: string;\n name: string;\n trigger: \"badge_button\" | \"primary_action\";\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const loadLocalApp = (): void => {\n void Promise.resolve(actions.loadLocalApp?.()).then((request) => {\n if (request) {\n setPendingLocalRepairRequest(request);\n }\n });\n };\n const cardActions = useMemo<AppCenterHostActions>(\n () => ({\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n },\n updateApp: (appId, trigger) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n 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 const localRepairDialogTitle = copy.t(\"localDev.repairDialog.title\");\n const localRepairDialogDescription = copy.t(\n \"localDev.repairDialog.description\"\n );\n\n return (\n <section\n aria-label={copy.t(\"title\")}\n className={cn(\n \"relative flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)]\",\n className\n )}\n >\n {statusToast ? <AppCenterStatusToast toast={statusToast} /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-auto px-6 pt-5 [container-type:inline-size]\">\n <section className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex h-8 min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n className=\"h-8\"\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex h-8 shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n onLoadLocalApp={loadLocalApp}\n />\n ) : (\n <AppCenterRecommendedHeaderActions\n copy={copy}\n loading={catalogLoading}\n onRefreshCatalog={() => {\n void actions.refreshCatalog?.();\n }}\n />\n )}\n </div>\n </div>\n {activeAppTab === \"my\" && hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[11px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\n job.canFix\n ? \"factory.messages.factoryJobFailedWithFix\"\n : \"factory.messages.factoryJobFailed\"\n )}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[11px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={updateAppBusy}\n confirmLabel={copy.t(\"actions.updateApp\")}\n description={copy.t(\"confirmations.updateRunningAppDescription\")}\n open={pendingUpdateApp != null}\n title={updateAppConfirmTitle}\n onConfirm={() => {\n const app = pendingUpdateApp;\n if (!app) {\n return;\n }\n setUpdateAppBusy(true);\n void Promise.resolve(\n actions.updateApp?.(app.id, app.trigger)\n ).finally(() => {\n setUpdateAppBusy(false);\n setPendingUpdateApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !updateAppBusy) {\n setPendingUpdateApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={localRepairBusy}\n confirmLabel={copy.t(\"localDev.repairDialog.confirm\")}\n description={localRepairDialogDescription}\n open={pendingLocalRepairRequest != null}\n title={localRepairDialogTitle}\n onConfirm={() => {\n const request = pendingLocalRepairRequest;\n if (!request) {\n return;\n }\n setLocalRepairBusy(true);\n void Promise.resolve(\n actions.repairLocalApp?.({\n ...request,\n prompt: copy.t(\"localDev.repairPrompt\", {\n cwd: request.projectDir\n })\n })\n ).finally(() => {\n setLocalRepairBusy(false);\n setPendingLocalRepairRequest(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !localRepairBusy) {\n setPendingLocalRepairRequest(null);\n }\n }}\n />\n <Dialog\n open={factoryDialogOpen}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n closeFactoryDialog();\n return;\n }\n openFactoryDialog();\n }}\n >\n <DialogContent\n className=\"sm:max-w-[min(640px,calc(100%-2rem))]\"\n showCloseButton={false}\n >\n <form\n className=\"grid max-h-[min(760px,calc(100vh-64px))] min-w-0 gap-4 overflow-auto\"\n onSubmit={submitCreate}\n >\n <DialogHeader>\n <DialogTitle>{copy.t(\"factory.labels.create\")}</DialogTitle>\n </DialogHeader>\n <label className=\"grid min-w-0 gap-2\">\n <span className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.appName\")}\n </span>\n <Input\n autoFocus\n className=\"h-9 rounded-[8px]\"\n placeholder={copy.t(\"factory.placeholders.appName\")}\n value={displayName}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n />\n </label>\n <div className=\"grid min-w-0 gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <label\n className=\"text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n htmlFor={promptTextareaId}\n >\n {copy.t(\"factory.labels.prompt\")}\n </label>\n <div className=\"relative min-w-0\">\n <Textarea\n className=\"min-h-[148px] resize-none rounded-[10px] pb-14 leading-[1.45] sm:pb-8\"\n id={promptTextareaId}\n placeholder={copy.t(\"factory.placeholders.prompt\")}\n value={prompt}\n onChange={(event) => setPrompt(event.currentTarget.value)}\n />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-1.5 flex min-w-0 flex-wrap items-end justify-between gap-2\">\n {providerErrorMessage &&\n normalizedProviderOptions.length === 0 ? (\n <p className=\"pointer-events-auto max-w-[240px] text-[11px] leading-4 text-[var(--state-danger)]\">\n {providerErrorMessage}\n </p>\n ) : (\n <span aria-hidden=\"true\" className=\"min-h-4 flex-1\" />\n )}\n <div className=\"pointer-events-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-0.5 px-0.5 py-0\">\n <FactoryProviderSelect\n copy={copy}\n errorMessage={providerErrorMessage}\n loading={providerLoading}\n open={openFactorySettingsMenu === \"provider\"}\n options={normalizedProviderOptions}\n selectedProvider={selectedProvider}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent data-[placeholder]:text-[var(--text-tertiary)]\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"provider\" : null\n )\n }\n onSelectProvider={setSelectedProvider}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryPermissionDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n open={openFactorySettingsMenu === \"permission\"}\n options={permissionModeOptions}\n selectedPermissionModeId={selectedPermissionModeId}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"permission\" : null\n )\n }\n onSelectPermissionMode={setSelectedPermissionModeId}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <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={selectedProvider}\n onOpenChange={onOpenChange}\n onValueChange={onSelectProvider}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.agent\")}\n className={cn(\n \"h-9 w-full rounded-[8px] px-3 font-normal [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:min-w-0 [&_[data-slot=select-value]]:items-center [&_[data-slot=select-value]]:gap-2\",\n loading && options.length === 0 ? \"animate-pulse\" : null,\n triggerClassName\n )}\n >\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={selectedOption.iconUrl} />\n <span className=\"truncate\">{selectedOption.label}</span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n className=\"w-[300px] min-w-[240px] max-w-[min(100vw-64px,480px)]\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length === 0 ? (\n <SelectItem disabled value=\"__no-provider__\">\n {copy.t(\"factory.messages.noAgentProviders\")}\n </SelectItem>\n ) : (\n options.map((option) => (\n <SelectItem\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n value={option.provider}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={option.iconUrl} />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryPermissionDropdown({\n copy,\n loading,\n onOpenChange,\n onSelectPermissionMode,\n open,\n options,\n selectedPermissionModeId,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectPermissionMode: (value: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryPermissionOption[];\n selectedPermissionModeId: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.value === selectedPermissionModeId) ?? null;\n const disabled = loading || options.length === 0;\n const selectedLabel = selectedOption\n ? permissionOptionLabel(copy, selectedOption)\n : selectedPermissionModeId;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedPermissionModeId}\n onOpenChange={onOpenChange}\n onValueChange={onSelectPermissionMode}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.review\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center overflow-hidden\">\n {selectedLabel ? (\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noPermissionOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[220px] max-w-[min(100vw-32px,360px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">\n {permissionOptionLabel(copy, option)}\n </span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noPermissionOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction 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 : \"\"\n : selectedReasoningEffort\n ? `reasoning:${selectedReasoningEffort}`\n : \"\";\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\n ? \"animate-pulse rounded-none border-transparent bg-transparent px-1 opacity-100 shadow-none hover:bg-transparent disabled:bg-transparent disabled:opacity-100\"\n : null,\n disabled && !loading\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center 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 className=\"flex min-w-0 shrink-0 flex-col\">\n <div\n aria-label={title}\n className=\"grid min-h-0 min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,260px),1fr))] gap-3\"\n role=\"list\"\n >\n {apps.map((app) => (\n <AppCard actions={actions} app={app} copy={copy} key={app.id} />\n ))}\n </div>\n <div aria-hidden=\"true\" className=\"h-6 shrink-0\" />\n </div>\n );\n}\n\ninterface RecommendedCategoryTab {\n readonly category: string | null;\n readonly count: number;\n readonly id: RecommendedCategoryTabID;\n readonly label: string;\n}\n\nfunction createRecommendedCategoryTabs(\n apps: AppCenterViewModel[\"apps\"],\n copy: AppCenterI18nRuntime\n): RecommendedCategoryTab[] {\n const categoryCounts = new Map<string, number>();\n\n for (const app of apps) {\n const category = app.category?.trim();\n if (!category) {\n continue;\n }\n categoryCounts.set(category, (categoryCounts.get(category) ?? 0) + 1);\n }\n\n return recommendedCategoryTabDefinitions.map((definition) => {\n if (definition.id === \"all\") {\n return {\n category: null,\n count: apps.length,\n id: definition.id,\n label: copy.t(\"labels.allApps\")\n };\n }\n\n const category = copy.t(definition.labelKey);\n return {\n category,\n count: categoryCounts.get(category) ?? 0,\n id: definition.id,\n label: category\n };\n });\n}\n\nfunction RecommendedCategoryTabs({\n copy,\n tabs,\n value,\n onValueChange\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly tabs: readonly RecommendedCategoryTab[];\n readonly value: RecommendedCategoryTabID;\n readonly onValueChange: (value: RecommendedCategoryTabID) => void;\n}): ReactElement {\n return (\n <div\n aria-label={copy.t(\"labels.appCategories\")}\n className=\"-mx-1 flex min-h-10 min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-[inset_0_0_0_1px_var(--line-1)]\"\n : \"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[11px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[11px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp,\n onLoadLocalApp\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n readonly onLoadLocalApp: () => void;\n}): ReactElement {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onLoadLocalApp}\n >\n <UploadFolderIcon />\n <span>{copy.t(\"actions.loadUnpackedApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.loadUnpackedAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onImportApp}\n >\n <ImportIcon />\n <span>{copy.t(\"actions.importApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.importAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreateApp}\n >\n <FileCreateIcon />\n {copy.t(\"factory.actions.create\")}\n </Button>\n </>\n );\n}\n\nfunction AppCenterRecommendedHeaderActions({\n copy,\n loading,\n onRefreshCatalog\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly loading: boolean;\n readonly onRefreshCatalog: () => void;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={copy.t(\"actions.refreshCatalog\")}\n disabled={loading}\n size=\"icon-sm\"\n title={copy.t(\"actions.refreshCatalog\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefreshCatalog}\n >\n <RefreshIcon className={loading ? \"animate-spin\" : undefined} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.refreshCatalog\")}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction FactoryJobStatusIndicator({\n copy,\n job\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly job: WorkspaceAppFactoryJobViewModel;\n}): ReactElement {\n const statusLabel = copy.t(job.statusLabelKey);\n if (job.status === \"generating\") {\n return (\n <span\n aria-label={statusLabel}\n className=\"inline-flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n title={statusLabel}\n >\n <Spinner\n className=\"text-[var(--text-tertiary)]\"\n size={12}\n strokeWidth={2}\n trackColor=\"var(--line-2)\"\n />\n </span>\n );\n }\n return (\n <Badge variant={job.status === \"failed\" ? \"destructive\" : \"secondary\"}>\n {statusLabel}\n </Badge>\n );\n}\n"],"mappings":"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","names":["AppCard","useMemo","Button","DeleteIcon","RefreshIcon","cn","jsx","jsxs","useMemo","cn","Button","DeleteIcon","RefreshIcon"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/workspace-app-center",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.30",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"directory": "packages/workspace/app-center"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
40
|
-
"@tutti-os/ui-system": "0.0.
|
|
39
|
+
"@tutti-os/ui-i18n-runtime": "0.0.30",
|
|
40
|
+
"@tutti-os/ui-system": "0.0.30"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^24.0.1",
|