aitu-app 0.6.13 → 0.6.15

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 (164) hide show
  1. package/README.md +3 -3
  2. package/assets/ChatMessagesArea-BDdoD5_A.js +250 -0
  3. package/assets/DialogTaskList-DPJ7HZyZ.js +1 -0
  4. package/assets/KnowledgeBaseContent-C72s05vt.js +143 -0
  5. package/assets/ToolboxDrawer-l4Ty3r9W.js +91 -0
  6. package/assets/__vite-browser-external-UePf-KSV.js +1 -0
  7. package/assets/{ai-analyze-CXbDwr-F.js → ai-analyze-xgKQgd4U.js} +1 -1
  8. package/assets/ai-image-generation-C5JAcp3b.js +1 -0
  9. package/assets/ai-video-generation-ac-33IgK.js +5 -0
  10. package/assets/{arc-Vb6QIvRI.js → arc-Dp9Tayy1.js} +1 -1
  11. package/assets/{arc-BVpYfX8u.js → arc-OJPD8-BT.js} +1 -1
  12. package/assets/batch-image-generation-C3x-OHz8.js +6 -0
  13. package/assets/{blockDiagram-38ab4fdb-CbUExfWH.js → blockDiagram-38ab4fdb-BmbbsYSN.js} +1 -1
  14. package/assets/{blockDiagram-38ab4fdb-CbbmIvT5.js → blockDiagram-38ab4fdb-Ct18ekcD.js} +1 -1
  15. package/assets/{c4Diagram-3d4e48cf-Db1GHdmL.js → c4Diagram-3d4e48cf-B5n9lAd_.js} +1 -1
  16. package/assets/{c4Diagram-3d4e48cf-Dw_8bcgE.js → c4Diagram-3d4e48cf-CeYsSK_V.js} +1 -1
  17. package/assets/channel-3D-64Gra.js +1 -0
  18. package/assets/channel-Cwws4QMc.js +1 -0
  19. package/assets/{classDiagram-70f12bd4-CXXAHxeU.js → classDiagram-70f12bd4-DHUkWA9l.js} +1 -1
  20. package/assets/{classDiagram-70f12bd4-_p3Dnvx6.js → classDiagram-70f12bd4-moiNcfve.js} +1 -1
  21. package/assets/{classDiagram-v2-f2320105-B-9myg44.js → classDiagram-v2-f2320105-DA5NC1Qw.js} +1 -1
  22. package/assets/{classDiagram-v2-f2320105-ChK1LfBX.js → classDiagram-v2-f2320105-GgtaFqwD.js} +1 -1
  23. package/assets/{clipper-CJLNPhZM.js → clipper-t_9jIAe9.js} +1 -1
  24. package/assets/clone-BMrzx1Td.js +1 -0
  25. package/assets/clone-BizrxztP.js +1 -0
  26. package/assets/createText-2e5e7dd3-CHzSuNe3.js +8 -0
  27. package/assets/{createText-2e5e7dd3-BGRSuPih.js → createText-2e5e7dd3-DOBPzTzY.js} +1 -1
  28. package/assets/{edges-e0da2a9e-BoQQRKl3.js → edges-e0da2a9e-Bq2ydCT4.js} +1 -1
  29. package/assets/{edges-e0da2a9e-1EAOsAGW.js → edges-e0da2a9e-CN99E-t-.js} +1 -1
  30. package/assets/{erDiagram-9861fffd-DIqIVsjO.js → erDiagram-9861fffd-Do4S3P96.js} +1 -1
  31. package/assets/{erDiagram-9861fffd-DrPXJadW.js → erDiagram-9861fffd-oiPiotaf.js} +1 -1
  32. package/assets/{flowDb-956e92f1-DKdojl1Z.js → flowDb-956e92f1-D51K1L9K.js} +1 -1
  33. package/assets/{flowDb-956e92f1-_yAXk9b2.js → flowDb-956e92f1-DFBqRgDU.js} +1 -1
  34. package/assets/{flowDiagram-66a62f08-BSNSE1vH.js → flowDiagram-66a62f08-DUEF_pO-.js} +1 -1
  35. package/assets/{flowDiagram-66a62f08-Cn3BWcxJ.js → flowDiagram-66a62f08-ohjO56wG.js} +1 -1
  36. package/assets/flowDiagram-v2-96b9c2cf-DqY72AjL.js +1 -0
  37. package/assets/flowDiagram-v2-96b9c2cf-drt1-w-A.js +1 -0
  38. package/assets/{flowchart-elk-definition-4a651766-CkhkUOMa.js → flowchart-elk-definition-4a651766-CZGupUae.js} +1 -1
  39. package/assets/{flowchart-elk-definition-4a651766-CtRYHypS.js → flowchart-elk-definition-4a651766-Ck49vbEO.js} +1 -1
  40. package/assets/{ganttDiagram-c361ad54-DWZxEumf.js → ganttDiagram-c361ad54-D-2TQXly.js} +1 -1
  41. package/assets/{ganttDiagram-c361ad54-C-olbHti.js → ganttDiagram-c361ad54-Di2O32lI.js} +1 -1
  42. package/assets/{gitGraphDiagram-72cf32ee-DFI0WJ7k.js → gitGraphDiagram-72cf32ee-BRac4-Im.js} +1 -1
  43. package/assets/{gitGraphDiagram-72cf32ee-Dz3X9B4S.js → gitGraphDiagram-72cf32ee-CTYbPhUT.js} +1 -1
  44. package/assets/{graph-BbAdRpyG.js → graph-2iyYFI0w.js} +1 -1
  45. package/assets/{graph-CG3zmXkL.js → graph-C1hWr4Pm.js} +1 -1
  46. package/assets/{grid-image-CahEQ7p7.js → grid-image-dUr2Jg39.js} +1 -1
  47. package/assets/{has-Cq7YuzG9.js → has-SF0all_b.js} +1 -1
  48. package/assets/{hasIn-4hPyOh4r.js → hasIn-DKQ-u2B0.js} +1 -1
  49. package/assets/{index-3862675e-D_PJ0qZE.js → index-3862675e-CZEjGwoo.js} +1 -1
  50. package/assets/{index-3862675e-Cy2LJr-t.js → index-3862675e-RDTDsnXn.js} +1 -1
  51. package/assets/index-8936AfEv.js +1 -0
  52. package/assets/{index-ICFaM7Tx.js → index-B7eekA6_.js} +1 -1
  53. package/assets/index-BDUNgKdd.js +4 -0
  54. package/assets/{index-XoOCAjmC.js → index-BHA-RYCc.js} +1 -1
  55. package/assets/{index-DHrV9sCt.js → index-BOD5NqEU.js} +1 -1
  56. package/assets/{index-Bad6y32x.js → index-Bari47nZ.js} +1 -1
  57. package/assets/index-Bk0_Zb0q.js +126 -0
  58. package/assets/index-Bl-lGyNS.js +1 -0
  59. package/assets/{index-DBCwQvu4.js → index-BmjGPRWs.js} +1 -1
  60. package/assets/{index-BOHFUhjZ.js → index-BwMZ5wpE.js} +1 -1
  61. package/assets/{index-BiCrE7Ci.js → index-CANiroWR.js} +1 -1
  62. package/assets/{index-BDnSt0a8.js → index-CF52PGdh.js} +1 -1
  63. package/assets/{index-WyqXHNHN.js → index-COU1uiqb.js} +10 -10
  64. package/assets/{index-Bfs6Q-lQ.js → index-CbWVcCEf.js} +1 -1
  65. package/assets/{index-BQS_8NU3.js → index-CgRCJ-LO.js} +1 -1
  66. package/assets/{index-Dqi7TZna.js → index-Cjr7NFhN.js} +1 -1
  67. package/assets/{index-CqEazMaK.js → index-CtCg-67U.js} +1 -1
  68. package/assets/{index-BU3nDlFy.js → index-CtQCAjVT.js} +1 -1
  69. package/assets/{index-DtNyBFxZ.js → index-Cxm1XljY.js} +1 -1
  70. package/assets/index-Cz1tSwF3.css +1 -0
  71. package/assets/{index-BE7n-LiY.js → index-Czr2RAjn.js} +1 -1
  72. package/assets/{index-Dv8yvI8G.js → index-D-84skI6.js} +1 -1
  73. package/assets/{index-pt9oZHeu.js → index-D263cNDG.js} +1 -1
  74. package/assets/{index-CciPE8zM.js → index-D2m550qt.js} +1 -1
  75. package/assets/{index-B9uNbnfa.js → index-D77Go9tu.js} +1 -1
  76. package/assets/{index-C1tgh8XV.js → index-DaGnZYqf.js} +10 -10
  77. package/assets/{index-BZIcMnMw.js → index-DhkzbRKo.js} +1 -1
  78. package/assets/{index-BkRTZMZM.js → index-Dpe0RMNz.js} +1 -1
  79. package/assets/index-DwHU5eOe.css +9 -0
  80. package/assets/{index-B4IEsL3l.js → index-Eh2ScCVM.js} +1 -1
  81. package/assets/index-IZLKDros.js +3675 -0
  82. package/assets/{index-Cx19IgV-.js → index-XL72XJSV.js} +5 -5
  83. package/assets/{index-jHCkpoWQ.js → index-eG2AQFN1.js} +1 -1
  84. package/assets/{index-DUgUd4bR.js → index-idzCX2RO.js} +1 -1
  85. package/assets/{index-Bco0OAak.js → index-kEyGqmtF.js} +1 -1
  86. package/assets/{infoDiagram-f8f76790-C0TYyx3w.js → infoDiagram-f8f76790-BxK-Egf6.js} +1 -1
  87. package/assets/{infoDiagram-f8f76790-D8T-erO4.js → infoDiagram-f8f76790-CUCAPcFk.js} +1 -1
  88. package/assets/{inspiration-board-CiL8hKbX.js → inspiration-board-D8Ua5Oe1.js} +1 -1
  89. package/assets/{isEmpty-BoFRUVaJ.js → isEmpty-t4Cy-KF3.js} +1 -1
  90. package/assets/{journeyDiagram-49397b02-BHw2LUDu.js → journeyDiagram-49397b02-CSy6umB2.js} +1 -1
  91. package/assets/{journeyDiagram-49397b02-CkmFUv6i.js → journeyDiagram-49397b02-hn1ZL1sk.js} +1 -1
  92. package/assets/{layers-CaY2-pH6.js → layers-D6FMrwlY.js} +1 -1
  93. package/assets/{layout-D_agYVJ_.js → layout-Bx4CUuIY.js} +1 -1
  94. package/assets/{layout-CSua1dGC.js → layout-Cx8G_aqy.js} +1 -1
  95. package/assets/{line-CN9rNlXr.js → line-BZ1F3Pjg.js} +1 -1
  96. package/assets/{line-CxGDlzoc.js → line-CWqmXnzs.js} +1 -1
  97. package/assets/{linear-DKP7SWoM.js → linear-0qmptMY3.js} +1 -1
  98. package/assets/{linear-CvStv2Ny.js → linear-BD9ezGBw.js} +1 -1
  99. package/assets/{mermaid.core-DawxQi4y.js → mermaid.core-CclEoiQB.js} +5 -5
  100. package/assets/{mindmap-definition-fc14e90a-BWrsnm3I.js → mindmap-definition-fc14e90a-C3--tXOB.js} +1 -1
  101. package/assets/{mindmap-definition-fc14e90a-Dmo2lz3K.js → mindmap-definition-fc14e90a-DF7zVwYN.js} +1 -1
  102. package/assets/{photo-wall-splitter-B_WR4Rl2.js → photo-wall-splitter-DRunCkYJ.js} +1 -1
  103. package/assets/{pick-C1hcXSqm.js → pick-fy_8WYZR.js} +1 -1
  104. package/assets/{pieDiagram-8a3498a8-DhrponMk.js → pieDiagram-8a3498a8-BUs_EbTX.js} +1 -1
  105. package/assets/{pieDiagram-8a3498a8-CmbWJAb7.js → pieDiagram-8a3498a8-K2pJYExm.js} +1 -1
  106. package/assets/{quadrantDiagram-120e2f19-CgIF-y-_.js → quadrantDiagram-120e2f19-B_NqGDOT.js} +1 -1
  107. package/assets/{quadrantDiagram-120e2f19-DOKwrvFF.js → quadrantDiagram-120e2f19-npHcJfpe.js} +1 -1
  108. package/assets/{requirementDiagram-deff3bca-CIXltTSE.js → requirementDiagram-deff3bca-MAAg8oy7.js} +1 -1
  109. package/assets/{requirementDiagram-deff3bca-BqbqHjdU.js → requirementDiagram-deff3bca-XXIszlff.js} +1 -1
  110. package/assets/{sankeyDiagram-04a897e0-DGiABLdx.js → sankeyDiagram-04a897e0-C5NJymdM.js} +1 -1
  111. package/assets/{sankeyDiagram-04a897e0-DcPermhl.js → sankeyDiagram-04a897e0-CSCR2bPx.js} +1 -1
  112. package/assets/{sequenceDiagram-704730f1-BUXJ6XVH.js → sequenceDiagram-704730f1-ChCKpyVM.js} +1 -1
  113. package/assets/{sequenceDiagram-704730f1-piXYTUjh.js → sequenceDiagram-704730f1-DJ4I-j-u.js} +1 -1
  114. package/assets/{settings-dialog-A3AH7O45.css → settings-dialog-Bf8ExAlc.css} +1 -1
  115. package/assets/settings-dialog-CXBVyqHP.js +11 -0
  116. package/assets/{shard-sync-service-BCo2qKEA.js → shard-sync-service-IbZF8xlU.js} +1 -1
  117. package/assets/{stateDiagram-587899a1-Dnd2X4K4.js → stateDiagram-587899a1-BA9z6NxG.js} +1 -1
  118. package/assets/{stateDiagram-587899a1-Cdfs3rRO.js → stateDiagram-587899a1-Bds5dxHr.js} +1 -1
  119. package/assets/{stateDiagram-v2-d93cdb3a-DtC5XSWV.js → stateDiagram-v2-d93cdb3a-wf_BKO33.js} +1 -1
  120. package/assets/{stateDiagram-v2-d93cdb3a-lOfkWHnS.js → stateDiagram-v2-d93cdb3a-zgIPW-Wq.js} +1 -1
  121. package/assets/{styles-6aaf32cf-BTv8Dnxa.js → styles-6aaf32cf-DKSbsikH.js} +1 -1
  122. package/assets/{styles-6aaf32cf-B_EWv7Bz.js → styles-6aaf32cf-k70vGvK6.js} +1 -1
  123. package/assets/{styles-9a916d00-BNkP2BU4.js → styles-9a916d00-DlsdUcZV.js} +1 -1
  124. package/assets/{styles-9a916d00-C4vTAlbK.js → styles-9a916d00-DmmQFwNe.js} +1 -1
  125. package/assets/{styles-c10674c1-Dp5J5JrP.js → styles-c10674c1-CxF05c2I.js} +1 -1
  126. package/assets/{styles-c10674c1-BcxLBYaC.js → styles-c10674c1-D8qHaY59.js} +1 -1
  127. package/assets/{svgDrawCommon-08f97a94-5_vuhhyn.js → svgDrawCommon-08f97a94-C47JFYdy.js} +1 -1
  128. package/assets/{svgDrawCommon-08f97a94-CalbTy9V.js → svgDrawCommon-08f97a94-DXUoCs1f.js} +1 -1
  129. package/assets/{timeline-definition-85554ec2-ByBsrbAq.js → timeline-definition-85554ec2-C2IdYpUG.js} +1 -1
  130. package/assets/{timeline-definition-85554ec2-DBiJ4h6g.js → timeline-definition-85554ec2-DKGZodMj.js} +1 -1
  131. package/assets/ttd-dialog-BARbesy9.js +95 -0
  132. package/assets/{upload-DP5n1PVz.js → upload-CjpWBLk1.js} +1 -1
  133. package/assets/{video-recovery-service-DY01FcHI.js → video-recovery-service-CfVXvCd9.js} +1 -1
  134. package/assets/{xychartDiagram-e933f94c-CJ1NxG0K.js → xychartDiagram-e933f94c-CjAQ2fLX.js} +1 -1
  135. package/assets/{xychartDiagram-e933f94c-CEXcS3Lw.js → xychartDiagram-e933f94c-qh0OFXZU.js} +1 -1
  136. package/changelog.json +58 -0
  137. package/package.json +1 -1
  138. package/precache-manifest.json +283 -283
  139. package/sw.js +4 -4
  140. package/version.json +7 -3
  141. package/assets/ChatMessagesArea-Btxhq7Z2.js +0 -229
  142. package/assets/DialogTaskList-0I91BD1p.js +0 -1
  143. package/assets/KnowledgeBaseContent-CSEr1paK.js +0 -153
  144. package/assets/ToolboxDrawer-CFAgOmIa.js +0 -91
  145. package/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  146. package/assets/ai-image-generation-CvUX_vnh.js +0 -1
  147. package/assets/ai-video-generation-BgDcotXE.js +0 -5
  148. package/assets/batch-image-generation-rvn9zCP-.js +0 -6
  149. package/assets/channel-ChluHQU5.js +0 -1
  150. package/assets/channel-DQ0ggWsj.js +0 -1
  151. package/assets/clone-BscGHP5K.js +0 -1
  152. package/assets/clone-CTdvgy2F.js +0 -1
  153. package/assets/createText-2e5e7dd3-BCbwgqBS.js +0 -7
  154. package/assets/flowDiagram-v2-96b9c2cf-BmoA7Lrr.js +0 -1
  155. package/assets/flowDiagram-v2-96b9c2cf-Du5Aycbt.js +0 -1
  156. package/assets/index-7WzIC7_D.js +0 -3448
  157. package/assets/index-BOZ3fCzl.js +0 -3
  158. package/assets/index-CYf1zrx4.js +0 -1
  159. package/assets/index-C_Ed2LrM.js +0 -1
  160. package/assets/index-D9rMZcAy.js +0 -123
  161. package/assets/index-V8UiJyjb.css +0 -1
  162. package/assets/index-qP_w2VHW.css +0 -9
  163. package/assets/settings-dialog-D1OnKj0y.js +0 -11
  164. package/assets/ttd-dialog-C9noZsTQ.js +0 -95
