aitu-app 1.0.0 → 1.0.2

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.
Files changed (106) hide show
  1. package/README.md +3 -3
  2. package/assets/{CanvasAudioPlayer-DyUPmMV6.js → CanvasAudioPlayer-HtUs8HDj.js} +2 -2
  3. package/assets/ComicCreator-DhxXCyJR.js +43 -0
  4. package/assets/{DeferredAIInputBar-Cq0t7wNK.js → DeferredAIInputBar-B2R2-2RU.js} +3 -3
  5. package/assets/{DrawnixDeferredFeatures-B9y0GPYR.js → DrawnixDeferredFeatures-DHTr0c-V.js} +2 -2
  6. package/assets/{KnowledgeBaseContent-C8zmce09.js → KnowledgeBaseContent-CAq5kXdt.js} +6 -6
  7. package/assets/{MVCreator-Bl8GH4mR.js → MVCreator-B9uaRsGE.js} +16 -16
  8. package/assets/{ModelBenchmarkWorkbench-BwfeZDt-.js → ModelBenchmarkWorkbench-CK33zizl.js} +1 -1
  9. package/assets/{MusicAnalyzer-CdMhl-kU.js → MusicAnalyzer-D2NTonEA.js} +1 -1
  10. package/assets/{PromptHistoryTool-CCxoST3H.js → PromptHistoryTool-q6vOxFr6.js} +1 -1
  11. package/assets/{ResizableDivider-D1jgqdmh.js → ResizableDivider-BvT-DCEo.js} +2 -2
  12. package/assets/{TaskQueuePanel-WF6aq1G7.js → TaskQueuePanel-PayswYlG.js} +1 -1
  13. package/assets/{VideoAnalyzer-BOqRFjZ9.js → VideoAnalyzer-DnowtohS.js} +1 -1
  14. package/assets/{VideoAnalyzer-BrEKSLeh.js → VideoAnalyzer-DoaGlK92.js} +2 -2
  15. package/assets/{ai-chat-DbjmzngX.css → ai-chat-BlxYfB4O.css} +1 -1
  16. package/assets/ai-chat-BnWVpTEI.js +2977 -0
  17. package/assets/{batch-image-generation-DyWeiTsw.js → batch-image-generation-CkmX4dem.js} +5 -5
  18. package/assets/{bootstrap-DadYvnge.js → bootstrap-CQRLkOtk.js} +7 -7
  19. package/assets/{clean-confirm-CpWpcTF5.js → clean-confirm-CIViVQ8s.js} +1 -1
  20. package/assets/{diagram-engines-C0Ljec4Z.js → diagram-engines-DpAsX7pc.js} +3 -3
  21. package/assets/{editor-engines-Dz5Mk5YB.js → editor-engines-9_72Ghfn.js} +1 -1
  22. package/assets/{external-skill-service-BQUJLLLc.js → external-skill-service-BN8ZCtPn.js} +1 -1
  23. package/assets/{frame-size-matcher-2sxA9X-P.js → frame-size-matcher-9rxQ-bAY.js} +1 -1
  24. package/assets/{index-CRuDVxTu.js → index-291TeU7i.js} +1 -1
  25. package/assets/{index-BNtKpMlh.js → index-BJ-vS89P.js} +1 -1
  26. package/assets/{index-Ct7MFvFo.js → index-BSZAS0wO.js} +1 -1
  27. package/assets/{index-BfdBtWT6.js → index-C7DAD_xK.js} +1 -1
  28. package/assets/{index-o8hm5yhT.js → index-CIgiIDgZ.js} +1 -1
  29. package/assets/{index-BwW4Qp-A.js → index-CpHWUe__.js} +1 -1
  30. package/assets/{index-D7UBK5T7.js → index-D1LQ9eQM.js} +1 -1
  31. package/assets/{index-D_Yn26AT.js → index-DRGxmFyd.js} +1 -1
  32. package/assets/{index-CBMgStgL.js → index-DmtcRYr8.js} +1 -1
  33. package/assets/{index.es-CYBRnsv6.js → index.es-Ch45-H39.js} +1 -1
  34. package/assets/{jspdf.es.min-I7TkFvGI.js → jspdf.es.min-bNprb1JY.js} +3 -3
  35. package/assets/{link-popup-fCfgZp17.js → link-popup-B6ReK6iq.js} +1 -1
  36. package/assets/{markdown-to-drawnix-3yksNvbU.js → markdown-to-drawnix-BqT-3zQO.js} +3 -3
  37. package/assets/{mermaid-to-drawnix-C7rF-30X.js → mermaid-to-drawnix-CSctnpU0.js} +3 -3
  38. package/assets/{model-benchmark-launcher-uYoranwQ.js → model-benchmark-launcher-DNMp2MLQ.js} +1 -1
  39. package/assets/{photo-wall-splitter-CfRBAwCy.js → photo-wall-splitter-DhBTEpdG.js} +1 -1
  40. package/assets/{popup-toolbar-tKtYPGvw.js → popup-toolbar-BChsudwW.js} +7 -7
  41. package/assets/{prompt-utils-C_mjEqkz.js → prompt-utils-BX0pRV-Z.js} +1 -1
  42. package/assets/quick-creation-toolbar-3-AYFpEF.js +2 -0
  43. package/assets/{settings-dialog-DfK6bcBd.js → settings-dialog-Ccemaout.js} +1 -1
  44. package/assets/{size-picker-DvMt8S3Z.js → size-picker-DTrdjyLh.js} +1 -1
  45. package/assets/{skill-dsl-parser-CTM4hEIp.js → skill-dsl-parser-ZR--uu5h.js} +1 -1
  46. package/assets/{startup-app-9gZEGv85.js → startup-app-CH3QzBb4.js} +2 -2
  47. package/assets/{task-sync-D7bw59_K.js → task-sync-C5XXOQ5m.js} +1 -1
  48. package/assets/{tool-windows-BnDZa9FH.js → tool-windows-Bf_pMml-.js} +6 -6
  49. package/assets/ttd-dialog-CohjwODB.js +6 -0
  50. package/assets/{ttd-dialog-submit-shortcut-UfHT9Z9k.js → ttd-dialog-submit-shortcut-BVB8O_wE.js} +1 -1
  51. package/assets/{useCharacters-6u0Wuwt4.js → useCharacters-CFlPvydq.js} +1 -1
  52. package/assets/{useWorkflowSubmission-DTWha6Vn.js → useWorkflowSubmission-CKkOEcAT.js} +3 -3
  53. package/assets/{video-merge-webcodecs-Cwy2df91.js → video-merge-webcodecs-BInWo9HA.js} +2 -2
  54. package/assets/{video-recovery-service-CgZ3pA_1.js → video-recovery-service-DITdD0pC.js} +1 -1
  55. package/assets/{workflow-generation-utils-BPT49S-Z.js → workflow-generation-utils-e0nRpAgJ.js} +3 -3
  56. package/assets/{workflow-submission-service-C-6Uf9FA.js → workflow-submission-service-BqiL_5Cj.js} +3 -3
  57. package/changelog.json +105 -6
  58. package/idle-prefetch-manifest.json +136 -288
  59. package/manifest.json +3 -3
  60. package/package.json +1 -1
  61. package/precache-manifest.json +6 -6
  62. package/sw.js +1 -1
  63. package/version.json +63 -3
  64. package/.DS_Store +0 -0
  65. package/assets/ComicCreator-DjOhYrZt.js +0 -43
  66. package/assets/ai-chat-B-XdoWBQ.js +0 -2976
  67. package/assets/quick-creation-toolbar-CrQ0g0kO.js +0 -2
  68. package/assets/ttd-dialog-DS6KiOOa.js +0 -6
  69. package/assets/useMediaViewer-BrBFopM-.js +0 -1
  70. package/user-manual/gifs//346/200/235/347/273/264/345/257/274/345/233/276/345/210/233/345/273/272/346/274/224/347/244/272.gif +0 -0
  71. package/user-manual/screenshots/ai-step-0.png +0 -0
  72. package/user-manual/screenshots/ai-step-1.png +0 -0
  73. package/user-manual/screenshots/ai-step-2.png +0 -0
  74. package/user-manual/screenshots/ai-step-3.png +0 -0
  75. package/user-manual/screenshots/app-menu.png +0 -0
  76. package/user-manual/screenshots/backup-restore.png +0 -0
  77. package/user-manual/screenshots/canvas-tools.png +0 -0
  78. package/user-manual/screenshots/debug-panel.png +0 -0
  79. package/user-manual/screenshots/drawing-step-0.png +0 -0
  80. package/user-manual/screenshots/drawing-step-1.png +0 -0
  81. package/user-manual/screenshots/drawing-step-2.png +0 -0
  82. package/user-manual/screenshots/edit-selected.png +0 -0
  83. package/user-manual/screenshots/element-selected.png +0 -0
  84. package/user-manual/screenshots/flowchart-step-1.png +0 -0
  85. package/user-manual/screenshots/flowchart-step-2.png +0 -0
  86. package/user-manual/screenshots/flowchart-step-3.png +0 -0
  87. package/user-manual/screenshots/image-preview-empty.png +0 -0
  88. package/user-manual/screenshots/insert-from-library.png +0 -0
  89. package/user-manual/screenshots/insert-tools.png +0 -0
  90. package/user-manual/screenshots/inspiration-step-1.png +0 -0
  91. package/user-manual/screenshots/inspiration-step-2.png +0 -0
  92. package/user-manual/screenshots/media-library.png +0 -0
  93. package/user-manual/screenshots/mindmap-step-1.png +0 -0
  94. package/user-manual/screenshots/mindmap-step-2.png +0 -0
  95. package/user-manual/screenshots/mindmap-toolbar-menu.png +0 -0
  96. package/user-manual/screenshots/project-drawer.png +0 -0
  97. package/user-manual/screenshots/settings-dialog.png +0 -0
  98. package/user-manual/screenshots/shape-step-1.png +0 -0
  99. package/user-manual/screenshots/shape-step-2.png +0 -0
  100. package/user-manual/screenshots/text-step-1.png +0 -0
  101. package/user-manual/screenshots/text-step-2.png +0 -0
  102. package/user-manual/screenshots/toolbox-drawer.png +0 -0
  103. package/user-manual/screenshots/toolbox-entry.png +0 -0
  104. package/user-manual/screenshots/video-entry.png +0 -0
  105. package/user-manual/screenshots/view-navigation.png +0 -0
  106. package/user-manual/screenshots/zoom-menu.png +0 -0
