chainlesschain 0.162.127 → 0.162.129

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 (153) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-CsHJh6tT.js → AIOps-CjyeHTE3.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-ClDr78Wl.js → ActionButton-BmOH_-ot.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CQQBX5mv.js → Analytics-B-YkU8Fp.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DIofBNeG.js → AppLayout-CuFNWJei.js} +4 -4
  6. package/src/assets/web-panel/assets/{Audit-d8pxGJLK.js → Audit-JXoVP3K2.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-ChZb31ek.js → Backup-B9JqIjt8.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-CQsSXb5v.js → BaseInput-BzEr4mwO.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-C_mjILx8.js → Chat-CM-DNmWs.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-B545kWla.js → ChatBubbleRenderer-Cr5q17KH.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-CWFmVuo8.js → Checkbox-5FciM970.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-DwicePOQ.js → Codegen-BF5c0WB9.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-B36SnRdL.js → Col-CG_wkd48.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-C_sZ2HhK.js → Community-ej7R0US7.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-B2jzDcUl.js → Compact-Dlg4k3rN.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-BD58_IHe.js → Compliance-Cx6BfZnz.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-VIBdGc4D.js → Cowork-BL8p2cmR.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-CDTVWUmV.js → Cron-COSKa4zx.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-D5DkGNKU.js → Crosschain-DZ2DEeE_.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-B23ae8PQ.js → DID-B6Q_pgN5.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-DTG5MsSx.js → Dashboard-BCZ2eHJo.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-D35RRnMZ.js → Dropdown-DwLgfZRo.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DRvY2nPk.js → EmailListRenderer-BvnHEPxa.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BT_eESkk.js → FamilyGuardDashboard-MsMgMTC9.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-CxX9F7IL.js → Federation-Ci0x7pTL.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-C1xDz6D8.js → FormItemContext-C2EJGAnp.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-CjBOAXcO.js → GenericCardRenderer-IUljtwjD.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-I9I9NkPO.js → Git-BX-hBoC5.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-BiigWxQW.js → Governance-BIb-35Rd.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-C0KrSCgh.js → Inference-CB0gghy0.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-B1Nd54ow.js → KnowledgeGraph-1BCNC0Oo.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CeOtvYIo.js → Logs-D67YXKnU.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CRhgvAVQ.js → Marketplace-BSeDWSKx.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-BIJNah-H.js → McpTools-Cmvac5W5.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-D6gsbo4e.js → Memory-D85lYzCp.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-DDkIKA6U.js → MobileBridge-gPBhV4nP.js} +1 -1
  37. package/src/assets/web-panel/assets/{MobileProjects-BBkI02Lf.js → MobileProjects-CXsSTCfe.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-BziHK7HS.js → Mtc-rlDnPtag.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-CWXjbkeF.js → MtcAudit-BO6mqtdr.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-9jNF_VWa.js → Multisig-Bk9V9nBV.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BUdF7I2G.js → NLProgramming-DZkhnkfw.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-D5ls1r1T.js → Notes-BbaD_XAo.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-B2WX_TMX.js → NotificationSettings-BNl0Il7M.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-COSzdTcE.js → OrderTableRenderer-DtNoxKG2.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-tzWIgnbM.js → Organization-Bk_dqC59.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-Ca1gp_3S.js → Overflow-Cw7Qamv_.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-XnfDfRK9.js → P2P-FzzSmu_y.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-23Susb25.js → PdhVaultBrowser-CeviOv7K.js} +4 -4
  49. package/src/assets/web-panel/assets/{Permissions-CnkhYPqt.js → Permissions-IS2FQEgL.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-CZ1UasJc.js → PersonalDataHub-04ttWHKH.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-DC1oC84K.js → Pipeline-Cx9y62wr.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CdqayaCE.js → Privacy-LvvrekzX.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-DS7NbGQL.js → ProjectInit-CJJEetRr.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-fdzwup3n.js → ProjectSettings-drpxq_Yr.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-FvodeZob.js → Projects-DVC8DqeX.js} +1 -1
  56. package/src/assets/web-panel/assets/Providers-A-plW3Jh.js +1 -0
  57. package/src/assets/web-panel/assets/{QuickAsk-BAtFET-B.js → QuickAsk-BomqW8Xa.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-DCNRV9Vr.js → Recommend-Dka18zh7.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-lg2JmIai.js → Reputation-Ch71xCZL.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-BAhyDuri.js → Row-2AKWUZzX.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-BA_3issD.js → RssFeed-DFMI7djC.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-CJheUJDl.js → Search-DoxPUkiR.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-D2VczQDD.js → Security-Bf8OErKg.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-7ZFAzqVR.js → Services-DT9GVjgK.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-CsBoTasD.js → Skeleton-Do-alAv-.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-DT_j_gj0.js → Skills-_8ktReLz.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-C9D5geJx.js → Sla-BifGXj02.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-CWCNVW42.js → SpeechSettings-CfhPuhk-.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-TYCbf2kk.js → SyncSettings-NSvl1-yD.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-CbRoXu1G.js → Tasks-BPZrX6nT.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CxBjIrkJ.js → Templates-D6i5n_86.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-NKVyFsPM.js → Tenant-0_EZvyny.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-D5aAL5_H.js → Terminal-C0bBnwiL.js} +2 -2
  74. package/src/assets/web-panel/assets/{TimelineRenderer-CD1JE0Rb.js → TimelineRenderer-C2vROnU9.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-CdepBSYe.js → Tokens-Ck7m-kR2.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-Br3n_PEh.js → Trigger-BKAbnsRZ.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-CSac0pMf.js → Trust-FBA1i6cO.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-BiWo43zc.js → UkeySign-D6rNOPG6.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-Dj50GuoF.js → VideoEditing-CWX3nRYP.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-CQK_g4_U.js → Wallet-B-vjWfn0.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-D8mBl1NC.js → WebAuthn-fqxCcvgZ.js} +3 -3
  82. package/src/assets/web-panel/assets/{WorkflowEditor-CHeS_vab.js → WorkflowEditor-CzD0b2bC.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-CbeOf_lH.js → chat-CLDhnAg0.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-CTFiyfed.js → colors-Bsx0xu94.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-CZsh8FXE.js → compact-item-ClNOQCC1.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-UPhnXsap.js → createContext-C9qwlNzm.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-CRAOFndl.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CCqQtSY-.js → hasIn-BjL86m8O.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-CQHQiYAO.js → index-3eQIypA8.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-LyzbfmcN.js → index-B2zTB67T.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Cy83zglX.js → index-BCsWcWmp.js} +3 -3
  92. package/src/assets/web-panel/assets/{index-dwBroN51.js → index-BD00_RPv.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-86dmMEZY.js → index-BMMnqlW5.js} +1 -1
  94. package/src/assets/web-panel/assets/index-BNsQhG7g.js +1 -0
  95. package/src/assets/web-panel/assets/{index-Bga0UuWA.js → index-BRDcaAuf.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-LIFKNtNq.js → index-BX9f8Ndq.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BAcem_Qs.js → index-Bm9gKRV-.js} +1 -1
  98. package/src/assets/web-panel/assets/index-Bpggj8w_.js +1 -0
  99. package/src/assets/web-panel/assets/{index-e6tj_vqt.js → index-BrHUhD9x.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-_OOipSkX.js → index-Bt6ZAvMp.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DgXn2sWa.js → index-BtDnkt0c.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DBJjqjxL.js → index-C8oEq3hQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Yd1x-xhs.js → index-CKeX2KPo.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BwPULPuj.js → index-CQeZRo2L.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CIQVlE9u.js → index-CU5yLwtP.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DpTaXoo4.js → index-CVCY712-.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B1tylGKq.js → index-CVKSsTRh.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DcJxrM1F.js → index-CwQZwXPJ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-uH-glcG6.js → index-Cz25YHjU.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Blgzobgm.js → index-CzFKyNlh.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CctoAd9I.js → index-CzQVC884.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B-OcSTNA.js → index-D2A--4sc.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-z5pyzCXj.js → index-DKsnftoz.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DmScDPXc.js → index-DSD59ol-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CMi91z74.js → index-DYWR3Fuw.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-WGmri9tu.js → index-DjAr8YaL.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CdiuRSqw.js → index-DzsUEMdg.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Be0uH7m1.js → index-WmVFMlAe.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BKADY9Iw.js → index-X2XknuSQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CVKFSFkX.js → index-Y4uJ30Ah.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DvaDSd9k.js → index-Zu84Ozkn.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DFbyobqi.js → index-_0ECrZoI.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-lOxvi-gf.js → index-iTw-umm2.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dkn1r09O.js → index-jvOBxWy6.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-1d4pat4L.js → index-lCvsdviy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CNteMctn.js → index-lk6R89hG.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-qTrskpW-.js → index-mJ643Df2.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-K95PVa57.js → initDefaultProps-BlV5uKWf.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-DwTSyvvW.js → motion-BoNTPycr.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-BuRSogkN.js → move-BoHsTpsz.js} +1 -1
  131. package/src/assets/web-panel/assets/{mtc-parser-twEnPl1V.js → mtc-parser-Dx4pix3T.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-CdPhebkX.js → omit-Bc_rHmwI.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-CGcIpdPi.js → pickAttrs-C2Gx_OKe.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-DixkX9VV.js → placementArrow-6GK7Cdbb.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-C74t3rB5.js → responsiveObserve-CyUw2c3T.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-TcNt6K6l.js → slide-CfzSX_OP.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-mpTN9mrS.js → statusUtils-ibSrlk34.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-Bwg8zmIj.js → styleChecker-BjNyUO9n.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-Cz4mN4sW.js → useFlexGapSupport-Df3lrxtE.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-DF9zRfbI.js → useFs-ghOdQfsO.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-BcQ4O2UK.js → usePersonalDataHub-B9owuxqJ.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-juM2dgAV.js → vnode-uwV_RL8P.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-c4aJj-vC.js → zoom-C11M_bVH.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/gateways/ws/ws-server.js +55 -2
  146. package/src/harness/mcp-client.js +32 -8
  147. package/src/lib/settings-hooks.cjs +10 -0
  148. package/src/runtime/agent-core.js +100 -2
  149. package/src/runtime/headless-stream.js +14 -6
  150. package/src/assets/web-panel/assets/Providers-IxYyzeSI.js +0 -1
  151. package/src/assets/web-panel/assets/devWarning-BFRqfgsk.js +0 -1
  152. package/src/assets/web-panel/assets/index-DqADH38Q.js +0 -1
  153. package/src/assets/web-panel/assets/index-Pbx8iJt_.js +0 -1
@@ -1,4 +1,4 @@
1
- import{K as o}from"./index-Cy83zglX.js";import{i as f}from"./motion-DwTSyvvW.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
1
+ import{K as o}from"./index-BCsWcWmp.js";import{i as f}from"./motion-BoNTPycr.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
2
2
  ${t}-enter,
3
3
  ${t}-appear
4
4
  `]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
@@ -8,7 +8,7 @@
8
8
  // Injected by web-ui-server.js at serve time
9
9
  window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
10
10
  </script>
11
- <script type="module" crossorigin src="./assets/index-Cy83zglX.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-BCsWcWmp.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-BvqAck49.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/icons-DP3uiYxy.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
@@ -120,6 +120,18 @@ export function isCommandBlocked(baseCmd, env = process.env) {
120
120
  /** Heartbeat interval (ms) */
121
121
  const HEARTBEAT_INTERVAL = 30_000;
122
122
 
123
+ /**
124
+ * Grace period (ms) for a token-protected connection to authenticate before it
125
+ * is dropped. Without it an UNAUTHENTICATED client could hold a connection slot
126
+ * indefinitely (the heartbeat only reaps sockets that stop ponging, which a
127
+ * silent-but-alive socket does not) — so `maxConnections` unauthenticated
128
+ * sockets exhaust every slot and lock out legitimate clients: a pre-auth
129
+ * slot-exhaustion DoS, the time-domain complement to the `maxPayloadBytes`
130
+ * memory cap. Only armed when a token is configured; 0 disables. Override via
131
+ * `options.authTimeoutMs`.
132
+ */
133
+ const AUTH_TIMEOUT_MS = 15_000;
134
+
123
135
  /**
124
136
  * Tokenize a command string into an array of arguments.
125
137
  * Handles double-quoted and single-quoted strings. Does NOT invoke a shell.
@@ -192,6 +204,10 @@ export class ChainlessChainWSServer extends EventEmitter {
192
204
  // and base64 image pastes while bounding abuse; `ws` closes oversize frames
193
205
  // with code 1009 without buffering past the limit. Override per server.
194
206
  this.maxPayloadBytes = options.maxPayloadBytes || 32 * 1024 * 1024;
207
+ // Drop a token-protected connection that never authenticates within this
208
+ // grace window so it can't hold a maxConnections slot forever (see
209
+ // AUTH_TIMEOUT_MS). `??` so an explicit 0 (disable) is honoured.
210
+ this.authTimeoutMs = options.authTimeoutMs ?? AUTH_TIMEOUT_MS;
195
211
 
196
212
  /** Optional Phase-5 envelope bus for fan-out to hosted HTTP SSE. */
197
213
  this.envelopeBus = options.envelopeBus || null;
@@ -322,13 +338,37 @@ export class ChainlessChainWSServer extends EventEmitter {
322
338
  const clientIp =
323
339
  req.socket.remoteAddress || req.headers["x-forwarded-for"] || "unknown";
324
340
 
325
- this.clients.set(clientId, {
341
+ const client = {
326
342
  ws,
327
343
  authenticated: !this.token, // If no token required, auto-authenticated
328
344
  connectedAt: Date.now(),
329
345
  ip: clientIp,
330
346
  alive: true,
331
- });
347
+ authTimer: null,
348
+ };
349
+ this.clients.set(clientId, client);
350
+
351
+ // Auth grace timer: a token-protected connection that never sends a valid
352
+ // auth message would otherwise hold a slot forever (the heartbeat only reaps
353
+ // sockets that stop ponging). Drop it after the grace window, freeing the
354
+ // slot. Cleared on successful auth (_handleAuth) and on close. unref()'d so
355
+ // it never keeps the process alive on its own.
356
+ if (!client.authenticated && this.authTimeoutMs > 0) {
357
+ client.authTimer = setTimeout(() => {
358
+ if (this.clients.get(clientId) === client && !client.authenticated) {
359
+ this.clients.delete(clientId);
360
+ try {
361
+ ws.close(1008, "Authentication timeout");
362
+ } catch (_err) {
363
+ // socket may already be closing
364
+ }
365
+ this.emit("disconnection", { clientId, reason: "auth timeout" });
366
+ }
367
+ }, this.authTimeoutMs);
368
+ if (typeof client.authTimer.unref === "function") {
369
+ client.authTimer.unref();
370
+ }
371
+ }
332
372
 
333
373
  this.emit("connection", { clientId, ip: clientIp });
334
374
 
@@ -346,6 +386,10 @@ export class ChainlessChainWSServer extends EventEmitter {
346
386
  });
347
387
 
348
388
  ws.on("close", () => {
389
+ if (client.authTimer) {
390
+ clearTimeout(client.authTimer);
391
+ client.authTimer = null;
392
+ }
349
393
  this.clients.delete(clientId);
350
394
  this.emit("disconnection", { clientId });
351
395
  });
@@ -571,6 +615,11 @@ export class ChainlessChainWSServer extends EventEmitter {
571
615
 
572
616
  if (success && client) {
573
617
  client.authenticated = true;
618
+ // Authenticated in time — cancel the auth grace timer.
619
+ if (client.authTimer) {
620
+ clearTimeout(client.authTimer);
621
+ client.authTimer = null;
622
+ }
574
623
  }
575
624
 
576
625
  this._send(ws, {
@@ -902,6 +951,10 @@ export class ChainlessChainWSServer extends EventEmitter {
902
951
  this._heartbeatTimer = setInterval(() => {
903
952
  for (const [clientId, client] of this.clients) {
904
953
  if (!client.alive) {
954
+ if (client.authTimer) {
955
+ clearTimeout(client.authTimer);
956
+ client.authTimer = null;
957
+ }
905
958
  client.ws.terminate();
906
959
  this.clients.delete(clientId);
907
960
  this.emit("disconnection", { clientId, reason: "heartbeat timeout" });
@@ -43,6 +43,16 @@ const URL_TRANSPORTS = new Set(["http", "https", "sse", "ws", "wss"]);
43
43
  */
44
44
  const HTTP_REQUEST_TIMEOUT_MS = 30000;
45
45
 
46
+ /**
47
+ * Default per-call timeout for stdio MCP requests — the same 30s default as the
48
+ * HTTP path. The stdio request path now honours the SAME `config.longRunning`
49
+ * exemption and `config.requestTimeoutMs` override (0 disables) the HTTP path
50
+ * already respected; previously stdio hardcoded 30s, so a long-running stdio
51
+ * tool (one that blocks on human input or a long computation) was killed at a
52
+ * hard 30s regardless of its config — an inconsistency with HTTP servers.
53
+ */
54
+ const STDIO_REQUEST_TIMEOUT_MS = 30000;
55
+
46
56
  /**
47
57
  * Infer the transport kind for a server config. Falls back to "stdio".
48
58
  * Prefers an explicit `transport` field; otherwise derives from URL scheme
@@ -693,18 +703,32 @@ export class MCPClient extends EventEmitter {
693
703
 
694
704
  entry._pending.set(id, { resolve, reject });
695
705
 
696
- // Set timeout
697
- const timeout = setTimeout(() => {
698
- entry._pending.delete(id);
699
- reject(new Error(`Request timeout: ${method}`));
700
- }, 30000);
701
-
702
- entry._pending.get(id).timeout = timeout;
706
+ // Per-call timeout — honour the same config knobs as the HTTP path so the
707
+ // two transports behave consistently: `longRunning` servers (a tool that
708
+ // blocks on human input / a long computation) are exempt, and
709
+ // `requestTimeoutMs` overrides the 30s default (0 disables). Previously
710
+ // this was a hard 30s that silently killed a long-running stdio request
711
+ // even when the server was configured otherwise. When no timer is armed
712
+ // the pending entry simply has no `.timeout`; every consumer
713
+ // (_handleMessage / failPending / buffer-overflow drain) already tolerates
714
+ // an absent timeout.
715
+ const longRunning = Boolean(entry.config && entry.config.longRunning);
716
+ const timeoutMs = Number.isFinite(entry.config?.requestTimeoutMs)
717
+ ? entry.config.requestTimeoutMs
718
+ : STDIO_REQUEST_TIMEOUT_MS;
719
+ let timeout = null;
720
+ if (!longRunning && timeoutMs > 0) {
721
+ timeout = setTimeout(() => {
722
+ entry._pending.delete(id);
723
+ reject(new Error(`Request timeout: ${method}`));
724
+ }, timeoutMs);
725
+ entry._pending.get(id).timeout = timeout;
726
+ }
703
727
 
704
728
  try {
705
729
  entry.process.stdin.write(message + "\n");
706
730
  } catch (err) {
707
- clearTimeout(timeout);
731
+ clearTimeout(timeout); // clearTimeout(null) is a safe no-op
708
732
  entry._pending.delete(id);
709
733
  reject(err);
710
734
  }
@@ -94,7 +94,17 @@ function loadHooks({ cwd = process.cwd(), settingsFile, onWarn } = {}) {
94
94
  if (process.env.CC_SETTINGS_HOOKS === "0") {
95
95
  return { hooks: merged, files };
96
96
  }
97
+ const seenPaths = new Set();
97
98
  for (const file of settingsFiles(cwd, settingsFile)) {
99
+ // Dedup by RESOLVED path so the SAME physical file is never read twice — e.g.
100
+ // `--settings .claude/settings.json` from the project root aliases the
101
+ // auto-loaded cwd file, which would otherwise CONCATENATE its hook groups a
102
+ // second time and double-fire every hook in it. (Cross-FILE concatenation
103
+ // across the user/project/local hierarchy is intentional and untouched —
104
+ // identical commands from DIFFERENT layers still both run.)
105
+ const resolved = path.resolve(file);
106
+ if (seenPaths.has(resolved)) continue;
107
+ seenPaths.add(resolved);
98
108
  const data = readJson(file, onWarn);
99
109
  const block =
100
110
  data && data.hooks && typeof data.hooks === "object" ? data.hooks : null;
@@ -5044,10 +5044,108 @@ export async function* agentLoop(messages, options) {
5044
5044
  // Add assistant message with tool calls
5045
5045
  messages.push(msg);
5046
5046
 
5047
+ // Concurrent READ-ONLY batch (latency optimization). When every call in the
5048
+ // turn is a well-formed read-only built-in (pure fs/DB reads — no mutation,
5049
+ // no process spawn, no shared-state writes) and there is no interactive
5050
+ // confirmer in play, run them concurrently so wall-clock drops from the SUM
5051
+ // of the reads to their MAX — the common "read these N files" case. Crucially,
5052
+ // `tool-executing`/`tool-result` events are still YIELDED, and tool results
5053
+ // still PUSHED, in the ORIGINAL order, so the output stream and tool_call_id
5054
+ // correlation are byte-identical to the sequential path — only timing changes.
5055
+ // Any mutating/unknown/MCP tool in the batch, a single call, an interactive
5056
+ // session (concurrent prompts would race), or `parallelReadOnlyTools: false`
5057
+ // falls through to the strictly sequential loop below.
5058
+ const parallelReads =
5059
+ options.parallelReadOnlyTools !== false &&
5060
+ toolCalls.length > 1 &&
5061
+ !toolContext.permissionConfirm &&
5062
+ toolCalls.every(
5063
+ (c) =>
5064
+ typeof c?.function?.name === "string" &&
5065
+ _CHECKPOINT_READ_ONLY.has(c.function.name),
5066
+ );
5067
+ if (parallelReads) {
5068
+ throwIfAborted(signal);
5069
+ // Kick every read off now; settle into {result,error} so an unawaited
5070
+ // promise can never surface as an unhandled rejection if the loop aborts
5071
+ // before it is consumed.
5072
+ const inflight = toolCalls.map((call) => {
5073
+ let toolArgs;
5074
+ try {
5075
+ toolArgs =
5076
+ typeof call.function.arguments === "string"
5077
+ ? JSON.parse(call.function.arguments)
5078
+ : call.function.arguments;
5079
+ } catch {
5080
+ toolArgs = {};
5081
+ }
5082
+ const promise = executeTool(
5083
+ call.function.name,
5084
+ toolArgs,
5085
+ toolContext,
5086
+ ).then(
5087
+ (result) => ({ result, error: null }),
5088
+ (err) => ({ result: { error: err.message }, error: err.message }),
5089
+ );
5090
+ return { call, toolArgs, promise };
5091
+ });
5092
+ for (const { call, toolArgs, promise } of inflight) {
5093
+ throwIfAborted(signal);
5094
+ yield {
5095
+ type: "tool-executing",
5096
+ tool: call.function.name,
5097
+ args: toolArgs,
5098
+ };
5099
+ const { result: toolResult, error: toolError } = await promise;
5100
+ throwIfAborted(signal);
5101
+ const warningMsg = budget.toWarningMessage();
5102
+ const resultStr = capToolResultString(
5103
+ safeStringifyToolResult(toolResult),
5104
+ );
5105
+ const toolContent = warningMsg
5106
+ ? `${resultStr}\n\n${warningMsg}`
5107
+ : resultStr;
5108
+ yield {
5109
+ type: "tool-result",
5110
+ tool: call.function.name,
5111
+ result: toolResult,
5112
+ error: toolError,
5113
+ };
5114
+ messages.push({
5115
+ role: "tool",
5116
+ content: toolContent,
5117
+ tool_call_id: call.id,
5118
+ });
5119
+ }
5120
+ continue; // all read results in place — back to the LLM call
5121
+ }
5122
+
5047
5123
  for (const call of toolCalls) {
5048
5124
  throwIfAborted(signal);
5049
- const fn = call.function;
5050
- const toolName = fn.name;
5125
+ const fn = call?.function;
5126
+ const toolName = fn?.name;
5127
+ // A malformed tool call (no `function` / no `name` — a provider quirk or a
5128
+ // bad MCP tool definition) must not crash the whole turn with a TypeError.
5129
+ // Record an error tool result so the assistant turn stays BALANCED — a
5130
+ // tool_call without its matching tool_result wedges strict providers
5131
+ // (Anthropic/Bedrock) on the very next request — and let the model recover
5132
+ // on the following iteration instead of the run dying on a recoverable
5133
+ // malformed call.
5134
+ if (typeof toolName !== "string" || !toolName) {
5135
+ const reason = "malformed tool call: missing function name";
5136
+ yield {
5137
+ type: "tool-result",
5138
+ tool: "(unknown)",
5139
+ result: { error: reason },
5140
+ error: reason,
5141
+ };
5142
+ messages.push({
5143
+ role: "tool",
5144
+ content: `Error: ${reason}.`,
5145
+ tool_call_id: call?.id,
5146
+ });
5147
+ continue;
5148
+ }
5051
5149
  let toolArgs;
5052
5150
 
5053
5151
  try {
@@ -22,7 +22,20 @@ import { composeSystemPrompt } from "./system-prompt.js";
22
22
  import { collapseConsecutiveMessagesInPlace } from "./message-roles.js";
23
23
  import { sanitizeToolPairs } from "../harness/prompt-compressor.js";
24
24
  import { expandFileRefsAsync } from "./file-ref-expander.js";
25
- import { detectImagePaths } from "../lib/image-input.js";
25
+ // Per-turn helpers resolved at module load (not re-`await import`ed inside the
26
+ // turn loop). image-input + ide-context are pure local modules; pulling them up
27
+ // here — the same pattern as expandFileRefsAsync above — drops a per-turn ESM
28
+ // cache lookup + microtask on a long-lived stream session (the IDE chat panel).
29
+ import {
30
+ detectImagePaths,
31
+ resolveImages,
32
+ buildUserContent,
33
+ resolveVisionLlm,
34
+ } from "../lib/image-input.js";
35
+ import {
36
+ buildIdePromptContext,
37
+ expandIdeMentions,
38
+ } from "../lib/ide-context.js";
26
39
  import { detectVersionSkew, versionSkewMessage } from "../lib/version-skew.js";
27
40
  import {
28
41
  resolveAgentMcp,
@@ -1404,8 +1417,6 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1404
1417
  // IDE bridge is connected — the user's selection moves between prompts.
1405
1418
  // Best-effort; CC_IDE_CONTEXT=0 disables.
1406
1419
  try {
1407
- const { buildIdePromptContext, expandIdeMentions } =
1408
- await import("../lib/ide-context.js");
1409
1420
  const ideCtx = await (
1410
1421
  deps.buildIdePromptContext || buildIdePromptContext
1411
1422
  )(mcp);
@@ -1427,8 +1438,6 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1427
1438
  let turnContent = userContent;
1428
1439
  if (parsed.images && parsed.images.length) {
1429
1440
  try {
1430
- const { resolveImages, buildUserContent } =
1431
- await import("../lib/image-input.js");
1432
1441
  turnContent = buildUserContent(
1433
1442
  userContent,
1434
1443
  resolveImages(parsed.images),
@@ -1451,7 +1460,6 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1451
1460
  // isn't sent to a text-only default model that can't read the history.
1452
1461
  let turnVisionLlm = null;
1453
1462
  if (conversationHasImages) {
1454
- const { resolveVisionLlm } = await import("../lib/image-input.js");
1455
1463
  turnVisionLlm = resolveVisionLlm({
1456
1464
  hasImage: true,
1457
1465
  flags: {},
@@ -1 +0,0 @@
1
- import{E as G,r as k,I as m,J as F,U as d,c as i,K as l,V as u,S,F as R,Z as N,o as I,a as A,P as g,Q as x,R as C,_ as E}from"./vendor-BvqAck49.js";import{u as M,_ as H,d as _}from"./index-Cy83zglX.js";import{a as D,b as W,c as j}from"./parsers-UEvh_ShA.js";import{R as J}from"./icons-DP3uiYxy.js";const B=G("providers",()=>{const K=k(!1),o=k(null),v=k([]),e=k([]),w=k(null);async function U(){const s=M();K.value=!0;try{const{output:f}=await s.execute("llm providers",15e3);v.value=D(f);const p=v.value.find(h=>h.active);p&&(w.value=p.name);const{output:b}=await s.execute("llm models",15e3);e.value=W(b)}catch(f){console.error("Failed to load providers:",f)}finally{K.value=!1}}async function y(s){await M().execute(`llm switch ${s}`,1e4),v.value.forEach(p=>p.active=p.name===s),w.value=s}async function a(s){const f=M();o.value=s;try{const{output:p,exitCode:b}=await f.execute("llm test",3e4),h=v.value.find(L=>L.name===s);return h&&(h.status=b===0?"ok":"error"),b===0}catch{const p=v.value.find(b=>b.name===s);return p&&(p.status="error"),!1}finally{o.value=null}}return{loading:K,testing:o,providers:v,localModels:e,activeProvider:w,loadProviders:U,switchProvider:y,testProvider:a}}),Q={__name:"Providers",setup(K,{expose:o}){o();const v=B(),e=M(),w=k(!1),U=k(!1),y=k(!1),a=A({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let s={};const f=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],p={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},b=f.map(n=>({value:n,label:p[n]||n}));async function h(n){try{await v.switchProvider(n),_.success(`已切换到 ${n}`)}catch(t){_.error(`切换失败: ${t.message}`)}}async function L(n){await v.testProvider(n)?_.success(`${n} 连接正常`):_.warning(`${n} 连接失败,请检查配置`)}async function z(){w.value=!0;try{const{output:n}=await e.execute("config list",15e3),t=j(n);t.provider&&(a.provider=t.provider),t.model&&(a.model=t.model),t.apiKey&&(a.apiKey=t.apiKey),t.baseUrl&&(a.baseUrl=t.baseUrl),t.temperature!==void 0&&(a.temperature=t.temperature),t.maxTokens!==void 0&&(a.maxTokens=t.maxTokens),s={provider:t.provider??"",model:t.model??"",apiKey:t.apiKey??"",baseUrl:t.baseUrl??"",temperature:t.temperature??a.temperature,maxTokens:t.maxTokens??a.maxTokens},_.success("配置已加载")}catch(n){_.error(`加载配置失败: ${n.message}`)}finally{w.value=!1}}async function O(){U.value=!0;const n=[],t=[];try{if(a.provider&&a.provider!==s.provider)try{await e.execute(`config set llm.provider ${a.provider}`,1e4),t.push("provider")}catch(c){n.push(`provider: ${c.message}`)}if(a.model&&a.model!==s.model)try{await e.execute(`config set llm.model ${a.model}`,1e4),t.push("model")}catch(c){n.push(`model: ${c.message}`)}if(a.apiKey&&a.apiKey!==s.apiKey)try{await e.execute(`config set llm.apiKey ${a.apiKey}`,1e4),t.push("apiKey")}catch(c){n.push(`apiKey: ${c.message}`)}if(a.baseUrl!==void 0&&a.baseUrl!==s.baseUrl)try{await e.execute(`config set llm.baseUrl ${a.baseUrl}`,1e4),t.push("baseUrl")}catch(c){n.push(`baseUrl: ${c.message}`)}if(a.temperature!==s.temperature)try{await e.execute(`config set llm.temperature ${a.temperature}`,1e4),t.push("temperature")}catch(c){n.push(`temperature: ${c.message}`)}if(a.maxTokens!==s.maxTokens)try{await e.execute(`config set llm.maxTokens ${a.maxTokens}`,1e4),t.push("maxTokens")}catch(c){n.push(`maxTokens: ${c.message}`)}n.length>0?_.warning(`部分配置保存失败: ${n.join("; ")}`):t.length>0?(_.success(`已保存 ${t.length} 项配置`),s={...a},(t.includes("apiKey")||t.includes("provider")||t.includes("baseUrl")||t.includes("model"))&&(y.value=!0),t.includes("provider")&&v.loadProviders()):_.info("没有检测到配置变更")}catch(c){_.error(`保存配置失败: ${c.message}`)}finally{U.value=!1}}function P(){a.provider=s.provider||void 0,a.model=s.model||"",a.apiKey=s.apiKey||"",a.baseUrl=s.baseUrl||"",a.temperature=s.temperature??.7,a.maxTokens=s.maxTokens??4096}I(()=>{v.loadProviders(),z()});const T={providersStore:v,ws:e,configLoading:w,configSaving:U,showRestartHint:y,configForm:a,get loadedConfig(){return s},set loadedConfig(n){s=n},knownProviders:f,providerLabels:p,providerOptions:b,switchProvider:h,test:L,loadConfig:z,saveConfig:O,resetForm:P,onMounted:I,reactive:A,ref:k,get ReloadOutlined(){return J},get message(){return _},get useProvidersStore(){return B},get useWsStore(){return M},get parseLlmConfigOutput(){return j}};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}},X={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Z={key:1,style:{"text-align":"center",padding:"60px"}},Y={class:"providers-grid"},$={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},ee={style:{"font-size":"24px"}},oe={style:{flex:"1"}},ae={style:{color:"#e0e0e0","font-weight":"500"}},te={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},re={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},se={key:0,style:{"margin-top":"24px"}},ne={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},le={class:"config-grid"},de={style:{display:"flex","align-items":"center",gap:"12px"}},ce={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}};function me(K,o,v,e,w,U){const y=m("a-button"),a=m("a-alert"),s=m("a-spin"),f=m("a-tag"),p=m("a-badge"),b=m("a-card"),h=m("a-list-item"),L=m("a-list"),z=m("a-divider"),O=m("a-select"),P=m("a-form-item"),T=m("a-input"),n=m("a-input-password"),t=m("a-slider"),c=m("a-input-number"),V=m("a-form");return g(),F("div",null,[d("div",X,[o[10]||(o[10]=d("div",null,[d("h2",{class:"page-title"},"LLM 配置"),d("p",{class:"page-sub"},"管理 AI 服务提供商")],-1)),i(y,{type:"primary",ghost:"",loading:e.providersStore.loading,onClick:o[0]||(o[0]=r=>e.providersStore.loadProviders())},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[9]||(o[9]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),u(" Active Provider Banner "),e.providersStore.activeProvider?(g(),S(a,{key:0,type:"success",style:{"margin-bottom":"20px",background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)"},"show-icon":""},{message:l(()=>[d("span",null,[o[11]||(o[11]=x("当前激活:",-1)),d("strong",null,C(e.providersStore.activeProvider),1)])]),_:1})):u("v-if",!0),u(" Loading "),e.providersStore.loading?(g(),F("div",Z,[i(s,{size:"large"}),o[12]||(o[12]=d("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(g(),F(R,{key:2},[u(" Providers Grid "),d("div",null,[d("div",Y,[(g(!0),F(R,null,N(e.providersStore.providers,r=>(g(),S(b,{key:r.name,class:E(["provider-card",{active:r.active}]),style:{background:"var(--bg-card)"},size:"small"},{default:l(()=>[d("div",$,[d("span",ee,C(r.icon),1),d("div",oe,[d("div",ae,C(r.label),1),d("div",te,C(r.name),1)]),d("div",null,[r.active?(g(),S(f,{key:0,color:"green"},{default:l(()=>[...o[13]||(o[13]=[x("活跃",-1)])]),_:1})):r.status==="ok"?(g(),S(p,{key:1,status:"success",text:""})):r.status==="error"?(g(),S(p,{key:2,status:"error",text:""})):u("v-if",!0)])]),d("div",re,[i(y,{size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"},loading:e.providersStore.testing===r.name,onClick:q=>e.test(r.name)},{default:l(()=>[...o[14]||(o[14]=[x(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),r.active?(g(),S(f,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:l(()=>[...o[16]||(o[16]=[x("当前",-1)])]),_:1})):(g(),S(y,{key:0,size:"small",type:"primary",ghost:"",onClick:q=>e.switchProvider(r.name)},{default:l(()=>[...o[15]||(o[15]=[x(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),u(" Local Models (Ollama) "),e.providersStore.localModels.length?(g(),F("div",se,[o[17]||(o[17]=d("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 本地模型(Ollama) ",-1)),i(L,{"data-source":e.providersStore.localModels,size:"small",style:{background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)"}},{renderItem:l(({item:r})=>[i(h,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:l(()=>[i(f,{color:"cyan",style:{"font-size":"10px"}},{default:l(()=>[x(C(r.size||"local"),1)]),_:2},1024)]),default:l(()=>[d("span",ne,C(r.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):u("v-if",!0),u(" LLM Parameter Settings "),i(z,{style:{"border-color":"var(--border-color)",margin:"32px 0 24px"}}),e.showRestartHint?(g(),S(a,{key:1,type:"warning","show-icon":"",closable:"",style:{"margin-bottom":"16px"},message:"配置已保存,但当前聊天会话仍在用旧 key",description:"桌面端的 LLM 会话只在新建会话时重读配置。请新建一个 Chat,或重启应用,新 key/Provider 才会生效。",onClose:o[1]||(o[1]=r=>e.showRestartHint=!1)})):u("v-if",!0),d("div",ie,[o[19]||(o[19]=d("h3",{class:"section-title"},"LLM 参数设置",-1)),i(y,{size:"small",loading:e.configLoading,onClick:e.loadConfig,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[18]||(o[18]=x(" 加载配置 ",-1))]),_:1},8,["loading"])]),i(b,{class:"config-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[i(V,{model:e.configForm,layout:"vertical",class:"config-form"},{default:l(()=>[d("div",le,[u(" Provider "),i(P,{label:"Provider(提供商)"},{default:l(()=>[i(O,{value:e.configForm.provider,"onUpdate:value":o[2]||(o[2]=r=>e.configForm.provider=r),placeholder:"选择 LLM 提供商",options:e.providerOptions,style:{width:"100%"},disabled:e.configSaving},null,8,["value","options","disabled"])]),_:1}),u(" Model "),i(P,{label:"Model(模型名称)"},{default:l(()=>[i(T,{value:e.configForm.model,"onUpdate:value":o[3]||(o[3]=r=>e.configForm.model=r),placeholder:"例如 doubao-seed-1-6-251015","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" API Key "),i(P,{label:"API Key"},{default:l(()=>[i(n,{value:e.configForm.apiKey,"onUpdate:value":o[4]||(o[4]=r=>e.configForm.apiKey=r),placeholder:"输入 API Key",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Base URL "),i(P,{label:"Base URL"},{default:l(()=>[i(T,{value:e.configForm.baseUrl,"onUpdate:value":o[5]||(o[5]=r=>e.configForm.baseUrl=r),placeholder:"例如 https://ark.cn-beijing.volces.com/api/v3","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Temperature "),i(P,{label:"Temperature(温度)"},{default:l(()=>[d("div",de,[i(t,{value:e.configForm.temperature,"onUpdate:value":o[6]||(o[6]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,style:{flex:"1"},disabled:e.configSaving},null,8,["value","disabled"]),i(c,{value:e.configForm.temperature,"onUpdate:value":o[7]||(o[7]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,precision:1,style:{width:"80px"},disabled:e.configSaving},null,8,["value","disabled"])])]),_:1}),u(" Max Tokens "),i(P,{label:"Max Tokens(最大输出长度)"},{default:l(()=>[i(c,{value:e.configForm.maxTokens,"onUpdate:value":o[8]||(o[8]=r=>e.configForm.maxTokens=r),min:256,max:128e3,step:256,style:{width:"100%"},placeholder:"4096",disabled:e.configSaving},null,8,["value","disabled"])]),_:1})]),d("div",ce,[i(y,{onClick:e.resetForm,disabled:e.configSaving,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:l(()=>[...o[20]||(o[20]=[x(" 重置 ",-1)])]),_:1},8,["disabled"]),i(y,{type:"primary",loading:e.configSaving,onClick:e.saveConfig},{default:l(()=>[...o[21]||(o[21]=[x(" 保存配置 ",-1)])]),_:1},8,["loading"])])]),_:1},8,["model"])]),_:1})])],2112))])}const ge=H(Q,[["render",me],["__scopeId","data-v-64155d06"],["__file","/tmp/cc-web-panel-Xaf3pq/repo/packages/web-panel/src/views/Providers.vue"]]);export{ge as default};
@@ -1 +0,0 @@
1
- import{R as r}from"./index-Cy83zglX.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-B36SnRdL.js";import{a0 as t}from"./index-Cy83zglX.js";import"./vendor-BvqAck49.js";import"./index-z5pyzCXj.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-BAhyDuri.js";import{a0 as t}from"./index-Cy83zglX.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-C74t3rB5.js";import"./useFlexGapSupport-Cz4mN4sW.js";import"./styleChecker-Bwg8zmIj.js";import"./index-z5pyzCXj.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};