@@ -1 +1 @@
1
- .winbox-settings-window .wb-header{border-bottom-color:#0f172a14!important}.winbox-settings-window .wb-title{font-size:15px;font-weight:700;color:#0f172a}.winbox-settings-window .wb-body{overflow:hidden;background:#fff}.winbox-settings-window .winbox-content-wrapper{padding:0!important;overflow:hidden;background:#fff}@keyframes settings-dialog-spin{to{transform:rotate(360deg)}}@keyframes settings-dialog-mobile-stage-enter{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.settings-dialog{--sd-accent: #f59e0b;--sd-accent-soft: rgba(245, 158, 11, .1);--sd-text: #0f172a;--sd-muted: #64748b;--sd-border: rgba(15, 23, 42, .08);--sd-border-strong: rgba(15, 23, 42, .14);--sd-surface: #ffffff;--sd-surface-soft: #f7f8fa;width:100%;height:100%;min-height:0;display:flex;flex-direction:column;padding:18px;box-sizing:border-box;background:#fff;overflow:hidden}.settings-dialog__layout{display:grid;grid-template-columns:144px minmax(0,1fr);gap:14px;min-height:0;flex:1}.settings-dialog__nav,.settings-dialog__main,.settings-dialog__sidebar,.settings-dialog__content-panel{min-height:0}.settings-dialog__nav-shell{display:flex;flex-direction:column;gap:0;height:100%;padding:4px 0 0 2px}.settings-dialog__nav-list{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__nav-item{display:flex;flex-direction:column;justify-content:center;min-height:42px;padding:0 10px;text-align:left;position:relative;border:none;border-radius:14px;background:transparent;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__nav-item:hover{background:#f7f8fa}.settings-dialog__nav-item--active{background:#f4f6f9}.settings-dialog__nav-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__nav-item-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__main{min-width:0;min-height:0;display:flex;flex-direction:column;border-radius:18px;border:1px solid rgba(15,23,42,.05);background:#fff;overflow:hidden}.settings-dialog__workspace{display:grid;grid-template-columns:264px minmax(0,1fr);gap:0;height:100%;min-height:0;flex:1;overflow:hidden}.settings-dialog__workspace--single{grid-template-columns:minmax(0,1fr)}.settings-dialog__sidebar{min-width:0;padding:12px 12px 12px 14px;border-right:1px solid rgba(15,23,42,.05);overflow:hidden}.settings-dialog__sidebar-shell{display:flex;flex-direction:column;gap:10px;height:100%;padding:0;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog{background:transparent}.settings-dialog__sidebar-summary{display:flex;flex-direction:column;gap:2px;padding:2px 4px 0}.settings-dialog__sidebar-summary-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-dialog__sidebar-summary-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-summary-text{font-size:12px;line-height:1.5;color:var(--sd-muted)}.settings-dialog__sidebar-summary-action{min-height:30px;padding:0 12px;border:1px solid rgba(245,158,11,.18);border-radius:999px;background:#fffaf0;color:#b45309;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__sidebar-summary-action:hover{border-color:#f59e0b4d;background:#fff5de}.settings-dialog__sidebar-list{min-height:0;flex:1;display:flex;flex-direction:column;gap:4px;overflow:auto;padding-right:4px}.settings-dialog__sidebar-list::-webkit-scrollbar{width:5px}.settings-dialog__sidebar-list::-webkit-scrollbar-track{background:transparent}.settings-dialog__sidebar-list::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b859}.settings-dialog__sidebar-item,.settings-dialog__sidebar-add{width:100%;border-radius:16px}.settings-dialog__sidebar-item{display:flex;flex-direction:column;gap:4px;padding:12px 14px;text-align:left;position:relative;border:1px solid transparent;background:transparent;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__sidebar-item:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__sidebar-item--active{border-color:transparent;background:#f4f6f9}.settings-dialog__sidebar-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__sidebar-item-top{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__sidebar-item-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-item-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:56px;padding:4px 8px 4px 6px;position:relative;border-radius:14px;border:1px solid transparent;background:transparent;transition:background-color .18s ease,border-color .18s ease,opacity .18s ease}.settings-dialog__provider-row:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__provider-row--active{border-color:transparent;background:#f4f6f9}.settings-dialog__provider-row--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__provider-row--disabled .settings-dialog__provider-name{color:#94a3b8}.settings-dialog__provider-select{min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;text-align:left}.settings-dialog__provider-select-main{min-width:0;flex:1;display:inline-flex;align-items:center;gap:10px}.settings-dialog__provider-copy{min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px;flex:1}.settings-dialog__provider-name-row{min-width:0;display:inline-flex;align-items:center;gap:8px}.settings-dialog__provider-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__provider-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-avatar{width:32px;height:32px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;overflow:hidden;font-size:14px;font-weight:700;color:#0f172a;background:#f4f6f8}.settings-dialog__provider-avatar--large{width:44px;height:44px;border-radius:14px;font-size:18px}.settings-dialog__provider-avatar--amber{background:#fff3dd;color:#b45309}.settings-dialog__provider-avatar--sky{background:#e6f2ff;color:#2563eb}.settings-dialog__provider-avatar--mint{background:#e7f8f1;color:#0f766e}.settings-dialog__provider-avatar--rose{background:#ffe8ed;color:#be185d}.settings-dialog__provider-avatar--violet{background:#f1ebff;color:#7c3aed}.settings-dialog__provider-avatar-image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.settings-dialog__provider-avatar-text{line-height:1}.settings-dialog__provider-tag{display:inline-flex;align-items:center;min-height:auto;padding:0;border-radius:0;background:transparent;color:#b45309;font-size:10px;font-weight:700}.settings-dialog__provider-switch{display:inline-flex;align-items:center;justify-content:flex-end;gap:8px}.settings-dialog__provider-switch-copy{display:none;font-size:11px;font-weight:700;color:var(--sd-muted)}.settings-dialog__provider-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-badge{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:700}.settings-dialog__sidebar-badge--accent{background:var(--sd-accent-soft);color:#b45309}.settings-dialog__sidebar-badge--warning{background:#fbbf2429;color:#b45309}.settings-dialog__sidebar-badge--muted{background:#f1f5f9;color:#475569}.settings-dialog__sidebar-add{min-height:38px;display:inline-flex;align-items:center;justify-content:flex-start;gap:10px;padding:0 8px;border:none;background:transparent;color:#475569;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__sidebar-add:hover{background:#f7f8fa;color:#b45309}.settings-dialog__sidebar-add-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;background:#f59e0b24;font-size:16px;line-height:1;color:#b45309}.settings-dialog__content-panel{overflow:auto;display:flex;flex-direction:column;flex:1;gap:14px;padding:14px 16px 16px}.settings-dialog__content-panel::-webkit-scrollbar{width:6px}.settings-dialog__content-panel::-webkit-scrollbar-track{background:transparent}.settings-dialog__content-panel::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b847}.settings-dialog__content-panel--providers{gap:0;padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px 18px}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{border-top:1px solid rgba(15,23,42,.06)}.settings-dialog__content-panel--providers .settings-dialog__section--compact{padding-top:14px;padding-bottom:14px}.settings-dialog__content-panel--canvas{padding:14px 16px 16px}.settings-dialog__content-panel--compact,.settings-dialog__content-panel--detail{animation:settings-dialog-mobile-stage-enter .24s ease}.settings-dialog__mobile-stage{display:flex;flex-direction:column;gap:14px}.settings-dialog__compact-stage-header{display:flex;flex-direction:column;gap:10px}.settings-dialog__compact-back{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;min-height:34px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:999px;background:#fff;color:#334155;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__compact-back:hover{border-color:#f59e0b38;color:#b45309;background:#fffaf0}.settings-dialog__compact-stage-copy{display:flex;flex-direction:column;gap:6px}.settings-dialog__compact-stage-eyebrow{font-size:12px;font-weight:700;letter-spacing:.04em;color:#b45309}.settings-dialog__compact-stage-text{margin:0;font-size:13px;line-height:1.6;color:var(--sd-muted)}.settings-dialog__section{display:flex;flex-direction:column;gap:12px;padding:0}.settings-dialog__section-header,.settings-dialog__panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__section-title{margin:0;font-size:16px;font-weight:700;color:var(--sd-text)}.settings-dialog__profile-hero{display:flex;align-items:center;gap:12px;min-width:0}.settings-dialog__profile-hero>div{min-width:0}.settings-dialog__inline-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__inline-meta span{display:inline-flex;align-items:center;position:relative;min-height:auto;padding:0;border-radius:0;border:none;background:transparent}.settings-dialog__inline-meta span:not(:last-child):after{content:"";width:4px;height:4px;margin-left:8px;border-radius:999px;background:#94a3b899}.settings-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.settings-dialog__field{display:flex;gap:10px}.settings-dialog__field--column{flex-direction:column}.settings-dialog__field--full{grid-column:1/-1}.settings-dialog__label{font-size:13px;font-weight:600;color:#334155;letter-spacing:.01em}.settings-dialog__label--stacked{width:auto;text-align:left}.settings-dialog__label-with-tooltip{display:flex;align-items:center;gap:6px}.settings-dialog__label-with-tooltip--left{justify-content:flex-start}.settings-dialog__tooltip-icon{font-size:13px;color:#94a3b8;cursor:pointer}.settings-dialog__field-hint{font-size:12px;color:var(--sd-muted);line-height:1.5}.settings-dialog__input,.settings-dialog__select{width:100%;min-width:0;height:42px;padding:0 13px;border:1px solid var(--sd-border);border-radius:12px;box-sizing:border-box;font-size:14px;color:var(--sd-text);background:#fff;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.settings-dialog__input::-moz-placeholder,.settings-dialog__select::-moz-placeholder{color:#94a3b8}.settings-dialog__input::placeholder,.settings-dialog__select::placeholder{color:#94a3b8}.settings-dialog__input:focus,.settings-dialog__select:focus{outline:none;background:#fff;border-color:#f59e0b47;box-shadow:0 0 0 3px #f59e0b14}.settings-dialog__model-toolbar{display:flex;align-items:center;gap:10px;padding:2px 0 4px}.settings-dialog__model-search{display:flex;align-items:center;gap:8px;flex:1;min-width:0;height:38px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:12px;background:#f8fafc;color:#94a3b8;transition:border-color .18s ease,background-color .18s ease}.settings-dialog__model-search--disabled{background:#f8fafc;color:#cbd5e1}.settings-dialog__model-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:var(--sd-text)}.settings-dialog__model-search input::-moz-placeholder{color:#94a3b8}.settings-dialog__model-search input::placeholder{color:#94a3b8}.settings-dialog__model-search input:disabled{color:#94a3b8;cursor:not-allowed}.settings-dialog__model-search-clear{width:20px;height:20px;border:0;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__model-search-clear:hover{background:#94a3b824;color:#475569}.settings-dialog__model-type-groups{display:flex;flex-direction:column;gap:12px}.settings-dialog__model-type-group{display:flex;flex-direction:column;gap:10px;padding:14px 16px 12px;border-radius:16px;background:#fbfcfd}.settings-dialog__model-type-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-bottom:6px;border-bottom:1px solid rgba(226,232,240,.8)}.settings-dialog__model-type-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__model-type-count{font-size:12px;font-weight:700;color:var(--sd-muted)}.settings-dialog__model-type-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0 16px}.settings-dialog__model-type-item{--model-brand-accent: #475569;--model-brand-surface: #f8fafc;--model-brand-border: rgba(71, 85, 105, .14);display:flex;align-items:center;gap:10px;min-width:0;padding:10px 2px;border-bottom:1px solid rgba(241,245,249,.88)}.settings-dialog__model-type-item-logo{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:var(--model-brand-surface);color:var(--model-brand-accent)}.settings-dialog__model-type-item-copy{min-width:0;display:flex;flex-direction:column;gap:3px}.settings-dialog__model-type-item-id{font-size:13px;color:var(--sd-text);font-weight:600;word-break:break-all}.settings-dialog__model-type-item-vendor{font-size:12px;color:var(--sd-muted)}.settings-dialog__model-empty{display:flex;align-items:center;justify-content:center;min-height:96px;padding:18px;border-radius:16px;background:#f8fafc;font-size:12px;color:var(--sd-muted);text-align:center}.settings-dialog__compat-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:18px;background:#fffaf0;border:1px solid rgba(245,158,11,.14)}.settings-dialog__compat-title{font-size:13px;font-weight:700;color:#92400e}.settings-dialog__compat-meta{display:flex;flex-wrap:wrap;gap:8px}.settings-dialog__compat-meta span{font-size:12px;color:#78350f}.settings-dialog__notice,.settings-dialog__empty-panel{padding:14px 16px;border-radius:16px;border:1px solid rgba(148,163,184,.18);background:var(--sd-surface-soft);font-size:12px;color:var(--sd-muted)}.settings-dialog__notice--info{border-color:#bfdbfe;background:#eff6ff;color:#1d4ed8}.settings-dialog__notice--success{border-color:#bbf7d0;background:#f0fdf4;color:#15803d}.settings-dialog__notice--warning{border-color:#fde68a;background:#fffbeb;color:#b45309}.settings-dialog__notice--danger{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.settings-dialog__routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.settings-dialog__route-card{display:flex;flex-direction:column;gap:12px;padding:16px;border-radius:18px;border:1px solid var(--sd-border);background:#fff}.settings-dialog__route-card-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-dialog__route-card-title{font-size:15px;font-weight:700;color:var(--sd-text)}.settings-dialog__route-meta{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__stack{display:flex;flex-direction:column;gap:12px}.settings-dialog__inline-row{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-dialog__preference{display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}.settings-dialog__preference--panel{padding-top:8px}.settings-dialog__toggle-copy{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__toggle-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__toggle-desc{font-size:12px;color:var(--sd-muted)}.settings-dialog .t-switch{flex-shrink:0}.settings-dialog__actions{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:2px}.settings-dialog__actions-note{font-size:12px;color:var(--sd-muted)}.settings-dialog__actions-group{display:flex;align-items:center;justify-content:flex-end;gap:10px}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:0 16px;border:1px solid transparent;border-radius:14px;font-size:14px;font-weight:700;cursor:pointer;transition:box-shadow .18s ease,background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__button--cancel{border-color:var(--sd-border);background:#fff;color:#334155}.settings-dialog__button--fetch{min-height:38px;min-width:108px;padding:0 16px;border-color:#111;border-radius:12px;background:#111;color:#fff;box-shadow:none;white-space:nowrap;letter-spacing:.01em}.settings-dialog__button--fetch:hover:not(:disabled){border-color:#000;background:#000;color:#fff}.settings-dialog__button--fetch:disabled{border-color:#e5e7eb;background:#f3f4f6;color:#94a3b8}.settings-dialog__button-spinner{animation:settings-dialog-spin .9s linear infinite}.settings-dialog__ghost-button{background:#fff;border-color:var(--sd-border);color:#334155}.settings-dialog__danger-button{background:transparent;border-color:transparent;color:#b91c1c}.settings-dialog__danger-button:hover{background:#fff5f5;border-color:#f8717124}@media(max-width:980px){.settings-dialog{padding:12px}.settings-dialog__layout,.settings-dialog__workspace{grid-template-columns:1fr;gap:14px}.settings-dialog__model-groups,.settings-dialog__routes,.settings-dialog__grid{grid-template-columns:1fr}.settings-dialog__main{width:100%;max-width:760px;margin:0 auto;border-radius:24px}.settings-dialog__model-toolbar{flex-direction:column;align-items:stretch}.settings-dialog__model-search{width:100%}.settings-dialog__nav{width:100%;max-width:760px;margin:0 auto}.settings-dialog__nav-shell{padding:0;border-bottom:1px solid rgba(15,23,42,.06)}.settings-dialog__nav-list{flex-direction:row;overflow-x:auto;justify-content:center;gap:0;width:100%;max-width:720px;margin:0 auto;padding:0 4px;scrollbar-width:none}.settings-dialog__nav-list::-webkit-scrollbar{display:none}.settings-dialog__nav-item{min-width:0;min-height:56px;flex:1 1 0;align-items:center;padding:0 12px 10px;border-radius:0;text-align:center;color:var(--sd-muted);transform:translateY(0);transition:color .18s ease,transform .18s ease}.settings-dialog__nav-item:hover{background:transparent;color:var(--sd-text)}.settings-dialog__nav-item:after{content:"";position:absolute;left:18px;right:18px;bottom:0;height:3px;border-radius:999px;background:linear-gradient(90deg,#f59e0b,#fbbf24);opacity:0;transform:scaleX(.58);transition:opacity .2s ease,transform .2s ease}.settings-dialog__nav-item--active{background:transparent;color:var(--sd-text);transform:translateY(-1px)}.settings-dialog__nav-item--active:before{display:none}.settings-dialog__nav-item--active:after{opacity:1;transform:scaleX(1)}.settings-dialog__nav-item-title{font-size:15px;text-align:center}.settings-dialog__sidebar{padding:0;border-right:none;border-bottom:none}.settings-dialog__sidebar-shell{height:auto;gap:14px}.settings-dialog__sidebar-shell--catalog .settings-dialog__sidebar-list{gap:0;padding:0;border:1px solid rgba(15,23,42,.08);border-radius:24px;background:#fff;box-shadow:0 12px 28px #0f172a0d;overflow:hidden}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row{padding:14px 16px;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row+.settings-dialog__provider-row{border-top:1px solid rgba(226,232,240,.86)}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row--active{background:#f59e0b0f;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-list{display:flex;flex-direction:column;gap:10px;overflow:auto;padding:4px 0 0}.settings-dialog__sidebar-list::-webkit-scrollbar{width:0}.settings-dialog__sidebar-item,.settings-dialog__provider-row{min-height:auto;scroll-snap-align:none;border-radius:20px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__sidebar-item{padding:16px}.settings-dialog__sidebar-item--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__sidebar-item--active:before{display:none}.settings-dialog__provider-row{padding:12px 14px}.settings-dialog__provider-row--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__provider-row--active:before{display:none}.settings-dialog__sidebar-add{justify-content:center;min-height:46px;border:1px dashed rgba(245,158,11,.22);background:#fffaf0;color:#92400e}.settings-dialog__provider-switch{flex-direction:column;align-items:flex-end;gap:6px;min-width:58px}.settings-dialog__provider-switch-copy{display:inline-flex}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:14px;padding:14px}.settings-dialog__content-panel>.settings-dialog__section,.settings-dialog__content-panel>.settings-dialog__routes,.settings-dialog__content-panel>.settings-dialog__compact-stage-header,.settings-dialog__content-panel>.settings-dialog__mobile-stage,.settings-dialog__content-panel--canvas>.settings-dialog__section,.settings-dialog__content-panel--canvas>.settings-dialog__routes,.settings-dialog__content-panel--canvas>.settings-dialog__compact-stage-header,.settings-dialog__content-panel--canvas>.settings-dialog__mobile-stage{width:100%;max-width:720px;margin-left:auto;margin-right:auto}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:14px 14px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px;border-radius:22px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 14px 34px #0f172a0d}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{margin-top:12px;border-top:none}.settings-dialog__content-panel--canvas{max-width:none}.settings-dialog__content-panel--canvas .settings-dialog__section{padding:18px;border-radius:24px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__content-panel--canvas .settings-dialog__section--canvas-card{gap:16px}.settings-dialog__content-panel--canvas .settings-dialog__preference{padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__section-header,.settings-dialog__panel-header,.settings-dialog__compat-card{flex-direction:column;align-items:stretch}.settings-dialog__profile-hero{align-items:flex-start}.settings-dialog__inline-row,.settings-dialog__actions-group{width:100%}.settings-dialog__preference{align-items:stretch;padding:16px 18px;border-radius:20px;background:#ffffffc7;border:1px solid rgba(15,23,42,.06)}.settings-dialog__actions{flex-direction:column;align-items:stretch}.settings-dialog__actions-group{justify-content:stretch}}@media(max-width:640px){.settings-dialog{padding:0}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{width:100%}.settings-dialog__nav-item{min-height:52px;padding:0 10px 8px}.settings-dialog__nav-item-title{font-size:13px}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:12px;padding:10px}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:12px 12px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:14px}.settings-dialog__section-title{font-size:15px}.settings-dialog__inline-meta{gap:6px}.settings-dialog__inline-meta span:not(:last-child):after{margin-left:6px}.settings-dialog__field{gap:8px}.settings-dialog__input,.settings-dialog__select{height:44px;font-size:16px}.settings-dialog__model-type-list{grid-template-columns:1fr}.settings-dialog__preference{flex-direction:column;align-items:stretch;gap:12px}.settings-dialog__provider-row{padding:12px}.settings-dialog__provider-switch{justify-content:flex-end}.settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-summary-row{align-items:flex-start;flex-direction:column}.settings-dialog__sidebar-summary-action{width:100%}.settings-dialog__compact-back{width:100%;justify-content:center}}.model-discovery-dialog{--md-text: #0f172a;--md-muted: #64748b;--md-border: #e2e8f0;--md-surface: #ffffff;--md-surface-muted: #f8fafc;width:min(1080px,100vw - 32px);height:min(780px,100vh - 32px);max-height:min(780px,100vh - 32px);display:flex;flex-direction:column;gap:16px;padding:22px 22px 18px;border-radius:24px;background:linear-gradient(180deg,#fbfcfe,#f6f8fc);box-shadow:0 20px 56px #0f172a1f;overflow:hidden}.model-discovery-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.model-discovery-dialog__headline{display:flex;flex-direction:column;gap:10px;min-width:0}.model-discovery-dialog__title{margin:0;font-size:24px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__header-stats{display:inline-flex;flex-wrap:wrap;gap:8px}.model-discovery-dialog__header-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 12px;border-radius:999px;background:#eef2f7;color:#334155;font-size:12px;font-weight:700}.model-discovery-dialog__header-pill--accent{background:#f59e0b24;color:#b45309}.model-discovery-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--md-border);border-radius:999px;background:var(--md-surface);color:#475569;cursor:pointer;transition:background .18s ease,border-color .18s ease,color .18s ease}.model-discovery-dialog__close:hover{border-color:#cbd5e1;background:#f8fafc;color:#0f172a}.model-discovery-dialog__toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px}.model-discovery-dialog__toolbar-actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__search{display:flex;align-items:center;gap:10px;flex:1;min-width:0;height:42px;padding:0 13px;border:1px solid rgba(15,23,42,.08);border-radius:13px;background:var(--md-surface);color:var(--md-muted);box-shadow:inset 0 1px #fff9}.model-discovery-dialog__search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:14px;color:var(--md-text)}.model-discovery-dialog__ghost-button,.model-discovery-dialog__button{min-height:40px;padding:0 14px;border:0;border-radius:12px;font-size:13px;font-weight:700;cursor:pointer;transition:opacity .18s ease,transform .18s ease,background .18s ease}.model-discovery-dialog__ghost-button:disabled,.model-discovery-dialog__button:disabled{cursor:not-allowed;opacity:.48}.model-discovery-dialog__ghost-button{background:#eef2f7;color:#334155}.model-discovery-dialog__ghost-button:hover:not(:disabled){background:#e2e8f0}.model-discovery-dialog__ghost-button--muted{background:#f1f5f9;color:#64748b}.model-discovery-dialog__type-tabs{display:flex;align-items:center;gap:18px;min-height:40px;padding:0 2px 4px;border-bottom:0}.model-discovery-dialog__type-tab{display:inline-flex;align-items:center;gap:8px;min-height:0;padding:0 0 10px;border:0;border-radius:0;background:transparent;color:#64748b;font-size:13px;font-weight:700;cursor:pointer;position:relative;transition:color .18s ease}.model-discovery-dialog__type-tab:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:999px;background:transparent;transition:background .18s ease}.model-discovery-dialog__type-tab--active{color:#0f172a}.model-discovery-dialog__type-tab--active:after{background:#f59e0b}.model-discovery-dialog__type-tab:hover{color:#b45309}.model-discovery-dialog__type-tab-count{font-size:12px;color:currentColor;opacity:.82;font-variant-numeric:tabular-nums}.model-discovery-dialog__body{display:flex;flex-direction:column;min-height:0;flex:1;overflow:hidden;padding:10px 0 0;border-radius:20px;background:#fff;box-shadow:inset 0 0 0 1px #0f172a0f}.model-discovery-dialog__group-list{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:0;padding:0 14px 12px;background:transparent}.model-discovery-dialog__empty{display:flex;align-items:center;justify-content:center;min-height:260px;color:var(--md-muted);font-size:14px}.model-discovery-dialog__vendor-group{--vendor-accent: #475569;--vendor-surface: #f8fafc;--vendor-border: rgba(71, 85, 105, .14);border-bottom:1px solid #eef2f7;background:transparent}.model-discovery-dialog__vendor-header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 4px;border:0;background:transparent;cursor:pointer;text-align:left}.model-discovery-dialog__vendor-main{display:flex;align-items:center;gap:14px;min-width:0}.model-discovery-dialog__vendor-logo-shell{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--vendor-accent)}.model-discovery-dialog__vendor-copy{min-width:0;display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.model-discovery-dialog__vendor-name{font-size:15px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__vendor-meta{display:flex;flex-wrap:wrap;gap:10px}.model-discovery-dialog__vendor-meta-pill{color:#64748b;font-size:11px;font-weight:600}.model-discovery-dialog__vendor-spacer{flex:1;min-width:24px;height:1px;background:#edf2f7}.model-discovery-dialog__vendor-side{display:flex;align-items:center;gap:10px;flex:none}.model-discovery-dialog__vendor-selected{display:inline-flex;align-items:center;color:#b45309;font-size:12px;font-weight:700}.model-discovery-dialog__vendor-count{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 10px;border-radius:999px;background:#f8fafc;color:var(--vendor-accent);font-size:13px;font-weight:800}.model-discovery-dialog__vendor-chevron{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:transform .18s ease}.model-discovery-dialog__vendor-chevron--expanded{transform:rotate(180deg)}.model-discovery-dialog__vendor-body{display:flex;flex-direction:column;gap:12px;overflow:visible;padding:2px 4px 16px 40px;background:transparent}.model-discovery-dialog__type-section{display:flex;flex-direction:column;gap:8px}.model-discovery-dialog__type-section-header{display:flex;align-items:center;justify-content:flex-start;gap:6px;padding-left:0}.model-discovery-dialog__type-section-title{font-size:11px;font-weight:700;color:#94a3b8;letter-spacing:.04em}.model-discovery-dialog__type-section-count{display:none}.model-discovery-dialog__model-stack{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:0 18px;padding-left:0}.model-discovery-dialog__item{position:relative;display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid rgba(241,245,249,.9);background:transparent;cursor:pointer;transition:color .18s ease,opacity .18s ease}.model-discovery-dialog__item:hover{color:var(--vendor-accent);opacity:.88}.model-discovery-dialog__item--checked{color:var(--vendor-accent)}.model-discovery-dialog__checkbox{position:absolute;opacity:0;pointer-events:none}.model-discovery-dialog__checkmark{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#fff}.model-discovery-dialog__item--checked .model-discovery-dialog__checkmark{border-color:var(--vendor-accent);background:var(--vendor-accent)}.model-discovery-dialog__item-body{flex:1;min-width:0}.model-discovery-dialog__item-id{font-size:13px;color:var(--md-text);word-break:break-all}.model-discovery-dialog__item-id--checked{font-weight:700}.model-discovery-dialog__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid rgba(15,23,42,.06)}.model-discovery-dialog__selection-count{font-size:12px;color:var(--md-muted)}.model-discovery-dialog__actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__button--secondary{background:#e2e8f0;color:#334155}.model-discovery-dialog__button--secondary:hover:not(:disabled){background:#cbd5e1}.model-discovery-dialog__button--primary{background:linear-gradient(135deg,#f59e0b,#f97316);color:#fff}.model-discovery-dialog__button--primary:hover:not(:disabled){transform:translateY(-1px)}@media(max-width:900px){.model-discovery-dialog{width:min(100vw - 16px,100%);height:calc(100vh - 16px);max-height:calc(100vh - 16px);padding:16px}.model-discovery-dialog__toolbar,.model-discovery-dialog__footer,.model-discovery-dialog__vendor-header{flex-direction:column;align-items:stretch}.model-discovery-dialog__vendor-copy{align-items:flex-start}.model-discovery-dialog__vendor-spacer{display:none}.model-discovery-dialog__toolbar-actions,.model-discovery-dialog__actions{width:100%}.model-discovery-dialog__toolbar-actions>*,.model-discovery-dialog__actions>*{flex:1}.model-discovery-dialog__vendor-side{justify-content:flex-end}.model-discovery-dialog__type-tabs{gap:14px;overflow-x:auto;overflow-y:hidden;padding-bottom:8px;scrollbar-width:none}.model-discovery-dialog__type-tabs::-webkit-scrollbar{display:none}.model-discovery-dialog__type-section{gap:6px}.model-discovery-dialog__model-stack{grid-template-columns:1fr;padding-left:0}.model-discovery-dialog__type-section-header{padding-left:0}}
1
+ .winbox-settings-window .wb-header{border-bottom-color:#0f172a14!important}.winbox-settings-window .wb-title{font-size:15px;font-weight:700;color:#0f172a}.winbox-settings-window .wb-body{overflow:hidden;background:#fff}.winbox-settings-window .winbox-content-wrapper{padding:0!important;overflow:hidden;background:#fff}@keyframes settings-dialog-spin{to{transform:rotate(360deg)}}@keyframes settings-dialog-mobile-stage-enter{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.settings-dialog{--sd-accent: #f59e0b;--sd-accent-soft: rgba(245, 158, 11, .1);--sd-text: #0f172a;--sd-muted: #64748b;--sd-border: rgba(15, 23, 42, .08);--sd-border-strong: rgba(15, 23, 42, .14);--sd-surface: #ffffff;--sd-surface-soft: #f7f8fa;width:100%;height:100%;min-height:0;display:flex;flex-direction:column;padding:18px;box-sizing:border-box;background:#fff;overflow:hidden}.settings-dialog__layout{display:grid;grid-template-columns:144px minmax(0,1fr);gap:14px;min-height:0;flex:1}.settings-dialog__nav,.settings-dialog__main,.settings-dialog__sidebar,.settings-dialog__content-panel{min-height:0}.settings-dialog__nav-shell{display:flex;flex-direction:column;gap:0;height:100%;padding:4px 0 0 2px}.settings-dialog__nav-list{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__nav-item{display:flex;flex-direction:column;justify-content:center;min-height:42px;padding:0 10px;text-align:left;position:relative;border:none;border-radius:14px;background:transparent;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__nav-item:hover{background:#f7f8fa}.settings-dialog__nav-item--active{background:#f4f6f9}.settings-dialog__nav-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__nav-item-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__main{min-width:0;min-height:0;display:flex;flex-direction:column;border-radius:18px;border:1px solid rgba(15,23,42,.05);background:#fff;overflow:hidden}.settings-dialog__workspace{display:grid;grid-template-columns:264px minmax(0,1fr);gap:0;height:100%;min-height:0;flex:1;overflow:hidden}.settings-dialog__workspace--single{grid-template-columns:minmax(0,1fr)}.settings-dialog__sidebar{min-width:0;padding:12px 12px 12px 14px;border-right:1px solid rgba(15,23,42,.05);overflow:hidden}.settings-dialog__sidebar-shell{display:flex;flex-direction:column;gap:10px;height:100%;padding:0;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog{background:transparent}.settings-dialog__sidebar-summary{display:flex;flex-direction:column;gap:2px;padding:2px 4px 0}.settings-dialog__sidebar-summary-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-dialog__sidebar-summary-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-summary-text{font-size:12px;line-height:1.5;color:var(--sd-muted)}.settings-dialog__sidebar-summary-action{min-height:30px;padding:0 12px;border:1px solid rgba(245,158,11,.18);border-radius:999px;background:#fffaf0;color:#b45309;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__sidebar-summary-action:hover{border-color:#f59e0b4d;background:#fff5de}.settings-dialog__sidebar-list{min-height:0;flex:1;display:flex;flex-direction:column;gap:4px;overflow:auto;padding-right:4px}.settings-dialog__sidebar-list::-webkit-scrollbar{width:5px}.settings-dialog__sidebar-list::-webkit-scrollbar-track{background:transparent}.settings-dialog__sidebar-list::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b859}.settings-dialog__sidebar-item,.settings-dialog__sidebar-add{width:100%;border-radius:16px}.settings-dialog__sidebar-item{display:flex;flex-direction:column;gap:4px;padding:12px 14px;text-align:left;position:relative;border:1px solid transparent;background:transparent;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__sidebar-item:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__sidebar-item--active{border-color:transparent;background:#f4f6f9}.settings-dialog__sidebar-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__sidebar-item-top{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__sidebar-item-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-item-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:56px;padding:4px 8px 4px 6px;position:relative;border-radius:14px;border:1px solid transparent;background:transparent;transition:background-color .18s ease,border-color .18s ease,opacity .18s ease}.settings-dialog__provider-row:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__provider-row--active{border-color:transparent;background:#f4f6f9}.settings-dialog__provider-row--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__provider-row--disabled .settings-dialog__provider-name{color:#94a3b8}.settings-dialog__provider-select{min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;text-align:left}.settings-dialog__provider-select-main{min-width:0;flex:1;display:inline-flex;align-items:center;gap:10px}.settings-dialog__provider-copy{min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px;flex:1}.settings-dialog__provider-name-row{min-width:0;display:inline-flex;align-items:center;gap:8px}.settings-dialog__provider-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__provider-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-avatar{width:32px;height:32px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;overflow:hidden;font-size:14px;font-weight:700;color:#0f172a;background:#f4f6f8}.settings-dialog__provider-avatar--large{width:44px;height:44px;border-radius:14px;font-size:18px}.settings-dialog__provider-avatar--amber{background:#fff3dd;color:#b45309}.settings-dialog__provider-avatar--sky{background:#e6f2ff;color:#2563eb}.settings-dialog__provider-avatar--mint{background:#e7f8f1;color:#0f766e}.settings-dialog__provider-avatar--rose{background:#ffe8ed;color:#be185d}.settings-dialog__provider-avatar--violet{background:#f1ebff;color:#7c3aed}.settings-dialog__provider-avatar-image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.settings-dialog__provider-avatar-text{line-height:1}.settings-dialog__provider-tag{display:inline-flex;align-items:center;min-height:auto;padding:0;border-radius:0;background:transparent;color:#b45309;font-size:10px;font-weight:700}.settings-dialog__provider-switch{display:inline-flex;align-items:center;justify-content:flex-end;gap:8px}.settings-dialog__provider-switch-copy{display:none;font-size:11px;font-weight:700;color:var(--sd-muted)}.settings-dialog__provider-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-badge{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:700}.settings-dialog__sidebar-badge--accent{background:var(--sd-accent-soft);color:#b45309}.settings-dialog__sidebar-badge--warning{background:#fbbf2429;color:#b45309}.settings-dialog__sidebar-badge--muted{background:#f1f5f9;color:#475569}.settings-dialog__sidebar-add{min-height:38px;display:inline-flex;align-items:center;justify-content:flex-start;gap:10px;padding:0 8px;border:none;background:transparent;color:#475569;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__sidebar-add:hover{background:#f7f8fa;color:#b45309}.settings-dialog__sidebar-add-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;background:#f59e0b24;font-size:16px;line-height:1;color:#b45309}.settings-dialog__content-panel{overflow:auto;display:flex;flex-direction:column;flex:1;gap:14px;padding:14px 16px 16px}.settings-dialog__content-panel::-webkit-scrollbar{width:6px}.settings-dialog__content-panel::-webkit-scrollbar-track{background:transparent}.settings-dialog__content-panel::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b847}.settings-dialog__content-panel--providers{gap:0;padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px 18px}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{border-top:1px solid rgba(15,23,42,.06)}.settings-dialog__content-panel--providers .settings-dialog__section--compact{padding-top:14px;padding-bottom:14px}.settings-dialog__content-panel--canvas{padding:14px 16px 16px}.settings-dialog__content-panel--compact,.settings-dialog__content-panel--detail{animation:settings-dialog-mobile-stage-enter .24s ease}.settings-dialog__mobile-stage{display:flex;flex-direction:column;gap:14px}.settings-dialog__compact-stage-header{display:flex;flex-direction:column;gap:10px}.settings-dialog__compact-back{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;min-height:34px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:999px;background:#fff;color:#334155;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__compact-back:hover{border-color:#f59e0b38;color:#b45309;background:#fffaf0}.settings-dialog__compact-stage-copy{display:flex;flex-direction:column;gap:6px}.settings-dialog__compact-stage-eyebrow{font-size:12px;font-weight:700;letter-spacing:.04em;color:#b45309}.settings-dialog__compact-stage-text{margin:0;font-size:13px;line-height:1.6;color:var(--sd-muted)}.settings-dialog__section{display:flex;flex-direction:column;gap:12px;padding:0}.settings-dialog__section-header,.settings-dialog__panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__section-title{margin:0;font-size:16px;font-weight:700;color:var(--sd-text)}.settings-dialog__profile-hero{display:flex;align-items:center;gap:12px;min-width:0}.settings-dialog__profile-hero>div{min-width:0}.settings-dialog__inline-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__inline-meta span{display:inline-flex;align-items:center;position:relative;min-height:auto;padding:0;border-radius:0;border:none;background:transparent}.settings-dialog__inline-meta span:not(:last-child):after{content:"";width:4px;height:4px;margin-left:8px;border-radius:999px;background:#94a3b899}.settings-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.settings-dialog__field{display:flex;gap:10px}.settings-dialog__field--column{flex-direction:column}.settings-dialog__field--full{grid-column:1/-1}.settings-dialog__label{font-size:13px;font-weight:600;color:#334155;letter-spacing:.01em}.settings-dialog__label--stacked{width:auto;text-align:left}.settings-dialog__label-with-tooltip{display:flex;align-items:center;gap:6px}.settings-dialog__label-with-tooltip--left{justify-content:flex-start}.settings-dialog__tooltip-icon{font-size:13px;color:#94a3b8;cursor:pointer}.settings-dialog__field-hint{font-size:12px;color:var(--sd-muted);line-height:1.5}.settings-dialog__input,.settings-dialog__select{width:100%;min-width:0;height:42px;padding:0 13px;border:1px solid var(--sd-border);border-radius:12px;box-sizing:border-box;font-size:14px;color:var(--sd-text);background:#fff;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.settings-dialog__input::-moz-placeholder,.settings-dialog__select::-moz-placeholder{color:#94a3b8}.settings-dialog__input::placeholder,.settings-dialog__select::placeholder{color:#94a3b8}.settings-dialog__input:focus,.settings-dialog__select:focus{outline:none;background:#fff;border-color:#f59e0b47;box-shadow:0 0 0 3px #f59e0b14}.settings-dialog__model-toolbar{display:flex;align-items:center;gap:10px;padding:2px 0 4px}.settings-dialog__model-search{display:flex;align-items:center;gap:8px;flex:1;min-width:0;height:38px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:12px;background:#f8fafc;color:#94a3b8;transition:border-color .18s ease,background-color .18s ease}.settings-dialog__model-search--disabled{background:#f8fafc;color:#cbd5e1}.settings-dialog__model-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:var(--sd-text)}.settings-dialog__model-search input::-moz-placeholder{color:#94a3b8}.settings-dialog__model-search input::placeholder{color:#94a3b8}.settings-dialog__model-search input:disabled{color:#94a3b8;cursor:not-allowed}.settings-dialog__model-search-clear{width:20px;height:20px;border:0;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__model-search-clear:hover{background:#94a3b824;color:#475569}.settings-dialog__model-type-groups{display:flex;flex-direction:column;gap:12px}.settings-dialog__model-type-group{display:flex;flex-direction:column;gap:10px;padding:14px 16px 12px;border-radius:16px;background:#fbfcfd}.settings-dialog__model-type-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-bottom:6px;border-bottom:1px solid rgba(226,232,240,.8)}.settings-dialog__model-type-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__model-type-count{font-size:12px;font-weight:700;color:var(--sd-muted)}.settings-dialog__model-type-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0 16px}.settings-dialog__model-type-item{--model-brand-accent: #475569;--model-brand-surface: #f8fafc;--model-brand-border: rgba(71, 85, 105, .14);display:flex;align-items:center;gap:10px;min-width:0;padding:10px 2px;border-bottom:1px solid rgba(241,245,249,.88)}.settings-dialog__model-type-item-logo{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:var(--model-brand-surface);color:var(--model-brand-accent)}.settings-dialog__model-type-item-copy{min-width:0;display:flex;flex-direction:column;gap:3px}.settings-dialog__model-type-item-id{font-size:13px;color:var(--sd-text);font-weight:600;word-break:break-all}.settings-dialog__model-type-item-vendor{font-size:12px;color:var(--sd-muted)}.settings-dialog__model-empty{display:flex;align-items:center;justify-content:center;min-height:96px;padding:18px;border-radius:16px;background:#f8fafc;font-size:12px;color:var(--sd-muted);text-align:center}.settings-dialog__compat-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:18px;background:#fffaf0;border:1px solid rgba(245,158,11,.14)}.settings-dialog__compat-title{font-size:13px;font-weight:700;color:#92400e}.settings-dialog__compat-meta{display:flex;flex-wrap:wrap;gap:8px}.settings-dialog__compat-meta span{font-size:12px;color:#78350f}.settings-dialog__notice,.settings-dialog__empty-panel{padding:14px 16px;border-radius:16px;border:1px solid rgba(148,163,184,.18);background:var(--sd-surface-soft);font-size:12px;color:var(--sd-muted)}.settings-dialog__notice--info{border-color:#bfdbfe;background:#eff6ff;color:#1d4ed8}.settings-dialog__notice--success{border-color:#bbf7d0;background:#f0fdf4;color:#15803d}.settings-dialog__notice--warning{border-color:#fde68a;background:#fffbeb;color:#b45309}.settings-dialog__notice--danger{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.settings-dialog__routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.settings-dialog__route-card{display:flex;flex-direction:column;gap:12px;padding:16px;border-radius:18px;border:1px solid var(--sd-border);background:#fff}.settings-dialog__route-card-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-dialog__route-card-title{font-size:15px;font-weight:700;color:var(--sd-text)}.settings-dialog__route-meta{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__stack{display:flex;flex-direction:column;gap:12px}.settings-dialog__inline-row{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-dialog__preference{display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}.settings-dialog__preference--panel{padding-top:8px}.settings-dialog__toggle-copy{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__toggle-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__toggle-desc{font-size:12px;color:var(--sd-muted)}.settings-dialog .t-switch{flex-shrink:0}.settings-dialog__actions{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:2px}.settings-dialog__actions-note{font-size:12px;color:var(--sd-muted)}.settings-dialog__actions-group{display:flex;align-items:center;justify-content:flex-end;gap:10px}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:0 16px;border:1px solid transparent;border-radius:14px;font-size:14px;font-weight:700;cursor:pointer;transition:box-shadow .18s ease,background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__button--cancel{border-color:var(--sd-border);background:#fff;color:#334155}.settings-dialog__button--fetch{min-height:38px;min-width:108px;padding:0 16px;border-color:#111;border-radius:12px;background:#111;color:#fff;box-shadow:none;white-space:nowrap;letter-spacing:.01em}.settings-dialog__button--fetch:hover:not(:disabled){border-color:#000;background:#000;color:#fff}.settings-dialog__button--fetch:disabled{border-color:#e5e7eb;background:#f3f4f6;color:#94a3b8}.settings-dialog__button-spinner{animation:settings-dialog-spin .9s linear infinite}.settings-dialog__ghost-button{background:#fff;border-color:var(--sd-border);color:#334155}.settings-dialog__danger-button{background:transparent;border-color:transparent;color:#b91c1c}.settings-dialog__danger-button:hover{background:#fff5f5;border-color:#f8717124}@media(max-width:980px){.settings-dialog{padding:12px}.settings-dialog__layout,.settings-dialog__workspace{grid-template-columns:1fr;gap:14px}.settings-dialog__model-groups,.settings-dialog__routes,.settings-dialog__grid{grid-template-columns:1fr}.settings-dialog__main{width:100%;max-width:760px;margin:0 auto;border-radius:24px}.settings-dialog__model-toolbar{flex-direction:column;align-items:stretch}.settings-dialog__model-search{width:100%}.settings-dialog__nav{width:100%;max-width:760px;margin:0 auto}.settings-dialog__nav-shell{padding:0;border-bottom:1px solid rgba(15,23,42,.06)}.settings-dialog__nav-list{flex-direction:row;overflow-x:auto;justify-content:center;gap:0;width:100%;max-width:720px;margin:0 auto;padding:0 4px;scrollbar-width:none}.settings-dialog__nav-list::-webkit-scrollbar{display:none}.settings-dialog__nav-item{min-width:0;min-height:56px;flex:1 1 0;align-items:center;padding:0 12px 10px;border-radius:0;text-align:center;color:var(--sd-muted);transform:translateY(0);transition:color .18s ease,transform .18s ease}.settings-dialog__nav-item:hover{background:transparent;color:var(--sd-text)}.settings-dialog__nav-item:after{content:"";position:absolute;left:18px;right:18px;bottom:0;height:3px;border-radius:999px;background:linear-gradient(90deg,#f59e0b,#fbbf24);opacity:0;transform:scaleX(.58);transition:opacity .2s ease,transform .2s ease}.settings-dialog__nav-item--active{background:transparent;color:var(--sd-text);transform:translateY(-1px)}.settings-dialog__nav-item--active:before{display:none}.settings-dialog__nav-item--active:after{opacity:1;transform:scaleX(1)}.settings-dialog__nav-item-title{font-size:15px;text-align:center}.settings-dialog__sidebar{padding:0;border-right:none;border-bottom:none}.settings-dialog__sidebar-shell{height:auto;gap:14px}.settings-dialog__sidebar-shell--catalog .settings-dialog__sidebar-list{gap:0;padding:0;border:1px solid rgba(15,23,42,.08);border-radius:24px;background:#fff;box-shadow:0 12px 28px #0f172a0d;overflow:hidden}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row{padding:14px 16px;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row+.settings-dialog__provider-row{border-top:1px solid rgba(226,232,240,.86)}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row--active{background:#f59e0b0f;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-list{display:flex;flex-direction:column;gap:10px;overflow:auto;padding:4px 0 0}.settings-dialog__sidebar-list::-webkit-scrollbar{width:0}.settings-dialog__sidebar-item,.settings-dialog__provider-row{min-height:auto;scroll-snap-align:none;border-radius:20px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__sidebar-item{padding:16px}.settings-dialog__sidebar-item--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__sidebar-item--active:before{display:none}.settings-dialog__provider-row{padding:12px 14px}.settings-dialog__provider-row--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__provider-row--active:before{display:none}.settings-dialog__sidebar-add{justify-content:center;min-height:46px;border:1px dashed rgba(245,158,11,.22);background:#fffaf0;color:#92400e}.settings-dialog__provider-switch{flex-direction:column;align-items:flex-end;gap:6px;min-width:58px}.settings-dialog__provider-switch-copy{display:inline-flex}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:14px;padding:14px}.settings-dialog__content-panel>.settings-dialog__section,.settings-dialog__content-panel>.settings-dialog__routes,.settings-dialog__content-panel>.settings-dialog__compact-stage-header,.settings-dialog__content-panel>.settings-dialog__mobile-stage,.settings-dialog__content-panel--canvas>.settings-dialog__section,.settings-dialog__content-panel--canvas>.settings-dialog__routes,.settings-dialog__content-panel--canvas>.settings-dialog__compact-stage-header,.settings-dialog__content-panel--canvas>.settings-dialog__mobile-stage{width:100%;max-width:720px;margin-left:auto;margin-right:auto}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:14px 14px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px;border-radius:22px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 14px 34px #0f172a0d}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{margin-top:12px;border-top:none}.settings-dialog__content-panel--canvas{max-width:none}.settings-dialog__content-panel--canvas .settings-dialog__section{padding:18px;border-radius:24px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__content-panel--canvas .settings-dialog__section--canvas-card{gap:16px}.settings-dialog__content-panel--canvas .settings-dialog__preference{padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__section-header,.settings-dialog__panel-header,.settings-dialog__compat-card{flex-direction:column;align-items:stretch}.settings-dialog__profile-hero{align-items:flex-start}.settings-dialog__inline-row,.settings-dialog__actions-group{width:100%}.settings-dialog__preference{align-items:stretch;padding:16px 18px;border-radius:20px;background:#ffffffc7;border:1px solid rgba(15,23,42,.06)}.settings-dialog__actions{flex-direction:column;align-items:stretch}.settings-dialog__actions-group{justify-content:stretch}}@media(max-width:640px){.settings-dialog{padding:0}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{width:100%}.settings-dialog__nav-item{min-height:52px;padding:0 10px 8px}.settings-dialog__nav-item-title{font-size:13px}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:12px;padding:10px}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:12px 12px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:14px}.settings-dialog__section-title{font-size:15px}.settings-dialog__inline-meta{gap:6px}.settings-dialog__inline-meta span:not(:last-child):after{margin-left:6px}.settings-dialog__field{gap:8px}.settings-dialog__input,.settings-dialog__select{height:44px;font-size:16px}.settings-dialog__model-type-list{grid-template-columns:1fr}.settings-dialog__preference{flex-direction:column;align-items:stretch;gap:12px}.settings-dialog__provider-row{padding:12px}.settings-dialog__provider-switch{justify-content:flex-end}.settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-summary-row{align-items:flex-start;flex-direction:column}.settings-dialog__sidebar-summary-action{width:100%}.settings-dialog__compact-back{width:100%;justify-content:center}}.model-discovery-dialog{--md-text: #0f172a;--md-muted: #64748b;--md-border: #e2e8f0;--md-surface: #ffffff;--md-surface-muted: #f8fafc;width:min(1080px,100vw - 32px);height:min(780px,100vh - 32px);max-height:min(780px,100vh - 32px);display:flex;flex-direction:column;gap:16px;padding:22px 22px 18px;border-radius:24px;background:linear-gradient(180deg,#fbfcfe,#f6f8fc);box-shadow:0 20px 56px #0f172a1f;overflow:hidden}.model-discovery-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.model-discovery-dialog__headline{display:flex;flex-direction:column;gap:10px;min-width:0}.model-discovery-dialog__title{margin:0;font-size:24px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__header-stats{display:inline-flex;flex-wrap:wrap;gap:8px}.model-discovery-dialog__header-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 12px;border-radius:999px;background:#eef2f7;color:#334155;font-size:12px;font-weight:700}.model-discovery-dialog__header-pill--accent{background:#f59e0b24;color:#b45309}.model-discovery-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--md-border);border-radius:999px;background:var(--md-surface);color:#475569;cursor:pointer;transition:background .18s ease,border-color .18s ease,color .18s ease}.model-discovery-dialog__close:hover{border-color:#cbd5e1;background:#f8fafc;color:#0f172a}.model-discovery-dialog__toolbar{display:flex;align-items:center;gap:12px}.model-discovery-dialog__search{display:flex;align-items:center;gap:10px;flex:1;min-width:0;height:42px;padding:0 13px;border:1px solid rgba(15,23,42,.08);border-radius:13px;background:var(--md-surface);color:var(--md-muted);box-shadow:inset 0 1px #fff9}.model-discovery-dialog__search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:14px;color:var(--md-text)}.model-discovery-dialog__ghost-button,.model-discovery-dialog__button{min-height:40px;padding:0 14px;border:0;border-radius:12px;font-size:13px;font-weight:700;cursor:pointer;transition:opacity .18s ease,transform .18s ease,background .18s ease}.model-discovery-dialog__ghost-button:disabled,.model-discovery-dialog__button:disabled{cursor:not-allowed;opacity:.48}.model-discovery-dialog__ghost-button{background:#eef2f7;color:#334155}.model-discovery-dialog__ghost-button:hover:not(:disabled){background:#e2e8f0}.model-discovery-dialog__ghost-button--muted{background:#f1f5f9;color:#64748b}.model-discovery-dialog__type-tabs{display:flex;align-items:center;gap:18px;min-height:40px;padding:0 2px 4px;border-bottom:0}.model-discovery-dialog__type-tab{display:inline-flex;align-items:center;gap:8px;min-height:0;padding:0 0 10px;border:0;border-radius:0;background:transparent;color:#64748b;font-size:13px;font-weight:700;cursor:pointer;position:relative;transition:color .18s ease}.model-discovery-dialog__type-tab:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:999px;background:transparent;transition:background .18s ease}.model-discovery-dialog__type-tab--active{color:#0f172a}.model-discovery-dialog__type-tab--active:after{background:#f59e0b}.model-discovery-dialog__type-tab:hover{color:#b45309}.model-discovery-dialog__type-tab-count{font-size:12px;color:currentColor;opacity:.82;font-variant-numeric:tabular-nums}.model-discovery-dialog__body{display:flex;flex-direction:column;min-height:0;flex:1;overflow:hidden;padding:10px 0 0;border-radius:20px;background:#fff;box-shadow:inset 0 0 0 1px #0f172a0f}.model-discovery-dialog__group-list{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:0;padding:0 14px 12px;background:transparent}.model-discovery-dialog__empty{display:flex;align-items:center;justify-content:center;min-height:260px;color:var(--md-muted);font-size:14px}.model-discovery-dialog__vendor-group{--vendor-accent: #475569;--vendor-surface: #f8fafc;--vendor-border: rgba(71, 85, 105, .14);border-bottom:1px solid #eef2f7;background:transparent}.model-discovery-dialog__vendor-header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 4px;border:0;background:transparent;cursor:pointer;text-align:left}.model-discovery-dialog__vendor-main{display:flex;align-items:center;gap:14px;min-width:0}.model-discovery-dialog__vendor-logo-shell{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--vendor-accent)}.model-discovery-dialog__vendor-copy{min-width:0;display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.model-discovery-dialog__vendor-name{font-size:15px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__vendor-meta{display:flex;flex-wrap:wrap;gap:10px}.model-discovery-dialog__vendor-meta-pill{color:#64748b;font-size:11px;font-weight:600}.model-discovery-dialog__vendor-spacer{flex:1;min-width:24px;height:1px;background:#edf2f7}.model-discovery-dialog__vendor-side{display:flex;align-items:center;gap:10px;flex:none}.model-discovery-dialog__vendor-selected{display:inline-flex;align-items:center;color:#b45309;font-size:12px;font-weight:700}.model-discovery-dialog__vendor-count{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 10px;border-radius:999px;background:#f8fafc;color:var(--vendor-accent);font-size:13px;font-weight:800}.model-discovery-dialog__vendor-chevron{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:transform .18s ease}.model-discovery-dialog__vendor-chevron--expanded{transform:rotate(180deg)}.model-discovery-dialog__vendor-body{display:flex;flex-direction:column;gap:12px;overflow:visible;padding:2px 4px 16px 40px;background:transparent}.model-discovery-dialog__type-section{display:flex;flex-direction:column;gap:8px}.model-discovery-dialog__type-section-header{display:flex;align-items:center;justify-content:flex-start;gap:6px;padding-left:0}.model-discovery-dialog__type-section-title{font-size:11px;font-weight:700;color:#94a3b8;letter-spacing:.04em}.model-discovery-dialog__type-section-count{display:none}.model-discovery-dialog__model-stack{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:0 18px;padding-left:0}.model-discovery-dialog__item{position:relative;display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid rgba(241,245,249,.9);background:transparent;cursor:pointer;transition:color .18s ease,opacity .18s ease}.model-discovery-dialog__item:hover{color:var(--vendor-accent);opacity:.88}.model-discovery-dialog__item--checked{color:var(--vendor-accent)}.model-discovery-dialog__checkbox{position:absolute;opacity:0;pointer-events:none}.model-discovery-dialog__checkmark{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#fff}.model-discovery-dialog__item--checked .model-discovery-dialog__checkmark{border-color:var(--vendor-accent);background:var(--vendor-accent)}.model-discovery-dialog__item-body{flex:1;min-width:0}.model-discovery-dialog__item-id{font-size:13px;color:var(--md-text);word-break:break-all}.model-discovery-dialog__item-id--checked{font-weight:700}.model-discovery-dialog__footer{display:flex;align-items:center;gap:12px;padding-top:14px;border-top:1px solid rgba(15,23,42,.06)}.model-discovery-dialog__footer-bulk{display:flex;align-items:center;gap:8px;margin-left:auto}.model-discovery-dialog__selection-count{font-size:12px;color:var(--md-muted)}.model-discovery-dialog__actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__button--secondary{background:#e2e8f0;color:#334155}.model-discovery-dialog__button--secondary:hover:not(:disabled){background:#cbd5e1}.model-discovery-dialog__button--primary{background:linear-gradient(135deg,#f59e0b,#f97316);color:#fff}.model-discovery-dialog__button--primary:hover:not(:disabled){transform:translateY(-1px)}@media(max-width:900px){.model-discovery-dialog{width:min(100vw - 16px,100%);height:calc(100vh - 16px);max-height:calc(100vh - 16px);padding:16px}.model-discovery-dialog__toolbar,.model-discovery-dialog__footer,.model-discovery-dialog__vendor-header{flex-direction:column;align-items:stretch}.model-discovery-dialog__vendor-copy{align-items:flex-start}.model-discovery-dialog__vendor-spacer{display:none}.model-discovery-dialog__actions,.model-discovery-dialog__footer-bulk{width:100%}.model-discovery-dialog__actions>*,.model-discovery-dialog__footer-bulk>*{flex:1}.model-discovery-dialog__vendor-side{justify-content:flex-end}.model-discovery-dialog__type-tabs{gap:14px;overflow-x:auto;overflow-y:hidden;padding-bottom:8px;scrollbar-width:none}.model-discovery-dialog__type-tabs::-webkit-scrollbar{display:none}.model-discovery-dialog__type-section{gap:6px}.model-discovery-dialog__model-stack{grid-template-columns:1fr;padding-left:0}.model-discovery-dialog__type-section-header{padding-left:0}}
@@ -0,0 +1,11 @@
1
+ import{bT as hs,r as N,I as ti,_ as ai,aQ as e,bU as di,bV as oi,bW as ys,bX as _s,bY as js,bZ as Es,b_ as ke,b$ as li,c0 as ri,c1 as ws,c2 as ci,c3 as ui,b0 as gi,c4 as U,c5 as Q,c6 as mi,c7 as je,c8 as ve,c9 as X,v as he,ca as oe,x as ee,C as se,F as ie,b8 as Ee,cb as Ni,cc as pe,bd as R,cd as ts,ce as as,cf as ds,aR as fi,cg as we,ch as Ie,ci as ye,cj as T,ck as ne,aW as te,cl as pi,cm as xi,cn as bi,co as vi,cp as hi}from"./index-IZLKDros.js";import{cq as en,cr as sn}from"./index-IZLKDros.js";/**
2
+ * @license lucide-react v0.562.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const yi=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],_i=hs("loader-circle",yi);/**
7
+ * @license lucide-react v0.562.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const ji=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Ei=hs("triangle-alert",ji);function os(i,l){var a=Object.keys(i);if(Object.getOwnPropertySymbols){var g=Object.getOwnPropertySymbols(i);l&&(g=g.filter(function(h){return Object.getOwnPropertyDescriptor(i,h).enumerable})),a.push.apply(a,g)}return a}function ls(i){for(var l=1;l<arguments.length;l++){var a=arguments[l]!=null?arguments[l]:{};l%2?os(Object(a),!0).forEach(function(g){ai(i,g,a[g])}):Object.getOwnPropertyDescriptors?Object.defineProperties(i,Object.getOwnPropertyDescriptors(a)):os(Object(a)).forEach(function(g){Object.defineProperty(i,g,Object.getOwnPropertyDescriptor(a,g))})}return i}var wi={tag:"svg",attrs:{fill:"none",viewBox:"0 0 24 24",width:"1em",height:"1em"},children:[{tag:"path",attrs:{fill:"currentColor",d:"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM23 12C23 18.0751 18.0751 23 12 23C5.92487 23 0.999999 18.0751 1 12C1 5.92487 5.92487 0.999999 12 1C18.0751 1 23 5.92487 23 12ZM11 17.5L11 10H13L13 17.5L11 17.5ZM13 8.5H10.9961L10.9961 6.49609H13L13 8.5Z"}}]},Ds=N.forwardRef(function(i,l){return N.createElement(ti,ls(ls({},i),{},{id:"info-circle",ref:l,icon:wi}))});Ds.displayName="InfoCircleIcon";const rs={all:"全部",image:"图片",video:"视频",audio:"音频",text:"文本"},Di={image:"图片",video:"视频",audio:"音频",text:"文本"},ki={image:"图",video:"视",audio:"音",text:"文"},cs=["text","image","video","audio"];function Vi(i,l){const a=l.trim().toLowerCase();return a?[i.id,i.label,i.shortLabel,i.shortCode,i.description,i.sourceProfileName,ke(i.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(a)):!0}function Ui(i){return ci(i)}function us(i,l){const a=new Map;for(const h of i){const C=a.get(h.vendor)||{vendor:h.vendor,models:[],counts:{image:0,video:0,audio:0,text:0},selectedCount:0};C.models.push(h),C.counts[h.type]+=1,l.has(h.id)&&(C.selectedCount+=1),a.set(h.vendor,C)}const g=new Map(ws.map((h,C)=>[h,C]));return Array.from(a.values()).sort((h,C)=>{const I=g.get(h.vendor)??Number.MAX_SAFE_INTEGER,K=g.get(C.vendor)??Number.MAX_SAFE_INTEGER;return I!==K?I-K:C.models.length-h.models.length})}function qi(i){return["image","video","audio","text"].filter(l=>i.counts[l]>0).map(l=>({type:l,models:Ui(i.models.filter(a=>a.type===l))})).sort((l,a)=>a.models.length!==l.models.length?a.models.length-l.models.length:cs.indexOf(l.type)-cs.indexOf(a.type))}const Mi=({open:i,container:l,models:a,selectedModelIds:g,onClose:h,onConfirm:C})=>{const[I,K]=N.useState(""),[L,F]=N.useState("all"),[z,G]=N.useState(g),[E,$]=N.useState({});N.useEffect(()=>{var V,W;if(!i)return;K(""),F("all"),G(g);const r=new Set(g),_=us(a,r),x=((V=_.find(O=>O.selectedCount>0))==null?void 0:V.vendor)||((W=_[0])==null?void 0:W.vendor)||null,k={};_.forEach(O=>{k[O.vendor]=O.vendor===x}),$(k)},[a,i,g]);const D=N.useMemo(()=>({all:a.length,image:a.filter(r=>r.type==="image").length,video:a.filter(r=>r.type==="video").length,audio:a.filter(r=>r.type==="audio").length,text:a.filter(r=>r.type==="text").length}),[a]),P=N.useMemo(()=>{const r=I.trim(),_=L==="all"?a:a.filter(x=>x.type===L);return r?_.filter(x=>Vi(x,r)):_},[L,a,I]),M=N.useMemo(()=>new Set(z),[z]),A=N.useMemo(()=>us(P,M),[M,P]),xe=z.length,ae=N.useMemo(()=>({image:a.filter(r=>r.type==="image"&&M.has(r.id)).length,video:a.filter(r=>r.type==="video"&&M.has(r.id)).length,text:a.filter(r=>r.type==="text"&&M.has(r.id)).length}),[a,M]),re=P.length>0&&P.every(r=>M.has(r.id));N.useEffect(()=>{A.length===0||A.some(x=>E[x.vendor])||!Object.values(E).some(Boolean)||$(A.reduce((x,k,V)=>(x[k.vendor]=V===0,x),{}))},[E,A]);const be=r=>{G(_=>_.includes(r)?_.filter(x=>x!==r):[..._,r])},J=()=>{const r=P.map(x=>x.id),_=r.every(x=>M.has(x));G(x=>_?x.filter(k=>!r.includes(k)):Array.from(new Set([...x,...r])))},ce=r=>{$(_=>{const x=!_[r],k={};return A.forEach(V=>{k[V.vendor]=V.vendor===r?x:!1}),k})};return e.jsxDEV(di,{open:i,onOpenChange:r=>!r&&h(),children:e.jsxDEV(oi,{className:"model-discovery-dialog",container:l,"data-testid":"model-discovery-dialog",children:[e.jsxDEV("div",{className:"model-discovery-dialog__header",children:[e.jsxDEV("div",{className:"model-discovery-dialog__headline",children:[e.jsxDEV("h3",{className:"model-discovery-dialog__title",children:"获取模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:315,columnNumber:13},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__header-stats",children:[e.jsxDEV("span",{className:"model-discovery-dialog__header-pill",children:["已发现 ",a.length]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:317,columnNumber:15},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__header-pill",children:["品牌 ",A.length]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:320,columnNumber:15},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__header-pill model-discovery-dialog__header-pill--accent",children:["已选 ",xe]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:323,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:316,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:314,columnNumber:11},void 0),e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__close",onClick:h,"aria-label":"关闭",children:e.jsxDEV(ys,{size:18},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:334,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:328,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:313,columnNumber:9},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__toolbar",children:e.jsxDEV("label",{className:"model-discovery-dialog__search",children:[e.jsxDEV(_s,{size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:340,columnNumber:13},void 0),e.jsxDEV("input",{type:"text",value:I,onChange:r=>K(r.target.value),placeholder:"搜索模型名称、ID 或品牌"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:341,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:339,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:338,columnNumber:9},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__type-tabs",children:Object.keys(rs).map(r=>{const _=L===r;return e.jsxDEV("button",{type:"button",className:`model-discovery-dialog__type-tab ${_?"model-discovery-dialog__type-tab--active":""}`,onClick:()=>F(r),children:[e.jsxDEV("span",{children:rs[r]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:362,columnNumber:17},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__type-tab-count",children:D[r]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:363,columnNumber:17},void 0)]},r,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:354,columnNumber:15},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:350,columnNumber:9},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__body",children:A.length===0?e.jsxDEV("div",{className:"model-discovery-dialog__empty",children:I.trim()?"没有匹配的模型":"暂无模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:373,columnNumber:13},void 0):e.jsxDEV("div",{className:"model-discovery-dialog__group-list",children:A.map(r=>{const _=js(r.vendor),x=qi(r),k=!!E[r.vendor];return e.jsxDEV("section",{className:`model-discovery-dialog__vendor-group ${k?"model-discovery-dialog__vendor-group--expanded":""}`,style:{"--vendor-accent":_.accent,"--vendor-surface":_.surface,"--vendor-border":_.border},children:[e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__vendor-header",onClick:()=>ce(r.vendor),children:[e.jsxDEV("div",{className:"model-discovery-dialog__vendor-main",children:[e.jsxDEV("span",{className:"model-discovery-dialog__vendor-logo-shell",children:e.jsxDEV(Es,{vendor:r.vendor,size:22},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:406,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:405,columnNumber:25},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__vendor-copy",children:[e.jsxDEV("span",{className:"model-discovery-dialog__vendor-name",children:ke(r.vendor)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:409,columnNumber:27},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__vendor-meta",children:x.map(({type:V,models:W})=>e.jsxDEV("span",{className:"model-discovery-dialog__vendor-meta-pill",children:[ki[V]," ",W.length]},`${r.vendor}-${V}`,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:415,columnNumber:33},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:412,columnNumber:27},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:408,columnNumber:25},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:404,columnNumber:23},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__vendor-spacer"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:427,columnNumber:23},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__vendor-side",children:[r.selectedCount>0?e.jsxDEV("span",{className:"model-discovery-dialog__vendor-selected",children:["已选 ",r.selectedCount]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:431,columnNumber:27},void 0):null,e.jsxDEV("span",{className:"model-discovery-dialog__vendor-count",children:r.models.length},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:435,columnNumber:25},void 0),e.jsxDEV("span",{className:`model-discovery-dialog__vendor-chevron ${k?"model-discovery-dialog__vendor-chevron--expanded":""}`,children:e.jsxDEV(li,{size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:445,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:438,columnNumber:25},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:429,columnNumber:23},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:399,columnNumber:21},void 0),k?e.jsxDEV("div",{className:"model-discovery-dialog__vendor-body",children:x.map(({type:V,models:W})=>e.jsxDEV("div",{className:"model-discovery-dialog__type-section",children:[e.jsxDEV("div",{className:"model-discovery-dialog__type-section-header",children:[e.jsxDEV("span",{className:"model-discovery-dialog__type-section-title",children:Di[V]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:458,columnNumber:31},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__type-section-count",children:W.length},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:461,columnNumber:31},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:457,columnNumber:29},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__model-stack",children:W.map(O=>{const H=M.has(O.id);return e.jsxDEV("label",{className:`model-discovery-dialog__item ${H?"model-discovery-dialog__item--checked":""}`,children:[e.jsxDEV("input",{type:"checkbox",className:"model-discovery-dialog__checkbox",checked:H,onChange:()=>be(O.id)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:479,columnNumber:37},void 0),e.jsxDEV("span",{className:"model-discovery-dialog__checkmark",children:H?e.jsxDEV(ri,{size:12},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:486,columnNumber:50},void 0):null},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:485,columnNumber:37},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__item-body",children:e.jsxDEV("div",{className:`model-discovery-dialog__item-id ${H?"model-discovery-dialog__item-id--checked":""}`,children:O.id},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:490,columnNumber:39},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:489,columnNumber:37},void 0)]},O.id,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:471,columnNumber:35},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:466,columnNumber:29},void 0)]},`${r.vendor}-${V}`,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:453,columnNumber:27},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:451,columnNumber:23},void 0):null]},r.vendor,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:384,columnNumber:19},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:377,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:371,columnNumber:9},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__footer",children:[e.jsxDEV("span",{className:"model-discovery-dialog__selection-count",children:["已选 ",xe," 个 · 图 ",ae.image," / 视"," ",ae.video," / 文 ",ae.text]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:516,columnNumber:11},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__footer-bulk",children:[e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:J,disabled:P.length===0,children:re?"取消全选":"全选"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:521,columnNumber:13},void 0),e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__ghost-button model-discovery-dialog__ghost-button--muted",onClick:()=>G([]),disabled:z.length===0,children:"清空"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:529,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:520,columnNumber:11},void 0),e.jsxDEV("div",{className:"model-discovery-dialog__actions",children:[e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--secondary",onClick:h,children:"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:539,columnNumber:13},void 0),e.jsxDEV("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--primary",onClick:()=>C(z),children:"添加模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:546,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:538,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:515,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:308,columnNumber:7},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/model-discovery-dialog.tsx",lineNumber:307,columnNumber:5},void 0)},gs="aitu:settings:provider-nav",Si=[{value:"providers",label:"供应商"},{value:"presets",label:"模型预设"},{value:"canvas",label:"画布显示"}],Ci=["openai-compatible","gemini-compatible","custom"],Pi=["bearer","header","query","custom"],Ii={image:"图片",video:"视频",audio:"音频",text:"文本"},Ai={image:"图片模型",video:"视频模型",audio:"音频模型",text:"文本模型"},Oi=["text","image","video","audio"],Ae={"openai-compatible":{label:"OpenAI 兼容"},"gemini-compatible":{label:"Gemini 兼容"},custom:{label:"自定义接入"}},Ri={bearer:{label:"Bearer Token"},header:{label:"自定义 Header"},query:{label:"Query 参数"},custom:{label:"手动拼装"}},ms=["amber","sky","mint","rose","violet"];function Ns(i){return i.reduce((l,a)=>(l[a.type]+=1,l),{image:0,video:0,audio:0,text:0})}function Ti(i,l){const a=l.trim().toLowerCase();return a?[i.id,i.label,i.shortLabel,i.shortCode,i.description,i.sourceProfileName,ke(i.vendor)].filter(Boolean).some(g=>g==null?void 0:g.toLowerCase().includes(a)):!0}function fs(i){return i?["image","video","audio","text"].filter(l=>!!T(i[l])).length:0}function Li(i,l){const a=l.find(g=>g.id===i.id);return a?Zi(a,i)?"saved":"dirty":"new"}function De(i){return JSON.stringify(i)}function zi(i){return typeof i.iconUrl!="string"?null:i.iconUrl.trim()||null}function $i(i){var g;const l=i.trim();if(!l)return"供";const a=l.match(/[A-Za-z0-9]+/g);return a!=null&&a[0]?a[0][0].toUpperCase():((g=Array.from(l)[0])==null?void 0:g.toUpperCase())||"供"}function Bi(i){const l=Array.from(`${i.id}-${i.providerType}-${i.name}`).reduce((a,g,h)=>a+g.charCodeAt(0)*(h+1),0);return ms[l%ms.length]}function le(i){return JSON.parse(JSON.stringify(i))}function ks(i){return`${i}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function ps(i){return{id:ks("profile"),name:`供应商 ${i}`,iconUrl:"",providerType:"openai-compatible",baseUrl:"",apiKey:"",authType:Oe(),enabled:!0,capabilities:{supportsModelsEndpoint:!0,supportsText:!0,supportsImage:!0,supportsVideo:!0,supportsAudio:!0,supportsTools:!0}}}function Ki(){if(typeof window>"u")return null;const i=window.__aituPendingProviderNavigationIntent||null;return window.__aituPendingProviderNavigationIntent=void 0,i}function Oe(i){return"bearer"}function xs(i){return i===U||i===vi}const bs=({profile:i,size:l="regular"})=>{const a=zi(i),[g,h]=N.useState(a);N.useEffect(()=>{h(a)},[a]);const C=Bi(i),I=$i(i.name);return e.jsxDEV("span",{className:`settings-dialog__provider-avatar settings-dialog__provider-avatar--${C} ${l==="large"?"settings-dialog__provider-avatar--large":""}`,"aria-hidden":"true",children:g?e.jsxDEV("img",{src:g,alt:`${i.name} 图标`,className:"settings-dialog__provider-avatar-image",loading:"lazy",onError:()=>h(null)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:341,columnNumber:9},void 0):e.jsxDEV("span",{className:"settings-dialog__provider-avatar-text",children:I},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:349,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:334,columnNumber:5},void 0)};function Fi(i,l){return{id:ks("preset"),name:"新预设",text:ne(te(i,l.text||null)),image:ne(te(i,l.image||null)),video:ne(te(i,l.video||null)),audio:ne(te(i,l.audio||null))}}function Gi(i,l,a){const g=i[l],h=a.defaultModelRef!==void 0?a.defaultModelRef:te(a.profileId!==void 0?a.profileId:ye(g),a.defaultModelId!==void 0?a.defaultModelId:T(g));return{...i,[l]:ne(h)}}function Wi(i,l){const a={...i};return["image","video","audio","text"].forEach(g=>{ye(a[g])===l&&(a[g]=ne(null))}),a}function Zi(i,l){return JSON.stringify(i)===JSON.stringify(l)}function vs(i,l){return JSON.stringify({profileId:i,modelId:l})}function Yi(i){if(!i)return null;try{const l=JSON.parse(i);return te(l.profileId||null,l.modelId||null)}catch{return null}}const Qi=({container:i})=>{const{appState:l,setAppState:a}=ui(),{isMobile:g,viewportWidth:h,viewportHeight:C}=gi(),[I,K]=N.useState("providers"),[L,F]=N.useState(U),[z,G]=N.useState(Q),[E,$]=N.useState([]),[D,P]=N.useState([]),[M,A]=N.useState(Q),[xe,ae]=N.useState([]),[re,be]=N.useState(""),[J,ce]=N.useState(""),[r,_]=N.useState(""),[x,k]=N.useState(""),[V,W]=N.useState(!0),[O,H]=N.useState(""),[Re,_e]=N.useState(!1),[Vs,Ve]=N.useState(""),[Te,Le]=N.useState(!1),[Us,de]=N.useState("catalog"),[qs,ue]=N.useState("catalog"),m=E.find(s=>s.id===L)||E[0]||null,q=D.find(s=>s.id===z)||D[0]||null,B=mi((m==null?void 0:m.id)||U),Ms=N.useDeferredValue(O),ze=je(U,"image"),Ss=je(U,"audio"),$e=je(U,"video"),Be=je(U,"text"),Cs=E.filter(s=>s.enabled),b=g||h<=980,Ue=!!m&&!!m.apiKey.trim(),Ps=De({profiles:E,presets:D,activePresetId:M,audioModelName:re,imageModelName:J,videoModelName:r,textModelName:x,showWorkZoneCard:V}),Ke=l.openSettings&&Ps!==Vs,Is=s=>{K(s),b&&(s==="providers"&&de("catalog"),s==="presets"&&ue("catalog"))},As=s=>{F(s),b&&de("detail")},Os=s=>{G(s),b&&ue("detail")},Rs=()=>{try{return localStorage.getItem(Ee.WORKZONE_CARD_VISIBLE)!=="false"}catch{return!0}},qe=()=>{const s=le(ve.get()),n=le(X.get()),o=X.getActivePresetId()||Q,d=he.get(),t=Rs();ae(s),Ve(De({profiles:s,presets:n,activePresetId:o,audioModelName:d.audioModelName||oe(),imageModelName:d.imageModelName||ee(),videoModelName:d.videoModelName||se(),textModelName:d.textModelName||ie(),showWorkZoneCard:t}))};N.useEffect(()=>{var p;if(!l.openSettings)return;const s=le(ve.get()),n=le(X.get()),o=X.getActivePresetId()||Q,d=he.get();let t=!0;const c=Ki(),v=(c==null?void 0:c.action)==="select"&&s.some(f=>f.id===c.profileId)?c.profileId:((p=s[0])==null?void 0:p.id)||U;$(s),P(n),ae(s),A(o),F(f=>{var j;return c?v:s.some(w=>w.id===f)?f:((j=s[0])==null?void 0:j.id)||U}),G(f=>{var j;return n.some(w=>w.id===f)?f:((j=n[0])==null?void 0:j.id)||Q}),be(d.audioModelName||oe()),ce(d.imageModelName||ee()),_(d.videoModelName||se()),k(d.textModelName||ie());try{t=localStorage.getItem(Ee.WORKZONE_CARD_VISIBLE)!=="false"}catch{t=!0}W(t),K("providers"),de(c&&b?"detail":"catalog"),ue("catalog"),H(""),_e(!1),Ve(De({profiles:s,presets:n,activePresetId:o,audioModelName:d.audioModelName||oe(),imageModelName:d.imageModelName||ee(),videoModelName:d.videoModelName||se(),textModelName:d.textModelName||ie(),showWorkZoneCard:t})),(c==null?void 0:c.action)==="create"&&Ge(c,s)},[l.openSettings]),N.useEffect(()=>{if(!L&&E[0]){F(E[0].id);return}L&&E.length>0&&!E.some(s=>s.id===L)&&F(E[0].id)},[E,L]),N.useEffect(()=>{if(!z&&D[0]){G(D[0].id);return}z&&D.length>0&&!D.some(s=>s.id===z)&&G(D[0].id)},[D,z]),N.useEffect(()=>{H("")},[L,I]);const ge=(s,n)=>{$(o=>o.map(d=>d.id===s?n(d):d))},Ts=(s,n)=>{P(o=>o.map(d=>d.id===s?n(d):d))},Fe=async(s,n)=>{var o,d;try{const t=he.get(),c=((o=s.find(u=>u.id===n))==null?void 0:o.id)||((d=s[0])==null?void 0:d.id)||Q,v=s.find(u=>u.id===c)||s[0]||null,p=T(v==null?void 0:v.audio)||t.audioModelName||oe(),f=T(v==null?void 0:v.image)||t.imageModelName||ee(),j=T(v==null?void 0:v.video)||t.videoModelName||se(),w=T(v==null?void 0:v.text)||t.textModelName||t.chatModel||ie();return await X.update(le(s)),await X.setActivePresetId(c),await he.update({audioModelName:p,imageModelName:f,videoModelName:j,textModelName:w,chatModel:w}),P(s),A(c),be(p),ce(f),_(j),k(w),qe(),!0}catch(t){return console.error("Failed to persist preset configuration:",t),R.error("预设保存失败,请重试"),!1}},Ls=async(s,n)=>{if($(o=>o.map(d=>d.id===s?{...d,enabled:n}:d)),!!xe.some(o=>o.id===s))try{await ve.update(le(ve.get()).map(o=>o.id===s?{...o,enabled:n}:o)),qe()}catch(o){console.error("Failed to persist provider enabled state:",o),$(d=>d.map(t=>t.id===s?{...t,enabled:!n}:t)),R.error("供应商状态保存失败,请重试")}},zs=async s=>{W(s);try{localStorage.setItem(Ee.WORKZONE_CARD_VISIBLE,String(s)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed")),qe()}catch(n){console.error("Failed to persist canvas visibility state:",n),W(!s),R.error("画布显示配置保存失败,请重试")}},Ge=(s,n)=>{var c;const o=n||E;if(K("providers"),b&&de("detail"),s.action==="select"){const v=o.some(p=>p.id===s.profileId)?s.profileId:((c=o[o.length-1])==null?void 0:c.id)||U;return F(v),o}const d=ps(o.length+1),t=[...o,d];return $(t),F(d.id),t},We=()=>{const s=ps(E.length+1);$(n=>[...n,s]),F(s.id),K("providers"),b&&de("detail")};N.useEffect(()=>{if(!l.openSettings)return;const s=n=>{const o=n.detail;o&&Ge(o)};return window.addEventListener(gs,s),()=>{window.removeEventListener(gs,s)}},[l.openSettings,b,E]);const $s=s=>{var o;if(xs(s))return;const n=E.filter(d=>d.id!==s);$(n),P(d=>d.map(t=>Wi(t,s))),L===s&&F(((o=n[0])==null?void 0:o.id)||U),b&&de("catalog")},Ze=()=>{var o;const s=((o=Cs[0])==null?void 0:o.id)||null,n=Fi(s,{audio:re||oe(),image:J||ee(),video:r||se(),text:x||ie()});P(d=>[...d,n]),G(n.id),K("presets"),b&&ue("detail")},Bs=s=>{var o,d;if(D.length<=1)return;const n=D.filter(t=>t.id!==s);P(n),M===s&&A(((o=n[0])==null?void 0:o.id)||Q),z===s&&G(((d=n[0])==null?void 0:d.id)||Q),b&&ue("catalog")},Ks=(s,n)=>{if(!q)return;const o=Yi(n),d=D.map(t=>t.id===q.id?Gi(t,s,{defaultModelRef:o}):t);P(d),Fe(d,M)},Fs=async()=>{if(!m){R.warning("请先选择供应商配置");return}if(Ke){const o=R.loading("正在保存当前配置...",0),d=await He(!1);if(R.close(o),!d)return}const s=m.apiKey.trim(),n=Ie(m.baseUrl.trim()||we);if(!s){R.warning("请先填写 API Key");return}try{await pe.discover(m.id,n,s),_e(!0)}catch(o){const d=o instanceof Error?o.message:"模型同步失败";pe.setError(m.id,d),R.error({content:d,duration:3600})}},Gs=s=>{var o,d,t;if(!m)return;const n=pe.applySelection(m.id,s);if(m.id===U){const c=n.filter(u=>u.type==="image"),v=n.filter(u=>u.type==="video"),p=n.filter(u=>u.type==="text"),f=B.discoveredModels.filter(u=>u.type==="image").map(u=>u.id),j=B.discoveredModels.filter(u=>u.type==="video").map(u=>u.id),w=B.discoveredModels.filter(u=>u.type==="text").map(u=>u.id);!c.some(u=>u.id===J)&&f.includes(J)&&ce(((o=c[0])==null?void 0:o.id)||ee()),!v.some(u=>u.id===r)&&j.includes(r)&&_(((d=v[0])==null?void 0:d.id)||se()),!p.some(u=>u.id===x)&&w.includes(x)&&k(((t=p[0])==null?void 0:t.id)||ie())}R.success(n.length>0?`已为 ${m.name} 添加 ${n.length} 个模型`:`已清空 ${m.name} 的已添加模型`),_e(!1)},Ye=()=>{a(s=>({...s,openSettings:!1}))},He=async(s=!1)=>{var n,o,d,t,c,v;if(Te)return!1;Le(!0);try{const p=E.map(y=>{var fe;const Ne=y.baseUrl.trim()?Ie(y.baseUrl):"";return{...y,name:y.name.trim()||"未命名供应商",iconUrl:((fe=y.iconUrl)==null?void 0:fe.trim())||void 0,baseUrl:Ne,apiKey:y.apiKey.trim()}}),f=new Set(p.map(y=>y.id)),j=D.map(y=>{const Ne={...y,name:y.name.trim()||"未命名预设",audio:{...y.audio},image:{...y.image},video:{...y.video},text:{...y.text}};return["image","video","audio","text"].forEach(fe=>{const is=Ne[fe],Pe=ye(is),ns=T(is);if(Pe&&!f.has(Pe)){Ne[fe]=ne(te(null,ns));return}Ne[fe]=ne(te(Pe,ns))}),Ne}),w=((n=j.find(y=>y.id===M))==null?void 0:n.id)||((o=j[0])==null?void 0:o.id)||Q,u=j.find(y=>y.id===w)||j[0]||null,S=p.find(y=>y.id===U)||p[0],Z=Ie((S==null?void 0:S.baseUrl)||we),Y=re.trim()||((d=Ss[0])==null?void 0:d.id)||oe(),me=J.trim()||((t=ze[0])==null?void 0:t.id)||ee(),Se=r.trim()||((c=$e[0])==null?void 0:c.id)||se(),Ce=x.trim()||((v=Be[0])==null?void 0:v.id)||ie(),ei=T(u==null?void 0:u.image)||me,si=T(u==null?void 0:u.video)||Se,ii=T(u==null?void 0:u.audio)||Y,ni=T(u==null?void 0:u.text)||Ce;p.forEach(y=>{pe.invalidateIfConfigChanged(y.id,y.baseUrl||we,y.apiKey||"")}),await he.update({apiKey:(S==null?void 0:S.apiKey)||"",baseUrl:Z,audioModelName:ii,imageModelName:ei,videoModelName:si,textModelName:ni}),await ve.update(p),await pi.update(pe.getCatalogs().filter(y=>f.has(y.profileId))),await X.update(j),await X.setActivePresetId(w);try{localStorage.setItem(Ee.WORKZONE_CARD_VISIBLE,String(V)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed"))}catch{}return $(p),ae(le(p)),P(j),A(w),be(Y),ce(me),_(Se),k(Ce),Ve(De({profiles:p,presets:j,activePresetId:w,audioModelName:Y,imageModelName:me,videoModelName:Se,textModelName:Ce,showWorkZoneCard:V})),s&&Ye(),!0}catch(p){return console.error("Failed to persist settings drafts:",p),R.error("设置保存失败,请稍后重试"),!1}finally{Le(!1)}},Ws=()=>{if(!Ke){Ye();return}(async()=>{const s=R.loading("正在保存设置...",0),n=await He(!0);R.close(s),n||R.warning("设置尚未保存,请检查后重试")})()},Zs=()=>{Re||Te||Ws()},Qe=()=>e.jsxDEV("div",{className:"settings-dialog__sidebar-shell settings-dialog__sidebar-shell--catalog",children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsxDEV("span",{className:"settings-dialog__sidebar-summary-title",children:"供应商目录"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1279,columnNumber:11},void 0),b?e.jsxDEV("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:We,children:"新增供应商"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1283,columnNumber:13},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1278,columnNumber:9},void 0),b?e.jsxDEV("span",{className:"settings-dialog__sidebar-summary-text",children:"先从列表里选择供应商,再进入对应的配置页面。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1293,columnNumber:11},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1277,columnNumber:7},void 0),e.jsxDEV("div",{className:"settings-dialog__sidebar-list",children:E.map(s=>{const n=s.id===(m==null?void 0:m.id);return e.jsxDEV("div",{className:`settings-dialog__provider-row ${n?"settings-dialog__provider-row--active":""} ${s.enabled?"":"settings-dialog__provider-row--disabled"}`,children:[e.jsxDEV("button",{type:"button",className:"settings-dialog__provider-select",onClick:()=>As(s.id),"aria-pressed":n,children:[e.jsxDEV("span",{className:"settings-dialog__provider-select-main",children:[e.jsxDEV(bs,{profile:s},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1319,columnNumber:19},void 0),e.jsxDEV("span",{className:"settings-dialog__provider-copy",children:[e.jsxDEV("span",{className:"settings-dialog__provider-name-row",children:[e.jsxDEV("span",{className:"settings-dialog__provider-name",children:s.name},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1322,columnNumber:23},void 0),s.id===U?e.jsxDEV("span",{className:"settings-dialog__provider-tag",children:"默认"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1326,columnNumber:25},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1321,columnNumber:21},void 0),b?e.jsxDEV("span",{className:"settings-dialog__provider-meta",children:[e.jsxDEV("span",{children:Ae[s.providerType].label},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1333,columnNumber:25},void 0),e.jsxDEV("span",{children:s.enabled?"启用":"停用"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1336,columnNumber:25},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1332,columnNumber:23},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1320,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1318,columnNumber:17},void 0),b?e.jsxDEV(ds,{size:16,className:"settings-dialog__provider-arrow","aria-hidden":"true"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1342,columnNumber:19},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1312,columnNumber:15},void 0),e.jsxDEV("div",{className:"settings-dialog__provider-switch",children:[e.jsxDEV("span",{className:"settings-dialog__provider-switch-copy",children:s.enabled?"启用":"停用"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1351,columnNumber:17},void 0),e.jsxDEV(ts,{size:"small",value:s.enabled,disabled:s.id===U,onChange:o=>void Ls(s.id,o)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1354,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1350,columnNumber:15},void 0)]},s.id,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1304,columnNumber:13},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1299,columnNumber:7},void 0),b?null:e.jsxDEV("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:We,children:[e.jsxDEV("span",{className:"settings-dialog__sidebar-add-icon",children:"+"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1377,columnNumber:11},void 0),e.jsxDEV("span",{children:"新增供应商"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1378,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1372,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1276,columnNumber:5},void 0),Je=()=>e.jsxDEV("div",{className:"settings-dialog__sidebar-shell",children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsxDEV("span",{className:"settings-dialog__sidebar-summary-title",children:"默认模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1388,columnNumber:11},void 0),b?e.jsxDEV("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:Ze,children:"新增预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1392,columnNumber:13},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1387,columnNumber:9},void 0),b?e.jsxDEV("span",{className:"settings-dialog__sidebar-summary-text",children:"先选中一个预设,再进入详情页调整默认路由。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1402,columnNumber:11},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1386,columnNumber:7},void 0),e.jsxDEV("div",{className:"settings-dialog__sidebar-list",children:D.map(s=>{const n=s.id===(q==null?void 0:q.id),o=s.id===M,d=fs(s);return e.jsxDEV("button",{type:"button",className:`settings-dialog__sidebar-item ${n?"settings-dialog__sidebar-item--active":""}`,onClick:()=>Os(s.id),children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-item-head",children:[e.jsxDEV("div",{className:"settings-dialog__sidebar-item-top",children:[e.jsxDEV("span",{children:s.name},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1425,columnNumber:19},void 0),o?e.jsxDEV("span",{className:"settings-dialog__sidebar-badge settings-dialog__sidebar-badge--accent",children:"当前"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1427,columnNumber:21},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1424,columnNumber:17},void 0),b?e.jsxDEV(ds,{size:16,className:"settings-dialog__sidebar-item-arrow","aria-hidden":"true"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1433,columnNumber:19},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1423,columnNumber:15},void 0),e.jsxDEV("div",{className:"settings-dialog__sidebar-item-meta",children:[e.jsxDEV("span",{children:[d,"/3 已配置"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1442,columnNumber:17},void 0),b?e.jsxDEV("span",{children:o?"正在生效":"点击查看详情"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1444,columnNumber:19},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1441,columnNumber:15},void 0)]},s.id,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1415,columnNumber:13},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1408,columnNumber:7},void 0),b?null:e.jsxDEV("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:Ze,children:[e.jsxDEV("span",{className:"settings-dialog__sidebar-add-icon",children:"+"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1458,columnNumber:11},void 0),e.jsxDEV("span",{children:"新增预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1459,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1453,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1385,columnNumber:5},void 0),Xe=(s,n)=>e.jsxDEV("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsxDEV("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--compact",children:e.jsxDEV("div",{className:"settings-dialog__mobile-stage",children:n},s,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1468,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1467,columnNumber:7},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1466,columnNumber:5},void 0),es=(s=!1)=>{if(!m)return e.jsxDEV("div",{className:"settings-dialog__empty-panel",children:"请选择一个供应商。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1478,columnNumber:9},void 0);const n=Ns(B.models),o=Li(m,xe),d=n.image+n.video+n.text;return e.jsxDEV("div",{className:`settings-dialog__content-panel settings-dialog__content-panel--providers ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxDEV("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxDEV("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>de("catalog"),children:[e.jsxDEV(as,{size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1501,columnNumber:15},void 0),e.jsxDEV("span",{children:"返回供应商目录"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1502,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1496,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsxDEV("span",{className:"settings-dialog__compact-stage-eyebrow",children:"供应商配置"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1505,columnNumber:15},void 0),e.jsxDEV("p",{className:"settings-dialog__compact-stage-text",children:"进入详情后再编辑接口信息、密钥和模型同步配置。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1508,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1504,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1495,columnNumber:11},void 0):null,e.jsxDEV("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxDEV("div",{className:"settings-dialog__panel-header",children:[e.jsxDEV("div",{className:"settings-dialog__profile-hero",children:[e.jsxDEV(bs,{profile:m,size:"large"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1517,columnNumber:15},void 0),e.jsxDEV("div",{children:[e.jsxDEV("h3",{className:"settings-dialog__section-title",children:m.name},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1519,columnNumber:17},void 0),e.jsxDEV("div",{className:"settings-dialog__inline-meta",children:[e.jsxDEV("span",{children:Ae[m.providerType].label},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1523,columnNumber:19},void 0),e.jsxDEV("span",{children:m.enabled?"启用":"停用"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1526,columnNumber:19},void 0),e.jsxDEV("span",{children:[d," 个模型"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1527,columnNumber:19},void 0),e.jsxDEV("span",{children:o==="saved"?"已保存":"未保存"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1528,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1522,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1518,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1516,columnNumber:13},void 0),xs(m.id)?null:e.jsxDEV("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>$s(m.id),children:"删除"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1533,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1515,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1514,columnNumber:9},void 0),e.jsxDEV("div",{className:"settings-dialog__section",children:[e.jsxDEV("div",{className:"settings-dialog__section-header",children:e.jsxDEV("div",{children:e.jsxDEV("h3",{className:"settings-dialog__section-title",children:"基础配置"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1547,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1546,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1545,columnNumber:11},void 0),e.jsxDEV("div",{className:"settings-dialog__grid",children:[e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"名称"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1553,columnNumber:15},void 0),e.jsxDEV("input",{type:"text",className:"settings-dialog__input",value:m.name,onChange:t=>ge(m.id,c=>({...c,name:t.target.value}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1556,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1552,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"接口类型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1570,columnNumber:15},void 0),e.jsxDEV("select",{className:"settings-dialog__select",value:m.providerType,onChange:t=>ge(m.id,c=>{const v=t.target.value,p=Oe(c.providerType),f=Oe();return{...c,providerType:v,authType:c.authType===p?f:c.authType}}),children:Ci.map(t=>e.jsxDEV("option",{value:t,children:Ae[t].label},t,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1598,columnNumber:19},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1573,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1569,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图标 URL"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1606,columnNumber:15},void 0),e.jsxDEV("input",{type:"url",className:"settings-dialog__input",value:m.iconUrl||"",onChange:t=>ge(m.id,c=>({...c,iconUrl:t.target.value})),placeholder:"可选,留空时自动生成默认图标"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1609,columnNumber:15},void 0),e.jsxDEV("span",{className:"settings-dialog__field-hint",children:"支持填写远程图片地址;未填写时将根据供应商名称生成默认图标。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1621,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1605,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxDEV("div",{className:"settings-dialog__label-with-tooltip settings-dialog__label-with-tooltip--left",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API Key"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1628,columnNumber:17},void 0),e.jsxDEV(fi,{content:e.jsxDEV("div",{children:["您可以从以下地址获取 API Key:",e.jsxDEV("br",{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1635,columnNumber:23},void 0),e.jsxDEV("a",{href:"https://api.tu-zi.com/token",target:"_blank",rel:"noopener noreferrer",style:{color:"#F39C12",textDecoration:"none"},children:"api.tu-zi.com/token"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1636,columnNumber:23},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1633,columnNumber:21},void 0),placement:"top",theme:"light",showArrow:!1,children:e.jsxDEV(Ds,{className:"settings-dialog__tooltip-icon"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1650,columnNumber:19},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1631,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1627,columnNumber:15},void 0),e.jsxDEV("input",{type:"password",className:"settings-dialog__input",value:m.apiKey,onChange:t=>ge(m.id,c=>({...c,apiKey:t.target.value})),autoComplete:"off"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1653,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1626,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API 地址"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1668,columnNumber:15},void 0),e.jsxDEV("input",{type:"text",className:"settings-dialog__input",value:m.baseUrl,onChange:t=>ge(m.id,c=>({...c,baseUrl:t.target.value})),placeholder:we},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1671,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1667,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"鉴权方式"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1686,columnNumber:15},void 0),e.jsxDEV("select",{className:"settings-dialog__select",value:m.authType,onChange:t=>ge(m.id,c=>({...c,authType:t.target.value})),children:Pi.map(t=>e.jsxDEV("option",{value:t,children:Ri[t].label},t,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1700,columnNumber:19},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1689,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1685,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1551,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1544,columnNumber:9},void 0),m.id===U?e.jsxDEV("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxDEV("div",{className:"settings-dialog__compat-card",children:[e.jsxDEV("div",{className:"settings-dialog__compat-title",children:"兼容默认模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1712,columnNumber:15},void 0),e.jsxDEV("div",{className:"settings-dialog__compat-meta",children:[e.jsxDEV("span",{children:["图片:",J||ee()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1714,columnNumber:17},void 0),e.jsxDEV("span",{children:["视频:",r||se()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1715,columnNumber:17},void 0),e.jsxDEV("span",{children:["音频:",re||oe()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1716,columnNumber:17},void 0),e.jsxDEV("span",{children:["文本:",x||ie()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1717,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1713,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1711,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1710,columnNumber:11},void 0):null,Ys()]},s?`provider-detail-${m.id}`:void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1488,columnNumber:7},void 0)},Ys=()=>{const n=(m==null?void 0:m.id)===U?[...xi,...B.models]:B.models,o=new Map(ws.map((u,S)=>[u,S])),d=Ms.trim(),t=Ns(n),c=n.filter(u=>Ti(u,d)),v=Oi.map(u=>({type:u,models:c.filter(S=>S.type===u).sort((S,Z)=>{const Y=o.get(S.vendor)??Number.MAX_SAFE_INTEGER,me=o.get(Z.vendor)??Number.MAX_SAFE_INTEGER;return Y!==me?Y-me:bi(S,Z)})})).filter(u=>u.models.length>0),p=Ue||n.length>0,f=n.length>0&&c.length===0&&!!d,j=B.status==="error"&&n.length===0,w=!Ue&&n.length===0;return e.jsxDEV("div",{className:"settings-dialog__section",children:[e.jsxDEV("div",{className:"settings-dialog__section-header",children:e.jsxDEV("div",{children:[e.jsxDEV("h3",{className:"settings-dialog__section-title",children:"模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1774,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__inline-meta",children:[e.jsxDEV("span",{children:["已添加 ",n.length," 个"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1776,columnNumber:15},void 0),e.jsxDEV("span",{children:["图 ",t.image]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1777,columnNumber:15},void 0),e.jsxDEV("span",{children:["视 ",t.video]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1778,columnNumber:15},void 0),e.jsxDEV("span",{children:["音 ",t.audio]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1779,columnNumber:15},void 0),e.jsxDEV("span",{children:["文 ",t.text]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1780,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1775,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1773,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1772,columnNumber:9},void 0),p?e.jsxDEV("div",{className:"settings-dialog__model-toolbar",children:[e.jsxDEV("label",{className:`settings-dialog__model-search ${n.length===0?"settings-dialog__model-search--disabled":""}`,children:[e.jsxDEV(_s,{size:15},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1794,columnNumber:15},void 0),e.jsxDEV("input",{type:"text",value:O,onChange:u=>H(u.target.value),placeholder:n.length>0?"搜索模型 ID、名称或品牌":"获取模型后可搜索",disabled:n.length===0},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1795,columnNumber:15},void 0),O?e.jsxDEV("button",{type:"button",className:"settings-dialog__model-search-clear",onClick:()=>H(""),"aria-label":"清空搜索",children:e.jsxDEV(ys,{size:14},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1813,columnNumber:19},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1807,columnNumber:17},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1787,columnNumber:13},void 0),e.jsxDEV("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",onClick:Fs,disabled:!Ue||B.status==="loading",children:B.status==="loading"?e.jsxDEV(e.Fragment,{children:[e.jsxDEV(_i,{size:15,className:"settings-dialog__button-spinner"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1825,columnNumber:19},void 0),"同步中"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1824,columnNumber:17},void 0):"获取模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1817,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1786,columnNumber:11},void 0):null,v.length>0?e.jsxDEV("div",{className:"settings-dialog__model-type-groups",children:v.map(({type:u,models:S})=>e.jsxDEV("div",{className:"settings-dialog__model-type-group",children:[e.jsxDEV("div",{className:"settings-dialog__model-type-header",children:[e.jsxDEV("span",{className:"settings-dialog__model-type-title",children:Ai[u]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1843,columnNumber:19},void 0),e.jsxDEV("span",{className:"settings-dialog__model-type-count",children:S.length},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1846,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1842,columnNumber:17},void 0),e.jsxDEV("div",{className:"settings-dialog__model-type-list",children:S.map(Z=>{const Y=js(Z.vendor);return e.jsxDEV("div",{className:"settings-dialog__model-type-item",style:{"--model-brand-accent":Y.accent,"--model-brand-surface":Y.surface,"--model-brand-border":Y.border},children:[e.jsxDEV("span",{className:"settings-dialog__model-type-item-logo",children:e.jsxDEV(Es,{vendor:Z.vendor,size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1867,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1866,columnNumber:25},void 0),e.jsxDEV("div",{className:"settings-dialog__model-type-item-copy",children:[e.jsxDEV("span",{className:"settings-dialog__model-type-item-id",children:Z.id},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1870,columnNumber:27},void 0),e.jsxDEV("span",{className:"settings-dialog__model-type-item-vendor",children:ke(Z.vendor)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1873,columnNumber:27},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1869,columnNumber:25},void 0)]},Z.id,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1855,columnNumber:23},void 0)})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1850,columnNumber:17},void 0)]},u,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1841,columnNumber:15},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1839,columnNumber:11},void 0):f?e.jsxDEV("div",{className:"settings-dialog__model-empty",children:"没有匹配的模型,试试搜索品牌名或更完整的模型 ID。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1885,columnNumber:11},void 0):j?e.jsxDEV("div",{className:"settings-dialog__model-empty settings-dialog__model-empty--error",children:[e.jsxDEV(Ei,{size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1890,columnNumber:13},void 0),e.jsxDEV("span",{children:B.error||"模型获取失败,请稍后重试"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1891,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1889,columnNumber:11},void 0):w?e.jsxDEV("div",{className:"settings-dialog__model-empty",children:"填写 API Key 后即可获取模型,获取完成后可在这里检索和浏览。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1894,columnNumber:11},void 0):e.jsxDEV("div",{className:"settings-dialog__model-empty",children:"还没有已添加的模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1898,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1771,columnNumber:7},void 0)},Hs=(s,n,o)=>{const d=ye(o),t=T(o);return E.filter(c=>c.id===d||c.enabled&&c.capabilities[n]).map(c=>{const p=(c.id===U?s==="image"?ze:s==="video"?$e:Be:pe.getState(c.id).models.filter(f=>f.type===s)).filter((f,j,w)=>w.findIndex(u=>u.id===f.id)===j);return c.id===d&&t&&!p.some(f=>f.id===t)&&p.unshift({id:t,label:t,shortLabel:t,type:s,vendor:hi.OTHER}),{profile:c,models:p}}).filter(c=>c.models.length>0)},Me=(s,n,o)=>{var p;const d=Hs(s,o,n),t=ye(n),c=T(n),v=((p=E.find(f=>f.id===t))==null?void 0:p.name)||"未配置";return e.jsxDEV("div",{className:`settings-dialog__route-card settings-dialog__route-card--${s}`,children:[e.jsxDEV("div",{className:"settings-dialog__route-card-top",children:e.jsxDEV("div",{className:"settings-dialog__route-card-title",children:Ii[s]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1978,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1977,columnNumber:9},void 0),e.jsxDEV("div",{className:"settings-dialog__stack",children:[e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"默认模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1984,columnNumber:13},void 0),e.jsxDEV("select",{className:"settings-dialog__select",value:t&&c?vs(t,c):"",onChange:f=>Ks(s,f.target.value),children:[e.jsxDEV("option",{value:"",children:"未配置"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1998,columnNumber:15},void 0),d.map(({profile:f,models:j})=>e.jsxDEV("optgroup",{label:`${f.name}${f.enabled?"":"(已停用)"}`,children:j.map(w=>e.jsxDEV("option",{value:vs(f.id,w.id),children:w.shortLabel||w.label},`${f.id}-${w.id}`,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2007,columnNumber:21},void 0))},f.id,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2e3,columnNumber:17},void 0))]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1987,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1983,columnNumber:11},void 0),e.jsxDEV("div",{className:"settings-dialog__route-meta",children:[e.jsxDEV("span",{children:v},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2020,columnNumber:13},void 0),e.jsxDEV("span",{children:c||"未选择模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2021,columnNumber:13},void 0),d.length===0?e.jsxDEV("span",{children:"暂无可选模型"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2022,columnNumber:41},void 0):null]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2019,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1982,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:1974,columnNumber:7},void 0)},ss=(s=!1)=>{if(!q)return e.jsxDEV("div",{className:"settings-dialog__empty-panel",children:"请选择一个默认模型预设。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2032,columnNumber:9},void 0);const n=fs(q),o=q.id===M;return e.jsxDEV("div",{className:`settings-dialog__content-panel ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxDEV("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxDEV("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>ue("catalog"),children:[e.jsxDEV(as,{size:16},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2055,columnNumber:15},void 0),e.jsxDEV("span",{children:"返回模型预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2056,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2050,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsxDEV("span",{className:"settings-dialog__compact-stage-eyebrow",children:"模型预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2059,columnNumber:15},void 0),e.jsxDEV("p",{className:"settings-dialog__compact-stage-text",children:"在这里设置图片、视频和文本模型的默认路由。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2062,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2058,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2049,columnNumber:11},void 0):null,e.jsxDEV("div",{className:"settings-dialog__section",children:[e.jsxDEV("div",{className:"settings-dialog__panel-header",children:[e.jsxDEV("div",{children:[e.jsxDEV("h3",{className:"settings-dialog__section-title",children:q.name},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2071,columnNumber:15},void 0),e.jsxDEV("div",{className:"settings-dialog__inline-meta",children:[e.jsxDEV("span",{children:o?"当前预设":"未激活"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2075,columnNumber:17},void 0),e.jsxDEV("span",{children:[n,"/3 已配置"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2076,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2074,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2070,columnNumber:13},void 0),e.jsxDEV("div",{className:"settings-dialog__inline-row",children:[e.jsxDEV("button",{type:"button",className:"settings-dialog__ghost-button",onClick:()=>{Fe(D,q.id)},children:"设为当前预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2080,columnNumber:15},void 0),e.jsxDEV("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>Bs(q.id),disabled:D.length<=1,children:"删除预设"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2092,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2079,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2069,columnNumber:11},void 0),e.jsxDEV("div",{className:"settings-dialog__grid",children:e.jsxDEV("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxDEV("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"预设名称"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2105,columnNumber:15},void 0),e.jsxDEV("input",{type:"text",className:"settings-dialog__input",value:q.name,onChange:d=>Ts(q.id,t=>({...t,name:d.target.value}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2108,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2104,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2103,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2068,columnNumber:9},void 0),e.jsxDEV("div",{className:"settings-dialog__routes",children:[Me("image",q.image,"supportsImage"),Me("video",q.video,"supportsVideo"),Me("text",q.text,"supportsText")]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2123,columnNumber:9},void 0)]},s?`preset-detail-${q.id}`:void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2042,columnNumber:7},void 0)},Qs=()=>e.jsxDEV("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsxDEV("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--canvas",children:[b?e.jsxDEV("div",{className:"settings-dialog__compact-stage-header",children:e.jsxDEV("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsxDEV("span",{className:"settings-dialog__compact-stage-eyebrow",children:"画布显示"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2146,columnNumber:15},void 0),e.jsxDEV("p",{className:"settings-dialog__compact-stage-text",children:"手机上会以更集中的卡片形式展示,方便快速切换画布相关开关。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2149,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2145,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2144,columnNumber:11},void 0):null,e.jsxDEV("div",{className:"settings-dialog__section settings-dialog__section--canvas-card",children:[e.jsxDEV("div",{className:"settings-dialog__section-header",children:e.jsxDEV("div",{children:e.jsxDEV("h3",{className:"settings-dialog__section-title",children:"画布显示配置"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2158,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2157,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2156,columnNumber:11},void 0),e.jsxDEV("div",{className:"settings-dialog__preference settings-dialog__preference--panel",children:[e.jsxDEV("div",{className:"settings-dialog__toggle-copy",children:[e.jsxDEV("span",{className:"settings-dialog__toggle-title",children:"任务进度卡片"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2164,columnNumber:15},void 0),e.jsxDEV("span",{className:"settings-dialog__toggle-desc",children:"在画布中显示任务进度卡片,便于追踪当前生成状态。"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2167,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2163,columnNumber:13},void 0),e.jsxDEV(ts,{size:"small",value:V,onChange:s=>void zs(s)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2171,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2162,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2155,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2142,columnNumber:7},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2141,columnNumber:5},void 0),Js=()=>e.jsxDEV("aside",{className:"settings-dialog__nav",children:e.jsxDEV("div",{className:"settings-dialog__nav-shell",children:e.jsxDEV("div",{className:"settings-dialog__nav-list",children:Si.map(s=>e.jsxDEV("button",{type:"button",className:`settings-dialog__nav-item ${I===s.value?"settings-dialog__nav-item--active":""}`,onClick:()=>Is(s.value),children:e.jsxDEV("span",{className:"settings-dialog__nav-item-title",children:s.label},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2200,columnNumber:17},void 0)},s.value,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2190,columnNumber:15},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2188,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2187,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2186,columnNumber:7},void 0),Xs=()=>I==="canvas"?Qs():I==="presets"?b?qs==="catalog"?Xe("presets-catalog",Je()):ss(!0):e.jsxDEV("div",{className:"settings-dialog__workspace",children:[e.jsxDEV("aside",{className:"settings-dialog__sidebar",children:Je()},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2225,columnNumber:11},void 0),ss()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2224,columnNumber:9},void 0):b?Us==="catalog"?Xe("providers-catalog",Qe()):es(!0):e.jsxDEV("div",{className:"settings-dialog__workspace",children:[e.jsxDEV("aside",{className:"settings-dialog__sidebar",children:Qe()},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2241,columnNumber:9},void 0),es()]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2240,columnNumber:7},void 0);return e.jsxDEV(e.Fragment,{children:[e.jsxDEV(Ni,{visible:l.openSettings,title:"设置",onClose:Zs,width:b?"100%":"88%",height:b?"100%":"88%",minWidth:b?Math.max(320,Math.min(h-16,640)):1080,minHeight:b?Math.max(520,Math.min(C-16,820)):680,x:"center",y:"center",maximizable:!0,minimizable:!1,resizable:!b,movable:!b,modal:!1,className:"winbox-ai-generation winbox-tool-window winbox-settings-window",container:i,background:"#ffffff",autoMaximize:b,children:e.jsxDEV("div",{className:"settings-dialog","data-testid":"settings-dialog",children:e.jsxDEV("div",{className:"settings-dialog__layout",children:[Js(),e.jsxDEV("div",{className:"settings-dialog__main",children:Xs()},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2282,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2280,columnNumber:11},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2279,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2251,columnNumber:7},void 0),e.jsxDEV(Mi,{open:Re,container:i,models:B.discoveredModels,selectedModelIds:B.selectedModelIds,onClose:()=>_e(!1),onConfirm:Gs},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2286,columnNumber:7},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/settings-dialog/settings-dialog.tsx",lineNumber:2250,columnNumber:5},void 0)};export{en as IMAGE_MODEL_GROUPED_OPTIONS,Qi as SettingsDialog,sn as VIDEO_MODEL_OPTIONS};
@@ -1 +1 @@
1
- import{a6 as M,a7 as u,a8 as D,a9 as m,aa as y,ab as b,ac as T,ad as N,ae as j,af as $,ag as R,ah as F,ai as E,aj as S,ak as U,al as k,am as x,an as O,u as z,ao as _,ap as B,aq as L,ar as A,as as H}from"./index-7WzIC7_D.js";const v="github_sync_master_index",C="github_sync_master_gist_id";class J{constructor(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}async initialize(){this.initialized||(this.masterIndex=await M.get(v),this.masterGistId=await M.get(C),this.initialized=!0,u("ShardRouter initialized",{hasMasterIndex:!!this.masterIndex,masterGistId:this.masterGistId?D(this.masterGistId):null,shardCount:this.masterIndex?Object.keys(this.masterIndex.shards).length:0}))}getMasterIndex(){return this.masterIndex}getMasterGistId(){return this.masterGistId}async setMasterGistId(s){this.masterGistId=s,await M.set(C,s)}isConfigured(){return!!this.masterIndex&&!!this.masterGistId}async loadMasterIndexFromRemote(){if(!this.masterGistId)return u("No master gist ID configured"),null;try{const s=await m.getGistFileContent(y.MASTER_INDEX,this.masterGistId);if(!s)return u("No master index found in remote"),null;const t=JSON.parse(s);return this.masterIndex=t,await this.saveMasterIndexLocally(),u("Loaded master index from remote",{shards:Object.keys(t.shards).length,files:Object.keys(t.fileIndex).length}),t}catch(s){return b("Failed to load master index",s instanceof Error?s:new Error(String(s))),null}}async saveMasterIndexLocally(){this.masterIndex&&await M.set(v,this.masterIndex)}async saveMasterIndexToRemote(){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index or gist ID not configured");T(this.masterIndex),await m.updateGistFiles({[y.MASTER_INDEX]:JSON.stringify(this.masterIndex,null,2)},this.masterGistId),await this.saveMasterIndexLocally(),u("Saved master index to remote")}async initializeMasterIndex(s){if(this.masterIndex)return this.masterIndex;if(this.masterIndex=N(s),!this.masterGistId)throw new Error("Master gist ID must be set before initializing index");return await this.saveMasterIndexLocally(),u("Initialized new master index"),this.masterIndex}getShardForFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];return t&&this.masterIndex.shards[t.shardId]||null}getFileIndexEntry(s){return this.masterIndex&&this.masterIndex.fileIndex[s]||null}isFileSynced(s){return this.getFileIndexEntry(s)!==null}findActiveShard(s){if(!this.masterIndex)return null;const t=Object.values(this.masterIndex.shards).filter(e=>e.status==="active").sort((e,a)=>a.fileCount-e.fileCount);for(const e of t)if(j(e,s))return e;return null}async createShard(s){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index not initialized");const t=Object.keys(this.masterIndex.shards).length+1,e=s||$(t);if(this.masterIndex.shards[e])throw new Error(`Shard alias "${e}" already exists`);const a=`${k.SHARD} #${t} (${e})`,r=R(e,this.masterGistId),i=await F.getPassword(),o=JSON.stringify(r,null,2),n=await E.encrypt(o,this.masterGistId,i||void 0),d=await m.createSyncGist({[y.SHARD_MANIFEST]:n});try{await m.updateGistFiles({[y.SHARD_MANIFEST]:n},d.id)}catch(h){S("Failed to update shard description",{error:String(h)})}const c=U(d.id,e,t);return c.description=a,this.masterIndex.shards[e]=c,T(this.masterIndex),u("Created new shard",{alias:e,gistId:D(d.id),order:t}),c}async allocateFile(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.findActiveShard(s);return t?{shard:t,isNewShard:!1}:{shard:await this.createShard(),isNewShard:!0}}async allocateFiles(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=new Map,e=[];let a=null,r=0,i=0;const o=Object.values(this.masterIndex.shards).filter(n=>n.status==="active").sort((n,d)=>d.fileCount-n.fileCount);o.length>0&&(a=o[0],r=a.fileCount,i=a.totalSize);for(const n of s){const d=this.masterIndex.fileIndex[n.url];if(d){const h=this.masterIndex.shards[d.shardId];if(h){t.set(n.url,h);continue}}if(!a||r>=x.FILE_LIMIT||i+n.size>x.SIZE_LIMIT){const h=await this.createShard();e.push(h),a=h,r=0,i=0}t.set(n.url,a),r++,i+=n.size}return u("Batch allocation completed",{totalFiles:s.length,newShardsCreated:e.length}),{allocations:t,newShards:e}}registerFile(s,t,e,a,r){if(!this.masterIndex)throw new Error("Master index not initialized");const i={shardId:t,filename:e,size:a,type:r,syncedAt:Date.now()};this.masterIndex.fileIndex[s]=i;const o=this.masterIndex.shards[t];o&&(o.fileCount++,o.totalSize+=a,o.updatedAt=Date.now(),o.fileCount>=x.FILE_LIMIT&&(o.status="full",u("Shard is now full",{shardId:t})))}unregisterFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];if(!t)return null;delete this.masterIndex.fileIndex[s];const e=this.masterIndex.shards[t.shardId];return e&&(e.fileCount=Math.max(0,e.fileCount-1),e.totalSize=Math.max(0,e.totalSize-t.size),e.updatedAt=Date.now(),e.status==="full"&&e.fileCount<x.FILE_LIMIT&&(e.status="active",u("Shard reactivated",{shardId:t.shardId}))),t}getShard(s){return this.masterIndex&&this.masterIndex.shards[s]||null}getAllShards(){return this.masterIndex?Object.values(this.masterIndex.shards):[]}async updateShardAlias(s,t){if(!this.masterIndex)throw new Error("Master index not initialized");const e=this.masterIndex.shards[s];if(!e)throw new Error(`Shard "${s}" not found`);if(s!==t&&this.masterIndex.shards[t])throw new Error(`Alias "${t}" already exists`);for(const a of Object.keys(this.masterIndex.fileIndex)){const r=this.masterIndex.fileIndex[a];r.shardId===s&&(r.shardId=t)}for(const a of this.masterIndex.tombstones)a.shardId===s&&(a.shardId=t);delete this.masterIndex.shards[s],e.alias=t,e.description=`${k.SHARD} #${e.order} (${t})`,e.updatedAt=Date.now(),this.masterIndex.shards[t]=e,u("Updated shard alias",{old:s,new:t})}archiveShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.status="archived",t.updatedAt=Date.now(),u("Archived shard",{shardId:s})}reactivateShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.fileCount>=x.FILE_LIMIT?t.status="full":t.status="active",t.updatedAt=Date.now(),u("Reactivated shard",{shardId:s})}getStats(){if(!this.masterIndex)return{totalShards:0,activeShards:0,fullShards:0,archivedShards:0,totalFiles:0,totalSize:0};const s=Object.values(this.masterIndex.shards);return{totalShards:s.length,activeShards:s.filter(t=>t.status==="active").length,fullShards:s.filter(t=>t.status==="full").length,archivedShards:s.filter(t=>t.status==="archived").length,totalFiles:Object.keys(this.masterIndex.fileIndex).length,totalSize:s.reduce((t,e)=>t+e.totalSize,0)}}async clearLocalCache(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1,await M.remove(v),await M.remove(C),u("Cleared local cache")}destroy(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}}const l=new J;function G(){return localStorage.getItem(H)||"unknown"}function X(p){return p<1024?`${p} B`:p<1024*1024?`${(p/1024).toFixed(1)} KB`:`${(p/1024/1024).toFixed(1)} MB`}async function Y(p){return new Promise((s,t)=>{const e=new FileReader;e.onloadend=()=>{const r=e.result.split(",")[1];s(r)},e.onerror=t,e.readAsDataURL(p)})}function K(p,s){const t=atob(p),e=new Uint8Array(t.length);for(let a=0;a<t.length;a++)e[a]=t.charCodeAt(a);return new Blob([e],{type:s})}class P{constructor(){this.syncingUrls=new Set}async uploadMedia(s,t){const e=Date.now(),a={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};if(await l.initialize(),!l.isConfigured())return a.success=!1,a.error="分片系统未配置",a;const r=s.filter(f=>this.syncingUrls.has(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"正在同步中"}),!1):l.isFileSynced(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"已同步"}),!1):!0);if(r.length===0)return a;const i=await this.getFileSizes(r),o=await l.allocateFiles(i),n=this.groupByShards(r,o.allocations),d=Object.keys(n);for(let f=0;f<d.length;f+=x.CONCURRENCY){const w=d.slice(f,f+x.CONCURRENCY);await Promise.all(w.map(I=>this.uploadToShard(I,n[I],a,t)))}await l.saveMasterIndexToRemote(),a.success=a.uploaded>0||a.skipped>0;const c=a.details.filter(f=>!f.success).length,h=Date.now()-e;return u("Upload completed",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),O("分片上传完成",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),a}async getFileSizes(s){const t=[];for(const e of s){let a=e.size||0;if(!a){const r=await z.getCachedBlob(e.url);a=(r==null?void 0:r.size)||0}t.push({url:e.url,size:a})}return t}groupByShards(s,t){const e={};for(const a of s){const r=t.get(a.url);r&&(e[r.alias]||(e[r.alias]=[]),e[r.alias].push(a))}return e}async uploadToShard(s,t,e,a){const r=l.getShard(s);if(!r){for(const n of t)e.details.push({url:n.url,action:"upload",success:!1,error:`分片 ${s} 不存在`});return}const i={},o=[];for(const n of t){this.syncingUrls.add(n.url);try{const d=await this.prepareMediaForUpload(n);if(d.success&&d.content){const c=`media_${_(n.url)}.json`;i[c]=d.content,o.push(n),l.registerFile(n.url,s,c,d.size,n.type),e.details.push({url:n.url,action:"upload",success:!0,shardId:s}),e.uploaded++,a==null||a(e.uploaded+e.skipped,e.uploaded+e.skipped+t.length,n.url,"uploading")}else e.details.push({url:n.url,action:"upload",success:!1,error:d.error||"准备上传失败"})}catch(d){b(`Failed to prepare: ${n.url}`,d instanceof Error?d:new Error(String(d))),e.details.push({url:n.url,action:"upload",success:!1,error:d instanceof Error?d.message:"上传失败"})}finally{this.syncingUrls.delete(n.url)}}if(Object.keys(i).length>0)try{const n=await this.getOrCreateShardManifest(r);for(const I of o){const g=`media_${_(I.url)}.json`;n.files[g]={url:I.url,type:I.type,size:I.size||0,mimeType:I.mimeType||"",syncedAt:Date.now(),syncedFromDevice:G()}}n.updatedAt=Date.now();const d=JSON.stringify(n,null,2),c=l.getMasterGistId();if(c){const I=await F.getPassword();i[y.SHARD_MANIFEST]=await E.encrypt(d,c,I||void 0)}else i[y.SHARD_MANIFEST]=d;const h=Object.values(i).reduce((I,g)=>I+g.length,0),f=Object.keys(i).length;u("Uploading to shard",{shardId:s,fileCount:f,totalSizeMB:(h/1024/1024).toFixed(2)});const w=8*1024*1024;h>w?(u("Total size exceeds limit, splitting into batches"),await this.uploadInBatches(i,r.gistId,w)):await m.updateGistFiles(i,r.gistId),u("Uploaded files to shard",{count:o.length,shardId:s})}catch(n){b(`Failed to update shard: ${s}`,n instanceof Error?n:new Error(String(n)));for(const d of o)l.unregisterFile(d.url);for(const d of o){const c=e.details.find(h=>h.url===d.url);c&&(c.success=!1,c.error="批量上传失败"),e.uploaded--}}}async uploadInBatches(s,t,e){const a=Object.entries(s);let r={},i=0,o=0;for(const[n,d]of a){const c=d.length;if(c>e){Object.keys(r).length>0&&(u("Uploading batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t),r={},i=0,o++),u("Uploading large file",{filename:n,sizeMB:(c/1024/1024).toFixed(2)}),await m.updateGistFiles({[n]:d},t),o++;continue}i+c>e&&Object.keys(r).length>0&&(u(`ShardSyncService] Uploading batch ${o+1}: ${Object.keys(r).length} files`),await m.updateGistFiles(r,t),r={},i=0,o++),r[n]=d,i+=c}Object.keys(r).length>0&&(u("Uploading final batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t))}async prepareMediaForUpload(s){const{url:t,type:e,source:a,originalUrl:r,mimeType:i}=s;let o=null;if(a==="local"?o=await z.getCachedBlob(t):a==="external"&&(o=await z.getCachedBlob(t)),!o||o.size===0)return{success:!1,size:0,error:"无法获取媒体文件"};if(o.size>B)return{success:!1,size:o.size,error:`文件过大(${X(o.size)})`};const n=await Y(o),d={url:t,type:e,source:a,mimeType:i||o.type,size:o.size,base64Data:n,syncedAt:Date.now(),syncedFromDevice:G(),originalUrl:a==="external"?r:void 0},c=l.getMasterGistId();if(!c)return{success:!1,size:o.size,error:"未配置主 Gist ID"};const h=await F.getPassword(),f=JSON.stringify(d,null,2);return{success:!0,content:await E.encrypt(f,c,h||void 0),size:o.size}}async getOrCreateShardManifest(s){try{const e=await m.getGistFileContent(y.SHARD_MANIFEST,s.gistId);if(e){const a=l.getMasterGistId();if(a){const r=await F.getPassword(),i=await E.decrypt(e,a,r||void 0);return JSON.parse(i)}return JSON.parse(e)}}catch(e){S("Failed to get shard manifest",{shard:s.alias,error:String(e)})}const t=l.getMasterGistId();if(!t)throw new Error("Master gist ID not configured");return R(s.alias,t)}async downloadMedia(s,t){const e={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();for(let r=0;r<s.length;r++){const i=s[r];if(t==null||t(r+1,s.length,i,"downloading"),(await z.getCacheInfo(i)).isCached){e.skipped++,e.details.push({url:i,action:"skip",success:!0,error:"已缓存"});continue}const n=l.getFileIndexEntry(i);if(!n){e.details.push({url:i,action:"download",success:!1,error:"文件未同步"});continue}const d=l.getShard(n.shardId);if(!d){e.details.push({url:i,action:"download",success:!1,error:`分片 ${n.shardId} 不存在`});continue}try{const c=await m.getGistFileContent(n.filename,d.gistId);if(!c){e.details.push({url:i,action:"download",success:!1,error:"文件不存在"});continue}const h=l.getMasterGistId();if(!h){e.details.push({url:i,action:"download",success:!1,error:"未配置主 Gist ID"});continue}const f=await F.getPassword(),w=await E.decrypt(c,h,f||void 0),I=JSON.parse(w),g=K(I.base64Data,I.mimeType);if(!g||g.size===0){e.details.push({url:i,action:"download",success:!1,error:"文件数据无效"});continue}await z.cacheToCacheStorageOnly(i,g),e.downloaded++,e.details.push({url:i,action:"download",success:!0,shardId:n.shardId}),u("Downloaded and cached",{url:i})}catch(c){b(`Failed to download: ${i}`,c instanceof Error?c:new Error(String(c))),e.details.push({url:i,action:"download",success:!1,error:c instanceof Error?c.message:"下载失败"})}}e.success=e.downloaded>0||e.skipped>0;const a=e.details.filter(r=>!r.success).length;return e.downloaded>0?O("分片下载完成",{downloaded:e.downloaded,skipped:e.skipped,failed:a}):a>0&&S("分片下载部分失败",{downloaded:e.downloaded,skipped:e.skipped,failed:a}),e}async softDeleteMedia(s){const t={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();const e=l.getMasterIndex();if(!e)return t.success=!1,t.error="主索引未加载",t;const a=G();for(const r of s){const i=l.getFileIndexEntry(r);if(!i){t.skipped++,t.details.push({url:r,action:"skip",success:!0,error:"文件未同步"});continue}const o=L(r,i.shardId,i.filename,i.size,a);e.tombstones.push(o),l.unregisterFile(r),t.deleted++,t.details.push({url:r,action:"delete",success:!0,shardId:i.shardId}),u("Soft deleted",{url:r})}return t.deleted>0&&await l.saveMasterIndexToRemote(),t}async restoreMedia(s){await l.initialize();const t=l.getMasterIndex();if(!t)return!1;const e=t.tombstones.findIndex(i=>i.url===s);if(e===-1)return S("No tombstone found",{url:s}),!1;const a=t.tombstones[e],r=l.getShard(a.shardId);if(!r)return S("Shard not found for restore",{shardId:a.shardId}),!1;try{const i=await m.getGistFileContent(a.filename,r.gistId);if(!i)return S("File not found in shard",{filename:a.filename}),!1;const o=l.getMasterGistId();if(!o)return S("Master gist ID not configured"),!1;const n=await F.getPassword(),d=await E.decrypt(i,o,n||void 0),c=JSON.parse(d);return l.registerFile(s,a.shardId,a.filename,a.size,c.type),t.tombstones.splice(e,1),await l.saveMasterIndexToRemote(),u("Restored",{url:s}),!0}catch(i){return b(`Failed to restore: ${s}`,i instanceof Error?i:new Error(String(i))),!1}}async cleanupExpiredTombstones(){await l.initialize();const s=l.getMasterIndex();if(!s)return 0;const t=s.tombstones.filter(A);if(t.length===0)return 0;u("Cleaning up expired tombstones",{count:t.length});const e={};for(const a of t)e[a.shardId]||(e[a.shardId]=[]),e[a.shardId].push(a.filename);for(const[a,r]of Object.entries(e)){const i=l.getShard(a);if(i)try{await m.deleteGistFiles(r,i.gistId),u("Deleted files from shard",{count:r.length,shardId:a})}catch(o){b(`Failed to delete files from shard: ${a}`,o instanceof Error?o:new Error(String(o)))}}return s.tombstones=s.tombstones.filter(a=>!A(a)),await l.saveMasterIndexToRemote(),t.length}async getSyncedUrls(){await l.initialize();const s=l.getMasterIndex();return s?new Set(Object.keys(s.fileIndex)):new Set}async getTombstones(){await l.initialize();const s=l.getMasterIndex();return s?[...s.tombstones]:[]}async isInTombstones(s){await l.initialize();const t=l.getMasterIndex();return t?t.tombstones.some(e=>e.url===s):!1}}const W=new P,q=Object.freeze(Object.defineProperty({__proto__:null,shardSyncService:W},Symbol.toStringTag,{value:"Module"}));export{W as a,q as b,l as s};
1
+ import{a6 as M,a7 as u,a8 as D,a9 as m,aa as y,ab as b,ac as T,ad as N,ae as j,af as $,ag as R,ah as F,ai as E,aj as S,ak as U,al as k,am as x,an as O,u as z,ao as _,ap as B,aq as L,ar as A,as as H}from"./index-IZLKDros.js";const v="github_sync_master_index",C="github_sync_master_gist_id";class J{constructor(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}async initialize(){this.initialized||(this.masterIndex=await M.get(v),this.masterGistId=await M.get(C),this.initialized=!0,u("ShardRouter initialized",{hasMasterIndex:!!this.masterIndex,masterGistId:this.masterGistId?D(this.masterGistId):null,shardCount:this.masterIndex?Object.keys(this.masterIndex.shards).length:0}))}getMasterIndex(){return this.masterIndex}getMasterGistId(){return this.masterGistId}async setMasterGistId(s){this.masterGistId=s,await M.set(C,s)}isConfigured(){return!!this.masterIndex&&!!this.masterGistId}async loadMasterIndexFromRemote(){if(!this.masterGistId)return u("No master gist ID configured"),null;try{const s=await m.getGistFileContent(y.MASTER_INDEX,this.masterGistId);if(!s)return u("No master index found in remote"),null;const t=JSON.parse(s);return this.masterIndex=t,await this.saveMasterIndexLocally(),u("Loaded master index from remote",{shards:Object.keys(t.shards).length,files:Object.keys(t.fileIndex).length}),t}catch(s){return b("Failed to load master index",s instanceof Error?s:new Error(String(s))),null}}async saveMasterIndexLocally(){this.masterIndex&&await M.set(v,this.masterIndex)}async saveMasterIndexToRemote(){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index or gist ID not configured");T(this.masterIndex),await m.updateGistFiles({[y.MASTER_INDEX]:JSON.stringify(this.masterIndex,null,2)},this.masterGistId),await this.saveMasterIndexLocally(),u("Saved master index to remote")}async initializeMasterIndex(s){if(this.masterIndex)return this.masterIndex;if(this.masterIndex=N(s),!this.masterGistId)throw new Error("Master gist ID must be set before initializing index");return await this.saveMasterIndexLocally(),u("Initialized new master index"),this.masterIndex}getShardForFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];return t&&this.masterIndex.shards[t.shardId]||null}getFileIndexEntry(s){return this.masterIndex&&this.masterIndex.fileIndex[s]||null}isFileSynced(s){return this.getFileIndexEntry(s)!==null}findActiveShard(s){if(!this.masterIndex)return null;const t=Object.values(this.masterIndex.shards).filter(e=>e.status==="active").sort((e,a)=>a.fileCount-e.fileCount);for(const e of t)if(j(e,s))return e;return null}async createShard(s){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index not initialized");const t=Object.keys(this.masterIndex.shards).length+1,e=s||$(t);if(this.masterIndex.shards[e])throw new Error(`Shard alias "${e}" already exists`);const a=`${k.SHARD} #${t} (${e})`,r=R(e,this.masterGistId),i=await F.getPassword(),o=JSON.stringify(r,null,2),n=await E.encrypt(o,this.masterGistId,i||void 0),d=await m.createSyncGist({[y.SHARD_MANIFEST]:n});try{await m.updateGistFiles({[y.SHARD_MANIFEST]:n},d.id)}catch(h){S("Failed to update shard description",{error:String(h)})}const c=U(d.id,e,t);return c.description=a,this.masterIndex.shards[e]=c,T(this.masterIndex),u("Created new shard",{alias:e,gistId:D(d.id),order:t}),c}async allocateFile(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.findActiveShard(s);return t?{shard:t,isNewShard:!1}:{shard:await this.createShard(),isNewShard:!0}}async allocateFiles(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=new Map,e=[];let a=null,r=0,i=0;const o=Object.values(this.masterIndex.shards).filter(n=>n.status==="active").sort((n,d)=>d.fileCount-n.fileCount);o.length>0&&(a=o[0],r=a.fileCount,i=a.totalSize);for(const n of s){const d=this.masterIndex.fileIndex[n.url];if(d){const h=this.masterIndex.shards[d.shardId];if(h){t.set(n.url,h);continue}}if(!a||r>=x.FILE_LIMIT||i+n.size>x.SIZE_LIMIT){const h=await this.createShard();e.push(h),a=h,r=0,i=0}t.set(n.url,a),r++,i+=n.size}return u("Batch allocation completed",{totalFiles:s.length,newShardsCreated:e.length}),{allocations:t,newShards:e}}registerFile(s,t,e,a,r){if(!this.masterIndex)throw new Error("Master index not initialized");const i={shardId:t,filename:e,size:a,type:r,syncedAt:Date.now()};this.masterIndex.fileIndex[s]=i;const o=this.masterIndex.shards[t];o&&(o.fileCount++,o.totalSize+=a,o.updatedAt=Date.now(),o.fileCount>=x.FILE_LIMIT&&(o.status="full",u("Shard is now full",{shardId:t})))}unregisterFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];if(!t)return null;delete this.masterIndex.fileIndex[s];const e=this.masterIndex.shards[t.shardId];return e&&(e.fileCount=Math.max(0,e.fileCount-1),e.totalSize=Math.max(0,e.totalSize-t.size),e.updatedAt=Date.now(),e.status==="full"&&e.fileCount<x.FILE_LIMIT&&(e.status="active",u("Shard reactivated",{shardId:t.shardId}))),t}getShard(s){return this.masterIndex&&this.masterIndex.shards[s]||null}getAllShards(){return this.masterIndex?Object.values(this.masterIndex.shards):[]}async updateShardAlias(s,t){if(!this.masterIndex)throw new Error("Master index not initialized");const e=this.masterIndex.shards[s];if(!e)throw new Error(`Shard "${s}" not found`);if(s!==t&&this.masterIndex.shards[t])throw new Error(`Alias "${t}" already exists`);for(const a of Object.keys(this.masterIndex.fileIndex)){const r=this.masterIndex.fileIndex[a];r.shardId===s&&(r.shardId=t)}for(const a of this.masterIndex.tombstones)a.shardId===s&&(a.shardId=t);delete this.masterIndex.shards[s],e.alias=t,e.description=`${k.SHARD} #${e.order} (${t})`,e.updatedAt=Date.now(),this.masterIndex.shards[t]=e,u("Updated shard alias",{old:s,new:t})}archiveShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.status="archived",t.updatedAt=Date.now(),u("Archived shard",{shardId:s})}reactivateShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.fileCount>=x.FILE_LIMIT?t.status="full":t.status="active",t.updatedAt=Date.now(),u("Reactivated shard",{shardId:s})}getStats(){if(!this.masterIndex)return{totalShards:0,activeShards:0,fullShards:0,archivedShards:0,totalFiles:0,totalSize:0};const s=Object.values(this.masterIndex.shards);return{totalShards:s.length,activeShards:s.filter(t=>t.status==="active").length,fullShards:s.filter(t=>t.status==="full").length,archivedShards:s.filter(t=>t.status==="archived").length,totalFiles:Object.keys(this.masterIndex.fileIndex).length,totalSize:s.reduce((t,e)=>t+e.totalSize,0)}}async clearLocalCache(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1,await M.remove(v),await M.remove(C),u("Cleared local cache")}destroy(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}}const l=new J;function G(){return localStorage.getItem(H)||"unknown"}function X(p){return p<1024?`${p} B`:p<1024*1024?`${(p/1024).toFixed(1)} KB`:`${(p/1024/1024).toFixed(1)} MB`}async function Y(p){return new Promise((s,t)=>{const e=new FileReader;e.onloadend=()=>{const r=e.result.split(",")[1];s(r)},e.onerror=t,e.readAsDataURL(p)})}function K(p,s){const t=atob(p),e=new Uint8Array(t.length);for(let a=0;a<t.length;a++)e[a]=t.charCodeAt(a);return new Blob([e],{type:s})}class P{constructor(){this.syncingUrls=new Set}async uploadMedia(s,t){const e=Date.now(),a={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};if(await l.initialize(),!l.isConfigured())return a.success=!1,a.error="分片系统未配置",a;const r=s.filter(f=>this.syncingUrls.has(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"正在同步中"}),!1):l.isFileSynced(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"已同步"}),!1):!0);if(r.length===0)return a;const i=await this.getFileSizes(r),o=await l.allocateFiles(i),n=this.groupByShards(r,o.allocations),d=Object.keys(n);for(let f=0;f<d.length;f+=x.CONCURRENCY){const w=d.slice(f,f+x.CONCURRENCY);await Promise.all(w.map(I=>this.uploadToShard(I,n[I],a,t)))}await l.saveMasterIndexToRemote(),a.success=a.uploaded>0||a.skipped>0;const c=a.details.filter(f=>!f.success).length,h=Date.now()-e;return u("Upload completed",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),O("分片上传完成",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),a}async getFileSizes(s){const t=[];for(const e of s){let a=e.size||0;if(!a){const r=await z.getCachedBlob(e.url);a=(r==null?void 0:r.size)||0}t.push({url:e.url,size:a})}return t}groupByShards(s,t){const e={};for(const a of s){const r=t.get(a.url);r&&(e[r.alias]||(e[r.alias]=[]),e[r.alias].push(a))}return e}async uploadToShard(s,t,e,a){const r=l.getShard(s);if(!r){for(const n of t)e.details.push({url:n.url,action:"upload",success:!1,error:`分片 ${s} 不存在`});return}const i={},o=[];for(const n of t){this.syncingUrls.add(n.url);try{const d=await this.prepareMediaForUpload(n);if(d.success&&d.content){const c=`media_${_(n.url)}.json`;i[c]=d.content,o.push(n),l.registerFile(n.url,s,c,d.size,n.type),e.details.push({url:n.url,action:"upload",success:!0,shardId:s}),e.uploaded++,a==null||a(e.uploaded+e.skipped,e.uploaded+e.skipped+t.length,n.url,"uploading")}else e.details.push({url:n.url,action:"upload",success:!1,error:d.error||"准备上传失败"})}catch(d){b(`Failed to prepare: ${n.url}`,d instanceof Error?d:new Error(String(d))),e.details.push({url:n.url,action:"upload",success:!1,error:d instanceof Error?d.message:"上传失败"})}finally{this.syncingUrls.delete(n.url)}}if(Object.keys(i).length>0)try{const n=await this.getOrCreateShardManifest(r);for(const I of o){const g=`media_${_(I.url)}.json`;n.files[g]={url:I.url,type:I.type,size:I.size||0,mimeType:I.mimeType||"",syncedAt:Date.now(),syncedFromDevice:G()}}n.updatedAt=Date.now();const d=JSON.stringify(n,null,2),c=l.getMasterGistId();if(c){const I=await F.getPassword();i[y.SHARD_MANIFEST]=await E.encrypt(d,c,I||void 0)}else i[y.SHARD_MANIFEST]=d;const h=Object.values(i).reduce((I,g)=>I+g.length,0),f=Object.keys(i).length;u("Uploading to shard",{shardId:s,fileCount:f,totalSizeMB:(h/1024/1024).toFixed(2)});const w=8*1024*1024;h>w?(u("Total size exceeds limit, splitting into batches"),await this.uploadInBatches(i,r.gistId,w)):await m.updateGistFiles(i,r.gistId),u("Uploaded files to shard",{count:o.length,shardId:s})}catch(n){b(`Failed to update shard: ${s}`,n instanceof Error?n:new Error(String(n)));for(const d of o)l.unregisterFile(d.url);for(const d of o){const c=e.details.find(h=>h.url===d.url);c&&(c.success=!1,c.error="批量上传失败"),e.uploaded--}}}async uploadInBatches(s,t,e){const a=Object.entries(s);let r={},i=0,o=0;for(const[n,d]of a){const c=d.length;if(c>e){Object.keys(r).length>0&&(u("Uploading batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t),r={},i=0,o++),u("Uploading large file",{filename:n,sizeMB:(c/1024/1024).toFixed(2)}),await m.updateGistFiles({[n]:d},t),o++;continue}i+c>e&&Object.keys(r).length>0&&(u(`ShardSyncService] Uploading batch ${o+1}: ${Object.keys(r).length} files`),await m.updateGistFiles(r,t),r={},i=0,o++),r[n]=d,i+=c}Object.keys(r).length>0&&(u("Uploading final batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t))}async prepareMediaForUpload(s){const{url:t,type:e,source:a,originalUrl:r,mimeType:i}=s;let o=null;if(a==="local"?o=await z.getCachedBlob(t):a==="external"&&(o=await z.getCachedBlob(t)),!o||o.size===0)return{success:!1,size:0,error:"无法获取媒体文件"};if(o.size>B)return{success:!1,size:o.size,error:`文件过大(${X(o.size)})`};const n=await Y(o),d={url:t,type:e,source:a,mimeType:i||o.type,size:o.size,base64Data:n,syncedAt:Date.now(),syncedFromDevice:G(),originalUrl:a==="external"?r:void 0},c=l.getMasterGistId();if(!c)return{success:!1,size:o.size,error:"未配置主 Gist ID"};const h=await F.getPassword(),f=JSON.stringify(d,null,2);return{success:!0,content:await E.encrypt(f,c,h||void 0),size:o.size}}async getOrCreateShardManifest(s){try{const e=await m.getGistFileContent(y.SHARD_MANIFEST,s.gistId);if(e){const a=l.getMasterGistId();if(a){const r=await F.getPassword(),i=await E.decrypt(e,a,r||void 0);return JSON.parse(i)}return JSON.parse(e)}}catch(e){S("Failed to get shard manifest",{shard:s.alias,error:String(e)})}const t=l.getMasterGistId();if(!t)throw new Error("Master gist ID not configured");return R(s.alias,t)}async downloadMedia(s,t){const e={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();for(let r=0;r<s.length;r++){const i=s[r];if(t==null||t(r+1,s.length,i,"downloading"),(await z.getCacheInfo(i)).isCached){e.skipped++,e.details.push({url:i,action:"skip",success:!0,error:"已缓存"});continue}const n=l.getFileIndexEntry(i);if(!n){e.details.push({url:i,action:"download",success:!1,error:"文件未同步"});continue}const d=l.getShard(n.shardId);if(!d){e.details.push({url:i,action:"download",success:!1,error:`分片 ${n.shardId} 不存在`});continue}try{const c=await m.getGistFileContent(n.filename,d.gistId);if(!c){e.details.push({url:i,action:"download",success:!1,error:"文件不存在"});continue}const h=l.getMasterGistId();if(!h){e.details.push({url:i,action:"download",success:!1,error:"未配置主 Gist ID"});continue}const f=await F.getPassword(),w=await E.decrypt(c,h,f||void 0),I=JSON.parse(w),g=K(I.base64Data,I.mimeType);if(!g||g.size===0){e.details.push({url:i,action:"download",success:!1,error:"文件数据无效"});continue}await z.cacheToCacheStorageOnly(i,g),e.downloaded++,e.details.push({url:i,action:"download",success:!0,shardId:n.shardId}),u("Downloaded and cached",{url:i})}catch(c){b(`Failed to download: ${i}`,c instanceof Error?c:new Error(String(c))),e.details.push({url:i,action:"download",success:!1,error:c instanceof Error?c.message:"下载失败"})}}e.success=e.downloaded>0||e.skipped>0;const a=e.details.filter(r=>!r.success).length;return e.downloaded>0?O("分片下载完成",{downloaded:e.downloaded,skipped:e.skipped,failed:a}):a>0&&S("分片下载部分失败",{downloaded:e.downloaded,skipped:e.skipped,failed:a}),e}async softDeleteMedia(s){const t={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();const e=l.getMasterIndex();if(!e)return t.success=!1,t.error="主索引未加载",t;const a=G();for(const r of s){const i=l.getFileIndexEntry(r);if(!i){t.skipped++,t.details.push({url:r,action:"skip",success:!0,error:"文件未同步"});continue}const o=L(r,i.shardId,i.filename,i.size,a);e.tombstones.push(o),l.unregisterFile(r),t.deleted++,t.details.push({url:r,action:"delete",success:!0,shardId:i.shardId}),u("Soft deleted",{url:r})}return t.deleted>0&&await l.saveMasterIndexToRemote(),t}async restoreMedia(s){await l.initialize();const t=l.getMasterIndex();if(!t)return!1;const e=t.tombstones.findIndex(i=>i.url===s);if(e===-1)return S("No tombstone found",{url:s}),!1;const a=t.tombstones[e],r=l.getShard(a.shardId);if(!r)return S("Shard not found for restore",{shardId:a.shardId}),!1;try{const i=await m.getGistFileContent(a.filename,r.gistId);if(!i)return S("File not found in shard",{filename:a.filename}),!1;const o=l.getMasterGistId();if(!o)return S("Master gist ID not configured"),!1;const n=await F.getPassword(),d=await E.decrypt(i,o,n||void 0),c=JSON.parse(d);return l.registerFile(s,a.shardId,a.filename,a.size,c.type),t.tombstones.splice(e,1),await l.saveMasterIndexToRemote(),u("Restored",{url:s}),!0}catch(i){return b(`Failed to restore: ${s}`,i instanceof Error?i:new Error(String(i))),!1}}async cleanupExpiredTombstones(){await l.initialize();const s=l.getMasterIndex();if(!s)return 0;const t=s.tombstones.filter(A);if(t.length===0)return 0;u("Cleaning up expired tombstones",{count:t.length});const e={};for(const a of t)e[a.shardId]||(e[a.shardId]=[]),e[a.shardId].push(a.filename);for(const[a,r]of Object.entries(e)){const i=l.getShard(a);if(i)try{await m.deleteGistFiles(r,i.gistId),u("Deleted files from shard",{count:r.length,shardId:a})}catch(o){b(`Failed to delete files from shard: ${a}`,o instanceof Error?o:new Error(String(o)))}}return s.tombstones=s.tombstones.filter(a=>!A(a)),await l.saveMasterIndexToRemote(),t.length}async getSyncedUrls(){await l.initialize();const s=l.getMasterIndex();return s?new Set(Object.keys(s.fileIndex)):new Set}async getTombstones(){await l.initialize();const s=l.getMasterIndex();return s?[...s.tombstones]:[]}async isInTombstones(s){await l.initialize();const t=l.getMasterIndex();return t?t.tombstones.some(e=>e.url===s):!1}}const W=new P,q=Object.freeze(Object.defineProperty({__proto__:null,shardSyncService:W},Symbol.toStringTag,{value:"Module"}));export{W as a,q as b,l as s};
@@ -1 +1 @@
1
- import{s as P,d as N,p as W}from"./styles-6aaf32cf-BTv8Dnxa.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./mermaid.core-DawxQi4y.js";import{G as C}from"./graph-BbAdRpyG.js";import{l as F}from"./layout-CSua1dGC.js";import{l as $}from"./line-CN9rNlXr.js";import"./index-7WzIC7_D.js";import"./array-B5oSNiGi.js";import"./path-CY0bYimO.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},lt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{lt as diagram};
1
+ import{s as P,d as N,p as W}from"./styles-6aaf32cf-DKSbsikH.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./mermaid.core-CclEoiQB.js";import{G as C}from"./graph-2iyYFI0w.js";import{l as F}from"./layout-Cx8G_aqy.js";import{l as $}from"./line-BZ1F3Pjg.js";import"./index-IZLKDros.js";import"./array-B5oSNiGi.js";import"./path-CY0bYimO.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},lt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{lt as diagram};