@@ -1 +1 @@
1
- import{P as f,aD as h,oc as I,od as E,oe as x,of as M,og as S,oh as C,n8 as l,oi as H,nE as L,nD as O}from"./ai-chat-B-XdoWBQ.js";import{p as $}from"./tool-windows-BnDZa9FH.js";function Q(){const{completedTasks:t}=$(),r=f.useMemo(()=>t.filter(e=>{var o;return e.type===h.IMAGE&&((o=e.result)==null?void 0:o.url)}).map(e=>({id:e.id,type:"image",prompt:e.params.prompt,timestamp:e.completedAt||e.createdAt,imageUrl:e.result.url,width:e.result.width||1024,height:e.result.height||1024,uploadedImages:e.params.uploadedImages})).sort((e,o)=>o.timestamp-e.timestamp),[t]),s=f.useMemo(()=>t.filter(e=>{var o;return e.type===h.VIDEO&&((o=e.result)==null?void 0:o.url)}).map(e=>({id:e.id,type:"video",prompt:e.params.prompt,timestamp:e.completedAt||e.createdAt,imageUrl:e.result.thumbnailUrl||e.result.url,width:e.result.width||400,height:e.result.height||225,duration:e.result.duration,previewUrl:e.result.url,downloadUrl:e.result.url,uploadedImage:e.params.uploadedImage})).sort((e,o)=>o.timestamp-e.timestamp),[t]),n=f.useMemo(()=>[...r,...s].sort((e,o)=>o.timestamp-e.timestamp),[r,s]);return{imageHistory:r,videoHistory:s,allHistory:n}}function G(t){return t.map(r=>l.resolveContent(r.prompt)).filter(r=>r.length>0).filter((r,s,n)=>n.indexOf(r)===s)}function A(t){return t.filter((r,s,n)=>n.indexOf(r)===s)}function U(t){return t.reduce((r,s)=>{var p,i;const n=s.content.trim();if(!n)return r;const e={...s,content:n,previewExamples:(p=s.previewExamples)==null?void 0:p.slice(0,3)},o=r.get(n);return o?(r.set(n,{...o,historyId:o.historyId||e.historyId,previewExamples:(i=o.previewExamples)!=null&&i.length?o.previewExamples:e.previewExamples}),r):(r.set(n,e),r)},new Map)}function v(t,r,s=[]){const n=U(s);return l.sortPrompts(t,A(r.map(o=>l.resolveContent(o)).filter(Boolean))).map((o,p)=>{var c,u;const i=n.get(o),d=(u=(c=l).resolveMetadata)==null?void 0:u.call(c,o),m=(d==null?void 0:d.content)||o;return{id:(i==null?void 0:i.historyId)||`${t}-prompt-${p}-${o.slice(0,24)}`,content:o,title:d==null?void 0:d.title,tags:d==null?void 0:d.tags,sentPrompt:m,pinned:l.isPinned(t,o),modelType:t,historyId:i==null?void 0:i.historyId,previewExamples:i==null?void 0:i.previewExamples}})}function P(t,r){return H(t,r).map(s=>({content:s}))}function B(t){return t.map(r=>({content:l.resolveContent(r.content),historyId:r.id})).filter(r=>r.content.length>0)}function D(t,r,s){return t==="video"&&"previewUrl"in r&&typeof r.previewUrl=="string"?{kind:"video",src:r.previewUrl||r.downloadUrl||r.imageUrl,posterSrc:r.imageUrl,playable:!0,alt:s}:{kind:"image",src:r.imageUrl,alt:s}}function a(t,r){const s=new Map,n=[];return r.forEach(e=>{const o=l.resolveContent(e.prompt);if(!o)return;s.has(o)||(s.set(o,[]),n.push(o));const p=s.get(o);if(!p)return;const i=t==="video"&&"previewUrl"in e&&typeof e.previewUrl=="string"&&(e.previewUrl||e.downloadUrl)||e.imageUrl;p.length>=3||p.some(d=>d.src===i)||p.push(D(t,e,t==="image"?`Generated image example ${p.length+1}`:`Generated video example ${p.length+1}`))}),n.map(e=>({content:e,previewExamples:s.get(e)}))}function w(t){return t.map(r=>({content:l.resolveContent(r)})).filter(r=>r.content.length>0)}function R(t){return(typeof l.getHistory=="function"?l.getHistory():[]).filter(s=>{var e,o;const n=(o=(e=l).resolveMetadata)==null?void 0:o.call(e,s.content);return s.modelType===t||(n==null?void 0:n.modelType)===t}).map(s=>l.resolveContent(s.content)).filter(Boolean)}function V({generationType:t,promptContents:r,imageHistory:s,videoHistory:n}){const e=U(t==="video"?a(t,n):a(t,s));return r.reduce((o,p)=>{var i;return o.set(p,((i=e.get(p.trim()))==null?void 0:i.previewExamples)??[]),o},new Map)}function T({generationType:t,language:r,promptContents:s,imageHistory:n,videoHistory:e}){const o=l.sortPrompts(t,s.map(i=>l.resolveContent(i)).filter(Boolean)),p=V({generationType:t,promptContents:o,imageHistory:n,videoHistory:e});return o.map((i,d)=>{var u,g;const m=(g=(u=l).resolveMetadata)==null?void 0:g.call(u,i),c=(m==null?void 0:m.content)||i;return{id:`preset-${d}-${i.slice(0,20)}`,content:i,title:m==null?void 0:m.title,tags:m==null?void 0:m.tags,sentPrompt:c,pinned:l.isPinned(t,i),modelType:t,previewExamples:[...p.get(i)??[]]}})}const y=(t,r,s)=>{const n=t==="image"?M(r):S(r),e=G(s),o=R(t),p=t==="video"?I():E();return[...[...o,...p,...e].filter((m,c,u)=>u.indexOf(m)===c).slice(0,x),...n].filter((m,c,u)=>u.indexOf(m)===c).slice(0,C)},z=({generationType:t,language:r,aiInputHistory:s,imageHistory:n,videoHistory:e})=>{if(t==="image"){const i=[...w(E()),...a("image",n),...P("image",r)];return v("image",y("image",r,n),i)}if(t==="video"){const i=[...w(I()),...P("video",r),...a("video",e)];return v("video",y("video",r,e),i)}const o=s.filter(i=>i.modelType===t&&i.content.trim().length>0),p=[...B(o),...P(t,r)];return v(t,p.map(i=>i.content),p)},F=(t,r,s)=>{!r||!r.trim()||(t==="video"?L(r.trim()):O(r.trim()))};export{z as a,y as g,T as r,F as s,Q as u};
1
+ import{P as f,aD as h,oc as I,od as E,oe as x,of as M,og as S,oh as C,n8 as l,oi as H,nE as L,nD as O}from"./ai-chat-BnWVpTEI.js";import{p as $}from"./tool-windows-Bf_pMml-.js";function Q(){const{completedTasks:t}=$(),r=f.useMemo(()=>t.filter(e=>{var o;return e.type===h.IMAGE&&((o=e.result)==null?void 0:o.url)}).map(e=>({id:e.id,type:"image",prompt:e.params.prompt,timestamp:e.completedAt||e.createdAt,imageUrl:e.result.url,width:e.result.width||1024,height:e.result.height||1024,uploadedImages:e.params.uploadedImages})).sort((e,o)=>o.timestamp-e.timestamp),[t]),s=f.useMemo(()=>t.filter(e=>{var o;return e.type===h.VIDEO&&((o=e.result)==null?void 0:o.url)}).map(e=>({id:e.id,type:"video",prompt:e.params.prompt,timestamp:e.completedAt||e.createdAt,imageUrl:e.result.thumbnailUrl||e.result.url,width:e.result.width||400,height:e.result.height||225,duration:e.result.duration,previewUrl:e.result.url,downloadUrl:e.result.url,uploadedImage:e.params.uploadedImage})).sort((e,o)=>o.timestamp-e.timestamp),[t]),n=f.useMemo(()=>[...r,...s].sort((e,o)=>o.timestamp-e.timestamp),[r,s]);return{imageHistory:r,videoHistory:s,allHistory:n}}function G(t){return t.map(r=>l.resolveContent(r.prompt)).filter(r=>r.length>0).filter((r,s,n)=>n.indexOf(r)===s)}function A(t){return t.filter((r,s,n)=>n.indexOf(r)===s)}function U(t){return t.reduce((r,s)=>{var p,i;const n=s.content.trim();if(!n)return r;const e={...s,content:n,previewExamples:(p=s.previewExamples)==null?void 0:p.slice(0,3)},o=r.get(n);return o?(r.set(n,{...o,historyId:o.historyId||e.historyId,previewExamples:(i=o.previewExamples)!=null&&i.length?o.previewExamples:e.previewExamples}),r):(r.set(n,e),r)},new Map)}function v(t,r,s=[]){const n=U(s);return l.sortPrompts(t,A(r.map(o=>l.resolveContent(o)).filter(Boolean))).map((o,p)=>{var c,u;const i=n.get(o),d=(u=(c=l).resolveMetadata)==null?void 0:u.call(c,o),m=(d==null?void 0:d.content)||o;return{id:(i==null?void 0:i.historyId)||`${t}-prompt-${p}-${o.slice(0,24)}`,content:o,title:d==null?void 0:d.title,tags:d==null?void 0:d.tags,sentPrompt:m,pinned:l.isPinned(t,o),modelType:t,historyId:i==null?void 0:i.historyId,previewExamples:i==null?void 0:i.previewExamples}})}function P(t,r){return H(t,r).map(s=>({content:s}))}function B(t){return t.map(r=>({content:l.resolveContent(r.content),historyId:r.id})).filter(r=>r.content.length>0)}function D(t,r,s){return t==="video"&&"previewUrl"in r&&typeof r.previewUrl=="string"?{kind:"video",src:r.previewUrl||r.downloadUrl||r.imageUrl,posterSrc:r.imageUrl,playable:!0,alt:s}:{kind:"image",src:r.imageUrl,alt:s}}function a(t,r){const s=new Map,n=[];return r.forEach(e=>{const o=l.resolveContent(e.prompt);if(!o)return;s.has(o)||(s.set(o,[]),n.push(o));const p=s.get(o);if(!p)return;const i=t==="video"&&"previewUrl"in e&&typeof e.previewUrl=="string"&&(e.previewUrl||e.downloadUrl)||e.imageUrl;p.length>=3||p.some(d=>d.src===i)||p.push(D(t,e,t==="image"?`Generated image example ${p.length+1}`:`Generated video example ${p.length+1}`))}),n.map(e=>({content:e,previewExamples:s.get(e)}))}function w(t){return t.map(r=>({content:l.resolveContent(r)})).filter(r=>r.content.length>0)}function R(t){return(typeof l.getHistory=="function"?l.getHistory():[]).filter(s=>{var e,o;const n=(o=(e=l).resolveMetadata)==null?void 0:o.call(e,s.content);return s.modelType===t||(n==null?void 0:n.modelType)===t}).map(s=>l.resolveContent(s.content)).filter(Boolean)}function V({generationType:t,promptContents:r,imageHistory:s,videoHistory:n}){const e=U(t==="video"?a(t,n):a(t,s));return r.reduce((o,p)=>{var i;return o.set(p,((i=e.get(p.trim()))==null?void 0:i.previewExamples)??[]),o},new Map)}function T({generationType:t,language:r,promptContents:s,imageHistory:n,videoHistory:e}){const o=l.sortPrompts(t,s.map(i=>l.resolveContent(i)).filter(Boolean)),p=V({generationType:t,promptContents:o,imageHistory:n,videoHistory:e});return o.map((i,d)=>{var u,g;const m=(g=(u=l).resolveMetadata)==null?void 0:g.call(u,i),c=(m==null?void 0:m.content)||i;return{id:`preset-${d}-${i.slice(0,20)}`,content:i,title:m==null?void 0:m.title,tags:m==null?void 0:m.tags,sentPrompt:c,pinned:l.isPinned(t,i),modelType:t,previewExamples:[...p.get(i)??[]]}})}const y=(t,r,s)=>{const n=t==="image"?M(r):S(r),e=G(s),o=R(t),p=t==="video"?I():E();return[...[...o,...p,...e].filter((m,c,u)=>u.indexOf(m)===c).slice(0,x),...n].filter((m,c,u)=>u.indexOf(m)===c).slice(0,C)},z=({generationType:t,language:r,aiInputHistory:s,imageHistory:n,videoHistory:e})=>{if(t==="image"){const i=[...w(E()),...a("image",n),...P("image",r)];return v("image",y("image",r,n),i)}if(t==="video"){const i=[...w(I()),...P("video",r),...a("video",e)];return v("video",y("video",r,e),i)}const o=s.filter(i=>i.modelType===t&&i.content.trim().length>0),p=[...B(o),...P(t,r)];return v(t,p.map(i=>i.content),p)},F=(t,r,s)=>{!r||!r.trim()||(t==="video"?L(r.trim()):O(r.trim()))};export{z as a,y as g,T as r,F as s,Q as u};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css"])))=>i.map(i=>d[i]);
2
+ import{_ as Z}from"./startup-runtime-BrfuwjQS.js";import{cm as W,dI as J,bd as K,P as c,mz as ee,mA as te,mB as ae,mC as re,dP as oe,a8 as t,iq as ne,iS as ie,iP as se,f6 as le,dX as ce,iR as de,iQ as ue,iT as pe,eI as D,i5 as me,i6 as fe,dQ as k,dR as w,bl as f,i7 as he,dV as be,gt as F,gs as R,cO as h,aY as Ie,ao as y,b9 as ge,ba as Pe,bb as Te,n7 as xe,aS as ke}from"./ai-chat-BnWVpTEI.js";import{g as ye,I as ve,S as _e,t as S,F as Ee,A as we,v as Se}from"./bootstrap-CQRLkOtk.js";import{c as g,k as Me,o as je}from"./tool-windows-Bf_pMml-.js";import"./startup-app-CH3QzBb4.js";const Ae=c.lazy(()=>Z(()=>import("./ai-chat-BnWVpTEI.js").then(u=>u.s_),__vite__mapDeps([0]),import.meta.url).then(u=>({default:u.MediaLibraryModal}))),De=({position:u,visible:b,onClose:s,onOpenMediaLibrary:M})=>{const r=ye(),{t:l}=W(),p=J(),q=K.getBoardContainer(r),[j,A]=c.useState({freehand:!1,arrow:!1,shape:!1}),[L,P]=c.useState(!1),{refs:v,floatingStyles:N}=ee({placement:"bottom",middleware:[te(12),ae({padding:16}),re({fallbackPlacements:["top","right","left"]})]});c.useEffect(()=>{if(u&&b){const[e,o]=u;v.setPositionReference({getBoundingClientRect(){return{width:1,height:1,x:e,y:o,top:o,left:e,right:e+1,bottom:o+1}}})}},[u,b,v]),c.useEffect(()=>{if(!b)return;const e=i=>{const n=i.target,m=n.closest(".quick-creation-toolbar"),x=n.closest(".quick-toolbar-popover")||n.closest("[data-radix-popper-content-wrapper]")||n.closest(".plait-popover")||n.closest(".shape-picker")||n.closest(".arrow-picker")||n.closest(".freehand-panel"),a=n.closest(".media-library-modal");!m&&!x&&!a&&s()},o=setTimeout(()=>{document.addEventListener("mousedown",e)},100);return()=>{clearTimeout(o),document.removeEventListener("mousedown",e)}},[b,s]);const d=()=>{A({freehand:!1,arrow:!1,shape:!1})},C=e=>{A({freehand:!1,arrow:!1,shape:!1,[e]:!0})},V=()=>{d(),S(r),k(r,null),f.updatePointerType(r,F.text),p(F.text),s()},z=()=>{d(),S(r),k(r,w.dnd),f.updatePointerType(r,R.mind),p(R.mind),s()},G=()=>{d(),Me(r),s()},O=async e=>{try{e.type===h.IMAGE?await ge(r,e.url):e.type===h.VIDEO?await Pe(r,e.url):e.type===h.AUDIO&&await Te(r,e.url,{title:e.name,duration:e.duration,previewImageUrl:e.thumbnail,prompt:e.prompt,mv:e.modelName,clipId:e.clipId,providerTaskId:e.providerTaskId}),y.success(l("toolbar.assetInserted")||"素材已插入到画板"),P(!1),s()}catch(o){console.error("Failed to insert asset:",o),y.error(l("toolbar.assetInsertFailed")||"插入素材失败")}},H=e=>new Promise(o=>{const i=new Image;i.onload=()=>{const n=xe(i.naturalWidth,i.naturalHeight,ke.MEDIA_MAX_SIZE);o(n)},i.onerror=()=>o({width:400,height:400}),i.src=e}),U=async e=>{var m,x;if(e.length===0)return;const o=new Map,i=e.filter(a=>a.type===h.IMAGE);if(i.length>0){const a=await Promise.all(i.map(E=>H(E.url)));i.forEach((E,$)=>o.set(E.url,a[$]))}Ie("[CanvasInsertion][Toolbar] batch assets begin",{source:"quick-creation-toolbar",strategy:"shared-batch-layout",assetsCount:e.length,assetTypes:e.map(a=>a.type),zoom:((m=r==null?void 0:r.viewport)==null?void 0:m.zoom)||1});const n=await je({items:e.map(a=>a.type===h.IMAGE?{type:"image",content:a.url,dimensions:o.get(a.url)}:a.type===h.VIDEO?{type:"video",content:a.url}:{type:"audio",content:a.url,metadata:{title:a.name,duration:a.duration,previewImageUrl:a.thumbnail,prompt:a.prompt,mv:a.modelName,clipId:a.clipId,providerTaskId:a.providerTaskId}}),horizontalGap:30,verticalGap:40});if(n.success){const a=((x=n.data)==null?void 0:x.insertedCount)??e.length;y.success(`已成功插入 ${a} 个素材到画板`)}else y.error(n.error||"插入素材失败");P(!1),s()},Q=()=>{if(d(),M){M({mode:D.SELECT,onSelect:O,onSelectMultiple:U,selectButtonText:l("toolbar.insert")||"插入",batchSelectButtonText:"批量插入画布"}),s();return}P(!0)},[B,X]=c.useState(oe.feltTipPen),Y=300,T=c.useRef(null),I=c.useCallback(()=>{T.current&&(clearTimeout(T.current),T.current=null)},[]);c.useEffect(()=>()=>{I()},[I]);const _=(e,o,i,n)=>t.jsxs(me,{open:j[o],sideOffset:12,onOpenChange:m=>{m||d()},placement:"bottom",children:[t.jsx(fe,{asChild:!0,children:t.jsx("div",{onPointerEnter:()=>{I(),T.current=setTimeout(()=>{C(o)},Y)},onPointerLeave:()=>{I()},children:t.jsx(g,{type:"icon",visible:!0,selected:j[o],icon:e,"aria-label":i,"data-track":`quick_toolbar_click_${o}`,onPointerDown:()=>{I(),C(o),S(r),o==="freehand"&&(k(r,w.dnd),f.updatePointerType(r,B),p(B))},onPointerUp:()=>{o==="freehand"&&k(r,w.drawing)}})})}),t.jsx(he,{container:q,style:{zIndex:be.POPOVER},className:"quick-toolbar-popover",children:n})]});return b?t.jsxs(t.Fragment,{children:[t.jsx(ve,{padding:1,className:`quick-creation-toolbar ${ne}`,ref:v.setFloating,style:N,children:t.jsxs(_e.Row,{gap:1,children:[t.jsx(g,{type:"icon",visible:!0,icon:t.jsx(ie,{}),"aria-label":l("toolbar.text"),"data-track":"quick_toolbar_click_text",onPointerUp:V}),t.jsx(g,{type:"icon",visible:!0,icon:t.jsx(se,{size:24}),"aria-label":l("toolbar.image"),"data-track":"quick_toolbar_click_image",onPointerUp:G}),t.jsx(g,{type:"icon",visible:!0,icon:t.jsx(le,{}),"aria-label":l("toolbar.mediaLibrary"),"data-track":"quick_toolbar_click_media_library",onPointerUp:Q}),_(t.jsx(ce,{}),"freehand",l("toolbar.pen"),t.jsx(Ee,{onPointerUp:e=>{d(),X(e),f.updatePointerType(r,e),p(e),s()}})),_(t.jsx(de,{}),"arrow",l("toolbar.arrow"),t.jsx(we,{onPointerUp:e=>{d(),f.updatePointerType(r,e),p(e),s()}})),_(t.jsx(ue,{}),"shape",l("toolbar.shape"),t.jsx(Se,{onPointerUp:e=>{d(),f.updatePointerType(r,e),p(e),s()}})),t.jsx(g,{type:"icon",visible:!0,icon:t.jsx(pe,{}),"aria-label":l("toolbar.mind"),"data-track":"quick_toolbar_click_mind",onPointerUp:z})]})}),L&&t.jsx(c.Suspense,{fallback:null,children:t.jsx(Ae,{isOpen:L,onClose:()=>{P(!1)},mode:D.SELECT,onSelect:O,onSelectMultiple:U,selectButtonText:l("toolbar.insert")||"插入",batchSelectButtonText:"批量插入画布"})})]}):null};export{De as QuickCreationToolbar};
@@ -1 +1 @@
1
- import{oj as Ks,ok as Ve,ol as St,P as u,om as Ct,a8 as e,gc as wt,gd as Et,gz as Gs,d0 as Bs,on as Fs,oo as Ws,gy as Zs,eB as At,ab as J,op as Hs,R as kt,oq as Dt,or as Tt,dD as Ps,ao as Y,fx as Ot,os as Ys,el as Rt,ep as Ut,gA as zt,ot as z,ou as ie,ov as Lt,ow as Re,ox as Ie,o9 as Me,aE as Ae,aM as fe,aG as me,aN as _e,aO as ue,c6 as Ue,bP as T,eq as Vt,c3 as Ss,gC as $t,oy as Kt,oz as Gt,oA as Bt,oB as Ft,mN as Wt,oC as Pe,oD as De,oE as he,gr as Qe,oF as Cs,oG as qe,oH as ze,oI as Zt,c2 as Ht,oJ as Yt,oK as Qt,cv as qt,oL as Xe,oM as W,et as pe,fF as Xt,oN as Jt,f2 as ei,oO as si,oP as ti,oQ as ii,oR as ai,oS as ni,oT as oi}from"./ai-chat-B-XdoWBQ.js";import{oU as Hi,oV as Yi}from"./ai-chat-B-XdoWBQ.js";import{as as li}from"./tool-windows-BnDZa9FH.js";import{o as di}from"./model-benchmark-launcher-uYoranwQ.js";import"./startup-runtime-BrfuwjQS.js";const ws={all:"全部",image:"图片",video:"视频",audio:"音频",text:"文本"},ri={image:"图片",video:"视频",audio:"音频",text:"文本"},ci={image:"图",video:"视",audio:"音",text:"文"},Es=["text","image","video","audio"];function gi(t,a){const n=a.trim().toLowerCase();return n?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ve(t.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(n)):!0}function mi(t){return St(t)}function As(t,a){const n=new Map;for(const b of t){const y=n.get(b.vendor)||{vendor:b.vendor,models:[],counts:{image:0,video:0,audio:0,text:0},selectedCount:0};y.models.push(b),y.counts[b.type]+=1,a.has(b.id)&&(y.selectedCount+=1),n.set(b.vendor,y)}const g=new Map(Ks.map((b,y)=>[b,y]));return Array.from(n.values()).sort((b,y)=>{const K=g.get(b.vendor)??Number.MAX_SAFE_INTEGER,Q=g.get(y.vendor)??Number.MAX_SAFE_INTEGER;return K!==Q?K-Q:y.models.length-b.models.length})}function _i(t){return["image","video","audio","text"].filter(a=>t.counts[a]>0).map(a=>({type:a,models:mi(t.models.filter(n=>n.type===a))})).sort((a,n)=>n.models.length!==a.models.length?n.models.length-a.models.length:Es.indexOf(a.type)-Es.indexOf(n.type))}const ui=({open:t,container:a,models:n,selectedModelIds:g,onClose:b,onConfirm:y,onTestModel:K})=>{const[Q,ve]=u.useState(""),[ee,ye]=u.useState("all"),[G,P]=u.useState(g),[k,$]=u.useState({});u.useEffect(()=>{var R,H;if(!t)return;ve(""),ye("all"),P(g);const c=new Set(g),M=As(n,c),j=((R=M.find(B=>B.selectedCount>0))==null?void 0:R.vendor)||((H=M[0])==null?void 0:H.vendor)||null,A={};M.forEach(B=>{A[B.vendor]=B.vendor===j}),$(A)},[n,t,g]);const ne=u.useMemo(()=>({all:n.length,image:n.filter(c=>c.type==="image").length,video:n.filter(c=>c.type==="video").length,audio:n.filter(c=>c.type==="audio").length,text:n.filter(c=>c.type==="text").length}),[n]),F=u.useMemo(()=>{const c=Q.trim(),M=ee==="all"?n:n.filter(j=>j.type===ee);return c?M.filter(j=>gi(j,c)):M},[ee,n,Q]),f=u.useMemo(()=>new Set(G),[G]),O=u.useMemo(()=>As(F,f),[f,F]),w=G.length,Z=u.useMemo(()=>({image:n.filter(c=>c.type==="image"&&f.has(c.id)).length,video:n.filter(c=>c.type==="video"&&f.has(c.id)).length,text:n.filter(c=>c.type==="text"&&f.has(c.id)).length}),[n,f]),oe=F.length>0&&F.every(c=>f.has(c.id)),se=u.useMemo(()=>n.filter(c=>Ct(c.id)).map(c=>c.id),[n]),Se=se.length>0&&se.every(c=>f.has(c));u.useEffect(()=>{O.length===0||O.some(j=>k[j.vendor])||!Object.values(k).some(Boolean)||$(O.reduce((j,A,R)=>(j[A.vendor]=R===0,j),{}))},[k,O]);const Ce=c=>{P(M=>M.includes(c)?M.filter(j=>j!==c):[...M,c])},be=()=>{const c=F.map(j=>j.id),M=c.every(j=>f.has(j));P(j=>M?j.filter(A=>!c.includes(A)):Array.from(new Set([...j,...c])))},we=()=>{P(c=>Array.from(new Set([...c,...se])))},le=c=>{$(M=>{const j=!M[c],A={};return O.forEach(R=>{A[R.vendor]=R.vendor===c?j:!1}),A})};return e.jsx(wt,{open:t,onOpenChange:c=>!c&&b(),children:e.jsxs(Et,{className:"model-discovery-dialog",container:a,"data-testid":"model-discovery-dialog",children:[e.jsxs("div",{className:"model-discovery-dialog__header",children:[e.jsxs("div",{className:"model-discovery-dialog__headline",children:[e.jsx("h3",{className:"model-discovery-dialog__title",children:"获取模型"}),e.jsxs("div",{className:"model-discovery-dialog__header-stats",children:[e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["已发现 ",n.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["品牌 ",O.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill model-discovery-dialog__header-pill--accent",children:["已选 ",w]})]})]}),e.jsx("button",{type:"button",className:"model-discovery-dialog__close",onClick:b,"aria-label":"关闭",children:e.jsx(Gs,{size:18})})]}),e.jsx("div",{className:"model-discovery-dialog__toolbar",children:e.jsxs("label",{className:"model-discovery-dialog__search",children:[e.jsx(Bs,{size:16}),e.jsx("input",{type:"text",value:Q,onChange:c=>ve(c.target.value),placeholder:"搜索模型名称、ID 或品牌"})]})}),e.jsx("div",{className:"model-discovery-dialog__type-tabs",children:Object.keys(ws).map(c=>{const M=ee===c;return e.jsxs("button",{type:"button",className:`model-discovery-dialog__type-tab ${M?"model-discovery-dialog__type-tab--active":""}`,onClick:()=>ye(c),children:[e.jsx("span",{children:ws[c]}),e.jsx("span",{className:"model-discovery-dialog__type-tab-count",children:ne[c]})]},c)})}),e.jsx("div",{className:"model-discovery-dialog__body",children:O.length===0?e.jsx("div",{className:"model-discovery-dialog__empty",children:Q.trim()?"没有匹配的模型":"暂无模型"}):e.jsx("div",{className:"model-discovery-dialog__group-list",children:O.map(c=>{const M=Fs(c.vendor),j=_i(c),A=!!k[c.vendor];return e.jsxs("section",{className:`model-discovery-dialog__vendor-group ${A?"model-discovery-dialog__vendor-group--expanded":""}`,style:{"--vendor-accent":M.accent,"--vendor-surface":M.surface,"--vendor-border":M.border},children:[e.jsxs("button",{type:"button",className:"model-discovery-dialog__vendor-header",onClick:()=>le(c.vendor),children:[e.jsxs("div",{className:"model-discovery-dialog__vendor-main",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-logo-shell",children:e.jsx(Ws,{vendor:c.vendor,size:22})}),e.jsxs("div",{className:"model-discovery-dialog__vendor-copy",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-name",children:Ve(c.vendor)}),e.jsx("div",{className:"model-discovery-dialog__vendor-meta",children:j.map(({type:R,models:H})=>e.jsxs("span",{className:"model-discovery-dialog__vendor-meta-pill",children:[ci[R]," ",H.length]},`${c.vendor}-${R}`))})]})]}),e.jsx("span",{className:"model-discovery-dialog__vendor-spacer"}),e.jsxs("div",{className:"model-discovery-dialog__vendor-side",children:[c.selectedCount>0?e.jsxs("span",{className:"model-discovery-dialog__vendor-selected",children:["已选 ",c.selectedCount]}):null,e.jsx("span",{className:"model-discovery-dialog__vendor-count",children:c.models.length}),e.jsx("span",{className:`model-discovery-dialog__vendor-chevron ${A?"model-discovery-dialog__vendor-chevron--expanded":""}`,children:e.jsx(Zs,{size:16})})]})]}),A?e.jsx("div",{className:"model-discovery-dialog__vendor-body",children:j.map(({type:R,models:H})=>e.jsxs("div",{className:"model-discovery-dialog__type-section",children:[e.jsxs("div",{className:"model-discovery-dialog__type-section-header",children:[e.jsx("span",{className:"model-discovery-dialog__type-section-title",children:ri[R]}),e.jsx("span",{className:"model-discovery-dialog__type-section-count",children:H.length})]}),e.jsx("div",{className:"model-discovery-dialog__model-stack",children:H.map(B=>{const de=f.has(B.id);return e.jsxs("label",{className:`model-discovery-dialog__item ${de?"model-discovery-dialog__item--checked":""}`,children:[e.jsx("input",{type:"checkbox",className:"model-discovery-dialog__checkbox",checked:de,onChange:()=>Ce(B.id)}),e.jsx("span",{className:"model-discovery-dialog__checkmark",children:de?e.jsx(At,{size:12}):null}),e.jsx("div",{className:"model-discovery-dialog__item-body",children:e.jsx("div",{className:`model-discovery-dialog__item-id ${de?"model-discovery-dialog__item-id--checked":""}`,children:B.id})}),K?e.jsx(J,{content:"测试此模型",showArrow:!1,children:e.jsx("button",{type:"button",className:"model-discovery-dialog__item-test",onClick:xe=>{xe.preventDefault(),xe.stopPropagation(),K(B.id)},children:e.jsx(Hs,{size:13})})}):null]},B.id)})})]},`${c.vendor}-${R}`))}):null]},c.vendor)})})}),e.jsxs("div",{className:"model-discovery-dialog__footer",children:[e.jsxs("span",{className:"model-discovery-dialog__selection-count",children:["已选 ",w," 个 · 图 ",Z.image," / 视"," ",Z.video," / 文 ",Z.text]}),e.jsxs("div",{className:"model-discovery-dialog__footer-bulk",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:be,disabled:F.length===0,children:oe?"取消当前筛选":"全选"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:we,disabled:se.length===0||Se,children:"选中推荐模型"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button model-discovery-dialog__ghost-button--muted",onClick:()=>P([]),disabled:G.length===0,children:"清空"})]}),e.jsxs("div",{className:"model-discovery-dialog__actions",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--secondary",onClick:b,children:"取消"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--primary",onClick:()=>y(G),children:"添加模型"})]})]})]})})},hi=kt.memo(({profile:t,onUpdateProfile:a})=>{const[n,g]=u.useState(!1),b=Dt(t.id),y=Tt(t),K=(y==null?void 0:y.pricingUrl)||"",Q=(y==null?void 0:y.cnyPerUsd)??1,ve=(y==null?void 0:y.pricingGroup)||"default",ee=u.useCallback(async()=>{if(y){g(!0);try{await Ps.fetchAndCache(t.id,y.pricingUrl,t.apiKey,y.pricingGroup,y.cnyPerUsd,{force:!0,promoteToAutoRefresh:!0}),Y.success("价格信息已同步")}catch(P){Y.error(`获取价格失败: ${P instanceof Error?P.message:"未知错误"}`)}finally{g(!1)}}},[y,t.id,t.apiKey]),ye=u.useCallback(async P=>{const k=String(P);if(a($=>({...$,pricingGroup:k})),!!y){g(!0);try{await Ps.fetchAndCache(t.id,y.pricingUrl,t.apiKey,k,y.cnyPerUsd)}catch{}finally{g(!1)}}},[a,y,t.id,t.apiKey]),G=b.map(P=>({label:P.displayName||P.name,value:P.name}));return e.jsxs("div",{className:"settings-dialog__pricing-group",children:[e.jsxs("div",{className:"settings-dialog__pricing-row",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{flex:1,minWidth:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"模型价格 URL"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:K,onChange:P=>a(k=>({...k,pricingUrl:P.target.value})),placeholder:"如 https://api.tu-zi.com/api/pricing"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{width:110,flexShrink:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"¥/1USD"}),e.jsx("input",{type:"number",className:"settings-dialog__input",value:Q,step:.01,min:0,onChange:P=>a(k=>({...k,cnyPerUsd:parseFloat(P.target.value)||0}))})]})]}),e.jsxs("div",{className:"settings-dialog__pricing-row",children:[G.length>0?e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{flex:1,minWidth:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"当前分组"}),e.jsx(Ot,{value:ve,options:G,onChange:P=>ye(P),style:{width:"100%"}})]}):null,e.jsx("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",style:{alignSelf:"flex-end",height:32,flexShrink:0},onClick:ee,disabled:n||!K,children:n?"同步中":"获取价格"})]})]})});function pi(t,a){return{id:a,name:`供应商 ${t}`,iconUrl:"",homepageUrl:"",providerType:"openai-compatible",baseUrl:"",apiKey:"",authType:"bearer",imageApiCompatibility:Ys,enabled:!0,capabilities:{supportsModelsEndpoint:!0,supportsText:!0,supportsImage:!0,supportsVideo:!0,supportsAudio:!0,supportsTools:!0}}}const ks="aitu:settings:provider-nav",vi=980,xi=[{value:"providers",label:"供应商"},{value:"presets",label:"模型预设"},{value:"canvas",label:"画布显示"},{value:"speech",label:"语音播放"}],fi=["openai-compatible","gemini-compatible","custom"],yi=["auto","openai-gpt-image","tuzi-gpt-image","openai-compatible-basic"],Ds={image:"图片",video:"视频",audio:"音频",text:"文本"},bi={image:"图片模型",video:"视频模型",audio:"音频模型",text:"文本模型"},ji=u.memo(function({profileId:a,modelId:n}){const{summary:g,detail:b}=oi(a,n);return g?e.jsx(J,{content:b,placement:"top",disabled:b===g,children:e.jsx("span",{className:"settings-dialog__model-price",children:g})}):null}),Ni=u.memo(function({profileId:a,modelId:n}){const g=ni(a,n);return g!=null&&g.description?e.jsx(J,{content:g.description,placement:"top",children:e.jsx("span",{className:"settings-dialog__model-type-item-id settings-dialog__model-type-item-id--has-desc",children:n})}):e.jsx("span",{className:"settings-dialog__model-type-item-id",children:n})});function Ii(t,a,n,g){return a===0&&n===0?null:g===0&&n>0?`已清空 ${t} 的已添加模型`:a>0&&n>0?`已更新 ${t} 的模型(新增 ${a} 个,移除 ${n} 个)`:a>0?`已为 ${t} 添加 ${a} 个模型`:`已从 ${t} 移除 ${n} 个模型`}const Mi=["text","image","video","audio"],Je={"openai-compatible":{label:"OpenAI 兼容"},"gemini-compatible":{label:"Gemini 兼容"},custom:{label:"自定义接入"}},es={auto:{label:"自动"},"openai-gpt-image":{label:"OpenAI GPT Image"},"tuzi-gpt-image":{label:"Tuzi GPT 兼容"},"openai-compatible-basic":{label:"OpenAI-compatible 通用兼容(兜底)"}};function Pi(t){return t==="auto"||t==="openai-gpt-image"||t==="tuzi-gpt-image"||t==="openai-compatible-basic"?t:t==="tuzi-compatible"?"tuzi-gpt-image":"auto"}function Si(t){const a=t.baseUrl.trim().toLowerCase();return a.includes("api.openai.com")?"openai-gpt-image":a.includes(".tu-zi.com")?"tuzi-gpt-image":"openai-compatible-basic"}function Ci(t){const a=Pi(t.imageApiCompatibility);if(a==="auto"){const n=Si(t);return`默认推荐显式选择 OpenAI GPT Image;如果保留自动模式,GPT Image 模型当前会解析为 ${es[n].label}。`}return a==="openai-gpt-image"?"默认推荐模式。适用于官方 GPT Image 请求格式,也便于后续继续扩展官方图生图能力。":`同一个图片模型在不同 API Key 或网关下可能需要不同接口格式;当前已固定为 ${es[a].label}。`}const Ts=["amber","sky","mint","rose","violet"];function Os(t){return t.reduce((a,n)=>(a[n.type]+=1,a),{image:0,video:0,audio:0,text:0})}function wi(t,a){const n=a.trim().toLowerCase();return n?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ve(t.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(n)):!0}function Ei(t){const a=new Set,n=[];return t.forEach(g=>{const b=`${g.type}:${g.id}`;a.has(b)||(a.add(b),n.push(g))}),n}function Rs(t){return t?["image","video","audio","text"].filter(a=>!!W(t[a])).length:0}function Us(t,a){const n=a.find(g=>g.id===t.id);return n?Li(n,t)?"saved":"dirty":"new"}function Le(t){return JSON.stringify(t)}function Ai(t){return typeof t.iconUrl!="string"?null:t.iconUrl.trim()||null}function ki(t){const a=zs(t.homepageUrl);if(a)return a;try{const n=zs(t.baseUrl);return n?new URL(n).origin:null}catch{return null}}function zs(t){const a=typeof t=="string"?t.trim():"";if(!a)return null;try{return new URL(/^[a-z][a-z\d+\-.]*:\/\//i.test(a)?a:`https://${a}`).toString()}catch{return null}}function Di(t){var g;const a=t.trim();if(!a)return"供";const n=a.match(/[A-Za-z0-9]+/g);return n!=null&&n[0]?n[0][0].toUpperCase():((g=Array.from(a)[0])==null?void 0:g.toUpperCase())||"供"}function Ti(t){const a=Array.from(`${t.id}-${t.providerType}-${t.name}`).reduce((n,g,b)=>n+g.charCodeAt(0)*(b+1),0);return Ts[a%Ts.length]}function ae(t){return JSON.parse(JSON.stringify(t))}function ss(t){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function Ls(t){return pi(t,ss("profile"))}function Oi(){if(typeof window>"u")return null;const t=window.__aituPendingProviderNavigationIntent||null;return window.__aituPendingProviderNavigationIntent=void 0,t}function Vs(t){return"bearer"}function ke(t){return t===z||t===Kt||t===Gt||t===Bt||t===Ft}const $s=({profile:t,size:a="regular"})=>{const n=Ai(t),[g,b]=u.useState(n);u.useEffect(()=>{b(n)},[n]);const y=Ti(t),K=Di(t.name);return e.jsx("span",{className:`settings-dialog__provider-avatar settings-dialog__provider-avatar--${y} ${a==="large"?"settings-dialog__provider-avatar--large":""}`,"aria-hidden":"true",children:g?e.jsx("img",{src:g,alt:`${t.name} 图标`,className:"settings-dialog__provider-avatar-image",loading:"lazy",onError:()=>b(null)}):e.jsx("span",{className:"settings-dialog__provider-avatar-text",children:K})})};function Ri(t,a){return{id:ss("preset"),name:"新预设",text:he(pe(t,a.text||null)),image:he(pe(t,a.image||null)),video:he(pe(t,a.video||null)),audio:he(pe(t,a.audio||null))}}function Ui(t,a,n){const g=t[a],b=n.defaultModelRef!==void 0?n.defaultModelRef:pe(n.profileId!==void 0?n.profileId:De(g),n.defaultModelId!==void 0?n.defaultModelId:W(g));return{...t,[a]:he(b)}}function zi(t,a){const n={...t};return["image","video","audio","text"].forEach(g=>{De(n[g])===a&&(n[g]=he(null))}),n}function Li(t,a){return JSON.stringify(t)===JSON.stringify(a)}function Vi(t){return t.flatMap(({profile:a,models:n})=>n.map(g=>({...g,sourceProfileId:a.id,sourceProfileName:a.name,selectionKey:g.selectionKey||`${a.id}::${g.id}`})))}const Fi=({container:t})=>{const{appState:a,setAppState:n}=Rt(),{confirm:g,confirmDialog:b}=Ut({container:t}),{isMobile:y,viewportWidth:K,viewportHeight:Q}=zt(),ve=u.useRef(null),[ee,ye]=u.useState(0),[G,P]=u.useState("providers"),[k,$]=u.useState(z),[ne,F]=u.useState(ie),[f,O]=u.useState([]),[w,Z]=u.useState([]),[oe,se]=u.useState(ie),[Se,Ce]=u.useState([]),[be,we]=u.useState(""),[le,c]=u.useState(""),[M,j]=u.useState(""),[A,R]=u.useState(""),[H,B]=u.useState(!0),[de,xe]=u.useState(""),[ts,Te]=u.useState(!1),[Qs,$e]=u.useState(""),[is,as]=u.useState(!1),[qs,re]=u.useState("catalog"),[Xs,je]=u.useState("catalog"),[Js,et]=u.useState(new Set),[Oe,Ke]=u.useState(!1),st=s=>{et(i=>{const d=new Set(i);return d.has(s)?d.delete(s):d.add(s),d})},r=f.find(s=>s.id===k)||f[0]||null,tt=r?Ci(r):"同一个图片模型在不同 API Key 或网关下可能需要不同接口格式;不确定时使用自动。",U=w.find(s=>s.id===ne)||w[0]||null,L=Lt((r==null?void 0:r.id)||z),it=u.useDeferredValue(de),ns=Re(z,"image"),at=Re(z,"audio"),os=Re(z,"video"),ls=Re(z,"text"),nt=f.filter(s=>s.enabled),v=y||K<=vi,ds=v&&(ee>0?ee<600:K<600),Ge=!!r&&!!r.apiKey.trim(),ot=Le({profiles:f,presets:w,activePresetId:oe,audioModelName:be,imageModelName:le,videoModelName:M,textModelName:A,showWorkZoneCard:H}),rs=a.openSettings&&ot!==Qs;u.useEffect(()=>{Ke(!1)},[r==null?void 0:r.id]),u.useEffect(()=>{const s=ve.current;if(!s||typeof ResizeObserver>"u")return;const i=new ResizeObserver(d=>{var m;const o=(m=d[0])==null?void 0:m.contentRect.width;o&&ye(l=>Math.abs(l-o)<1?l:o)});return i.observe(s),()=>{i.disconnect()}},[a.openSettings]);const lt=s=>{T.trackUIInteraction({area:"settings",action:"view_changed",control:"settings_nav",value:s,source:"settings_dialog"}),P(s),v&&(s==="providers"&&re("catalog"),s==="presets"&&je("catalog"))},dt=s=>{T.trackUIInteraction({area:"settings",action:"provider_selected",control:"provider_list",source:"settings_dialog",metadata:{profileId:s,isManagedProfile:ke(s)}}),$(s),v&&re("detail")},rt=s=>{T.trackUIInteraction({area:"settings",action:"preset_selected",control:"preset_list",source:"settings_dialog",metadata:{presetId:s}}),F(s),v&&je("detail")},ct=()=>{try{return localStorage.getItem(Ue.WORKZONE_CARD_VISIBLE)!=="false"}catch{return!0}},Be=()=>{const s=ae(Ie.get()),i=ae(Me.get()),d=Me.getActivePresetId()||ie,o=Ae.get(),m=ct();Ce(s),$e(Le({profiles:s,presets:i,activePresetId:d,audioModelName:o.audioModelName||fe(),imageModelName:o.imageModelName||me(),videoModelName:o.videoModelName||_e(),textModelName:o.textModelName||ue(),showWorkZoneCard:m}))};u.useEffect(()=>{var h;if(!a.openSettings)return;Ke(!1);const s=ae(Ie.get()),i=ae(Me.get()),d=Me.getActivePresetId()||ie,o=Ae.get();let m=!0;const l=Oi(),_=(l==null?void 0:l.action)==="select"&&s.some(N=>N.id===l.profileId)?l.profileId:((h=s[0])==null?void 0:h.id)||z;O(s),Z(i),Ce(s),se(d),$(N=>{var I;return l?_:s.some(C=>C.id===N)?N:((I=s[0])==null?void 0:I.id)||z}),F(N=>{var I;return i.some(C=>C.id===N)?N:((I=i[0])==null?void 0:I.id)||ie}),we(o.audioModelName||fe()),c(o.imageModelName||me()),j(o.videoModelName||_e()),R(o.textModelName||ue());try{m=localStorage.getItem(Ue.WORKZONE_CARD_VISIBLE)!=="false"}catch{m=!0}B(m),P("providers"),re(l&&v?"detail":"catalog"),je("catalog"),xe(""),Te(!1),$e(Le({profiles:s,presets:i,activePresetId:d,audioModelName:o.audioModelName||fe(),imageModelName:o.imageModelName||me(),videoModelName:o.videoModelName||_e(),textModelName:o.textModelName||ue(),showWorkZoneCard:m})),(l==null?void 0:l.action)==="create"&&gs(l,s)},[a.openSettings]),u.useEffect(()=>{if(!k&&f[0]){$(f[0].id);return}k&&f.length>0&&!f.some(s=>s.id===k)&&$(f[0].id)},[f,k]),u.useEffect(()=>{if(!ne&&w[0]){F(w[0].id);return}ne&&w.length>0&&!w.some(s=>s.id===ne)&&F(w[0].id)},[w,ne]),u.useEffect(()=>{xe("")},[k,G]);const ce=(s,i)=>{O(d=>d.map(o=>o.id===s?i(o):o))},gt=(s,i)=>{Z(d=>d.map(o=>o.id===s?i(o):o))},cs=async(s,i)=>{var d,o;try{const m=Ae.get(),l=((d=s.find(S=>S.id===i))==null?void 0:d.id)||((o=s[0])==null?void 0:o.id)||ie,_=s.find(S=>S.id===l)||s[0]||null,h=W(_==null?void 0:_.audio)||m.audioModelName||fe(),N=W(_==null?void 0:_.image)||m.imageModelName||me(),I=W(_==null?void 0:_.video)||m.videoModelName||_e(),C=W(_==null?void 0:_.text)||m.textModelName||m.chatModel||ue();return await Me.update(ae(s)),await Me.setActivePresetId(l),await Ae.update({audioModelName:h,imageModelName:N,videoModelName:I,textModelName:C,chatModel:C}),Z(s),se(l),we(h),c(N),j(I),R(C),Be(),!0}catch(m){return console.error("Failed to persist preset configuration:",m),Y.error("预设保存失败,请重试"),!1}},mt=async(s,i)=>{if(T.trackUIInteraction({area:"settings",action:"provider_enabled_changed",control:"provider_enabled_switch",value:i,source:"settings_dialog",metadata:{profileId:s,isManagedProfile:ke(s)}}),O(d=>d.map(o=>o.id===s?{...o,enabled:i}:o)),!!Se.some(d=>d.id===s))try{await Ie.update(ae(Ie.get()).map(d=>d.id===s?{...d,enabled:i}:d)),Be()}catch(d){console.error("Failed to persist provider enabled state:",d),O(o=>o.map(m=>m.id===s?{...m,enabled:!i}:m)),Y.error("供应商状态保存失败,请重试")}},_t=async s=>{T.trackUIInteraction({area:"settings",action:"workzone_card_visibility_changed",control:"workzone_card_switch",value:s,source:"settings_dialog"}),B(s);try{localStorage.setItem(Ue.WORKZONE_CARD_VISIBLE,String(s)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed")),Be()}catch(i){console.error("Failed to persist canvas visibility state:",i),B(!s),Y.error("画布显示配置保存失败,请重试")}},gs=(s,i)=>{var l;const d=i||f;if(P("providers"),v&&re("detail"),s.action==="select"){const _=d.some(h=>h.id===s.profileId)?s.profileId:((l=d[d.length-1])==null?void 0:l.id)||z;return $(_),d}const o=Ls(d.length+1),m=[...d,o];return O(m),$(o.id),m},ms=()=>{const s=Ls(f.length+1);T.trackUIInteraction({area:"settings",action:"provider_added",control:"add_provider",source:"settings_dialog",metadata:{profilesCount:f.length+1}}),O(i=>[...i,s]),$(s.id),P("providers"),v&&re("detail")};u.useEffect(()=>{if(!a.openSettings)return;const s=i=>{const d=i.detail;d&&gs(d)};return window.addEventListener(ks,s),()=>{window.removeEventListener(ks,s)}},[a.openSettings,v,f]);const _s=async s=>{var m;if(ke(s))return;const i=f.find(l=>l.id===s);if(!await g({title:"确认删除供应商",description:`确定要删除供应商「${(i==null?void 0:i.name)||"未命名供应商"}」吗?相关预设里的路由会被清空。`,confirmText:"删除",cancelText:"取消",danger:!0}))return;T.trackUIInteraction({area:"settings",action:"provider_deleted",control:"delete_provider",source:"settings_dialog",metadata:{profileId:s,profilesCount:Math.max(0,f.length-1)}});const o=f.filter(l=>l.id!==s);O(o),Z(l=>l.map(_=>zi(_,s))),k===s&&$(((m=o[0])==null?void 0:m.id)||z),v&&re("catalog")},us=u.useCallback(s=>{const i=f.find(o=>o.id===s);if(!i)return;const d={...ae(i),id:ss("profile"),name:`${i.name} (副本)`};O(o=>[...o,d]),T.trackUIInteraction({area:"settings",action:"provider_cloned",control:"clone_provider",source:"settings_dialog",metadata:{profileId:s,clonedProfileId:d.id,profilesCount:f.length+1}}),$(d.id),P("providers"),v&&re("detail")},[f,v]),Fe=Vt(),ut=u.useCallback(s=>{const i=[{key:"clone",label:"克隆",icon:e.jsx(Wt,{size:14}),onSelect:us}];return ke(s)||i.push({key:"divider",type:"divider"},{key:"delete",label:"删除",icon:e.jsx(Ss,{size:14}),danger:!0,onSelect:_s}),i},[us]),hs=()=>{var d;const s=((d=nt[0])==null?void 0:d.id)||null,i=Ri(s,{audio:be||fe(),image:le||me(),video:M||_e(),text:A||ue()});Z(o=>[...o,i]),T.trackUIInteraction({area:"settings",action:"preset_added",control:"add_preset",source:"settings_dialog",metadata:{presetId:i.id,presetsCount:w.length+1,hasFallbackProfile:!!s}}),F(i.id),P("presets"),v&&je("detail")},ht=async s=>{var m,l;if(w.length<=1)return;const i=w.find(_=>_.id===s);if(!await g({title:"确认删除预设",description:`确定要删除预设「${(i==null?void 0:i.name)||"未命名预设"}」吗?此操作不可撤销。`,confirmText:"删除",cancelText:"取消",danger:!0}))return;T.trackUIInteraction({area:"settings",action:"preset_deleted",control:"delete_preset",source:"settings_dialog",metadata:{presetId:s,presetsCount:Math.max(0,w.length-1)}});const o=w.filter(_=>_.id!==s);Z(o),oe===s&&se(((m=o[0])==null?void 0:m.id)||ie),ne===s&&F(((l=o[0])==null?void 0:l.id)||ie),v&&je("catalog")},ps=(s,i)=>{if(!U)return;const d=w.map(o=>o.id===U.id?Ui(o,s,{defaultModelRef:i}):o);Z(d),T.trackUIInteraction({area:"settings",action:"route_model_changed",control:"route_model_dropdown",value:s,source:"settings_dialog",metadata:{presetId:U.id,routeType:s,hasModel:!!(i!=null&&i.modelId),hasProfile:!!(i!=null&&i.profileId)}}),cs(d,oe)},pt=async()=>{if(!r){Y.warning("请先选择供应商配置");return}if(rs&&!await fs(!1))return;const s=r.apiKey.trim(),i=Xe(r.baseUrl.trim()||ze);if(!s){Y.warning("请先填写 API Key");return}try{T.trackUIInteraction({area:"settings",action:"model_discovery_started",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id}}),await Pe.discover(r.id,i,s),T.trackUIInteraction({area:"settings",action:"model_discovery_succeeded",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id}}),Te(!0)}catch(d){const o=d instanceof Error?d.message:"模型同步失败";T.trackUIInteraction({area:"settings",action:"model_discovery_failed",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id,error:o}}),Pe.setError(r.id,o),Y.error({content:o,duration:3600})}},vs=(s,i)=>{var l,_,h;if(!r)return;const d=Pe.applySelection(r.id,s),o=d.models;if(r.id===z){const N=o.filter(x=>x.type==="image"),I=o.filter(x=>x.type==="video"),C=o.filter(x=>x.type==="text"),S=L.discoveredModels.filter(x=>x.type==="image").map(x=>x.id),q=L.discoveredModels.filter(x=>x.type==="video").map(x=>x.id),E=L.discoveredModels.filter(x=>x.type==="text").map(x=>x.id);!N.some(x=>x.id===le)&&S.includes(le)&&c(((l=N[0])==null?void 0:l.id)||me()),!I.some(x=>x.id===M)&&q.includes(M)&&j(((_=I[0])==null?void 0:_.id)||_e()),!C.some(x=>x.id===A)&&E.includes(A)&&R(((h=C[0])==null?void 0:h.id)||ue())}const m=(i==null?void 0:i.successMessage)||Ii(r.name,d.addedModelIds.length,d.removedModelIds.length,o.length);m&&Y.success(m),T.trackUIInteraction({area:"settings",action:"discovered_models_applied",control:"model_discovery_dialog",source:"settings_dialog",metadata:{profileId:r.id,selectedCount:o.length,addedCount:d.addedModelIds.length,removedCount:d.removedModelIds.length}}),Te(!1)},vt=s=>{if(!r)return;if(!L.selectedModelIds.includes(s)){Y.warning("该模型不是当前分组动态添加的模型,无法在此移除");return}const i=L.selectedModelIds.filter(d=>d!==s);vs(i)},xs=()=>{n(s=>({...s,openSettings:!1}))},fs=async(s=!1)=>{var i,d,o,m,l,_;if(is)return!1;as(!0);try{const h=f.map(p=>{var Ne,Ee;const V=p.baseUrl.trim()?Xe(p.baseUrl):"";return{...p,name:p.name.trim()||"未命名供应商",iconUrl:((Ne=p.iconUrl)==null?void 0:Ne.trim())||void 0,homepageUrl:((Ee=p.homepageUrl)==null?void 0:Ee.trim())||void 0,baseUrl:V,apiKey:p.apiKey.trim()}}),N=new Set(h.map(p=>p.id)),I=w.map(p=>{const V={...p,name:p.name.trim()||"未命名预设",audio:{...p.audio},image:{...p.image},video:{...p.video},text:{...p.text}};return["image","video","audio","text"].forEach(Ne=>{const Ee=V[Ne],Ye=De(Ee),Ms=W(Ee);if(Ye&&!N.has(Ye)){V[Ne]=he(pe(null,Ms));return}V[Ne]=he(pe(Ye,Ms))}),V}),C=((i=I.find(p=>p.id===oe))==null?void 0:i.id)||((d=I[0])==null?void 0:d.id)||ie,S=I.find(p=>p.id===C)||I[0]||null,q=h.find(p=>p.id===z)||h[0],E=Xe((q==null?void 0:q.baseUrl)||ze),x=be.trim()||((o=at[0])==null?void 0:o.id)||fe(),te=le.trim()||((m=ns[0])==null?void 0:m.id)||me(),D=M.trim()||((l=os[0])==null?void 0:l.id)||_e(),X=A.trim()||((_=ls[0])==null?void 0:_.id)||ue(),He=W(S==null?void 0:S.image)||te,ge=W(S==null?void 0:S.video)||D,Mt=W(S==null?void 0:S.audio)||x,Pt=W(S==null?void 0:S.text)||X;h.forEach(p=>{Pe.invalidateIfConfigChanged(p.id,p.baseUrl||ze,p.apiKey||"")}),await Xt.updateSettings({gemini:{...Ae.get(),apiKey:(q==null?void 0:q.apiKey)||"",baseUrl:E,audioModelName:Mt,imageModelName:He,videoModelName:ge,textModelName:Pt},providerProfiles:h,providerCatalogs:Pe.getCatalogs().filter(p=>N.has(p.profileId)),invocationPresets:I,activePresetId:C});try{localStorage.setItem(Ue.WORKZONE_CARD_VISIBLE,String(H)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed"))}catch{}return O(h),Ce(ae(h)),Z(I),se(C),we(x),c(te),j(D),R(X),$e(Le({profiles:h,presets:I,activePresetId:C,audioModelName:x,imageModelName:te,videoModelName:D,textModelName:X,showWorkZoneCard:H})),s&&xs(),T.trackUIInteraction({area:"settings",action:"settings_saved",control:"save_settings",source:"settings_dialog",metadata:{closeAfterSave:s,profilesCount:h.length,presetsCount:I.length,enabledProfilesCount:h.filter(p=>p.enabled).length}}),h.forEach(p=>{const V=Jt(p.baseUrl);T.track("provider_endpoint_configured",{profileId:p.id,providerType:p.providerType,providerOrigin:V==null?void 0:V.origin,providerHost:V==null?void 0:V.host,providerProtocol:V==null?void 0:V.protocol,enabled:p.enabled,authType:p.authType,supportsText:p.capabilities.supportsText,supportsImage:p.capabilities.supportsImage,supportsVideo:p.capabilities.supportsVideo,supportsAudio:p.capabilities.supportsAudio,supportsTools:p.capabilities.supportsTools,hasApiKey:!!p.apiKey})}),!0}catch(h){return console.error("Failed to persist settings drafts:",h),T.trackUIInteraction({area:"settings",action:"settings_save_failed",control:"save_settings",source:"settings_dialog",metadata:{closeAfterSave:s,error:h instanceof Error?h.message:String(h)}}),Y.error("设置保存失败,请稍后重试"),!1}finally{as(!1)}},xt=()=>{if(!rs){xs();return}(async()=>await fs(!0)||Y.warning("设置尚未保存,请检查后重试"))()},ft=()=>{ts||is||xt()},ys=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell settings-dialog__sidebar-shell--catalog",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"供应商目录"}),v?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:ms,children:"新增供应商"}):null]}),v?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先从列表里选择供应商,再进入对应的配置页面。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:f.map(s=>{const i=s.id===(r==null?void 0:r.id);return e.jsxs("div",{className:`settings-dialog__provider-row ${i?"settings-dialog__provider-row--active":""} ${s.enabled?"":"settings-dialog__provider-row--disabled"}`,onContextMenu:d=>{d.preventDefault(),Fe.open(d,s.id)},children:[e.jsxs("button",{type:"button",className:"settings-dialog__provider-select",onClick:()=>dt(s.id),"aria-pressed":i,children:[e.jsxs("span",{className:"settings-dialog__provider-select-main",children:[e.jsx($s,{profile:s}),e.jsxs("span",{className:"settings-dialog__provider-copy",children:[e.jsxs("span",{className:"settings-dialog__provider-name-row",children:[e.jsx("span",{className:"settings-dialog__provider-name",children:s.name}),s.id===z?e.jsx("span",{className:"settings-dialog__provider-tag",children:"默认"}):null]}),v?e.jsxs("span",{className:"settings-dialog__provider-meta",children:[e.jsx("span",{children:Je[s.providerType].label}),e.jsx("span",{children:s.enabled?"启用":"停用"})]}):null]})]}),v?e.jsx(qe,{size:16,className:"settings-dialog__provider-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__provider-switch",children:[e.jsx("span",{className:"settings-dialog__provider-switch-copy",children:s.enabled?"启用":"停用"}),e.jsx(Qe,{size:"small",value:s.enabled,disabled:s.id===z,onChange:d=>void mt(s.id,d)})]})]},s.id)})}),e.jsx(qt,{state:Fe.contextMenu,items:ut,onClose:Fe.close,zIndex:2e4}),v?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:ms,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增供应商"})]})]}),bs=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"默认模型"}),v?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:hs,children:"新增预设"}):null]}),v?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先选中一个预设,再进入详情页调整默认路由。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:w.map(s=>{const i=s.id===(U==null?void 0:U.id),d=s.id===oe,o=Rs(s);return e.jsxs("button",{type:"button",className:`settings-dialog__sidebar-item ${i?"settings-dialog__sidebar-item--active":""}`,onClick:()=>rt(s.id),children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-head",children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-top",children:[e.jsx("span",{children:s.name}),d?e.jsx("span",{className:"settings-dialog__sidebar-badge settings-dialog__sidebar-badge--accent",children:"当前"}):null]}),v?e.jsx(qe,{size:16,className:"settings-dialog__sidebar-item-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__sidebar-item-meta",children:[e.jsxs("span",{children:[o,"/3 已配置"]}),v?e.jsx("span",{children:d?"正在生效":"点击查看详情"}):null]})]},s.id)})}),v?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:hs,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增预设"})]})]}),js=(s,i)=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsx("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--compact",children:e.jsx("div",{className:"settings-dialog__mobile-stage",children:i},s)})}),Ns=(s=!1)=>{if(!r)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个供应商。"});const i=Os(L.models),d=Us(r,Se),o=i.image+i.video+i.text,m=ki(r);return e.jsxs("div",{className:`settings-dialog__content-panel settings-dialog__content-panel--providers ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>re("catalog"),children:[e.jsx(Cs,{size:16}),e.jsx("span",{children:"返回供应商目录"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"供应商配置"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"进入详情后再编辑接口信息、密钥和模型同步配置。"})]})]}):null,e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("a",{className:`settings-dialog__profile-hero ${m?"settings-dialog__profile-hero--link":""}`,href:m||void 0,target:"_blank",rel:"noopener noreferrer","aria-label":m?`打开 ${r.name} 域名页面`:void 0,onClick:l=>{m||l.preventDefault()},children:[e.jsx($s,{profile:r,size:"large"}),e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:r.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:Je[r.providerType].label}),e.jsx("span",{children:r.enabled?"启用":"停用"}),e.jsxs("span",{children:[o," 个模型"]}),e.jsx("span",{children:d==="saved"?"已保存":"未保存"})]})]})]}),ke(r.id)?null:e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>_s(r.id),children:"删除"})]})}),e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"基础配置"})})}),e.jsxs("div",{className:"settings-dialog__grid",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:r.name,onChange:l=>ce(r.id,_=>({..._,name:l.target.value}))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"接口类型"}),e.jsx("select",{className:"settings-dialog__select",value:r.providerType,onChange:l=>ce(r.id,_=>{const h=l.target.value,N=Vs(_.providerType),I=Vs();return{..._,providerType:h,authType:_.authType===N?I:_.authType}}),children:fi.map(l=>e.jsx("option",{value:l,children:Je[l].label},l))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图片接口格式"}),e.jsx("select",{className:"settings-dialog__select",value:r.imageApiCompatibility||Ys,onChange:l=>ce(r.id,_=>({..._,imageApiCompatibility:l.target.value})),children:yi.map(l=>e.jsx("option",{value:l,children:es[l].label},l))}),e.jsx("span",{className:"settings-dialog__field-hint",children:tt})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--full",style:{display:"flex",alignItems:"center",gap:"8px",flexWrap:"wrap"},children:[e.jsx("label",{className:"settings-dialog__label",style:{margin:0},children:"图片优先使用异步接口(实验功能,建议不要开,还未上线)"}),e.jsx(Qe,{size:"small",value:r.preferAsyncImageEndpoint??!1,onChange:l=>{const _=l;ce(r.id,h=>({...h,preferAsyncImageEndpoint:_})),Ie.update(ae(Ie.get()).map(h=>h.id===r.id?{...h,preferAsyncImageEndpoint:_}:h))}}),e.jsx("span",{className:"settings-dialog__field-hint",style:{width:"100%"},children:"开启后,支持异步接口的图片模型将优先使用 /v1/videos 异步接口生成"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图标 URL"}),e.jsx("input",{type:"url",className:"settings-dialog__input",value:r.iconUrl||"",onChange:l=>ce(r.id,_=>({..._,iconUrl:l.target.value})),placeholder:"可选,留空时自动生成默认图标"}),e.jsx("span",{className:"settings-dialog__field-hint",children:"支持填写远程图片地址;未填写时将根据供应商名称生成默认图标。"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API 地址"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:r.baseUrl,onChange:l=>ce(r.id,_=>({..._,baseUrl:l.target.value})),placeholder:ze})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxs("div",{className:"settings-dialog__label-with-tooltip settings-dialog__label-with-tooltip--left",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API Key"}),e.jsx(J,{content:e.jsxs("div",{style:{maxWidth:480},children:["您可以从以下地址获取 API Key:",e.jsx("br",{}),e.jsx("a",{href:"https://api.tu-zi.com/token",target:"_blank",rel:"noopener noreferrer",style:{color:"#F39C12",textDecoration:"none",display:"inline-block",marginBottom:8},children:"api.tu-zi.com/token"}),e.jsx("div",{style:{position:"relative",width:"100%",paddingTop:"56.25%",marginTop:8,borderRadius:8,overflow:"hidden",backgroundColor:"#000",boxShadow:"0 4px 16px rgba(0,0,0,0.2)"},children:e.jsx("iframe",{title:"Bilibili tutorial video",src:"//player.bilibili.com/player.html?isOutside=true&aid=116171584049629&bvid=BV1k4PqzPEKz&cid=36455319822&p=1",allowFullScreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",border:0}})})]}),placement:"top",theme:"light",showArrow:!1,overlayStyle:{maxWidth:"none"},children:e.jsx(Zt,{className:"settings-dialog__tooltip-icon"})})]}),e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"center",width:"100%",flexDirection:v?"column":"row"},children:[e.jsxs("div",{className:"settings-dialog__secret-input-wrap",style:{flex:v?"none":1},children:[e.jsx("input",{type:Oe?"text":"password",className:"settings-dialog__input settings-dialog__secret-input",value:r.apiKey,onChange:l=>ce(r.id,_=>({..._,apiKey:l.target.value})),autoComplete:"off"}),e.jsx(J,{content:Oe?"隐藏 API Key":"查看 API Key",showArrow:!1,children:e.jsx("button",{type:"button",className:"settings-dialog__secret-toggle","aria-label":Oe?"隐藏 API Key":"查看 API Key",onMouseDown:l=>l.preventDefault(),onClick:()=>Ke(l=>!l),children:Oe?e.jsx(Ht,{size:16}):e.jsx(Yt,{size:16})})})]}),e.jsx("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",style:{whiteSpace:"nowrap",height:v?"42px":"32px",width:v?"100%":"auto"},onClick:pt,disabled:!Ge||L.status==="loading",children:L.status==="loading"?e.jsxs(e.Fragment,{children:[e.jsx(Qt,{size:15,className:"settings-dialog__button-spinner"}),"同步中"]}):"获取模型"})]})]})]})]}),e.jsx(hi,{profile:r,onUpdateProfile:l=>ce(r.id,l)}),r.id===z?e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__compat-card",children:[e.jsx("div",{className:"settings-dialog__compat-title",children:"兼容默认模型"}),e.jsxs("div",{className:"settings-dialog__compat-meta",children:[e.jsxs("span",{children:["图片:",le||me()]}),e.jsxs("span",{children:["视频:",M||_e()]}),e.jsxs("span",{children:["音频:",be||fe()]}),e.jsxs("span",{children:["文本:",A||ue()]})]})]})}):null,yt()]},s?`provider-detail-${r.id}`:void 0)},We=u.useCallback(s=>{s.profileId&&(di({profileId:s.profileId,modelId:s.modelId,modality:s.modality,compareMode:s.compareMode}),T.trackUIInteraction({area:"settings",action:"model_benchmark_launched",control:"model_benchmark",source:"settings_dialog",metadata:{profileId:s.profileId,modality:s.modality,compareMode:s.compareMode,hasModel:!!s.modelId}}))},[n]),yt=()=>{const s=r?Us(r,Se):"saved",i=!!(r!=null&&r.apiKey.trim())&&s==="saved"&&L.status!=="loading",d=(r==null?void 0:r.id)===z,o=Ei(L.models),m=new Map(Ks.map((E,x)=>[E,x])),l=it.trim(),_=Os(o),h=o.filter(E=>wi(E,l)),N=Mi.map(E=>({type:E,models:h.filter(x=>x.type===E).sort((x,te)=>{const D=m.get(x.vendor)??Number.MAX_SAFE_INTEGER,X=m.get(te.vendor)??Number.MAX_SAFE_INTEGER;return D!==X?D-X:si(x,te)})})).filter(E=>E.models.length>0),I=Ge||o.length>0,C=o.length>0&&h.length===0&&!!l,S=L.status==="error"&&o.length===0,q=!Ge&&o.length===0;return e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:"模型"}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsxs("span",{children:["已添加 ",o.length," 个"]}),e.jsxs("span",{children:["图 ",_.image]}),e.jsxs("span",{children:["视 ",_.video]}),e.jsxs("span",{children:["音 ",_.audio]}),e.jsxs("span",{children:["文 ",_.text]})]})]})}),I?e.jsx("div",{className:"settings-dialog__model-toolbar",children:e.jsxs("label",{className:`settings-dialog__model-search ${o.length===0?"settings-dialog__model-search--disabled":""}`,children:[e.jsx(Bs,{size:15}),e.jsx("input",{type:"text",value:de,onChange:E=>xe(E.target.value),placeholder:o.length>0?"搜索模型 ID、名称或品牌":"获取模型后可搜索",disabled:o.length===0}),de?e.jsx("button",{type:"button",className:"settings-dialog__model-search-clear",onClick:()=>xe(""),"aria-label":"清空搜索",children:e.jsx(Gs,{size:14})}):null]})}):null,N.length>0?e.jsx("div",{className:"settings-dialog__model-type-groups",children:N.map(({type:E,models:x})=>{const te=Js.has(E);return e.jsxs("div",{className:"settings-dialog__model-type-group",children:[e.jsxs("div",{className:"settings-dialog__model-type-header",style:{cursor:"pointer"},onClick:()=>st(E),children:[e.jsxs("div",{className:"settings-dialog__model-type-meta",children:[te?e.jsx(qe,{size:16,className:"settings-dialog__model-type-toggle"}):e.jsx(Zs,{size:16,className:"settings-dialog__model-type-toggle"}),e.jsx("span",{className:"settings-dialog__model-type-title",children:bi[E]}),e.jsx("span",{className:"settings-dialog__model-type-count",children:x.length})]}),e.jsx(J,{content:i?"测试当前供应商这一组模型":"请先保存供应商配置并确保 API Key 可用",showArrow:!1,children:e.jsx("button",{type:"button",className:"settings-dialog__model-group-test",onClick:D=>{D.stopPropagation(),r&&We({profileId:r.id,modality:E,compareMode:"cross-model"})},disabled:!i,children:"测试本组"})})]}),!te&&e.jsx("div",{className:"settings-dialog__model-type-list",children:x.map(D=>{const X=Fs(D.vendor),He=!d||L.selectedModelIds.includes(D.id);return e.jsxs("div",{className:"settings-dialog__model-type-item",style:{"--model-brand-accent":X.accent,"--model-brand-surface":X.surface,"--model-brand-border":X.border},children:[e.jsx("span",{className:"settings-dialog__model-type-item-logo",children:e.jsx(Ws,{vendor:D.vendor,size:16})}),e.jsxs("div",{className:"settings-dialog__model-type-item-copy",children:[e.jsx(Ni,{profileId:r.id,modelId:D.id}),e.jsx("span",{className:"settings-dialog__model-type-item-vendor",children:Ve(D.vendor)}),e.jsx(ji,{profileId:r.id,modelId:D.id})]}),e.jsxs("div",{className:"settings-dialog__model-type-item-btns",children:[(()=>{const ge=ti.getLatestEntryStatus(r.id,D.id);return ge==="completed"?e.jsx(J,{content:"上次测试成功",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("span",{className:"settings-dialog__model-status settings-dialog__model-status--ok"})})}):ge==="failed"?e.jsx(J,{content:"上次测试失败",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("span",{className:"settings-dialog__model-status settings-dialog__model-status--fail"})})}):null})(),e.jsx(J,{content:i?"测试":"请先保存供应商配置并确保 API Key 可用",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("button",{type:"button",className:"settings-dialog__model-icon-btn settings-dialog__model-icon-btn--test",onClick:ge=>{ge.stopPropagation(),r&&We({profileId:r.id,modality:E,modelId:D.id,compareMode:"cross-provider"})},disabled:!i,children:e.jsx(Hs,{size:14})})})}),He?e.jsx(J,{content:"移除此模型",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("button",{type:"button",className:"settings-dialog__model-icon-btn settings-dialog__model-icon-btn--delete",onClick:ge=>{ge.stopPropagation(),vt(D.id)},children:e.jsx(Ss,{size:14})})})}):null]})]},D.id)})})]},E)})}):C?e.jsx("div",{className:"settings-dialog__model-empty",children:"没有匹配的模型,试试搜索品牌名或更完整的模型 ID。"}):S?e.jsxs("div",{className:"settings-dialog__model-empty settings-dialog__model-empty--error",children:[e.jsx(ii,{size:16}),e.jsx("span",{children:L.error||"模型获取失败,请稍后重试"})]}):q?e.jsx("div",{className:"settings-dialog__model-empty",children:"填写 API Key 后即可获取模型,获取完成后可在这里检索和浏览。"}):e.jsx("div",{className:"settings-dialog__model-empty",children:"还没有已添加的模型"})]})},bt=(s,i,d)=>{const o=De(d),m=W(d);return f.filter(l=>l.id===o||l.enabled&&l.capabilities[i]).map(l=>{const h=(l.id===z?s==="image"?ns:s==="video"?os:ls:Pe.getState(l.id).models.filter(N=>N.type===s)).filter((N,I,C)=>C.findIndex(S=>S.id===N.id)===I);return l.id===o&&m&&!h.some(N=>N.id===m)&&h.unshift({id:m,label:m,shortLabel:m,type:s,vendor:ai.OTHER}),{profile:l,models:h}}).filter(l=>l.models.length>0)},Ze=(s,i,d)=>{var I;const o=bt(s,d,i),m=De(i),l=W(i),_=((I=f.find(C=>C.id===m))==null?void 0:I.name)||"未配置",h=Vi(o),N=m&&l?`${m}::${l}`:l||void 0;return e.jsxs("div",{className:`settings-dialog__route-card settings-dialog__route-card--${s}`,children:[e.jsx("div",{className:"settings-dialog__route-card-top",children:e.jsx("div",{className:"settings-dialog__route-card-title",children:Ds[s]})}),e.jsxs("div",{className:"settings-dialog__stack",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"默认模型"}),e.jsxs("div",{className:"settings-dialog__route-model-picker",children:[e.jsx(ei,{variant:"form",selectedModel:l||"",selectedSelectionKey:N,models:h,providerProfilesOverride:f,placement:"down",placeholder:`搜索${Ds[s]}模型或供应商`,allowCustomValue:!1,showProviderAction:!1,onSelect:(C,S)=>{ps(s,S||pe(null,C))},disabled:h.length===0}),l?e.jsx("button",{type:"button",className:"settings-dialog__route-clear",onClick:()=>ps(s,null),children:"清空"}):null]})]}),e.jsxs("div",{className:"settings-dialog__route-meta",children:[e.jsx("span",{children:_}),e.jsx("span",{children:l||"未选择模型"}),o.length===0?e.jsx("span",{children:"暂无可选模型"}):null]})]})]})},Is=(s=!1)=>{if(!U)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个默认模型预设。"});const i=Rs(U),d=U.id===oe;return e.jsxs("div",{className:`settings-dialog__content-panel ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>je("catalog"),children:[e.jsx(Cs,{size:16}),e.jsx("span",{children:"返回模型预设"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"模型预设"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"在这里设置图片、视频和文本模型的默认路由。"})]})]}):null,e.jsxs("div",{className:"settings-dialog__section",children:[e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:U.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:d?"当前预设":"未激活"}),e.jsxs("span",{children:[i,"/3 已配置"]})]})]}),e.jsxs("div",{className:"settings-dialog__inline-row",children:[e.jsx("button",{type:"button",className:"settings-dialog__ghost-button",onClick:()=>{cs(w,U.id)},children:"设为当前预设"}),e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>ht(U.id),disabled:w.length<=1,children:"删除预设"})]})]}),e.jsx("div",{className:"settings-dialog__grid",children:e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"预设名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:U.name,onChange:o=>gt(U.id,m=>({...m,name:o.target.value}))})]})})]}),e.jsxs("div",{className:"settings-dialog__routes",children:[Ze("image",U.image,"supportsImage"),Ze("video",U.video,"supportsVideo"),Ze("text",U.text,"supportsText")]})]},s?`preset-detail-${U.id}`:void 0)},jt=()=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsxs("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--canvas",children:[v?e.jsx("div",{className:"settings-dialog__compact-stage-header",children:e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"画布显示"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"手机上会以更集中的卡片形式展示,方便快速切换画布相关开关。"})]})}):null,e.jsxs("div",{className:"settings-dialog__section settings-dialog__section--canvas-card",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"画布显示配置"})})}),e.jsxs("div",{className:"settings-dialog__preference settings-dialog__preference--panel",children:[e.jsxs("div",{className:"settings-dialog__toggle-copy",children:[e.jsx("span",{className:"settings-dialog__toggle-title",children:"任务进度卡片"}),e.jsx("span",{className:"settings-dialog__toggle-desc",children:"在画布中显示任务进度卡片,便于追踪当前生成状态。"})]}),e.jsx(Qe,{size:"small",value:H,onChange:s=>void _t(s)})]})]})]})}),Nt=()=>e.jsx("aside",{className:"settings-dialog__nav",children:e.jsx("div",{className:"settings-dialog__nav-shell",children:e.jsx("div",{className:"settings-dialog__nav-list",children:xi.map(s=>e.jsx("button",{type:"button",className:`settings-dialog__nav-item ${G===s.value?"settings-dialog__nav-item--active":""}`,onClick:()=>lt(s.value),children:e.jsx("span",{className:"settings-dialog__nav-item-title",children:s.label})},s.value))})})}),It=()=>G==="canvas"?jt():G==="speech"?e.jsx(li,{}):G==="presets"?ds?Xs==="catalog"?js("presets-catalog",bs()):Is(!0):e.jsxs("div",{className:`settings-dialog__workspace ${v?"settings-dialog__workspace--show-sidebar":""}`,children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:bs()}),Is(!1)]}):ds?qs==="catalog"?js("providers-catalog",ys()):Ns(!0):e.jsxs("div",{className:`settings-dialog__workspace ${v?"settings-dialog__workspace--show-sidebar":""}`,children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:ys()}),Ns(!1)]});return e.jsxs(e.Fragment,{children:[e.jsx($t,{id:"settings-dialog",visible:a.openSettings,title:"设置",onClose:ft,width:v?"100%":"88%",height:v?"100%":"88%",minWidth:v?Math.max(320,Math.min(K-16,640)):1080,minHeight:v?Math.max(520,Math.min(Q-16,820)):680,x:"center",y:"center",maximizable:!0,minimizable:!1,resizable:!v,movable:!v,modal:!1,className:"winbox-ai-generation winbox-tool-window winbox-settings-window",container:t,background:"#ffffff",children:e.jsx("div",{ref:ve,className:`settings-dialog ${v?"settings-dialog--compact":""}`,"data-testid":"settings-dialog",children:e.jsxs("div",{className:"settings-dialog__layout",children:[Nt(),e.jsx("div",{className:"settings-dialog__main",children:It()})]})})}),e.jsx(ui,{open:ts,container:t,models:L.discoveredModels,selectedModelIds:L.selectedModelIds,onClose:()=>Te(!1),onConfirm:vs,onTestModel:s=>{if(!r)return;const i=L.discoveredModels.find(d=>d.id===s);We({profileId:r.id,modelId:s,modality:(i==null?void 0:i.type)||"image",compareMode:"cross-provider"})}}),b]})};export{Hi as IMAGE_MODEL_GROUPED_OPTIONS,Fi as SettingsDialog,Yi as VIDEO_MODEL_OPTIONS};
1
+ import{oj as Ks,ok as Ve,ol as St,P as u,om as Ct,a8 as e,gc as wt,gd as Et,gz as Gs,d0 as Bs,on as Fs,oo as Ws,gy as Zs,eB as At,ab as J,op as Hs,R as kt,oq as Dt,or as Tt,dD as Ps,ao as Y,fx as Ot,os as Ys,el as Rt,ep as Ut,gA as zt,ot as z,ou as ie,ov as Lt,ow as Re,ox as Ie,o9 as Me,aE as Ae,aM as fe,aG as me,aN as _e,aO as ue,c6 as Ue,bP as T,eq as Vt,c3 as Ss,gC as $t,oy as Kt,oz as Gt,oA as Bt,oB as Ft,mN as Wt,oC as Pe,oD as De,oE as he,gr as Qe,oF as Cs,oG as qe,oH as ze,oI as Zt,c2 as Ht,oJ as Yt,oK as Qt,cv as qt,oL as Xe,oM as W,et as pe,fF as Xt,oN as Jt,f2 as ei,oO as si,oP as ti,oQ as ii,oR as ai,oS as ni,oT as oi}from"./ai-chat-BnWVpTEI.js";import{oU as Hi,oV as Yi}from"./ai-chat-BnWVpTEI.js";import{as as li}from"./tool-windows-Bf_pMml-.js";import{o as di}from"./model-benchmark-launcher-DNMp2MLQ.js";import"./startup-runtime-BrfuwjQS.js";const ws={all:"全部",image:"图片",video:"视频",audio:"音频",text:"文本"},ri={image:"图片",video:"视频",audio:"音频",text:"文本"},ci={image:"图",video:"视",audio:"音",text:"文"},Es=["text","image","video","audio"];function gi(t,a){const n=a.trim().toLowerCase();return n?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ve(t.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(n)):!0}function mi(t){return St(t)}function As(t,a){const n=new Map;for(const b of t){const y=n.get(b.vendor)||{vendor:b.vendor,models:[],counts:{image:0,video:0,audio:0,text:0},selectedCount:0};y.models.push(b),y.counts[b.type]+=1,a.has(b.id)&&(y.selectedCount+=1),n.set(b.vendor,y)}const g=new Map(Ks.map((b,y)=>[b,y]));return Array.from(n.values()).sort((b,y)=>{const K=g.get(b.vendor)??Number.MAX_SAFE_INTEGER,Q=g.get(y.vendor)??Number.MAX_SAFE_INTEGER;return K!==Q?K-Q:y.models.length-b.models.length})}function _i(t){return["image","video","audio","text"].filter(a=>t.counts[a]>0).map(a=>({type:a,models:mi(t.models.filter(n=>n.type===a))})).sort((a,n)=>n.models.length!==a.models.length?n.models.length-a.models.length:Es.indexOf(a.type)-Es.indexOf(n.type))}const ui=({open:t,container:a,models:n,selectedModelIds:g,onClose:b,onConfirm:y,onTestModel:K})=>{const[Q,ve]=u.useState(""),[ee,ye]=u.useState("all"),[G,P]=u.useState(g),[k,$]=u.useState({});u.useEffect(()=>{var R,H;if(!t)return;ve(""),ye("all"),P(g);const c=new Set(g),M=As(n,c),j=((R=M.find(B=>B.selectedCount>0))==null?void 0:R.vendor)||((H=M[0])==null?void 0:H.vendor)||null,A={};M.forEach(B=>{A[B.vendor]=B.vendor===j}),$(A)},[n,t,g]);const ne=u.useMemo(()=>({all:n.length,image:n.filter(c=>c.type==="image").length,video:n.filter(c=>c.type==="video").length,audio:n.filter(c=>c.type==="audio").length,text:n.filter(c=>c.type==="text").length}),[n]),F=u.useMemo(()=>{const c=Q.trim(),M=ee==="all"?n:n.filter(j=>j.type===ee);return c?M.filter(j=>gi(j,c)):M},[ee,n,Q]),f=u.useMemo(()=>new Set(G),[G]),O=u.useMemo(()=>As(F,f),[f,F]),w=G.length,Z=u.useMemo(()=>({image:n.filter(c=>c.type==="image"&&f.has(c.id)).length,video:n.filter(c=>c.type==="video"&&f.has(c.id)).length,text:n.filter(c=>c.type==="text"&&f.has(c.id)).length}),[n,f]),oe=F.length>0&&F.every(c=>f.has(c.id)),se=u.useMemo(()=>n.filter(c=>Ct(c.id)).map(c=>c.id),[n]),Se=se.length>0&&se.every(c=>f.has(c));u.useEffect(()=>{O.length===0||O.some(j=>k[j.vendor])||!Object.values(k).some(Boolean)||$(O.reduce((j,A,R)=>(j[A.vendor]=R===0,j),{}))},[k,O]);const Ce=c=>{P(M=>M.includes(c)?M.filter(j=>j!==c):[...M,c])},be=()=>{const c=F.map(j=>j.id),M=c.every(j=>f.has(j));P(j=>M?j.filter(A=>!c.includes(A)):Array.from(new Set([...j,...c])))},we=()=>{P(c=>Array.from(new Set([...c,...se])))},le=c=>{$(M=>{const j=!M[c],A={};return O.forEach(R=>{A[R.vendor]=R.vendor===c?j:!1}),A})};return e.jsx(wt,{open:t,onOpenChange:c=>!c&&b(),children:e.jsxs(Et,{className:"model-discovery-dialog",container:a,"data-testid":"model-discovery-dialog",children:[e.jsxs("div",{className:"model-discovery-dialog__header",children:[e.jsxs("div",{className:"model-discovery-dialog__headline",children:[e.jsx("h3",{className:"model-discovery-dialog__title",children:"获取模型"}),e.jsxs("div",{className:"model-discovery-dialog__header-stats",children:[e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["已发现 ",n.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["品牌 ",O.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill model-discovery-dialog__header-pill--accent",children:["已选 ",w]})]})]}),e.jsx("button",{type:"button",className:"model-discovery-dialog__close",onClick:b,"aria-label":"关闭",children:e.jsx(Gs,{size:18})})]}),e.jsx("div",{className:"model-discovery-dialog__toolbar",children:e.jsxs("label",{className:"model-discovery-dialog__search",children:[e.jsx(Bs,{size:16}),e.jsx("input",{type:"text",value:Q,onChange:c=>ve(c.target.value),placeholder:"搜索模型名称、ID 或品牌"})]})}),e.jsx("div",{className:"model-discovery-dialog__type-tabs",children:Object.keys(ws).map(c=>{const M=ee===c;return e.jsxs("button",{type:"button",className:`model-discovery-dialog__type-tab ${M?"model-discovery-dialog__type-tab--active":""}`,onClick:()=>ye(c),children:[e.jsx("span",{children:ws[c]}),e.jsx("span",{className:"model-discovery-dialog__type-tab-count",children:ne[c]})]},c)})}),e.jsx("div",{className:"model-discovery-dialog__body",children:O.length===0?e.jsx("div",{className:"model-discovery-dialog__empty",children:Q.trim()?"没有匹配的模型":"暂无模型"}):e.jsx("div",{className:"model-discovery-dialog__group-list",children:O.map(c=>{const M=Fs(c.vendor),j=_i(c),A=!!k[c.vendor];return e.jsxs("section",{className:`model-discovery-dialog__vendor-group ${A?"model-discovery-dialog__vendor-group--expanded":""}`,style:{"--vendor-accent":M.accent,"--vendor-surface":M.surface,"--vendor-border":M.border},children:[e.jsxs("button",{type:"button",className:"model-discovery-dialog__vendor-header",onClick:()=>le(c.vendor),children:[e.jsxs("div",{className:"model-discovery-dialog__vendor-main",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-logo-shell",children:e.jsx(Ws,{vendor:c.vendor,size:22})}),e.jsxs("div",{className:"model-discovery-dialog__vendor-copy",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-name",children:Ve(c.vendor)}),e.jsx("div",{className:"model-discovery-dialog__vendor-meta",children:j.map(({type:R,models:H})=>e.jsxs("span",{className:"model-discovery-dialog__vendor-meta-pill",children:[ci[R]," ",H.length]},`${c.vendor}-${R}`))})]})]}),e.jsx("span",{className:"model-discovery-dialog__vendor-spacer"}),e.jsxs("div",{className:"model-discovery-dialog__vendor-side",children:[c.selectedCount>0?e.jsxs("span",{className:"model-discovery-dialog__vendor-selected",children:["已选 ",c.selectedCount]}):null,e.jsx("span",{className:"model-discovery-dialog__vendor-count",children:c.models.length}),e.jsx("span",{className:`model-discovery-dialog__vendor-chevron ${A?"model-discovery-dialog__vendor-chevron--expanded":""}`,children:e.jsx(Zs,{size:16})})]})]}),A?e.jsx("div",{className:"model-discovery-dialog__vendor-body",children:j.map(({type:R,models:H})=>e.jsxs("div",{className:"model-discovery-dialog__type-section",children:[e.jsxs("div",{className:"model-discovery-dialog__type-section-header",children:[e.jsx("span",{className:"model-discovery-dialog__type-section-title",children:ri[R]}),e.jsx("span",{className:"model-discovery-dialog__type-section-count",children:H.length})]}),e.jsx("div",{className:"model-discovery-dialog__model-stack",children:H.map(B=>{const de=f.has(B.id);return e.jsxs("label",{className:`model-discovery-dialog__item ${de?"model-discovery-dialog__item--checked":""}`,children:[e.jsx("input",{type:"checkbox",className:"model-discovery-dialog__checkbox",checked:de,onChange:()=>Ce(B.id)}),e.jsx("span",{className:"model-discovery-dialog__checkmark",children:de?e.jsx(At,{size:12}):null}),e.jsx("div",{className:"model-discovery-dialog__item-body",children:e.jsx("div",{className:`model-discovery-dialog__item-id ${de?"model-discovery-dialog__item-id--checked":""}`,children:B.id})}),K?e.jsx(J,{content:"测试此模型",showArrow:!1,children:e.jsx("button",{type:"button",className:"model-discovery-dialog__item-test",onClick:xe=>{xe.preventDefault(),xe.stopPropagation(),K(B.id)},children:e.jsx(Hs,{size:13})})}):null]},B.id)})})]},`${c.vendor}-${R}`))}):null]},c.vendor)})})}),e.jsxs("div",{className:"model-discovery-dialog__footer",children:[e.jsxs("span",{className:"model-discovery-dialog__selection-count",children:["已选 ",w," 个 · 图 ",Z.image," / 视"," ",Z.video," / 文 ",Z.text]}),e.jsxs("div",{className:"model-discovery-dialog__footer-bulk",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:be,disabled:F.length===0,children:oe?"取消当前筛选":"全选"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:we,disabled:se.length===0||Se,children:"选中推荐模型"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button model-discovery-dialog__ghost-button--muted",onClick:()=>P([]),disabled:G.length===0,children:"清空"})]}),e.jsxs("div",{className:"model-discovery-dialog__actions",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--secondary",onClick:b,children:"取消"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--primary",onClick:()=>y(G),children:"添加模型"})]})]})]})})},hi=kt.memo(({profile:t,onUpdateProfile:a})=>{const[n,g]=u.useState(!1),b=Dt(t.id),y=Tt(t),K=(y==null?void 0:y.pricingUrl)||"",Q=(y==null?void 0:y.cnyPerUsd)??1,ve=(y==null?void 0:y.pricingGroup)||"default",ee=u.useCallback(async()=>{if(y){g(!0);try{await Ps.fetchAndCache(t.id,y.pricingUrl,t.apiKey,y.pricingGroup,y.cnyPerUsd,{force:!0,promoteToAutoRefresh:!0}),Y.success("价格信息已同步")}catch(P){Y.error(`获取价格失败: ${P instanceof Error?P.message:"未知错误"}`)}finally{g(!1)}}},[y,t.id,t.apiKey]),ye=u.useCallback(async P=>{const k=String(P);if(a($=>({...$,pricingGroup:k})),!!y){g(!0);try{await Ps.fetchAndCache(t.id,y.pricingUrl,t.apiKey,k,y.cnyPerUsd)}catch{}finally{g(!1)}}},[a,y,t.id,t.apiKey]),G=b.map(P=>({label:P.displayName||P.name,value:P.name}));return e.jsxs("div",{className:"settings-dialog__pricing-group",children:[e.jsxs("div",{className:"settings-dialog__pricing-row",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{flex:1,minWidth:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"模型价格 URL"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:K,onChange:P=>a(k=>({...k,pricingUrl:P.target.value})),placeholder:"如 https://api.tu-zi.com/api/pricing"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{width:110,flexShrink:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"¥/1USD"}),e.jsx("input",{type:"number",className:"settings-dialog__input",value:Q,step:.01,min:0,onChange:P=>a(k=>({...k,cnyPerUsd:parseFloat(P.target.value)||0}))})]})]}),e.jsxs("div",{className:"settings-dialog__pricing-row",children:[G.length>0?e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",style:{flex:1,minWidth:0},children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"当前分组"}),e.jsx(Ot,{value:ve,options:G,onChange:P=>ye(P),style:{width:"100%"}})]}):null,e.jsx("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",style:{alignSelf:"flex-end",height:32,flexShrink:0},onClick:ee,disabled:n||!K,children:n?"同步中":"获取价格"})]})]})});function pi(t,a){return{id:a,name:`供应商 ${t}`,iconUrl:"",homepageUrl:"",providerType:"openai-compatible",baseUrl:"",apiKey:"",authType:"bearer",imageApiCompatibility:Ys,enabled:!0,capabilities:{supportsModelsEndpoint:!0,supportsText:!0,supportsImage:!0,supportsVideo:!0,supportsAudio:!0,supportsTools:!0}}}const ks="aitu:settings:provider-nav",vi=980,xi=[{value:"providers",label:"供应商"},{value:"presets",label:"模型预设"},{value:"canvas",label:"画布显示"},{value:"speech",label:"语音播放"}],fi=["openai-compatible","gemini-compatible","custom"],yi=["auto","openai-gpt-image","tuzi-gpt-image","openai-compatible-basic"],Ds={image:"图片",video:"视频",audio:"音频",text:"文本"},bi={image:"图片模型",video:"视频模型",audio:"音频模型",text:"文本模型"},ji=u.memo(function({profileId:a,modelId:n}){const{summary:g,detail:b}=oi(a,n);return g?e.jsx(J,{content:b,placement:"top",disabled:b===g,children:e.jsx("span",{className:"settings-dialog__model-price",children:g})}):null}),Ni=u.memo(function({profileId:a,modelId:n}){const g=ni(a,n);return g!=null&&g.description?e.jsx(J,{content:g.description,placement:"top",children:e.jsx("span",{className:"settings-dialog__model-type-item-id settings-dialog__model-type-item-id--has-desc",children:n})}):e.jsx("span",{className:"settings-dialog__model-type-item-id",children:n})});function Ii(t,a,n,g){return a===0&&n===0?null:g===0&&n>0?`已清空 ${t} 的已添加模型`:a>0&&n>0?`已更新 ${t} 的模型(新增 ${a} 个,移除 ${n} 个)`:a>0?`已为 ${t} 添加 ${a} 个模型`:`已从 ${t} 移除 ${n} 个模型`}const Mi=["text","image","video","audio"],Je={"openai-compatible":{label:"OpenAI 兼容"},"gemini-compatible":{label:"Gemini 兼容"},custom:{label:"自定义接入"}},es={auto:{label:"自动"},"openai-gpt-image":{label:"OpenAI GPT Image"},"tuzi-gpt-image":{label:"Tuzi GPT 兼容"},"openai-compatible-basic":{label:"OpenAI-compatible 通用兼容(兜底)"}};function Pi(t){return t==="auto"||t==="openai-gpt-image"||t==="tuzi-gpt-image"||t==="openai-compatible-basic"?t:t==="tuzi-compatible"?"tuzi-gpt-image":"auto"}function Si(t){const a=t.baseUrl.trim().toLowerCase();return a.includes("api.openai.com")?"openai-gpt-image":a.includes(".tu-zi.com")?"tuzi-gpt-image":"openai-compatible-basic"}function Ci(t){const a=Pi(t.imageApiCompatibility);if(a==="auto"){const n=Si(t);return`默认推荐显式选择 OpenAI GPT Image;如果保留自动模式,GPT Image 模型当前会解析为 ${es[n].label}。`}return a==="openai-gpt-image"?"默认推荐模式。适用于官方 GPT Image 请求格式,也便于后续继续扩展官方图生图能力。":`同一个图片模型在不同 API Key 或网关下可能需要不同接口格式;当前已固定为 ${es[a].label}。`}const Ts=["amber","sky","mint","rose","violet"];function Os(t){return t.reduce((a,n)=>(a[n.type]+=1,a),{image:0,video:0,audio:0,text:0})}function wi(t,a){const n=a.trim().toLowerCase();return n?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ve(t.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(n)):!0}function Ei(t){const a=new Set,n=[];return t.forEach(g=>{const b=`${g.type}:${g.id}`;a.has(b)||(a.add(b),n.push(g))}),n}function Rs(t){return t?["image","video","audio","text"].filter(a=>!!W(t[a])).length:0}function Us(t,a){const n=a.find(g=>g.id===t.id);return n?Li(n,t)?"saved":"dirty":"new"}function Le(t){return JSON.stringify(t)}function Ai(t){return typeof t.iconUrl!="string"?null:t.iconUrl.trim()||null}function ki(t){const a=zs(t.homepageUrl);if(a)return a;try{const n=zs(t.baseUrl);return n?new URL(n).origin:null}catch{return null}}function zs(t){const a=typeof t=="string"?t.trim():"";if(!a)return null;try{return new URL(/^[a-z][a-z\d+\-.]*:\/\//i.test(a)?a:`https://${a}`).toString()}catch{return null}}function Di(t){var g;const a=t.trim();if(!a)return"供";const n=a.match(/[A-Za-z0-9]+/g);return n!=null&&n[0]?n[0][0].toUpperCase():((g=Array.from(a)[0])==null?void 0:g.toUpperCase())||"供"}function Ti(t){const a=Array.from(`${t.id}-${t.providerType}-${t.name}`).reduce((n,g,b)=>n+g.charCodeAt(0)*(b+1),0);return Ts[a%Ts.length]}function ae(t){return JSON.parse(JSON.stringify(t))}function ss(t){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function Ls(t){return pi(t,ss("profile"))}function Oi(){if(typeof window>"u")return null;const t=window.__aituPendingProviderNavigationIntent||null;return window.__aituPendingProviderNavigationIntent=void 0,t}function Vs(t){return"bearer"}function ke(t){return t===z||t===Kt||t===Gt||t===Bt||t===Ft}const $s=({profile:t,size:a="regular"})=>{const n=Ai(t),[g,b]=u.useState(n);u.useEffect(()=>{b(n)},[n]);const y=Ti(t),K=Di(t.name);return e.jsx("span",{className:`settings-dialog__provider-avatar settings-dialog__provider-avatar--${y} ${a==="large"?"settings-dialog__provider-avatar--large":""}`,"aria-hidden":"true",children:g?e.jsx("img",{src:g,alt:`${t.name} 图标`,className:"settings-dialog__provider-avatar-image",loading:"lazy",onError:()=>b(null)}):e.jsx("span",{className:"settings-dialog__provider-avatar-text",children:K})})};function Ri(t,a){return{id:ss("preset"),name:"新预设",text:he(pe(t,a.text||null)),image:he(pe(t,a.image||null)),video:he(pe(t,a.video||null)),audio:he(pe(t,a.audio||null))}}function Ui(t,a,n){const g=t[a],b=n.defaultModelRef!==void 0?n.defaultModelRef:pe(n.profileId!==void 0?n.profileId:De(g),n.defaultModelId!==void 0?n.defaultModelId:W(g));return{...t,[a]:he(b)}}function zi(t,a){const n={...t};return["image","video","audio","text"].forEach(g=>{De(n[g])===a&&(n[g]=he(null))}),n}function Li(t,a){return JSON.stringify(t)===JSON.stringify(a)}function Vi(t){return t.flatMap(({profile:a,models:n})=>n.map(g=>({...g,sourceProfileId:a.id,sourceProfileName:a.name,selectionKey:g.selectionKey||`${a.id}::${g.id}`})))}const Fi=({container:t})=>{const{appState:a,setAppState:n}=Rt(),{confirm:g,confirmDialog:b}=Ut({container:t}),{isMobile:y,viewportWidth:K,viewportHeight:Q}=zt(),ve=u.useRef(null),[ee,ye]=u.useState(0),[G,P]=u.useState("providers"),[k,$]=u.useState(z),[ne,F]=u.useState(ie),[f,O]=u.useState([]),[w,Z]=u.useState([]),[oe,se]=u.useState(ie),[Se,Ce]=u.useState([]),[be,we]=u.useState(""),[le,c]=u.useState(""),[M,j]=u.useState(""),[A,R]=u.useState(""),[H,B]=u.useState(!0),[de,xe]=u.useState(""),[ts,Te]=u.useState(!1),[Qs,$e]=u.useState(""),[is,as]=u.useState(!1),[qs,re]=u.useState("catalog"),[Xs,je]=u.useState("catalog"),[Js,et]=u.useState(new Set),[Oe,Ke]=u.useState(!1),st=s=>{et(i=>{const d=new Set(i);return d.has(s)?d.delete(s):d.add(s),d})},r=f.find(s=>s.id===k)||f[0]||null,tt=r?Ci(r):"同一个图片模型在不同 API Key 或网关下可能需要不同接口格式;不确定时使用自动。",U=w.find(s=>s.id===ne)||w[0]||null,L=Lt((r==null?void 0:r.id)||z),it=u.useDeferredValue(de),ns=Re(z,"image"),at=Re(z,"audio"),os=Re(z,"video"),ls=Re(z,"text"),nt=f.filter(s=>s.enabled),v=y||K<=vi,ds=v&&(ee>0?ee<600:K<600),Ge=!!r&&!!r.apiKey.trim(),ot=Le({profiles:f,presets:w,activePresetId:oe,audioModelName:be,imageModelName:le,videoModelName:M,textModelName:A,showWorkZoneCard:H}),rs=a.openSettings&&ot!==Qs;u.useEffect(()=>{Ke(!1)},[r==null?void 0:r.id]),u.useEffect(()=>{const s=ve.current;if(!s||typeof ResizeObserver>"u")return;const i=new ResizeObserver(d=>{var m;const o=(m=d[0])==null?void 0:m.contentRect.width;o&&ye(l=>Math.abs(l-o)<1?l:o)});return i.observe(s),()=>{i.disconnect()}},[a.openSettings]);const lt=s=>{T.trackUIInteraction({area:"settings",action:"view_changed",control:"settings_nav",value:s,source:"settings_dialog"}),P(s),v&&(s==="providers"&&re("catalog"),s==="presets"&&je("catalog"))},dt=s=>{T.trackUIInteraction({area:"settings",action:"provider_selected",control:"provider_list",source:"settings_dialog",metadata:{profileId:s,isManagedProfile:ke(s)}}),$(s),v&&re("detail")},rt=s=>{T.trackUIInteraction({area:"settings",action:"preset_selected",control:"preset_list",source:"settings_dialog",metadata:{presetId:s}}),F(s),v&&je("detail")},ct=()=>{try{return localStorage.getItem(Ue.WORKZONE_CARD_VISIBLE)!=="false"}catch{return!0}},Be=()=>{const s=ae(Ie.get()),i=ae(Me.get()),d=Me.getActivePresetId()||ie,o=Ae.get(),m=ct();Ce(s),$e(Le({profiles:s,presets:i,activePresetId:d,audioModelName:o.audioModelName||fe(),imageModelName:o.imageModelName||me(),videoModelName:o.videoModelName||_e(),textModelName:o.textModelName||ue(),showWorkZoneCard:m}))};u.useEffect(()=>{var h;if(!a.openSettings)return;Ke(!1);const s=ae(Ie.get()),i=ae(Me.get()),d=Me.getActivePresetId()||ie,o=Ae.get();let m=!0;const l=Oi(),_=(l==null?void 0:l.action)==="select"&&s.some(N=>N.id===l.profileId)?l.profileId:((h=s[0])==null?void 0:h.id)||z;O(s),Z(i),Ce(s),se(d),$(N=>{var I;return l?_:s.some(C=>C.id===N)?N:((I=s[0])==null?void 0:I.id)||z}),F(N=>{var I;return i.some(C=>C.id===N)?N:((I=i[0])==null?void 0:I.id)||ie}),we(o.audioModelName||fe()),c(o.imageModelName||me()),j(o.videoModelName||_e()),R(o.textModelName||ue());try{m=localStorage.getItem(Ue.WORKZONE_CARD_VISIBLE)!=="false"}catch{m=!0}B(m),P("providers"),re(l&&v?"detail":"catalog"),je("catalog"),xe(""),Te(!1),$e(Le({profiles:s,presets:i,activePresetId:d,audioModelName:o.audioModelName||fe(),imageModelName:o.imageModelName||me(),videoModelName:o.videoModelName||_e(),textModelName:o.textModelName||ue(),showWorkZoneCard:m})),(l==null?void 0:l.action)==="create"&&gs(l,s)},[a.openSettings]),u.useEffect(()=>{if(!k&&f[0]){$(f[0].id);return}k&&f.length>0&&!f.some(s=>s.id===k)&&$(f[0].id)},[f,k]),u.useEffect(()=>{if(!ne&&w[0]){F(w[0].id);return}ne&&w.length>0&&!w.some(s=>s.id===ne)&&F(w[0].id)},[w,ne]),u.useEffect(()=>{xe("")},[k,G]);const ce=(s,i)=>{O(d=>d.map(o=>o.id===s?i(o):o))},gt=(s,i)=>{Z(d=>d.map(o=>o.id===s?i(o):o))},cs=async(s,i)=>{var d,o;try{const m=Ae.get(),l=((d=s.find(S=>S.id===i))==null?void 0:d.id)||((o=s[0])==null?void 0:o.id)||ie,_=s.find(S=>S.id===l)||s[0]||null,h=W(_==null?void 0:_.audio)||m.audioModelName||fe(),N=W(_==null?void 0:_.image)||m.imageModelName||me(),I=W(_==null?void 0:_.video)||m.videoModelName||_e(),C=W(_==null?void 0:_.text)||m.textModelName||m.chatModel||ue();return await Me.update(ae(s)),await Me.setActivePresetId(l),await Ae.update({audioModelName:h,imageModelName:N,videoModelName:I,textModelName:C,chatModel:C}),Z(s),se(l),we(h),c(N),j(I),R(C),Be(),!0}catch(m){return console.error("Failed to persist preset configuration:",m),Y.error("预设保存失败,请重试"),!1}},mt=async(s,i)=>{if(T.trackUIInteraction({area:"settings",action:"provider_enabled_changed",control:"provider_enabled_switch",value:i,source:"settings_dialog",metadata:{profileId:s,isManagedProfile:ke(s)}}),O(d=>d.map(o=>o.id===s?{...o,enabled:i}:o)),!!Se.some(d=>d.id===s))try{await Ie.update(ae(Ie.get()).map(d=>d.id===s?{...d,enabled:i}:d)),Be()}catch(d){console.error("Failed to persist provider enabled state:",d),O(o=>o.map(m=>m.id===s?{...m,enabled:!i}:m)),Y.error("供应商状态保存失败,请重试")}},_t=async s=>{T.trackUIInteraction({area:"settings",action:"workzone_card_visibility_changed",control:"workzone_card_switch",value:s,source:"settings_dialog"}),B(s);try{localStorage.setItem(Ue.WORKZONE_CARD_VISIBLE,String(s)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed")),Be()}catch(i){console.error("Failed to persist canvas visibility state:",i),B(!s),Y.error("画布显示配置保存失败,请重试")}},gs=(s,i)=>{var l;const d=i||f;if(P("providers"),v&&re("detail"),s.action==="select"){const _=d.some(h=>h.id===s.profileId)?s.profileId:((l=d[d.length-1])==null?void 0:l.id)||z;return $(_),d}const o=Ls(d.length+1),m=[...d,o];return O(m),$(o.id),m},ms=()=>{const s=Ls(f.length+1);T.trackUIInteraction({area:"settings",action:"provider_added",control:"add_provider",source:"settings_dialog",metadata:{profilesCount:f.length+1}}),O(i=>[...i,s]),$(s.id),P("providers"),v&&re("detail")};u.useEffect(()=>{if(!a.openSettings)return;const s=i=>{const d=i.detail;d&&gs(d)};return window.addEventListener(ks,s),()=>{window.removeEventListener(ks,s)}},[a.openSettings,v,f]);const _s=async s=>{var m;if(ke(s))return;const i=f.find(l=>l.id===s);if(!await g({title:"确认删除供应商",description:`确定要删除供应商「${(i==null?void 0:i.name)||"未命名供应商"}」吗?相关预设里的路由会被清空。`,confirmText:"删除",cancelText:"取消",danger:!0}))return;T.trackUIInteraction({area:"settings",action:"provider_deleted",control:"delete_provider",source:"settings_dialog",metadata:{profileId:s,profilesCount:Math.max(0,f.length-1)}});const o=f.filter(l=>l.id!==s);O(o),Z(l=>l.map(_=>zi(_,s))),k===s&&$(((m=o[0])==null?void 0:m.id)||z),v&&re("catalog")},us=u.useCallback(s=>{const i=f.find(o=>o.id===s);if(!i)return;const d={...ae(i),id:ss("profile"),name:`${i.name} (副本)`};O(o=>[...o,d]),T.trackUIInteraction({area:"settings",action:"provider_cloned",control:"clone_provider",source:"settings_dialog",metadata:{profileId:s,clonedProfileId:d.id,profilesCount:f.length+1}}),$(d.id),P("providers"),v&&re("detail")},[f,v]),Fe=Vt(),ut=u.useCallback(s=>{const i=[{key:"clone",label:"克隆",icon:e.jsx(Wt,{size:14}),onSelect:us}];return ke(s)||i.push({key:"divider",type:"divider"},{key:"delete",label:"删除",icon:e.jsx(Ss,{size:14}),danger:!0,onSelect:_s}),i},[us]),hs=()=>{var d;const s=((d=nt[0])==null?void 0:d.id)||null,i=Ri(s,{audio:be||fe(),image:le||me(),video:M||_e(),text:A||ue()});Z(o=>[...o,i]),T.trackUIInteraction({area:"settings",action:"preset_added",control:"add_preset",source:"settings_dialog",metadata:{presetId:i.id,presetsCount:w.length+1,hasFallbackProfile:!!s}}),F(i.id),P("presets"),v&&je("detail")},ht=async s=>{var m,l;if(w.length<=1)return;const i=w.find(_=>_.id===s);if(!await g({title:"确认删除预设",description:`确定要删除预设「${(i==null?void 0:i.name)||"未命名预设"}」吗?此操作不可撤销。`,confirmText:"删除",cancelText:"取消",danger:!0}))return;T.trackUIInteraction({area:"settings",action:"preset_deleted",control:"delete_preset",source:"settings_dialog",metadata:{presetId:s,presetsCount:Math.max(0,w.length-1)}});const o=w.filter(_=>_.id!==s);Z(o),oe===s&&se(((m=o[0])==null?void 0:m.id)||ie),ne===s&&F(((l=o[0])==null?void 0:l.id)||ie),v&&je("catalog")},ps=(s,i)=>{if(!U)return;const d=w.map(o=>o.id===U.id?Ui(o,s,{defaultModelRef:i}):o);Z(d),T.trackUIInteraction({area:"settings",action:"route_model_changed",control:"route_model_dropdown",value:s,source:"settings_dialog",metadata:{presetId:U.id,routeType:s,hasModel:!!(i!=null&&i.modelId),hasProfile:!!(i!=null&&i.profileId)}}),cs(d,oe)},pt=async()=>{if(!r){Y.warning("请先选择供应商配置");return}if(rs&&!await fs(!1))return;const s=r.apiKey.trim(),i=Xe(r.baseUrl.trim()||ze);if(!s){Y.warning("请先填写 API Key");return}try{T.trackUIInteraction({area:"settings",action:"model_discovery_started",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id}}),await Pe.discover(r.id,i,s),T.trackUIInteraction({area:"settings",action:"model_discovery_succeeded",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id}}),Te(!0)}catch(d){const o=d instanceof Error?d.message:"模型同步失败";T.trackUIInteraction({area:"settings",action:"model_discovery_failed",control:"fetch_models",source:"settings_dialog",metadata:{profileId:r.id,error:o}}),Pe.setError(r.id,o),Y.error({content:o,duration:3600})}},vs=(s,i)=>{var l,_,h;if(!r)return;const d=Pe.applySelection(r.id,s),o=d.models;if(r.id===z){const N=o.filter(x=>x.type==="image"),I=o.filter(x=>x.type==="video"),C=o.filter(x=>x.type==="text"),S=L.discoveredModels.filter(x=>x.type==="image").map(x=>x.id),q=L.discoveredModels.filter(x=>x.type==="video").map(x=>x.id),E=L.discoveredModels.filter(x=>x.type==="text").map(x=>x.id);!N.some(x=>x.id===le)&&S.includes(le)&&c(((l=N[0])==null?void 0:l.id)||me()),!I.some(x=>x.id===M)&&q.includes(M)&&j(((_=I[0])==null?void 0:_.id)||_e()),!C.some(x=>x.id===A)&&E.includes(A)&&R(((h=C[0])==null?void 0:h.id)||ue())}const m=(i==null?void 0:i.successMessage)||Ii(r.name,d.addedModelIds.length,d.removedModelIds.length,o.length);m&&Y.success(m),T.trackUIInteraction({area:"settings",action:"discovered_models_applied",control:"model_discovery_dialog",source:"settings_dialog",metadata:{profileId:r.id,selectedCount:o.length,addedCount:d.addedModelIds.length,removedCount:d.removedModelIds.length}}),Te(!1)},vt=s=>{if(!r)return;if(!L.selectedModelIds.includes(s)){Y.warning("该模型不是当前分组动态添加的模型,无法在此移除");return}const i=L.selectedModelIds.filter(d=>d!==s);vs(i)},xs=()=>{n(s=>({...s,openSettings:!1}))},fs=async(s=!1)=>{var i,d,o,m,l,_;if(is)return!1;as(!0);try{const h=f.map(p=>{var Ne,Ee;const V=p.baseUrl.trim()?Xe(p.baseUrl):"";return{...p,name:p.name.trim()||"未命名供应商",iconUrl:((Ne=p.iconUrl)==null?void 0:Ne.trim())||void 0,homepageUrl:((Ee=p.homepageUrl)==null?void 0:Ee.trim())||void 0,baseUrl:V,apiKey:p.apiKey.trim()}}),N=new Set(h.map(p=>p.id)),I=w.map(p=>{const V={...p,name:p.name.trim()||"未命名预设",audio:{...p.audio},image:{...p.image},video:{...p.video},text:{...p.text}};return["image","video","audio","text"].forEach(Ne=>{const Ee=V[Ne],Ye=De(Ee),Ms=W(Ee);if(Ye&&!N.has(Ye)){V[Ne]=he(pe(null,Ms));return}V[Ne]=he(pe(Ye,Ms))}),V}),C=((i=I.find(p=>p.id===oe))==null?void 0:i.id)||((d=I[0])==null?void 0:d.id)||ie,S=I.find(p=>p.id===C)||I[0]||null,q=h.find(p=>p.id===z)||h[0],E=Xe((q==null?void 0:q.baseUrl)||ze),x=be.trim()||((o=at[0])==null?void 0:o.id)||fe(),te=le.trim()||((m=ns[0])==null?void 0:m.id)||me(),D=M.trim()||((l=os[0])==null?void 0:l.id)||_e(),X=A.trim()||((_=ls[0])==null?void 0:_.id)||ue(),He=W(S==null?void 0:S.image)||te,ge=W(S==null?void 0:S.video)||D,Mt=W(S==null?void 0:S.audio)||x,Pt=W(S==null?void 0:S.text)||X;h.forEach(p=>{Pe.invalidateIfConfigChanged(p.id,p.baseUrl||ze,p.apiKey||"")}),await Xt.updateSettings({gemini:{...Ae.get(),apiKey:(q==null?void 0:q.apiKey)||"",baseUrl:E,audioModelName:Mt,imageModelName:He,videoModelName:ge,textModelName:Pt},providerProfiles:h,providerCatalogs:Pe.getCatalogs().filter(p=>N.has(p.profileId)),invocationPresets:I,activePresetId:C});try{localStorage.setItem(Ue.WORKZONE_CARD_VISIBLE,String(H)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed"))}catch{}return O(h),Ce(ae(h)),Z(I),se(C),we(x),c(te),j(D),R(X),$e(Le({profiles:h,presets:I,activePresetId:C,audioModelName:x,imageModelName:te,videoModelName:D,textModelName:X,showWorkZoneCard:H})),s&&xs(),T.trackUIInteraction({area:"settings",action:"settings_saved",control:"save_settings",source:"settings_dialog",metadata:{closeAfterSave:s,profilesCount:h.length,presetsCount:I.length,enabledProfilesCount:h.filter(p=>p.enabled).length}}),h.forEach(p=>{const V=Jt(p.baseUrl);T.track("provider_endpoint_configured",{profileId:p.id,providerType:p.providerType,providerOrigin:V==null?void 0:V.origin,providerHost:V==null?void 0:V.host,providerProtocol:V==null?void 0:V.protocol,enabled:p.enabled,authType:p.authType,supportsText:p.capabilities.supportsText,supportsImage:p.capabilities.supportsImage,supportsVideo:p.capabilities.supportsVideo,supportsAudio:p.capabilities.supportsAudio,supportsTools:p.capabilities.supportsTools,hasApiKey:!!p.apiKey})}),!0}catch(h){return console.error("Failed to persist settings drafts:",h),T.trackUIInteraction({area:"settings",action:"settings_save_failed",control:"save_settings",source:"settings_dialog",metadata:{closeAfterSave:s,error:h instanceof Error?h.message:String(h)}}),Y.error("设置保存失败,请稍后重试"),!1}finally{as(!1)}},xt=()=>{if(!rs){xs();return}(async()=>await fs(!0)||Y.warning("设置尚未保存,请检查后重试"))()},ft=()=>{ts||is||xt()},ys=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell settings-dialog__sidebar-shell--catalog",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"供应商目录"}),v?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:ms,children:"新增供应商"}):null]}),v?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先从列表里选择供应商,再进入对应的配置页面。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:f.map(s=>{const i=s.id===(r==null?void 0:r.id);return e.jsxs("div",{className:`settings-dialog__provider-row ${i?"settings-dialog__provider-row--active":""} ${s.enabled?"":"settings-dialog__provider-row--disabled"}`,onContextMenu:d=>{d.preventDefault(),Fe.open(d,s.id)},children:[e.jsxs("button",{type:"button",className:"settings-dialog__provider-select",onClick:()=>dt(s.id),"aria-pressed":i,children:[e.jsxs("span",{className:"settings-dialog__provider-select-main",children:[e.jsx($s,{profile:s}),e.jsxs("span",{className:"settings-dialog__provider-copy",children:[e.jsxs("span",{className:"settings-dialog__provider-name-row",children:[e.jsx("span",{className:"settings-dialog__provider-name",children:s.name}),s.id===z?e.jsx("span",{className:"settings-dialog__provider-tag",children:"默认"}):null]}),v?e.jsxs("span",{className:"settings-dialog__provider-meta",children:[e.jsx("span",{children:Je[s.providerType].label}),e.jsx("span",{children:s.enabled?"启用":"停用"})]}):null]})]}),v?e.jsx(qe,{size:16,className:"settings-dialog__provider-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__provider-switch",children:[e.jsx("span",{className:"settings-dialog__provider-switch-copy",children:s.enabled?"启用":"停用"}),e.jsx(Qe,{size:"small",value:s.enabled,disabled:s.id===z,onChange:d=>void mt(s.id,d)})]})]},s.id)})}),e.jsx(qt,{state:Fe.contextMenu,items:ut,onClose:Fe.close,zIndex:2e4}),v?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:ms,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增供应商"})]})]}),bs=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"默认模型"}),v?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:hs,children:"新增预设"}):null]}),v?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先选中一个预设,再进入详情页调整默认路由。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:w.map(s=>{const i=s.id===(U==null?void 0:U.id),d=s.id===oe,o=Rs(s);return e.jsxs("button",{type:"button",className:`settings-dialog__sidebar-item ${i?"settings-dialog__sidebar-item--active":""}`,onClick:()=>rt(s.id),children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-head",children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-top",children:[e.jsx("span",{children:s.name}),d?e.jsx("span",{className:"settings-dialog__sidebar-badge settings-dialog__sidebar-badge--accent",children:"当前"}):null]}),v?e.jsx(qe,{size:16,className:"settings-dialog__sidebar-item-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__sidebar-item-meta",children:[e.jsxs("span",{children:[o,"/3 已配置"]}),v?e.jsx("span",{children:d?"正在生效":"点击查看详情"}):null]})]},s.id)})}),v?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:hs,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增预设"})]})]}),js=(s,i)=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsx("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--compact",children:e.jsx("div",{className:"settings-dialog__mobile-stage",children:i},s)})}),Ns=(s=!1)=>{if(!r)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个供应商。"});const i=Os(L.models),d=Us(r,Se),o=i.image+i.video+i.text,m=ki(r);return e.jsxs("div",{className:`settings-dialog__content-panel settings-dialog__content-panel--providers ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>re("catalog"),children:[e.jsx(Cs,{size:16}),e.jsx("span",{children:"返回供应商目录"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"供应商配置"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"进入详情后再编辑接口信息、密钥和模型同步配置。"})]})]}):null,e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("a",{className:`settings-dialog__profile-hero ${m?"settings-dialog__profile-hero--link":""}`,href:m||void 0,target:"_blank",rel:"noopener noreferrer","aria-label":m?`打开 ${r.name} 域名页面`:void 0,onClick:l=>{m||l.preventDefault()},children:[e.jsx($s,{profile:r,size:"large"}),e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:r.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:Je[r.providerType].label}),e.jsx("span",{children:r.enabled?"启用":"停用"}),e.jsxs("span",{children:[o," 个模型"]}),e.jsx("span",{children:d==="saved"?"已保存":"未保存"})]})]})]}),ke(r.id)?null:e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>_s(r.id),children:"删除"})]})}),e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"基础配置"})})}),e.jsxs("div",{className:"settings-dialog__grid",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:r.name,onChange:l=>ce(r.id,_=>({..._,name:l.target.value}))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"接口类型"}),e.jsx("select",{className:"settings-dialog__select",value:r.providerType,onChange:l=>ce(r.id,_=>{const h=l.target.value,N=Vs(_.providerType),I=Vs();return{..._,providerType:h,authType:_.authType===N?I:_.authType}}),children:fi.map(l=>e.jsx("option",{value:l,children:Je[l].label},l))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图片接口格式"}),e.jsx("select",{className:"settings-dialog__select",value:r.imageApiCompatibility||Ys,onChange:l=>ce(r.id,_=>({..._,imageApiCompatibility:l.target.value})),children:yi.map(l=>e.jsx("option",{value:l,children:es[l].label},l))}),e.jsx("span",{className:"settings-dialog__field-hint",children:tt})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--full",style:{display:"flex",alignItems:"center",gap:"8px",flexWrap:"wrap"},children:[e.jsx("label",{className:"settings-dialog__label",style:{margin:0},children:"图片优先使用异步接口(实验功能,建议不要开,还未上线)"}),e.jsx(Qe,{size:"small",value:r.preferAsyncImageEndpoint??!1,onChange:l=>{const _=l;ce(r.id,h=>({...h,preferAsyncImageEndpoint:_})),Ie.update(ae(Ie.get()).map(h=>h.id===r.id?{...h,preferAsyncImageEndpoint:_}:h))}}),e.jsx("span",{className:"settings-dialog__field-hint",style:{width:"100%"},children:"开启后,支持异步接口的图片模型将优先使用 /v1/videos 异步接口生成"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图标 URL"}),e.jsx("input",{type:"url",className:"settings-dialog__input",value:r.iconUrl||"",onChange:l=>ce(r.id,_=>({..._,iconUrl:l.target.value})),placeholder:"可选,留空时自动生成默认图标"}),e.jsx("span",{className:"settings-dialog__field-hint",children:"支持填写远程图片地址;未填写时将根据供应商名称生成默认图标。"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API 地址"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:r.baseUrl,onChange:l=>ce(r.id,_=>({..._,baseUrl:l.target.value})),placeholder:ze})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxs("div",{className:"settings-dialog__label-with-tooltip settings-dialog__label-with-tooltip--left",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API Key"}),e.jsx(J,{content:e.jsxs("div",{style:{maxWidth:480},children:["您可以从以下地址获取 API Key:",e.jsx("br",{}),e.jsx("a",{href:"https://api.tu-zi.com/token",target:"_blank",rel:"noopener noreferrer",style:{color:"#F39C12",textDecoration:"none",display:"inline-block",marginBottom:8},children:"api.tu-zi.com/token"}),e.jsx("div",{style:{position:"relative",width:"100%",paddingTop:"56.25%",marginTop:8,borderRadius:8,overflow:"hidden",backgroundColor:"#000",boxShadow:"0 4px 16px rgba(0,0,0,0.2)"},children:e.jsx("iframe",{title:"Bilibili tutorial video",src:"//player.bilibili.com/player.html?isOutside=true&aid=116171584049629&bvid=BV1k4PqzPEKz&cid=36455319822&p=1",allowFullScreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",border:0}})})]}),placement:"top",theme:"light",showArrow:!1,overlayStyle:{maxWidth:"none"},children:e.jsx(Zt,{className:"settings-dialog__tooltip-icon"})})]}),e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"center",width:"100%",flexDirection:v?"column":"row"},children:[e.jsxs("div",{className:"settings-dialog__secret-input-wrap",style:{flex:v?"none":1},children:[e.jsx("input",{type:Oe?"text":"password",className:"settings-dialog__input settings-dialog__secret-input",value:r.apiKey,onChange:l=>ce(r.id,_=>({..._,apiKey:l.target.value})),autoComplete:"off"}),e.jsx(J,{content:Oe?"隐藏 API Key":"查看 API Key",showArrow:!1,children:e.jsx("button",{type:"button",className:"settings-dialog__secret-toggle","aria-label":Oe?"隐藏 API Key":"查看 API Key",onMouseDown:l=>l.preventDefault(),onClick:()=>Ke(l=>!l),children:Oe?e.jsx(Ht,{size:16}):e.jsx(Yt,{size:16})})})]}),e.jsx("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",style:{whiteSpace:"nowrap",height:v?"42px":"32px",width:v?"100%":"auto"},onClick:pt,disabled:!Ge||L.status==="loading",children:L.status==="loading"?e.jsxs(e.Fragment,{children:[e.jsx(Qt,{size:15,className:"settings-dialog__button-spinner"}),"同步中"]}):"获取模型"})]})]})]})]}),e.jsx(hi,{profile:r,onUpdateProfile:l=>ce(r.id,l)}),r.id===z?e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__compat-card",children:[e.jsx("div",{className:"settings-dialog__compat-title",children:"兼容默认模型"}),e.jsxs("div",{className:"settings-dialog__compat-meta",children:[e.jsxs("span",{children:["图片:",le||me()]}),e.jsxs("span",{children:["视频:",M||_e()]}),e.jsxs("span",{children:["音频:",be||fe()]}),e.jsxs("span",{children:["文本:",A||ue()]})]})]})}):null,yt()]},s?`provider-detail-${r.id}`:void 0)},We=u.useCallback(s=>{s.profileId&&(di({profileId:s.profileId,modelId:s.modelId,modality:s.modality,compareMode:s.compareMode}),T.trackUIInteraction({area:"settings",action:"model_benchmark_launched",control:"model_benchmark",source:"settings_dialog",metadata:{profileId:s.profileId,modality:s.modality,compareMode:s.compareMode,hasModel:!!s.modelId}}))},[n]),yt=()=>{const s=r?Us(r,Se):"saved",i=!!(r!=null&&r.apiKey.trim())&&s==="saved"&&L.status!=="loading",d=(r==null?void 0:r.id)===z,o=Ei(L.models),m=new Map(Ks.map((E,x)=>[E,x])),l=it.trim(),_=Os(o),h=o.filter(E=>wi(E,l)),N=Mi.map(E=>({type:E,models:h.filter(x=>x.type===E).sort((x,te)=>{const D=m.get(x.vendor)??Number.MAX_SAFE_INTEGER,X=m.get(te.vendor)??Number.MAX_SAFE_INTEGER;return D!==X?D-X:si(x,te)})})).filter(E=>E.models.length>0),I=Ge||o.length>0,C=o.length>0&&h.length===0&&!!l,S=L.status==="error"&&o.length===0,q=!Ge&&o.length===0;return e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:"模型"}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsxs("span",{children:["已添加 ",o.length," 个"]}),e.jsxs("span",{children:["图 ",_.image]}),e.jsxs("span",{children:["视 ",_.video]}),e.jsxs("span",{children:["音 ",_.audio]}),e.jsxs("span",{children:["文 ",_.text]})]})]})}),I?e.jsx("div",{className:"settings-dialog__model-toolbar",children:e.jsxs("label",{className:`settings-dialog__model-search ${o.length===0?"settings-dialog__model-search--disabled":""}`,children:[e.jsx(Bs,{size:15}),e.jsx("input",{type:"text",value:de,onChange:E=>xe(E.target.value),placeholder:o.length>0?"搜索模型 ID、名称或品牌":"获取模型后可搜索",disabled:o.length===0}),de?e.jsx("button",{type:"button",className:"settings-dialog__model-search-clear",onClick:()=>xe(""),"aria-label":"清空搜索",children:e.jsx(Gs,{size:14})}):null]})}):null,N.length>0?e.jsx("div",{className:"settings-dialog__model-type-groups",children:N.map(({type:E,models:x})=>{const te=Js.has(E);return e.jsxs("div",{className:"settings-dialog__model-type-group",children:[e.jsxs("div",{className:"settings-dialog__model-type-header",style:{cursor:"pointer"},onClick:()=>st(E),children:[e.jsxs("div",{className:"settings-dialog__model-type-meta",children:[te?e.jsx(qe,{size:16,className:"settings-dialog__model-type-toggle"}):e.jsx(Zs,{size:16,className:"settings-dialog__model-type-toggle"}),e.jsx("span",{className:"settings-dialog__model-type-title",children:bi[E]}),e.jsx("span",{className:"settings-dialog__model-type-count",children:x.length})]}),e.jsx(J,{content:i?"测试当前供应商这一组模型":"请先保存供应商配置并确保 API Key 可用",showArrow:!1,children:e.jsx("button",{type:"button",className:"settings-dialog__model-group-test",onClick:D=>{D.stopPropagation(),r&&We({profileId:r.id,modality:E,compareMode:"cross-model"})},disabled:!i,children:"测试本组"})})]}),!te&&e.jsx("div",{className:"settings-dialog__model-type-list",children:x.map(D=>{const X=Fs(D.vendor),He=!d||L.selectedModelIds.includes(D.id);return e.jsxs("div",{className:"settings-dialog__model-type-item",style:{"--model-brand-accent":X.accent,"--model-brand-surface":X.surface,"--model-brand-border":X.border},children:[e.jsx("span",{className:"settings-dialog__model-type-item-logo",children:e.jsx(Ws,{vendor:D.vendor,size:16})}),e.jsxs("div",{className:"settings-dialog__model-type-item-copy",children:[e.jsx(Ni,{profileId:r.id,modelId:D.id}),e.jsx("span",{className:"settings-dialog__model-type-item-vendor",children:Ve(D.vendor)}),e.jsx(ji,{profileId:r.id,modelId:D.id})]}),e.jsxs("div",{className:"settings-dialog__model-type-item-btns",children:[(()=>{const ge=ti.getLatestEntryStatus(r.id,D.id);return ge==="completed"?e.jsx(J,{content:"上次测试成功",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("span",{className:"settings-dialog__model-status settings-dialog__model-status--ok"})})}):ge==="failed"?e.jsx(J,{content:"上次测试失败",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("span",{className:"settings-dialog__model-status settings-dialog__model-status--fail"})})}):null})(),e.jsx(J,{content:i?"测试":"请先保存供应商配置并确保 API Key 可用",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("button",{type:"button",className:"settings-dialog__model-icon-btn settings-dialog__model-icon-btn--test",onClick:ge=>{ge.stopPropagation(),r&&We({profileId:r.id,modality:E,modelId:D.id,compareMode:"cross-provider"})},disabled:!i,children:e.jsx(Hs,{size:14})})})}),He?e.jsx(J,{content:"移除此模型",showArrow:!1,children:e.jsx("span",{className:"settings-dialog__model-tip-trigger",children:e.jsx("button",{type:"button",className:"settings-dialog__model-icon-btn settings-dialog__model-icon-btn--delete",onClick:ge=>{ge.stopPropagation(),vt(D.id)},children:e.jsx(Ss,{size:14})})})}):null]})]},D.id)})})]},E)})}):C?e.jsx("div",{className:"settings-dialog__model-empty",children:"没有匹配的模型,试试搜索品牌名或更完整的模型 ID。"}):S?e.jsxs("div",{className:"settings-dialog__model-empty settings-dialog__model-empty--error",children:[e.jsx(ii,{size:16}),e.jsx("span",{children:L.error||"模型获取失败,请稍后重试"})]}):q?e.jsx("div",{className:"settings-dialog__model-empty",children:"填写 API Key 后即可获取模型,获取完成后可在这里检索和浏览。"}):e.jsx("div",{className:"settings-dialog__model-empty",children:"还没有已添加的模型"})]})},bt=(s,i,d)=>{const o=De(d),m=W(d);return f.filter(l=>l.id===o||l.enabled&&l.capabilities[i]).map(l=>{const h=(l.id===z?s==="image"?ns:s==="video"?os:ls:Pe.getState(l.id).models.filter(N=>N.type===s)).filter((N,I,C)=>C.findIndex(S=>S.id===N.id)===I);return l.id===o&&m&&!h.some(N=>N.id===m)&&h.unshift({id:m,label:m,shortLabel:m,type:s,vendor:ai.OTHER}),{profile:l,models:h}}).filter(l=>l.models.length>0)},Ze=(s,i,d)=>{var I;const o=bt(s,d,i),m=De(i),l=W(i),_=((I=f.find(C=>C.id===m))==null?void 0:I.name)||"未配置",h=Vi(o),N=m&&l?`${m}::${l}`:l||void 0;return e.jsxs("div",{className:`settings-dialog__route-card settings-dialog__route-card--${s}`,children:[e.jsx("div",{className:"settings-dialog__route-card-top",children:e.jsx("div",{className:"settings-dialog__route-card-title",children:Ds[s]})}),e.jsxs("div",{className:"settings-dialog__stack",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"默认模型"}),e.jsxs("div",{className:"settings-dialog__route-model-picker",children:[e.jsx(ei,{variant:"form",selectedModel:l||"",selectedSelectionKey:N,models:h,providerProfilesOverride:f,placement:"down",placeholder:`搜索${Ds[s]}模型或供应商`,allowCustomValue:!1,showProviderAction:!1,onSelect:(C,S)=>{ps(s,S||pe(null,C))},disabled:h.length===0}),l?e.jsx("button",{type:"button",className:"settings-dialog__route-clear",onClick:()=>ps(s,null),children:"清空"}):null]})]}),e.jsxs("div",{className:"settings-dialog__route-meta",children:[e.jsx("span",{children:_}),e.jsx("span",{children:l||"未选择模型"}),o.length===0?e.jsx("span",{children:"暂无可选模型"}):null]})]})]})},Is=(s=!1)=>{if(!U)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个默认模型预设。"});const i=Rs(U),d=U.id===oe;return e.jsxs("div",{className:`settings-dialog__content-panel ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>je("catalog"),children:[e.jsx(Cs,{size:16}),e.jsx("span",{children:"返回模型预设"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"模型预设"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"在这里设置图片、视频和文本模型的默认路由。"})]})]}):null,e.jsxs("div",{className:"settings-dialog__section",children:[e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:U.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:d?"当前预设":"未激活"}),e.jsxs("span",{children:[i,"/3 已配置"]})]})]}),e.jsxs("div",{className:"settings-dialog__inline-row",children:[e.jsx("button",{type:"button",className:"settings-dialog__ghost-button",onClick:()=>{cs(w,U.id)},children:"设为当前预设"}),e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>ht(U.id),disabled:w.length<=1,children:"删除预设"})]})]}),e.jsx("div",{className:"settings-dialog__grid",children:e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"预设名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:U.name,onChange:o=>gt(U.id,m=>({...m,name:o.target.value}))})]})})]}),e.jsxs("div",{className:"settings-dialog__routes",children:[Ze("image",U.image,"supportsImage"),Ze("video",U.video,"supportsVideo"),Ze("text",U.text,"supportsText")]})]},s?`preset-detail-${U.id}`:void 0)},jt=()=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsxs("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--canvas",children:[v?e.jsx("div",{className:"settings-dialog__compact-stage-header",children:e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"画布显示"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"手机上会以更集中的卡片形式展示,方便快速切换画布相关开关。"})]})}):null,e.jsxs("div",{className:"settings-dialog__section settings-dialog__section--canvas-card",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"画布显示配置"})})}),e.jsxs("div",{className:"settings-dialog__preference settings-dialog__preference--panel",children:[e.jsxs("div",{className:"settings-dialog__toggle-copy",children:[e.jsx("span",{className:"settings-dialog__toggle-title",children:"任务进度卡片"}),e.jsx("span",{className:"settings-dialog__toggle-desc",children:"在画布中显示任务进度卡片,便于追踪当前生成状态。"})]}),e.jsx(Qe,{size:"small",value:H,onChange:s=>void _t(s)})]})]})]})}),Nt=()=>e.jsx("aside",{className:"settings-dialog__nav",children:e.jsx("div",{className:"settings-dialog__nav-shell",children:e.jsx("div",{className:"settings-dialog__nav-list",children:xi.map(s=>e.jsx("button",{type:"button",className:`settings-dialog__nav-item ${G===s.value?"settings-dialog__nav-item--active":""}`,onClick:()=>lt(s.value),children:e.jsx("span",{className:"settings-dialog__nav-item-title",children:s.label})},s.value))})})}),It=()=>G==="canvas"?jt():G==="speech"?e.jsx(li,{}):G==="presets"?ds?Xs==="catalog"?js("presets-catalog",bs()):Is(!0):e.jsxs("div",{className:`settings-dialog__workspace ${v?"settings-dialog__workspace--show-sidebar":""}`,children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:bs()}),Is(!1)]}):ds?qs==="catalog"?js("providers-catalog",ys()):Ns(!0):e.jsxs("div",{className:`settings-dialog__workspace ${v?"settings-dialog__workspace--show-sidebar":""}`,children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:ys()}),Ns(!1)]});return e.jsxs(e.Fragment,{children:[e.jsx($t,{id:"settings-dialog",visible:a.openSettings,title:"设置",onClose:ft,width:v?"100%":"88%",height:v?"100%":"88%",minWidth:v?Math.max(320,Math.min(K-16,640)):1080,minHeight:v?Math.max(520,Math.min(Q-16,820)):680,x:"center",y:"center",maximizable:!0,minimizable:!1,resizable:!v,movable:!v,modal:!1,className:"winbox-ai-generation winbox-tool-window winbox-settings-window",container:t,background:"#ffffff",children:e.jsx("div",{ref:ve,className:`settings-dialog ${v?"settings-dialog--compact":""}`,"data-testid":"settings-dialog",children:e.jsxs("div",{className:"settings-dialog__layout",children:[Nt(),e.jsx("div",{className:"settings-dialog__main",children:It()})]})})}),e.jsx(ui,{open:ts,container:t,models:L.discoveredModels,selectedModelIds:L.selectedModelIds,onClose:()=>Te(!1),onConfirm:vs,onTestModel:s=>{if(!r)return;const i=L.discoveredModels.find(d=>d.id===s);We({profileId:r.id,modelId:s,modality:(i==null?void 0:i.type)||"image",compareMode:"cross-provider"})}}),b]})};export{Hi as IMAGE_MODEL_GROUPED_OPTIONS,Fi as SettingsDialog,Yi as VIDEO_MODEL_OPTIONS};
@@ -1 +1 @@
1
- import{cm as I,P as a,R as g,a8 as s,i5 as C,i6 as w,i7 as E,aa as P,lN as W}from"./ai-chat-B-XdoWBQ.js";import{I as O,S as R}from"./bootstrap-DadYvnge.js";import{c as B}from"./tool-windows-BnDZa9FH.js";const D=()=>s.jsxs("svg",{className:"size-picker-icon",viewBox:"0 0 24 24",children:[s.jsx("line",{x1:"4",y1:"8",x2:"20",y2:"8",strokeWidth:"1",stroke:"currentColor"}),s.jsx("line",{x1:"4",y1:"12",x2:"20",y2:"12",strokeWidth:"2",stroke:"currentColor"}),s.jsx("line",{x1:"4",y1:"16",x2:"20",y2:"16",strokeWidth:"3",stroke:"currentColor"})]}),U=({size:t,onSizeChange:l,onSizeCommit:n,presets:j,previewColor:K,title:d,min:c=1,max:v,container:y,icon:S})=>{const{t:M}=I(),[i,h]=a.useState(!1),[o,r]=a.useState(String(t)),[f,k]=a.useState(t),p=v??Math.max(256,...j);g.useEffect(()=>{r(String(t))},[t]),g.useEffect(()=>{i||k(t)},[i,t]);const u=a.useCallback(e=>{e!==f&&(n==null||n(e),k(e))},[f,n]),b=a.useCallback(e=>{r(e.target.value)},[]),x=a.useCallback(()=>{const e=parseInt(o,10);!isNaN(e)&&e>=c&&e<=p?(l(e),u(e)):r(String(t))},[u,o,p,c,t,l]),N=a.useCallback(e=>{e.key==="Enter"?(x(),e.target.blur()):e.key==="Escape"&&(r(String(t)),e.target.blur())},[x,t]);return s.jsxs(s.Fragment,{children:[s.jsxs(C,{sideOffset:12,open:i,onOpenChange:e=>{e||u(t),h(e)},placement:"bottom",children:[s.jsx(w,{asChild:!0,children:s.jsx(B,{className:"size-picker-button",type:"button",visible:!0,tooltip:d,"aria-label":d,onPointerUp:()=>h(!i),children:S||s.jsx(D,{})})}),s.jsx(E,{container:y,children:s.jsx(O,{padding:4,className:P("size-picker-popover"),children:s.jsxs(R.Row,{gap:3,align:"center",style:{padding:"4px 8px"},children:[s.jsxs("div",{className:"size-picker-value",style:{minWidth:"40px",fontSize:"13px",fontWeight:500,color:"var(--color-on-surface)"},children:[t,"px"]}),s.jsx("div",{className:"size-picker-slider-wrapper",style:{flex:1,minWidth:"160px"},children:s.jsx(W,{value:t,min:c,max:p,step:1,onChange:e=>{const m=e;r(String(m)),l(m)},label:!1})})]})})})]}),s.jsxs("div",{className:"size-picker-input-wrapper",children:[s.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",value:o,onChange:b,onBlur:x,onKeyDown:N,className:"size-picker-input"}),s.jsx("span",{className:"size-picker-input-unit",children:"px"})]})]})};export{U as S};
1
+ import{cm as I,P as a,R as g,a8 as s,i5 as C,i6 as w,i7 as E,aa as P,lN as W}from"./ai-chat-BnWVpTEI.js";import{I as O,S as R}from"./bootstrap-CQRLkOtk.js";import{c as B}from"./tool-windows-Bf_pMml-.js";const D=()=>s.jsxs("svg",{className:"size-picker-icon",viewBox:"0 0 24 24",children:[s.jsx("line",{x1:"4",y1:"8",x2:"20",y2:"8",strokeWidth:"1",stroke:"currentColor"}),s.jsx("line",{x1:"4",y1:"12",x2:"20",y2:"12",strokeWidth:"2",stroke:"currentColor"}),s.jsx("line",{x1:"4",y1:"16",x2:"20",y2:"16",strokeWidth:"3",stroke:"currentColor"})]}),U=({size:t,onSizeChange:l,onSizeCommit:n,presets:j,previewColor:K,title:d,min:c=1,max:v,container:y,icon:S})=>{const{t:M}=I(),[i,h]=a.useState(!1),[o,r]=a.useState(String(t)),[f,k]=a.useState(t),p=v??Math.max(256,...j);g.useEffect(()=>{r(String(t))},[t]),g.useEffect(()=>{i||k(t)},[i,t]);const u=a.useCallback(e=>{e!==f&&(n==null||n(e),k(e))},[f,n]),b=a.useCallback(e=>{r(e.target.value)},[]),x=a.useCallback(()=>{const e=parseInt(o,10);!isNaN(e)&&e>=c&&e<=p?(l(e),u(e)):r(String(t))},[u,o,p,c,t,l]),N=a.useCallback(e=>{e.key==="Enter"?(x(),e.target.blur()):e.key==="Escape"&&(r(String(t)),e.target.blur())},[x,t]);return s.jsxs(s.Fragment,{children:[s.jsxs(C,{sideOffset:12,open:i,onOpenChange:e=>{e||u(t),h(e)},placement:"bottom",children:[s.jsx(w,{asChild:!0,children:s.jsx(B,{className:"size-picker-button",type:"button",visible:!0,tooltip:d,"aria-label":d,onPointerUp:()=>h(!i),children:S||s.jsx(D,{})})}),s.jsx(E,{container:y,children:s.jsx(O,{padding:4,className:P("size-picker-popover"),children:s.jsxs(R.Row,{gap:3,align:"center",style:{padding:"4px 8px"},children:[s.jsxs("div",{className:"size-picker-value",style:{minWidth:"40px",fontSize:"13px",fontWeight:500,color:"var(--color-on-surface)"},children:[t,"px"]}),s.jsx("div",{className:"size-picker-slider-wrapper",style:{flex:1,minWidth:"160px"},children:s.jsx(W,{value:t,min:c,max:p,step:1,onChange:e=>{const m=e;r(String(m)),l(m)},label:!1})})]})})})]}),s.jsxs("div",{className:"size-picker-input-wrapper",children:[s.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",value:o,onChange:b,onBlur:x,onKeyDown:N,className:"size-picker-input"}),s.jsx("span",{className:"size-picker-input-unit",children:"px"})]})]})};export{U as S};
@@ -1,3 +1,3 @@
1
- import{nF as E}from"./ai-chat-B-XdoWBQ.js";const g=/^(调用|CALL)\s+(\S+)/im,S=/^-\s*([\w]+)\s*:\s*(.+)/,L=/^\d+(\.\d+)?$/,R=/^\s*(#|\/\/)/;class d{static parse(t,s,a="skill",r){if(!t||!t.trim())return null;const o=t.split(`
1
+ import{nF as E}from"./ai-chat-BnWVpTEI.js";const g=/^(调用|CALL)\s+(\S+)/im,S=/^-\s*([\w]+)\s*:\s*(.+)/,L=/^\d+(\.\d+)?$/,R=/^\s*(#|\/\/)/;class d{static parse(t,s,a="skill",r){if(!t||!t.trim())return null;const o=t.split(`
2
2
  `),n=[];let e=null,l=0;for(const p of o){const m=p.trim();if(!m||R.test(m))continue;const f=m.match(g);if(f){e&&n.push(e),l++;const c=f[2].replace(/\\(.)/g,"$1");e={id:`${a}-step-${l}`,mcp:c,args:{},options:{mode:"async"},description:`执行 ${c}`,status:"pending"};continue}if(e){const c=m.match(S);if(c){const h=c[1].trim(),u=c[2].trim().replace(/\\(.)/g,"$1"),N=L.test(u)?Number(u):u;e.args[h]=N}}}if(e&&n.push(e),n.length===0)return null;const i=r||s.input;if(i)for(const p of n)d.injectUserInput(p,String(i));return{steps:n,parseMethod:"regex"}}static injectUserInput(t,s){var o,n;const a=["topic","theme","prompt","query","text","content"];for(const e of a)if(e in t.args)return;const r=E.getTool(t.mcp);if(r){const e=r.inputSchema.required||[],l=r.inputSchema.properties||{};for(const i of a)if(e.includes(i)&&((o=l[i])==null?void 0:o.type)==="string"){t.args[i]=s;return}for(const i of e)if(((n=l[i])==null?void 0:n.type)==="string"&&!(i in t.args)){t.args[i]=s;return}}t.args.theme=s}static isDSLContent(t){return!t||!t.trim()?!1:t.split(`
3
3
  `).some(a=>g.test(a.trim()))}static extractToolNamesFromContent(t){if(!t||!t.trim())return[];const s=new Set,a=/(调用|CALL)\s+(\S+)/gim;let r;for(;(r=a.exec(t))!==null;){const e=r[2].replace(/\\(.)/g,"$1");s.add(e)}const o=/\b([a-z][a-z0-9]*(?:_[a-z0-9]+)+)\b/g;for(;(r=o.exec(t))!==null;)s.add(r[1]);const n=/mcp:\s*(\S+)/gi;for(;(r=n.exec(t))!==null;){const e=r[1].replace(/\\(.)/g,"$1");s.add(e)}return Array.from(s)}}export{d as S};
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-DbjmzngX.css","./tool-windows-DW-CDfPc.css","./bootstrap-5wOMkP8H.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css","./tool-windows-DW-CDfPc.css","./bootstrap-5wOMkP8H.css"])))=>i.map(i=>d[i]);
2
2
  import{_ as p}from"./startup-runtime-BrfuwjQS.js";const u=window.addEventListener.bind(window),_=window.removeEventListener.bind(window);let l=null;window.addEventListener=function(e,t,n){if(e==="unload"){console.warn("[Permissions Policy] Blocked unload event listener");return}return e==="beforeunload"&&(l=t),u.call(window,e,t,n)};window.removeEventListener=function(e,t,n){return e==="beforeunload"&&(l=null),_.call(window,e,t,n)};window.__checkBeforeUnload=()=>!!l;const E="aitu:lazy-chunk-retry",d="_lazy_chunk_retry",h="_t",y="drawnix-static-v",v=[/Failed to fetch dynamically imported module/i,/Importing a module script failed/i,/Unable to preload CSS/i,/Loading chunk [\w-]+ failed/i,/ChunkLoadError/i];let f=!1;function w(){var e;return typeof document>"u"?"unknown":((e=document.querySelector('meta[name="app-version"]'))==null?void 0:e.getAttribute("content"))||"unknown"}function R(e){if(!(e instanceof HTMLElement))return null;const t=e;return t.currentSrc||t.src||t.href||null}function c(e,t=0){if(e instanceof Error){const n=[e.name,e.message,e.stack],r=e;return r.cause&&t<2&&n.push(c(r.cause,t+1)),n.filter(Boolean).join(`
3
3
  `)}if(typeof Event<"u"&&e instanceof Event){const n=e,r=[`event:${n.type}`],a=R(n.target);return n.message&&r.push(n.message),a&&r.push(a),t<2&&[n.error,n.reason,n.payload].forEach(o=>{o&&o!==e&&r.push(c(o,t+1))}),r.filter(Boolean).join(`
4
- `)}return String(e??"")}function g(e){const t=e.match(/https?:\/\/[^\s)'"]+\.(?:js|css)(?:\?[^\s)'"]*)?/i);if(!t)return"unknown-module";try{return new URL(t[0]).pathname}catch{return t[0]}}function A(e){const t=c(e);return v.some(n=>n.test(t))}async function L(e,t){var r,a;const n=[];try{(a=(r=navigator.serviceWorker)==null?void 0:r.controller)==null||a.postMessage({type:"RECOVER_DYNAMIC_IMPORT_FAILURE",appVersion:w(),moduleKey:e,error:t.slice(0,500)})}catch{}typeof caches<"u"&&n.push(caches.keys().then(o=>Promise.all(o.filter(i=>i.startsWith(y)).map(i=>caches.delete(i))))),typeof navigator<"u"&&"serviceWorker"in navigator&&n.push(navigator.serviceWorker.getRegistration().then(o=>o==null?void 0:o.update())),await Promise.allSettled(n)}function s(e){if(!A(e))return!1;if(f)return!0;if(typeof window>"u")return!1;const t=c(e),n=g(t),r=`${E}:${w()}:${n}`;try{if(sessionStorage.getItem(r)==="1")return!1;sessionStorage.setItem(r,"1")}catch{if(new URL(window.location.href).searchParams.has(d))return!1}f=!0;const a=new URL(window.location.href);a.searchParams.set(d,"1"),a.searchParams.set(h,String(Date.now())),console.warn("[ErrorBoundary] Detected stale lazy asset. Reloading once to recover.",e);let o=!1;const i=()=>{o||(o=!0,window.location.replace(a.toString()))};return window.setTimeout(i,700),L(n,t).finally(i),!0}function m(){return window.__OPENTU_BOOT__||null}function T(e){var t,n;(n=(t=m())==null?void 0:t.setProgress)==null||n.call(t,e==null?void 0:e.progress,e)}function P(){if(typeof window>"u")return;const e=t=>{t.preventDefault(),t.stopImmediatePropagation()};window.addEventListener("vite:preloadError",t=>{s(t)&&e(t)},!0),window.addEventListener("unhandledrejection",t=>{s(t)&&e(t)},!0),window.addEventListener("error",t=>{s(t)&&e(t)},!0)}P();T({tip:"正在加载工作台...",source:"phase",progress:20});p(()=>import("./bootstrap-DadYvnge.js").then(e=>e.z),__vite__mapDeps([0,1,2]),import.meta.url).catch(e=>{var t,n;s(e)||(console.error("[Main] Failed to load app bootstrap:",e),(n=(t=m())==null?void 0:t.markError)==null||n.call(t,"工作台加载失败,请刷新后重试"))});const k=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{k as m,s as t};
4
+ `)}return String(e??"")}function g(e){const t=e.match(/https?:\/\/[^\s)'"]+\.(?:js|css)(?:\?[^\s)'"]*)?/i);if(!t)return"unknown-module";try{return new URL(t[0]).pathname}catch{return t[0]}}function A(e){const t=c(e);return v.some(n=>n.test(t))}async function L(e,t){var r,a;const n=[];try{(a=(r=navigator.serviceWorker)==null?void 0:r.controller)==null||a.postMessage({type:"RECOVER_DYNAMIC_IMPORT_FAILURE",appVersion:w(),moduleKey:e,error:t.slice(0,500)})}catch{}typeof caches<"u"&&n.push(caches.keys().then(o=>Promise.all(o.filter(i=>i.startsWith(y)).map(i=>caches.delete(i))))),typeof navigator<"u"&&"serviceWorker"in navigator&&n.push(navigator.serviceWorker.getRegistration().then(o=>o==null?void 0:o.update())),await Promise.allSettled(n)}function s(e){if(!A(e))return!1;if(f)return!0;if(typeof window>"u")return!1;const t=c(e),n=g(t),r=`${E}:${w()}:${n}`;try{if(sessionStorage.getItem(r)==="1")return!1;sessionStorage.setItem(r,"1")}catch{if(new URL(window.location.href).searchParams.has(d))return!1}f=!0;const a=new URL(window.location.href);a.searchParams.set(d,"1"),a.searchParams.set(h,String(Date.now())),console.warn("[ErrorBoundary] Detected stale lazy asset. Reloading once to recover.",e);let o=!1;const i=()=>{o||(o=!0,window.location.replace(a.toString()))};return window.setTimeout(i,700),L(n,t).finally(i),!0}function m(){return window.__OPENTU_BOOT__||null}function T(e){var t,n;(n=(t=m())==null?void 0:t.setProgress)==null||n.call(t,e==null?void 0:e.progress,e)}function P(){if(typeof window>"u")return;const e=t=>{t.preventDefault(),t.stopImmediatePropagation()};window.addEventListener("vite:preloadError",t=>{s(t)&&e(t)},!0),window.addEventListener("unhandledrejection",t=>{s(t)&&e(t)},!0),window.addEventListener("error",t=>{s(t)&&e(t)},!0)}P();T({tip:"正在加载工作台...",source:"phase",progress:20});p(()=>import("./bootstrap-CQRLkOtk.js").then(e=>e.z),__vite__mapDeps([0,1,2]),import.meta.url).catch(e=>{var t,n;s(e)||(console.error("[Main] Failed to load app bootstrap:",e),(n=(t=m())==null?void 0:t.markError)==null||n.call(t,"工作台加载失败,请刷新后重试"))});const k=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{k as m,s as t};
@@ -1 +1 @@
1
- import{rB as m,rC as f,bO as P,rn as v,rD as D,rE as I,rF as w,aD as h,rG as x,rH as z,rI as B,rJ as F,rK as O,rL as U,rM as V,r4 as H,rN as J,rg as N,re as R}from"./ai-chat-B-XdoWBQ.js";function M(r){return U(r,"musicAnalyzerAction",["analyze","rewrite","lyrics-gen"])}function $(r){return V(r,{missingMessage:"分析任务缺少结果内容",fromStructured:e=>N(e)})}function j(r){const e=r.params.musicAnalyzerSourceSnapshot;return(e==null?void 0:e.type)==="upload"?e:null}function E(r){return H(r.params.musicAnalyzerMusicBrief)}function L(r){var i;const e=(i=r.result)==null?void 0:i.analysisData;return!e||typeof e!="object"||typeof e.lyricsDraft!="string"&&typeof e.title!="string"&&!Array.isArray(e.styleTags)?null:{title:String(e.title||"").trim(),styleTags:Array.isArray(e.styleTags)?e.styleTags.map(y=>String(y||"").trim()).filter(Boolean):[],lyricsDraft:String(e.lyricsDraft||"").trim()}}async function _(r){if(r.status!=="completed")return null;const e=M(r);if(!e)return null;if(e==="analyze"){const c=await m(),p=c.find(A=>A.analyzeTaskId===r.id);if(p)return{records:c,record:p};const t=$(r),n=j(r),l=String(r.params.musicAnalyzerSourceLabel||(n==null?void 0:n.fileName)||"本地音频").trim(),o=E(r),u={id:P(),createdAt:Date.now(),source:"upload",sourceLabel:l,sourceSnapshot:n,analysisModel:String(r.params.model||""),analysisModelRef:r.params.modelRef||null,analysis:t,musicBrief:o,styleTags:f(t.sunoStyleTags.length>0?t.sunoStyleTags:t.genreTags,o),title:t.sunoTitle||t.titleSuggestions[0]||l.replace(/\.[^.]+$/,""),lyricsDraft:t.sunoLyricsDraft||"",analyzeTaskId:r.id,starred:!1};return{records:await v(u),record:u}}if(e==="lyrics-gen"){const c=D(r,"musicAnalyzerRecordId");if(!c)return null;const t=(await m()).find(A=>A.id===c);if(!t||t.pendingLyricsGenTaskId!==r.id)return null;const n=K(r),l=(n==null?void 0:n.title)||t.title||"",o=n&&n.styleTags.length>0?f(n.styleTags,t.musicBrief):f(t.styleTags||[],t.musicBrief),u=(n==null?void 0:n.lyricsDraft)||t.lyricsDraft||"",S=n?I({...t,title:l,styleTags:o,lyricsDraft:u},w({...t,title:l,styleTags:o,lyricsDraft:u},r.type===h.CHAT?"AI 草稿":"Suno 歌词",t.creationPrompt)):{};return x(t,{title:l,styleTags:o,lyricsDraft:u,...S,pendingLyricsGenTaskId:null},R)}const i=D(r,"musicAnalyzerRecordId");if(!i)return null;const s=(await m()).find(c=>c.id===i);if(!s||s.pendingRewriteTaskId!==r.id)return null;const a=L(r)||z(B(r)),d=a.title||s.title,g=a.styleTags.length>0?f(a.styleTags,s.musicBrief):f(s.styleTags,s.musicBrief),T=a.lyricsDraft||s.lyricsDraft,C=(s.lyricsVersions||[]).length,G=w({...s,title:d,styleTags:g,lyricsDraft:T},`AI 改写 #${C+1}`,s.rewritePrompt),b=I(s,G);return x(s,{title:d,styleTags:g,lyricsDraft:T,pendingRewriteTaskId:null,...b},R)}function K(r){const e=r.result;if(!e)return null;const i=L(r);if(i)return i;const y=B(r);if(y)try{return z(y)}catch{}const s=e.lyricsText||"",a=e.lyricsTitle||e.title||"",d=e.lyricsTags;if(!s&&!a)return null;const g=Array.isArray(d)?d.map(T=>String(T||"").trim()).filter(Boolean):[];return{title:String(a).trim(),styleTags:g,lyricsDraft:String(s).trim()}}function q(r){return J(r)}async function Q(r,e){return O(r,e,{loadRecords:m,updateRecord:R})}function X(r){return M(r)!==null}function Y(r){if(r.type!==h.AUDIO)return null;const e=r.params.batchId;return e?F(e,{prefix:"ma_"}):null}export{Q as a,q as e,Y as g,X as i,_ as s};
1
+ import{rD as m,rE as f,bO as P,rp as v,rF as D,rG as I,rH as w,aD as h,rI as x,rJ as z,rK as M,rL as F,rM as O,rN as U,rO as V,r6 as H,rP as J,ri as N,rg as R}from"./ai-chat-BnWVpTEI.js";function B(r){return U(r,"musicAnalyzerAction",["analyze","rewrite","lyrics-gen"])}function $(r){return V(r,{missingMessage:"分析任务缺少结果内容",fromStructured:e=>N(e)})}function j(r){const e=r.params.musicAnalyzerSourceSnapshot;return(e==null?void 0:e.type)==="upload"?e:null}function E(r){return H(r.params.musicAnalyzerMusicBrief)}function L(r){var i;const e=(i=r.result)==null?void 0:i.analysisData;return!e||typeof e!="object"||typeof e.lyricsDraft!="string"&&typeof e.title!="string"&&!Array.isArray(e.styleTags)?null:{title:String(e.title||"").trim(),styleTags:Array.isArray(e.styleTags)?e.styleTags.map(y=>String(y||"").trim()).filter(Boolean):[],lyricsDraft:String(e.lyricsDraft||"").trim()}}async function _(r){if(r.status!=="completed")return null;const e=B(r);if(!e)return null;if(e==="analyze"){const c=await m(),p=c.find(A=>A.analyzeTaskId===r.id);if(p)return{records:c,record:p};const t=$(r),n=j(r),l=String(r.params.musicAnalyzerSourceLabel||(n==null?void 0:n.fileName)||"本地音频").trim(),o=E(r),u={id:P(),createdAt:Date.now(),source:"upload",sourceLabel:l,sourceSnapshot:n,analysisModel:String(r.params.model||""),analysisModelRef:r.params.modelRef||null,analysis:t,musicBrief:o,styleTags:f(t.sunoStyleTags.length>0?t.sunoStyleTags:t.genreTags,o),title:t.sunoTitle||t.titleSuggestions[0]||l.replace(/\.[^.]+$/,""),lyricsDraft:t.sunoLyricsDraft||"",analyzeTaskId:r.id,starred:!1};return{records:await v(u),record:u}}if(e==="lyrics-gen"){const c=D(r,"musicAnalyzerRecordId");if(!c)return null;const t=(await m()).find(A=>A.id===c);if(!t||t.pendingLyricsGenTaskId!==r.id)return null;const n=K(r),l=(n==null?void 0:n.title)||t.title||"",o=n&&n.styleTags.length>0?f(n.styleTags,t.musicBrief):f(t.styleTags||[],t.musicBrief),u=(n==null?void 0:n.lyricsDraft)||t.lyricsDraft||"",S=n?I({...t,title:l,styleTags:o,lyricsDraft:u},w({...t,title:l,styleTags:o,lyricsDraft:u},r.type===h.CHAT?"AI 草稿":"Suno 歌词",t.creationPrompt)):{};return x(t,{title:l,styleTags:o,lyricsDraft:u,...S,pendingLyricsGenTaskId:null},R)}const i=D(r,"musicAnalyzerRecordId");if(!i)return null;const s=(await m()).find(c=>c.id===i);if(!s||s.pendingRewriteTaskId!==r.id)return null;const a=L(r)||z(M(r)),d=a.title||s.title,g=a.styleTags.length>0?f(a.styleTags,s.musicBrief):f(s.styleTags,s.musicBrief),T=a.lyricsDraft||s.lyricsDraft,C=(s.lyricsVersions||[]).length,G=w({...s,title:d,styleTags:g,lyricsDraft:T},`AI 改写 #${C+1}`,s.rewritePrompt),b=I(s,G);return x(s,{title:d,styleTags:g,lyricsDraft:T,pendingRewriteTaskId:null,...b},R)}function K(r){const e=r.result;if(!e)return null;const i=L(r);if(i)return i;const y=M(r);if(y)try{return z(y)}catch{}const s=e.lyricsText||"",a=e.lyricsTitle||e.title||"",d=e.lyricsTags;if(!s&&!a)return null;const g=Array.isArray(d)?d.map(T=>String(T||"").trim()).filter(Boolean):[];return{title:String(a).trim(),styleTags:g,lyricsDraft:String(s).trim()}}function q(r){return J(r)}async function Q(r,e){return O(r,e,{loadRecords:m,updateRecord:R})}function X(r){return B(r)!==null}function Y(r){if(r.type!==h.AUDIO)return null;const e=r.params.batchId;return e?F(e,{prefix:"ma_"}):null}export{Q as a,q as e,Y as g,X as i,_ as s};