chainlesschain 0.162.123 → 0.162.124
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 +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C5CSd8pY.js → AIOps-BsDJlD_l.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BugJtiJc.js → ActionButton-COjZZKWG.js} +1 -1
- package/src/assets/web-panel/assets/Analytics-4ZDZE7lc.js +3 -0
- package/src/assets/web-panel/assets/{AppLayout-Cb0eHetM.js → AppLayout-CYH5k2Rp.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-qjq04wh8.js → Audit-BKlFbLdl.js} +1 -1
- package/src/assets/web-panel/assets/Backup-CiX61Qc2.js +1 -0
- package/src/assets/web-panel/assets/{BaseInput-CZ0c7QHk.js → BaseInput-CDxIQokd.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CaKDT3wV.js → Chat-CaKgdRab.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DgvpwU5o.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-C6-Iu3bG.js → Checkbox-CjiWfu4s.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-TGLFk6P1.js → Codegen-tKWGzajw.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DVBrO7AN.js → Col-ZKWREyNs.js} +1 -1
- package/src/assets/web-panel/assets/{Community-tg6-Rik1.js → Community-CmLuPBUU.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DM4ZgFSE.js → Compact-DqknM98n.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-PZw0aBLI.js +1 -0
- package/src/assets/web-panel/assets/{Cowork-CJwiWkUY.js → Cowork-Dp29kHsC.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-dsdXHvrO.js → Cron-zmEJAetz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-p7_5Gq-7.js → Crosschain-Sb-uM7Ty.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BB_LBLYT.js → DID-D_UFNzJ5.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Bh_HkNSD.js → Dashboard-Btag698v.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-dTFtVnKk.js → Dropdown-CH7l3KCs.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-yqdttzXV.js → EmailListRenderer-Bud2M3XX.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DfX3YpUU.js → FamilyGuardDashboard-Bd2_8uME.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BJApfPV4.js → Federation-1jhstF5P.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DNMwIh7X.js → FormItemContext-CpSH464Y.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C-T8UQf0.js → GenericCardRenderer-CANo8O-y.js} +1 -1
- package/src/assets/web-panel/assets/{Git-SURFhkLi.js → Git-hvuZVoD3.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B4u_KsfE.js → Governance-BQrWksKt.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-2kr_rKQd.js → Inference-jEBTp12v.js} +1 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-tDiV2taf.js +1 -0
- package/src/assets/web-panel/assets/Logs-DDkTnedu.js +2 -0
- package/src/assets/web-panel/assets/{Marketplace-W9Iz8b2m.js → Marketplace-9Yi32avt.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D0waMomb.js → McpTools-Qx78XyOT.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Ci768GQ3.js → Memory-CXYDO1oT.js} +2 -2
- package/src/assets/web-panel/assets/MobileBridge-MfUfkHA0.js +1 -0
- package/src/assets/web-panel/assets/{MobileProjects-RpFuAiNz.js → MobileProjects-DEDbWNIk.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DJdw8btT.js → Mtc-Dwa_vlR8.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Dc596XgH.js → MtcAudit-DAVkxhJv.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig--Qs7eGsH.js → Multisig-C3upmgPN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D3y71FDX.js → NLProgramming-DO3CZ0_z.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-uMxjj66_.js → Notes-B1Oy3FbC.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-C4ikBOsm.js → NotificationSettings-Bs4-Fc6b.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BpmdunAz.js → OrderTableRenderer-CEy1pIeq.js} +1 -1
- package/src/assets/web-panel/assets/Organization-D4cJ1UNo.js +4 -0
- package/src/assets/web-panel/assets/{Overflow-B-4_IpbB.js → Overflow-fdzvlF7x.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DdOf9BZs.js → P2P-Y13PwXBA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DDU2Zc9Q.js → PdhVaultBrowser-Ck1zCLe6.js} +3 -3
- package/src/assets/web-panel/assets/Permissions-CvEXP6LC.js +4 -0
- package/src/assets/web-panel/assets/{PersonalDataHub-B3WcvKni.js → PersonalDataHub-JeP7IWMW.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DASuPDc3.js → Pipeline-BZ7wRzG1.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DnixwmhJ.js → Privacy-BJ6qj9Hv.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BQjMDkML.js → ProjectInit-DeWd9UcS.js} +2 -2
- package/src/assets/web-panel/assets/ProjectSettings-DUpVuU9F.js +2 -0
- package/src/assets/web-panel/assets/{Projects-BGWEJIVT.js → Projects-y1WbI337.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Bl0dw6cI.js → Providers-DECW00ek.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BDrk7l3t.js → QuickAsk-Dl-pK9Io.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BPKof_CA.js → Recommend-Bju04wTd.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-6MNJLklK.js → Reputation-BUPa3nEk.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DmGJwpfd.js → Row-WYqqaq_5.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-9-Fxh3_w.js → RssFeed-iyQT5q9l.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CCHjey_D.js → Search-CrfwJF0R.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D6CySV7r.js → Security-c4Jxf5Ih.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Co8Mk8qE.js → Services-CRuisolj.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BdON8M-1.js → Skeleton-CCnzJkb-.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CEJE1Go1.js → Skills-CZURCwZg.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BSxFvFX9.js → Sla-CrMzaEi2.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-jTDOM5eY.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-52NXsfyj.js → SyncSettings-CJWVtd87.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-He7CweW6.js → Tasks-61lrQ_lS.js} +1 -1
- package/src/assets/web-panel/assets/Templates-Cg-iF2g1.js +1 -0
- package/src/assets/web-panel/assets/{Tenant-Dd5XNbYF.js → Tenant-DrDv1FFc.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CP15hcNS.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-BdfqBQmM.js → TimelineRenderer-Sl5uXrkN.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CsgNsrdQ.js → Tokens-yRIZTVsR.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dt_N_rvo.js → Trigger-BLCQEOF2.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B1lJzsPn.js → Trust-D5xq8z6s.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CW8YdFxg.js → UkeySign-Dwp0zXQ6.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CU6o7qvp.js → VideoEditing-CIHA55Sx.js} +1 -1
- package/src/assets/web-panel/assets/Wallet-Hjajvnto.js +4 -0
- package/src/assets/web-panel/assets/WebAuthn-DqSURUvI.js +5 -0
- package/src/assets/web-panel/assets/{WorkflowEditor-BcCA2U8H.js → WorkflowEditor-B5bHRwUG.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Cxl5DGsc.js → chat-DsheLKkG.js} +1 -1
- package/src/assets/web-panel/assets/{colors-FS_7Xggs.js → colors-CST2UkgL.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BzXjd3wJ.js → compact-item-yqEoy1L7.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DhF9bi_u.js → createContext-Jwp78HFY.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-C8to6gQk.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Y1a0aV9N.js → hasIn-CVS5mFEP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfaSKEVD.js → index-AnW25bEq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmjxpu0L.js → index-BCHAUdel.js} +1 -1
- package/src/assets/web-panel/assets/{index-B48PZ-xM.js → index-BLTUVd0V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRSkKj9M.js → index-BeblNJDH.js} +1 -1
- package/src/assets/web-panel/assets/{index-uLoKviUT.js → index-BuI27WSx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTltEtoG.js → index-BzetOasL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CETvk0NN.js → index-C0FZScMe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZJMsVI1.js → index-C130LLPq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cgo1J_Kf.js → index-C8rq85gu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBtULjKY.js → index-CDAPnZUs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BepInmSi.js → index-CIE2n8k_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3IVAG9l.js → index-CRBbVS43.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci7PSoQn.js → index-CSBPc-sI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxYHV8nb.js → index-CTd3lDxp.js} +1 -1
- package/src/assets/web-panel/assets/index-CUWj5L2s.js +1 -0
- package/src/assets/web-panel/assets/{index-CzlCP4jP.js → index-ChRL6rgA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVTex5M8.js → index-CjfN2CpJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-1iacQgo5.js → index-Cjig5i3a.js} +3 -3
- package/src/assets/web-panel/assets/{index-JUukFpxi.js → index-Crk4KWLW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BllceSdr.js → index-CrlRa054.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn9lbqaS.js → index-CtyEOGuj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt_0ygjA.js → index-Cu6Ql64n.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z0PHC0.js → index-Cx_t5rWw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CELVZPNt.js → index-Cy0dNzkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-GCd5hs58.js → index-CzsKK0tQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnvaUocg.js → index-DDAigsel.js} +1 -1
- package/src/assets/web-panel/assets/index-DZfnYE6e.js +1 -0
- package/src/assets/web-panel/assets/{index-C2S8McM1.js → index-D_1b7uh6.js} +1 -1
- package/src/assets/web-panel/assets/{index--fcP34eT.js → index-D_e9gwfn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgHWZVjv.js → index-DbxAlpPC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNmWkPqm.js → index-De600Jjm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxGVbuqr.js → index-Dgyn8-wN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzQkdgQW.js → index-DiK4vSZa.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuTKOay7.js → index-DpYn5v2k.js} +1 -1
- package/src/assets/web-panel/assets/{index-Sl-sLj3T.js → index-DxaU_lza.js} +1 -1
- package/src/assets/web-panel/assets/{index-Na733kBa.js → index-Dxljh9Fu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLyIxnjc.js → index-R-VGFpi6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUcVF8e6.js → index-SjxCCf5h.js} +1 -1
- package/src/assets/web-panel/assets/{index-1khPb4ZS.js → index-diWkx2Wq.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D6QmlnQ-.js → initDefaultProps-ClAjrsQ-.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BHrTGY1_.js → motion-BalXv_60.js} +1 -1
- package/src/assets/web-panel/assets/{move-Bpph6B_N.js → move-DMelzIW-.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Dx0YMbWn.js → omit-oxecfU3b.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D-a8Fm6C.js → pickAttrs-DJ5F5M6x.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DXFSVgxv.js → placementArrow-DdbKsant.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CxhQ1EaK.js → responsiveObserve-BUuM5cmS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-IlBI0XU8.js → slide-DSV0ccvR.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-COoXVzje.js → statusUtils-B-6oLAXf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCuq89M_.js → styleChecker-DdCAHtsZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-tfNE1ALO.js → useFlexGapSupport-ZORkcoZd.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DD4bzBkU.js → useFs-BFp46LoP.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DVkH1hbT.js → usePersonalDataHub-H7rxgbdW.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D1ZmXyxM.js → vnode-eIq4Tk0J.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DblBUHfi.js → zoom-CTNrv8-H.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/ask.js +24 -1
- package/src/commands/init.js +5 -4
- package/src/commands/instinct.js +18 -5
- package/src/commands/mcp.js +30 -3
- package/src/commands/memory.js +18 -5
- package/src/gateways/http/envelope-http-server.js +17 -2
- package/src/gateways/terminal/PtyManager.js +15 -2
- package/src/gateways/ws/ws-server.js +20 -0
- package/src/gateways/ws/ws-session-gateway.js +16 -0
- package/src/harness/mcp-client.js +57 -0
- package/src/harness/worktree-isolator.js +20 -9
- package/src/lib/agent-core.js +3 -0
- package/src/lib/autonomous-agent.js +7 -6
- package/src/lib/chat-intent-service.js +4 -2
- package/src/lib/checkpoint-store.js +23 -0
- package/src/lib/credential-guard.js +7 -0
- package/src/lib/git-integration.js +57 -1
- package/src/lib/hook-runner.cjs +11 -1
- package/src/lib/interactive-planner.js +4 -3
- package/src/lib/json-schema-output.js +47 -0
- package/src/lib/learning/reflection-engine.js +4 -3
- package/src/lib/learning/skill-improver.js +4 -3
- package/src/lib/learning/skill-synthesizer.js +4 -3
- package/src/lib/mcp-oauth.js +208 -20
- package/src/lib/mcp-serve.js +56 -6
- package/src/lib/orchestrator.js +4 -2
- package/src/lib/process-manager.js +31 -3
- package/src/lib/repl-completer.js +29 -0
- package/src/lib/slot-filler.js +4 -3
- package/src/lib/sub-agent-context.js +6 -0
- package/src/lib/web-fetch.js +54 -3
- package/src/lib/workflow-engine.js +35 -11
- package/src/runtime/agent-core.js +248 -26
- package/src/runtime/headless-stream.js +124 -17
- package/src/assets/web-panel/assets/Analytics-CzxpcV9E.js +0 -3
- package/src/assets/web-panel/assets/Backup-C2Y_XNBA.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-TeKnMwPj.js +0 -1
- package/src/assets/web-panel/assets/Compliance-DFeWryxt.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-h-nL7J6x.js +0 -1
- package/src/assets/web-panel/assets/Logs-DjuWREBJ.js +0 -2
- package/src/assets/web-panel/assets/MobileBridge-4jAehfcz.js +0 -3
- package/src/assets/web-panel/assets/Organization-BBEmFNGM.js +0 -4
- package/src/assets/web-panel/assets/Permissions-B1ebgevF.js +0 -4
- package/src/assets/web-panel/assets/ProjectSettings-dHyZ3SxW.js +0 -2
- package/src/assets/web-panel/assets/SpeechSettings-C3rShYlV.js +0 -1
- package/src/assets/web-panel/assets/Templates-UtjBlJIO.js +0 -1
- package/src/assets/web-panel/assets/Terminal-pFyh42cu.js +0 -3
- package/src/assets/web-panel/assets/Wallet-DPxjEhbN.js +0 -4
- package/src/assets/web-panel/assets/WebAuthn-CuJ29YAF.js +0 -5
- package/src/assets/web-panel/assets/devWarning-B1j78JeH.js +0 -1
- package/src/assets/web-panel/assets/index-BaN6wKWx.js +0 -1
- package/src/assets/web-panel/assets/index-N7JKRLCC.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as s}from"./index-
|
|
1
|
+
import{h as s}from"./index-Cjig5i3a.js";function a(n,t){const e=s({},n);for(let o=0;o<t.length;o+=1){const r=t[o];delete e[r]}return e}export{a as o};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{h as i}from"./index-
|
|
1
|
+
import{h as i}from"./index-Cjig5i3a.js";const l=`accept acceptcharset accesskey action allowfullscreen allowtransparency
|
|
2
2
|
alt async autocomplete autofocus autoplay capture cellpadding cellspacing challenge
|
|
3
3
|
charset checked classid classname colspan cols content contenteditable contextmenu
|
|
4
4
|
controls coords crossorigin data datetime default defer dir disabled download draggable
|
package/src/assets/web-panel/assets/{placementArrow-DXFSVgxv.js → placementArrow-DdbKsant.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as i}from"./index-
|
|
1
|
+
import{h as i}from"./index-Cjig5i3a.js";const L=(e,o,t,n,p)=>{const r=e/2,a=0,s=r,m=t*1/Math.sqrt(2),h=r-t*(1-1/Math.sqrt(2)),b=r-o*(1/Math.sqrt(2)),u=t*(Math.sqrt(2)-1)+o*(1/Math.sqrt(2)),g=2*r-b,w=u,d=2*r-m,c=h,A=2*r-a,x=s,v=r*Math.sqrt(2)+t*(Math.sqrt(2)-2),$=t*(Math.sqrt(2)-1);return{pointerEvents:"none",width:e,height:e,overflow:"hidden","&::after":{content:'""',position:"absolute",width:v,height:v,bottom:0,insetInline:0,margin:"auto",borderRadius:{_skip_check_:!0,value:`0 0 ${o}px 0`},transform:"translateY(50%) rotate(-135deg)",boxShadow:p,zIndex:0,background:"transparent"},"&::before":{position:"absolute",bottom:0,insetInlineStart:0,width:e,height:e/2,background:n,clipPath:{_multi_value_:!0,value:[`polygon(${$}px 100%, 50% ${$}px, ${2*r-$}px 100%, ${$}px 100%)`,`path('M ${a} ${s} A ${t} ${t} 0 0 0 ${m} ${h} L ${b} ${u} A ${o} ${o} 0 0 1 ${g} ${w} L ${d} ${c} A ${t} ${t} 0 0 0 ${A} ${x} Z')`]},content:'""'}}},f={adjustX:1,adjustY:1},l=[0,0],j={left:{points:["cr","cl"],overflow:f,offset:[-4,0],targetOffset:l},right:{points:["cl","cr"],overflow:f,offset:[4,0],targetOffset:l},top:{points:["bc","tc"],overflow:f,offset:[0,-4],targetOffset:l},bottom:{points:["tc","bc"],overflow:f,offset:[0,4],targetOffset:l},topLeft:{points:["bl","tl"],overflow:f,offset:[0,-4],targetOffset:l},leftTop:{points:["tr","tl"],overflow:f,offset:[-4,0],targetOffset:l},topRight:{points:["br","tr"],overflow:f,offset:[0,-4],targetOffset:l},rightTop:{points:["tl","tr"],overflow:f,offset:[4,0],targetOffset:l},bottomRight:{points:["tr","br"],overflow:f,offset:[0,4],targetOffset:l},rightBottom:{points:["bl","br"],overflow:f,offset:[4,0],targetOffset:l},bottomLeft:{points:["tl","bl"],overflow:f,offset:[0,4],targetOffset:l},leftBottom:{points:["br","bl"],overflow:f,offset:[-4,0],targetOffset:l}},M={adjustX:1,adjustY:1},O={adjustX:0,adjustY:0},T=[0,0];function k(e){return typeof e=="boolean"?e?M:O:i(i({},O),e)}function Y(e){const{arrowWidth:o=4,horizontalArrowShift:t=16,verticalArrowShift:n=8,autoAdjustOverflow:p,arrowPointAtCenter:r}=e,a={left:{points:["cr","cl"],offset:[-4,0]},right:{points:["cl","cr"],offset:[4,0]},top:{points:["bc","tc"],offset:[0,-4]},bottom:{points:["tc","bc"],offset:[0,4]},topLeft:{points:["bl","tc"],offset:[-(t+o),-4]},leftTop:{points:["tr","cl"],offset:[-4,-(n+o)]},topRight:{points:["br","tc"],offset:[t+o,-4]},rightTop:{points:["tl","cr"],offset:[4,-(n+o)]},bottomRight:{points:["tr","bc"],offset:[t+o,4]},rightBottom:{points:["bl","cr"],offset:[4,n+o]},bottomLeft:{points:["tl","bc"],offset:[-(t+o),4]},leftBottom:{points:["br","cl"],offset:[-4,n+o]}};return Object.keys(a).forEach(s=>{a[s]=r?i(i({},a[s]),{overflow:k(p),targetOffset:T}):i(i({},j[s]),{overflow:k(p)}),a[s].ignoreShake=!0}),a}function _(e){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";return e.map(t=>`${o}${t}`).join(",")}const X=8;function B(e){const o=X,{sizePopupArrow:t,contentRadius:n,borderRadiusOuter:p,limitVerticalRadius:r}=e,a=t/2-Math.ceil(p*(Math.sqrt(2)-1)),s=(n>12?n+2:12)-a,m=r?o-a:s;return{dropdownArrowOffset:s,dropdownArrowOffsetVertical:m}}function q(e,o){const{componentCls:t,sizePopupArrow:n,marginXXS:p,borderRadiusXS:r,borderRadiusOuter:a,boxShadowPopoverArrow:s}=e,{colorBg:m,showArrowCls:h,contentRadius:b=e.borderRadiusLG,limitVerticalRadius:u}=o,{dropdownArrowOffsetVertical:g,dropdownArrowOffset:w}=B({sizePopupArrow:n,contentRadius:b,borderRadiusOuter:a,limitVerticalRadius:u}),d=n/2+p;return{[t]:{[`${t}-arrow`]:[i(i({position:"absolute",zIndex:1,display:"block"},L(n,r,a,m,s)),{"&:before":{background:m}})],[[`&-placement-top ${t}-arrow`,`&-placement-topLeft ${t}-arrow`,`&-placement-topRight ${t}-arrow`].join(",")]:{bottom:0,transform:"translateY(100%) rotate(180deg)"},[`&-placement-top ${t}-arrow`]:{left:{_skip_check_:!0,value:"50%"},transform:"translateX(-50%) translateY(100%) rotate(180deg)"},[`&-placement-topLeft ${t}-arrow`]:{left:{_skip_check_:!0,value:w}},[`&-placement-topRight ${t}-arrow`]:{right:{_skip_check_:!0,value:w}},[[`&-placement-bottom ${t}-arrow`,`&-placement-bottomLeft ${t}-arrow`,`&-placement-bottomRight ${t}-arrow`].join(",")]:{top:0,transform:"translateY(-100%)"},[`&-placement-bottom ${t}-arrow`]:{left:{_skip_check_:!0,value:"50%"},transform:"translateX(-50%) translateY(-100%)"},[`&-placement-bottomLeft ${t}-arrow`]:{left:{_skip_check_:!0,value:w}},[`&-placement-bottomRight ${t}-arrow`]:{right:{_skip_check_:!0,value:w}},[[`&-placement-left ${t}-arrow`,`&-placement-leftTop ${t}-arrow`,`&-placement-leftBottom ${t}-arrow`].join(",")]:{right:{_skip_check_:!0,value:0},transform:"translateX(100%) rotate(90deg)"},[`&-placement-left ${t}-arrow`]:{top:{_skip_check_:!0,value:"50%"},transform:"translateY(-50%) translateX(100%) rotate(90deg)"},[`&-placement-leftTop ${t}-arrow`]:{top:g},[`&-placement-leftBottom ${t}-arrow`]:{bottom:g},[[`&-placement-right ${t}-arrow`,`&-placement-rightTop ${t}-arrow`,`&-placement-rightBottom ${t}-arrow`].join(",")]:{left:{_skip_check_:!0,value:0},transform:"translateX(-100%) rotate(-90deg)"},[`&-placement-right ${t}-arrow`]:{top:{_skip_check_:!0,value:"50%"},transform:"translateY(-50%) translateX(-100%) rotate(-90deg)"},[`&-placement-rightTop ${t}-arrow`]:{top:g},[`&-placement-rightBottom ${t}-arrow`]:{bottom:g},[_(["&-placement-topLeft","&-placement-top","&-placement-topRight"].map(c=>c+=":not(&-arrow-hidden)"),h)]:{paddingBottom:d},[_(["&-placement-bottomLeft","&-placement-bottom","&-placement-bottomRight"].map(c=>c+=":not(&-arrow-hidden)"),h)]:{paddingTop:d},[_(["&-placement-leftTop","&-placement-left","&-placement-leftBottom"].map(c=>c+=":not(&-arrow-hidden)"),h)]:{paddingRight:{_skip_check_:!0,value:d}},[_(["&-placement-rightTop","&-placement-right","&-placement-rightBottom"].map(c=>c+=":not(&-arrow-hidden)"),h)]:{paddingLeft:{_skip_check_:!0,value:d}}}}}export{X as M,Y as a,B as b,q as g,j as p,L as r};
|
package/src/assets/web-panel/assets/{responsiveObserve-CxhQ1EaK.js → responsiveObserve-BUuM5cmS.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as o,h}from"./index-
|
|
1
|
+
import{I as o,h}from"./index-Cjig5i3a.js";import{b as x}from"./vendor-BvqAck49.js";const v=["xxxl","xxl","xl","lg","md","sm","xs"],p=r=>({xs:`(max-width: ${r.screenXSMax}px)`,sm:`(min-width: ${r.screenSM}px)`,md:`(min-width: ${r.screenMD}px)`,lg:`(min-width: ${r.screenLG}px)`,xl:`(min-width: ${r.screenXL}px)`,xxl:`(min-width: ${r.screenXXL}px)`,xxxl:`{min-width: ${r.screenXXXL}px}`});function w(){const[,r]=o();return x(()=>{const n=p(r.value),i=new Map;let a=-1,c={};return{matchHandlers:{},dispatch(e){return c=e,i.forEach(t=>t(c)),i.size>=1},subscribe(e){return i.size||this.register(),a+=1,i.set(a,e),e(c),a},unsubscribe(e){i.delete(e),i.size||this.unregister()},unregister(){Object.keys(n).forEach(e=>{const t=n[e],s=this.matchHandlers[t];s?.mql.removeListener(s?.listener)}),i.clear()},register(){Object.keys(n).forEach(e=>{const t=n[e],s=l=>{let{matches:m}=l;this.dispatch(h(h({},c),{[e]:m}))},d=window.matchMedia(t);d.addListener(s),this.matchHandlers[t]={mql:d,listener:s},s(d)})},responsiveMap:n}})}export{v as r,w as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as n}from"./index-
|
|
1
|
+
import{K as n}from"./index-Cjig5i3a.js";import{i as e}from"./motion-BalXv_60.js";const m=new n("antSlideUpIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1}}),f=new n("antSlideUpOut",{"0%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0}}),c=new n("antSlideDownIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1}}),l=new n("antSlideDownOut",{"0%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0}}),y=new n("antSlideLeftIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1}}),p=new n("antSlideLeftOut",{"0%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0}}),O=new n("antSlideRightIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1}}),d=new n("antSlideRightOut",{"0%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0}}),g={"slide-up":{inKeyframes:m,outKeyframes:f},"slide-down":{inKeyframes:c,outKeyframes:l},"slide-left":{inKeyframes:y,outKeyframes:p},"slide-right":{inKeyframes:O,outKeyframes:d}},K=(t,r)=>{const{antCls:a}=t,i=`${a}-${r}`,{inKeyframes:s,outKeyframes:o}=g[r];return[e(i,s,o,t.motionDurationMid),{[`
|
|
2
2
|
${i}-enter,
|
|
3
3
|
${i}-appear
|
|
4
4
|
`]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:t.motionEaseOutQuint},[`${i}-leave`]:{animationTimingFunction:t.motionEaseInQuint}}]};export{f as a,c as b,m as c,K as i,l as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-Cjig5i3a.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as d}from"./index-
|
|
1
|
+
import{A as d}from"./index-Cjig5i3a.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-tfNE1ALO.js → useFlexGapSupport-ZORkcoZd.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-BvqAck49.js";import{d as s}from"./styleChecker-
|
|
1
|
+
import{o,s as t}from"./vendor-BvqAck49.js";import{d as s}from"./styleChecker-DdCAHtsZ.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-Cjig5i3a.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as f}from"./index-
|
|
1
|
+
import{u as f}from"./index-Cjig5i3a.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as i,h as a,w as l}from"./index-
|
|
1
|
+
import{M as i,h as a,w as l}from"./index-Cjig5i3a.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function v(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function N(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,v as b,c,N as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-Cjig5i3a.js";import{i as f}from"./motion-BalXv_60.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-Cjig5i3a.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">
|
package/src/commands/ask.js
CHANGED
|
@@ -74,6 +74,29 @@ export function resolveOllamaBaseUrl({
|
|
|
74
74
|
* @param {object} options
|
|
75
75
|
* @returns {Promise<string>}
|
|
76
76
|
*/
|
|
77
|
+
/**
|
|
78
|
+
* Pull the assistant message out of an OpenAI-compatible chat-completion
|
|
79
|
+
* response. A 200 reply can still carry an error body or empty `choices`
|
|
80
|
+
* (e.g. content filtering), and `data.choices[0].message.content` then throws
|
|
81
|
+
* a cryptic "Cannot read properties of undefined". Surface a clear error
|
|
82
|
+
* instead. An empty-string completion is valid and returned as-is.
|
|
83
|
+
*
|
|
84
|
+
* @param {object} data parsed JSON response body
|
|
85
|
+
* @param {string} [provider] for the error message
|
|
86
|
+
* @returns {string}
|
|
87
|
+
*/
|
|
88
|
+
export function extractCompletion(data, provider = "provider") {
|
|
89
|
+
const content = data?.choices?.[0]?.message?.content;
|
|
90
|
+
if (typeof content !== "string") {
|
|
91
|
+
const apiErr = data?.error?.message || data?.error;
|
|
92
|
+
throw new Error(
|
|
93
|
+
`${provider} returned no completion (unexpected response shape)` +
|
|
94
|
+
(apiErr ? `: ${apiErr}` : ""),
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
return content;
|
|
98
|
+
}
|
|
99
|
+
|
|
77
100
|
async function queryLLM(question, options = {}) {
|
|
78
101
|
const provider = options.provider || "ollama";
|
|
79
102
|
const model = options.model || "qwen2:7b";
|
|
@@ -157,7 +180,7 @@ async function queryLLM(question, options = {}) {
|
|
|
157
180
|
}
|
|
158
181
|
|
|
159
182
|
const data = await response.json();
|
|
160
|
-
return data
|
|
183
|
+
return extractCompletion(data, provider);
|
|
161
184
|
}
|
|
162
185
|
|
|
163
186
|
export function registerAskCommand(program) {
|
package/src/commands/init.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import chalk from "chalk";
|
|
9
|
+
import { firstBalancedJson } from "../lib/json-schema-output.js";
|
|
9
10
|
import fs from "fs";
|
|
10
11
|
import path from "path";
|
|
11
12
|
import { logger } from "../lib/logger.js";
|
|
@@ -1841,8 +1842,8 @@ with open(r"""\${tmpJson}""", "w", encoding="utf-8") as f:
|
|
|
1841
1842
|
// Parse LLM result
|
|
1842
1843
|
let updatedCells;
|
|
1843
1844
|
try {
|
|
1844
|
-
const
|
|
1845
|
-
updatedCells = JSON.parse(
|
|
1845
|
+
const jsonText = firstBalancedJson(llmResult, "[");
|
|
1846
|
+
updatedCells = JSON.parse(jsonText || llmResult);
|
|
1846
1847
|
} catch (_e) {
|
|
1847
1848
|
return { success: false, error: "LLM 返回格式不正确,无法解析 JSON", hint: "请重试或简化修改指令" };
|
|
1848
1849
|
}
|
|
@@ -1947,8 +1948,8 @@ with open(r"""\${tmpJson}""", "w", encoding="utf-8") as f:
|
|
|
1947
1948
|
|
|
1948
1949
|
let updatedRuns;
|
|
1949
1950
|
try {
|
|
1950
|
-
const
|
|
1951
|
-
updatedRuns = JSON.parse(
|
|
1951
|
+
const jsonText = firstBalancedJson(llmResult, "[");
|
|
1952
|
+
updatedRuns = JSON.parse(jsonText || llmResult);
|
|
1952
1953
|
} catch (_e) {
|
|
1953
1954
|
return { success: false, error: "LLM 返回格式不正确,无法解析 JSON", hint: "请重试或简化修改指令" };
|
|
1954
1955
|
}
|
package/src/commands/instinct.js
CHANGED
|
@@ -86,9 +86,14 @@ export function registerInstinctCommand(program) {
|
|
|
86
86
|
logger.log(chalk.bold(`Learned Instincts (${instincts.length}):\n`));
|
|
87
87
|
for (const inst of instincts) {
|
|
88
88
|
const pct = (inst.confidence * 100).toFixed(0);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
// Clamp to [0,10] so a stored confidence outside [0,1]
|
|
90
|
+
// (recordBatch upserts caller-supplied values unclamped) can't
|
|
91
|
+
// make repeat() go negative and crash the whole list.
|
|
92
|
+
const lvl = Math.max(
|
|
93
|
+
0,
|
|
94
|
+
Math.min(10, Math.round(inst.confidence * 10) || 0),
|
|
95
|
+
);
|
|
96
|
+
const bar = "█".repeat(lvl) + "░".repeat(10 - lvl);
|
|
92
97
|
logger.log(
|
|
93
98
|
` ${chalk.gray(inst.id.slice(0, 8))} ${chalk.cyan(inst.category.padEnd(18))} ${bar} ${pct}%`,
|
|
94
99
|
);
|
|
@@ -124,7 +129,13 @@ export function registerInstinctCommand(program) {
|
|
|
124
129
|
const fs = await import("fs");
|
|
125
130
|
fs.writeFileSync(options.output, JSON.stringify(rows), "utf-8");
|
|
126
131
|
if (options.json) {
|
|
127
|
-
console.log(
|
|
132
|
+
console.log(
|
|
133
|
+
JSON.stringify({
|
|
134
|
+
ok: true,
|
|
135
|
+
count: rows.length,
|
|
136
|
+
output: options.output,
|
|
137
|
+
}),
|
|
138
|
+
);
|
|
128
139
|
} else {
|
|
129
140
|
logger.log(`exported ${rows.length} instincts → ${options.output}`);
|
|
130
141
|
}
|
|
@@ -141,7 +152,9 @@ export function registerInstinctCommand(program) {
|
|
|
141
152
|
// instinct import — §8.3 restore: idempotent upsert by id from a JSON-array file
|
|
142
153
|
instinct
|
|
143
154
|
.command("import")
|
|
144
|
-
.description(
|
|
155
|
+
.description(
|
|
156
|
+
"Import instincts from a JSON array file (idempotent upsert by id; §8.3)",
|
|
157
|
+
)
|
|
145
158
|
.requiredOption("--input <file>", "JSON array of instincts to import")
|
|
146
159
|
.option("--json", "Output JSON result")
|
|
147
160
|
.action(async (options) => {
|
package/src/commands/mcp.js
CHANGED
|
@@ -42,6 +42,25 @@ export function loginWantsNoBrowser(options = {}) {
|
|
|
42
42
|
return options.open === false || options.browser === false;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Detect a headless environment where opening a browser is futile, so `mcp
|
|
47
|
+
* login` prints the authorize URL for manual opening instead of launching a
|
|
48
|
+
* popup that can never appear (Claude-Code 2.1.191 parity: "headless
|
|
49
|
+
* environments skip the browser popup and go straight to the paste-the-URL
|
|
50
|
+
* prompt"). The localhost callback still catches the code, so login completes.
|
|
51
|
+
*
|
|
52
|
+
* Heuristics: a CI marker forces headless on any OS; macOS/Windows otherwise
|
|
53
|
+
* always have a window server; on Linux/BSD a browser needs a display server
|
|
54
|
+
* (`DISPLAY`/`WAYLAND_DISPLAY`) — its absence (e.g. SSH without X11 forwarding)
|
|
55
|
+
* means headless. `CI=false`/`CI=0` are treated as not-CI.
|
|
56
|
+
*/
|
|
57
|
+
export function isHeadlessEnv(env = process.env, platform = process.platform) {
|
|
58
|
+
const ci = env.CI;
|
|
59
|
+
if (ci && ci !== "false" && ci !== "0") return true;
|
|
60
|
+
if (platform === "darwin" || platform === "win32") return false;
|
|
61
|
+
return !(env.DISPLAY || env.WAYLAND_DISPLAY);
|
|
62
|
+
}
|
|
63
|
+
|
|
45
64
|
// Singleton MCP client for session reuse
|
|
46
65
|
let mcpClient = null;
|
|
47
66
|
|
|
@@ -146,7 +165,7 @@ export function registerMcpCommand(program) {
|
|
|
146
165
|
mcp
|
|
147
166
|
.command("login <target>")
|
|
148
167
|
.description(
|
|
149
|
-
"Authorize a remote MCP server via OAuth (opens a browser); stores the token. <target> is a URL or a configured server name.",
|
|
168
|
+
"Authorize a remote MCP server via OAuth (opens a browser, or prints the URL in headless/SSH environments); stores the token. <target> is a URL or a configured server name.",
|
|
150
169
|
)
|
|
151
170
|
.option("--scope <scope>", "OAuth scope(s) to request")
|
|
152
171
|
.option(
|
|
@@ -168,8 +187,16 @@ export function registerMcpCommand(program) {
|
|
|
168
187
|
try {
|
|
169
188
|
const url = await resolveAuthTargetUrl(program, target);
|
|
170
189
|
const oauth = await import("../lib/mcp-oauth.js");
|
|
171
|
-
|
|
172
|
-
|
|
190
|
+
const explicitNoBrowser = loginWantsNoBrowser(options);
|
|
191
|
+
if (explicitNoBrowser || isHeadlessEnv()) {
|
|
192
|
+
oauth._deps.openBrowser = () => false; // --no-open / --no-browser / headless
|
|
193
|
+
if (!explicitNoBrowser) {
|
|
194
|
+
logger.log(
|
|
195
|
+
chalk.gray(
|
|
196
|
+
"Headless environment — printing the authorize URL instead of opening a browser.",
|
|
197
|
+
),
|
|
198
|
+
);
|
|
199
|
+
}
|
|
173
200
|
}
|
|
174
201
|
logger.log(chalk.gray(`Authorizing ${url} …`));
|
|
175
202
|
const rec = await oauth.authorizeInteractive(url, {
|
package/src/commands/memory.js
CHANGED
|
@@ -143,8 +143,11 @@ export function registerMemoryCommand(program) {
|
|
|
143
143
|
} else {
|
|
144
144
|
logger.log(chalk.bold(`Memory (${entries.length} entries):\n`));
|
|
145
145
|
for (const e of entries) {
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
// Clamp to [0,5] so an out-of-range stored importance (rows
|
|
147
|
+
// written outside the clamped `memory add` path) can't make
|
|
148
|
+
// repeat() go negative and crash the whole list.
|
|
149
|
+
const imp = Math.max(0, Math.min(5, Math.round(e.importance) || 0));
|
|
150
|
+
const stars = "★".repeat(imp) + "☆".repeat(5 - imp);
|
|
148
151
|
logger.log(
|
|
149
152
|
` ${chalk.gray(e.id.slice(0, 12))} ${chalk.yellow(stars)} ${chalk.cyan(e.category)}`,
|
|
150
153
|
);
|
|
@@ -180,9 +183,17 @@ export function registerMemoryCommand(program) {
|
|
|
180
183
|
const fs = await import("fs");
|
|
181
184
|
fs.writeFileSync(options.output, JSON.stringify(entries), "utf-8");
|
|
182
185
|
if (options.json) {
|
|
183
|
-
console.log(
|
|
186
|
+
console.log(
|
|
187
|
+
JSON.stringify({
|
|
188
|
+
ok: true,
|
|
189
|
+
count: entries.length,
|
|
190
|
+
output: options.output,
|
|
191
|
+
}),
|
|
192
|
+
);
|
|
184
193
|
} else {
|
|
185
|
-
logger.log(
|
|
194
|
+
logger.log(
|
|
195
|
+
`exported ${entries.length} memory entries → ${options.output}`,
|
|
196
|
+
);
|
|
186
197
|
}
|
|
187
198
|
} else {
|
|
188
199
|
console.log(JSON.stringify(entries)); // data command: emit the array
|
|
@@ -197,7 +208,9 @@ export function registerMemoryCommand(program) {
|
|
|
197
208
|
// memory import — §8.3 restore: idempotent upsert by id from a JSON-array file
|
|
198
209
|
memory
|
|
199
210
|
.command("import")
|
|
200
|
-
.description(
|
|
211
|
+
.description(
|
|
212
|
+
"Import memory entries from a JSON array file (idempotent upsert by id; §8.3)",
|
|
213
|
+
)
|
|
201
214
|
.requiredOption("--input <file>", "JSON array of memory entries to import")
|
|
202
215
|
.option("--json", "Output JSON result")
|
|
203
216
|
.action(async (options) => {
|
|
@@ -150,8 +150,23 @@ export function createEnvelopeHttpServer(options = {}) {
|
|
|
150
150
|
}
|
|
151
151
|
if (url === "/v1/health") return handleHealth(req, res);
|
|
152
152
|
const match = SESSION_EVENTS_RE.exec(url);
|
|
153
|
-
if (match)
|
|
154
|
-
|
|
153
|
+
if (match) {
|
|
154
|
+
let sessionId;
|
|
155
|
+
try {
|
|
156
|
+
sessionId = decodeURIComponent(match[1]);
|
|
157
|
+
} catch {
|
|
158
|
+
// Malformed percent-encoding (e.g. `/v1/sessions/%/events`) would
|
|
159
|
+
// otherwise throw URIError synchronously inside this request
|
|
160
|
+
// listener — an uncaught exception that crashes the whole server,
|
|
161
|
+
// unauthenticated. Reject as a bad request instead.
|
|
162
|
+
res.writeHead(400, {
|
|
163
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
164
|
+
});
|
|
165
|
+
res.end(JSON.stringify({ error: "bad_request" }));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
return handleSessionEvents(req, res, sessionId);
|
|
169
|
+
}
|
|
155
170
|
res.writeHead(404, { "Content-Type": "application/json; charset=utf-8" });
|
|
156
171
|
res.end(JSON.stringify({ error: "not_found" }));
|
|
157
172
|
}
|
|
@@ -75,7 +75,14 @@ export class PtyManager extends EventEmitter {
|
|
|
75
75
|
|
|
76
76
|
create(req = {}) {
|
|
77
77
|
if (this._stopped) throw new Error("pty_manager_stopped");
|
|
78
|
-
|
|
78
|
+
// Count only LIVE sessions against the cap. A just-exited session lingers
|
|
79
|
+
// in _sessions for ~60s before the reaper removes it (see onExit), so
|
|
80
|
+
// counting `_sessions.size` would spuriously reject new sessions right
|
|
81
|
+
// after a client closes shells — painful over a reconnecting Android link
|
|
82
|
+
// where open/close churn is normal.
|
|
83
|
+
let aliveCount = 0;
|
|
84
|
+
for (const s of this._sessions.values()) if (s.alive) aliveCount++;
|
|
85
|
+
if (aliveCount >= this.config.maxConcurrentSessions) {
|
|
79
86
|
throw new Error("max_concurrent_sessions_exceeded");
|
|
80
87
|
}
|
|
81
88
|
const shell = req.shell || this.config.defaultShell;
|
|
@@ -97,12 +104,18 @@ export class PtyManager extends EventEmitter {
|
|
|
97
104
|
const rows = Number.isFinite(req.rows) ? req.rows : 24;
|
|
98
105
|
const cmd = resolveShellCmd(shell);
|
|
99
106
|
|
|
107
|
+
// req.env arrives from a remote WS frame; only merge a plain object, else a
|
|
108
|
+
// string/array would spread into garbage numeric env keys.
|
|
109
|
+
const extraEnv =
|
|
110
|
+
req.env && typeof req.env === "object" && !Array.isArray(req.env)
|
|
111
|
+
? req.env
|
|
112
|
+
: {};
|
|
100
113
|
const proc = pty.spawn(cmd, [], {
|
|
101
114
|
name: "xterm-256color",
|
|
102
115
|
cols,
|
|
103
116
|
rows,
|
|
104
117
|
cwd,
|
|
105
|
-
env: { ...process.env, ...
|
|
118
|
+
env: { ...process.env, ...extraEnv },
|
|
106
119
|
});
|
|
107
120
|
|
|
108
121
|
const sessionId = randomUUID();
|
|
@@ -184,6 +184,14 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
184
184
|
this.token = options.token || null;
|
|
185
185
|
this.maxConnections = options.maxConnections || 10;
|
|
186
186
|
this.timeout = options.timeout || 30000;
|
|
187
|
+
// Cap inbound message size. The `ws` default is 100 MiB, and every frame is
|
|
188
|
+
// decoded + JSON.parsed in _handleConnection BEFORE the dispatcher's auth
|
|
189
|
+
// gate — so without a cap an UNAUTHENTICATED client could force a ~100 MB
|
|
190
|
+
// allocation per frame (×maxConnections) on a LAN-exposed (Android remote)
|
|
191
|
+
// deployment: a pre-auth memory-DoS. 32 MiB is generous for control frames
|
|
192
|
+
// and base64 image pastes while bounding abuse; `ws` closes oversize frames
|
|
193
|
+
// with code 1009 without buffering past the limit. Override per server.
|
|
194
|
+
this.maxPayloadBytes = options.maxPayloadBytes || 32 * 1024 * 1024;
|
|
187
195
|
|
|
188
196
|
/** Optional Phase-5 envelope bus for fan-out to hosted HTTP SSE. */
|
|
189
197
|
this.envelopeBus = options.envelopeBus || null;
|
|
@@ -214,6 +222,7 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
214
222
|
this.wss = new WebSocketServer({
|
|
215
223
|
port: this.port,
|
|
216
224
|
host: this.host,
|
|
225
|
+
maxPayload: this.maxPayloadBytes,
|
|
217
226
|
});
|
|
218
227
|
|
|
219
228
|
this.wss.on("listening", () => {
|
|
@@ -341,6 +350,17 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
341
350
|
this.emit("disconnection", { clientId });
|
|
342
351
|
});
|
|
343
352
|
|
|
353
|
+
// A misbehaving client (oversize frame → 1009, malformed protocol, abrupt
|
|
354
|
+
// reset) makes the per-connection socket emit 'error'. With no listener Node
|
|
355
|
+
// treats it as an uncaught exception and could crash the whole server — so
|
|
356
|
+
// handle it here; the 'close' that follows removes the client from the map.
|
|
357
|
+
ws.on("error", (err) => {
|
|
358
|
+
this.emit("client-error", {
|
|
359
|
+
clientId,
|
|
360
|
+
error: (err && err.message) || String(err),
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
|
|
344
364
|
ws.on("pong", () => {
|
|
345
365
|
const client = this.clients.get(clientId);
|
|
346
366
|
if (client) client.alive = true;
|
|
@@ -98,6 +98,17 @@ export class WSSessionManager {
|
|
|
98
98
|
|
|
99
99
|
/** @type {Map<string, Session>} */
|
|
100
100
|
this.sessions = new Map();
|
|
101
|
+
|
|
102
|
+
// Cap concurrent in-memory sessions. Each session holds a handler +
|
|
103
|
+
// interaction adapter + agent context, and nothing reaps them on client
|
|
104
|
+
// disconnect (they persist for resume; only closeSession removes one). An
|
|
105
|
+
// authenticated WS client could otherwise spam session-create to exhaust
|
|
106
|
+
// memory — this bounds it (mirrors the PTY manager's cap). Generous enough
|
|
107
|
+
// for legit multi-session use; resume does not create, so reconnecting to
|
|
108
|
+
// an existing session is never blocked by the cap. Override per manager.
|
|
109
|
+
this.maxSessions = Number.isFinite(options.maxSessions)
|
|
110
|
+
? options.maxSessions
|
|
111
|
+
: 100;
|
|
101
112
|
}
|
|
102
113
|
|
|
103
114
|
_normalizeEnabledToolNames(enabledToolNames) {
|
|
@@ -264,6 +275,11 @@ export class WSSessionManager {
|
|
|
264
275
|
* @returns {{ sessionId: string }}
|
|
265
276
|
*/
|
|
266
277
|
createSession(options = {}) {
|
|
278
|
+
if (this.sessions.size >= this.maxSessions) {
|
|
279
|
+
throw new Error(
|
|
280
|
+
`max_sessions_exceeded: ${this.maxSessions} concurrent sessions reached — close some before creating more`,
|
|
281
|
+
);
|
|
282
|
+
}
|
|
267
283
|
const sessionId = this._generateId();
|
|
268
284
|
const type = options.type || "agent";
|
|
269
285
|
const baseProjectRoot = options.projectRoot || this.defaultProjectRoot;
|
|
@@ -101,6 +101,17 @@ export function isLikelyConnectionError(err) {
|
|
|
101
101
|
const MCP_DISCOVERY_RETRIES = 2; // up to 3 attempts total
|
|
102
102
|
const MCP_DISCOVERY_BACKOFF_MS = 250; // 250ms, 500ms
|
|
103
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Hard cap on the unterminated stdout tail buffered per stdio server. JSON-RPC
|
|
106
|
+
* frames are newline-delimited; a runaway or non-MCP process that streams
|
|
107
|
+
* without ever emitting a newline would otherwise grow `entry._buffer` without
|
|
108
|
+
* bound and exhaust memory. 16M chars is far above any legitimate single MCP
|
|
109
|
+
* message (even a tool result with embedded base64), so crossing it signals a
|
|
110
|
+
* misbehaving server. Override per server with `config.maxBufferChars` (0
|
|
111
|
+
* disables the cap).
|
|
112
|
+
*/
|
|
113
|
+
const MCP_MAX_BUFFER_CHARS = 16 * 1024 * 1024;
|
|
114
|
+
|
|
104
115
|
/**
|
|
105
116
|
* Is this a TRANSIENT error worth a short retry during capability discovery?
|
|
106
117
|
* Narrower than isLikelyConnectionError: connection-level failures and 5xx
|
|
@@ -293,6 +304,20 @@ export class MCPClient extends EventEmitter {
|
|
|
293
304
|
failPending(`MCP server "${name}" process error: ${err.message}`);
|
|
294
305
|
this.emit("server-error", { name, error: err.message });
|
|
295
306
|
});
|
|
307
|
+
|
|
308
|
+
// Writing to a stdio server that closed its stdin read end (or died
|
|
309
|
+
// mid-write) makes the stdin pipe emit an asynchronous 'error' (EPIPE).
|
|
310
|
+
// An 'error' event with no listener is an uncaught exception in Node and
|
|
311
|
+
// would CRASH the whole CLI — and the try/catch around stdin.write only
|
|
312
|
+
// catches synchronous throws, not this async event. Handle it: drain
|
|
313
|
+
// in-flight requests and surface it, mirroring the process 'error' path.
|
|
314
|
+
if (proc.stdin && typeof proc.stdin.on === "function") {
|
|
315
|
+
proc.stdin.on("error", (err) => {
|
|
316
|
+
entry.state = ServerState.ERROR;
|
|
317
|
+
failPending(`MCP server "${name}" stdin error: ${err.message}`);
|
|
318
|
+
this.emit("server-error", { name, error: err.message });
|
|
319
|
+
});
|
|
320
|
+
}
|
|
296
321
|
} else {
|
|
297
322
|
throw new Error(
|
|
298
323
|
`transport "${transportKind}" is not supported by this client`,
|
|
@@ -384,6 +409,7 @@ export class MCPClient extends EventEmitter {
|
|
|
384
409
|
try {
|
|
385
410
|
entry.process.stdout?.removeAllListeners();
|
|
386
411
|
entry.process.stderr?.removeAllListeners();
|
|
412
|
+
entry.process.stdin?.removeAllListeners?.();
|
|
387
413
|
entry.process.removeAllListeners();
|
|
388
414
|
entry.process.kill();
|
|
389
415
|
} catch {
|
|
@@ -868,6 +894,37 @@ export class MCPClient extends EventEmitter {
|
|
|
868
894
|
// Skip malformed lines
|
|
869
895
|
}
|
|
870
896
|
}
|
|
897
|
+
|
|
898
|
+
// Guard against unbounded buffer growth: a runaway / non-MCP server that
|
|
899
|
+
// streams without ever sending a newline would grow the unterminated tail
|
|
900
|
+
// forever and exhaust memory. If the leftover partial line exceeds the cap,
|
|
901
|
+
// treat it as a fatal transport error (drop the buffer, drain in-flight
|
|
902
|
+
// requests, kill the process) rather than letting it grow without limit.
|
|
903
|
+
const cap = Number.isFinite(entry.config?.maxBufferChars)
|
|
904
|
+
? entry.config.maxBufferChars
|
|
905
|
+
: MCP_MAX_BUFFER_CHARS;
|
|
906
|
+
if (cap > 0 && entry._buffer.length > cap) {
|
|
907
|
+
entry._buffer = "";
|
|
908
|
+
entry.state = ServerState.ERROR;
|
|
909
|
+
const errMsg = `MCP server "${serverName}" exceeded the ${cap}-char line buffer with no newline (runaway or non-MCP output)`;
|
|
910
|
+
for (const [, pending] of entry._pending) {
|
|
911
|
+
if (pending.timeout) clearTimeout(pending.timeout);
|
|
912
|
+
try {
|
|
913
|
+
pending.reject(new Error(errMsg));
|
|
914
|
+
} catch {
|
|
915
|
+
// already settled — ignore
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
entry._pending.clear();
|
|
919
|
+
if (entry.process) {
|
|
920
|
+
try {
|
|
921
|
+
entry.process.kill();
|
|
922
|
+
} catch {
|
|
923
|
+
// best-effort — surfacing the error is what matters
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
this.emit("server-error", { name: serverName, error: errMsg });
|
|
927
|
+
}
|
|
871
928
|
}
|
|
872
929
|
|
|
873
930
|
_handleMessage(serverName, msg) {
|