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.
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-CsHJh6tT.js → AIOps-CjyeHTE3.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ClDr78Wl.js → ActionButton-BmOH_-ot.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CQQBX5mv.js → Analytics-B-YkU8Fp.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DIofBNeG.js → AppLayout-CuFNWJei.js} +4 -4
- package/src/assets/web-panel/assets/{Audit-d8pxGJLK.js → Audit-JXoVP3K2.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChZb31ek.js → Backup-B9JqIjt8.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CQsSXb5v.js → BaseInput-BzEr4mwO.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C_mjILx8.js → Chat-CM-DNmWs.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-B545kWla.js → ChatBubbleRenderer-Cr5q17KH.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CWFmVuo8.js → Checkbox-5FciM970.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DwicePOQ.js → Codegen-BF5c0WB9.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B36SnRdL.js → Col-CG_wkd48.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C_sZ2HhK.js → Community-ej7R0US7.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B2jzDcUl.js → Compact-Dlg4k3rN.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BD58_IHe.js → Compliance-Cx6BfZnz.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-VIBdGc4D.js → Cowork-BL8p2cmR.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CDTVWUmV.js → Cron-COSKa4zx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D5DkGNKU.js → Crosschain-DZ2DEeE_.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B23ae8PQ.js → DID-B6Q_pgN5.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DTG5MsSx.js → Dashboard-BCZ2eHJo.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D35RRnMZ.js → Dropdown-DwLgfZRo.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DRvY2nPk.js → EmailListRenderer-BvnHEPxa.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BT_eESkk.js → FamilyGuardDashboard-MsMgMTC9.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CxX9F7IL.js → Federation-Ci0x7pTL.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C1xDz6D8.js → FormItemContext-C2EJGAnp.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CjBOAXcO.js → GenericCardRenderer-IUljtwjD.js} +1 -1
- package/src/assets/web-panel/assets/{Git-I9I9NkPO.js → Git-BX-hBoC5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BiigWxQW.js → Governance-BIb-35Rd.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C0KrSCgh.js → Inference-CB0gghy0.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B1Nd54ow.js → KnowledgeGraph-1BCNC0Oo.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CeOtvYIo.js → Logs-D67YXKnU.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CRhgvAVQ.js → Marketplace-BSeDWSKx.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BIJNah-H.js → McpTools-Cmvac5W5.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-D6gsbo4e.js → Memory-D85lYzCp.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DDkIKA6U.js → MobileBridge-gPBhV4nP.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BBkI02Lf.js → MobileProjects-CXsSTCfe.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BziHK7HS.js → Mtc-rlDnPtag.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CWXjbkeF.js → MtcAudit-BO6mqtdr.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-9jNF_VWa.js → Multisig-Bk9V9nBV.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BUdF7I2G.js → NLProgramming-DZkhnkfw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D5ls1r1T.js → Notes-BbaD_XAo.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-B2WX_TMX.js → NotificationSettings-BNl0Il7M.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-COSzdTcE.js → OrderTableRenderer-DtNoxKG2.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-tzWIgnbM.js → Organization-Bk_dqC59.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Ca1gp_3S.js → Overflow-Cw7Qamv_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-XnfDfRK9.js → P2P-FzzSmu_y.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-23Susb25.js → PdhVaultBrowser-CeviOv7K.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-CnkhYPqt.js → Permissions-IS2FQEgL.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CZ1UasJc.js → PersonalDataHub-04ttWHKH.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-DC1oC84K.js → Pipeline-Cx9y62wr.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CdqayaCE.js → Privacy-LvvrekzX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DS7NbGQL.js → ProjectInit-CJJEetRr.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-fdzwup3n.js → ProjectSettings-drpxq_Yr.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-FvodeZob.js → Projects-DVC8DqeX.js} +1 -1
- package/src/assets/web-panel/assets/Providers-A-plW3Jh.js +1 -0
- package/src/assets/web-panel/assets/{QuickAsk-BAtFET-B.js → QuickAsk-BomqW8Xa.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DCNRV9Vr.js → Recommend-Dka18zh7.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-lg2JmIai.js → Reputation-Ch71xCZL.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BAhyDuri.js → Row-2AKWUZzX.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BA_3issD.js → RssFeed-DFMI7djC.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CJheUJDl.js → Search-DoxPUkiR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D2VczQDD.js → Security-Bf8OErKg.js} +3 -3
- package/src/assets/web-panel/assets/{Services-7ZFAzqVR.js → Services-DT9GVjgK.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CsBoTasD.js → Skeleton-Do-alAv-.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DT_j_gj0.js → Skills-_8ktReLz.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-C9D5geJx.js → Sla-BifGXj02.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CWCNVW42.js → SpeechSettings-CfhPuhk-.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-TYCbf2kk.js → SyncSettings-NSvl1-yD.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CbRoXu1G.js → Tasks-BPZrX6nT.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CxBjIrkJ.js → Templates-D6i5n_86.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-NKVyFsPM.js → Tenant-0_EZvyny.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5aAL5_H.js → Terminal-C0bBnwiL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CD1JE0Rb.js → TimelineRenderer-C2vROnU9.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CdepBSYe.js → Tokens-Ck7m-kR2.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Br3n_PEh.js → Trigger-BKAbnsRZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CSac0pMf.js → Trust-FBA1i6cO.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BiWo43zc.js → UkeySign-D6rNOPG6.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dj50GuoF.js → VideoEditing-CWX3nRYP.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CQK_g4_U.js → Wallet-B-vjWfn0.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D8mBl1NC.js → WebAuthn-fqxCcvgZ.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-CHeS_vab.js → WorkflowEditor-CzD0b2bC.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CbeOf_lH.js → chat-CLDhnAg0.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CTFiyfed.js → colors-Bsx0xu94.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CZsh8FXE.js → compact-item-ClNOQCC1.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-UPhnXsap.js → createContext-C9qwlNzm.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CRAOFndl.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CCqQtSY-.js → hasIn-BjL86m8O.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQHQiYAO.js → index-3eQIypA8.js} +1 -1
- package/src/assets/web-panel/assets/{index-LyzbfmcN.js → index-B2zTB67T.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy83zglX.js → index-BCsWcWmp.js} +3 -3
- package/src/assets/web-panel/assets/{index-dwBroN51.js → index-BD00_RPv.js} +1 -1
- package/src/assets/web-panel/assets/{index-86dmMEZY.js → index-BMMnqlW5.js} +1 -1
- package/src/assets/web-panel/assets/index-BNsQhG7g.js +1 -0
- package/src/assets/web-panel/assets/{index-Bga0UuWA.js → index-BRDcaAuf.js} +1 -1
- package/src/assets/web-panel/assets/{index-LIFKNtNq.js → index-BX9f8Ndq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAcem_Qs.js → index-Bm9gKRV-.js} +1 -1
- package/src/assets/web-panel/assets/index-Bpggj8w_.js +1 -0
- package/src/assets/web-panel/assets/{index-e6tj_vqt.js → index-BrHUhD9x.js} +1 -1
- package/src/assets/web-panel/assets/{index-_OOipSkX.js → index-Bt6ZAvMp.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgXn2sWa.js → index-BtDnkt0c.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBJjqjxL.js → index-C8oEq3hQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Yd1x-xhs.js → index-CKeX2KPo.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwPULPuj.js → index-CQeZRo2L.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIQVlE9u.js → index-CU5yLwtP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpTaXoo4.js → index-CVCY712-.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1tylGKq.js → index-CVKSsTRh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcJxrM1F.js → index-CwQZwXPJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-uH-glcG6.js → index-Cz25YHjU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Blgzobgm.js → index-CzFKyNlh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CctoAd9I.js → index-CzQVC884.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-OcSTNA.js → index-D2A--4sc.js} +1 -1
- package/src/assets/web-panel/assets/{index-z5pyzCXj.js → index-DKsnftoz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmScDPXc.js → index-DSD59ol-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMi91z74.js → index-DYWR3Fuw.js} +1 -1
- package/src/assets/web-panel/assets/{index-WGmri9tu.js → index-DjAr8YaL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdiuRSqw.js → index-DzsUEMdg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be0uH7m1.js → index-WmVFMlAe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKADY9Iw.js → index-X2XknuSQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVKFSFkX.js → index-Y4uJ30Ah.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvaDSd9k.js → index-Zu84Ozkn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFbyobqi.js → index-_0ECrZoI.js} +1 -1
- package/src/assets/web-panel/assets/{index-lOxvi-gf.js → index-iTw-umm2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkn1r09O.js → index-jvOBxWy6.js} +1 -1
- package/src/assets/web-panel/assets/{index-1d4pat4L.js → index-lCvsdviy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNteMctn.js → index-lk6R89hG.js} +1 -1
- package/src/assets/web-panel/assets/{index-qTrskpW-.js → index-mJ643Df2.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-K95PVa57.js → initDefaultProps-BlV5uKWf.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DwTSyvvW.js → motion-BoNTPycr.js} +1 -1
- package/src/assets/web-panel/assets/{move-BuRSogkN.js → move-BoHsTpsz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-twEnPl1V.js → mtc-parser-Dx4pix3T.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CdPhebkX.js → omit-Bc_rHmwI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CGcIpdPi.js → pickAttrs-C2Gx_OKe.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DixkX9VV.js → placementArrow-6GK7Cdbb.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C74t3rB5.js → responsiveObserve-CyUw2c3T.js} +1 -1
- package/src/assets/web-panel/assets/{slide-TcNt6K6l.js → slide-CfzSX_OP.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-mpTN9mrS.js → statusUtils-ibSrlk34.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bwg8zmIj.js → styleChecker-BjNyUO9n.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cz4mN4sW.js → useFlexGapSupport-Df3lrxtE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DF9zRfbI.js → useFs-ghOdQfsO.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BcQ4O2UK.js → usePersonalDataHub-B9owuxqJ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-juM2dgAV.js → vnode-uwV_RL8P.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-c4aJj-vC.js → zoom-C11M_bVH.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/gateways/ws/ws-server.js +55 -2
- package/src/harness/mcp-client.js +32 -8
- package/src/lib/settings-hooks.cjs +10 -0
- package/src/runtime/agent-core.js +100 -2
- package/src/runtime/headless-stream.js +14 -6
- package/src/assets/web-panel/assets/Providers-IxYyzeSI.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BFRqfgsk.js +0 -1
- package/src/assets/web-panel/assets/index-DqADH38Q.js +0 -1
- package/src/assets/web-panel/assets/index-Pbx8iJt_.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
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-
|
|
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
|
-
|
|
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
|
-
//
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
entry
|
|
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
|
|
5050
|
-
const toolName = fn
|
|
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
|
-
|
|
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};
|