@hualinge/relay-web 1.0.0
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/LICENSE +21 -0
- package/README.md +31 -0
- package/dist/assets/AgentsPage-2u2kFBCH.js +68 -0
- package/dist/assets/AgentsPage-2u2kFBCH.js.map +1 -0
- package/dist/assets/AgentsPage-BGbbVmeL.css +1 -0
- package/dist/assets/Alert-D88Fk6to.js +2 -0
- package/dist/assets/Alert-D88Fk6to.js.map +1 -0
- package/dist/assets/AppModal-BYZTSuch.js +2 -0
- package/dist/assets/AppModal-BYZTSuch.js.map +1 -0
- package/dist/assets/CenteredLoadingState-DHor-9vF.js +2 -0
- package/dist/assets/CenteredLoadingState-DHor-9vF.js.map +1 -0
- package/dist/assets/ChannelsPage-CbI0kqkd.js +2 -0
- package/dist/assets/ChannelsPage-CbI0kqkd.js.map +1 -0
- package/dist/assets/EmptyDataState-6mNx2Xhl.js +2 -0
- package/dist/assets/EmptyDataState-6mNx2Xhl.js.map +1 -0
- package/dist/assets/HelpPrompt-BPzDcC8F.js +2 -0
- package/dist/assets/HelpPrompt-BPzDcC8F.js.map +1 -0
- package/dist/assets/HomePage-t78sDDUj.js +2 -0
- package/dist/assets/HomePage-t78sDDUj.js.map +1 -0
- package/dist/assets/InspirationPage-BTqLpcHY.js +3 -0
- package/dist/assets/InspirationPage-BTqLpcHY.js.map +1 -0
- package/dist/assets/ModelsPage-YF0gpUxy.js +2 -0
- package/dist/assets/ModelsPage-YF0gpUxy.js.map +1 -0
- package/dist/assets/NameInitialIcon-DP-6_HQY.js +7 -0
- package/dist/assets/NameInitialIcon-DP-6_HQY.js.map +1 -0
- package/dist/assets/NoSearchResultsState-BiiYdZ_Z.js +2 -0
- package/dist/assets/NoSearchResultsState-BiiYdZ_Z.js.map +1 -0
- package/dist/assets/OverflowTooltip-CE5PjAb-.js +2 -0
- package/dist/assets/OverflowTooltip-CE5PjAb-.js.map +1 -0
- package/dist/assets/PasswordField-DmzjtnCg.js +2 -0
- package/dist/assets/PasswordField-DmzjtnCg.js.map +1 -0
- package/dist/assets/RefreshButton-BzYzeo5A.js +2 -0
- package/dist/assets/RefreshButton-BzYzeo5A.js.map +1 -0
- package/dist/assets/RightContentHeader-DoNDQ9Lo.js +3 -0
- package/dist/assets/RightContentHeader-DoNDQ9Lo.js.map +1 -0
- package/dist/assets/SchedulePage-CfW6lZVI.js +2 -0
- package/dist/assets/SchedulePage-CfW6lZVI.js.map +1 -0
- package/dist/assets/SearchInput-tux8xXH1.js +2 -0
- package/dist/assets/SearchInput-tux8xXH1.js.map +1 -0
- package/dist/assets/SkillAvatar-DwGvsY4f.js +2 -0
- package/dist/assets/SkillAvatar-DwGvsY4f.js.map +1 -0
- package/dist/assets/SkillsPage-ppqwKMvj.js +2 -0
- package/dist/assets/SkillsPage-ppqwKMvj.js.map +1 -0
- package/dist/assets/SkillsTab-c_As1DIr.css +1 -0
- package/dist/assets/SkillsTab-kY7MNdxy.js +2 -0
- package/dist/assets/SkillsTab-kY7MNdxy.js.map +1 -0
- package/dist/assets/Tab-FE0F2EQP.js +2 -0
- package/dist/assets/Tab-FE0F2EQP.js.map +1 -0
- package/dist/assets/ThreadPage-B0jElW5R.js +53 -0
- package/dist/assets/ThreadPage-B0jElW5R.js.map +1 -0
- package/dist/assets/UploadSkillModal-DHZL12vm.js +8 -0
- package/dist/assets/UploadSkillModal-DHZL12vm.js.map +1 -0
- package/dist/assets/XlsxDocumentPreview-BY-ht09K.js +5 -0
- package/dist/assets/XlsxDocumentPreview-BY-ht09K.js.map +1 -0
- package/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +2 -0
- package/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js.map +1 -0
- package/dist/assets/chat-input-options-CpkOtPgQ.js +2 -0
- package/dist/assets/chat-input-options-CpkOtPgQ.js.map +1 -0
- package/dist/assets/docx-preview-zfB-orwa.js +28 -0
- package/dist/assets/docx-preview-zfB-orwa.js.map +1 -0
- package/dist/assets/exceljs.min-BY7KKJsM.js +58 -0
- package/dist/assets/exceljs.min-BY7KKJsM.js.map +1 -0
- package/dist/assets/helpers-CCilgpNy.js +2 -0
- package/dist/assets/helpers-CCilgpNy.js.map +1 -0
- package/dist/assets/hub-agent-editor.client-2DmCRGuY.js +2 -0
- package/dist/assets/hub-agent-editor.client-2DmCRGuY.js.map +1 -0
- package/dist/assets/hub-agent-editor.payload-D4sgJRSH.js +4 -0
- package/dist/assets/hub-agent-editor.payload-D4sgJRSH.js.map +1 -0
- package/dist/assets/hub-tag-editor-BBdd-aHK.js +2 -0
- package/dist/assets/hub-tag-editor-BBdd-aHK.js.map +1 -0
- package/dist/assets/index-Bed0I5IL.css +1 -0
- package/dist/assets/index-Bxf2_cvh.js +2 -0
- package/dist/assets/index-Bxf2_cvh.js.map +1 -0
- package/dist/assets/index-Cb4fQgom.js +103 -0
- package/dist/assets/index-Cb4fQgom.js.map +1 -0
- package/dist/assets/index-DQ2vVjmV.js +30 -0
- package/dist/assets/index-DQ2vVjmV.js.map +1 -0
- package/dist/assets/index-UBJEdbMO.js +2 -0
- package/dist/assets/index-UBJEdbMO.js.map +1 -0
- package/dist/assets/jszip.min-DPdj3o0t.js +13 -0
- package/dist/assets/jszip.min-DPdj3o0t.js.map +1 -0
- package/dist/assets/quick-actions-DzZE-zyP.js +2 -0
- package/dist/assets/quick-actions-DzZE-zyP.js.map +1 -0
- package/dist/assets/skill-options-cache-D1BJGTCU.js +2 -0
- package/dist/assets/skill-options-cache-D1BJGTCU.js.map +1 -0
- package/dist/assets/status-helpers-BILdm2MI.js +2 -0
- package/dist/assets/status-helpers-BILdm2MI.js.map +1 -0
- package/dist/assets/thread-title-Cerb2mHa.js +2 -0
- package/dist/assets/thread-title-Cerb2mHa.js.map +1 -0
- package/dist/assets/thread-utils-Ct3yp4R3.js +2 -0
- package/dist/assets/thread-utils-Ct3yp4R3.js.map +1 -0
- package/dist/assets/useAgentData-D-k9cXfg.js +2 -0
- package/dist/assets/useAgentData-D-k9cXfg.js.map +1 -0
- package/dist/assets/useEscapeKey-CEQ6-8GR.js +2 -0
- package/dist/assets/useEscapeKey-CEQ6-8GR.js.map +1 -0
- package/dist/assets/useExpertCatalog-BZdw1CYs.js +2 -0
- package/dist/assets/useExpertCatalog-BZdw1CYs.js.map +1 -0
- package/dist/assets/usePromptBlocks-5sz8Qh51.js +2 -0
- package/dist/assets/usePromptBlocks-5sz8Qh51.js.map +1 -0
- package/dist/assets/useSocket-YigidotN.css +1 -0
- package/dist/assets/useSocket-y3-zWhVL.js +11 -0
- package/dist/assets/useSocket-y3-zWhVL.js.map +1 -0
- package/dist/assets/utils--_pbLpCq.js +2 -0
- package/dist/assets/utils--_pbLpCq.js.map +1 -0
- package/dist/assets/vad-web-C_R267y1.js +2 -0
- package/dist/assets/vad-web-C_R267y1.js.map +1 -0
- package/dist/avatars/agent-avatar-1.png +0 -0
- package/dist/avatars/agent-avatar-2.png +0 -0
- package/dist/avatars/agent-avatar-3.png +0 -0
- package/dist/avatars/agent-avatar-4.png +0 -0
- package/dist/avatars/agent-avatar-5.png +0 -0
- package/dist/avatars/agent-avatar-6.png +0 -0
- package/dist/avatars/agent-avatar-7.png +0 -0
- package/dist/avatars/agent-avatar-8.png +0 -0
- package/dist/avatars/agent-avatar-9.png +0 -0
- package/dist/avatars/agentteams.png +0 -0
- package/dist/avatars/antig-opus.png +0 -0
- package/dist/avatars/antigravity.png +0 -0
- package/dist/avatars/assistant.svg +17 -0
- package/dist/avatars/codex-kawaii.png +0 -0
- package/dist/avatars/codex.png +0 -0
- package/dist/avatars/codex_box.png +0 -0
- package/dist/avatars/codex_iquid.png +0 -0
- package/dist/avatars/dare.png +0 -0
- package/dist/avatars/gemini-kawaii.png +0 -0
- package/dist/avatars/gemini.png +0 -0
- package/dist/avatars/gemini25.png +0 -0
- package/dist/avatars/gpt52.png +0 -0
- package/dist/avatars/jiuwenclaw.png +0 -0
- package/dist/avatars/office.svg +17 -0
- package/dist/avatars/opencode.png +0 -0
- package/dist/avatars/opus-45.png +0 -0
- package/dist/avatars/opus-kawaii.png +0 -0
- package/dist/avatars/opus.png +0 -0
- package/dist/avatars/sonnet.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/icons/arrow-left.svg +3 -0
- package/dist/icons/arrow-right.svg +3 -0
- package/dist/icons/attach.svg +9 -0
- package/dist/icons/chart/dislike.svg +3 -0
- package/dist/icons/chart/disliked.svg +3 -0
- package/dist/icons/chart/folder.svg +15 -0
- package/dist/icons/chart/home-loading.webp +0 -0
- package/dist/icons/chart/like.svg +3 -0
- package/dist/icons/chart/liked.svg +5 -0
- package/dist/icons/chart/loading.svg +26 -0
- package/dist/icons/chart/success.svg +7 -0
- package/dist/icons/check-line.svg +3 -0
- package/dist/icons/chevron-left.svg +3 -0
- package/dist/icons/chevron-right.svg +3 -0
- package/dist/icons/collapse.svg +14 -0
- package/dist/icons/common-delete.svg +4 -0
- package/dist/icons/common-folder.svg +4 -0
- package/dist/icons/copy.svg +4 -0
- package/dist/icons/cross-line.svg +4 -0
- package/dist/icons/data-analysis.svg +7 -0
- package/dist/icons/data-visualization.svg +10 -0
- package/dist/icons/deep-research.svg +4 -0
- package/dist/icons/document-processing.svg +5 -0
- package/dist/icons/edit.svg +4 -0
- package/dist/icons/expand.svg +6 -0
- package/dist/icons/expert-debate.svg +4 -0
- package/dist/icons/eye.svg +4 -0
- package/dist/icons/favicon.svg +7 -0
- package/dist/icons/file-docx.svg +60 -0
- package/dist/icons/file-folder.svg +4 -0
- package/dist/icons/file-gitignore.svg +35 -0
- package/dist/icons/file-html.svg +6 -0
- package/dist/icons/file-ini.svg +63 -0
- package/dist/icons/file-json.svg +4 -0
- package/dist/icons/file-md.svg +68 -0
- package/dist/icons/file-py.svg +4 -0
- package/dist/icons/file-sh.svg +7 -0
- package/dist/icons/file-txt.svg +37 -0
- package/dist/icons/file-zip.svg +21 -0
- package/dist/icons/file.svg +4 -0
- package/dist/icons/files-csv.svg +14 -0
- package/dist/icons/files-docx.svg +10 -0
- package/dist/icons/files-pdf.svg +14 -0
- package/dist/icons/files-ppt.svg +14 -0
- package/dist/icons/files-txt.svg +16 -0
- package/dist/icons/files-xlsx.svg +14 -0
- package/dist/icons/financial-services.svg +8 -0
- package/dist/icons/flie-html.svg +60 -0
- package/dist/icons/guided-mode.svg +9 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-arrow-down.svg +4 -0
- package/dist/icons/icon-arrow-up.svg +4 -0
- package/dist/icons/icon-clear-all.svg +3 -0
- package/dist/icons/icon-close.svg +4 -0
- package/dist/icons/icon-code.svg +38 -0
- package/dist/icons/icon-drag-file.svg +26 -0
- package/dist/icons/icon-help.svg +4 -0
- package/dist/icons/icon-md.svg +53 -0
- package/dist/icons/icon-refresh.svg +4 -0
- package/dist/icons/icon-toggle.svg +6 -0
- package/dist/icons/icon-top.svg +7 -0
- package/dist/icons/icon-upload.svg +5 -0
- package/dist/icons/information.svg +6 -0
- package/dist/icons/inspiration/icon-excel.svg +14 -0
- package/dist/icons/inspiration/icon-inspiration.svg +5 -0
- package/dist/icons/inspiration/icon-markdown.svg +12 -0
- package/dist/icons/inspiration/icon-word.svg +10 -0
- package/dist/icons/link.svg +6 -0
- package/dist/icons/lock.svg +4 -0
- package/dist/icons/menu/agents.svg +39 -0
- package/dist/icons/menu/channels.svg +4 -0
- package/dist/icons/menu/icon-inspiration.svg +5 -0
- package/dist/icons/menu/models.svg +4 -0
- package/dist/icons/menu/new-chat.svg +59 -0
- package/dist/icons/menu/schedule.svg +4 -0
- package/dist/icons/menu/skills.svg +4 -0
- package/dist/icons/message-error.svg +6 -0
- package/dist/icons/message-prompt.svg +9 -0
- package/dist/icons/message-success.svg +6 -0
- package/dist/icons/message-warn.svg +8 -0
- package/dist/icons/more-trigger.svg +4 -0
- package/dist/icons/nss/1.svg +14 -0
- package/dist/icons/nss/2.svg +14 -0
- package/dist/icons/nss/3.svg +14 -0
- package/dist/icons/outline.svg +6 -0
- package/dist/icons/query_the_optical_power_border.svg +99 -0
- package/dist/icons/schedule.svg +4 -0
- package/dist/icons/settings-feedback/feedback-bug.svg +20 -0
- package/dist/icons/settings-feedback/feedback-file.svg +4 -0
- package/dist/icons/settings-feedback/feedback-idea.svg +14 -0
- package/dist/icons/settings-feedback/settings-gear.svg +4 -0
- package/dist/icons/settings-feedback/settings-link.svg +4 -0
- package/dist/icons/settings-feedback/settings-memory.svg +7 -0
- package/dist/icons/settings-feedback/settings-privacy.svg +37 -0
- package/dist/icons/settings-feedback/settings-search.svg +2 -0
- package/dist/icons/slides.svg +4 -0
- package/dist/icons/status/info-error.svg +9 -0
- package/dist/icons/style-template.svg +11 -0
- package/dist/icons/tool-error.svg +4 -0
- package/dist/icons/userprofile/help.svg +5 -0
- package/dist/icons/userprofile/keep-awake.svg +4 -0
- package/dist/icons/userprofile/question.svg +4 -0
- package/dist/icons/userprofile/security.svg +7 -0
- package/dist/icons/userprofile/style-template.svg +11 -0
- package/dist/icons/userprofile/theme.svg +14 -0
- package/dist/icons/userprofile/usage.svg +4 -0
- package/dist/icons/userprofile/version.svg +85 -0
- package/dist/icons/video-generation.svg +4 -0
- package/dist/images/OfficeClaw.svg +21 -0
- package/dist/images/add.svg +4 -0
- package/dist/images/agent-management-icons/agent-check.svg +23 -0
- package/dist/images/agent-management-icons/agent-close.svg +4 -0
- package/dist/images/agent-management-icons/agent-collab.svg +4 -0
- package/dist/images/agent-management-icons/agent-delete.svg +18 -0
- package/dist/images/agent-management-icons/agent-edit.svg +18 -0
- package/dist/images/agent-management-icons/agent-more.svg +4 -0
- package/dist/images/agent-management-icons/agent-persona.svg +4 -0
- package/dist/images/agent-management-icons/agent-random-avatar.svg +39 -0
- package/dist/images/agent-management-icons/agent-refresh.svg +4 -0
- package/dist/images/agent-management-icons/agent-skills.svg +4 -0
- package/dist/images/agent-management-icons/agent-template.svg +12 -0
- package/dist/images/agent-management-icons/anchor-current.svg +5 -0
- package/dist/images/agent-management-icons/anchor-other.svg +4 -0
- package/dist/images/chat-empty-agent.svg +12 -0
- package/dist/images/chat-empty-im.svg +14 -0
- package/dist/images/connectors/dingtalk.png +0 -0
- package/dist/images/connectors/dingtalk.svg +18 -0
- package/dist/images/connectors/feishu.png +0 -0
- package/dist/images/connectors/feishu.svg +12 -0
- package/dist/images/connectors/imessage.png +0 -0
- package/dist/images/connectors/wecom-agent.png +0 -0
- package/dist/images/connectors/wecom-bot.png +0 -0
- package/dist/images/connectors/weixin.png +0 -0
- package/dist/images/connectors/weixin.svg +19 -0
- package/dist/images/connectors/xiaoyi.png +0 -0
- package/dist/images/connectors/xiaoyi.svg +12 -0
- package/dist/images/create-agent-random-avatar.svg +39 -0
- package/dist/images/deepseek.svg +1 -0
- package/dist/images/default-ppt-template.png +0 -0
- package/dist/images/file-browser-tree/code.svg +60 -0
- package/dist/images/file-browser-tree/gitignore.svg +35 -0
- package/dist/images/file-browser-tree/image.svg +12 -0
- package/dist/images/file-browser-tree/markdown.svg +68 -0
- package/dist/images/file-browser-tree/pdf.svg +4 -0
- package/dist/images/file-browser-tree/ppt.svg +4 -0
- package/dist/images/file-browser-tree/public-file.svg +37 -0
- package/dist/images/file-browser-tree/word.svg +60 -0
- package/dist/images/file-browser-tree/xlsx.svg +4 -0
- package/dist/images/html-preview-toolbar/copy.svg +4 -0
- package/dist/images/html-preview-toolbar/open-external.svg +4 -0
- package/dist/images/html-preview-toolbar/refresh.svg +4 -0
- package/dist/images/information.svg +4 -0
- package/dist/images/inspiration/blue-bg.png +0 -0
- package/dist/images/inspiration/doc-example.png +0 -0
- package/dist/images/inspiration/excel-example.png +0 -0
- package/dist/images/inspiration/green-bg.png +0 -0
- package/dist/images/inspiration/markdown-example.png +0 -0
- package/dist/images/inspiration/orange-bg.png +0 -0
- package/dist/images/inspiration/purple-bg.png +0 -0
- package/dist/images/inspiration/task-bg.png +0 -0
- package/dist/images/inspiration-bg.png +0 -0
- package/dist/images/inspiration-products/default.svg +11 -0
- package/dist/images/invitation-background-4x.png +0 -0
- package/dist/images/kimi.svg +1 -0
- package/dist/images/link-blue.svg +4 -0
- package/dist/images/link.svg +4 -0
- package/dist/images/lobster.svg +118 -0
- package/dist/images/login1.svg +93 -0
- package/dist/images/login2.svg +80 -0
- package/dist/images/login3.svg +44 -0
- package/dist/images/login4.svg +18 -0
- package/dist/images/mode-default-icon.svg +22 -0
- package/dist/images/no-data.svg +26 -0
- package/dist/images/no-search-results.svg +25 -0
- package/dist/images/ppt-preview/placeholder-main.webp +0 -0
- package/dist/images/ppt-preview/placeholder-thumb.webp +0 -0
- package/dist/images/ppt-template/dark-tech.png +0 -0
- package/dist/images/ppt-template/huawei.png +0 -0
- package/dist/images/ppt-template/light-tech.png +0 -0
- package/dist/images/ppt-template/paper-humanities.png +0 -0
- package/dist/images/ppt-template/template-default.png +0 -0
- package/dist/images/ppt-template/template-error.png +0 -0
- package/dist/images/ppt-template/template-generate-bg.svg +9639 -0
- package/dist/images/qwen.svg +1 -0
- package/dist/images/task-list/empty-state.svg +4 -0
- package/dist/images/task-list.svg +1 -0
- package/dist/images/vendor.svg +4 -0
- package/dist/images/version-bg.svg +85 -0
- package/dist/images/version.svg +9 -0
- package/dist/images/zhipu.svg +1 -0
- package/dist/index.html +74 -0
- package/dist/loading-point-style.webp +0 -0
- package/dist/loading-small.webp +0 -0
- package/dist/manifest.json +25 -0
- package/package.json +126 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{r as u,j as t,a as he,d as ve,c as O,B as D,J as ge}from"./index-Cb4fQgom.js";import{S as te}from"./SearchInput-tux8xXH1.js";import{T as we}from"./Tab-FE0F2EQP.js";import{p as je,a as ye,f as be,c as Ne}from"./chat-input-options-CpkOtPgQ.js";import{s as ke,x as Ie}from"./helpers-CCilgpNy.js";import{Q as Se}from"./quick-actions-DzZE-zyP.js";import{u as ne}from"./useAgentData-D-k9cXfg.js";import{u as se}from"./useExpertCatalog-BZdw1CYs.js";import{a as S,A as Pe,O as Ce}from"./OverflowTooltip-CE5PjAb-.js";import{f as Te}from"./skill-options-cache-D1BJGTCU.js";import{A as Ae}from"./AppModal-BYZTSuch.js";import{f as Fe}from"./thread-utils-Ct3yp4R3.js";import{S as Ee}from"./SkillAvatar-DwGvsY4f.js";import{u as B,d as De,D as Re,j as H,c as ae,H as Oe,g as Le,P as Me,M as _e,h as $e,i as Be,X as He}from"./XlsxDocumentPreview-BY-ht09K.js";import"./NameInitialIcon-DP-6_HQY.js";import"./index-DQ2vVjmV.js";function R(...e){return e.filter(Boolean).join(" ")}function ze({open:e}){return t.jsx("svg",{className:R("h-3 w-3 shrink-0 transition-transform",e&&"rotate-180"),viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:t.jsx("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function U(e,n,s){var r;if(e.length===0)return-1;let a=n;for(let i=0;i<e.length;i+=1)if(a=(a+s+e.length)%e.length,!((r=e[a])!=null&&r.disabled))return a;return-1}function Ue({value:e,options:n,onChange:s,placeholder:a="请选择",popupClassName:r,className:i,disabled:l=!1,id:o,...d}){var K,X;const c=u.useId(),f=o??`select-${c}`,m=`${f}-listbox`,g=u.useRef(null),C=u.useRef(null),[p,w]=u.useState(!1),[v,N]=u.useState(-1),j=n.findIndex(x=>x.value===e),k=j>=0?n[j]:void 0,h=()=>{var x;return j>=0&&!((x=n[j])!=null&&x.disabled)?j:U(n,-1,1)},I=()=>{l||n.length===0||(w(!0),N(h()))},T=()=>{w(!1),N(-1)},y=x=>{var b;x.disabled||(s(x.value,x),T(),(b=g.current)==null||b.focus())};u.useEffect(()=>{if(!p)return;const x=b=>{var M,_;const E=b.target;(M=g.current)!=null&&M.contains(E)||(_=C.current)!=null&&_.contains(E)||T()};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[p]);const z=x=>{if(!l)switch(x.key){case"ArrowDown":{if(x.preventDefault(),!p){I();return}N(b=>U(n,b,1));break}case"ArrowUp":{if(x.preventDefault(),!p){I();return}N(b=>U(n,b,-1));break}case"Enter":case" ":{if(x.preventDefault(),!p){I();return}const b=n[v];b&&y(b);break}case"Escape":p&&(x.preventDefault(),T());break;case"Tab":T();break}},L=(K=g.current)==null?void 0:K.getBoundingClientRect(),xe=L?{top:L.bottom+4,left:L.left,minWidth:L.width}:{},pe=p?t.jsx("div",{ref:C,id:m,role:"listbox","data-testid":"select-popup",className:R("fixed z-[9999] overflow-hidden rounded-md border border-[var(--border-default)] bg-[var(--surface-card)] py-1 shadow-[0_2px_12px_rgba(0,0,0,0.16)]",r),style:xe,children:n.map((x,b)=>{const E=x.value===e,M=b===v,_=`${m}-option-${x.value}`;return t.jsx("button",{id:_,type:"button",role:"option","aria-selected":E,disabled:x.disabled,className:R("flex min-h-8 w-full items-center bg-[var(--surface-card)] px-3 text-left text-sm transition-colors",E?"text-[#1476FF]":"text-[var(--text-primary)]",M&&!E?"bg-[#F5F5F5]":"",x.disabled?"cursor-not-allowed opacity-40":"",!x.disabled&&!E?"cursor-pointer hover:bg-[#F5F5F5]":"",!x.disabled&&E?"cursor-pointer":""),onMouseEnter:()=>{x.disabled||N(b)},onClick:()=>y(x),children:t.jsx("span",{className:"min-w-0 flex-1 truncate",children:x.label})},x.value)})}):null;return t.jsxs(t.Fragment,{children:[t.jsxs("button",{...d,ref:g,id:f,type:"button",role:"combobox","aria-expanded":p,"aria-haspopup":"listbox","aria-controls":m,"aria-activedescendant":p&&v>=0?`${m}-option-${(X=n[v])==null?void 0:X.value}`:void 0,disabled:l,className:R("ui-input inline-flex h-8 items-center justify-between gap-2 px-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-40",p&&"border-[var(--input-border-active)]",i),onClick:()=>{p?T():I()},onKeyDown:z,children:[t.jsx("span",{className:R("min-w-0 flex-1 truncate",!k&&"text-[var(--text-field-placeholder)]"),children:(k==null?void 0:k.label)??a}),t.jsx(ze,{open:p})]}),p&&he.createPortal(pe,document.body)]})}const Ve="__new__",We="该灵感包含智能体广场智能体,需要先选择已有会话并召唤后使用";function Ke(e){return"prompt"in e&&typeof e.prompt=="string"}async function Xe(e){if(Ke(e))return e;const n=await S(`/api/inspiration/templates/${e.id}`);if(!n.ok)throw new Error(`Failed to fetch inspiration template: ${n.status}`);return(await n.json()).data}function A(e){return(e==null?void 0:e.replace(/^@/,"").trim().toLowerCase())??""}function re(e){return e.replace(/\s*\([^)]*\)\s*$/,"").replace(/^@/,"").trim()}function Je(e,n){const s=new Map(n.map(i=>[A(i.name),i.name.trim()])),a=[],r=new Set;for(const i of e){const o=[i.id,i.name].map(c=>s.get(A(c))).find(Boolean);if(!o)continue;const d=A(o);r.has(d)||(r.add(d),a.push(o))}return a}function J(e,n){return e.find(s=>s.id===n.id)}function Ge(e,n){return[n.id,e==null?void 0:e.id,e==null?void 0:e.breedId,e==null?void 0:e.displayName,e==null?void 0:e.name,re(n.label)].map(A).filter(Boolean)}function qe(e,n){return[n.insert,...(e==null?void 0:e.mentionPatterns)??[]].map(A).filter(Boolean)}function Ze(e){return[e.id,re(e.label)].map(A).filter(Boolean)}function Qe(e){return[e.insert].map(A).filter(Boolean)}function G(e,n){return[e.id,e.catId,e.name].map(A).filter(Boolean).some(a=>n.includes(a))}function Ye(e,n,s,a){var o,d;const r=[...n.map(c=>({option:c,strongValues:Ge(J(a,c),c),aliasValues:qe(J(a,c),c)})),...s.map(c=>({option:c,strongValues:Ze(c),aliasValues:Qe(c)}))],i=r.filter(({strongValues:c})=>G(e,c));if(i.length===1)return((o=i[0])==null?void 0:o.option)??null;const l=r.filter(({aliasValues:c})=>G(e,c));return l.length===1?((d=l[0])==null?void 0:d.option)??null:null}function et(e,n,s){const a=be(n),r=s.map(Ne),i=[],l=new Set;for(const o of e){const d=Ye(o,a,r,n),c=d==null?void 0:d.insert.trim();if(!d||!c)continue;const f=`${d.id}:${c.toLowerCase()}`;l.has(f)||(l.add(f),i.push({catId:d.id,mention:c}))}return i}function tt(e,n){return new RegExp(`(^|\\s)${n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=\\s|$)`,"i").test(e)}function nt(e,n){const s=new Map(Se.filter(a=>a.show!==!1).map(a=>[A(a.label),a.label]));for(const a of e){const r=s.get(A(a));if(!r)continue;const i=Ie(r);return n.includes(i)?null:i}return null}function ie(e){const n=[],s=new Set;for(const a of e)for(const r of[a.id,a.catId]){const i=r.trim();!i.startsWith("expert-")||s.has(i)||(s.add(i),n.push(i))}return n}function le(e){return ie(e.agents).length>0?We:void 0}async function st(e,n){for(const s of n){const a=await S(`/api/threads/${encodeURIComponent(e)}/experts/${encodeURIComponent(s)}/invite`,{method:"POST"});if(a.ok)continue;const r=await a.json().catch(()=>null);if(!(a.status===409&&(r==null?void 0:r.error)==="ALREADY_INVITED"))throw new Error((r==null?void 0:r.message)||`Failed to summon expert ${s}: ${a.status}`)}}async function at(e,n,s){const a=await Te(),r=nt(e.tags,e.prompt),i=Je(e.skills,a).map(ke).filter(c=>!e.prompt.includes(c)),l=et(e.agents,n,s),o=l.map(c=>c.mention).filter(c=>!tt(e.prompt,c)),d=[r,...o,...i].filter(Boolean).join(" ").trim();return{text:d?`${d}
|
|
2
|
+
${e.prompt}`:e.prompt,mentionRefs:l}}async function rt(e){if(je(e))try{const n=await S("/api/projects/cwd");if(!n.ok)return;const s=await n.json().catch(()=>null),a=typeof(s==null?void 0:s.workspacePath)=="string"?s.workspacePath.trim():"";return ye(a)||void 0}catch{return}}function oe(e){const n=ve(),s=O(i=>i.setPendingChatInsert),{agents:a}=ne(),{experts:r}=se();return u.useCallback(async i=>{const l=i.kind==="new"?Ve:i.threadId;try{const o=await Xe(e),d=ie(o.agents);if(i.kind==="new"&&d.length>0)return;const{text:c,mentionRefs:f}=await at(o,a,r),m=i.kind==="new"?await rt(o.prompt):void 0;i.kind==="existing"&&d.length>0&&await st(i.threadId,d),s({threadId:l,text:c,...f.length>0?{mentionRefs:f}:{},...f.length>0?{suppressMentionMenu:!0}:{},inspirationData:{prompt:o.prompt,skills:o.skills,agents:o.agents,templateId:o.id,...m?{workspacePath:m}:{}}}),n(i.kind==="new"?"/":`/thread/${l}`)}catch(o){console.error("Failed to resolve inspiration template detail",o)}},[a,r,n,s,e])}function it(e){return((e??"").replace(/^@/,"").trim().slice(0,1)||"智").toUpperCase()}function lt(e){return/^(https?:\/\/|\/|data:image)/.test(e)}function ot(e){return e?e.startsWith("/uploads/")?`${Pe}${e}`:e:""}function V({avatar:e,size:n}){return lt(e.avatarSrc)?t.jsx("div",{className:"overflow-hidden rounded-full",style:{width:n,height:n},children:t.jsx("img",{src:e.avatarSrc,alt:e.displayName,className:"h-full w-full object-cover"})}):t.jsx("div",{className:"inline-flex items-center justify-center rounded-full font-semibold text-[var(--thread-avatar-initial-text)]",style:{width:n,height:n,backgroundColor:e.color,fontSize:n<=16?10:12},children:it(e.displayName)})}function F(e,n){return e*(n/32)}function q(e,n,s){if(e===2){const i=[{left:1,top:6,zIndex:10},{left:11,top:6,zIndex:0}],l=i[n]??i[0];return{left:F(l.left,s),top:F(l.top,s),avatarSize:F(20,s),zIndex:l.zIndex}}if(e===3){const i=[{left:8,top:0},{left:0,top:16},{left:16,top:16}],l=i[n]??i[0];return{left:F(l.left,s),top:F(l.top,s),avatarSize:F(16,s)}}const a=[{left:0,top:0},{left:16,top:0},{left:0,top:16},{left:16,top:16}],r=a[n]??a[0];return{left:F(r.left,s),top:F(r.top,s),avatarSize:F(16,s)}}function ct({participants:e,getAgentById:n,getExpertById:s,size:a=32}){const r=e.slice(0,4).map(i=>{var d,c,f,m;const l=n(i),o=l?null:s==null?void 0:s(i);return!l&&!o?{avatarSrc:"",color:"var(--accent-primary)",displayName:i}:{avatarSrc:ot(((c=(d=l??o)==null?void 0:d.avatar)==null?void 0:c.trim())??""),color:((f=l==null?void 0:l.color)==null?void 0:f.primary)??((m=o==null?void 0:o.color)==null?void 0:m.primary)??"var(--accent-primary)",displayName:(l==null?void 0:l.displayName)??(o==null?void 0:o.displayName)??i}});return r.length===0?t.jsx("div",{className:"ui-avatar-fallback-shell shrink-0",style:{width:a,height:a},children:t.jsx("span",{className:"inline-flex h-full w-full items-center justify-center rounded-full bg-[var(--accent-primary)] text-xs font-semibold text-[var(--thread-avatar-initial-text)]",children:"智"})}):r.length===1?t.jsx("div",{className:"shrink-0",children:t.jsx(V,{avatar:r[0],size:a})}):r.length===2?t.jsx("div",{className:"relative shrink-0",style:{width:a,height:a},children:r.map((i,l)=>{const o=q(r.length,l,a);return t.jsx("div",{className:"absolute",style:{left:o.left,top:o.top,zIndex:o.zIndex},children:t.jsx(V,{avatar:i,size:o.avatarSize})},i.displayName)})}):t.jsx("div",{className:"relative shrink-0",style:{width:a,height:a},children:r.map((i,l)=>{const o=q(r.length,l,a);return t.jsx("div",{className:"absolute overflow-hidden rounded-full",style:{width:o.avatarSize,height:o.avatarSize,left:o.left,top:o.top},children:t.jsx(V,{avatar:i,size:o.avatarSize})},`${i.displayName}-${l}`)})})}const dt="__new__";function ut(e){if(!e)return null;const n=e.trim();return n===""?null:n}function Z(e){return e.title??(e.id==="default"?"大厅":"未命名会话")}function Q(e){const n=e.participants.length;return n<=0?"暂无参与智能体":`${n} 个参与智能体`}function ce({open:e,onClose:n,onCreateNew:s,onSelectExisting:a,newSessionDisabledReason:r}){const[i,l]=u.useState(""),[o,d]=u.useState([]),[c,f]=u.useState(null),[m,g]=u.useState(!1),{getAgentById:C}=ne(),{getExpertById:p}=se(),w=!!r,v=u.useCallback(async()=>{g(!0);try{const h=await S("/api/threads");if(!h.ok)return;const T=((await h.json()).threads??[]).map(y=>({id:y.id,title:ut(y.title),lastActiveAt:y.lastActiveAt,participants:y.participants??[],invitedExpertIds:y.invitedExpertIds??[]})).filter(y=>y.id!=="default").sort((y,z)=>z.lastActiveAt-y.lastActiveAt);d(T)}catch{}finally{g(!1)}},[]);u.useEffect(()=>{e&&(f(null),l(""),v())},[v,e]);const N=u.useMemo(()=>{const h=i.trim().toLowerCase();return h?o.filter(I=>Z(I).toLowerCase().includes(h)):o},[i,o]),j=()=>{w||(s(dt),n())},k=()=>{c&&(a(c),n())};return t.jsx(Ae,{open:e,onClose:n,disableBackdropClose:!0,title:"选择会话",panelClassName:"w-[560px]",bodyClassName:"p-0",zIndexClassName:"z-[120]",children:t.jsxs("div",{className:"flex flex-col",children:[t.jsxs("div",{className:"flex items-center gap-2 pt-4 pb-3",children:[t.jsx(te,{value:i,onChange:h=>l(h),onClear:()=>l(""),placeholder:"搜索会话",wrapperClassName:"flex-1"}),t.jsx(D,{variant:"default",size:"md",onlyIcon:!0,hasBorder:!0,"aria-label":"刷新会话列表",className:"shrink-0",iconLeft:t.jsx("img",{src:"/icons/icon-refresh.svg",alt:"",className:"h-4 w-4"}),onClick:()=>void v(),loading:m})]}),t.jsxs("div",{className:"max-h-[360px] overflow-y-auto pb-3",children:[m&&o.length===0?t.jsx("div",{className:"py-8 text-center text-sm text-[var(--text-secondary)]",children:"加载会话中..."}):null,!m&&o.length===0?t.jsx("div",{className:"py-8 text-center text-sm text-[var(--text-secondary)]",children:"暂无会话,可新建会话"}):null,!m&&o.length>0&&N.length===0?t.jsx("div",{className:"py-8 text-center text-sm text-[var(--text-secondary)]",children:"暂无匹配会话"}):null,t.jsx("div",{className:"space-y-2",children:N.map(h=>{const I=Z(h),T=c===h.id,y=Array.from(new Set([...h.participants,...h.invitedExpertIds]));return t.jsxs("button",{type:"button","data-testid":`session-option-${h.id}`,onClick:()=>f(h.id),className:["flex w-full items-stretch gap-2 rounded-lg border px-6 py-3 text-left transition-colors",T?"border-[#1476FF]":"border-[#F0F0F0]","bg-[#FAFAFA] hover:bg-[var(--surface-hover)]"].join(" "),children:[t.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[t.jsx(ct,{participants:y,getAgentById:C,getExpertById:p,size:32}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-sm font-medium text-[var(--text-primary)]",title:I,children:I}),t.jsx("div",{className:"truncate text-xs text-[var(--text-secondary)]",title:Q(h),children:Q(h)})]})]}),t.jsx("div",{className:"self-end whitespace-nowrap text-xs text-[var(--text-tertiary)]",children:Fe(h.lastActiveAt,!0)})]},h.id)})})]}),t.jsx("div",{"data-testid":"create-session-dialog-actions",className:"flex items-center justify-end gap-2 px-4 py-3",children:t.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-2",children:[t.jsx(D,{variant:"default",size:"md",onClick:n,children:"取消"}),r?t.jsx(Ce,{content:r,forceShow:!0,className:"inline-flex shrink-0",children:t.jsx("span",{className:"inline-flex shrink-0",children:t.jsx(D,{variant:"default",size:"md",onClick:j,disabled:w,children:"新建会话"})})}):t.jsx("span",{className:"inline-flex shrink-0",children:t.jsx(D,{variant:"default",size:"md",onClick:j,disabled:w,children:"新建会话"})}),t.jsx(D,{variant:"major",size:"md",onClick:k,disabled:!c,children:"确定"})]})})]})})}const de={html:"bg-[#F23030]/[0.1] text-[#F23030]",featured:"bg-[#C25700]/[0.1] text-[#C25700]",document:"bg-[#1476FF]/[0.1] text-[#1476FF]",spreadsheet:"bg-[#029931]/[0.1] text-[#029931]",markdown:"bg-[#4349D0]/[0.1] text-[#4349D0]",image:"bg-[#0083C7]/[0.1] text-[#0083C7]",messagePush:"bg-[#832FD6]/[0.1] text-[#832FD6]",category:"bg-[#191919]/[0.1] text-[#191919]",skill:"bg-[#1476FF]/[0.1] text-[#1476FF]",agent:"bg-[var(--accent-secondary)]/[0.1] text-[var(--accent-secondary)]"};function ue(e){return e==="精选"?"featured":e==="文档"?"document":e==="表格"?"spreadsheet":e==="Markdown"?"markdown":e.toLowerCase()==="html"?"html":e==="图片"?"image":e==="消息推送"?"messagePush":"category"}function me(e){return e.toLowerCase()==="html"?"HTML":e}function mt(e){return de[e]}function fe({label:e,tone:n,iconSrc:s,testId:a}){const r=n??ue(e),i=me(e);return t.jsxs("span",{className:["inline-flex max-w-[120px] items-center rounded-[2px] px-1 text-xs font-medium",de[r]].join(" "),title:i,"data-testid":a??`inspiration-tag-${r}`,children:[s?t.jsx("img",{src:s,alt:"",className:"mr-1 h-3 w-3 shrink-0",onError:l=>{l.currentTarget.style.display="none"}}):null,t.jsx("span",{className:"truncate",children:i})]})}const W="/images/inspiration-products/default.svg",$={messagePush:{label:"消息推送",backgroundColor:"#FFF1E6",backgroundPath:"/images/inspiration/orange-bg.png",examplePath:"/images/inspiration/task-bg.png",showIcon:!1},word:{label:"文档",backgroundColor:"#EAF3FF",backgroundPath:"/images/inspiration/blue-bg.png",iconPath:"/icons/inspiration/icon-word.svg",examplePath:"/images/inspiration/doc-example.png"},excel:{label:"表格",backgroundColor:"#E8F8EF",backgroundPath:"/images/inspiration/green-bg.png",iconPath:"/icons/inspiration/icon-excel.svg",examplePath:"/images/inspiration/excel-example.png"},markdown:{label:"Markdown",backgroundColor:"#F1ECFF",backgroundPath:"/images/inspiration/purple-bg.png",iconPath:"/icons/inspiration/icon-markdown.svg",examplePath:"/images/inspiration/markdown-example.png"}};function ft(e){return e.includes("消息推送")?$.messagePush:e.includes("文档")?$.word:e.includes("表格")?$.excel:e.includes("Markdown")?$.markdown:null}function xt(e){const n=e.trim();return!!n&&n!==W}function pt({template:e,theme:n}){const s=n.showIcon!==!1&&n.iconPath;return t.jsxs("div",{"data-testid":"inspiration-card-product-layout",className:"grid h-full grid-cols-[minmax(0,1fr)_138px] items-center gap-3 p-4",children:[t.jsxs("div",{className:"flex min-w-0 flex-col items-start justify-center",children:[s?t.jsx("img",{"data-testid":"inspiration-card-product-icon",src:n.iconPath,alt:n.label,className:"mb-2 h-4 w-4 shrink-0"}):null,t.jsx("div",{"data-testid":"inspiration-card-product-title",className:"max-w-full truncate text-[13px] font-semibold leading-[19px] text-[#111827]",title:e.name,children:e.name}),t.jsx("div",{"data-testid":"inspiration-card-product-description",className:"mt-1 line-clamp-2 max-w-full text-[11px] leading-[17px] text-[#4B5563]",title:e.description,children:e.description}),t.jsx("div",{"data-testid":"inspiration-card-preview-tags",className:"mt-2 flex w-[142.857%] origin-top-left scale-[0.7] flex-nowrap gap-1 overflow-hidden",children:e.tags.map((a,r)=>{const i=ue(a),l=me(a);return t.jsx("span",{"data-testid":r===0?"inspiration-card-preview-tag":void 0,className:["inline-flex min-w-0 max-w-[120px] shrink-0 items-center rounded-[2px] px-1 text-[11px] font-medium leading-4",mt(i)].join(" "),title:l,children:t.jsx("span",{className:"truncate whitespace-nowrap",children:l})},a)})})]}),t.jsx("div",{className:"flex h-full w-[138px] items-center justify-center",children:t.jsx("img",{"data-testid":"inspiration-card-product-example",src:n.examplePath,alt:`${n.label}示例`,className:"h-[136px] w-[138px] object-contain"})})]})}function ht({template:e,onClick:n}){const[s,a]=u.useState(!1),r=oe(e),i=xt(e.imagePath)?null:ft(e.tags),l=le(e),o=f=>{f.stopPropagation(),a(!0)},d=f=>{r({kind:"new"})},c=f=>{r({kind:"existing",threadId:f})};return t.jsxs(t.Fragment,{children:[t.jsxs("div",{"data-testid":"inspiration-card",onClick:()=>n(e),className:"group w-full max-w-[490px] cursor-pointer overflow-hidden rounded-2xl border border-[#E6E6E6] bg-[var(--surface-card)] transition-shadow hover:shadow-[0_8px_20px_rgba(15,23,42,0.08)]",children:[i?t.jsx("div",{"data-testid":"inspiration-card-preview",className:"h-[168px] overflow-hidden bg-cover bg-center bg-[var(--surface-muted)]",style:{backgroundColor:i.backgroundColor,backgroundImage:`url(${i.backgroundPath})`},children:t.jsx(pt,{template:e,theme:i})}):t.jsx("div",{"data-testid":"inspiration-card-preview",className:"h-[168px] overflow-hidden bg-[var(--surface-muted)]",children:t.jsx("img",{src:e.imagePath||W,alt:e.name,className:"h-full w-full object-cover",onError:f=>{f.currentTarget.src=W}})}),t.jsxs("div",{"data-testid":"inspiration-card-content",className:"p-4",children:[t.jsx("h3",{"data-testid":"inspiration-card-title",className:"mb-1 truncate text-sm font-semibold text-[var(--text-primary)]",title:e.name,children:e.name}),t.jsx("p",{"data-testid":"inspiration-card-description",className:"mb-3 line-clamp-2 text-xs text-[var(--text-secondary)]",title:e.description,children:e.description}),t.jsxs("div",{className:"flex min-h-[20px] flex-wrap gap-1",children:[t.jsx("div",{className:"tag-row flex flex-wrap gap-1 group-hover:hidden",children:e.tags.map((f,m)=>t.jsx(fe,{label:f,testId:m===0?"inspiration-card-tag":void 0},f))}),t.jsx("div",{className:"hidden group-hover:flex",children:t.jsx(D,{variant:"ghost",size:"sm","data-testid":"inspiration-create-same-button",className:"create-same-btn text-sm text-[#1476FF]",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"auto",minWidth:0,minHeight:0,padding:0,border:0,borderRadius:0,background:"transparent",color:"#1476FF",fontSize:14,lineHeight:"20px"},onClick:o,children:"创建同款"})})]})]})]}),t.jsx(ce,{open:s,onClose:()=>a(!1),onCreateNew:d,onSelectExisting:c,newSessionDisabledReason:l})]})}const Y=["grid gap-4 justify-items-center","grid-cols-[repeat(auto-fit,minmax(237px,1fr))]","min-[1280px]:grid-cols-[repeat(3,minmax(237px,1fr))]","min-[1440px]:grid-cols-[repeat(4,minmax(237px,1fr))]","min-[1600px]:grid-cols-[repeat(5,minmax(237px,1fr))]"].join(" ");function vt({templates:e,isLoading:n,onCardClick:s}){return n?t.jsx("div",{className:Y,children:Array.from({length:8}).map((a,r)=>t.jsxs("div",{className:"w-full max-w-[490px] rounded-xl overflow-hidden bg-[var(--surface-card)] border border-[var(--border-subtle)] animate-pulse",children:[t.jsx("div",{className:"aspect-[16/10] bg-[var(--surface-muted)]"}),t.jsxs("div",{className:"p-3 space-y-2",children:[t.jsx("div",{className:"h-4 bg-[var(--surface-muted)] rounded w-3/4"}),t.jsx("div",{className:"h-3 bg-[var(--surface-muted)] rounded w-1/2"})]})]},r))}):e.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-16 text-center",children:[t.jsx("div",{className:"w-16 h-16 mb-4 rounded-full bg-[var(--surface-muted)] flex items-center justify-center",children:t.jsx("svg",{className:"w-8 h-8 text-[var(--text-secondary)]",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})}),t.jsx("h3",{className:"text-lg font-medium text-[var(--text-primary)] mb-1",children:"暂无灵感"}),t.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"试试其他分类或搜索关键字"})]}):t.jsx("div",{className:Y,children:e.map(a=>t.jsx(ht,{template:a,onClick:s},a.id))})}const gt={技:"J",智:"Z",写:"X"},wt=[{initial:"A",char:"阿"},{initial:"B",char:"八"},{initial:"C",char:"擦"},{initial:"D",char:"搭"},{initial:"E",char:"蛾"},{initial:"F",char:"发"},{initial:"G",char:"噶"},{initial:"H",char:"哈"},{initial:"J",char:"击"},{initial:"K",char:"喀"},{initial:"L",char:"垃"},{initial:"M",char:"妈"},{initial:"N",char:"拿"},{initial:"O",char:"哦"},{initial:"P",char:"啪"},{initial:"Q",char:"七"},{initial:"R",char:"然"},{initial:"S",char:"撒"},{initial:"T",char:"他"},{initial:"W",char:"挖"},{initial:"X",char:"西"},{initial:"Y",char:"压"},{initial:"Z",char:"匝"}],jt=new Intl.Collator("zh-Hans-CN-u-co-pinyin",{usage:"sort",sensitivity:"base"});function yt(e){return/[\u3400-\u9FFF]/.test(e)}function bt(e){const n=gt[e];if(n)return n;let s="A";for(const a of wt){if(jt.compare(e,a.char)>=0){s=a.initial;continue}break}return s}function Nt(e){const n=e.trim().slice(0,1);return n?/[a-zA-Z]/.test(n)?n.toUpperCase():yt(n)?bt(n):n.toUpperCase():"?"}function kt(e){return/^(https?:\/\/|\/|data:image)/.test(e)}function It({agent:e}){var a;const n=(a=e.icon)!=null&&a.startsWith("/uploads/")?`/api${e.icon}`:e.icon,s=n&&kt(n);return t.jsxs("div",{"data-testid":`inspiration-agent-card-${e.id}`,className:"flex w-full min-w-0 items-center gap-3 rounded-[8px] px-4 py-3",style:{backgroundColor:"#fafafa"},children:[t.jsx("div",{"data-testid":`inspiration-agent-card-${e.id}-icon`,className:"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[var(--surface-card-muted)]",children:s?t.jsx("img",{src:n,alt:e.name,className:"h-full w-full rounded-full object-cover"}):t.jsx("span",{className:"text-sm font-semibold text-[var(--text-label-secondary)]",children:Nt(e.name)})}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-sm font-medium text-[var(--text-primary)]",title:e.name,children:e.name}),t.jsx("div",{className:"truncate text-xs text-[var(--text-secondary)]",title:e.id,children:e.id})]})]})}function St({agents:e}){return e.length===0?null:t.jsx("div",{"data-testid":"inspiration-agent-card-list",className:"flex flex-col gap-2",children:e.map(n=>t.jsx(It,{agent:n},n.id))})}function Pt({skill:e}){return t.jsxs("div",{"data-testid":`inspiration-skill-card-${e.id}`,className:"flex w-full min-w-0 items-center gap-3 rounded-[8px] px-4 py-3",style:{backgroundColor:"#fafafa"},children:[t.jsx(Ee,{avatarName:e.id,avatarUrl:e.icon,dataTestId:`inspiration-skill-card-${e.id}-icon`,className:"h-8 w-8 rounded-[8px]"}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-sm font-medium text-[var(--text-primary)]",title:e.name,children:e.name}),t.jsx("div",{className:"truncate text-xs text-[var(--text-secondary)]",title:e.id,children:e.id})]})]})}function Ct({skills:e}){return e.length===0?null:t.jsx("div",{"data-testid":"inspiration-skill-card-list",className:"flex flex-col gap-2",children:e.map(n=>t.jsx(Pt,{skill:n},n.id))})}function Tt({template:e}){const[n,s]=u.useState(!1),a=oe(e),r=le(e),i=()=>{s(!0)},l=()=>{a({kind:"new"})},o=d=>{a({kind:"existing",threadId:d})};return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"flex h-full flex-col overflow-hidden bg-[var(--surface-card)]",children:t.jsxs("div",{className:"flex-1 overflow-y-auto px-4 py-6",children:[t.jsx("div",{className:"truncate text-sm font-medium text-[var(--text-primary)]",title:e.name,children:e.name}),t.jsx("div",{"data-testid":"inspiration-info-tag-row",className:"mt-2 flex flex-wrap gap-1",children:e.tags.map((d,c)=>t.jsx(fe,{label:d,testId:c===0?"inspiration-card-tag":void 0},d))}),t.jsx("div",{className:"mt-6",children:t.jsx(D,{variant:"major",size:"lg",block:!0,onClick:i,children:"创建同款"})}),e.skills.length>0&&t.jsxs("div",{className:"mt-6",children:[t.jsx("h3",{className:"mb-2 text-sm font-medium text-[var(--text-primary)]",children:"使用的技能"}),t.jsx(Ct,{skills:e.skills})]}),e.agents.length>0&&t.jsxs("div",{className:"mt-6",children:[t.jsx("h3",{className:"mb-2 text-sm font-medium text-[var(--text-primary)]",children:"使用的智能体"}),t.jsx(St,{agents:e.agents})]}),t.jsxs("div",{className:"mt-6",children:[t.jsx("h3",{className:"mb-2 text-sm font-medium text-[var(--text-primary)]",children:"详细介绍"}),t.jsx("p",{className:"whitespace-pre-wrap text-sm leading-relaxed text-[var(--text-secondary)]",children:e.description})]})]})}),t.jsx(ce,{open:n,onClose:()=>s(!1),onCreateNew:l,onSelectExisting:o,newSessionDisabledReason:r})]})}function At(e){const n=e.replace(/\\/g,"/"),s=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return s<=0?e:e.slice(0,s)||e}function Ft({active:e,fullScreenContainerRef:n,frameless:s=!1}){const a=O(c=>c.closeDocumentPreview),r=e.projectPath&&e.projectPath!=="default"?e.projectPath:void 0,i=B(e.threadId,e.path),l=De(e.path,r,i),o=u.useCallback(async()=>{const c=At(e.path);try{await S("/api/projects/open-local-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:c,...r?{projectPath:r}:{}})})}catch{}},[e.path,r]),d=u.useMemo(()=>l.status==="loading"||l.status==="idle"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-gray-500",children:"加载中…"}):l.status==="error"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-red-600",children:l.message}):t.jsx("div",{className:s?"flex min-h-0 flex-1 flex-col":"flex min-h-0 flex-1 flex-col px-4 py-3",children:t.jsx(Re,{contentBase64:l.contentBase64,title:e.displayName})}),[e.displayName,s,l]);return s?t.jsx("div",{"data-testid":"document-docx-preview-panel",className:"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden",children:d}):t.jsx(H,{panelTestId:"document-docx-preview-panel",title:e.displayName,fullScreenContainerRef:n,onRequestClose:a,onOpenFolder:o,folderButtonTitle:"打开文件所在文件夹",children:t.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:d})})}function Et(e){const n=e.replace(/\\/g,"/"),s=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return s<=0?e:e.slice(0,s)||e}function Dt({active:e,fullScreenContainerRef:n,frameless:s=!1}){const a=O(p=>p.closeDocumentPreview),r=e.projectPath&&e.projectPath!=="default"?e.projectPath:void 0,i=B(e.threadId,e.path),[l,o]=u.useState(0),d=u.useCallback(()=>o(p=>p+1),[]),c=ae(e.path,r,i,l),f=u.useCallback(async()=>{const p=Et(e.path);try{await S("/api/projects/open-local-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:p,...r?{projectPath:r}:{}})})}catch{}},[e.path,r]),m=c.status==="ok"?c.content:"",g=u.useMemo(()=>c.status!=="ok"?null:t.jsx(Oe,{html:m,filePath:e.path,projectPath:r,onRefresh:d}),[c.status,m,e.path,r,d]),C=u.useMemo(()=>c.status==="loading"||c.status==="idle"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-gray-500",children:"加载中…"}):c.status==="error"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-red-600",children:c.message}):t.jsx("div",{className:s?"flex min-h-0 flex-1 flex-col":"flex min-h-0 flex-1 flex-col px-4 py-3",children:t.jsx("div",{className:"min-h-0 flex flex-1 flex-col",children:t.jsx(Le,{html:c.content,title:e.displayName})})}),[e.displayName,s,c]);return s?t.jsx("div",{"data-testid":"document-html-preview-panel",className:"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden",children:C}):t.jsx(H,{panelTestId:"document-html-preview-panel",title:e.displayName,fullScreenContainerRef:n,onRequestClose:a,onOpenFolder:f,folderButtonTitle:"打开文件所在文件夹",extraHeaderContent:g,children:t.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:C})})}function Rt(e){const n=e.replace(/\\/g,"/"),s=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return s<=0?e:e.slice(0,s)||e}function Ot({active:e,fullScreenContainerRef:n,frameless:s=!1}){const a=O(m=>m.closeDocumentPreview),r=e.projectPath&&e.projectPath!=="default"?e.projectPath:void 0,i=B(e.threadId,e.path),l=ae(e.path,r,i),o=u.useCallback(async()=>{const m=Rt(e.path);try{await S("/api/projects/open-local-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:m,...r?{projectPath:r}:{}})})}catch{}},[e.path,r]),d=l.status==="ok"?l.content:"",c=u.useMemo(()=>l.status!=="ok"?null:t.jsx(Me,{text:d,copyKindLabel:"Markdown"}),[l.status,d]),f=u.useMemo(()=>l.status==="loading"||l.status==="idle"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-gray-500",children:"加载中…"}):l.status==="error"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-red-600",children:l.message}):t.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:t.jsx("div",{className:s?"min-h-0 flex-1 overflow-auto":"min-h-0 flex-1 overflow-auto px-6 py-4",children:t.jsx(_e,{source:l.content})})}),[s,l]);return s?t.jsx("div",{"data-testid":"document-markdown-preview-panel",className:"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden",children:f}):t.jsx(H,{panelTestId:"document-markdown-preview-panel",title:e.displayName,fullScreenContainerRef:n,onRequestClose:a,onOpenFolder:o,folderButtonTitle:"打开文件所在文件夹",extraHeaderContent:c,children:t.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:f})})}function Lt(e){const n=e.replace(/\\/g,"/"),s=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return s<=0?e:e.slice(0,s)||e}function Mt({active:e,fullScreenContainerRef:n,frameless:s=!1}){const a=O(m=>m.closeDocumentPreview),r=e.projectPath&&e.projectPath!=="default"?e.projectPath:void 0,i=B(e.threadId,e.path),l=$e(e.path,r,i),o=l.status==="ok"?l.contentBase64:null,d=Be(o),c=u.useCallback(async()=>{const m=Lt(e.path);try{await S("/api/projects/open-local-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:m,...r?{projectPath:r}:{}})})}catch{}},[e.path,r]),f=u.useMemo(()=>l.status==="loading"||l.status==="idle"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-gray-500",children:"加载中…"}):l.status==="error"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-red-600",children:l.message}):d.status==="error"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-red-600",children:d.message}):d.status==="parsing"||d.status==="idle"?t.jsx("div",{className:"flex flex-1 items-center justify-center p-6 text-sm text-gray-400",children:"解析中…"}):t.jsx("div",{className:s?"flex min-h-0 flex-1 flex-col":"flex min-h-0 flex-1 flex-col px-4 py-3",children:t.jsx(He,{sheets:d.sheets,title:e.displayName},o)}),[e.displayName,o,s,l,d]);return s?t.jsx("div",{"data-testid":"document-xlsx-preview-panel",className:"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden",children:f}):t.jsx(H,{panelTestId:"document-xlsx-preview-panel",title:e.displayName,fullScreenContainerRef:n,onRequestClose:a,onOpenFolder:c,folderButtonTitle:"打开文件所在文件夹",children:t.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:f})})}function _t(e){const n={path:e.path,displayName:e.name,threadId:"inspiration-preview"};switch(e.type){case"html":return{...n,kind:"html"};case"markdown":return{...n,kind:"markdown"};case"word":return{...n,kind:"docx"};case"excel":return{...n,kind:"xlsx"};case"image":return null}}function $t({product:e}){if(!e)return null;if(e.type==="image"){const a=t.jsx("div",{className:"mb-3 shrink-0 text-sm font-medium text-[var(--text-primary)]",children:e.name});return t.jsxs("div",{className:"flex h-full min-h-0 w-full flex-col items-center justify-center overflow-hidden",children:[a,t.jsx("img",{src:e.path,alt:e.name,className:"max-h-full max-w-full object-contain",onError:r=>{r.currentTarget.src="/images/inspiration-products/default.svg"}})]})}const n=_t(e);if(!n)return null;let s=null;switch(n.kind){case"html":s=t.jsx(Dt,{active:n,frameless:!0});break;case"markdown":s=t.jsx(Ot,{active:n,frameless:!0});break;case"docx":s=t.jsx(Ft,{active:n,frameless:!0});break;case"xlsx":s=t.jsx(Mt,{active:n,frameless:!0});break;case"pdf":s=null}return s?t.jsx("div",{className:"flex h-full min-h-0 w-full flex-col overflow-hidden",children:t.jsx("div",{className:"min-h-0 flex-1",children:s})}):null}function Bt({name:e,onBack:n}){return t.jsxs("div",{"data-testid":"inspiration-detail-header",className:"flex min-w-0 flex-1 items-center gap-2",children:[t.jsx("button",{type:"button",onClick:n,"aria-label":"返回灵感广场",className:"shrink-0 rounded-lg py-2 pr-2 pl-0 transition-colors hover:bg-[var(--surface-hover)]",children:t.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}),t.jsx("h2",{className:"min-w-0 flex-1 truncate pr-4 text-lg font-semibold text-[var(--text-primary)]",children:e})]})}function Ht({template:e,onBack:n}){var o;const[s,a]=u.useState(!0),r=!!e.productPath,i=e.tags.includes("定时任务")&&((o=e.product)==null?void 0:o.type)==="image",l=u.useMemo(()=>({leftContent:t.jsx(Bt,{name:e.name,onBack:n}),panelToggle:{isOpen:s,onToggle:()=>a(d=>!d),openLabel:"展开信息面板",closeLabel:"收起信息面板"}}),[s,n,e.name]);return ge(l),t.jsx("div",{className:"flex h-full flex-col overflow-hidden",children:t.jsxs("div",{className:"flex min-h-0 flex-1",children:[t.jsx("div",{"data-testid":"inspiration-preview-pane",className:["min-w-0 flex-1 overflow-hidden p-4",s?"border-r border-[#f0f0f0]":""].join(" "),children:t.jsx("div",{"data-testid":"inspiration-preview-surface",className:["flex h-full flex-col",i?"bg-[url(/images/inspiration-bg.png)] bg-cover bg-center":""].join(" "),children:t.jsx("div",{className:"flex min-h-0 flex-1 items-center justify-center",children:r?t.jsx($t,{product:e.product}):t.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"暂无产物"})})})}),s&&t.jsx("div",{"data-testid":"inspiration-info-panel",className:"w-[392px] min-w-[320px] shrink-0 overflow-hidden",children:t.jsx(Tt,{template:e})})]})})}function P(...e){for(const n of e){if(typeof n!="string")continue;const s=n.trim();if(s)return s}}function zt(e,n){if(!n)return e;const s=P(n.id)??e.id,a=P(n.name)??e.name,r=P(n.iconUrl,n.icon,n.avatar,e.icon);return{...e,id:s,name:a,...r?{icon:r}:{}}}async function Ut(e){try{const n=await S(`/api/skills/detail?name=${encodeURIComponent(e.id)}`);if(!n.ok)return e;const s=await n.json();return zt(e,s)}catch{return e}}function Vt(e,n){if(!n)return e;const s=P(n.id)??e.id,a=P(n.displayName,n.name)??e.name,r=P(n.breedId,n.id)??e.catId,i=P(n.avatar,n.icon,e.icon);return{...e,id:s,name:a,catId:r,...i?{icon:i}:{}}}function Wt(e,n){if(!n)return e;const s=P(n.expertId)??e.id,a=P(n.displayName,n.nickname)??e.name,r=P(n.avatar,e.icon);return{...e,id:s,name:a,catId:s,...r?{icon:r}:{}}}function Kt(e){return e.id.startsWith("expert-")||e.catId.startsWith("expert-")}async function Xt(){try{const e=await S("/api/agents");if(!e.ok)return[];const n=await e.json();return Array.isArray(n.agents)?n.agents:Array.isArray(n.cats)?n.cats:[]}catch{return[]}}async function Jt(e){if(!e)return[];try{const n=await S("/api/experts");if(!n.ok)return[];const s=await n.json();return Array.isArray(s.experts)?s.experts:[]}catch{return[]}}async function Gt(e){if(e.length===0)return e;const[n,s]=await Promise.all([Xt(),Jt(e.some(Kt))]),a=new Map;for(const i of n){const l=P(i.id);l&&a.set(l,i)}const r=new Map;for(const i of s){const l=P(i.expertId);l&&r.set(l,i)}return e.map(i=>{const l=r.get(i.id)??r.get(i.catId);return l?Wt(i,l):Vt(i,a.get(i.id)??a.get(i.catId))})}async function qt(e){const[n,s]=await Promise.all([Promise.all(e.skills.map(Ut)),Gt(e.agents)]);return{...e,skills:n,agents:s}}function Zt(e){const[n,s]=u.useState(null),[a,r]=u.useState(!1),[i,l]=u.useState(null),[o,d]=u.useState(0),c=u.useCallback(()=>{d(f=>f+1)},[]);return u.useEffect(()=>{if(!e){s(null);return}let f=!1;return r(!0),l(null),S(`/api/inspiration/templates/${e}`).then(m=>{if(!m.ok)throw new Error(`Failed to fetch template: ${m.status}`);return m.json()}).then(m=>m.data?qt(m.data):null).then(m=>{f||(s(m),r(!1))}).catch(m=>{f||(l(m instanceof Error?m.message:"Unknown error"),r(!1))}),()=>{f=!0}},[e,o]),{template:n,isLoading:a,error:i,refetch:c}}function Qt(e={}){const{category:n="全部",keyword:s="",productType:a="全部"}=e,[r,i]=u.useState([]),[l,o]=u.useState(0),[d,c]=u.useState(!0),[f,m]=u.useState(null),[g,C]=u.useState(0),p=u.useCallback(()=>{C(w=>w+1)},[]);return u.useEffect(()=>{let w=!1;c(!0),m(null);const v=new URLSearchParams;n&&n!=="全部"&&v.set("category",n),s&&v.set("keyword",s),a&&a!=="全部"&&v.set("productType",a);const N=v.toString(),j=`/api/inspiration/templates${N?`?${N}`:""}`;return S(j).then(k=>k.json()).then(k=>{var h,I;w||(i(((h=k.data)==null?void 0:h.templates)||[]),o(((I=k.data)==null?void 0:I.total)||0),c(!1))}).catch(k=>{w||(m(k.message||"Unknown error"),c(!1))}),()=>{w=!0}},[n,s,a,g]),{templates:r,total:l,isLoading:d,error:f,refetch:p}}const Yt=["全部","精选","定时任务","专家团思辨","文档处理","深度研究","幻灯片","数据分析","数据可视化","金融服务"],en=Yt.map(e=>({value:e,label:e})),ee="mx-auto h-full w-full max-w-[1920px]",tn=[{value:"全部",label:"全部类型"},{value:"word",label:"文档"},{value:"excel",label:"表格"},{value:"markdown",label:"Markdown"},{value:"html",label:"HTML"},{value:"image",label:"图片"},{value:"messagePush",label:"消息推送"}];function nn(){const[e,n]=u.useState("全部"),[s,a]=u.useState(""),[r,i]=u.useState("全部"),[l,o]=u.useState(null),{templates:d,total:c,isLoading:f,refetch:m}=Qt({category:e,keyword:s,productType:r}),{template:g,isLoading:C,error:p}=Zt(l),w=j=>{n(j),a(""),o(null)},v=j=>{o(j.id)},N=()=>{o(null)};return l?t.jsx("div",{className:ee,children:C?t.jsx("div",{className:"flex h-full items-center justify-center text-sm text-[var(--text-secondary)]",children:"加载灵感详情中..."}):g?t.jsx(Ht,{template:g,onBack:N}):t.jsx("div",{className:"flex h-full items-center justify-center text-sm text-[var(--text-secondary)]",children:p??"灵感详情不可用"})}):t.jsxs("div",{className:`${ee} flex flex-col px-8 py-8`,children:[t.jsx("div",{"data-testid":"inspiration-tabs-section",children:t.jsx(we,{items:en,value:e,onChange:w})}),t.jsxs("div",{"data-testid":"inspiration-total-heading",className:"mt-6 text-xl font-semibold text-[var(--text-primary)]",children:["全部(",c,")"]}),t.jsxs("div",{"data-testid":"inspiration-search-section",className:"mt-6 flex items-center gap-3",children:[t.jsx(Ue,{"aria-label":"类型筛选",value:r,options:tn,onChange:i,className:"w-[160px] shrink-0"}),t.jsx(te,{value:s,onChange:a,onClear:()=>a(""),placeholder:"搜索灵感...",wrapperClassName:"min-w-0 flex-1",inputClassName:"h-8"}),t.jsx(D,{variant:"default",size:"lg",onlyIcon:!0,hasBorder:!0,"aria-label":"刷新灵感列表","data-testid":"inspiration-refresh-button",className:"shrink-0",iconLeft:t.jsx("img",{src:"/icons/icon-refresh.svg",alt:"",className:"h-4 w-4"}),onClick:m})]}),t.jsx("div",{"data-testid":"inspiration-card-section",className:"mt-6 flex-1 overflow-y-auto",children:t.jsx(vt,{templates:d,isLoading:f,onCardClick:v})})]})}function jn(){return t.jsx("div",{className:"h-full overflow-hidden ui-shell-surface",children:t.jsx(nn,{})})}export{jn as default};
|
|
3
|
+
//# sourceMappingURL=InspirationPage-BTqLpcHY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InspirationPage-BTqLpcHY.js","sources":["../../src/components/shared/Select.tsx","../../src/components/inspiration-plaza/hooks/useCreateSameFlow.ts","../../src/components/inspiration-plaza/components/SessionAvatarGroup.tsx","../../src/components/inspiration-plaza/components/CreateSessionDialog.tsx","../../src/components/inspiration-plaza/components/InspirationTag.tsx","../../src/components/inspiration-plaza/components/InspirationCard.tsx","../../src/components/inspiration-plaza/components/InspirationCardGrid.tsx","../../src/components/inspiration-plaza/utils/nameInitial.ts","../../src/components/inspiration-plaza/components/AgentCard.tsx","../../src/components/inspiration-plaza/components/SkillCard.tsx","../../src/components/inspiration-plaza/components/InspirationInfo.tsx","../../src/components/document-preview/docx/DocxPreviewPanel.tsx","../../src/components/document-preview/HtmlPreviewPanel.tsx","../../src/components/document-preview/MarkdownPreviewPanel.tsx","../../src/components/document-preview/xlsx/XlsxPreviewPanel.tsx","../../src/components/inspiration-plaza/components/InspirationProductPreview.tsx","../../src/components/inspiration-plaza/components/InspirationDetail.tsx","../../src/components/inspiration-plaza/hooks/useInspirationDetail.ts","../../src/components/inspiration-plaza/hooks/useInspirationTemplates.ts","../../src/components/inspiration-plaza/types.ts","../../src/components/inspiration-plaza/InspirationPlaza.tsx","../../src/pages/InspirationPage.tsx"],"sourcesContent":["/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n type KeyboardEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface SelectOption<T extends string = string> {\n value: T;\n label: string;\n disabled?: boolean;\n}\n\ntype NativeButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'onChange' | 'children'>;\n\ninterface SelectProps<T extends string = string> extends NativeButtonProps {\n value: T;\n options: Array<SelectOption<T>>;\n onChange: (value: T, option: SelectOption<T>) => void;\n placeholder?: string;\n popupClassName?: string;\n}\n\nfunction joinClasses(...values: Array<string | false | null | undefined>) {\n return values.filter(Boolean).join(' ');\n}\n\nfunction SelectArrow({ open }: { open: boolean }) {\n return (\n <svg\n className={joinClasses('h-3 w-3 shrink-0 transition-transform', open && 'rotate-180')}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction getNextEnabledIndex<T extends string>(\n options: Array<SelectOption<T>>,\n startIndex: number,\n direction: 1 | -1,\n) {\n if (options.length === 0) return -1;\n\n let index = startIndex;\n for (let checked = 0; checked < options.length; checked += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) {\n return index;\n }\n }\n\n return -1;\n}\n\nexport function Select<T extends string = string>({\n value,\n options,\n onChange,\n placeholder = '请选择',\n popupClassName,\n className,\n disabled = false,\n id,\n ...buttonProps\n}: SelectProps<T>) {\n const reactId = useId();\n const selectId = id ?? `select-${reactId}`;\n const listboxId = `${selectId}-listbox`;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const selectedIndex = options.findIndex((option) => option.value === value);\n const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n const getInitialActiveIndex = () => {\n if (selectedIndex >= 0 && !options[selectedIndex]?.disabled) return selectedIndex;\n return getNextEnabledIndex(options, -1, 1);\n };\n\n const openPopup = () => {\n if (disabled || options.length === 0) return;\n setOpen(true);\n setActiveIndex(getInitialActiveIndex());\n };\n\n const closePopup = () => {\n setOpen(false);\n setActiveIndex(-1);\n };\n\n const selectOption = (option: SelectOption<T>) => {\n if (option.disabled) return;\n onChange(option.value, option);\n closePopup();\n triggerRef.current?.focus();\n };\n\n useEffect(() => {\n if (!open) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.current?.contains(target) || popupRef.current?.contains(target)) {\n return;\n }\n closePopup();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [open]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (!open) {\n openPopup();\n return;\n }\n setActiveIndex((current) => getNextEnabledIndex(options, current, 1));\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (!open) {\n openPopup();\n return;\n }\n setActiveIndex((current) => getNextEnabledIndex(options, current, -1));\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!open) {\n openPopup();\n return;\n }\n const activeOption = options[activeIndex];\n if (activeOption) {\n selectOption(activeOption);\n }\n break;\n }\n case 'Escape':\n if (open) {\n event.preventDefault();\n closePopup();\n }\n break;\n case 'Tab':\n closePopup();\n break;\n }\n };\n\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n const popupStyle: CSSProperties = triggerRect\n ? {\n top: triggerRect.bottom + 4,\n left: triggerRect.left,\n minWidth: triggerRect.width,\n }\n : {};\n\n const popup = open ? (\n <div\n ref={popupRef}\n id={listboxId}\n role=\"listbox\"\n data-testid=\"select-popup\"\n className={joinClasses(\n 'fixed z-[9999] overflow-hidden rounded-md border border-[var(--border-default)] bg-[var(--surface-card)] py-1 shadow-[0_2px_12px_rgba(0,0,0,0.16)]',\n popupClassName,\n )}\n style={popupStyle}\n >\n {options.map((option, index) => {\n const isSelected = option.value === value;\n const isActive = index === activeIndex;\n const optionId = `${listboxId}-option-${option.value}`;\n\n return (\n <button\n key={option.value}\n id={optionId}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n disabled={option.disabled}\n className={joinClasses(\n 'flex min-h-8 w-full items-center bg-[var(--surface-card)] px-3 text-left text-sm transition-colors',\n isSelected ? 'text-[#1476FF]' : 'text-[var(--text-primary)]',\n isActive && !isSelected ? 'bg-[#F5F5F5]' : '',\n option.disabled ? 'cursor-not-allowed opacity-40' : '',\n !option.disabled && !isSelected ? 'cursor-pointer hover:bg-[#F5F5F5]' : '',\n !option.disabled && isSelected ? 'cursor-pointer' : '',\n )}\n onMouseEnter={() => {\n if (!option.disabled) setActiveIndex(index);\n }}\n onClick={() => selectOption(option)}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n </button>\n );\n })}\n </div>\n ) : null;\n\n return (\n <>\n <button\n {...buttonProps}\n ref={triggerRef}\n id={selectId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-activedescendant={open && activeIndex >= 0 ? `${listboxId}-option-${options[activeIndex]?.value}` : undefined}\n disabled={disabled}\n className={joinClasses(\n 'ui-input inline-flex h-8 items-center justify-between gap-2 px-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-40',\n open && 'border-[var(--input-border-active)]',\n className,\n )}\n onClick={() => {\n if (open) {\n closePopup();\n } else {\n openPopup();\n }\n }}\n onKeyDown={handleKeyDown}\n >\n <span className={joinClasses('min-w-0 flex-1 truncate', !selectedOption && 'text-[var(--text-field-placeholder)]')}>\n {selectedOption?.label ?? placeholder}\n </span>\n <SelectArrow open={open} />\n </button>\n {open && createPortal(popup, document.body)}\n </>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport type { AgentOption } from '@/components/chat-input/chat-input-options';\nimport { buildAgentOptions, buildExpertOption } from '@/components/chat-input/chat-input-options';\nimport { getQuickActionToken, getSkillToken } from '@/components/chat-input/utils/helpers';\nimport { QUICK_ACTIONS } from '@/config/quick-actions';\nimport type { AgentData } from '@/hooks/useAgentData';\nimport { useAgentData } from '@/hooks/useAgentData';\nimport type { ExpertCatalogItem } from '@/hooks/useExpertCatalog';\nimport { useExpertCatalog } from '@/hooks/useExpertCatalog';\nimport type { MentionRef } from '@/hooks/useSendMessage';\nimport { useChatStore } from '@/stores/chatStore';\nimport { apiFetch } from '@/utils/api-client';\nimport {\n buildDefaultInspirationWorkspacePath,\n promptHasFilePlaceholder,\n} from '@/utils/inspiration-workspace-path';\nimport { fetchSkillOptionsWithCache, type SkillOption } from '@/utils/skill-options-cache';\nimport type { AgentRef, InspirationTemplateDetail, InspirationTemplateListItem, SkillRef } from '../types';\n\nconst HOME_DRAFT_THREAD_ID = '__new__';\nconst PLAZA_EXPERT_NEW_SESSION_DISABLED_REASON =\n '该灵感包含智能体广场智能体,需要先选择已有会话并召唤后使用';\n\nexport type CreateSameTarget = { kind: 'new' } | { kind: 'existing'; threadId: string };\n\nfunction hasPrompt(template: InspirationTemplateListItem): template is InspirationTemplateDetail {\n return 'prompt' in template && typeof template.prompt === 'string';\n}\n\nasync function resolveTemplateDetail(template: InspirationTemplateListItem): Promise<InspirationTemplateDetail> {\n if (hasPrompt(template)) return template;\n const response = await apiFetch(`/api/inspiration/templates/${template.id}`);\n if (!response.ok) throw new Error(`Failed to fetch inspiration template: ${response.status}`);\n const data = await response.json();\n return data.data as InspirationTemplateDetail;\n}\n\nfunction normalizeLookupValue(value: string | undefined): string {\n return value?.replace(/^@/, '').trim().toLowerCase() ?? '';\n}\n\nfunction stripVariantLabel(value: string): string {\n return value\n .replace(/\\s*\\([^)]*\\)\\s*$/, '')\n .replace(/^@/, '')\n .trim();\n}\n\nfunction resolveSkillNames(skills: SkillRef[], skillOptions: SkillOption[]): string[] {\n const optionByName = new Map(skillOptions.map((option) => [normalizeLookupValue(option.name), option.name.trim()]));\n const names: string[] = [];\n const seen = new Set<string>();\n\n for (const skill of skills) {\n const candidates = [skill.id, skill.name];\n const matchedName = candidates.map((candidate) => optionByName.get(normalizeLookupValue(candidate))).find(Boolean);\n if (!matchedName) continue;\n\n const key = normalizeLookupValue(matchedName);\n if (seen.has(key)) continue;\n seen.add(key);\n names.push(matchedName);\n }\n\n return names;\n}\n\nfunction getAgentByOptionId(agents: AgentData[], option: AgentOption): AgentData | undefined {\n return agents.find((agent) => agent.id === option.id);\n}\n\nfunction getStrongAgentValues(agent: AgentData | undefined, option: AgentOption): string[] {\n return [option.id, agent?.id, agent?.breedId, agent?.displayName, agent?.name, stripVariantLabel(option.label)]\n .map(normalizeLookupValue)\n .filter(Boolean);\n}\n\nfunction getAliasAgentValues(agent: AgentData | undefined, option: AgentOption): string[] {\n return [option.insert, ...(agent?.mentionPatterns ?? [])].map(normalizeLookupValue).filter(Boolean);\n}\n\nfunction getExpertStrongValues(option: AgentOption): string[] {\n return [option.id, stripVariantLabel(option.label)].map(normalizeLookupValue).filter(Boolean);\n}\n\nfunction getExpertAliasValues(option: AgentOption): string[] {\n return [option.insert].map(normalizeLookupValue).filter(Boolean);\n}\n\nfunction hasAgentMatch(ref: AgentRef, values: string[]): boolean {\n const refValues = [ref.id, ref.catId, ref.name].map(normalizeLookupValue).filter(Boolean);\n return refValues.some((value) => values.includes(value));\n}\n\nfunction findMatchingAgentOption(\n ref: AgentRef,\n agentOptions: AgentOption[],\n expertOptions: AgentOption[],\n agents: AgentData[],\n): AgentOption | null {\n const options = [\n ...agentOptions.map((option) => ({\n option,\n strongValues: getStrongAgentValues(getAgentByOptionId(agents, option), option),\n aliasValues: getAliasAgentValues(getAgentByOptionId(agents, option), option),\n })),\n ...expertOptions.map((option) => ({\n option,\n strongValues: getExpertStrongValues(option),\n aliasValues: getExpertAliasValues(option),\n })),\n ];\n\n const strongMatches = options.filter(({ strongValues }) =>\n hasAgentMatch(ref, strongValues),\n );\n if (strongMatches.length === 1) return strongMatches[0]?.option ?? null;\n\n const aliasMatches = options.filter(({ aliasValues }) =>\n hasAgentMatch(ref, aliasValues),\n );\n return aliasMatches.length === 1 ? (aliasMatches[0]?.option ?? null) : null;\n}\n\nfunction resolveAgentMentionRefs(templateAgents: AgentRef[], agents: AgentData[], experts: ExpertCatalogItem[]): MentionRef[] {\n const agentOptions = buildAgentOptions(agents);\n const expertOptions = experts.map(buildExpertOption);\n const refs: MentionRef[] = [];\n const seen = new Set<string>();\n\n for (const agent of templateAgents) {\n const option = findMatchingAgentOption(agent, agentOptions, expertOptions, agents);\n const mention = option?.insert.trim();\n if (!option || !mention) continue;\n\n const key = `${option.id}:${mention.toLowerCase()}`;\n if (seen.has(key)) continue;\n seen.add(key);\n refs.push({ catId: option.id, mention });\n }\n\n return refs;\n}\n\nfunction mentionAlreadyInPrompt(prompt: string, mention: string): boolean {\n const pattern = new RegExp(`(^|\\\\s)${mention.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(?=\\\\s|$)`, 'i');\n return pattern.test(prompt);\n}\n\nfunction resolveCategoryToken(tags: string[], prompt: string): string | null {\n const visibleCategoryByLabel = new Map(\n QUICK_ACTIONS.filter((action) => action.show !== false).map((action) => [\n normalizeLookupValue(action.label),\n action.label,\n ]),\n );\n for (const tag of tags) {\n const label = visibleCategoryByLabel.get(normalizeLookupValue(tag));\n if (!label) continue;\n const token = getQuickActionToken(label);\n return prompt.includes(token) ? null : token;\n }\n return null;\n}\n\nexport function getPlazaExpertAgentIds(templateAgents: AgentRef[]): string[] {\n const ids: string[] = [];\n const seen = new Set<string>();\n for (const agent of templateAgents) {\n for (const id of [agent.id, agent.catId]) {\n const normalizedId = id.trim();\n if (!normalizedId.startsWith('expert-') || seen.has(normalizedId)) continue;\n seen.add(normalizedId);\n ids.push(normalizedId);\n }\n }\n return ids;\n}\n\nexport function getNewSessionDisabledReasonForTemplate(\n template: Pick<InspirationTemplateListItem, 'agents'>,\n): string | undefined {\n return getPlazaExpertAgentIds(template.agents).length > 0 ? PLAZA_EXPERT_NEW_SESSION_DISABLED_REASON : undefined;\n}\n\nasync function invitePlazaExpertsToThread(threadId: string, expertIds: string[]) {\n for (const expertId of expertIds) {\n const response = await apiFetch(\n `/api/threads/${encodeURIComponent(threadId)}/experts/${encodeURIComponent(expertId)}/invite`,\n { method: 'POST' },\n );\n if (response.ok) continue;\n\n const body = await response.json().catch(() => null);\n if (response.status === 409 && body?.error === 'ALREADY_INVITED') continue;\n\n throw new Error(body?.message || `Failed to summon expert ${expertId}: ${response.status}`);\n }\n}\n\nasync function buildCreateSameInput(detail: InspirationTemplateDetail, agents: AgentData[], experts: ExpertCatalogItem[]) {\n const skillOptions = await fetchSkillOptionsWithCache();\n const categoryToken = resolveCategoryToken(detail.tags, detail.prompt);\n const skillTokens = resolveSkillNames(detail.skills, skillOptions)\n .map(getSkillToken)\n .filter((token) => !detail.prompt.includes(token));\n const mentionRefs = resolveAgentMentionRefs(detail.agents, agents, experts);\n const mentionTokens = mentionRefs\n .map((ref) => ref.mention)\n .filter((mention) => !mentionAlreadyInPrompt(detail.prompt, mention));\n const prefix = [categoryToken, ...mentionTokens, ...skillTokens].filter(Boolean).join(' ').trim();\n\n return {\n text: prefix ? `${prefix}\\n${detail.prompt}` : detail.prompt,\n mentionRefs,\n };\n}\n\nasync function resolveDefaultWorkspacePathForFilePlaceholders(prompt: string): Promise<string | undefined> {\n if (!promptHasFilePlaceholder(prompt)) return undefined;\n\n try {\n const response = await apiFetch('/api/projects/cwd');\n if (!response.ok) return undefined;\n const data = await response.json().catch(() => null);\n const workspaceRoot = typeof data?.workspacePath === 'string' ? data.workspacePath.trim() : '';\n const workspacePath = buildDefaultInspirationWorkspacePath(workspaceRoot);\n return workspacePath || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function useCreateSameFlow(template: InspirationTemplateListItem) {\n const navigate = useNavigate();\n const setPendingChatInsert = useChatStore((state) => state.setPendingChatInsert);\n const { agents } = useAgentData();\n const { experts } = useExpertCatalog();\n\n return useCallback(\n async (target: CreateSameTarget) => {\n const threadId = target.kind === 'new' ? HOME_DRAFT_THREAD_ID : target.threadId;\n try {\n const detail = await resolveTemplateDetail(template);\n const plazaExpertIds = getPlazaExpertAgentIds(detail.agents);\n if (target.kind === 'new' && plazaExpertIds.length > 0) {\n return;\n }\n const { text, mentionRefs } = await buildCreateSameInput(detail, agents, experts);\n const workspacePath =\n target.kind === 'new' ? await resolveDefaultWorkspacePathForFilePlaceholders(detail.prompt) : undefined;\n\n if (target.kind === 'existing' && plazaExpertIds.length > 0) {\n await invitePlazaExpertsToThread(target.threadId, plazaExpertIds);\n }\n\n setPendingChatInsert({\n threadId,\n text,\n ...(mentionRefs.length > 0 ? { mentionRefs } : {}),\n ...(mentionRefs.length > 0 ? { suppressMentionMenu: true } : {}),\n inspirationData: {\n prompt: detail.prompt,\n skills: detail.skills,\n agents: detail.agents,\n templateId: detail.id,\n ...(workspacePath ? { workspacePath } : {}),\n },\n });\n\n navigate(target.kind === 'new' ? '/' : `/thread/${threadId}`);\n } catch (error) {\n console.error('Failed to resolve inspiration template detail', error);\n }\n },\n [agents, experts, navigate, setPendingChatInsert, template],\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { AgentData } from '@/hooks/useAgentData';\nimport type { ExpertCatalogItem } from '@/hooks/useExpertCatalog';\nimport { API_URL } from '@/utils/api-client';\n\ninterface SessionAvatarGroupProps {\n participants: string[];\n getAgentById: (id: string) => AgentData | null | undefined;\n getExpertById?: (id: string) => ExpertCatalogItem | null | undefined;\n size?: number;\n}\n\ninterface AvatarData {\n avatarSrc: string;\n color: string;\n displayName: string;\n}\n\nfunction getAvatarInitial(name?: string): string {\n const normalized = (name ?? '').replace(/^@/, '').trim();\n const first = normalized.slice(0, 1);\n return (first || '智').toUpperCase();\n}\n\nfunction isImageAvatar(avatar: string): boolean {\n return /^(https?:\\/\\/|\\/|data:image)/.test(avatar);\n}\n\nfunction getAvatarSrc(avatar: string): string {\n if (!avatar) return '';\n return avatar.startsWith('/uploads/') ? `${API_URL}${avatar}` : avatar;\n}\n\nfunction AvatarCircle({ avatar, size }: { avatar: AvatarData; size: number }) {\n if (isImageAvatar(avatar.avatarSrc)) {\n return (\n <div className=\"overflow-hidden rounded-full\" style={{ width: size, height: size }}>\n <img src={avatar.avatarSrc} alt={avatar.displayName} className=\"h-full w-full object-cover\" />\n </div>\n );\n }\n\n return (\n <div\n className=\"inline-flex items-center justify-center rounded-full font-semibold text-[var(--thread-avatar-initial-text)]\"\n style={{ width: size, height: size, backgroundColor: avatar.color, fontSize: size <= 16 ? 10 : 12 }}\n >\n {getAvatarInitial(avatar.displayName)}\n </div>\n );\n}\n\nfunction scaleAvatarMetric(value: number, size: number): number {\n return value * (size / 32);\n}\n\nfunction getThreadHistoryAvatarLayout(count: number, index: number, size: number) {\n if (count === 2) {\n const positions = [\n { left: 1, top: 6, zIndex: 10 },\n { left: 11, top: 6, zIndex: 0 },\n ];\n const position = positions[index] ?? positions[0]!;\n return {\n left: scaleAvatarMetric(position.left, size),\n top: scaleAvatarMetric(position.top, size),\n avatarSize: scaleAvatarMetric(20, size),\n zIndex: position.zIndex,\n };\n }\n\n if (count === 3) {\n const positions = [\n { left: 8, top: 0 },\n { left: 0, top: 16 },\n { left: 16, top: 16 },\n ];\n const position = positions[index] ?? positions[0]!;\n return {\n left: scaleAvatarMetric(position.left, size),\n top: scaleAvatarMetric(position.top, size),\n avatarSize: scaleAvatarMetric(16, size),\n };\n }\n\n const positions = [\n { left: 0, top: 0 },\n { left: 16, top: 0 },\n { left: 0, top: 16 },\n { left: 16, top: 16 },\n ];\n const position = positions[index] ?? positions[0]!;\n return {\n left: scaleAvatarMetric(position.left, size),\n top: scaleAvatarMetric(position.top, size),\n avatarSize: scaleAvatarMetric(16, size),\n };\n}\n\nexport function SessionAvatarGroup({ participants, getAgentById, getExpertById, size = 32 }: SessionAvatarGroupProps) {\n const avatars = participants.slice(0, 4).map((participantId) => {\n const agent = getAgentById(participantId);\n const expert = agent ? null : getExpertById?.(participantId);\n if (!agent && !expert) {\n return { avatarSrc: '', color: 'var(--accent-primary)', displayName: participantId };\n }\n return {\n avatarSrc: getAvatarSrc((agent ?? expert)?.avatar?.trim() ?? ''),\n color: agent?.color?.primary ?? expert?.color?.primary ?? 'var(--accent-primary)',\n displayName: agent?.displayName ?? expert?.displayName ?? participantId,\n };\n });\n\n if (avatars.length === 0) {\n return (\n <div className=\"ui-avatar-fallback-shell shrink-0\" style={{ width: size, height: size }}>\n <span className=\"inline-flex h-full w-full items-center justify-center rounded-full bg-[var(--accent-primary)] text-xs font-semibold text-[var(--thread-avatar-initial-text)]\">\n 智\n </span>\n </div>\n );\n }\n\n if (avatars.length === 1) {\n return (\n <div className=\"shrink-0\">\n <AvatarCircle avatar={avatars[0]!} size={size} />\n </div>\n );\n }\n\n if (avatars.length === 2) {\n return (\n <div className=\"relative shrink-0\" style={{ width: size, height: size }}>\n {avatars.map((avatar, index) => {\n const layout = getThreadHistoryAvatarLayout(avatars.length, index, size);\n return (\n <div\n key={avatar.displayName}\n className=\"absolute\"\n style={{ left: layout.left, top: layout.top, zIndex: layout.zIndex }}\n >\n <AvatarCircle avatar={avatar} size={layout.avatarSize} />\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className=\"relative shrink-0\" style={{ width: size, height: size }}>\n {avatars.map((avatar, index) => {\n const layout = getThreadHistoryAvatarLayout(avatars.length, index, size);\n return (\n <div\n key={`${avatar.displayName}-${index}`}\n className=\"absolute overflow-hidden rounded-full\"\n style={{\n width: layout.avatarSize,\n height: layout.avatarSize,\n left: layout.left,\n top: layout.top,\n }}\n >\n <AvatarCircle avatar={avatar} size={layout.avatarSize} />\n </div>\n );\n })}\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { AppModal } from '@/components/AppModal';\nimport { Button } from '@/components/shared/Button';\nimport { OverflowTooltip } from '@/components/shared/OverflowTooltip';\nimport { SearchInput } from '@/components/shared/SearchInput';\nimport { formatRelativeTime } from '@/components/thread-sidebar/thread-utils';\nimport { useAgentData } from '@/hooks/useAgentData';\nimport { useExpertCatalog } from '@/hooks/useExpertCatalog';\nimport type { Thread } from '@/stores/chat-types';\nimport { apiFetch } from '@/utils/api-client';\nimport { SessionAvatarGroup } from './SessionAvatarGroup';\n\nconst HOME_DRAFT_THREAD_ID = '__new__';\n\ninterface SessionItem {\n id: string;\n title: string | null;\n lastActiveAt: number;\n participants: string[];\n invitedExpertIds: string[];\n}\n\ninterface CreateSessionDialogProps {\n open: boolean;\n onClose: () => void;\n onCreateNew: (threadId: string) => void;\n onSelectExisting: (threadId: string) => void;\n newSessionDisabledReason?: string;\n}\n\nfunction normalizeStoredThreadTitleOrNull(title: string | null | undefined): string | null {\n if (!title) return null;\n const trimmed = title.trim();\n return trimmed === '' ? null : trimmed;\n}\n\nfunction getSessionTitle(session: SessionItem): string {\n return session.title ?? (session.id === 'default' ? '大厅' : '未命名会话');\n}\n\nfunction getSessionDescription(session: SessionItem): string {\n const count = session.participants.length;\n if (count <= 0) return '暂无参与智能体';\n return `${count} 个参与智能体`;\n}\n\nexport function CreateSessionDialog({\n open,\n onClose,\n onCreateNew,\n onSelectExisting,\n newSessionDisabledReason,\n}: CreateSessionDialogProps) {\n const [searchKeyword, setSearchKeyword] = useState('');\n const [sessions, setSessions] = useState<SessionItem[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const { getAgentById } = useAgentData();\n const { getExpertById } = useExpertCatalog();\n const isNewSessionDisabled = Boolean(newSessionDisabledReason);\n\n const loadSessions = useCallback(async () => {\n setIsLoading(true);\n try {\n const res = await apiFetch('/api/threads');\n if (!res.ok) return;\n const data = await res.json();\n const nextSessions = ((data.threads ?? []) as Thread[])\n .map((thread) => ({\n id: thread.id,\n title: normalizeStoredThreadTitleOrNull(thread.title),\n lastActiveAt: thread.lastActiveAt,\n participants: thread.participants ?? [],\n invitedExpertIds: thread.invitedExpertIds ?? [],\n }))\n .filter((session) => session.id !== 'default')\n .sort((a, b) => b.lastActiveAt - a.lastActiveAt);\n setSessions(nextSessions);\n } catch {\n // Keep the existing list visible when refresh fails.\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (!open) return;\n setSelectedId(null);\n setSearchKeyword('');\n void loadSessions();\n }, [loadSessions, open]);\n\n const filteredSessions = useMemo(() => {\n const keyword = searchKeyword.trim().toLowerCase();\n if (!keyword) return sessions;\n return sessions.filter((session) => {\n const title = getSessionTitle(session).toLowerCase();\n return title.includes(keyword);\n });\n }, [searchKeyword, sessions]);\n\n const handleNewSession = () => {\n if (isNewSessionDisabled) return;\n onCreateNew(HOME_DRAFT_THREAD_ID);\n onClose();\n };\n\n const handleConfirm = () => {\n if (!selectedId) return;\n onSelectExisting(selectedId);\n onClose();\n };\n\n return (\n <AppModal\n open={open}\n onClose={onClose}\n disableBackdropClose\n title=\"选择会话\"\n panelClassName=\"w-[560px]\"\n bodyClassName=\"p-0\"\n zIndexClassName=\"z-[120]\"\n >\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2 pt-4 pb-3\">\n <SearchInput\n value={searchKeyword}\n onChange={(value) => setSearchKeyword(value)}\n onClear={() => setSearchKeyword('')}\n placeholder=\"搜索会话\"\n wrapperClassName=\"flex-1\"\n />\n <Button\n variant=\"default\"\n size=\"md\"\n onlyIcon\n hasBorder\n aria-label=\"刷新会话列表\"\n className=\"shrink-0\"\n iconLeft={<img src=\"/icons/icon-refresh.svg\" alt=\"\" className=\"h-4 w-4\" />}\n onClick={() => void loadSessions()}\n loading={isLoading}\n />\n </div>\n\n <div className=\"max-h-[360px] overflow-y-auto pb-3\">\n {isLoading && sessions.length === 0 ? (\n <div className=\"py-8 text-center text-sm text-[var(--text-secondary)]\">加载会话中...</div>\n ) : null}\n {!isLoading && sessions.length === 0 ? (\n <div className=\"py-8 text-center text-sm text-[var(--text-secondary)]\">暂无会话,可新建会话</div>\n ) : null}\n {!isLoading && sessions.length > 0 && filteredSessions.length === 0 ? (\n <div className=\"py-8 text-center text-sm text-[var(--text-secondary)]\">暂无匹配会话</div>\n ) : null}\n <div className=\"space-y-2\">\n {filteredSessions.map((session) => {\n const displayTitle = getSessionTitle(session);\n const isSelected = selectedId === session.id;\n const avatarParticipantIds = Array.from(new Set([...session.participants, ...session.invitedExpertIds]));\n return (\n <button\n key={session.id}\n type=\"button\"\n data-testid={`session-option-${session.id}`}\n onClick={() => setSelectedId(session.id)}\n className={[\n 'flex w-full items-stretch gap-2 rounded-lg border px-6 py-3 text-left transition-colors',\n isSelected ? 'border-[#1476FF]' : 'border-[#F0F0F0]',\n 'bg-[#FAFAFA] hover:bg-[var(--surface-hover)]',\n ].join(' ')}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <SessionAvatarGroup\n participants={avatarParticipantIds}\n getAgentById={getAgentById}\n getExpertById={getExpertById}\n size={32}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-[var(--text-primary)]\" title={displayTitle}>\n {displayTitle}\n </div>\n <div className=\"truncate text-xs text-[var(--text-secondary)]\" title={getSessionDescription(session)}>\n {getSessionDescription(session)}\n </div>\n </div>\n </div>\n <div className=\"self-end whitespace-nowrap text-xs text-[var(--text-tertiary)]\">\n {formatRelativeTime(session.lastActiveAt, true)}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n <div\n data-testid=\"create-session-dialog-actions\"\n className=\"flex items-center justify-end gap-2 px-4 py-3\"\n >\n <div className=\"flex shrink-0 items-center justify-end gap-2\">\n <Button variant=\"default\" size=\"md\" onClick={onClose}>\n 取消\n </Button>\n {newSessionDisabledReason ? (\n <OverflowTooltip content={newSessionDisabledReason} forceShow className=\"inline-flex shrink-0\">\n <span className=\"inline-flex shrink-0\">\n <Button\n variant=\"default\"\n size=\"md\"\n onClick={handleNewSession}\n disabled={isNewSessionDisabled}\n >\n 新建会话\n </Button>\n </span>\n </OverflowTooltip>\n ) : (\n <span className=\"inline-flex shrink-0\">\n <Button\n variant=\"default\"\n size=\"md\"\n onClick={handleNewSession}\n disabled={isNewSessionDisabled}\n >\n 新建会话\n </Button>\n </span>\n )}\n <Button variant=\"major\" size=\"md\" onClick={handleConfirm} disabled={!selectedId}>\n 确定\n </Button>\n </div>\n </div>\n </div>\n </AppModal>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nexport type InspirationTagTone =\n | 'html'\n | 'featured'\n | 'document'\n | 'spreadsheet'\n | 'markdown'\n | 'image'\n | 'messagePush'\n | 'category'\n | 'skill'\n | 'agent';\n\ninterface InspirationTagProps {\n label: string;\n tone?: InspirationTagTone;\n iconSrc?: string;\n testId?: string;\n}\n\nconst TONE_CLASSES: Record<InspirationTagTone, string> = {\n html: 'bg-[#F23030]/[0.1] text-[#F23030]',\n featured: 'bg-[#C25700]/[0.1] text-[#C25700]',\n document: 'bg-[#1476FF]/[0.1] text-[#1476FF]',\n spreadsheet: 'bg-[#029931]/[0.1] text-[#029931]',\n markdown: 'bg-[#4349D0]/[0.1] text-[#4349D0]',\n image: 'bg-[#0083C7]/[0.1] text-[#0083C7]',\n messagePush: 'bg-[#832FD6]/[0.1] text-[#832FD6]',\n category: 'bg-[#191919]/[0.1] text-[#191919]',\n skill: 'bg-[#1476FF]/[0.1] text-[#1476FF]',\n agent: 'bg-[var(--accent-secondary)]/[0.1] text-[var(--accent-secondary)]',\n};\n\nexport function getInspirationTagTone(label: string): InspirationTagTone {\n if (label === '精选') return 'featured';\n if (label === '文档') return 'document';\n if (label === '表格') return 'spreadsheet';\n if (label === 'Markdown') return 'markdown';\n if (label.toLowerCase() === 'html') return 'html';\n if (label === '图片') return 'image';\n if (label === '消息推送') return 'messagePush';\n return 'category';\n}\n\nexport function getInspirationTagDisplayLabel(label: string): string {\n return label.toLowerCase() === 'html' ? 'HTML' : label;\n}\n\nexport function getInspirationTagToneClass(tone: InspirationTagTone): string {\n return TONE_CLASSES[tone];\n}\n\nexport function InspirationTag({ label, tone, iconSrc, testId }: InspirationTagProps) {\n const resolvedTone = tone ?? getInspirationTagTone(label);\n const displayLabel = getInspirationTagDisplayLabel(label);\n\n return (\n <span\n className={[\n 'inline-flex max-w-[120px] items-center rounded-[2px] px-1 text-xs font-medium',\n TONE_CLASSES[resolvedTone],\n ].join(' ')}\n title={displayLabel}\n data-testid={testId ?? `inspiration-tag-${resolvedTone}`}\n >\n {iconSrc ? (\n <img\n src={iconSrc}\n alt=\"\"\n className=\"mr-1 h-3 w-3 shrink-0\"\n onError={(event) => {\n event.currentTarget.style.display = 'none';\n }}\n />\n ) : null}\n <span className=\"truncate\">{displayLabel}</span>\n </span>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { type MouseEvent, useState } from 'react';\nimport { Button } from '@/components/shared/Button';\nimport { getNewSessionDisabledReasonForTemplate, useCreateSameFlow } from '../hooks/useCreateSameFlow';\nimport type { InspirationTemplateListItem } from '../types';\nimport { CreateSessionDialog } from './CreateSessionDialog';\nimport {\n getInspirationTagDisplayLabel,\n getInspirationTagTone,\n getInspirationTagToneClass,\n InspirationTag,\n} from './InspirationTag';\n\nconst DEFAULT_INSPIRATION_THUMBNAIL = '/images/inspiration-products/default.svg';\n\ninterface InspirationCardProps {\n template: InspirationTemplateListItem;\n onClick: (template: InspirationTemplateListItem) => void;\n}\n\ninterface ProductThumbnailTheme {\n label: string;\n backgroundColor: string;\n backgroundPath: string;\n iconPath?: string;\n examplePath: string;\n showIcon?: boolean;\n}\n\nconst PRODUCT_THUMBNAIL_THEMES = {\n messagePush: {\n label: '消息推送',\n backgroundColor: '#FFF1E6',\n backgroundPath: '/images/inspiration/orange-bg.png',\n examplePath: '/images/inspiration/task-bg.png',\n showIcon: false,\n },\n word: {\n label: '文档',\n backgroundColor: '#EAF3FF',\n backgroundPath: '/images/inspiration/blue-bg.png',\n iconPath: '/icons/inspiration/icon-word.svg',\n examplePath: '/images/inspiration/doc-example.png',\n },\n excel: {\n label: '表格',\n backgroundColor: '#E8F8EF',\n backgroundPath: '/images/inspiration/green-bg.png',\n iconPath: '/icons/inspiration/icon-excel.svg',\n examplePath: '/images/inspiration/excel-example.png',\n },\n markdown: {\n label: 'Markdown',\n backgroundColor: '#F1ECFF',\n backgroundPath: '/images/inspiration/purple-bg.png',\n iconPath: '/icons/inspiration/icon-markdown.svg',\n examplePath: '/images/inspiration/markdown-example.png',\n },\n} satisfies Record<string, ProductThumbnailTheme>;\n\nfunction getProductThumbnailTheme(tags: string[]): ProductThumbnailTheme | null {\n if (tags.includes('消息推送')) return PRODUCT_THUMBNAIL_THEMES.messagePush;\n if (tags.includes('文档')) return PRODUCT_THUMBNAIL_THEMES.word;\n if (tags.includes('表格')) return PRODUCT_THUMBNAIL_THEMES.excel;\n if (tags.includes('Markdown')) return PRODUCT_THUMBNAIL_THEMES.markdown;\n return null;\n}\n\nfunction hasReturnedThumbnail(imagePath: string): boolean {\n const normalizedPath = imagePath.trim();\n return Boolean(normalizedPath) && normalizedPath !== DEFAULT_INSPIRATION_THUMBNAIL;\n}\n\nfunction InspirationProductThumbnail({\n template,\n theme,\n}: {\n template: InspirationTemplateListItem;\n theme: ProductThumbnailTheme;\n}) {\n const shouldShowIcon = theme.showIcon !== false && theme.iconPath;\n\n return (\n <div\n data-testid=\"inspiration-card-product-layout\"\n className=\"grid h-full grid-cols-[minmax(0,1fr)_138px] items-center gap-3 p-4\"\n >\n <div className=\"flex min-w-0 flex-col items-start justify-center\">\n {shouldShowIcon ? (\n <img\n data-testid=\"inspiration-card-product-icon\"\n src={theme.iconPath}\n alt={theme.label}\n className=\"mb-2 h-4 w-4 shrink-0\"\n />\n ) : null}\n <div\n data-testid=\"inspiration-card-product-title\"\n className=\"max-w-full truncate text-[13px] font-semibold leading-[19px] text-[#111827]\"\n title={template.name}\n >\n {template.name}\n </div>\n <div\n data-testid=\"inspiration-card-product-description\"\n className=\"mt-1 line-clamp-2 max-w-full text-[11px] leading-[17px] text-[#4B5563]\"\n title={template.description}\n >\n {template.description}\n </div>\n <div\n data-testid=\"inspiration-card-preview-tags\"\n className=\"mt-2 flex w-[142.857%] origin-top-left scale-[0.7] flex-nowrap gap-1 overflow-hidden\"\n >\n {template.tags.map((tag, index) => {\n const tone = getInspirationTagTone(tag);\n const displayLabel = getInspirationTagDisplayLabel(tag);\n return (\n <span\n key={tag}\n data-testid={index === 0 ? 'inspiration-card-preview-tag' : undefined}\n className={[\n 'inline-flex min-w-0 max-w-[120px] shrink-0 items-center rounded-[2px] px-1 text-[11px] font-medium leading-4',\n getInspirationTagToneClass(tone),\n ].join(' ')}\n title={displayLabel}\n >\n <span className=\"truncate whitespace-nowrap\">{displayLabel}</span>\n </span>\n );\n })}\n </div>\n </div>\n <div className=\"flex h-full w-[138px] items-center justify-center\">\n <img\n data-testid=\"inspiration-card-product-example\"\n src={theme.examplePath}\n alt={`${theme.label}示例`}\n className=\"h-[136px] w-[138px] object-contain\"\n />\n </div>\n </div>\n );\n}\n\nexport function InspirationCard({ template, onClick }: InspirationCardProps) {\n const [showDialog, setShowDialog] = useState(false);\n const createSame = useCreateSameFlow(template);\n const productThumbnailTheme = hasReturnedThumbnail(template.imagePath)\n ? null\n : getProductThumbnailTheme(template.tags);\n const newSessionDisabledReason = getNewSessionDisabledReasonForTemplate(template);\n\n const handleCreateSame = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n setShowDialog(true);\n };\n\n const handleDoSameNew = (_threadId: string) => {\n void createSame({ kind: 'new' });\n };\n\n const handleDoSameExisting = (threadId: string) => {\n void createSame({ kind: 'existing', threadId });\n };\n\n return (\n <>\n <div\n data-testid=\"inspiration-card\"\n onClick={() => onClick(template)}\n className=\"group w-full max-w-[490px] cursor-pointer overflow-hidden rounded-2xl border border-[#E6E6E6] bg-[var(--surface-card)] transition-shadow hover:shadow-[0_8px_20px_rgba(15,23,42,0.08)]\"\n >\n {productThumbnailTheme ? (\n <div\n data-testid=\"inspiration-card-preview\"\n className=\"h-[168px] overflow-hidden bg-cover bg-center bg-[var(--surface-muted)]\"\n style={{\n backgroundColor: productThumbnailTheme.backgroundColor,\n backgroundImage: `url(${productThumbnailTheme.backgroundPath})`,\n }}\n >\n <InspirationProductThumbnail template={template} theme={productThumbnailTheme} />\n </div>\n ) : (\n <div data-testid=\"inspiration-card-preview\" className=\"h-[168px] overflow-hidden bg-[var(--surface-muted)]\">\n <img\n src={template.imagePath || DEFAULT_INSPIRATION_THUMBNAIL}\n alt={template.name}\n className=\"h-full w-full object-cover\"\n onError={(e) => {\n e.currentTarget.src = DEFAULT_INSPIRATION_THUMBNAIL;\n }}\n />\n </div>\n )}\n\n <div data-testid=\"inspiration-card-content\" className=\"p-4\">\n <h3\n data-testid=\"inspiration-card-title\"\n className=\"mb-1 truncate text-sm font-semibold text-[var(--text-primary)]\"\n title={template.name}\n >\n {template.name}\n </h3>\n\n <p\n data-testid=\"inspiration-card-description\"\n className=\"mb-3 line-clamp-2 text-xs text-[var(--text-secondary)]\"\n title={template.description}\n >\n {template.description}\n </p>\n\n <div className=\"flex min-h-[20px] flex-wrap gap-1\">\n <div className=\"tag-row flex flex-wrap gap-1 group-hover:hidden\">\n {template.tags.map((tag, index) => (\n <InspirationTag key={tag} label={tag} testId={index === 0 ? 'inspiration-card-tag' : undefined} />\n ))}\n </div>\n <div className=\"hidden group-hover:flex\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-testid=\"inspiration-create-same-button\"\n className=\"create-same-btn text-sm text-[#1476FF]\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 'auto',\n minWidth: 0,\n minHeight: 0,\n padding: 0,\n border: 0,\n borderRadius: 0,\n background: 'transparent',\n color: '#1476FF',\n fontSize: 14,\n lineHeight: '20px',\n }}\n onClick={handleCreateSame}\n >\n 创建同款\n </Button>\n </div>\n </div>\n </div>\n </div>\n\n <CreateSessionDialog\n open={showDialog}\n onClose={() => setShowDialog(false)}\n onCreateNew={handleDoSameNew}\n onSelectExisting={handleDoSameExisting}\n newSessionDisabledReason={newSessionDisabledReason}\n />\n </>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { InspirationTemplateListItem } from '../types';\nimport { InspirationCard } from './InspirationCard';\n\nconst CARD_GRID_CLASS = [\n 'grid gap-4 justify-items-center',\n 'grid-cols-[repeat(auto-fit,minmax(237px,1fr))]',\n 'min-[1280px]:grid-cols-[repeat(3,minmax(237px,1fr))]',\n 'min-[1440px]:grid-cols-[repeat(4,minmax(237px,1fr))]',\n 'min-[1600px]:grid-cols-[repeat(5,minmax(237px,1fr))]',\n].join(' ');\n\ninterface InspirationCardGridProps {\n templates: InspirationTemplateListItem[];\n isLoading: boolean;\n onCardClick: (template: InspirationTemplateListItem) => void;\n}\n\nexport function InspirationCardGrid({ templates, isLoading, onCardClick }: InspirationCardGridProps) {\n if (isLoading) {\n return (\n <div className={CARD_GRID_CLASS}>\n {Array.from({ length: 8 }).map((_, i) => (\n <div\n key={i}\n className=\"w-full max-w-[490px] rounded-xl overflow-hidden bg-[var(--surface-card)] border border-[var(--border-subtle)] animate-pulse\"\n >\n <div className=\"aspect-[16/10] bg-[var(--surface-muted)]\" />\n <div className=\"p-3 space-y-2\">\n <div className=\"h-4 bg-[var(--surface-muted)] rounded w-3/4\" />\n <div className=\"h-3 bg-[var(--surface-muted)] rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (templates.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"w-16 h-16 mb-4 rounded-full bg-[var(--surface-muted)] flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-[var(--text-secondary)]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-[var(--text-primary)] mb-1\">暂无灵感</h3>\n <p className=\"text-sm text-[var(--text-secondary)]\">试试其他分类或搜索关键字</p>\n </div>\n );\n }\n\n return (\n <div className={CARD_GRID_CLASS}>\n {templates.map((template) => (\n <InspirationCard key={template.id} template={template} onClick={onCardClick} />\n ))}\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nconst COMMON_CHINESE_INITIALS: Record<string, string> = {\n 技: 'J',\n 智: 'Z',\n 写: 'X',\n};\n\nconst PINYIN_BOUNDARIES: Array<{ initial: string; char: string }> = [\n { initial: 'A', char: '阿' },\n { initial: 'B', char: '八' },\n { initial: 'C', char: '擦' },\n { initial: 'D', char: '搭' },\n { initial: 'E', char: '蛾' },\n { initial: 'F', char: '发' },\n { initial: 'G', char: '噶' },\n { initial: 'H', char: '哈' },\n { initial: 'J', char: '击' },\n { initial: 'K', char: '喀' },\n { initial: 'L', char: '垃' },\n { initial: 'M', char: '妈' },\n { initial: 'N', char: '拿' },\n { initial: 'O', char: '哦' },\n { initial: 'P', char: '啪' },\n { initial: 'Q', char: '七' },\n { initial: 'R', char: '然' },\n { initial: 'S', char: '撒' },\n { initial: 'T', char: '他' },\n { initial: 'W', char: '挖' },\n { initial: 'X', char: '西' },\n { initial: 'Y', char: '压' },\n { initial: 'Z', char: '匝' },\n];\n\nconst pinyinCollator = new Intl.Collator('zh-Hans-CN-u-co-pinyin', {\n usage: 'sort',\n sensitivity: 'base',\n});\n\nfunction isChineseChar(char: string): boolean {\n return /[\\u3400-\\u9FFF]/.test(char);\n}\n\nfunction getChinesePinyinInitial(char: string): string {\n const common = COMMON_CHINESE_INITIALS[char];\n if (common) return common;\n\n let initial = 'A';\n for (const boundary of PINYIN_BOUNDARIES) {\n if (pinyinCollator.compare(char, boundary.char) >= 0) {\n initial = boundary.initial;\n continue;\n }\n break;\n }\n return initial;\n}\n\nexport function getDisplayInitial(name: string): string {\n const first = name.trim().slice(0, 1);\n if (!first) return '?';\n if (/[a-zA-Z]/.test(first)) return first.toUpperCase();\n if (isChineseChar(first)) return getChinesePinyinInitial(first);\n return first.toUpperCase();\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { AgentRef } from '../types';\nimport { getDisplayInitial } from '../utils/nameInitial';\n\nfunction isImageAvatar(avatar: string): boolean {\n return /^(https?:\\/\\/|\\/|data:image)/.test(avatar);\n}\n\ninterface AgentCardProps {\n agent: AgentRef;\n}\n\nexport function AgentCard({ agent }: AgentCardProps) {\n const avatarSrc = agent.icon?.startsWith('/uploads/')\n ? `/api${agent.icon}`\n : agent.icon;\n const hasImageAvatar = avatarSrc && isImageAvatar(avatarSrc);\n\n return (\n <div\n data-testid={`inspiration-agent-card-${agent.id}`}\n className=\"flex w-full min-w-0 items-center gap-3 rounded-[8px] px-4 py-3\"\n style={{ backgroundColor: '#fafafa' }}\n >\n <div\n data-testid={`inspiration-agent-card-${agent.id}-icon`}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[var(--surface-card-muted)]\"\n >\n {hasImageAvatar ? (\n <img\n src={avatarSrc}\n alt={agent.name}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n <span className=\"text-sm font-semibold text-[var(--text-label-secondary)]\">\n {getDisplayInitial(agent.name)}\n </span>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-[var(--text-primary)]\" title={agent.name}>\n {agent.name}\n </div>\n <div className=\"truncate text-xs text-[var(--text-secondary)]\" title={agent.id}>\n {agent.id}\n </div>\n </div>\n </div>\n );\n}\n\ninterface AgentCardListProps {\n agents: AgentRef[];\n}\n\nexport function AgentCardList({ agents }: AgentCardListProps) {\n if (agents.length === 0) {\n return null;\n }\n\n return (\n <div data-testid=\"inspiration-agent-card-list\" className=\"flex flex-col gap-2\">\n {agents.map((agent) => (\n <AgentCard key={agent.id} agent={agent} />\n ))}\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { SkillAvatar } from '@/components/skills-panel/components/SkillAvatar';\nimport type { SkillRef } from '../types';\n\ninterface SkillCardProps {\n skill: SkillRef;\n}\n\nexport function SkillCard({ skill }: SkillCardProps) {\n return (\n <div\n data-testid={`inspiration-skill-card-${skill.id}`}\n className=\"flex w-full min-w-0 items-center gap-3 rounded-[8px] px-4 py-3\"\n style={{ backgroundColor: '#fafafa' }}\n >\n <SkillAvatar\n avatarName={skill.id}\n avatarUrl={skill.icon}\n dataTestId={`inspiration-skill-card-${skill.id}-icon`}\n className=\"h-8 w-8 rounded-[8px]\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-[var(--text-primary)]\" title={skill.name}>\n {skill.name}\n </div>\n <div className=\"truncate text-xs text-[var(--text-secondary)]\" title={skill.id}>\n {skill.id}\n </div>\n </div>\n </div>\n );\n}\n\ninterface SkillCardListProps {\n skills: SkillRef[];\n}\n\nexport function SkillCardList({ skills }: SkillCardListProps) {\n if (skills.length === 0) {\n return null;\n }\n\n return (\n <div data-testid=\"inspiration-skill-card-list\" className=\"flex flex-col gap-2\">\n {skills.map((skill) => (\n <SkillCard key={skill.id} skill={skill} />\n ))}\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useState } from 'react';\nimport { Button } from '@/components/shared/Button';\nimport { getNewSessionDisabledReasonForTemplate, useCreateSameFlow } from '../hooks/useCreateSameFlow';\nimport type { InspirationTemplateDetail } from '../types';\nimport { AgentCardList } from './AgentCard';\nimport { CreateSessionDialog } from './CreateSessionDialog';\nimport { InspirationTag } from './InspirationTag';\nimport { SkillCardList } from './SkillCard';\n\ninterface InspirationInfoProps {\n template: InspirationTemplateDetail;\n}\n\nexport function InspirationInfo({ template }: InspirationInfoProps) {\n const [showDialog, setShowDialog] = useState(false);\n const createSame = useCreateSameFlow(template);\n const newSessionDisabledReason = getNewSessionDisabledReasonForTemplate(template);\n\n const handleDoSame = () => {\n setShowDialog(true);\n };\n\n const handleCreateNew = () => {\n void createSame({ kind: 'new' });\n };\n\n const handleSelectExisting = (threadId: string) => {\n void createSame({ kind: 'existing', threadId });\n };\n\n return (\n <>\n <div className=\"flex h-full flex-col overflow-hidden bg-[var(--surface-card)]\">\n <div className=\"flex-1 overflow-y-auto px-4 py-6\">\n <div className=\"truncate text-sm font-medium text-[var(--text-primary)]\" title={template.name}>\n {template.name}\n </div>\n\n <div data-testid=\"inspiration-info-tag-row\" className=\"mt-2 flex flex-wrap gap-1\">\n {template.tags.map((tag, index) => (\n <InspirationTag key={tag} label={tag} testId={index === 0 ? 'inspiration-card-tag' : undefined} />\n ))}\n </div>\n\n <div className=\"mt-6\">\n <Button variant=\"major\" size=\"lg\" block onClick={handleDoSame}>\n 创建同款\n </Button>\n </div>\n\n {template.skills.length > 0 && (\n <div className=\"mt-6\">\n <h3 className=\"mb-2 text-sm font-medium text-[var(--text-primary)]\">使用的技能</h3>\n <SkillCardList skills={template.skills} />\n </div>\n )}\n\n {template.agents.length > 0 && (\n <div className=\"mt-6\">\n <h3 className=\"mb-2 text-sm font-medium text-[var(--text-primary)]\">使用的智能体</h3>\n <AgentCardList agents={template.agents} />\n </div>\n )}\n\n <div className=\"mt-6\">\n <h3 className=\"mb-2 text-sm font-medium text-[var(--text-primary)]\">详细介绍</h3>\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed text-[var(--text-secondary)]\">\n {template.description}\n </p>\n </div>\n </div>\n </div>\n\n <CreateSessionDialog\n open={showDialog}\n onClose={() => setShowDialog(false)}\n onCreateNew={handleCreateNew}\n onSelectExisting={handleSelectExisting}\n newSessionDisabledReason={newSessionDisabledReason}\n />\n </>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { type RefObject, useCallback, useMemo } from 'react';\nimport { PreviewPanelShell } from '@/components/preview-panels/PreviewPanelShell';\nimport { useChatStore } from '@/stores/chatStore';\nimport { apiFetch } from '@/utils/api-client';\nimport type { ActiveDocumentPreview } from '../document-preview-types';\nimport { useSendFilePreviewReloadRevision } from '../useSendFilePreviewReloadRevision';\nimport { DocxDocumentPreview } from './DocxDocumentPreview';\nimport { useLocalDocxPreviewSource } from './useLocalDocxPreviewSource';\n\nfunction resolveFolderForOpen(path: string): string {\n const norm = path.replace(/\\\\/g, '/');\n const idx = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'));\n if (idx <= 0) return path;\n return path.slice(0, idx) || path;\n}\n\nexport type DocxPreviewPanelProps = {\n active: Extract<ActiveDocumentPreview, { kind: 'docx' }>;\n fullScreenContainerRef?: RefObject<HTMLDivElement | null>;\n frameless?: boolean;\n};\n\nexport function DocxPreviewPanel({ active, fullScreenContainerRef, frameless = false }: DocxPreviewPanelProps) {\n const closeDocumentPreview = useChatStore((s) => s.closeDocumentPreview);\n const projectPath = active.projectPath && active.projectPath !== 'default' ? active.projectPath : undefined;\n const reloadRevision = useSendFilePreviewReloadRevision(active.threadId, active.path);\n const load = useLocalDocxPreviewSource(active.path, projectPath, reloadRevision);\n\n const handleOpenFolder = useCallback(async () => {\n const folder = resolveFolderForOpen(active.path);\n try {\n await apiFetch('/api/projects/open-local-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path: folder,\n ...(projectPath ? { projectPath } : {}),\n }),\n });\n } catch {\n // best-effort\n }\n }, [active.path, projectPath]);\n\n const body = useMemo(() => {\n if (load.status === 'loading' || load.status === 'idle') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-gray-500\">加载中…</div>;\n }\n if (load.status === 'error') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-red-600\">{load.message}</div>;\n }\n return (\n <div className={frameless ? 'flex min-h-0 flex-1 flex-col' : 'flex min-h-0 flex-1 flex-col px-4 py-3'}>\n <DocxDocumentPreview contentBase64={load.contentBase64} title={active.displayName} />\n </div>\n );\n }, [active.displayName, frameless, load]);\n\n if (frameless) {\n return (\n <div\n data-testid=\"document-docx-preview-panel\"\n className=\"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden\"\n >\n {body}\n </div>\n );\n }\n\n return (\n <PreviewPanelShell\n panelTestId=\"document-docx-preview-panel\"\n title={active.displayName}\n fullScreenContainerRef={fullScreenContainerRef}\n onRequestClose={closeDocumentPreview}\n onOpenFolder={handleOpenFolder}\n folderButtonTitle=\"打开文件所在文件夹\"\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">{body}</div>\n </PreviewPanelShell>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { type RefObject, useCallback, useMemo, useState } from 'react';\nimport { PreviewPanelShell } from '@/components/preview-panels/PreviewPanelShell';\nimport { useChatStore } from '@/stores/chatStore';\nimport { apiFetch } from '@/utils/api-client';\nimport type { ActiveDocumentPreview } from './document-preview-types';\nimport { HtmlDocumentPreview } from './HtmlDocumentPreview';\nimport { HtmlPreviewToolbarActions } from './HtmlPreviewToolbar';\nimport { useEmbeddedTextPreviewSource } from './useEmbeddedTextPreviewSource';\nimport { useSendFilePreviewReloadRevision } from './useSendFilePreviewReloadRevision';\n\nfunction resolveFolderForOpen(path: string): string {\n const norm = path.replace(/\\\\/g, '/');\n const idx = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'));\n if (idx <= 0) return path;\n return path.slice(0, idx) || path;\n}\n\nexport type HtmlPreviewPanelProps = {\n active: Extract<ActiveDocumentPreview, { kind: 'html' }>;\n fullScreenContainerRef?: RefObject<HTMLDivElement | null>;\n frameless?: boolean;\n};\n\nexport function HtmlPreviewPanel({ active, fullScreenContainerRef, frameless = false }: HtmlPreviewPanelProps) {\n const closeDocumentPreview = useChatStore((s) => s.closeDocumentPreview);\n const projectPath = active.projectPath && active.projectPath !== 'default' ? active.projectPath : undefined;\n const reloadRevision = useSendFilePreviewReloadRevision(active.threadId, active.path);\n const [htmlRefreshNonce, bumpHtmlRefresh] = useState(0);\n const onRefreshHtmlPreview = useCallback(() => bumpHtmlRefresh((n) => n + 1), []);\n const load = useEmbeddedTextPreviewSource(active.path, projectPath, reloadRevision, htmlRefreshNonce);\n\n const handleOpenFolder = useCallback(async () => {\n const folder = resolveFolderForOpen(active.path);\n try {\n await apiFetch('/api/projects/open-local-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path: folder,\n ...(projectPath ? { projectPath } : {}),\n }),\n });\n } catch {\n // best-effort\n }\n }, [active.path, projectPath]);\n\n const okHtmlSig = load.status === 'ok' ? load.content : '';\n const extraHeaderContent = useMemo(() => {\n if (load.status !== 'ok') return null;\n return (\n <HtmlPreviewToolbarActions\n html={okHtmlSig}\n filePath={active.path}\n projectPath={projectPath}\n onRefresh={onRefreshHtmlPreview}\n />\n );\n }, [load.status, okHtmlSig, active.path, projectPath, onRefreshHtmlPreview]);\n\n const body = useMemo(() => {\n if (load.status === 'loading' || load.status === 'idle') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-gray-500\">加载中…</div>;\n }\n if (load.status === 'error') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-red-600\">{load.message}</div>;\n }\n return (\n <div className={frameless ? 'flex min-h-0 flex-1 flex-col' : 'flex min-h-0 flex-1 flex-col px-4 py-3'}>\n <div className=\"min-h-0 flex flex-1 flex-col\">\n <HtmlDocumentPreview html={load.content} title={active.displayName} />\n </div>\n </div>\n );\n }, [active.displayName, frameless, load]);\n\n if (frameless) {\n return (\n <div\n data-testid=\"document-html-preview-panel\"\n className=\"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden\"\n >\n {body}\n </div>\n );\n }\n\n return (\n <PreviewPanelShell\n panelTestId=\"document-html-preview-panel\"\n title={active.displayName}\n fullScreenContainerRef={fullScreenContainerRef}\n onRequestClose={closeDocumentPreview}\n onOpenFolder={handleOpenFolder}\n folderButtonTitle=\"打开文件所在文件夹\"\n extraHeaderContent={extraHeaderContent}\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">{body}</div>\n </PreviewPanelShell>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { type RefObject, useCallback, useMemo } from 'react';\nimport { PreviewPanelShell } from '@/components/preview-panels/PreviewPanelShell';\nimport { useChatStore } from '@/stores/chatStore';\nimport { apiFetch } from '@/utils/api-client';\nimport type { ActiveDocumentPreview } from './document-preview-types';\nimport { MarkdownDocumentPreview } from './MarkdownDocumentPreview';\nimport { PreviewCopyButton } from './PreviewToolbarShared';\nimport { useEmbeddedTextPreviewSource } from './useEmbeddedTextPreviewSource';\nimport { useSendFilePreviewReloadRevision } from './useSendFilePreviewReloadRevision';\n\nfunction resolveFolderForOpen(path: string): string {\n const norm = path.replace(/\\\\/g, '/');\n const idx = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'));\n if (idx <= 0) return path;\n return path.slice(0, idx) || path;\n}\n\nexport interface MarkdownPreviewPanelProps {\n active: Extract<ActiveDocumentPreview, { kind: 'markdown' }>;\n fullScreenContainerRef?: RefObject<HTMLDivElement | null>;\n frameless?: boolean;\n}\n\nexport function MarkdownPreviewPanel({ active, fullScreenContainerRef, frameless = false }: MarkdownPreviewPanelProps) {\n const closeDocumentPreview = useChatStore((s) => s.closeDocumentPreview);\n const projectPath = active.projectPath && active.projectPath !== 'default' ? active.projectPath : undefined;\n const reloadRevision = useSendFilePreviewReloadRevision(active.threadId, active.path);\n const load = useEmbeddedTextPreviewSource(active.path, projectPath, reloadRevision);\n\n const handleOpenFolder = useCallback(async () => {\n const folder = resolveFolderForOpen(active.path);\n try {\n await apiFetch('/api/projects/open-local-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path: folder,\n ...(projectPath ? { projectPath } : {}),\n }),\n });\n } catch {\n // best-effort\n }\n }, [active.path, projectPath]);\n\n const markdownCopySig = load.status === 'ok' ? load.content : '';\n const extraHeaderContent = useMemo(() => {\n if (load.status !== 'ok') return null;\n return <PreviewCopyButton text={markdownCopySig} copyKindLabel=\"Markdown\" />;\n }, [load.status, markdownCopySig]);\n\n const body = useMemo(() => {\n if (load.status === 'loading' || load.status === 'idle') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-gray-500\">加载中…</div>;\n }\n if (load.status === 'error') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-red-600\">{load.message}</div>;\n }\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className={frameless ? 'min-h-0 flex-1 overflow-auto' : 'min-h-0 flex-1 overflow-auto px-6 py-4'}>\n <MarkdownDocumentPreview source={load.content} />\n </div>\n </div>\n );\n }, [frameless, load]);\n\n if (frameless) {\n return (\n <div\n data-testid=\"document-markdown-preview-panel\"\n className=\"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden\"\n >\n {body}\n </div>\n );\n }\n\n return (\n <PreviewPanelShell\n panelTestId=\"document-markdown-preview-panel\"\n title={active.displayName}\n fullScreenContainerRef={fullScreenContainerRef}\n onRequestClose={closeDocumentPreview}\n onOpenFolder={handleOpenFolder}\n folderButtonTitle=\"打开文件所在文件夹\"\n extraHeaderContent={extraHeaderContent}\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">{body}</div>\n </PreviewPanelShell>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { type RefObject, useCallback, useMemo } from 'react';\nimport { PreviewPanelShell } from '@/components/preview-panels/PreviewPanelShell';\nimport { useChatStore } from '@/stores/chatStore';\nimport { apiFetch } from '@/utils/api-client';\nimport type { ActiveDocumentPreview } from '../document-preview-types';\nimport { useSendFilePreviewReloadRevision } from '../useSendFilePreviewReloadRevision';\nimport { useLocalXlsxPreviewSource } from './useLocalXlsxPreviewSource';\nimport { useXlsxSheetParse } from './useXlsxSheetParse';\nimport { XlsxDocumentPreview } from './XlsxDocumentPreview';\n\nfunction resolveFolderForOpen(path: string): string {\n const norm = path.replace(/\\\\/g, '/');\n const idx = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'));\n if (idx <= 0) return path;\n return path.slice(0, idx) || path;\n}\n\nexport type XlsxPreviewPanelProps = {\n active: Extract<ActiveDocumentPreview, { kind: 'xlsx' }>;\n fullScreenContainerRef?: RefObject<HTMLDivElement | null>;\n frameless?: boolean;\n};\n\nexport function XlsxPreviewPanel({ active, fullScreenContainerRef, frameless = false }: XlsxPreviewPanelProps) {\n const closeDocumentPreview = useChatStore((s) => s.closeDocumentPreview);\n const projectPath = active.projectPath && active.projectPath !== 'default' ? active.projectPath : undefined;\n const reloadRevision = useSendFilePreviewReloadRevision(active.threadId, active.path);\n const load = useLocalXlsxPreviewSource(active.path, projectPath, reloadRevision);\n const fetchBase64 = load.status === 'ok' ? load.contentBase64 : null;\n const parse = useXlsxSheetParse(fetchBase64);\n\n const handleOpenFolder = useCallback(async () => {\n const folder = resolveFolderForOpen(active.path);\n try {\n await apiFetch('/api/projects/open-local-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path: folder,\n ...(projectPath ? { projectPath } : {}),\n }),\n });\n } catch {\n // best-effort\n }\n }, [active.path, projectPath]);\n\n const body = useMemo(() => {\n if (load.status === 'loading' || load.status === 'idle') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-gray-500\">加载中…</div>;\n }\n if (load.status === 'error') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-red-600\">{load.message}</div>;\n }\n if (parse.status === 'error') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-red-600\">{parse.message}</div>;\n }\n if (parse.status === 'parsing' || parse.status === 'idle') {\n return <div className=\"flex flex-1 items-center justify-center p-6 text-sm text-gray-400\">解析中…</div>;\n }\n return (\n <div className={frameless ? 'flex min-h-0 flex-1 flex-col' : 'flex min-h-0 flex-1 flex-col px-4 py-3'}>\n <XlsxDocumentPreview key={fetchBase64} sheets={parse.sheets} title={active.displayName} />\n </div>\n );\n }, [active.displayName, fetchBase64, frameless, load, parse]);\n\n if (frameless) {\n return (\n <div\n data-testid=\"document-xlsx-preview-panel\"\n className=\"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden\"\n >\n {body}\n </div>\n );\n }\n\n return (\n <PreviewPanelShell\n panelTestId=\"document-xlsx-preview-panel\"\n title={active.displayName}\n fullScreenContainerRef={fullScreenContainerRef}\n onRequestClose={closeDocumentPreview}\n onOpenFolder={handleOpenFolder}\n folderButtonTitle=\"打开文件所在文件夹\"\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">{body}</div>\n </PreviewPanelShell>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { ReactNode } from 'react';\nimport type { ActiveDocumentPreview } from '@/components/document-preview/document-preview-types';\nimport { DocxPreviewPanel } from '@/components/document-preview/docx/DocxPreviewPanel';\nimport { HtmlPreviewPanel } from '@/components/document-preview/HtmlPreviewPanel';\nimport { MarkdownPreviewPanel } from '@/components/document-preview/MarkdownPreviewPanel';\nimport { XlsxPreviewPanel } from '@/components/document-preview/xlsx/XlsxPreviewPanel';\nimport type { ProductRef } from '../types';\n\ninterface InspirationProductPreviewProps {\n product: ProductRef | null;\n}\n\nfunction toActiveDocumentPreview(product: ProductRef): ActiveDocumentPreview | null {\n const base = {\n path: product.path,\n displayName: product.name,\n threadId: 'inspiration-preview',\n };\n\n switch (product.type) {\n case 'html':\n return { ...base, kind: 'html' };\n case 'markdown':\n return { ...base, kind: 'markdown' };\n case 'word':\n return { ...base, kind: 'docx' };\n case 'excel':\n return { ...base, kind: 'xlsx' };\n case 'image':\n return null;\n }\n}\n\nexport function InspirationProductPreview({ product }: InspirationProductPreviewProps) {\n if (!product) {\n return null;\n }\n\n if (product.type === 'image') {\n const title = <div className=\"mb-3 shrink-0 text-sm font-medium text-[var(--text-primary)]\">{product.name}</div>;\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center justify-center overflow-hidden\">\n {title}\n {/* biome-ignore lint/performance/noImgElement: Vite app renders API-served dynamic product images. */}\n <img\n src={product.path}\n alt={product.name}\n className=\"max-h-full max-w-full object-contain\"\n onError={(event) => {\n event.currentTarget.src = '/images/inspiration-products/default.svg';\n }}\n />\n </div>\n );\n }\n\n const active = toActiveDocumentPreview(product);\n if (!active) return null;\n\n let preview: ReactNode = null;\n switch (active.kind) {\n case 'html':\n preview = <HtmlPreviewPanel active={active} frameless />;\n break;\n case 'markdown':\n preview = <MarkdownPreviewPanel active={active} frameless />;\n break;\n case 'docx':\n preview = <DocxPreviewPanel active={active} frameless />;\n break;\n case 'xlsx':\n preview = <XlsxPreviewPanel active={active} frameless />;\n break;\n case 'pdf':\n preview = null;\n }\n\n if (!preview) return null;\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col overflow-hidden\">\n <div className=\"min-h-0 flex-1\">{preview}</div>\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useMemo, useState } from 'react';\nimport { useRightContentHeaderOverride } from '@/components/RightContentHeaderOverrideContext';\nimport type { InspirationTemplateDetail } from '../types';\nimport { InspirationInfo } from './InspirationInfo';\nimport { InspirationProductPreview } from './InspirationProductPreview';\n\ninterface InspirationDetailProps {\n template: InspirationTemplateDetail;\n onBack: () => void;\n}\n\nfunction InspirationDetailHeaderTitle({ name, onBack }: { name: string; onBack: () => void }) {\n return (\n <div data-testid=\"inspiration-detail-header\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <button\n type=\"button\"\n onClick={onBack}\n aria-label=\"返回灵感广场\"\n className=\"shrink-0 rounded-lg py-2 pr-2 pl-0 transition-colors hover:bg-[var(--surface-hover)]\"\n >\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <h2 className=\"min-w-0 flex-1 truncate pr-4 text-lg font-semibold text-[var(--text-primary)]\">{name}</h2>\n </div>\n );\n}\n\nexport function InspirationDetail({ template, onBack }: InspirationDetailProps) {\n const [infoPanelVisible, setInfoPanelVisible] = useState(true);\n const hasProduct = Boolean(template.productPath);\n\n const isScheduledWithImage = template.tags.includes('定时任务') && template.product?.type === 'image';\n const headerOverride = useMemo(\n () => ({\n leftContent: <InspirationDetailHeaderTitle name={template.name} onBack={onBack} />,\n panelToggle: {\n isOpen: infoPanelVisible,\n onToggle: () => setInfoPanelVisible((visible) => !visible),\n openLabel: '展开信息面板',\n closeLabel: '收起信息面板',\n },\n }),\n [infoPanelVisible, onBack, template.name],\n );\n\n useRightContentHeaderOverride(headerOverride);\n\n return (\n <div className=\"flex h-full flex-col overflow-hidden\">\n <div className=\"flex min-h-0 flex-1\">\n <div\n data-testid=\"inspiration-preview-pane\"\n className={['min-w-0 flex-1 overflow-hidden p-4', infoPanelVisible ? 'border-r border-[#f0f0f0]' : ''].join(\n ' ',\n )}\n >\n <div\n data-testid=\"inspiration-preview-surface\"\n className={[\n 'flex h-full flex-col',\n isScheduledWithImage ? 'bg-[url(/images/inspiration-bg.png)] bg-cover bg-center' : '',\n ].join(' ')}\n >\n <div className=\"flex min-h-0 flex-1 items-center justify-center\">\n {hasProduct ? (\n <InspirationProductPreview product={template.product} />\n ) : (\n <div className=\"text-sm text-[var(--text-secondary)]\">暂无产物</div>\n )}\n </div>\n </div>\n </div>\n {infoPanelVisible && (\n <div data-testid=\"inspiration-info-panel\" className=\"w-[392px] min-w-[320px] shrink-0 overflow-hidden\">\n <InspirationInfo template={template} />\n </div>\n )}\n </div>\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { apiFetch } from '@/utils/api-client';\nimport type { AgentRef, InspirationTemplateDetail, SkillRef } from '../types';\n\ninterface UseInspirationDetailResult {\n template: InspirationTemplateDetail | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\ninterface SkillDetailLookup {\n id?: unknown;\n name?: unknown;\n icon?: unknown;\n iconUrl?: unknown;\n avatar?: unknown;\n}\n\ninterface AgentLookup {\n id?: unknown;\n name?: unknown;\n displayName?: unknown;\n breedId?: unknown;\n avatar?: unknown;\n icon?: unknown;\n}\n\ninterface ExpertLookup {\n expertId?: unknown;\n displayName?: unknown;\n nickname?: unknown;\n avatar?: unknown;\n}\n\nfunction pickString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value !== 'string') continue;\n const trimmed = value.trim();\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n\nfunction mergeSkillRef(original: SkillRef, lookup: SkillDetailLookup | null): SkillRef {\n if (!lookup) return original;\n const id = pickString(lookup.id) ?? original.id;\n const name = pickString(lookup.name) ?? original.name;\n const icon = pickString(lookup.iconUrl, lookup.icon, lookup.avatar, original.icon);\n return { ...original, id, name, ...(icon ? { icon } : {}) };\n}\n\nasync function resolveSkillRef(skill: SkillRef): Promise<SkillRef> {\n try {\n const res = await apiFetch(`/api/skills/detail?name=${encodeURIComponent(skill.id)}`);\n if (!res.ok) return skill;\n const lookup = (await res.json()) as SkillDetailLookup;\n return mergeSkillRef(skill, lookup);\n } catch {\n return skill;\n }\n}\n\nfunction mergeAgentRef(original: AgentRef, lookup: AgentLookup | undefined): AgentRef {\n if (!lookup) return original;\n const id = pickString(lookup.id) ?? original.id;\n const name = pickString(lookup.displayName, lookup.name) ?? original.name;\n const catId = pickString(lookup.breedId, lookup.id) ?? original.catId;\n const icon = pickString(lookup.avatar, lookup.icon, original.icon);\n return { ...original, id, name, catId, ...(icon ? { icon } : {}) };\n}\n\nfunction mergeExpertAgentRef(original: AgentRef, lookup: ExpertLookup | undefined): AgentRef {\n if (!lookup) return original;\n const expertId = pickString(lookup.expertId) ?? original.id;\n const name = pickString(lookup.displayName, lookup.nickname) ?? original.name;\n const icon = pickString(lookup.avatar, original.icon);\n return { ...original, id: expertId, name, catId: expertId, ...(icon ? { icon } : {}) };\n}\n\nfunction isExpertAgentRef(agent: AgentRef): boolean {\n return agent.id.startsWith('expert-') || agent.catId.startsWith('expert-');\n}\n\nasync function fetchAgentRows(): Promise<AgentLookup[]> {\n try {\n const res = await apiFetch('/api/agents');\n if (!res.ok) return [];\n const data = (await res.json()) as { agents?: AgentLookup[]; cats?: AgentLookup[] };\n return Array.isArray(data.agents) ? data.agents : Array.isArray(data.cats) ? data.cats : [];\n } catch {\n return [];\n }\n}\n\nasync function fetchExpertRows(shouldFetch: boolean): Promise<ExpertLookup[]> {\n if (!shouldFetch) return [];\n try {\n const res = await apiFetch('/api/experts');\n if (!res.ok) return [];\n const data = (await res.json()) as { experts?: ExpertLookup[] };\n return Array.isArray(data.experts) ? data.experts : [];\n } catch {\n return [];\n }\n}\n\nasync function resolveAgentRefs(agents: AgentRef[]): Promise<AgentRef[]> {\n if (agents.length === 0) return agents;\n\n const [agentRows, expertRows] = await Promise.all([\n fetchAgentRows(),\n fetchExpertRows(agents.some(isExpertAgentRef)),\n ]);\n const agentsById = new Map<string, AgentLookup>();\n for (const row of agentRows) {\n const id = pickString(row.id);\n if (id) agentsById.set(id, row);\n }\n const expertsById = new Map<string, ExpertLookup>();\n for (const row of expertRows) {\n const id = pickString(row.expertId);\n if (id) expertsById.set(id, row);\n }\n return agents.map((agent) => {\n const expert = expertsById.get(agent.id) ?? expertsById.get(agent.catId);\n if (expert) return mergeExpertAgentRef(agent, expert);\n return mergeAgentRef(agent, agentsById.get(agent.id) ?? agentsById.get(agent.catId));\n });\n}\n\nasync function enrichTemplateDetail(template: InspirationTemplateDetail): Promise<InspirationTemplateDetail> {\n const [skills, agents] = await Promise.all([\n Promise.all(template.skills.map(resolveSkillRef)),\n resolveAgentRefs(template.agents),\n ]);\n return { ...template, skills, agents };\n}\n\nexport function useInspirationDetail(templateId: string | null): UseInspirationDetailResult {\n const [template, setTemplate] = useState<InspirationTemplateDetail | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refetch = useCallback(() => {\n setRefreshKey((k) => k + 1);\n }, []);\n\n useEffect(() => {\n if (!templateId) {\n setTemplate(null);\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n apiFetch(`/api/inspiration/templates/${templateId}`)\n .then((res) => {\n if (!res.ok) throw new Error(`Failed to fetch template: ${res.status}`);\n return res.json();\n })\n .then((data) => (data.data ? enrichTemplateDetail(data.data as InspirationTemplateDetail) : null))\n .then((nextTemplate) => {\n if (!cancelled) {\n setTemplate(nextTemplate);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [templateId, refreshKey]);\n\n return { template, isLoading, error, refetch };\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { apiFetch } from '@/utils/api-client';\nimport type {\n InspirationTemplateListResponse,\n InspirationTemplateListItem,\n ProductTypeFilter,\n TemplateCategory,\n} from '../types';\n\ninterface UseInspirationTemplatesOptions {\n category?: TemplateCategory;\n keyword?: string;\n productType?: ProductTypeFilter | '全部';\n}\n\ninterface UseInspirationTemplatesResult {\n templates: InspirationTemplateListItem[];\n total: number;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useInspirationTemplates(\n options: UseInspirationTemplatesOptions = {}\n): UseInspirationTemplatesResult {\n const { category = '全部', keyword = '', productType = '全部' } = options;\n const [templates, setTemplates] = useState<InspirationTemplateListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refetch = useCallback(() => {\n setRefreshKey((k) => k + 1);\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n const params = new URLSearchParams();\n if (category && category !== '全部') {\n params.set('category', category);\n }\n if (keyword) {\n params.set('keyword', keyword);\n }\n if (productType && productType !== '全部') {\n params.set('productType', productType);\n }\n\n const queryString = params.toString();\n const url = `/api/inspiration/templates${queryString ? `?${queryString}` : ''}`;\n\n apiFetch(url)\n .then((res) => res.json())\n .then((data: { code: number; message: string; data: InspirationTemplateListResponse }) => {\n if (!cancelled) {\n setTemplates(data.data?.templates || []);\n setTotal(data.data?.total || 0);\n setIsLoading(false);\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setError(err.message || 'Unknown error');\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [category, keyword, productType, refreshKey]);\n\n return { templates, total, isLoading, error, refetch };\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nexport type TemplateCategory =\n | '全部'\n | '精选'\n | '定时任务'\n | '专家团思辨'\n | '文档处理'\n | '深度研究'\n | '幻灯片'\n | '数据分析'\n | '数据可视化'\n | '金融服务';\n\n\nexport interface SkillRef {\n id: string;\n name: string;\n icon?: string;\n}\n\nexport interface AgentRef {\n id: string;\n name: string;\n catId: string;\n icon?: string;\n}\n\nexport type ProductType = 'html' | 'word' | 'excel' | 'markdown' | 'image';\nexport type ProductTypeFilter = ProductType | 'messagePush';\n\nexport interface ProductRef {\n id: string;\n name: string;\n type: ProductType;\n path: string;\n previewContent?: string;\n}\n\nexport interface InspirationTemplateListItem {\n id: string;\n name: string;\n imagePath: string;\n description: string;\n isFeatured: boolean;\n skills: SkillRef[];\n agents: AgentRef[];\n tags: string[];\n}\n\nexport interface InspirationTemplateDetail extends InspirationTemplateListItem {\n prompt: string;\n productPath: string | null;\n product: ProductRef | null;\n}\n\nexport type InspirationTemplate = InspirationTemplateDetail;\n\nexport interface InspirationTemplateListResponse {\n templates: InspirationTemplateListItem[];\n total: number;\n}\n\nexport const TEMPLATE_CATEGORIES: TemplateCategory[] = [\n '全部',\n '精选',\n '定时任务',\n '专家团思辨',\n '文档处理',\n '深度研究',\n '幻灯片',\n '数据分析',\n '数据可视化',\n '金融服务',\n];\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { useState } from 'react';\nimport { Button } from '@/components/shared/Button';\nimport { SearchInput } from '@/components/shared/SearchInput';\nimport { Select } from '@/components/shared/Select';\nimport { Tab } from '@/components/shared/Tab';\nimport { InspirationCardGrid } from './components/InspirationCardGrid';\nimport { InspirationDetail } from './components/InspirationDetail';\nimport { useInspirationDetail } from './hooks/useInspirationDetail';\nimport { useInspirationTemplates } from './hooks/useInspirationTemplates';\nimport type { InspirationTemplateListItem, ProductTypeFilter, TemplateCategory } from './types';\nimport { TEMPLATE_CATEGORIES } from './types';\n\nconst TAB_ITEMS = TEMPLATE_CATEGORIES.map((cat) => ({ value: cat, label: cat }));\ntype ProductTypeSelectValue = ProductTypeFilter | '全部';\nconst PLAZA_PAGE_CLASS = 'mx-auto h-full w-full max-w-[1920px]';\n\nconst PRODUCT_TYPE_OPTIONS: Array<{ value: ProductTypeSelectValue; label: string }> = [\n { value: '全部', label: '全部类型' },\n { value: 'word', label: '文档' },\n { value: 'excel', label: '表格' },\n { value: 'markdown', label: 'Markdown' },\n { value: 'html', label: 'HTML' },\n { value: 'image', label: '图片' },\n { value: 'messagePush', label: '消息推送' },\n];\n\nexport function InspirationPlaza() {\n const [activeTab, setActiveTab] = useState<TemplateCategory>('全部');\n const [searchKeyword, setSearchKeyword] = useState('');\n const [productType, setProductType] = useState<ProductTypeSelectValue>('全部');\n const [selectedTemplateId, setSelectedTemplateId] = useState<string | null>(null);\n\n const { templates, total, isLoading, refetch } = useInspirationTemplates({\n category: activeTab,\n keyword: searchKeyword,\n productType,\n });\n const {\n template: selectedTemplate,\n isLoading: isDetailLoading,\n error: detailError,\n } = useInspirationDetail(selectedTemplateId);\n\n const handleTabChange = (tab: string) => {\n setActiveTab(tab as TemplateCategory);\n setSearchKeyword('');\n setSelectedTemplateId(null);\n };\n\n const handleCardClick = (template: InspirationTemplateListItem) => {\n setSelectedTemplateId(template.id);\n };\n\n const handleBack = () => {\n setSelectedTemplateId(null);\n };\n\n // Detail view\n if (selectedTemplateId) {\n return (\n <div className={PLAZA_PAGE_CLASS}>\n {isDetailLoading ? (\n <div className=\"flex h-full items-center justify-center text-sm text-[var(--text-secondary)]\">\n 加载灵感详情中...\n </div>\n ) : selectedTemplate ? (\n <InspirationDetail template={selectedTemplate} onBack={handleBack} />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-[var(--text-secondary)]\">\n {detailError ?? '灵感详情不可用'}\n </div>\n )}\n </div>\n );\n }\n\n // List view\n return (\n <div className={`${PLAZA_PAGE_CLASS} flex flex-col px-8 py-8`}>\n {/* Tabs */}\n <div data-testid=\"inspiration-tabs-section\">\n <Tab items={TAB_ITEMS} value={activeTab} onChange={handleTabChange} />\n </div>\n\n <div data-testid=\"inspiration-total-heading\" className=\"mt-6 text-xl font-semibold text-[var(--text-primary)]\">\n 全部({total})\n </div>\n\n {/* Search area */}\n <div data-testid=\"inspiration-search-section\" className=\"mt-6 flex items-center gap-3\">\n <Select\n aria-label=\"类型筛选\"\n value={productType}\n options={PRODUCT_TYPE_OPTIONS}\n onChange={setProductType}\n className=\"w-[160px] shrink-0\"\n />\n <SearchInput\n value={searchKeyword}\n onChange={setSearchKeyword}\n onClear={() => setSearchKeyword('')}\n placeholder=\"搜索灵感...\"\n wrapperClassName=\"min-w-0 flex-1\"\n inputClassName=\"h-8\"\n />\n <Button\n variant=\"default\"\n size=\"lg\"\n onlyIcon\n hasBorder\n aria-label=\"刷新灵感列表\"\n data-testid=\"inspiration-refresh-button\"\n className=\"shrink-0\"\n iconLeft={<img src=\"/icons/icon-refresh.svg\" alt=\"\" className=\"h-4 w-4\" />}\n onClick={refetch}\n />\n </div>\n\n {/* Content */}\n <div data-testid=\"inspiration-card-section\" className=\"mt-6 flex-1 overflow-y-auto\">\n <InspirationCardGrid templates={templates} isLoading={isLoading} onCardClick={handleCardClick} />\n </div>\n </div>\n );\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { InspirationPlaza } from '@/components/inspiration-plaza';\n\nexport default function InspirationPage() {\n return (\n <div className=\"h-full overflow-hidden ui-shell-surface\">\n <InspirationPlaza />\n </div>\n );\n}\n"],"names":["joinClasses","values","SelectArrow","open","jsx","getNextEnabledIndex","options","startIndex","direction","index","checked","_a","Select","value","onChange","placeholder","popupClassName","className","disabled","id","buttonProps","reactId","useId","selectId","listboxId","triggerRef","useRef","popupRef","setOpen","useState","activeIndex","setActiveIndex","selectedIndex","option","selectedOption","getInitialActiveIndex","openPopup","closePopup","selectOption","useEffect","handlePointerDown","event","target","_b","handleKeyDown","current","activeOption","triggerRect","popupStyle","popup","isSelected","isActive","optionId","jsxs","Fragment","createPortal","HOME_DRAFT_THREAD_ID","PLAZA_EXPERT_NEW_SESSION_DISABLED_REASON","hasPrompt","template","resolveTemplateDetail","response","apiFetch","normalizeLookupValue","stripVariantLabel","resolveSkillNames","skills","skillOptions","optionByName","names","seen","skill","matchedName","candidate","key","getAgentByOptionId","agents","agent","getStrongAgentValues","getAliasAgentValues","getExpertStrongValues","getExpertAliasValues","hasAgentMatch","ref","findMatchingAgentOption","agentOptions","expertOptions","strongMatches","strongValues","aliasMatches","aliasValues","resolveAgentMentionRefs","templateAgents","experts","buildAgentOptions","buildExpertOption","refs","mention","mentionAlreadyInPrompt","prompt","resolveCategoryToken","tags","visibleCategoryByLabel","QUICK_ACTIONS","action","tag","label","token","getQuickActionToken","getPlazaExpertAgentIds","ids","normalizedId","getNewSessionDisabledReasonForTemplate","invitePlazaExpertsToThread","threadId","expertIds","expertId","body","buildCreateSameInput","detail","fetchSkillOptionsWithCache","categoryToken","skillTokens","getSkillToken","mentionRefs","mentionTokens","prefix","resolveDefaultWorkspacePathForFilePlaceholders","promptHasFilePlaceholder","data","workspaceRoot","buildDefaultInspirationWorkspacePath","useCreateSameFlow","navigate","useNavigate","setPendingChatInsert","useChatStore","state","useAgentData","useExpertCatalog","useCallback","plazaExpertIds","text","workspacePath","error","getAvatarInitial","name","isImageAvatar","avatar","getAvatarSrc","API_URL","AvatarCircle","size","scaleAvatarMetric","getThreadHistoryAvatarLayout","count","positions","position","SessionAvatarGroup","participants","getAgentById","getExpertById","avatars","participantId","expert","_c","_d","layout","normalizeStoredThreadTitleOrNull","title","trimmed","getSessionTitle","session","getSessionDescription","CreateSessionDialog","onClose","onCreateNew","onSelectExisting","newSessionDisabledReason","searchKeyword","setSearchKeyword","sessions","setSessions","selectedId","setSelectedId","isLoading","setIsLoading","isNewSessionDisabled","loadSessions","res","nextSessions","thread","a","b","filteredSessions","useMemo","keyword","handleNewSession","handleConfirm","AppModal","SearchInput","Button","displayTitle","avatarParticipantIds","OverflowTooltip","TONE_CLASSES","getInspirationTagTone","getInspirationTagDisplayLabel","getInspirationTagToneClass","tone","InspirationTag","iconSrc","testId","resolvedTone","displayLabel","DEFAULT_INSPIRATION_THUMBNAIL","PRODUCT_THUMBNAIL_THEMES","getProductThumbnailTheme","hasReturnedThumbnail","imagePath","normalizedPath","InspirationProductThumbnail","theme","shouldShowIcon","InspirationCard","onClick","showDialog","setShowDialog","createSame","productThumbnailTheme","handleCreateSame","e","handleDoSameNew","_threadId","handleDoSameExisting","CARD_GRID_CLASS","InspirationCardGrid","templates","onCardClick","_","i","COMMON_CHINESE_INITIALS","PINYIN_BOUNDARIES","pinyinCollator","isChineseChar","char","getChinesePinyinInitial","common","initial","boundary","getDisplayInitial","first","AgentCard","avatarSrc","hasImageAvatar","AgentCardList","SkillCard","SkillAvatar","SkillCardList","InspirationInfo","handleDoSame","handleCreateNew","handleSelectExisting","resolveFolderForOpen","path","norm","idx","DocxPreviewPanel","active","fullScreenContainerRef","frameless","closeDocumentPreview","s","projectPath","reloadRevision","useSendFilePreviewReloadRevision","load","useLocalDocxPreviewSource","handleOpenFolder","folder","DocxDocumentPreview","PreviewPanelShell","HtmlPreviewPanel","htmlRefreshNonce","bumpHtmlRefresh","onRefreshHtmlPreview","n","useEmbeddedTextPreviewSource","okHtmlSig","extraHeaderContent","HtmlPreviewToolbarActions","HtmlDocumentPreview","MarkdownPreviewPanel","markdownCopySig","PreviewCopyButton","MarkdownDocumentPreview","XlsxPreviewPanel","useLocalXlsxPreviewSource","fetchBase64","parse","useXlsxSheetParse","XlsxDocumentPreview","toActiveDocumentPreview","product","base","InspirationProductPreview","preview","InspirationDetailHeaderTitle","onBack","InspirationDetail","infoPanelVisible","setInfoPanelVisible","hasProduct","isScheduledWithImage","headerOverride","visible","useRightContentHeaderOverride","pickString","mergeSkillRef","original","lookup","icon","resolveSkillRef","mergeAgentRef","catId","mergeExpertAgentRef","isExpertAgentRef","fetchAgentRows","fetchExpertRows","shouldFetch","resolveAgentRefs","agentRows","expertRows","agentsById","row","expertsById","enrichTemplateDetail","useInspirationDetail","templateId","setTemplate","setError","refreshKey","setRefreshKey","refetch","k","cancelled","nextTemplate","err","useInspirationTemplates","category","productType","setTemplates","total","setTotal","params","queryString","url","TEMPLATE_CATEGORIES","TAB_ITEMS","cat","PLAZA_PAGE_CLASS","PRODUCT_TYPE_OPTIONS","InspirationPlaza","activeTab","setActiveTab","setProductType","selectedTemplateId","setSelectedTemplateId","selectedTemplate","isDetailLoading","detailError","handleTabChange","tab","handleCardClick","handleBack","Tab","InspirationPage"],"mappings":"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"}
|