@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,2 @@
|
|
|
1
|
+
import{Q as E}from"./quick-actions-DzZE-zyP.js";const k=["image/png","image/jpeg","application/pdf","application/msword","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel.sheet.macroEnabled.12","application/vnd.ms-excel.sheet.binary.macroEnabled.12","application/vnd.openxmlformats-officedocument.presentationml.presentation","text/markdown","text/x-markdown","text/plain","text/csv",".png",".jpg",".jpeg",".pdf",".doc",".docx",".xls",".xlsx",".xlsm",".xlsb",".ppt",".pptx",".md",".txt",".csv"].join(","),U="该附件类型暂不支持",P=100*1024*1024,$=10*1024*1024,F="文件大小超过限制,最大支持 100MB",X="图片大小超过限制,最大支持 10MB",R=70,B=260,u=5e3,h=5,D=20,v="[[skill:",_="]]",T="[[quick_action:",b="]]",K="inline-flex shrink-0 items-center gap-1 rounded-[20px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-3 py-1.5 text-sm text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] disabled:cursor-not-allowed disabled:opacity-50",j="inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-[var(--border-default)] bg-[var(--surface-panel)] text-[var(--text-label-secondary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:text-[var(--text-accent)]",G="min-w-0 rounded-[16px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-4 py-2 text-left text-[14px] font-normal leading-[22px] text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)]",Q="group min-w-0 rounded-[16px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:border-[var(--border-accent)]",H="inline-flex items-center gap-2 rounded-full border border-[var(--border-default)] bg-[var(--surface-panel)] px-3 py-[7px] text-xs text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)]",z="inline-flex h-8 w-8 items-center justify-center rounded-[8px] text-[var(--text-label-secondary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:text-[var(--text-accent)] disabled:cursor-not-allowed disabled:opacity-30",S=new Set(["image/png","image/jpeg","application/pdf","application/msword","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel.sheet.macroenabled.12","application/vnd.ms-excel.sheet.binary.macroenabled.12","application/vnd.openxmlformats-officedocument.presentationml.presentation","text/markdown","text/x-markdown","text/plain","text/csv"]),I=new Set(["png","jpg","jpeg","pdf","doc","docx","xls","xlsx","xlsm","xlsb","ppt","pptx","md","txt","csv"]),A=/[\s,.:;!?()[\]{}<>,。!?、:;()【】《》「」『』〈〉]/,m=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function x(e){return`${v}${e}${_}`}function w(e){return`${T}${e}${b}`}function W(e){return e.length<=u?e:e.slice(0,u)}function C(e){var o;const n=e.split(".");return n.length<=1?"":((o=n[n.length-1])==null?void 0:o.toLowerCase())??""}function Y(e){if(S.has(e.type.toLowerCase()))return!0;const n=C(e.name);return I.has(n)}function Z(e){let n=e;for(const o of E){const t=w(o.label);n=n.split(t).join(o.label)}return n}function q(e,n){let o=e;for(const t of n){const r=t.insert.trim();if(!r.startsWith("@"))continue;const s=t.label.replace(/\s*\([^)]*\)\s*$/,"").trim(),a=s.startsWith("@")?s:`@${s}`;if(!a||a.toLowerCase()===r.toLowerCase())continue;const c=new RegExp(`(^|\\s)${m(a)}(?=\\s|$)`,"gi");o=o.replace(c,(i,p)=>`${p}${r}`)}return o}function N(e,n){const o=e.toLowerCase(),t=n.toLowerCase().trim();if(!t.startsWith("@"))return 0;let r=0,s=0;for(;s<o.length;){const a=o.indexOf(t,s);if(a===-1)break;const c=a+t.length,i=o[c];(!i||A.test(i))&&(r+=1),s=a+1}return r}function y(e,n){if(n.length===0)return n;const o=new Map;for(const r of n){const s=r.mention.trim().toLowerCase();o.has(s)||o.set(s,N(e,s))}const t=[];for(let r=n.length-1;r>=0;r-=1){const s=n[r],a=s.mention.trim().toLowerCase(),c=o.get(a)??0;c<=0||(t.push(s),o.set(a,c-1))}return t.reverse(),t.length===n.length?n:t}function J(e,n,o){const t=y(e,n),r=t.map(i=>i.catId),s=new Set(t.map(i=>i.mention.trim().toLowerCase())),a=new Set,c=[];for(const i of r)a.has(i)||(a.add(i),c.push(i));for(const i of o){const p=i.insert.trim(),d=i.label.replace(/\s*\([^)]*\)\s*$/,"").trim(),g=d.startsWith("@")?d:`@${d}`,f=[p,g].filter(l=>l.startsWith("@"));f.some(l=>s.has(l.toLowerCase()))||!f.some(l=>new RegExp(`(^|\\s)${m(l)}(?=\\s|$)`,"i").test(e))||a.has(i.id)||(a.add(i.id),c.push(i.id))}return c}function V(e){return e.replace(/\[\[skill:([^\]]+)\]\]/g,(n,o)=>{const t=o.trim();return t?`使用 ${t} 技能`:""})}function ee(e,n){if(!e)return e;if(n.length===0)return e.replace(/使用\s*([^\s,。;、,.!?!?]+)\s*技能/g,(r,s)=>{const a=s.trim();return a?x(a):""});const o=Array.from(new Set(n.map(r=>r.trim()).filter(Boolean))).sort((r,s)=>s.length-r.length);if(o.length===0)return e;let t=e;for(const r of o){const s=new RegExp(`使用\\s*${m(r)}\\s*技能`,"g");t=t.replace(s,x(r))}return t}function te(e){const n=e.displayName.trim(),o=e.mentionPatterns.find(r=>r.replace(/^@/,"").trim().toLowerCase()===n.toLowerCase())??e.mentionPatterns[0];if(!o)return null;const t=o.replace(/^@/,"").trim();return t?`@${t}`:null}function ne(e,n,o=h){const t=[...e];let r=0;for(const s of n){const a=s.name.toLowerCase(),c=t.findIndex(i=>i.name.toLowerCase()===a);if(c>=0){t[c]=s;continue}if(t.length>=o){r+=1;continue}t.push(s)}return{files:t.slice(0,o),dropped:r}}export{k as A,Q as E,F,z as I,h as M,T as Q,H as S,R as T,U,b as a,te as b,v as c,_ as d,K as e,j as f,G as g,Z as h,u as i,Y as j,X as k,$ as l,ne as m,V as n,P as o,W as p,q,ee as r,x as s,y as t,J as u,B as v,D as w,w as x};
|
|
2
|
+
//# sourceMappingURL=helpers-CCilgpNy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers-CCilgpNy.js","sources":["../../src/components/chat-input/utils/constants.ts","../../src/components/chat-input/utils/helpers.ts"],"sourcesContent":["export const ACCEPTED_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/markdown',\n 'text/x-markdown',\n 'text/plain',\n 'text/csv',\n '.png',\n '.jpg',\n '.jpeg',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.xlsm',\n '.xlsb',\n '.ppt',\n '.pptx',\n '.md',\n '.txt',\n '.csv',\n].join(',');\n\nexport const SUPPORTED_ATTACHMENT_MIME_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel.sheet.macroenabled.12',\n 'application/vnd.ms-excel.sheet.binary.macroenabled.12',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/markdown',\n 'text/x-markdown',\n 'text/plain',\n 'text/csv',\n]);\n\nexport const SUPPORTED_ATTACHMENT_EXTENSIONS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'pdf',\n 'doc',\n 'docx',\n 'xls',\n 'xlsx',\n 'xlsm',\n 'xlsb',\n 'ppt',\n 'pptx',\n 'md',\n 'txt',\n 'csv',\n]);\n\nexport const UNSUPPORTED_FILE_TYPE_MESSAGE = '该附件类型暂不支持';\nexport const MAX_FILE_SIZE = 100 * 1024 * 1024;\nexport const MAX_IMAGE_SIZE = 10 * 1024 * 1024;\nexport const FILE_SIZE_EXCEEDED_MESSAGE = '文件大小超过限制,最大支持 100MB';\nexport const IMAGE_SIZE_EXCEEDED_MESSAGE = '图片大小超过限制,最大支持 10MB';\nexport const TEXTAREA_MIN_HEIGHT = 70;\nexport const TEXTAREA_MAX_HEIGHT = 260;\nexport const MAX_INPUT_LENGTH = 5000;\nexport const MAX_ATTACHMENT_FILES = 5;\nexport const MAX_PENDING_QUEUE = 20;\nexport const SKILL_TOKEN_PREFIX = '[[skill:';\nexport const SKILL_TOKEN_SUFFIX = ']]';\nexport const QUICK_ACTION_TOKEN_PREFIX = '[[quick_action:';\nexport const QUICK_ACTION_TOKEN_SUFFIX = ']]';\nexport const QUICK_ACTION_BUTTON_CLASS =\n 'inline-flex shrink-0 items-center gap-1 rounded-[20px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-3 py-1.5 text-sm text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] disabled:cursor-not-allowed disabled:opacity-50';\nexport const QUICK_ACTION_EXPAND_BUTTON_CLASS =\n 'inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-[var(--border-default)] bg-[var(--surface-panel)] text-[var(--text-label-secondary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:text-[var(--text-accent)]';\nexport const QUICK_PROMPT_BUTTON_CLASS =\n 'min-w-0 rounded-[16px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-4 py-2 text-left text-[14px] font-normal leading-[22px] text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)]';\nexport const EXPERT_CARD_BUTTON_CLASS =\n 'group min-w-0 rounded-[16px] border border-[var(--border-default)] bg-[var(--surface-panel)] px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:border-[var(--border-accent)]';\nexport const SKILL_TRIGGER_BUTTON_CLASS =\n 'inline-flex items-center gap-2 rounded-full border border-[var(--border-default)] bg-[var(--surface-panel)] px-3 py-[7px] text-xs text-[var(--text-primary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)]';\nexport const ICON_BUTTON_CLASS =\n 'inline-flex h-8 w-8 items-center justify-center rounded-[8px] text-[var(--text-label-secondary)] transition-colors hover:bg-[var(--overlay-item-hover-bg)] hover:text-[var(--text-accent)] disabled:cursor-not-allowed disabled:opacity-30';","import { QUICK_ACTIONS } from '@/config/quick-actions';\nimport type { AgentData } from '@/hooks/useAgentData';\nimport type { MentionRef } from '@/hooks/useSendMessage';\nimport type { AgentOption } from '../chat-input-options';\nimport {\n MAX_ATTACHMENT_FILES,\n MAX_INPUT_LENGTH,\n QUICK_ACTION_TOKEN_PREFIX,\n QUICK_ACTION_TOKEN_SUFFIX,\n SKILL_TOKEN_PREFIX,\n SKILL_TOKEN_SUFFIX,\n} from './constants';\n\nconst SUPPORTED_ATTACHMENT_MIME_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel.sheet.macroenabled.12',\n 'application/vnd.ms-excel.sheet.binary.macroenabled.12',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/markdown',\n 'text/x-markdown',\n 'text/plain',\n 'text/csv',\n]);\nconst SUPPORTED_ATTACHMENT_EXTENSIONS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'pdf',\n 'doc',\n 'docx',\n 'xls',\n 'xlsx',\n 'xlsm',\n 'xlsb',\n 'ppt',\n 'pptx',\n 'md',\n 'txt',\n 'csv',\n]);\nconst MENTION_END_BOUNDARY_RE = /[\\s,.:;!?()[\\]{}<>,。!?、:;()【】《》「」『』〈〉]/;\n\nexport const escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport function getSkillToken(name: string): string {\n return `${SKILL_TOKEN_PREFIX}${name}${SKILL_TOKEN_SUFFIX}`;\n}\n\nexport function getQuickActionToken(label: string): string {\n return `${QUICK_ACTION_TOKEN_PREFIX}${label}${QUICK_ACTION_TOKEN_SUFFIX}`;\n}\n\nexport function clampInputLength(value: string): string {\n if (value.length <= MAX_INPUT_LENGTH) return value;\n return value.slice(0, MAX_INPUT_LENGTH);\n}\n\nfunction getFileExtension(fileName: string): string {\n const parts = fileName.split('.');\n if (parts.length <= 1) return '';\n return parts[parts.length - 1]?.toLowerCase() ?? '';\n}\n\nexport function isSupportedAttachmentFile(file: File): boolean {\n if (SUPPORTED_ATTACHMENT_MIME_TYPES.has(file.type.toLowerCase())) return true;\n const ext = getFileExtension(file.name);\n return SUPPORTED_ATTACHMENT_EXTENSIONS.has(ext);\n}\n\nexport function normalizeQuickActionsForSend(input: string): string {\n let output = input;\n for (const action of QUICK_ACTIONS) {\n const token = getQuickActionToken(action.label);\n output = output.split(token).join(action.label);\n }\n return output;\n}\n\nexport function normalizeMentionsForSend(input: string, agentOptions: AgentOption[]): string {\n let output = input;\n for (const option of agentOptions) {\n const routeToken = option.insert.trim();\n if (!routeToken.startsWith('@')) continue;\n const displayMentionBase = option.label.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const displayMention = displayMentionBase.startsWith('@') ? displayMentionBase : `@${displayMentionBase}`;\n if (!displayMention || displayMention.toLowerCase() === routeToken.toLowerCase()) continue;\n const displayPattern = new RegExp(`(^|\\\\s)${escapeRegExp(displayMention)}(?=\\\\s|$)`, 'gi');\n output = output.replace(displayPattern, (match, prefix: string) => `${prefix}${routeToken}`);\n }\n return output;\n}\n\nfunction countMentionOccurrences(input: string, mention: string): number {\n const normalizedInput = input.toLowerCase();\n const normalizedMention = mention.toLowerCase().trim();\n if (!normalizedMention.startsWith('@')) return 0;\n\n let count = 0;\n let searchFrom = 0;\n while (searchFrom < normalizedInput.length) {\n const pos = normalizedInput.indexOf(normalizedMention, searchFrom);\n if (pos === -1) break;\n\n const end = pos + normalizedMention.length;\n const charAfter = normalizedInput[end];\n if (!charAfter || MENTION_END_BOUNDARY_RE.test(charAfter)) {\n count += 1;\n }\n searchFrom = pos + 1;\n }\n\n return count;\n}\n\nexport function reconcileMentionRefs(input: string, mentionRefs: MentionRef[]): MentionRef[] {\n if (mentionRefs.length === 0) return mentionRefs;\n\n const remainingByMention = new Map<string, number>();\n for (const ref of mentionRefs) {\n const mention = ref.mention.trim().toLowerCase();\n if (remainingByMention.has(mention)) continue;\n remainingByMention.set(mention, countMentionOccurrences(input, mention));\n }\n\n const kept: MentionRef[] = [];\n for (let index = mentionRefs.length - 1; index >= 0; index -= 1) {\n const ref = mentionRefs[index];\n const mention = ref.mention.trim().toLowerCase();\n const remaining = remainingByMention.get(mention) ?? 0;\n if (remaining <= 0) continue;\n kept.push(ref);\n remainingByMention.set(mention, remaining - 1);\n }\n\n kept.reverse();\n return kept.length === mentionRefs.length ? mentionRefs : kept;\n}\n\nexport function deriveTargetAgentIds(\n input: string,\n mentionRefs: MentionRef[],\n mentionOptions: AgentOption[],\n): string[] {\n const exactRefs = reconcileMentionRefs(input, mentionRefs);\n const exactTargetIds = exactRefs.map((ref) => ref.catId);\n const exactMentions = new Set(exactRefs.map((ref) => ref.mention.trim().toLowerCase()));\n const seen = new Set<string>();\n const ordered: string[] = [];\n\n for (const agentId of exactTargetIds) {\n if (seen.has(agentId)) continue;\n seen.add(agentId);\n ordered.push(agentId);\n }\n\n for (const option of mentionOptions) {\n const routeToken = option.insert.trim();\n const displayTokenBase = option.label.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const displayToken = displayTokenBase.startsWith('@') ? displayTokenBase : `@${displayTokenBase}`;\n const candidates = [routeToken, displayToken].filter((token) => token.startsWith('@'));\n if (candidates.some((token) => exactMentions.has(token.toLowerCase()))) continue;\n const matched = candidates.some((token) => {\n const re = new RegExp(`(^|\\\\s)${escapeRegExp(token)}(?=\\\\s|$)`, 'i');\n return re.test(input);\n });\n if (!matched || seen.has(option.id)) continue;\n seen.add(option.id);\n ordered.push(option.id);\n }\n\n return ordered;\n}\n\nexport function normalizeSkillsForSend(input: string): string {\n return input.replace(/\\[\\[skill:([^\\]]+)\\]\\]/g, (_match, rawName: string) => {\n const name = rawName.trim();\n return name ? `使用 ${name} 技能` : '';\n });\n}\n\nexport function restoreSkillTokensFromSendText(input: string, skillNames: string[]): string {\n if (!input) return input;\n if (skillNames.length === 0) {\n return input.replace(/使用\\s*([^\\s,。;、,.!?!?]+)\\s*技能/g, (_match, rawName: string) => {\n const name = rawName.trim();\n return name ? getSkillToken(name) : '';\n });\n }\n const normalizedNames = Array.from(new Set(skillNames.map((name) => name.trim()).filter(Boolean))).sort(\n (a, b) => b.length - a.length,\n );\n if (normalizedNames.length === 0) return input;\n let output = input;\n for (const name of normalizedNames) {\n const pattern = new RegExp(`使用\\\\s*${escapeRegExp(name)}\\\\s*技能`, 'g');\n output = output.replace(pattern, getSkillToken(name));\n }\n return output;\n}\n\ntype MentionTargetLike = Pick<AgentData, 'displayName' | 'mentionPatterns'>;\n\nexport function buildResolvedMention(agent: MentionTargetLike): string | null {\n const displayName = agent.displayName.trim();\n const preferredPattern =\n agent.mentionPatterns.find(\n (pattern) => pattern.replace(/^@/, '').trim().toLowerCase() === displayName.toLowerCase(),\n ) ?? agent.mentionPatterns[0];\n if (!preferredPattern) return null;\n const alias = preferredPattern.replace(/^@/, '').trim();\n return alias ? `@${alias}` : null;\n}\n\nexport function stripExpertCardMentionPrefix(content: string, displayNames: string[]): string {\n const displayPrefix = displayNames.map((name) => `@${name}`).join('');\n if (displayPrefix && content.startsWith(displayPrefix)) {\n return content\n .slice(displayPrefix.length)\n .replace(/^[,,]\\s*/, '')\n .trimStart();\n }\n return content.replace(/^(?:@[^@\\s,,]+)+[,,]?\\s*/, '').trimStart();\n}\n\nexport function getSkillInitial(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return '?';\n const [initial] = Array.from(trimmed);\n return /[a-z]/i.test(initial) ? initial.toUpperCase() : initial;\n}\n\nexport function mergeFilesByName(\n prev: File[],\n incoming: File[],\n maxCount = MAX_ATTACHMENT_FILES,\n): { files: File[]; dropped: number } {\n const next = [...prev];\n let dropped = 0;\n for (const file of incoming) {\n const normalizedName = file.name.toLowerCase();\n const existingIndex = next.findIndex((item) => item.name.toLowerCase() === normalizedName);\n if (existingIndex >= 0) {\n next[existingIndex] = file;\n continue;\n }\n if (next.length >= maxCount) {\n dropped += 1;\n continue;\n }\n next.push(file);\n }\n return { files: next.slice(0, maxCount), dropped };\n}\n"],"names":["ACCEPTED_TYPES","UNSUPPORTED_FILE_TYPE_MESSAGE","MAX_FILE_SIZE","MAX_IMAGE_SIZE","FILE_SIZE_EXCEEDED_MESSAGE","IMAGE_SIZE_EXCEEDED_MESSAGE","TEXTAREA_MIN_HEIGHT","TEXTAREA_MAX_HEIGHT","MAX_INPUT_LENGTH","MAX_ATTACHMENT_FILES","MAX_PENDING_QUEUE","SKILL_TOKEN_PREFIX","SKILL_TOKEN_SUFFIX","QUICK_ACTION_TOKEN_PREFIX","QUICK_ACTION_TOKEN_SUFFIX","QUICK_ACTION_BUTTON_CLASS","QUICK_ACTION_EXPAND_BUTTON_CLASS","QUICK_PROMPT_BUTTON_CLASS","EXPERT_CARD_BUTTON_CLASS","SKILL_TRIGGER_BUTTON_CLASS","ICON_BUTTON_CLASS","SUPPORTED_ATTACHMENT_MIME_TYPES","SUPPORTED_ATTACHMENT_EXTENSIONS","MENTION_END_BOUNDARY_RE","escapeRegExp","value","getSkillToken","name","getQuickActionToken","label","clampInputLength","getFileExtension","fileName","parts","_a","isSupportedAttachmentFile","file","ext","normalizeQuickActionsForSend","input","output","action","QUICK_ACTIONS","token","normalizeMentionsForSend","agentOptions","option","routeToken","displayMentionBase","displayMention","displayPattern","match","prefix","countMentionOccurrences","mention","normalizedInput","normalizedMention","count","searchFrom","pos","end","charAfter","reconcileMentionRefs","mentionRefs","remainingByMention","ref","kept","index","remaining","deriveTargetAgentIds","mentionOptions","exactRefs","exactTargetIds","exactMentions","seen","ordered","agentId","displayTokenBase","displayToken","candidates","normalizeSkillsForSend","_match","rawName","restoreSkillTokensFromSendText","skillNames","normalizedNames","a","b","pattern","buildResolvedMention","agent","displayName","preferredPattern","alias","mergeFilesByName","prev","incoming","maxCount","next","dropped","normalizedName","existingIndex","item"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as s}from"./OverflowTooltip-CE5PjAb-.js";async function d(o){const e=await new Promise((t,i)=>{const a=new FileReader;a.onload=()=>t(String(a.result??"")),a.onerror=()=>i(new Error("头像读取失败")),a.readAsDataURL(o)}),r=await s("/api/uploads/images/from-data-url",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataUrl:e})});if(!r.ok){const t=await r.json().catch(()=>({}));throw new Error(t.error??`头像上传失败 (${r.status})`)}const n=await r.json();if(!n.url)throw new Error("头像上传失败");return n.url}function u(o){return[o.loadingProfiles?"账号配置加载中…":null,o.loadingStrategy?"Session 策略加载中…":null,o.loadingCodexSettings?"Codex 参数加载中…":null].filter(Boolean).join(" · ")}export{u as b,d as u};
|
|
2
|
+
//# sourceMappingURL=hub-agent-editor.client-2DmCRGuY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-agent-editor.client-2DmCRGuY.js","sources":["../../src/components/hub-agent-editor.client.ts"],"sourcesContent":["/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { apiFetch } from '@/utils/api-client';\n\nexport async function uploadAvatarAsset(file: File): Promise<string> {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(new Error('头像读取失败'));\n reader.readAsDataURL(file);\n });\n\n const res = await apiFetch('/api/uploads/images/from-data-url', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ dataUrl }),\n });\n if (!res.ok) {\n const payload = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error((payload.error as string) ?? `头像上传失败 (${res.status})`);\n }\n const payload = (await res.json()) as { url?: string };\n if (!payload.url) throw new Error('头像上传失败');\n return payload.url;\n}\n\nexport function buildEditorLoadingNote(flags: {\n loadingProfiles: boolean;\n loadingStrategy: boolean;\n loadingCodexSettings: boolean;\n}): string {\n return [\n flags.loadingProfiles ? '账号配置加载中…' : null,\n flags.loadingStrategy ? 'Session 策略加载中…' : null,\n flags.loadingCodexSettings ? 'Codex 参数加载中…' : null,\n ]\n .filter(Boolean)\n .join(' · ');\n}\n"],"names":["uploadAvatarAsset","file","dataUrl","resolve","reject","reader","res","apiFetch","payload","buildEditorLoadingNote","flags"],"mappings":"kDAUA,eAAsBA,EAAkBC,EAA6B,CACnE,MAAMC,EAAU,MAAM,IAAI,QAAgB,CAACC,EAASC,IAAW,CAC7D,MAAMC,EAAS,IAAI,WACnBA,EAAO,OAAS,IAAMF,EAAQ,OAAOE,EAAO,QAAU,EAAE,CAAC,EACzDA,EAAO,QAAU,IAAMD,EAAO,IAAI,MAAM,QAAQ,CAAC,EACjDC,EAAO,cAAcJ,CAAI,CAC3B,CAAC,EAEKK,EAAM,MAAMC,EAAS,oCAAqC,CAC9D,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CAAE,QAAAL,EAAS,CAAA,CACjC,EACD,GAAI,CAACI,EAAI,GAAI,CACX,MAAME,EAAW,MAAMF,EAAI,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EAClD,MAAM,IAAI,MAAOE,EAAQ,OAAoB,WAAWF,EAAI,MAAM,GAAG,CACvE,CACA,MAAME,EAAW,MAAMF,EAAI,KAAA,EAC3B,GAAI,CAACE,EAAQ,IAAK,MAAM,IAAI,MAAM,QAAQ,EAC1C,OAAOA,EAAQ,GACjB,CAEO,SAASC,EAAuBC,EAI5B,CACT,MAAO,CACLA,EAAM,gBAAkB,WAAa,KACrCA,EAAM,gBAAkB,iBAAmB,KAC3CA,EAAM,qBAAuB,eAAiB,IAAA,EAE7C,OAAO,OAAO,EACd,KAAK,KAAK,CACf"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as b,j as l,E as R}from"./index-Cb4fQgom.js";import{Q as O}from"./quick-actions-DzZE-zyP.js";import{g as F}from"./usePromptBlocks-5sz8Qh51.js";import{a as L,b as $,d as B,e as W}from"./useAgentData-D-k9cXfg.js";import{c as D}from"./OverflowTooltip-CE5PjAb-.js";import{g as U,f as H}from"./skill-options-cache-D1BJGTCU.js";import{M as q,r as G,a as X}from"./index-DQ2vVjmV.js";const I=/<!--\s*artifact:pptx-pages\s+([^\s>]+)(?:\s+count:(\d+))?\s*-->/gi;function K(e){return e.replace(new RegExp(I.source,"gi"),"")}function z(e,t,n){if(!e)return;const o=new RegExp(I.source,"gi");let r;for(;(r=o.exec(e))!==null;){if(!r[1])continue;const i=r[1];if(n.has(i))continue;n.add(i);const s=r[2]?parseInt(r[2],10):void 0;t.push({pagesDir:i,expectedSlideCount:Number.isNaN(s??NaN)?void 0:s})}}function We(e){const t=e.flatMap(r=>[r.content,r.detail,r.label]).filter(Boolean),n=[],o=new Set;for(const r of t)z(r,n,o);return n}const V=/page-(\d+)\.pptx\.html$/i;function J(e){if(!e)return"";const t=e.indexOf("→");if(t>=0)return e.slice(t+1).trim();const n=e.indexOf("←");return n>=0?e.slice(n+1).trim():e.trim().split(/\s+/)[0]??""}const Y=new Set(["write","write_file","edit","edit_file","editor_file","str_replace","search_replace"]);function Z(e){return J(e).trim().toLowerCase().replace(/\s+/g,"_").replace(/-/g,"_")}function Q(e){const t=Z(e);return Y.has(t)}function ee(e){if(!(e!=null&&e.trim()))return null;const t=/"file_path"\s*:\s*"((?:\\.|[^"\\])*)"/.exec(e);if(t!=null&&t[1])return{file_path:t[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\")};const n=/'file_path'\s*:\s*'((?:\\.|[^'\\])*)'/.exec(e);if(n!=null&&n[1])return{file_path:n[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\")};try{const o=JSON.parse(e);if(o&&typeof o=="object"&&!Array.isArray(o)){const r=o,i=r.file_path??r.path??r.filePath;if(typeof i=="string"&&i.trim())return{file_path:i.trim()};const s=r.toolInput;if(s&&typeof s=="object"&&!Array.isArray(s)){const a=s,u=a.file_path??a.path??a.filePath;if(typeof u=="string"&&u.trim())return{file_path:u.trim()}}}}catch{}return null}function te(e){const t=e.lastIndexOf("/pages/");if(t>=0)return e.slice(0,t+6);const n=e.lastIndexOf("/");return n>=0?e.slice(0,n):e}function ne(e){if(e.kind!=="tool_use"&&e.kind!=="tool_result"||!Q(e.label))return null;const t=ee(e.detail);if(!(t!=null&&t.file_path))return null;const n=t.file_path.replace(/\\/g,"/"),o=V.exec(n);if(!o)return null;const r=parseInt(o[1],10);if(!Number.isFinite(r)||r<1)return null;const i=te(n);return{filePath:t.file_path,pageNumber:r,pagesDir:i}}function De(e){const t=new Map;for(const o of e){const r=ne(o);if(!r)continue;const i=t.get(r.pagesDir)??new Map;i.set(r.pageNumber,{...r,lastTouchedAt:o.timestamp}),t.set(r.pagesDir,i)}const n=[];for(const[o,r]of t.entries()){const i=[...r.values()].sort((s,a)=>s.pageNumber-a.pageNumber);n.push({pagesDir:o,htmlFiles:i.map(s=>({filePath:s.filePath,pageNumber:s.pageNumber,lastTouchedAt:s.lastTouchedAt}))})}return n}const _=D("NEXT_PUBLIC_PROJECT_ROOT")??"",M="/files/inspiration-upload/";function re(e,t){return l.jsxs("span",{className:"inline-flex max-w-full translate-y-[-1px] items-center gap-1 rounded px-1 py-[1px] align-middle text-[rgba(20,118,255,1)]","data-skill-token":"true",children:[l.jsx("span",{"aria-hidden":"true",className:"inline-block h-3.5 w-3.5 shrink-0",style:{backgroundColor:"currentColor",maskImage:"url('/icons/menu/skills.svg')",maskRepeat:"no-repeat",maskPosition:"center",maskSize:"contain",WebkitMaskImage:"url('/icons/menu/skills.svg')",WebkitMaskRepeat:"no-repeat",WebkitMaskPosition:"center",WebkitMaskSize:"contain"}}),l.jsx("span",{className:"truncate",children:e})]},t)}const E=O.filter(e=>e.show!==!1),oe=[...E].sort((e,t)=>t.label.length-e.label.length);function se(e,t){const n=E.find(o=>o.label===e);return l.jsxs("span",{className:"inline-flex max-w-full items-center gap-1 rounded-full border px-[8px] py-[3px] align-middle text-[14px] font-normal leading-[22px] text-[#191919]",style:{borderColor:"rgba(20,118,255,0.8)",backgroundColor:"#eff6ff"},"data-quick-action-token":"true",children:[n!=null&&n.icon?l.jsx("img",{src:n.icon,alt:"","aria-hidden":"true",className:"h-4 w-4 shrink-0"}):null,l.jsx("span",{className:"truncate",children:e})]},t)}function A(e,t,n,o,r){if(!t)return;if(!r){e.push(t);return}const i=new Set(o.map(u=>u.trim().toLowerCase()).filter(Boolean));let s=0,a=0;for(;s<t.length;){const u=t.slice(s),m=/^(使用\s+)([^\n,。!?,.!?]{1,60}?)(\s+技能)/.exec(u);if(m){const d=m[0]??"",h=(m[2]??"").trim();if(h&&i.has(h.toLowerCase())){s>a&&e.push(t.slice(a,s)),e.push(re(h,`${n}-phrase-${s}`)),s+=d.length,a=s;continue}}let p=null;for(const d of oe){const h=d.label;if(!h||!t.startsWith(h,s))continue;const f=s>0?t[s-1]:" ",P=s+h.length<t.length?t[s+h.length]:" ";if(/\s/.test(f)&&/\s/.test(P)){p=h;break}}if(p){s>a&&e.push(t.slice(a,s)),e.push(se(p,`${n}-qa${s}`)),s+=p.length,a=s;continue}s+=1}a<t.length&&e.push(t.slice(a))}function T(e,t,n){const o=[];let r=0,i;const s=L(),a=$(),u=B(),m=W();for(s.lastIndex=0;(i=s.exec(e))!==null;){i.index>r&&A(o,e.slice(r,i.index),`p${i.index}`,t,n);const p=a[i[1].toLowerCase()]??"opus";u[p];const d=m[i[1].toLowerCase()]??i[0];o.push(l.jsx("span",{className:"user-question-mention",style:{color:"rgb(20, 118, 255)",borderRadius:4,padding:"1px 5px"},children:d},`m${i.index}`)),r=s.lastIndex}return r<e.length&&A(o,e.slice(r),`tail${r}`,t,n),o}function x(e,t,n){return b.Children.map(e,o=>typeof o=="string"?T(o,t,n):o)}function ie({children:e}){const[t,n]=b.useState(!1),o=b.useRef(),r=b.useRef(null),i=b.useCallback(()=>{var a;const s=((a=r.current)==null?void 0:a.textContent)??"";navigator.clipboard.writeText(s),n(!0),clearTimeout(o.current),o.current=setTimeout(()=>n(!1),1500)},[]);return l.jsxs("div",{className:"relative group my-2",children:[l.jsx("button",{onClick:i,className:"absolute top-2 right-2 z-10 px-1.5 py-0.5 rounded text-[10px] bg-gray-700 text-gray-300 md:opacity-0 md:group-hover:opacity-100 hover:bg-gray-600 transition-opacity",children:t?"已复制":"复制"}),l.jsx("pre",{ref:r,className:"bg-gray-900 text-gray-100 rounded-lg p-3 overflow-x-auto text-xs leading-5 font-mono [&>code]:bg-transparent [&>code]:p-0 [&>code]:text-inherit [&>code]:text-xs",children:e})]})}const le=/(?:^|\s)`?((?:\/[\w.@-]+)+(?:\.[\w]+)(?::(\d+))?)(?:`?)/g,ae=/(?:^|\s)`?((?:packages|src|docs|tests?)\/[\w./@-]+(?:\.[\w]+)(?::(\d+))?)(?:`?)/g,ce=/`?(\/files\/inspiration-upload\/[\w.@-]+(?:\.[\w]+))`?/g,ue=/`?((?:\/[^/\s`,。!?、:;,]+)*\/upload\/[^`,。!?、:;,\n]+\.[A-Za-z0-9]{1,8})`?/g,de=/^\s*\[wt:([a-zA-Z0-9_/-]+)\]/;function pe(e){let t="";if(e.startsWith(M))t=e.slice(M.length);else{const n="/upload/",o=e.lastIndexOf(n);if(o<0)return null;t=e.slice(o+n.length)}return!t||t.includes("/")?null:t.replace(/^\d+_/,"")||t}function me(e,t){return l.jsxs("span",{className:"inline-flex translate-y-[-1px] items-center gap-[2px] align-middle leading-none whitespace-pre-wrap break-words [overflow-wrap:anywhere]",style:{color:"rgba(20, 118, 255, 1)"},"data-inspiration-file-token":"true",title:e,children:[l.jsx("span",{"aria-hidden":"true",className:"inline-flex items-center justify-center w-[1em] h-[1em] flex-shrink-0",children:l.jsx("img",{src:F(e),alt:"",className:"w-[1em] h-[1em]"})}),l.jsx("span",{className:"inline-block",style:{wordBreak:"break-word"},children:e})]},t)}function he(e){var i;const t=[];let n=0;const o=new RegExp(`${ue.source}|${ce.source}|${le.source}|${ae.source}`,"g");let r;for(o.lastIndex=0;(r=o.exec(e))!==null;){const s=r[0],a=((i=s.match(/^\s/))==null?void 0:i[0])??"",u=r[1]??r[2]??r[3]??r[5],m=r[4]??r[6];if(!u)continue;const p=r.index+a.length;p>n&&t.push(e.slice(n,p));const d=pe(u);if(d){t.push(me(d,`ifp${r.index}`)),n=r.index+s.length;continue}const f=e.slice(r.index+s.length).match(de);f==null||f[1];const P=u,C=u.startsWith("/"),g=u.split(":")[0],y=C?g:_?`${_}/${g}`:null,v=y?`vscode://file${y}${m?`:${m}`:""}`:null;t.push(v?l.jsx(fe,{display:P,href:v},`fp${r.index}`):l.jsx("span",{className:"text-blue-400 font-mono text-[0.85em]",children:P},`fp${r.index}`)),f?(n=r.index+s.length+f[0].length,o.lastIndex=n):n=r.index+s.length}return n<e.length&&t.push(e.slice(n)),t.length>0?t:[e]}function fe({display:e,href:t}){return l.jsx("a",{href:t,className:"text-blue-400 hover:text-blue-300 hover:underline font-mono text-[0.85em] cursor-pointer",title:`打开本地编辑器
|
|
2
|
+
${e}`,children:e})}function xe(e,t,n){return b.Children.map(e,o=>{if(typeof o!="string")return o;const r=he(o);return l.jsx(l.Fragment,{children:r.map((i,s)=>typeof i=="string"?l.jsx("span",{children:T(i,t,n)},s):i)})})}function be(e,t){return{p:({children:n})=>l.jsx("p",{className:"mb-2 last:mb-0 leading-relaxed",children:xe(n,e,t)}),strong:({children:n})=>l.jsx("strong",{className:"font-semibold",children:x(n,e,t)}),em:({children:n})=>l.jsx("em",{children:x(n,e,t)}),del:({children:n})=>l.jsx("del",{className:"opacity-60",children:x(n,e,t)}),h1:({children:n})=>l.jsx("h1",{className:"text-lg font-bold mb-2 mt-3 first:mt-0",children:x(n,e,t)}),h2:({children:n})=>l.jsx("h2",{className:"text-base font-bold mb-2 mt-3 first:mt-0",children:x(n,e,t)}),h3:({children:n})=>l.jsx("h3",{className:"text-sm font-bold mb-1 mt-2 first:mt-0",children:x(n,e,t)}),ul:({children:n})=>l.jsx("ul",{className:"list-disc pl-6 mb-2 space-y-0.5",children:n}),ol:({children:n})=>l.jsx("ol",{className:"list-decimal pl-10 mb-2 space-y-0.5 marker:[font-variant-numeric:tabular-nums]",children:n}),li:({children:n})=>l.jsx("li",{className:"pl-1",children:x(n,e,t)}),blockquote:({children:n})=>l.jsx("blockquote",{className:"border-l-[3px] border-gray-300 pl-3 my-2 italic opacity-80",children:n}),a:({href:n,children:o})=>l.jsx("a",{href:n,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline break-all",children:x(o,e,t)}),hr:()=>l.jsx("hr",{className:"my-3 border-gray-200"}),pre:({children:n})=>l.jsx(ie,{children:n}),code:({className:n,children:o})=>l.jsx("code",{className:`${n??""} bg-gray-200/50 rounded px-1 py-0.5 text-[0.85em] font-mono`,children:o}),table:({children:n})=>l.jsx("div",{className:"overflow-x-auto my-2",children:l.jsx("table",{className:"min-w-full text-sm border-collapse",children:n})}),thead:({children:n})=>l.jsx("thead",{className:"bg-gray-50",children:n}),th:({children:n})=>l.jsx("th",{className:"border border-gray-300 px-2 py-1 text-left font-semibold text-xs",children:x(n,e,t)}),td:({children:n})=>l.jsx("td",{className:"border border-gray-300 px-2 py-1",children:x(n,e,t)})}}function Pe(e){return!e||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("/")?!1:/\.mdx?(?:#|$)/.test(e)}function ye(e,t){const n=t.split("#")[0],o=e?e.split("/"):[];for(const r of n.split("/"))r===".."?o.pop():r!=="."&&o.push(r);return o.join("/")}function Ue({content:e,className:t,disableCommandPrefix:n,basePath:o,enableSkillAndQuickActionTokens:r=!1}){const[i,s]=b.useState(()=>(U()??[]).map(d=>d.name));b.useEffect(()=>{let d=!0;return H().then(h=>{d&&s(h.map(f=>f.name))}),()=>{d=!1}},[]);const a=n?null:/^(\/\w+)/.exec(e),u=a?e.slice(a[1].length):e,m=b.useMemo(()=>K(u),[u]),p=b.useMemo(()=>{const d=be(i,r);return o!=null?{...d,a:ge(o,i,r)}:d},[o,i,r]);return l.jsxs("div",{className:`markdown-content font-sans break-words ${t??""}`,style:{fontFamily:'"Noto Sans SC", "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif'},children:[a&&l.jsx("span",{className:"text-indigo-500",children:a[1]}),l.jsx(q,{remarkPlugins:[[G,{singleTilde:!1}],X],components:p,children:m})]})}function ge(e,t,n){return function({href:r,children:i}){if(Pe(r)){const s=ye(e,r);return l.jsx("span",{className:"text-gray-500 break-all",title:`历史 workspace 文档链接已下线: ${s}`,children:x(i,t,n)})}return l.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline break-all",children:x(i,t,n)})}}const He=[{value:"anthropic",label:"Claude"},{value:"openai",label:"Codex"},{value:"google",label:"Gemini"},{value:"dare",label:"Office Agent"},{value:"opencode",label:"OpenCode"},{value:"relayclaw",label:"Assistant Agent"},{value:"acp",label:"ACP"},{value:"antigravity",label:"Antigravity"}],qe=[{value:"true",label:"true"},{value:"false",label:"false"}],Ge=[{value:"handoff",label:"handoff"},{value:"compress",label:"compress"},{value:"hybrid",label:"hybrid"}],Xe=[{value:"read-only",label:"read-only"},{value:"workspace-write",label:"workspace-write"},{value:"danger-full-access",label:"danger-full-access"}],Ke=[{value:"untrusted",label:"untrusted"},{value:"on-failure",label:"on-failure"},{value:"on-request",label:"on-request"},{value:"never",label:"never"}],ze=[{value:"oauth",label:"oauth"},{value:"api_key",label:"api_key"},{value:"auto",label:"auto"}],ve=". --remote-debugging-port=9000",Ce="huawei-maas";function Ve(e){return e?e.embeddedRuntimeKind==="agentteams_acp"||R({id:e.id,provider:e.provider,source:e.source})==="agentteams_acp":!1}function Ne(e){return e.split(/[\n,]+/).map(t=>t.trim()).filter(Boolean)}function S(e){const t=e.trim();return t?t.startsWith("@")?t:`@${t}`:""}function we(e){return S(e)}function _e(e){return e.join(", ")}function w(e){const t=e.trim();if(!t)return[];const n=[];let o="",r=null,i=!1;const s=()=>{o.length!==0&&(n.push(o),o="")};for(const a of t){if(i){o+=a,i=!1;continue}if(a==="\\"){i=!0;continue}if(r){a===r?r=null:o+=a;continue}if(a==='"'||a==="'"){r=a;continue}if(/\s/.test(a)){s();continue}o+=a}return i&&(o+="\\"),s(),n}function Me(e){return e.split(/[\n,]+/).map(t=>t.trim()).filter(Boolean)}function j(e){return e==="anthropic"||e==="openai"||e==="google"||e==="dare"||e==="opencode"}function Ae(e){return e.source==="model_config"}function Ie(e){if(e.client)return e.client;if(e.oauthLikeClient==="dare"||e.oauthLikeClient==="opencode")return e.oauthLikeClient;const t=`${e.id} ${e.provider??""} ${e.displayName} ${e.name}`.toLowerCase();if(t.includes("claude"))return"anthropic";if(t.includes("codex"))return"openai";if(t.includes("gemini"))return"google";if(t.includes("dare"))return"dare";if(t.includes("opencode"))return"opencode";switch(e.protocol){case"anthropic":return"anthropic";case"openai":return"openai";case"google":return"google";default:return}}function Je(e){if(!j(e))return null;switch(e){case"anthropic":return"claude";case"openai":return"codex";case"google":return"gemini";case"dare":return"dare";case"opencode":return"opencode"}}function Ye(e,t,n){if(n!=null&&n.embeddedAcpRuntime)return t.filter(s=>s.source==="model_config"?s.protocol==="openai"||s.protocol==="huawei_maas":s.kind!=="acp"&&s.authType==="api_key"&&s.protocol==="openai");if(e==="acp")return t.filter(s=>s.kind==="acp");const o=t.filter(Ae);if(o.length>0)return e!=="dare"&&e!=="relayclaw"?[]:o.filter(s=>s.id===Ce&&s.protocol==="huawei_maas"?!0:s.protocol==="openai");if(e==="relayclaw")return t.filter(s=>s.authType==="api_key"&&s.protocol==="openai");if(!j(e))return[];const r=t.filter(s=>s.authType!=="api_key"&&Ie(s)===e);if(e==="google")return r;const i=t.filter(s=>s.authType==="api_key");return[...r,...i.filter(s=>!r.includes(s))]}function Ze(e,t){var s,a,u;const n=e?null:t,o=(e==null?void 0:e.id)??"",r=(e==null?void 0:e.mentionPatterns)??(o?[we(o)]:[]),i=e==null?void 0:e.embeddedAcpConfig;return{agentId:o,name:(e==null?void 0:e.name)??(e==null?void 0:e.displayName)??"",displayName:(e==null?void 0:e.displayName)??(e==null?void 0:e.name)??"",nickname:(e==null?void 0:e.nickname)??"",avatar:(e==null?void 0:e.avatar)??"",colorPrimary:(e==null?void 0:e.color.primary)??"#9B7EBD",colorSecondary:(e==null?void 0:e.color.secondary)??"#E8DFF5",mentionPatterns:_e(r),roleDescription:(e==null?void 0:e.roleDescription)??"",personality:(e==null?void 0:e.personality)??"",teamStrengths:(e==null?void 0:e.teamStrengths)??"",caution:(e==null?void 0:e.caution)??"",strengths:((s=e==null?void 0:e.strengths)==null?void 0:s.join(", "))??"",client:(e==null?void 0:e.provider)??(n==null?void 0:n.client)??"anthropic",accountRef:(e==null?void 0:e.accountRef)??(e==null?void 0:e.providerProfileId)??(n==null?void 0:n.accountRef)??(n==null?void 0:n.providerProfileId)??"",defaultModel:(e==null?void 0:e.defaultModel)??(n==null?void 0:n.defaultModel)??"",imageModel:(e==null?void 0:e.imageModel)??void 0,imageAccountRef:(e==null?void 0:e.imageAccountRef)??void 0,commandArgs:((a=e==null?void 0:e.commandArgs)==null?void 0:a.join(" "))??(n==null?void 0:n.commandArgs)??"",cliConfigArgs:[...(e==null?void 0:e.cliConfigArgs)??[]],ocProviderName:(e==null?void 0:e.ocProviderName)??"",embeddedAcpExecutablePath:(i==null?void 0:i.executablePath)??(e==null?void 0:e.embeddedAcpExecutablePath)??"",embeddedAcpArgs:((u=i==null?void 0:i.args)==null?void 0:u.join(" "))??"",embeddedAcpCwd:(i==null?void 0:i.cwd)??"",embeddedAcpEnvText:i!=null&&i.env?Object.entries(i.env).map(([m,p])=>`${m}=${p}`).join(`
|
|
3
|
+
`):"",sessionChain:String((e==null?void 0:e.sessionChain)??!0),maxPromptTokens:e!=null&&e.contextBudget?String(e.contextBudget.maxPromptTokens):"",maxContextTokens:e!=null&&e.contextBudget?String(e.contextBudget.maxContextTokens):"",maxMessages:e!=null&&e.contextBudget?String(e.contextBudget.maxMessages):"",maxContentLengthPerMsg:e!=null&&e.contextBudget?String(e.contextBudget.maxContentLengthPerMsg):""}}function Qe(e){var t;return{strategy:e.effective.strategy,warnThreshold:String(e.effective.thresholds.warn),actionThreshold:String(e.effective.thresholds.action),maxCompressions:String(((t=e.effective.hybrid)==null?void 0:t.maxCompressions)??2),hybridCapable:e.hybridCapable,sessionChainEnabled:e.sessionChainEnabled}}function et(e){const t=Number.parseFloat(e.warnThreshold),n=Number.parseFloat(e.actionThreshold);if(!Number.isFinite(t)||!Number.isFinite(n))throw new Error("Session 阈值必须是数字");if(t>=n)throw new Error("Warn Threshold 必须小于 Action Threshold");const o={strategy:e.strategy,thresholds:{warn:t,action:n}};if(e.strategy==="hybrid"){const r=Number.parseInt(e.maxCompressions,10);if(!Number.isFinite(r)||r<=0)throw new Error("Max Compressions 必须是正整数");o.hybrid={maxCompressions:r}}return o}function tt(e){var t,n,o;return{sandboxMode:((t=e==null?void 0:e.cli)==null?void 0:t.codexSandboxMode)??"workspace-write",approvalPolicy:((n=e==null?void 0:e.cli)==null?void 0:n.codexApprovalPolicy)??"on-request",authMode:((o=e==null?void 0:e.codexExecution)==null?void 0:o.authMode)??"oauth"}}function nt(e,t){const n=[];return e.sandboxMode!==t.sandboxMode&&n.push({key:"cli.codexSandboxMode",value:e.sandboxMode}),e.approvalPolicy!==t.approvalPolicy&&n.push({key:"cli.codexApprovalPolicy",value:e.approvalPolicy}),e.authMode!==t.authMode&&n.push({key:"codex.execution.authMode",value:e.authMode}),n}function Ee(e){const t=e.split(/\r?\n/),n=[];for(const o of t){const r=o.trim();if(!r)continue;const i=r.indexOf("="),s=(i===-1?r:r.slice(0,i)).trim();if(!s)continue;const a=i===-1?"":r.slice(i+1);n.push([s,a])}if(n.length!==0)return Object.fromEntries(n)}function Te(e){return e==="anthropic"||e==="openai"||e==="google"||e==="opencode"||e==="acp"}function c(e){return typeof e=="string"?e.trim():""}function Se(e){return c(e.accountRef??e.providerProfileId)}function je(e){const t=[e.maxPromptTokens,e.maxContextTokens,e.maxMessages,e.maxContentLengthPerMsg].map(r=>r.trim()),n=t.filter(r=>r.length>0).length;if(n===0)return;if(n!==t.length)throw new Error("上下文预算要么全部留空,要么 4 项都填写");const o=t.map(r=>Number.parseInt(r,10));if(o.some(r=>!Number.isFinite(r)||r<=0))throw new Error("上下文预算必须是正整数");return{maxPromptTokens:o[0],maxContextTokens:o[1],maxMessages:o[2],maxContentLengthPerMsg:o[3]}}function rt(e,t){const n=je(e),o=!!(t!=null&&t.contextBudget),r=n!==void 0?{contextBudget:n}:t&&o?{contextBudget:null}:{},i=c(e.name),s=c(e.displayName)||i,a=i||s,u=i||s||(t==null?void 0:t.name)||(t==null?void 0:t.displayName)||"",m=Se(e),p=m.length>0?{accountRef:m}:t!=null&&t.accountRef||t!=null&&t.providerProfileId?{accountRef:null}:{},d=t&&e.client!==t.provider?{mcpSupport:Te(e.client)}:{},h=Ee(e.embeddedAcpEnvText??""),f={...c(e.embeddedAcpExecutablePath)?{executablePath:c(e.embeddedAcpExecutablePath)}:{},...w(e.embeddedAcpArgs??"").length>0?{args:w(e.embeddedAcpArgs??"")}:{},...c(e.embeddedAcpCwd)?{cwd:c(e.embeddedAcpCwd)}:{},...h?{env:h}:{}},P=Object.keys(f).length>0,C=c(e.embeddedAcpExecutablePath)?{embeddedAcpExecutablePath:c(e.embeddedAcpExecutablePath)}:t!=null&&t.embeddedAcpExecutablePath?{embeddedAcpExecutablePath:null}:{},g=P?{embeddedAcpConfig:f}:t!=null&&t.embeddedAcpConfig?{embeddedAcpConfig:null}:{},y={displayName:s,nickname:c(e.nickname),avatar:c(e.avatar),color:{primary:c(e.colorPrimary),secondary:c(e.colorSecondary)},mentionPatterns:Array.from(new Set(Ne(e.mentionPatterns).map(S).filter(Boolean))),roleDescription:c(e.roleDescription),personality:c(e.personality),teamStrengths:c(e.teamStrengths),caution:c(e.caution)||null,strengths:Me(e.strengths),sessionChain:e.sessionChain==="true",...e.creationSource?{creationSource:e.creationSource}:{},...r};if(e.client==="antigravity"){const N=c(e.commandArgs)||ve;return{...y,...t?{name:u}:{agentId:c(e.agentId),name:a},client:"antigravity",...p,...d,defaultModel:c(e.defaultModel),commandArgs:w(N)}}const v=c(e.imageModel).length>0?{imageModel:c(e.imageModel)}:t!=null&&t.imageModel?{imageModel:null}:{},k=c(e.imageAccountRef).length>0?{imageAccountRef:c(e.imageAccountRef)}:t!=null&&t.imageAccountRef?{imageAccountRef:null}:{};return{...y,...t?{name:u}:{agentId:c(e.agentId),name:a},client:e.client,...p,...d,...C,...g,...v,...k,defaultModel:c(e.defaultModel),cliConfigArgs:(e.cliConfigArgs??[]).filter(N=>N.trim().length>0),...c(e.ocProviderName)?{ocProviderName:c(e.ocProviderName)}:t!=null&&t.ocProviderName?{ocProviderName:null}:{}}}export{He as C,ve as D,Ue as M,qe as S,We as a,rt as b,Ne as c,Ge as d,De as e,Xe as f,Ke as g,ze as h,Ze as i,_e as j,Ve as k,Ye as l,tt as m,S as n,Je as o,Ee as p,et as q,nt as r,Me as s,Qe as t,w as u};
|
|
4
|
+
//# sourceMappingURL=hub-agent-editor.payload-D4sgJRSH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-agent-editor.payload-D4sgJRSH.js","sources":["../../src/components/ppt-studio/pptx-pages-artifact.ts","../../src/components/MarkdownContent.tsx","../../src/components/hub-agent-editor.model.ts","../../src/components/hub-provider-env.ts","../../src/components/hub-agent-editor.protocols.ts","../../src/components/hub-agent-editor.payload.ts"],"sourcesContent":["/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { CliEvent } from '@/stores/chat-types';\n\nconst PPTX_PAGES_COMMENT =\n /<!--\\s*artifact:pptx-pages\\s+([^\\s>]+)(?:\\s+count:(\\d+))?\\s*-->/gi;\n\nexport function stripPptxPagesArtifactCommentsFromMarkdown(md: string): string {\n return md.replace(\n new RegExp(PPTX_PAGES_COMMENT.source, 'gi'),\n '',\n );\n}\n\nfunction parseMarkersInText(\n text: string,\n candidates: { pagesDir: string; expectedSlideCount?: number }[],\n seen: Set<string>,\n): void {\n if (!text) return;\n const re = new RegExp(PPTX_PAGES_COMMENT.source, 'gi');\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n if (!match[1]) continue;\n const pagesDir = match[1];\n if (seen.has(pagesDir)) continue;\n seen.add(pagesDir);\n const count = match[2] ? parseInt(match[2], 10) : undefined;\n candidates.push({ pagesDir, expectedSlideCount: Number.isNaN(count ?? NaN) ? undefined : count });\n }\n}\n\nexport function extractPptxPagesMarkerDirsFromCliEvents(\n events: CliEvent[],\n): { pagesDir: string; expectedSlideCount?: number }[] {\n const searchSpace = events.flatMap((event) => [event.content, event.detail, event.label]).filter(Boolean) as string[];\n const candidates: { pagesDir: string; expectedSlideCount?: number }[] = [];\n const seen = new Set<string>();\n for (const text of searchSpace) {\n parseMarkersInText(text, candidates, seen);\n }\n return candidates;\n}\n\nconst PPTX_HTML_PAGE_PATTERN = /page-(\\d+)\\.pptx\\.html$/i;\n\ninterface PptHtmlFileInfo {\n filePath: string;\n pageNumber: number;\n pagesDir: string;\n}\n\nfunction getToolNameFromLabel(label: string | undefined): string {\n if (!label) return '';\n const forwardArrowIdx = label.indexOf('→');\n if (forwardArrowIdx >= 0) {\n return label.slice(forwardArrowIdx + 1).trim();\n }\n const backArrowIdx = label.indexOf('←');\n if (backArrowIdx >= 0) {\n return label.slice(backArrowIdx + 1).trim();\n }\n return label.trim().split(/\\s+/)[0] ?? '';\n}\n\n/** Tool names (after label normalization) that touch a single file on disk like write_file / edit_file. */\nconst PPT_PAGE_TOUCH_TOOL_NAMES = new Set([\n 'write',\n 'write_file',\n 'edit',\n 'edit_file',\n 'editor_file',\n 'str_replace',\n 'search_replace',\n]);\n\nfunction normalizeToolNameToken(label: string | undefined): string {\n return getToolNameFromLabel(label)\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/-/g, '_');\n}\n\nfunction isPptPagePathTouchTool(label: string | undefined): boolean {\n const n = normalizeToolNameToken(label);\n return PPT_PAGE_TOUCH_TOOL_NAMES.has(n);\n}\n\nfunction parseWriteFileDetail(detail: string | undefined): { file_path?: string } | null {\n if (!detail?.trim()) return null;\n const jsonPathMatch = /\"file_path\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/.exec(detail);\n if (jsonPathMatch?.[1]) {\n return { file_path: jsonPathMatch[1].replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\') };\n }\n const pythonDictMatch = /'file_path'\\s*:\\s*'((?:\\\\.|[^'\\\\])*)'/.exec(detail);\n if (pythonDictMatch?.[1]) {\n return { file_path: pythonDictMatch[1].replace(/\\\\'/g, \"'\").replace(/\\\\\\\\/g, '\\\\') };\n }\n try {\n const parsed = JSON.parse(detail) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as Record<string, unknown>;\n const filePath = obj.file_path ?? obj.path ?? obj.filePath;\n if (typeof filePath === 'string' && filePath.trim()) {\n return { file_path: filePath.trim() };\n }\n const nestedInput = obj.toolInput;\n if (nestedInput && typeof nestedInput === 'object' && !Array.isArray(nestedInput)) {\n const nested = nestedInput as Record<string, unknown>;\n const nestedPath = nested.file_path ?? nested.path ?? nested.filePath;\n if (typeof nestedPath === 'string' && nestedPath.trim()) {\n return { file_path: nestedPath.trim() };\n }\n }\n }\n } catch {}\n return null;\n}\n\nfunction extractPagesDir(normalizedPath: string): string {\n const pagesIdx = normalizedPath.lastIndexOf('/pages/');\n if (pagesIdx >= 0) {\n return normalizedPath.slice(0, pagesIdx + '/pages'.length);\n }\n const lastSlashIdx = normalizedPath.lastIndexOf('/');\n if (lastSlashIdx >= 0) {\n return normalizedPath.slice(0, lastSlashIdx);\n }\n return normalizedPath;\n}\n\nfunction extractPptHtmlFromPptPageToolEvent(event: CliEvent): PptHtmlFileInfo | null {\n if (event.kind !== 'tool_use' && event.kind !== 'tool_result') return null;\n if (!isPptPagePathTouchTool(event.label)) return null;\n const parsed = parseWriteFileDetail(event.detail);\n if (!parsed?.file_path) return null;\n const normalizedPath = parsed.file_path.replace(/\\\\/g, '/');\n const match = PPTX_HTML_PAGE_PATTERN.exec(normalizedPath);\n if (!match) return null;\n const pageNumber = parseInt(match[1], 10);\n if (!Number.isFinite(pageNumber) || pageNumber < 1) return null;\n const pagesDir = extractPagesDir(normalizedPath);\n return {\n filePath: parsed.file_path,\n pageNumber,\n pagesDir,\n };\n}\n\nexport function extractPptxHtmlPagesFromWriteFile(\n events: CliEvent[],\n): { pagesDir: string; htmlFiles: { filePath: string; pageNumber: number; lastTouchedAt: number }[] }[] {\n /** Last touch wins per (pagesDir, pageNumber) so rewrites/edits refresh preview. */\n const byPagesDir = new Map<string, Map<number, PptHtmlFileInfo & { lastTouchedAt: number }>>();\n for (const event of events) {\n const info = extractPptHtmlFromPptPageToolEvent(event);\n if (!info) continue;\n const pageMap = byPagesDir.get(info.pagesDir) ?? new Map();\n pageMap.set(info.pageNumber, { ...info, lastTouchedAt: event.timestamp });\n byPagesDir.set(info.pagesDir, pageMap);\n }\n const results: {\n pagesDir: string;\n htmlFiles: { filePath: string; pageNumber: number; lastTouchedAt: number }[];\n }[] = [];\n for (const [pagesDir, pageMap] of byPagesDir.entries()) {\n const sorted = [...pageMap.values()].sort((a, b) => a.pageNumber - b.pageNumber);\n results.push({\n pagesDir,\n htmlFiles: sorted.map((f) => ({\n filePath: f.filePath,\n pageNumber: f.pageNumber,\n lastTouchedAt: f.lastTouchedAt,\n })),\n });\n }\n return results;\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { Children, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkBreaks from 'remark-breaks';\nimport remarkGfm from 'remark-gfm';\nimport { QUICK_ACTIONS } from '@/config/quick-actions';\nimport { getFileTypeIcon } from '@/hooks/usePromptBlocks';\nimport { getMentionColor, getMentionLabel, getMentionRe, getMentionToAgentId } from '@/lib/mention-highlight';\nimport { readPublicEnv } from '@/utils/client-env';\nimport { fetchSkillOptionsWithCache, getCachedSkillOptions } from '@/utils/skill-options-cache';\nimport { stripPptxPagesArtifactCommentsFromMarkdown } from './ppt-studio/pptx-pages-artifact';\n\nconst PROJECT_ROOT = readPublicEnv('NEXT_PUBLIC_PROJECT_ROOT') ?? '';\nconst INSPIRATION_UPLOAD_PATH_PREFIX = '/files/inspiration-upload/';\n\nfunction renderSkillToken(skillName: string, key: string): ReactNode {\n return (\n <span\n key={key}\n className=\"inline-flex max-w-full translate-y-[-1px] items-center gap-1 rounded px-1 py-[1px] align-middle text-[rgba(20,118,255,1)]\"\n data-skill-token=\"true\"\n >\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-3.5 w-3.5 shrink-0\"\n style={{\n backgroundColor: 'currentColor',\n maskImage: \"url('/icons/menu/skills.svg')\",\n maskRepeat: 'no-repeat',\n maskPosition: 'center',\n maskSize: 'contain',\n WebkitMaskImage: \"url('/icons/menu/skills.svg')\",\n WebkitMaskRepeat: 'no-repeat',\n WebkitMaskPosition: 'center',\n WebkitMaskSize: 'contain',\n }}\n />\n <span className=\"truncate\">{skillName}</span>\n </span>\n );\n}\n\nconst VISIBLE_QUICK_ACTIONS = QUICK_ACTIONS.filter((action) => action.show !== false);\nconst QUICK_ACTIONS_SORTED = [...VISIBLE_QUICK_ACTIONS].sort((a, b) => b.label.length - a.label.length);\n\nfunction renderQuickActionToken(label: string, key: string): ReactNode {\n const action = VISIBLE_QUICK_ACTIONS.find((item) => item.label === label);\n return (\n <span\n key={key}\n className=\"inline-flex max-w-full items-center gap-1 rounded-full border px-[8px] py-[3px] align-middle text-[14px] font-normal leading-[22px] text-[#191919]\"\n style={{ borderColor: 'rgba(20,118,255,0.8)', backgroundColor: '#eff6ff' }}\n data-quick-action-token=\"true\"\n >\n {action?.icon ? <img src={action.icon} alt=\"\" aria-hidden=\"true\" className=\"h-4 w-4 shrink-0\" /> : null}\n <span className=\"truncate\">{label}</span>\n </span>\n );\n}\n\nconst SKILL_PHRASE_RE = /(使用\\s+)([^\\n,。!?,.!?]{1,60}?)(\\s+技能)/g;\n\nfunction appendTextWithSkillPhrase(parts: ReactNode[], text: string, keyPrefix: string): void {\n if (!text) return;\n let lastIdx = 0;\n let m: RegExpExecArray | null;\n SKILL_PHRASE_RE.lastIndex = 0;\n while ((m = SKILL_PHRASE_RE.exec(text)) !== null) {\n if (m.index > lastIdx) parts.push(text.slice(lastIdx, m.index));\n const full = m[0];\n const skillName = (m[2] ?? '').trim();\n if (!skillName) {\n parts.push(full);\n } else {\n parts.push(renderSkillToken(skillName, `${keyPrefix}-phrase-${m.index}`));\n }\n lastIdx = m.index + full.length;\n }\n if (lastIdx < text.length) parts.push(text.slice(lastIdx));\n}\n\nfunction appendTextWithSkills(\n parts: ReactNode[],\n text: string,\n keyPrefix: string,\n skillNames: string[],\n enableSkillAndQuickActionTokens: boolean,\n): void {\n if (!text) return;\n if (!enableSkillAndQuickActionTokens) {\n parts.push(text);\n return;\n }\n\n const normalizedSkillNames = new Set(skillNames.map((name) => name.trim().toLowerCase()).filter(Boolean));\n let cursor = 0;\n let plainStart = 0;\n\n while (cursor < text.length) {\n const phraseSlice = text.slice(cursor);\n const phraseMatch = /^(使用\\s+)([^\\n,。!?,.!?]{1,60}?)(\\s+技能)/.exec(phraseSlice);\n if (phraseMatch) {\n const full = phraseMatch[0] ?? '';\n const skillName = (phraseMatch[2] ?? '').trim();\n if (skillName && normalizedSkillNames.has(skillName.toLowerCase())) {\n if (cursor > plainStart) parts.push(text.slice(plainStart, cursor));\n parts.push(renderSkillToken(skillName, `${keyPrefix}-phrase-${cursor}`));\n cursor += full.length;\n plainStart = cursor;\n continue;\n }\n }\n\n let matchedQuickAction: string | null = null;\n for (const action of QUICK_ACTIONS_SORTED) {\n const label = action.label;\n if (!label) continue;\n if (!text.startsWith(label, cursor)) continue;\n const prev = cursor > 0 ? text[cursor - 1] : ' ';\n const next = cursor + label.length < text.length ? text[cursor + label.length] : ' ';\n if (/\\s/.test(prev) && /\\s/.test(next)) {\n matchedQuickAction = label;\n break;\n }\n }\n if (matchedQuickAction) {\n if (cursor > plainStart) parts.push(text.slice(plainStart, cursor));\n parts.push(renderQuickActionToken(matchedQuickAction, `${keyPrefix}-qa${cursor}`));\n cursor += matchedQuickAction.length;\n plainStart = cursor;\n continue;\n }\n\n cursor += 1;\n }\n\n if (plainStart < text.length) parts.push(text.slice(plainStart));\n}\n\nfunction highlightMentionsAndSkills(\n text: string,\n skillNames: string[],\n enableSkillAndQuickActionTokens: boolean,\n): ReactNode[] {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n let m: RegExpExecArray | null;\n\n const re = getMentionRe();\n const toAgent = getMentionToAgentId();\n const colorMap = getMentionColor();\n const labelMap = getMentionLabel();\n\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n if (m.index > lastIdx) {\n appendTextWithSkills(parts, text.slice(lastIdx, m.index), `p${m.index}`, skillNames, enableSkillAndQuickActionTokens);\n }\n const agentId = toAgent[m[1].toLowerCase()] ?? 'opus';\n void colorMap[agentId];\n const label = labelMap[m[1].toLowerCase()] ?? m[0];\n parts.push(\n <span\n key={`m${m.index}`}\n className=\"user-question-mention\"\n style={{\n color: 'rgb(20, 118, 255)',\n borderRadius: 4,\n padding: '1px 5px',\n }}\n >\n {label}\n </span>,\n );\n lastIdx = re.lastIndex;\n }\n if (lastIdx < text.length) {\n appendTextWithSkills(parts, text.slice(lastIdx), `tail${lastIdx}`, skillNames, enableSkillAndQuickActionTokens);\n }\n return parts;\n}\n\nfunction withMentions(\n children: ReactNode,\n skillNames: string[],\n enableSkillAndQuickActionTokens: boolean,\n): ReactNode {\n return Children.map(children, (child) =>\n typeof child === 'string' ? highlightMentionsAndSkills(child, skillNames, enableSkillAndQuickActionTokens) : child,\n );\n}\n\nfunction CodeBlock({ children }: { children: ReactNode }) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const preRef = useRef<HTMLPreElement>(null);\n\n const handleCopy = useCallback(() => {\n const text = preRef.current?.textContent ?? '';\n void navigator.clipboard.writeText(text);\n setCopied(true);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 1500);\n }, []);\n\n return (\n <div className=\"relative group my-2\">\n <button\n onClick={handleCopy}\n className=\"absolute top-2 right-2 z-10 px-1.5 py-0.5 rounded text-[10px] bg-gray-700 text-gray-300 md:opacity-0 md:group-hover:opacity-100 hover:bg-gray-600 transition-opacity\"\n >\n {copied ? '已复制' : '复制'}\n </button>\n <pre\n ref={preRef}\n className=\"bg-gray-900 text-gray-100 rounded-lg p-3 overflow-x-auto text-xs leading-5 font-mono [&>code]:bg-transparent [&>code]:p-0 [&>code]:text-inherit [&>code]:text-xs\"\n >\n {children}\n </pre>\n </div>\n );\n}\n\nconst FILE_PATH_RE = /(?:^|\\s)`?((?:\\/[\\w.@-]+)+(?:\\.[\\w]+)(?::(\\d+))?)(?:`?)/g;\nconst REL_PATH_RE = /(?:^|\\s)`?((?:packages|src|docs|tests?)\\/[\\w./@-]+(?:\\.[\\w]+)(?::(\\d+))?)(?:`?)/g;\nconst INSPIRATION_UPLOAD_PATH_RE = /`?(\\/files\\/inspiration-upload\\/[\\w.@-]+(?:\\.[\\w]+))`?/g;\nconst WORKSPACE_UPLOAD_PATH_RE = /`?((?:\\/[^/\\s`,。!?、:;,]+)*\\/upload\\/[^`,。!?、:;,\\n]+\\.[A-Za-z0-9]{1,8})`?/g;\nconst WT_TAG_RE = /^\\s*\\[wt:([a-zA-Z0-9_/-]+)\\]/;\n\nfunction getInspirationUploadFileName(path: string): string | null {\n let storedFileName = '';\n if (path.startsWith(INSPIRATION_UPLOAD_PATH_PREFIX)) {\n storedFileName = path.slice(INSPIRATION_UPLOAD_PATH_PREFIX.length);\n } else {\n const uploadMarker = '/upload/';\n const uploadIndex = path.lastIndexOf(uploadMarker);\n if (uploadIndex < 0) return null;\n storedFileName = path.slice(uploadIndex + uploadMarker.length);\n }\n if (!storedFileName || storedFileName.includes('/')) return null;\n return storedFileName.replace(/^\\d+_/, '') || storedFileName;\n}\n\nfunction renderInspirationFileToken(fileName: string, key: string): ReactNode {\n return (\n <span\n key={key}\n className=\"inline-flex translate-y-[-1px] items-center gap-[2px] align-middle leading-none whitespace-pre-wrap break-words [overflow-wrap:anywhere]\"\n style={{\n color: 'rgba(20, 118, 255, 1)',\n }}\n data-inspiration-file-token=\"true\"\n title={fileName}\n >\n <span aria-hidden=\"true\" className=\"inline-flex items-center justify-center w-[1em] h-[1em] flex-shrink-0\">\n <img src={getFileTypeIcon(fileName)} alt=\"\" className=\"w-[1em] h-[1em]\" />\n </span>\n <span className=\"inline-block\" style={{ wordBreak: 'break-word' }}>\n {fileName}\n </span>\n </span>\n );\n}\n\nfunction linkifyFilePaths(text: string): ReactNode[] {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n const combined = new RegExp(\n `${WORKSPACE_UPLOAD_PATH_RE.source}|${INSPIRATION_UPLOAD_PATH_RE.source}|${FILE_PATH_RE.source}|${REL_PATH_RE.source}`,\n 'g',\n );\n let m: RegExpExecArray | null;\n\n combined.lastIndex = 0;\n while ((m = combined.exec(text)) !== null) {\n const fullMatch = m[0];\n const leading = fullMatch.match(/^\\s/)?.[0] ?? '';\n const path = m[1] ?? m[2] ?? m[3] ?? m[5];\n const line = m[4] ?? m[6];\n if (!path) continue;\n\n const start = m.index + leading.length;\n if (start > lastIdx) parts.push(text.slice(lastIdx, start));\n\n const inspirationFileName = getInspirationUploadFileName(path);\n if (inspirationFileName) {\n parts.push(renderInspirationFileToken(inspirationFileName, `ifp${m.index}`));\n lastIdx = m.index + fullMatch.length;\n continue;\n }\n\n const afterMatch = text.slice(m.index + fullMatch.length);\n const wtMatch = afterMatch.match(WT_TAG_RE);\n const worktreeId = wtMatch?.[1] ?? undefined;\n\n const display = path;\n const isAbsolute = path.startsWith('/');\n const filePath = path.split(':')[0];\n const absPath = isAbsolute ? filePath : PROJECT_ROOT ? `${PROJECT_ROOT}/${filePath}` : null;\n const href = absPath ? `vscode://file${absPath}${line ? `:${line}` : ''}` : null;\n\n parts.push(\n href ? (\n <FilePathLink\n key={`fp${m.index}`}\n display={display}\n href={href}\n />\n ) : (\n <span key={`fp${m.index}`} className=\"text-blue-400 font-mono text-[0.85em]\">\n {display}\n </span>\n ),\n );\n\n if (wtMatch) {\n lastIdx = m.index + fullMatch.length + wtMatch[0].length;\n combined.lastIndex = lastIdx;\n } else {\n lastIdx = m.index + fullMatch.length;\n }\n }\n if (lastIdx < text.length) parts.push(text.slice(lastIdx));\n return parts.length > 0 ? parts : [text];\n}\n\nfunction FilePathLink({ display, href }: { display: string; href: string }) {\n return (\n <a\n href={href}\n className=\"text-blue-400 hover:text-blue-300 hover:underline font-mono text-[0.85em] cursor-pointer\"\n title={`打开本地编辑器\\n${display}`}\n >\n {display}\n </a>\n );\n}\n\nfunction withMentionsAndLinks(\n children: ReactNode,\n skillNames: string[],\n enableSkillAndQuickActionTokens: boolean,\n): ReactNode {\n return Children.map(children, (child) => {\n if (typeof child !== 'string') return child;\n const linked = linkifyFilePaths(child);\n return (\n <>\n {linked.map((node, i) =>\n typeof node === 'string' ? (\n <span key={i}>{highlightMentionsAndSkills(node, skillNames, enableSkillAndQuickActionTokens)}</span>\n ) : (\n node\n ),\n )}\n </>\n );\n });\n}\n\nfunction createMdComponents(skillNames: string[], enableSkillAndQuickActionTokens: boolean): Components {\n return {\n p: ({ children }) => (\n <p className=\"mb-2 last:mb-0 leading-relaxed\">\n {withMentionsAndLinks(children, skillNames, enableSkillAndQuickActionTokens)}\n </p>\n ),\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</strong>\n ),\n em: ({ children }) => <em>{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</em>,\n del: ({ children }) => (\n <del className=\"opacity-60\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</del>\n ),\n\n h1: ({ children }) => (\n <h1 className=\"text-lg font-bold mb-2 mt-3 first:mt-0\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-base font-bold mb-2 mt-3 first:mt-0\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-sm font-bold mb-1 mt-2 first:mt-0\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</h3>\n ),\n\n ul: ({ children }) => <ul className=\"list-disc pl-6 mb-2 space-y-0.5\">{children}</ul>,\n ol: ({ children }) => (\n <ol className=\"list-decimal pl-10 mb-2 space-y-0.5 marker:[font-variant-numeric:tabular-nums]\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"pl-1\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</li>,\n\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-[3px] border-gray-300 pl-3 my-2 italic opacity-80\">{children}</blockquote>\n ),\n a: ({ href, children }) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-500 hover:underline break-all\">\n {withMentions(children, skillNames, enableSkillAndQuickActionTokens)}\n </a>\n ),\n hr: () => <hr className=\"my-3 border-gray-200\" />,\n\n pre: ({ children }) => <CodeBlock>{children}</CodeBlock>,\n code: ({ className, children }) => (\n <code className={`${className ?? ''} bg-gray-200/50 rounded px-1 py-0.5 text-[0.85em] font-mono`}>{children}</code>\n ),\n\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-2\">\n <table className=\"min-w-full text-sm border-collapse\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"bg-gray-50\">{children}</thead>,\n th: ({ children }) => (\n <th className=\"border border-gray-300 px-2 py-1 text-left font-semibold text-xs\">\n {withMentions(children, skillNames, enableSkillAndQuickActionTokens)}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"border border-gray-300 px-2 py-1\">{withMentions(children, skillNames, enableSkillAndQuickActionTokens)}</td>\n ),\n };\n}\n\ninterface Props {\n content: string;\n className?: string;\n disableCommandPrefix?: boolean;\n basePath?: string;\n enableSkillAndQuickActionTokens?: boolean;\n}\n\nexport function isRelativeMdLink(href: string | undefined): href is string {\n if (!href) return false;\n if (href.startsWith('http://') || href.startsWith('https://') || href.startsWith('/')) return false;\n return /\\.mdx?(?:#|$)/.test(href);\n}\n\nexport function resolveRelativePath(base: string, relative: string): string {\n const clean = relative.split('#')[0];\n const parts = base ? base.split('/') : [];\n for (const seg of clean.split('/')) {\n if (seg === '..') parts.pop();\n else if (seg !== '.') parts.push(seg);\n }\n return parts.join('/');\n}\n\nexport function MarkdownContent({\n content,\n className,\n disableCommandPrefix,\n basePath,\n enableSkillAndQuickActionTokens = false,\n}: Props) {\n const [skillNames, setSkillNames] = useState<string[]>(() =>\n (getCachedSkillOptions() ?? []).map((item) => item.name),\n );\n\n useEffect(() => {\n let active = true;\n void fetchSkillOptionsWithCache().then((options) => {\n if (!active) return;\n setSkillNames(options.map((item) => item.name));\n });\n\n return () => {\n active = false;\n };\n }, []);\n\n const cmdMatch = disableCommandPrefix ? null : /^(\\/\\w+)/.exec(content);\n const md = cmdMatch ? content.slice(cmdMatch[1].length) : content;\n\n const mdStripped = useMemo(() => stripPptxPagesArtifactCommentsFromMarkdown(md), [md]);\n\n const components = useMemo(() => {\n const baseComponents = createMdComponents(skillNames, enableSkillAndQuickActionTokens);\n return basePath != null\n ? { ...baseComponents, a: createWorkspaceLinkComponent(basePath, skillNames, enableSkillAndQuickActionTokens) }\n : baseComponents;\n }, [basePath, skillNames, enableSkillAndQuickActionTokens]);\n\n return (\n <div\n className={`markdown-content font-sans break-words ${className ?? ''}`}\n style={{ fontFamily: '\"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", \"Segoe UI\", sans-serif' }}\n >\n {cmdMatch && <span className=\"text-indigo-500\">{cmdMatch[1]}</span>}\n <ReactMarkdown remarkPlugins={[[remarkGfm, { singleTilde: false }], remarkBreaks]} components={components}>\n {mdStripped}\n </ReactMarkdown>\n </div>\n );\n}\n\nfunction createWorkspaceLinkComponent(\n basePath: string,\n skillNames: string[],\n enableSkillAndQuickActionTokens: boolean,\n): Components['a'] {\n return function WorkspaceLink({ href, children }) {\n if (isRelativeMdLink(href)) {\n const resolved = resolveRelativePath(basePath, href);\n return (\n <span\n className=\"text-gray-500 break-all\"\n title={`历史 workspace 文档链接已下线: ${resolved}`}\n >\n {withMentions(children, skillNames, enableSkillAndQuickActionTokens)}\n </span>\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-500 hover:underline break-all\">\n {withMentions(children, skillNames, enableSkillAndQuickActionTokens)}\n </a>\n );\n };\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport { resolveEmbeddedRuntimeKind } from '@hualinge/relay-shared';\nimport type { AgentData } from '@/hooks/useAgentData';\nimport type { BuiltinAccountClient, ProfileItem } from './hub-provider-profiles.types';\nimport type { AgentStrategyEntry, StrategyType } from './hub-strategy-types';\n\nexport type ClientValue = 'anthropic' | 'openai' | 'google' | 'dare' | 'opencode' | 'relayclaw' | 'antigravity' | 'acp';\nexport type SessionChainValue = 'true' | 'false';\nexport type CodexSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';\nexport type CodexApprovalPolicy = 'untrusted' | 'on-failure' | 'on-request' | 'never';\nexport type CodexAuthMode = 'oauth' | 'api_key' | 'auto';\n\nexport interface HubAgentEditorFormState {\n agentId: string;\n name: string;\n displayName: string;\n nickname: string;\n avatar: string;\n colorPrimary: string;\n colorSecondary: string;\n mentionPatterns: string;\n roleDescription: string;\n personality: string;\n teamStrengths: string;\n caution: string;\n strengths: string;\n client: ClientValue;\n accountRef: string;\n defaultModel: string;\n imageModel?: string;\n imageAccountRef?: string;\n commandArgs: string;\n cliConfigArgs: string[];\n ocProviderName: string;\n embeddedAcpExecutablePath?: string;\n embeddedAcpArgs: string;\n embeddedAcpCwd: string;\n embeddedAcpEnvText: string;\n sessionChain: SessionChainValue;\n maxPromptTokens: string;\n maxContextTokens: string;\n maxMessages: string;\n maxContentLengthPerMsg: string;\n /** Optional creation provenance for runtime-created agents. */\n creationSource?: 'experts-plaza';\n}\n\nexport interface HubAgentEditorDraft {\n client: ClientValue;\n accountRef?: string;\n providerProfileId?: string;\n defaultModel: string;\n commandArgs?: string;\n}\n\nexport interface StrategyFormState {\n strategy: StrategyType;\n warnThreshold: string;\n actionThreshold: string;\n maxCompressions: string;\n hybridCapable: boolean;\n sessionChainEnabled: boolean;\n}\n\nexport interface CodexRuntimeSettings {\n sandboxMode: CodexSandboxMode;\n approvalPolicy: CodexApprovalPolicy;\n authMode: CodexAuthMode;\n}\n\nexport const CLIENT_OPTIONS: Array<{ value: ClientValue; label: string }> = [\n { value: 'anthropic', label: 'Claude' },\n { value: 'openai', label: 'Codex' },\n { value: 'google', label: 'Gemini' },\n { value: 'dare', label: 'Office Agent' },\n { value: 'opencode', label: 'OpenCode' },\n { value: 'relayclaw', label: 'Assistant Agent' },\n { value: 'acp', label: 'ACP' },\n { value: 'antigravity', label: 'Antigravity' },\n];\n\nexport const SESSION_CHAIN_OPTIONS: Array<{ value: SessionChainValue; label: string }> = [\n { value: 'true', label: 'true' },\n { value: 'false', label: 'false' },\n];\n\nexport const SESSION_STRATEGY_OPTIONS: Array<{ value: StrategyType; label: string }> = [\n { value: 'handoff', label: 'handoff' },\n { value: 'compress', label: 'compress' },\n { value: 'hybrid', label: 'hybrid' },\n];\n\nexport const CODEX_SANDBOX_OPTIONS: Array<{ value: CodexSandboxMode; label: string }> = [\n { value: 'read-only', label: 'read-only' },\n { value: 'workspace-write', label: 'workspace-write' },\n { value: 'danger-full-access', label: 'danger-full-access' },\n];\n\nexport const CODEX_APPROVAL_OPTIONS: Array<{ value: CodexApprovalPolicy; label: string }> = [\n { value: 'untrusted', label: 'untrusted' },\n { value: 'on-failure', label: 'on-failure' },\n { value: 'on-request', label: 'on-request' },\n { value: 'never', label: 'never' },\n];\n\nexport const CODEX_AUTH_MODE_OPTIONS: Array<{ value: CodexAuthMode; label: string }> = [\n { value: 'oauth', label: 'oauth' },\n { value: 'api_key', label: 'api_key' },\n { value: 'auto', label: 'auto' },\n];\n\nexport const DEFAULT_ANTIGRAVITY_COMMAND_ARGS = '. --remote-debugging-port=9000';\nconst HUAWEI_MAAS_MODEL_SOURCE_ID = 'huawei-maas';\n\nexport function hasEmbeddedAcpRuntime(agent?: Pick<AgentData, 'id' | 'provider' | 'source' | 'embeddedRuntimeKind'> | null): boolean {\n if (!agent) return false;\n return (\n agent.embeddedRuntimeKind === 'agentteams_acp' ||\n resolveEmbeddedRuntimeKind({ id: agent.id, provider: agent.provider, source: agent.source }) === 'agentteams_acp'\n );\n}\n\nexport function splitMentionPatterns(raw: string): string[] {\n return raw\n .split(/[\\n,]+/)\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nexport function normalizeMentionPattern(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n return trimmed.startsWith('@') ? trimmed : `@${trimmed}`;\n}\n\nexport function canonicalMentionPattern(agentId: string): string {\n return normalizeMentionPattern(agentId);\n}\n\nexport function joinTags(tags: string[]): string {\n return tags.join(', ');\n}\n\nexport function splitCommandArgs(raw: string): string[] {\n const input = raw.trim();\n if (!input) return [];\n const args: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n let escaping = false;\n\n const pushCurrent = () => {\n if (current.length === 0) return;\n args.push(current);\n current = '';\n };\n\n for (const char of input) {\n if (escaping) {\n current += char;\n escaping = false;\n continue;\n }\n if (char === '\\\\') {\n escaping = true;\n continue;\n }\n if (quote) {\n if (char === quote) {\n quote = null;\n } else {\n current += char;\n }\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (/\\s/.test(char)) {\n pushCurrent();\n continue;\n }\n current += char;\n }\n if (escaping) current += '\\\\';\n pushCurrent();\n return args;\n}\n\nexport function splitStrengthTags(raw: string): string[] {\n return raw\n .split(/[\\n,]+/)\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction isBuiltinClient(client: ClientValue): client is BuiltinAccountClient {\n return (\n client === 'anthropic' || client === 'openai' || client === 'google' || client === 'dare' || client === 'opencode'\n );\n}\n\nfunction isModelConfigProfile(profile: ProfileItem): boolean {\n return profile.source === 'model_config';\n}\n\nfunction legacyProfileClient(profile: ProfileItem): BuiltinAccountClient | undefined {\n if (profile.client) return profile.client;\n if (profile.oauthLikeClient === 'dare' || profile.oauthLikeClient === 'opencode') return profile.oauthLikeClient;\n const normalizedId = `${profile.id} ${profile.provider ?? ''} ${profile.displayName} ${profile.name}`.toLowerCase();\n if (normalizedId.includes('claude')) return 'anthropic';\n if (normalizedId.includes('codex')) return 'openai';\n if (normalizedId.includes('gemini')) return 'google';\n if (normalizedId.includes('dare')) return 'dare';\n if (normalizedId.includes('opencode')) return 'opencode';\n switch (profile.protocol) {\n case 'anthropic':\n return 'anthropic';\n case 'openai':\n return 'openai';\n case 'google':\n return 'google';\n default:\n return undefined;\n }\n}\n\nexport function builtinAccountIdForClient(client: ClientValue): string | null {\n if (!isBuiltinClient(client)) return null;\n switch (client) {\n case 'anthropic':\n return 'claude';\n case 'openai':\n return 'codex';\n case 'google':\n return 'gemini';\n case 'dare':\n return 'dare';\n case 'opencode':\n return 'opencode';\n }\n}\n\nexport function filterAccounts(\n client: ClientValue,\n profiles: ProfileItem[],\n options?: { embeddedAcpRuntime?: boolean },\n): ProfileItem[] {\n if (options?.embeddedAcpRuntime) {\n return profiles.filter((profile) => {\n if (profile.source === 'model_config') {\n return profile.protocol === 'openai' || profile.protocol === 'huawei_maas';\n }\n return profile.kind !== 'acp' && profile.authType === 'api_key' && profile.protocol === 'openai';\n });\n }\n if (client === 'acp') {\n return profiles.filter((profile) => profile.kind === 'acp');\n }\n const modelConfigProfiles = profiles.filter(isModelConfigProfile);\n if (modelConfigProfiles.length > 0) {\n if (client !== 'dare' && client !== 'relayclaw') return [];\n return modelConfigProfiles.filter((profile) => {\n if (profile.id === HUAWEI_MAAS_MODEL_SOURCE_ID && profile.protocol === 'huawei_maas') return true;\n return profile.protocol === 'openai';\n });\n }\n if (client === 'relayclaw') {\n return profiles.filter((profile) => profile.authType === 'api_key' && profile.protocol === 'openai');\n }\n if (!isBuiltinClient(client)) return [];\n const builtinProfiles = profiles.filter(\n (profile) => profile.authType !== 'api_key' && legacyProfileClient(profile) === client,\n );\n // Gemini CLI only supports builtin Google auth — no API key profiles.\n if (client === 'google') return builtinProfiles;\n const apiKeyProfiles = profiles.filter((profile) => profile.authType === 'api_key');\n return [...builtinProfiles, ...apiKeyProfiles.filter((profile) => !builtinProfiles.includes(profile))];\n}\n\nexport const filterProfiles = filterAccounts;\n\nexport function initialState(agent?: AgentData | null, draft?: HubAgentEditorDraft | null): HubAgentEditorFormState {\n const createDraft = !agent ? draft : null;\n const agentId = agent?.id ?? '';\n const mentionPatterns = agent?.mentionPatterns ?? (agentId ? [canonicalMentionPattern(agentId)] : []);\n const embeddedAcpConfig = agent?.embeddedAcpConfig;\n return {\n agentId,\n name: agent?.name ?? agent?.displayName ?? '',\n displayName: agent?.displayName ?? agent?.name ?? '',\n nickname: agent?.nickname ?? '',\n avatar: agent?.avatar ?? '',\n colorPrimary: agent?.color.primary ?? '#9B7EBD',\n colorSecondary: agent?.color.secondary ?? '#E8DFF5',\n mentionPatterns: joinTags(mentionPatterns),\n roleDescription: agent?.roleDescription ?? '',\n personality: agent?.personality ?? '',\n teamStrengths: agent?.teamStrengths ?? '',\n caution: agent?.caution ?? '',\n strengths: agent?.strengths?.join(', ') ?? '',\n client: (agent?.provider as ClientValue | undefined) ?? createDraft?.client ?? 'anthropic',\n accountRef:\n agent?.accountRef ?? agent?.providerProfileId ?? createDraft?.accountRef ?? createDraft?.providerProfileId ?? '',\n defaultModel: agent?.defaultModel ?? createDraft?.defaultModel ?? '',\n imageModel: agent?.imageModel ?? undefined,\n imageAccountRef: agent?.imageAccountRef ?? undefined,\n commandArgs: agent?.commandArgs?.join(' ') ?? createDraft?.commandArgs ?? '',\n cliConfigArgs: [...(agent?.cliConfigArgs ?? [])],\n ocProviderName: agent?.ocProviderName ?? '',\n embeddedAcpExecutablePath: embeddedAcpConfig?.executablePath ?? agent?.embeddedAcpExecutablePath ?? '',\n embeddedAcpArgs: embeddedAcpConfig?.args?.join(' ') ?? '',\n embeddedAcpCwd: embeddedAcpConfig?.cwd ?? '',\n embeddedAcpEnvText: embeddedAcpConfig?.env\n ? Object.entries(embeddedAcpConfig.env)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n')\n : '',\n sessionChain: String(agent?.sessionChain ?? true) as SessionChainValue,\n maxPromptTokens: agent?.contextBudget ? String(agent.contextBudget.maxPromptTokens) : '',\n maxContextTokens: agent?.contextBudget ? String(agent.contextBudget.maxContextTokens) : '',\n maxMessages: agent?.contextBudget ? String(agent.contextBudget.maxMessages) : '',\n maxContentLengthPerMsg: agent?.contextBudget ? String(agent.contextBudget.maxContentLengthPerMsg) : '',\n };\n}\n\nexport function toStrategyForm(entry: AgentStrategyEntry): StrategyFormState {\n return {\n strategy: entry.effective.strategy,\n warnThreshold: String(entry.effective.thresholds.warn),\n actionThreshold: String(entry.effective.thresholds.action),\n maxCompressions: String(entry.effective.hybrid?.maxCompressions ?? 2),\n hybridCapable: entry.hybridCapable,\n sessionChainEnabled: entry.sessionChainEnabled,\n };\n}\n\nexport function buildStrategyPayload(strategy: StrategyFormState) {\n const warn = Number.parseFloat(strategy.warnThreshold);\n const action = Number.parseFloat(strategy.actionThreshold);\n if (!Number.isFinite(warn) || !Number.isFinite(action)) {\n throw new Error('Session 阈值必须是数字');\n }\n if (warn >= action) {\n throw new Error('Warn Threshold 必须小于 Action Threshold');\n }\n\n const payload: Record<string, unknown> = {\n strategy: strategy.strategy,\n thresholds: { warn, action },\n };\n if (strategy.strategy === 'hybrid') {\n const maxCompressions = Number.parseInt(strategy.maxCompressions, 10);\n if (!Number.isFinite(maxCompressions) || maxCompressions <= 0) {\n throw new Error('Max Compressions 必须是正整数');\n }\n payload.hybrid = { maxCompressions };\n }\n return payload;\n}\n\nexport function toCodexRuntimeSettings(config?: {\n cli?: {\n codexSandboxMode?: CodexSandboxMode;\n codexApprovalPolicy?: CodexApprovalPolicy;\n };\n codexExecution?: {\n authMode?: CodexAuthMode;\n };\n}): CodexRuntimeSettings {\n return {\n sandboxMode: config?.cli?.codexSandboxMode ?? 'workspace-write',\n approvalPolicy: config?.cli?.codexApprovalPolicy ?? 'on-request',\n authMode: config?.codexExecution?.authMode ?? 'oauth',\n };\n}\n\nexport function buildCodexConfigPatches(\n settings: CodexRuntimeSettings,\n baseline: CodexRuntimeSettings,\n): Array<{ key: string; value: string }> {\n const patches: Array<{ key: string; value: string }> = [];\n if (settings.sandboxMode !== baseline.sandboxMode) {\n patches.push({ key: 'cli.codexSandboxMode', value: settings.sandboxMode });\n }\n if (settings.approvalPolicy !== baseline.approvalPolicy) {\n patches.push({ key: 'cli.codexApprovalPolicy', value: settings.approvalPolicy });\n }\n if (settings.authMode !== baseline.authMode) {\n patches.push({ key: 'codex.execution.authMode', value: settings.authMode });\n }\n return patches;\n}\n\n// Extracted to hub-agent-editor.payload.ts:\n// buildAgentPayload, validateModelFormatForClient\nexport {\n buildAgentPayload,\n validateModelFormatForClient,\n} from './hub-agent-editor.payload';\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nexport function parseProviderEnvText(value: string): Record<string, string> | undefined {\n const lines = value.split(/\\r?\\n/);\n const entries: Array<[string, string]> = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const separatorIndex = trimmed.indexOf('=');\n const key = (separatorIndex === -1 ? trimmed : trimmed.slice(0, separatorIndex)).trim();\n if (!key) continue;\n const envValue = separatorIndex === -1 ? '' : trimmed.slice(separatorIndex + 1);\n entries.push([key, envValue]);\n }\n if (entries.length === 0) return undefined;\n return Object.fromEntries(entries);\n}\n","/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\nimport type { ClientValue } from './hub-agent-editor.model';\n\nexport function defaultMcpSupportForClient(client: ClientValue): boolean {\n return (\n client === 'anthropic' ||\n client === 'openai' ||\n client === 'google' ||\n client === 'opencode' ||\n client === 'acp'\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 {\n type ClientValue,\n DEFAULT_ANTIGRAVITY_COMMAND_ARGS,\n type HubAgentEditorFormState,\n normalizeMentionPattern,\n splitCommandArgs,\n splitMentionPatterns,\n splitStrengthTags,\n} from './hub-agent-editor.model';\nimport { parseProviderEnvText } from './hub-provider-env';\nimport { defaultMcpSupportForClient } from './hub-agent-editor.protocols';\n\nfunction trimText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\n/**\n * Returns a hint string when the model does not follow \"providerId/modelId\" convention for opencode.\n * Advisory only — callers should display as a warning, not block submission.\n */\nexport function hintModelFormatForClient(client: ClientValue, model: string): string | null {\n if (client !== 'opencode') return null;\n const trimmed = model.trim();\n const slashIndex = trimmed.indexOf('/');\n if (slashIndex > 0 && slashIndex < trimmed.length - 1) return null;\n return 'OpenCode 建议使用 providerId/modelId 格式(例如 openai/gpt-5.4)';\n}\n\n/** @deprecated Use {@link hintModelFormatForClient} — kept for backward compatibility. */\nexport const validateModelFormatForClient = hintModelFormatForClient;\n\nfunction resolveFormAccountRef(form: HubAgentEditorFormState): string {\n return trimText(\n form.accountRef ?? (form as HubAgentEditorFormState & { providerProfileId?: string }).providerProfileId,\n );\n}\n\nexport function buildContextBudget(form: HubAgentEditorFormState) {\n const values = [form.maxPromptTokens, form.maxContextTokens, form.maxMessages, form.maxContentLengthPerMsg].map(\n (value) => value.trim(),\n );\n const filledCount = values.filter((value) => value.length > 0).length;\n if (filledCount === 0) return undefined;\n if (filledCount !== values.length) {\n throw new Error('上下文预算要么全部留空,要么 4 项都填写');\n }\n\n const parsed = values.map((value) => Number.parseInt(value, 10));\n if (parsed.some((value) => !Number.isFinite(value) || value <= 0)) {\n throw new Error('上下文预算必须是正整数');\n }\n\n return {\n maxPromptTokens: parsed[0]!,\n maxContextTokens: parsed[1]!,\n maxMessages: parsed[2]!,\n maxContentLengthPerMsg: parsed[3]!,\n };\n}\n\nexport function buildAgentPayload(form: HubAgentEditorFormState, cat?: AgentData | null): Record<string, unknown> {\n const contextBudget = buildContextBudget(form);\n const hasExistingBudget = Boolean(cat?.contextBudget);\n const contextBudgetPatch =\n contextBudget !== undefined ? { contextBudget } : cat && hasExistingBudget ? { contextBudget: null as null } : {};\n const name = trimText(form.name);\n const displayName = trimText(form.displayName) || name;\n const createName = name || displayName;\n const updateName = name || displayName || cat?.name || cat?.displayName || '';\n const trimmedAccountRef = resolveFormAccountRef(form);\n const accountRefPatch =\n trimmedAccountRef.length > 0\n ? { accountRef: trimmedAccountRef }\n : cat?.accountRef || cat?.providerProfileId\n ? { accountRef: null as null }\n : {};\n const mcpSupportPatch =\n cat && form.client !== cat.provider ? { mcpSupport: defaultMcpSupportForClient(form.client) } : {};\n const embeddedAcpEnv = parseProviderEnvText(form.embeddedAcpEnvText ?? '');\n const embeddedAcpConfigValue = {\n ...(trimText(form.embeddedAcpExecutablePath) ? { executablePath: trimText(form.embeddedAcpExecutablePath) } : {}),\n ...(splitCommandArgs(form.embeddedAcpArgs ?? '').length > 0\n ? { args: splitCommandArgs(form.embeddedAcpArgs ?? '') }\n : {}),\n ...(trimText(form.embeddedAcpCwd) ? { cwd: trimText(form.embeddedAcpCwd) } : {}),\n ...(embeddedAcpEnv ? { env: embeddedAcpEnv } : {}),\n };\n const hasEmbeddedAcpConfig = Object.keys(embeddedAcpConfigValue).length > 0;\n const embeddedAcpExecutablePathPatch =\n trimText(form.embeddedAcpExecutablePath)\n ? { embeddedAcpExecutablePath: trimText(form.embeddedAcpExecutablePath) }\n : cat?.embeddedAcpExecutablePath\n ? { embeddedAcpExecutablePath: null as null }\n : {};\n const embeddedAcpConfigPatch = hasEmbeddedAcpConfig\n ? { embeddedAcpConfig: embeddedAcpConfigValue }\n : cat?.embeddedAcpConfig\n ? { embeddedAcpConfig: null as null }\n : {};\n const common = {\n displayName,\n nickname: trimText(form.nickname),\n avatar: trimText(form.avatar),\n color: {\n primary: trimText(form.colorPrimary),\n secondary: trimText(form.colorSecondary),\n },\n mentionPatterns: Array.from(\n new Set(splitMentionPatterns(form.mentionPatterns).map(normalizeMentionPattern).filter(Boolean)),\n ),\n roleDescription: trimText(form.roleDescription),\n personality: trimText(form.personality),\n teamStrengths: trimText(form.teamStrengths),\n caution: trimText(form.caution) || null,\n strengths: splitStrengthTags(form.strengths),\n sessionChain: form.sessionChain === 'true',\n ...(form.creationSource ? { creationSource: form.creationSource } : {}),\n ...contextBudgetPatch,\n };\n\n if (form.client === 'antigravity') {\n const commandArgsSource = trimText(form.commandArgs) || DEFAULT_ANTIGRAVITY_COMMAND_ARGS;\n return {\n ...common,\n ...(cat ? { name: updateName } : { agentId: trimText(form.agentId), name: createName }),\n client: 'antigravity' as const,\n ...accountRefPatch,\n ...mcpSupportPatch,\n defaultModel: trimText(form.defaultModel),\n commandArgs: splitCommandArgs(commandArgsSource),\n };\n }\n\n const imageModelPatch =\n trimText(form.imageModel).length > 0\n ? { imageModel: trimText(form.imageModel) }\n : cat?.imageModel\n ? { imageModel: null as null }\n : {};\n const imageAccountRefPatch =\n trimText(form.imageAccountRef).length > 0\n ? { imageAccountRef: trimText(form.imageAccountRef) }\n : cat?.imageAccountRef\n ? { imageAccountRef: null as null }\n : {};\n\n return {\n ...common,\n ...(cat ? { name: updateName } : { agentId: trimText(form.agentId), name: createName }),\n client: form.client,\n ...accountRefPatch,\n ...mcpSupportPatch,\n ...embeddedAcpExecutablePathPatch,\n ...embeddedAcpConfigPatch,\n ...imageModelPatch,\n ...imageAccountRefPatch,\n defaultModel: trimText(form.defaultModel),\n cliConfigArgs: (form.cliConfigArgs ?? []).filter((arg) => arg.trim().length > 0),\n ...(trimText(form.ocProviderName)\n ? { ocProviderName: trimText(form.ocProviderName) }\n : cat?.ocProviderName\n ? { ocProviderName: null as null }\n : {}),\n };\n}\n"],"names":["PPTX_PAGES_COMMENT","stripPptxPagesArtifactCommentsFromMarkdown","md","parseMarkersInText","text","candidates","seen","re","match","pagesDir","count","extractPptxPagesMarkerDirsFromCliEvents","events","searchSpace","event","PPTX_HTML_PAGE_PATTERN","getToolNameFromLabel","label","forwardArrowIdx","backArrowIdx","PPT_PAGE_TOUCH_TOOL_NAMES","normalizeToolNameToken","isPptPagePathTouchTool","n","parseWriteFileDetail","detail","jsonPathMatch","pythonDictMatch","parsed","obj","filePath","nestedInput","nested","nestedPath","extractPagesDir","normalizedPath","pagesIdx","lastSlashIdx","extractPptHtmlFromPptPageToolEvent","pageNumber","extractPptxHtmlPagesFromWriteFile","byPagesDir","info","pageMap","results","sorted","a","b","f","PROJECT_ROOT","readPublicEnv","INSPIRATION_UPLOAD_PATH_PREFIX","renderSkillToken","skillName","key","jsxs","jsx","VISIBLE_QUICK_ACTIONS","QUICK_ACTIONS","action","QUICK_ACTIONS_SORTED","renderQuickActionToken","item","appendTextWithSkills","parts","keyPrefix","skillNames","enableSkillAndQuickActionTokens","normalizedSkillNames","name","cursor","plainStart","phraseSlice","phraseMatch","full","matchedQuickAction","prev","next","highlightMentionsAndSkills","lastIdx","m","getMentionRe","toAgent","getMentionToAgentId","colorMap","getMentionColor","labelMap","getMentionLabel","agentId","withMentions","children","Children","child","CodeBlock","copied","setCopied","useState","timerRef","useRef","preRef","handleCopy","useCallback","_a","FILE_PATH_RE","REL_PATH_RE","INSPIRATION_UPLOAD_PATH_RE","WORKSPACE_UPLOAD_PATH_RE","WT_TAG_RE","getInspirationUploadFileName","path","storedFileName","uploadMarker","uploadIndex","renderInspirationFileToken","fileName","getFileTypeIcon","linkifyFilePaths","combined","fullMatch","leading","line","start","inspirationFileName","wtMatch","display","isAbsolute","absPath","href","FilePathLink","withMentionsAndLinks","linked","node","i","createMdComponents","className","isRelativeMdLink","resolveRelativePath","base","relative","clean","seg","MarkdownContent","content","disableCommandPrefix","basePath","setSkillNames","getCachedSkillOptions","useEffect","active","fetchSkillOptionsWithCache","options","cmdMatch","mdStripped","useMemo","components","baseComponents","createWorkspaceLinkComponent","ReactMarkdown","remarkGfm","remarkBreaks","resolved","CLIENT_OPTIONS","SESSION_CHAIN_OPTIONS","SESSION_STRATEGY_OPTIONS","CODEX_SANDBOX_OPTIONS","CODEX_APPROVAL_OPTIONS","CODEX_AUTH_MODE_OPTIONS","DEFAULT_ANTIGRAVITY_COMMAND_ARGS","HUAWEI_MAAS_MODEL_SOURCE_ID","hasEmbeddedAcpRuntime","agent","resolveEmbeddedRuntimeKind","splitMentionPatterns","raw","value","normalizeMentionPattern","trimmed","canonicalMentionPattern","joinTags","tags","splitCommandArgs","input","args","current","quote","escaping","pushCurrent","char","splitStrengthTags","isBuiltinClient","client","isModelConfigProfile","profile","legacyProfileClient","normalizedId","builtinAccountIdForClient","filterAccounts","profiles","modelConfigProfiles","builtinProfiles","apiKeyProfiles","initialState","draft","createDraft","mentionPatterns","embeddedAcpConfig","_b","_c","toStrategyForm","entry","buildStrategyPayload","strategy","warn","payload","maxCompressions","toCodexRuntimeSettings","config","buildCodexConfigPatches","settings","baseline","patches","parseProviderEnvText","lines","entries","separatorIndex","envValue","defaultMcpSupportForClient","trimText","resolveFormAccountRef","form","buildContextBudget","values","filledCount","buildAgentPayload","cat","contextBudget","hasExistingBudget","contextBudgetPatch","displayName","createName","updateName","trimmedAccountRef","accountRefPatch","mcpSupportPatch","embeddedAcpEnv","embeddedAcpConfigValue","hasEmbeddedAcpConfig","embeddedAcpExecutablePathPatch","embeddedAcpConfigPatch","common","commandArgsSource","imageModelPatch","imageAccountRefPatch","arg"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as d,j as n}from"./index-Cb4fQgom.js";function E(e){return e.trim()}function y(e,s){return Array.from(new Set([...e,s]))}function f(e){return e==="green"?"border-[#CFE5D5] bg-[#E8F5E9] text-[#4F7B50]":e==="orange"?"border-[#E8C9AF] bg-[#F7EEE6] text-[#C8946B]":"border-[#D9C5EF] bg-[#F3EDFA] text-[#8B68B7]"}function g({tags:e,emptyLabel:s,tone:o="purple",lockedTags:i=[],onRemove:l}){const a=d.useMemo(()=>new Set(i),[i]);return e.length===0?n.jsx("span",{className:"text-sm italic text-[#8A776B]",children:s}):n.jsx(n.Fragment,{children:e.map(r=>n.jsxs("span",{className:`inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-xs font-medium ${f(o)}`,children:[n.jsx("span",{children:r}),l&&!a.has(r)?n.jsx("button",{type:"button","aria-label":`移除 ${r}`,onClick:()=>l(r),className:"rounded-full px-1 text-[10px] leading-none opacity-70 transition hover:opacity-100",children:"×"}):null]},r))})}function C({tags:e,onChange:s,addLabel:o,placeholder:i,emptyLabel:l,lockedTags:a=[],tone:r="purple",normalize:m=E,minCount:b=0}){const[h,u]=d.useState(!1),[c,x]=d.useState(""),p=()=>{const t=m(c);if(!t){u(!1),x("");return}s(y(e,t)),u(!1),x("")};return n.jsxs("div",{className:"space-y-2",children:[n.jsxs("div",{className:"flex flex-wrap gap-2",children:[n.jsx(g,{tags:e,emptyLabel:l,tone:r,lockedTags:a,onRemove:e.filter(t=>!a.includes(t)).length>b?t=>s(e.filter(j=>j!==t)):void 0}),n.jsx("button",{type:"button",onClick:()=>u(t=>!t),className:`rounded-full border px-3 py-1 text-xs font-medium ${f(r)}`,children:o})]}),h?n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx("input",{value:c,onChange:t=>x(t.target.value),onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),p())},placeholder:i,className:"ui-input ui-input-soft min-w-[220px] flex-1 rounded-xl px-3 py-2 text-sm transition"}),n.jsx("button",{type:"button",onClick:p,className:"rounded-full border border-[#D49266] bg-[#FFF1E3] px-3 py-1.5 text-xs font-medium text-[#9A5A2C]",children:"添加"})]}):null]})}export{C as T};
|
|
2
|
+
//# sourceMappingURL=hub-tag-editor-BBdd-aHK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-tag-editor-BBdd-aHK.js","sources":["../../src/components/hub-tag-editor.tsx"],"sourcesContent":["/*\n * *\n * * Copyright (C) Huawei Technologies Co., Ltd. 2026. All rights reserved.\n *\n */\n\n'use client';\n\nimport { useMemo, useState } from 'react';\n\nfunction normalizeTag(value: string): string {\n return value.trim();\n}\n\nfunction mergeTags(tags: string[], nextTag: string): string[] {\n return Array.from(new Set([...tags, nextTag]));\n}\n\nfunction pillClass(tone: 'purple' | 'green' | 'orange') {\n if (tone === 'green') return 'border-[#CFE5D5] bg-[#E8F5E9] text-[#4F7B50]';\n if (tone === 'orange') return 'border-[#E8C9AF] bg-[#F7EEE6] text-[#C8946B]';\n return 'border-[#D9C5EF] bg-[#F3EDFA] text-[#8B68B7]';\n}\n\nexport function TagPillList({\n tags,\n emptyLabel,\n tone = 'purple',\n lockedTags = [],\n onRemove,\n}: {\n tags: string[];\n emptyLabel: string;\n tone?: 'purple' | 'green' | 'orange';\n lockedTags?: string[];\n onRemove?: (tag: string) => void;\n}) {\n const locked = useMemo(() => new Set(lockedTags), [lockedTags]);\n\n if (tags.length === 0) {\n return <span className=\"text-sm italic text-[#8A776B]\">{emptyLabel}</span>;\n }\n\n return (\n <>\n {tags.map((tag) => (\n <span\n key={tag}\n className={`inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-xs font-medium ${pillClass(tone)}`}\n >\n <span>{tag}</span>\n {onRemove && !locked.has(tag) ? (\n <button\n type=\"button\"\n aria-label={`移除 ${tag}`}\n onClick={() => onRemove(tag)}\n className=\"rounded-full px-1 text-[10px] leading-none opacity-70 transition hover:opacity-100\"\n >\n ×\n </button>\n ) : null}\n </span>\n ))}\n </>\n );\n}\n\nexport function TagEditor({\n tags,\n onChange,\n addLabel,\n placeholder,\n emptyLabel,\n lockedTags = [],\n tone = 'purple',\n normalize = normalizeTag,\n minCount = 0,\n}: {\n tags: string[];\n onChange: (nextTags: string[]) => void;\n addLabel: string;\n placeholder: string;\n emptyLabel: string;\n lockedTags?: string[];\n tone?: 'purple' | 'green' | 'orange';\n normalize?: (value: string) => string;\n minCount?: number;\n}) {\n const [adding, setAdding] = useState(false);\n const [draft, setDraft] = useState('');\n\n const commit = () => {\n const nextTag = normalize(draft);\n if (!nextTag) {\n setAdding(false);\n setDraft('');\n return;\n }\n onChange(mergeTags(tags, nextTag));\n setAdding(false);\n setDraft('');\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-2\">\n <TagPillList\n tags={tags}\n emptyLabel={emptyLabel}\n tone={tone}\n lockedTags={lockedTags}\n onRemove={\n // Only count removable (non-locked) tags against minCount\n tags.filter((t) => !lockedTags.includes(t)).length > minCount\n ? (tag) => onChange(tags.filter((item) => item !== tag))\n : undefined\n }\n />\n <button\n type=\"button\"\n onClick={() => setAdding((value) => !value)}\n className={`rounded-full border px-3 py-1 text-xs font-medium ${pillClass(tone)}`}\n >\n {addLabel}\n </button>\n </div>\n\n {adding ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commit();\n }\n }}\n placeholder={placeholder}\n className=\"ui-input ui-input-soft min-w-[220px] flex-1 rounded-xl px-3 py-2 text-sm transition\"\n />\n <button\n type=\"button\"\n onClick={commit}\n className=\"rounded-full border border-[#D49266] bg-[#FFF1E3] px-3 py-1.5 text-xs font-medium text-[#9A5A2C]\"\n >\n 添加\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":["normalizeTag","value","mergeTags","tags","nextTag","pillClass","tone","TagPillList","emptyLabel","lockedTags","onRemove","locked","useMemo","jsx","Fragment","tag","jsxs","TagEditor","onChange","addLabel","placeholder","normalize","minCount","adding","setAdding","useState","draft","setDraft","commit","item","event"],"mappings":"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"}
|