@yancyyu/openhermit 1.6.30 → 1.6.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist-renderer/assets/{ProjectEditorOverlay-DsQt4FHy.js → ProjectEditorOverlay-DwWYwUf8.js} +1 -1
  2. package/dist-renderer/assets/{TeamGraphOverlay-BjZC53xf.js → TeamGraphOverlay-BK6PUN3W.js} +1 -1
  3. package/dist-renderer/assets/{_basePickBy-CrWocIjq.js → _basePickBy-DdNwxEcj.js} +1 -1
  4. package/dist-renderer/assets/{_baseUniq-B6d8ysWi.js → _baseUniq-BKO88SUv.js} +1 -1
  5. package/dist-renderer/assets/{arc-DAIYCFP8.js → arc-8OCcRtx5.js} +1 -1
  6. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-B3UudXJh.js → architectureDiagram-VXUJARFQ-BaVzqHNU.js} +1 -1
  7. package/dist-renderer/assets/{blockDiagram-VD42YOAC-DbptKQ4W.js → blockDiagram-VD42YOAC-BlD3aS2M.js} +1 -1
  8. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-C4WQuZpV.js → c4Diagram-YG6GDRKO-CWhysgWg.js} +1 -1
  9. package/dist-renderer/assets/channel-VSASRd7w.js +1 -0
  10. package/dist-renderer/assets/{chunk-4BX2VUAB-Dp7fVpI_.js → chunk-4BX2VUAB-39vXfQp7.js} +1 -1
  11. package/dist-renderer/assets/{chunk-55IACEB6-B8KGfbAy.js → chunk-55IACEB6-uCvPl6T8.js} +1 -1
  12. package/dist-renderer/assets/{chunk-B4BG7PRW-BG1oJrjA.js → chunk-B4BG7PRW-BrGj559B.js} +1 -1
  13. package/dist-renderer/assets/{chunk-DI55MBZ5-DRmxNjht.js → chunk-DI55MBZ5-Djfr1KmT.js} +1 -1
  14. package/dist-renderer/assets/{chunk-FMBD7UC4-D6VLvy16.js → chunk-FMBD7UC4-Cv2iCCiq.js} +1 -1
  15. package/dist-renderer/assets/{chunk-QN33PNHL-DZou1667.js → chunk-QN33PNHL-CXzDZbbd.js} +1 -1
  16. package/dist-renderer/assets/{chunk-QZHKN3VN-CghmasSh.js → chunk-QZHKN3VN-CRO6vWKS.js} +1 -1
  17. package/dist-renderer/assets/{chunk-TZMSLE5B-B7apcMPK.js → chunk-TZMSLE5B-D5Luxvqw.js} +1 -1
  18. package/dist-renderer/assets/classDiagram-2ON5EDUG-CZKOiI95.js +1 -0
  19. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-CZKOiI95.js +1 -0
  20. package/dist-renderer/assets/clone-CEVt7zS8.js +1 -0
  21. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-05e5uQDp.js → cose-bilkent-S5V4N54A-BrIj9YHY.js} +1 -1
  22. package/dist-renderer/assets/{dagre-6UL2VRFP-B06bRykF.js → dagre-6UL2VRFP-BFPvK4JJ.js} +1 -1
  23. package/dist-renderer/assets/{diagram-PSM6KHXK-CY7VYQ7c.js → diagram-PSM6KHXK-CTyUB42n.js} +1 -1
  24. package/dist-renderer/assets/{diagram-QEK2KX5R-BjKEH7dD.js → diagram-QEK2KX5R-V9DMzwyh.js} +1 -1
  25. package/dist-renderer/assets/{diagram-S2PKOQOG-Bf4ELS1_.js → diagram-S2PKOQOG-D8fWNJWp.js} +1 -1
  26. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-DJ753_L9.js → erDiagram-Q2GNP2WA-C69oTboq.js} +1 -1
  27. package/dist-renderer/assets/{flowDiagram-NV44I4VS-B71S-lC-.js → flowDiagram-NV44I4VS-C8MnYH3t.js} +1 -1
  28. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-C_U42mSZ.js → ganttDiagram-JELNMOA3-DnRfBK-T.js} +1 -1
  29. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DKUJU4Ns.js → gitGraphDiagram-V2S2FVAM-BzUxkq9s.js} +1 -1
  30. package/dist-renderer/assets/{graph-DY3qbzqj.js → graph-DUpjXmIN.js} +1 -1
  31. package/dist-renderer/assets/{index-C8B_nKOF.js → index-BnyC9eDn.js} +1 -1
  32. package/dist-renderer/assets/{index-BlOrAXp3.js → index-CP1a4BYJ.js} +569 -569
  33. package/dist-renderer/assets/index-CSt8DTcn.css +1 -0
  34. package/dist-renderer/assets/{index-Bs27J5gB.js → index-CWP6WvZl.js} +1 -1
  35. package/dist-renderer/assets/{index-DLKyDr4T.js → index-D_f0E90u.js} +1 -1
  36. package/dist-renderer/assets/{index-Dhsk3_DD.js → index-F0-beTLg.js} +1 -1
  37. package/dist-renderer/assets/{index-GpUvV2xs.js → index-pIDl3FPP.js} +1 -1
  38. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-BNs0y3IG.js → infoDiagram-HS3SLOUP-B43WMCmB.js} +1 -1
  39. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-CqPnw4UV.js → journeyDiagram-XKPGCS4Q-DjfJCd1x.js} +1 -1
  40. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-SLlzcUJ2.js → kanban-definition-3W4ZIXB7-CjRQqAUU.js} +1 -1
  41. package/dist-renderer/assets/{layout-BZLlNmbr.js → layout-DmcOdDIQ.js} +1 -1
  42. package/dist-renderer/assets/{linear-qz6v45xy.js → linear-DP0CqQZK.js} +1 -1
  43. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-B1-kmEWV.js → mindmap-definition-VGOIOE7T-BMvf_dPT.js} +1 -1
  44. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-B8a02iNx.js → pieDiagram-ADFJNKIX-C2eg65Te.js} +1 -1
  45. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BKv1Xfou.js → quadrantDiagram-AYHSOK5B-DsWbG3ez.js} +1 -1
  46. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-B3DUpZi2.js → requirementDiagram-UZGBJVZJ-DU1uyMjP.js} +1 -1
  47. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-DmPzuTsy.js → sankeyDiagram-TZEHDZUN-DJVBJwOK.js} +1 -1
  48. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-Bo7RelRb.js → sequenceDiagram-WL72ISMW-CfRnIrs0.js} +1 -1
  49. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-1epX98gV.js → stateDiagram-FKZM4ZOC-cNHRId0N.js} +1 -1
  50. package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-03Ym9PTr.js → stateDiagram-v2-4FDKWEC3-SBUDuLpP.js} +1 -1
  51. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-r6isC62H.js → timeline-definition-IT6M3QCI-PwVrIKR_.js} +1 -1
  52. package/dist-renderer/assets/treemap-GDKQZRPO-Dtx0XOre.js +162 -0
  53. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-t4-rwdAw.js → xychartDiagram-PRI3JC2R-CqS3H24Y.js} +1 -1
  54. package/dist-renderer/index.html +2 -2
  55. package/package.json +1 -1
  56. package/src/renderer/components/extensions/ExtensionStoreView.tsx +4 -1
  57. package/src/renderer/components/extensions/mcp/McpServerDetailDialog.tsx +100 -15
  58. package/src/renderer/components/team/TeamDetailView.tsx +55 -139
  59. package/src/renderer/components/team/TeamListFilterPopover.tsx +0 -16
  60. package/src/renderer/components/team/TeamListView.tsx +7 -32
  61. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +283 -409
  62. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +280 -0
  63. package/src/renderer/utils/multimodelProviderVisibility.ts +17 -0
  64. package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +29 -9
  65. package/dist-renderer/assets/channel-DbjZvWii.js +0 -1
  66. package/dist-renderer/assets/classDiagram-2ON5EDUG-D_FGxxsl.js +0 -1
  67. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D_FGxxsl.js +0 -1
  68. package/dist-renderer/assets/clone-CJ1kxO2J.js +0 -1
  69. package/dist-renderer/assets/index-CmZPUEhS.css +0 -1
  70. package/dist-renderer/assets/treemap-GDKQZRPO-CGKpOUF2.js +0 -162
@@ -1,4 +1,4 @@
1
- import{_ as a,A as ei,B as si,Z as Lt,Y as ni,C as ai,D as ri,I as Et,ae as oi,J as hi,a3 as li,ab as xt,aa as It,ac as ci,av as ui,N as gi,b7 as xi,aD as Tt}from"./index-BlOrAXp3.js";import{i as di}from"./init-Gi6I4Gst.js";import{o as fi}from"./ordinal-Cboi1Yqb.js";import{l as Dt}from"./linear-qz6v45xy.js";import"./splashScene-C8lWNnm4.js";import"./defaultLocale-DX6XiGOO.js";function pi(t,i,e){t=+t,i=+i,e=(n=arguments.length)<2?(i=t,t=0,1):n<3?1:+e;for(var s=-1,n=Math.max(0,Math.ceil((i-t)/e))|0,x=new Array(n);++s<n;)x[s]=t+s*e;return x}function ht(){var t=fi().unknown(void 0),i=t.domain,e=t.range,s=0,n=1,x,g,m=!1,S=0,D=0,v=.5;delete t.unknown;function w(){var y=i().length,E=n<s,T=E?n:s,P=E?s:n;x=(P-T)/Math.max(1,y-S+D*2),m&&(x=Math.floor(x)),T+=(P-T-x*(y-S))*v,g=x*(1-S),m&&(T=Math.round(T),g=Math.round(g));var I=pi(y).map(function(p){return T+x*p});return e(E?I.reverse():I)}return t.domain=function(y){return arguments.length?(i(y),w()):i()},t.range=function(y){return arguments.length?([s,n]=y,s=+s,n=+n,w()):[s,n]},t.rangeRound=function(y){return[s,n]=y,s=+s,n=+n,m=!0,w()},t.bandwidth=function(){return g},t.step=function(){return x},t.round=function(y){return arguments.length?(m=!!y,w()):m},t.padding=function(y){return arguments.length?(S=Math.min(1,D=+y),w()):S},t.paddingInner=function(y){return arguments.length?(S=Math.min(1,y),w()):S},t.paddingOuter=function(y){return arguments.length?(D=+y,w()):D},t.align=function(y){return arguments.length?(v=Math.max(0,Math.min(1,y)),w()):v},t.copy=function(){return ht(i(),[s,n]).round(m).paddingInner(S).paddingOuter(D).align(v)},di.apply(w(),arguments)}var lt=function(){var t=a(function(O,o,c,u){for(c=c||{},u=O.length;u--;c[O[u]]=o);return c},"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],n=[1,5],x=[1,6],g=[1,7],m=[1,5,10,12,14,16,18,19,21,23,34,35,36],S=[1,25],D=[1,26],v=[1,28],w=[1,29],y=[1,30],E=[1,31],T=[1,32],P=[1,33],I=[1,34],p=[1,35],_=[1,36],l=[1,37],W=[1,43],z=[1,42],U=[1,47],X=[1,50],h=[1,10,12,14,16,18,19,21,23,34,35,36],L=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],C=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],k=[1,64],$={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(o,c,u,d,A,r,j){var f=r.length-1;switch(A){case 5:d.setOrientation(r[f]);break;case 9:d.setDiagramTitle(r[f].text.trim());break;case 12:d.setLineData({text:"",type:"text"},r[f]);break;case 13:d.setLineData(r[f-1],r[f]);break;case 14:d.setBarData({text:"",type:"text"},r[f]);break;case 15:d.setBarData(r[f-1],r[f]);break;case 16:this.$=r[f].trim(),d.setAccTitle(this.$);break;case 17:case 18:this.$=r[f].trim(),d.setAccDescription(this.$);break;case 19:this.$=r[f-1];break;case 20:this.$=[Number(r[f-2]),...r[f]];break;case 21:this.$=[Number(r[f])];break;case 22:d.setXAxisTitle(r[f]);break;case 23:d.setXAxisTitle(r[f-1]);break;case 24:d.setXAxisTitle({type:"text",text:""});break;case 25:d.setXAxisBand(r[f]);break;case 26:d.setXAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 27:this.$=r[f-1];break;case 28:this.$=[r[f-2],...r[f]];break;case 29:this.$=[r[f]];break;case 30:d.setYAxisTitle(r[f]);break;case 31:d.setYAxisTitle(r[f-1]);break;case 32:d.setYAxisTitle({type:"text",text:""});break;case 33:d.setYAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 37:this.$={text:r[f],type:"text"};break;case 38:this.$={text:r[f],type:"text"};break;case 39:this.$={text:r[f],type:"markdown"};break;case 40:this.$=r[f];break;case 41:this.$=r[f-1]+""+r[f];break}},"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:n,35:x,36:g}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:n,35:x,36:g}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:x,36:g}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(m,[2,34]),t(m,[2,35]),t(m,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:n,35:x,36:g}),{1:[2,3]},t(m,[2,5]),t(i,[2,7],{4:22,34:n,35:x,36:g}),{11:23,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:39,13:38,24:W,27:z,29:40,30:41,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:45,15:44,27:U,33:46,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:49,17:48,24:X,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:52,17:51,24:X,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{20:[1,53]},{22:[1,54]},t(h,[2,18]),{1:[2,2]},t(h,[2,8]),t(h,[2,9]),t(L,[2,37],{40:55,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l}),t(L,[2,38]),t(L,[2,39]),t(C,[2,40]),t(C,[2,42]),t(C,[2,43]),t(C,[2,44]),t(C,[2,45]),t(C,[2,46]),t(C,[2,47]),t(C,[2,48]),t(C,[2,49]),t(C,[2,50]),t(C,[2,51]),t(h,[2,10]),t(h,[2,22],{30:41,29:56,24:W,27:z}),t(h,[2,24]),t(h,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},t(h,[2,11]),t(h,[2,30],{33:60,27:U}),t(h,[2,32]),{31:[1,61]},t(h,[2,12]),{17:62,24:X},{25:63,27:k},t(h,[2,14]),{17:65,24:X},t(h,[2,16]),t(h,[2,17]),t(C,[2,41]),t(h,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(h,[2,31]),{27:[1,69]},t(h,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(h,[2,15]),t(h,[2,26]),t(h,[2,27]),{11:59,32:72,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},t(h,[2,33]),t(h,[2,19]),{25:73,27:k},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(o,c){if(c.recoverable)this.trace(o);else{var u=new Error(o);throw u.hash=c,u}},"parseError"),parse:a(function(o){var c=this,u=[0],d=[],A=[null],r=[],j=this.table,f="",J=0,St=0,Zt=2,_t=1,Jt=r.slice.call(arguments,1),R=Object.create(this.lexer),Y={yy:{}};for(var nt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,nt)&&(Y.yy[nt]=this.yy[nt]);R.setInput(o,Y.yy),Y.yy.lexer=R,Y.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var at=R.yylloc;r.push(at);var ti=R.options&&R.options.ranges;typeof Y.yy.parseError=="function"?this.parseError=Y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ii(V){u.length=u.length-2*V,A.length=A.length-V,r.length=r.length-V}a(ii,"popStack");function kt(){var V;return V=d.pop()||R.lex()||_t,typeof V!="number"&&(V instanceof Array&&(d=V,V=d.pop()),V=c.symbols_[V]||V),V}a(kt,"lex");for(var M,H,B,rt,q={},tt,F,Rt,it;;){if(H=u[u.length-1],this.defaultActions[H]?B=this.defaultActions[H]:((M===null||typeof M>"u")&&(M=kt()),B=j[H]&&j[H][M]),typeof B>"u"||!B.length||!B[0]){var ot="";it=[];for(tt in j[H])this.terminals_[tt]&&tt>Zt&&it.push("'"+this.terminals_[tt]+"'");R.showPosition?ot="Parse error on line "+(J+1)+`:
1
+ import{_ as a,A as ei,B as si,Z as Lt,Y as ni,C as ai,D as ri,I as Et,ae as oi,J as hi,a3 as li,ab as xt,aa as It,ac as ci,av as ui,N as gi,b7 as xi,aD as Tt}from"./index-CP1a4BYJ.js";import{i as di}from"./init-Gi6I4Gst.js";import{o as fi}from"./ordinal-Cboi1Yqb.js";import{l as Dt}from"./linear-DP0CqQZK.js";import"./splashScene-C8lWNnm4.js";import"./defaultLocale-DX6XiGOO.js";function pi(t,i,e){t=+t,i=+i,e=(n=arguments.length)<2?(i=t,t=0,1):n<3?1:+e;for(var s=-1,n=Math.max(0,Math.ceil((i-t)/e))|0,x=new Array(n);++s<n;)x[s]=t+s*e;return x}function ht(){var t=fi().unknown(void 0),i=t.domain,e=t.range,s=0,n=1,x,g,m=!1,S=0,D=0,v=.5;delete t.unknown;function w(){var y=i().length,E=n<s,T=E?n:s,P=E?s:n;x=(P-T)/Math.max(1,y-S+D*2),m&&(x=Math.floor(x)),T+=(P-T-x*(y-S))*v,g=x*(1-S),m&&(T=Math.round(T),g=Math.round(g));var I=pi(y).map(function(p){return T+x*p});return e(E?I.reverse():I)}return t.domain=function(y){return arguments.length?(i(y),w()):i()},t.range=function(y){return arguments.length?([s,n]=y,s=+s,n=+n,w()):[s,n]},t.rangeRound=function(y){return[s,n]=y,s=+s,n=+n,m=!0,w()},t.bandwidth=function(){return g},t.step=function(){return x},t.round=function(y){return arguments.length?(m=!!y,w()):m},t.padding=function(y){return arguments.length?(S=Math.min(1,D=+y),w()):S},t.paddingInner=function(y){return arguments.length?(S=Math.min(1,y),w()):S},t.paddingOuter=function(y){return arguments.length?(D=+y,w()):D},t.align=function(y){return arguments.length?(v=Math.max(0,Math.min(1,y)),w()):v},t.copy=function(){return ht(i(),[s,n]).round(m).paddingInner(S).paddingOuter(D).align(v)},di.apply(w(),arguments)}var lt=function(){var t=a(function(O,o,c,u){for(c=c||{},u=O.length;u--;c[O[u]]=o);return c},"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],n=[1,5],x=[1,6],g=[1,7],m=[1,5,10,12,14,16,18,19,21,23,34,35,36],S=[1,25],D=[1,26],v=[1,28],w=[1,29],y=[1,30],E=[1,31],T=[1,32],P=[1,33],I=[1,34],p=[1,35],_=[1,36],l=[1,37],W=[1,43],z=[1,42],U=[1,47],X=[1,50],h=[1,10,12,14,16,18,19,21,23,34,35,36],L=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],C=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],k=[1,64],$={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(o,c,u,d,A,r,j){var f=r.length-1;switch(A){case 5:d.setOrientation(r[f]);break;case 9:d.setDiagramTitle(r[f].text.trim());break;case 12:d.setLineData({text:"",type:"text"},r[f]);break;case 13:d.setLineData(r[f-1],r[f]);break;case 14:d.setBarData({text:"",type:"text"},r[f]);break;case 15:d.setBarData(r[f-1],r[f]);break;case 16:this.$=r[f].trim(),d.setAccTitle(this.$);break;case 17:case 18:this.$=r[f].trim(),d.setAccDescription(this.$);break;case 19:this.$=r[f-1];break;case 20:this.$=[Number(r[f-2]),...r[f]];break;case 21:this.$=[Number(r[f])];break;case 22:d.setXAxisTitle(r[f]);break;case 23:d.setXAxisTitle(r[f-1]);break;case 24:d.setXAxisTitle({type:"text",text:""});break;case 25:d.setXAxisBand(r[f]);break;case 26:d.setXAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 27:this.$=r[f-1];break;case 28:this.$=[r[f-2],...r[f]];break;case 29:this.$=[r[f]];break;case 30:d.setYAxisTitle(r[f]);break;case 31:d.setYAxisTitle(r[f-1]);break;case 32:d.setYAxisTitle({type:"text",text:""});break;case 33:d.setYAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 37:this.$={text:r[f],type:"text"};break;case 38:this.$={text:r[f],type:"text"};break;case 39:this.$={text:r[f],type:"markdown"};break;case 40:this.$=r[f];break;case 41:this.$=r[f-1]+""+r[f];break}},"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:n,35:x,36:g}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:n,35:x,36:g}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:x,36:g}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(m,[2,34]),t(m,[2,35]),t(m,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:n,35:x,36:g}),{1:[2,3]},t(m,[2,5]),t(i,[2,7],{4:22,34:n,35:x,36:g}),{11:23,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:39,13:38,24:W,27:z,29:40,30:41,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:45,15:44,27:U,33:46,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:49,17:48,24:X,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{11:52,17:51,24:X,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},{20:[1,53]},{22:[1,54]},t(h,[2,18]),{1:[2,2]},t(h,[2,8]),t(h,[2,9]),t(L,[2,37],{40:55,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l}),t(L,[2,38]),t(L,[2,39]),t(C,[2,40]),t(C,[2,42]),t(C,[2,43]),t(C,[2,44]),t(C,[2,45]),t(C,[2,46]),t(C,[2,47]),t(C,[2,48]),t(C,[2,49]),t(C,[2,50]),t(C,[2,51]),t(h,[2,10]),t(h,[2,22],{30:41,29:56,24:W,27:z}),t(h,[2,24]),t(h,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},t(h,[2,11]),t(h,[2,30],{33:60,27:U}),t(h,[2,32]),{31:[1,61]},t(h,[2,12]),{17:62,24:X},{25:63,27:k},t(h,[2,14]),{17:65,24:X},t(h,[2,16]),t(h,[2,17]),t(C,[2,41]),t(h,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(h,[2,31]),{27:[1,69]},t(h,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(h,[2,15]),t(h,[2,26]),t(h,[2,27]),{11:59,32:72,37:24,38:S,39:D,40:27,41:v,42:w,43:y,44:E,45:T,46:P,47:I,48:p,49:_,50:l},t(h,[2,33]),t(h,[2,19]),{25:73,27:k},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(o,c){if(c.recoverable)this.trace(o);else{var u=new Error(o);throw u.hash=c,u}},"parseError"),parse:a(function(o){var c=this,u=[0],d=[],A=[null],r=[],j=this.table,f="",J=0,St=0,Zt=2,_t=1,Jt=r.slice.call(arguments,1),R=Object.create(this.lexer),Y={yy:{}};for(var nt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,nt)&&(Y.yy[nt]=this.yy[nt]);R.setInput(o,Y.yy),Y.yy.lexer=R,Y.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var at=R.yylloc;r.push(at);var ti=R.options&&R.options.ranges;typeof Y.yy.parseError=="function"?this.parseError=Y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ii(V){u.length=u.length-2*V,A.length=A.length-V,r.length=r.length-V}a(ii,"popStack");function kt(){var V;return V=d.pop()||R.lex()||_t,typeof V!="number"&&(V instanceof Array&&(d=V,V=d.pop()),V=c.symbols_[V]||V),V}a(kt,"lex");for(var M,H,B,rt,q={},tt,F,Rt,it;;){if(H=u[u.length-1],this.defaultActions[H]?B=this.defaultActions[H]:((M===null||typeof M>"u")&&(M=kt()),B=j[H]&&j[H][M]),typeof B>"u"||!B.length||!B[0]){var ot="";it=[];for(tt in j[H])this.terminals_[tt]&&tt>Zt&&it.push("'"+this.terminals_[tt]+"'");R.showPosition?ot="Parse error on line "+(J+1)+`:
2
2
  `+R.showPosition()+`
3
3
  Expecting `+it.join(", ")+", got '"+(this.terminals_[M]||M)+"'":ot="Parse error on line "+(J+1)+": Unexpected "+(M==_t?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(ot,{text:R.match,token:this.terminals_[M]||M,line:R.yylineno,loc:at,expected:it})}if(B[0]instanceof Array&&B.length>1)throw new Error("Parse Error: multiple actions possible at state: "+H+", token: "+M);switch(B[0]){case 1:u.push(M),A.push(R.yytext),r.push(R.yylloc),u.push(B[1]),M=null,St=R.yyleng,f=R.yytext,J=R.yylineno,at=R.yylloc;break;case 2:if(F=this.productions_[B[1]][1],q.$=A[A.length-F],q._$={first_line:r[r.length-(F||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(F||1)].first_column,last_column:r[r.length-1].last_column},ti&&(q._$.range=[r[r.length-(F||1)].range[0],r[r.length-1].range[1]]),rt=this.performAction.apply(q,[f,St,J,Y.yy,B[1],A,r].concat(Jt)),typeof rt<"u")return rt;F&&(u=u.slice(0,-1*F*2),A=A.slice(0,-1*F),r=r.slice(0,-1*F)),u.push(this.productions_[B[1]][0]),A.push(q.$),r.push(q._$),Rt=j[u[u.length-2]][u[u.length-1]],u.push(Rt);break;case 3:return!0}}return!0},"parse")},Ct=function(){var O={EOF:1,parseError:a(function(c,u){if(this.yy.parser)this.yy.parser.parseError(c,u);else throw new Error(c)},"parseError"),setInput:a(function(o,c){return this.yy=c||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var c=o.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:a(function(o){var c=o.length,u=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),u.length-1&&(this.yylineno-=u.length-1);var A=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:u?(u.length===d.length?this.yylloc.first_column:0)+d[d.length-u.length].length-u[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[A[0],A[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
4
4
  `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(o){this.unput(this.match.slice(o))},"less"),pastInput:a(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var o=this.pastInput(),c=new Array(o.length+1).join("-");return o+this.upcomingInput()+`
@@ -353,9 +353,9 @@
353
353
  } catch (e) {}
354
354
  })();
355
355
  </script>
356
- <script type="module" crossorigin src="/assets/index-BlOrAXp3.js"></script>
356
+ <script type="module" crossorigin src="/assets/index-CP1a4BYJ.js"></script>
357
357
  <link rel="modulepreload" crossorigin href="/assets/splashScene-C8lWNnm4.js">
358
- <link rel="stylesheet" crossorigin href="/assets/index-CmZPUEhS.css">
358
+ <link rel="stylesheet" crossorigin href="/assets/index-CSt8DTcn.css">
359
359
  </head>
360
360
  <body>
361
361
  <div id="splash">
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yancyyu/openhermit",
3
3
  "type": "module",
4
- "version": "1.6.30",
4
+ "version": "1.6.32",
5
5
  "description": "openHermit: team-oriented agent management workbench atop cc-connect.",
6
6
  "license": "AGPL-3.0",
7
7
  "author": {
@@ -30,6 +30,7 @@ import { useExtensionsTabState } from '@renderer/hooks/useExtensionsTabState';
30
30
  import { useStore } from '@renderer/store';
31
31
  import { createLoadingMultimodelCliStatus } from '@renderer/store/slices/cliInstallerSlice';
32
32
  import {
33
+ filterExtensionStoreProviders,
33
34
  formatCliExtensionCapabilityStatus,
34
35
  getVisibleMultimodelProviders,
35
36
  isMultimodelRuntimeStatus,
@@ -291,7 +292,9 @@ export const ExtensionStoreView = (): React.JSX.Element => {
291
292
  const isRefreshing = effectiveCliStatusLoading || mcpBrowseLoading || skillsLoading;
292
293
  const cliStatusBanner = useMemo(() => {
293
294
  const providers = effectiveCliStatus?.providers ?? [];
294
- const visibleProviders = getVisibleMultimodelProviders(providers);
295
+ const visibleProviders = filterExtensionStoreProviders(
296
+ getVisibleMultimodelProviders(providers)
297
+ );
295
298
  const isMultimodel = isMultimodelRuntimeStatus(effectiveCliStatus);
296
299
  const shouldShowMultimodelProviderCards =
297
300
  isMultimodel && visibleProviders.length > 0 && effectiveCliStatus !== null;
@@ -15,6 +15,12 @@ import {
15
15
  DialogHeader,
16
16
  DialogTitle,
17
17
  } from '@renderer/components/ui/dialog';
18
+ import {
19
+ Tooltip,
20
+ TooltipContent,
21
+ TooltipProvider,
22
+ TooltipTrigger,
23
+ } from '@renderer/components/ui/tooltip';
18
24
  import { Input } from '@renderer/components/ui/input';
19
25
  import { Label } from '@renderer/components/ui/label';
20
26
  import {
@@ -26,6 +32,7 @@ import {
26
32
  } from '@renderer/components/ui/select';
27
33
  import { useStore } from '@renderer/store';
28
34
  import {
35
+ getExtensionActionDisableReason,
29
36
  getMcpInstallationSummaryLabel,
30
37
  getMcpOperationKey,
31
38
  getPreferredMcpInstallationEntry,
@@ -37,7 +44,7 @@ import {
37
44
  isProjectScopedMcpScope,
38
45
  isSharedMcpScope,
39
46
  } from '@shared/utils/mcpScopes';
40
- import { ExternalLink, Lock, Plus, Star, Trash2, Wrench } from 'lucide-react';
47
+ import { Check, ExternalLink, Loader2, Lock, Plus, Star, Trash2, Wrench } from 'lucide-react';
41
48
 
42
49
  import { InstallButton } from '../common/InstallButton';
43
50
  import { HarnessSelector } from '../common/HarnessSelector';
@@ -256,6 +263,18 @@ export const McpServerDetailDialog = ({
256
263
  missingRequiredEnvVars ||
257
264
  missingRequiredHeaders ||
258
265
  scopeRequiresProjectPath;
266
+ const installCliDisableReason = getExtensionActionDisableReason({
267
+ isInstalled: false,
268
+ cliStatus,
269
+ cliStatusLoading: cliStatusLoading ?? false,
270
+ section: 'mcp',
271
+ });
272
+ const uninstallCliDisableReason = getExtensionActionDisableReason({
273
+ isInstalled: true,
274
+ cliStatus,
275
+ cliStatusLoading: cliStatusLoading ?? false,
276
+ section: 'mcp',
277
+ });
259
278
  const diagnosticBadgeClass =
260
279
  diagnostic?.status === 'connected'
261
280
  ? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-400'
@@ -599,20 +618,86 @@ export const McpServerDetailDialog = ({
599
618
  </div>
600
619
  )}
601
620
 
602
- {/* Install/Uninstall button */}
603
- <div className="flex justify-end pt-1">
604
- <InstallButton
605
- state={installProgress}
606
- isInstalled={isInstalledForScope}
607
- section="mcp"
608
- cliStatus={cliStatus}
609
- cliStatusLoading={cliStatusLoading}
610
- onInstall={handleInstall}
611
- onUninstall={handleUninstall}
612
- disabled={installDisabled}
613
- size="default"
614
- errorMessage={installError}
615
- />
621
+ {/* Install / Save & Restart / Uninstall */}
622
+ <div className="flex items-center justify-end gap-2 pt-1">
623
+ {isInstalledForScope ? (
624
+ <>
625
+ <Button
626
+ variant="ghost"
627
+ size="sm"
628
+ className="border-red-500/30 text-red-400 hover:bg-red-500/10"
629
+ data-testid="uninstall-button"
630
+ onClick={handleUninstall}
631
+ disabled={Boolean(uninstallCliDisableReason)}
632
+ >
633
+ <Trash2 className="size-3.5" />
634
+ <span className="ml-1.5">卸载</span>
635
+ </Button>
636
+ {installProgress === 'pending' ? (
637
+ <Button size="default" disabled>
638
+ <Loader2 className="size-3.5 animate-spin" />
639
+ <span className="ml-1.5">保存并重启中...</span>
640
+ </Button>
641
+ ) : installProgress === 'success' ? (
642
+ <Button size="default" disabled className="text-green-400">
643
+ <Check className="size-3.5" />
644
+ <span className="ml-1.5">完成</span>
645
+ </Button>
646
+ ) : installProgress === 'error' ? (
647
+ <div className="flex max-w-64 flex-col items-end gap-1">
648
+ <TooltipProvider>
649
+ <Tooltip>
650
+ <TooltipTrigger asChild>
651
+ <span tabIndex={0}>
652
+ <Button
653
+ size="default"
654
+ variant="outline"
655
+ className="border-red-500/30 text-red-400 hover:bg-red-500/10"
656
+ onClick={handleInstall}
657
+ disabled={installDisabled || Boolean(installCliDisableReason)}
658
+ >
659
+ 保存并重启
660
+ </Button>
661
+ </span>
662
+ </TooltipTrigger>
663
+ {installError && (
664
+ <TooltipContent className="max-w-64 text-red-300">
665
+ {installError}
666
+ </TooltipContent>
667
+ )}
668
+ </Tooltip>
669
+ </TooltipProvider>
670
+ {installError && (
671
+ <p className="text-right text-[11px] leading-4 text-red-300">
672
+ {installError}
673
+ </p>
674
+ )}
675
+ </div>
676
+ ) : (
677
+ <Button
678
+ size="default"
679
+ data-testid="save-restart-button"
680
+ onClick={handleInstall}
681
+ disabled={installDisabled || Boolean(installCliDisableReason)}
682
+ >
683
+ 保存并重启
684
+ </Button>
685
+ )}
686
+ </>
687
+ ) : (
688
+ <InstallButton
689
+ state={installProgress}
690
+ isInstalled={false}
691
+ section="mcp"
692
+ cliStatus={cliStatus}
693
+ cliStatusLoading={cliStatusLoading}
694
+ onInstall={handleInstall}
695
+ onUninstall={handleUninstall}
696
+ disabled={installDisabled}
697
+ size="default"
698
+ errorMessage={installError}
699
+ />
700
+ )}
616
701
  </div>
617
702
  </div>
618
703
  )}
@@ -22,6 +22,7 @@ import {
22
22
  DialogHeader,
23
23
  DialogTitle,
24
24
  } from '@renderer/components/ui/dialog';
25
+ import { Popover, PopoverContent, PopoverTrigger } from '@renderer/components/ui/popover';
25
26
  import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
26
27
  import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors';
27
28
  import { useTabIdOptional } from '@renderer/contexts/useTabUIContext';
@@ -69,6 +70,7 @@ import {
69
70
  Trash2,
70
71
  Loader2,
71
72
  MessageSquare,
73
+ MoreHorizontal,
72
74
  Shield,
73
75
  Users,
74
76
  } from 'lucide-react';
@@ -883,22 +885,7 @@ export const TeamDetailView = ({
883
885
  const [updatingRoleLoading, setUpdatingRoleLoading] = useState(false);
884
886
  const [editDialogOpen, setEditDialogOpen] = useState(false);
885
887
  const [envDialogOpen, setEnvDialogOpen] = useState(false);
886
- const [savedLaunchRequest, setSavedLaunchRequest] = useState<TeamLaunchRequest | null>(null);
887
- useEffect(() => {
888
- if (!editDialogOpen || !teamName) return;
889
- let cancelled = false;
890
- void (async () => {
891
- try {
892
- const saved = await api.teams.getSavedRequest(teamName);
893
- if (!cancelled) setSavedLaunchRequest(saved ?? null);
894
- } catch {
895
- if (!cancelled) setSavedLaunchRequest(null);
896
- }
897
- })();
898
- return () => {
899
- cancelled = true;
900
- };
901
- }, [editDialogOpen, teamName]);
888
+ const [headerMenuOpen, setHeaderMenuOpen] = useState(false);
902
889
  const [launchDialogState, setLaunchDialogState] = useState<{
903
890
  open: boolean;
904
891
  mode: TeamLaunchDialogMode;
@@ -1643,11 +1630,7 @@ export const TeamDetailView = ({
1643
1630
 
1644
1631
  const handleRestartTeamFromEdit = useCallback(async (): Promise<void> => {
1645
1632
  await api.ccSettings.restart();
1646
- // Wait for cc-connect to come back, then refresh
1647
- setTimeout(() => {
1648
- void fetchTeams();
1649
- void selectTeam(teamName);
1650
- }, 3000);
1633
+ await Promise.all([fetchTeams(), selectTeam(teamName)]);
1651
1634
  }, [fetchTeams, selectTeam, teamName]);
1652
1635
 
1653
1636
  const handleSaveAndRestartFromEdit = useCallback(
@@ -2089,24 +2072,6 @@ export const TeamDetailView = ({
2089
2072
  const headerColorSet = data.config.color
2090
2073
  ? getTeamColorSet(data.config.color)
2091
2074
  : nameColorSet(data.config.name);
2092
- const rawTeamSettings = (data.settings ?? {}) as Record<string, unknown>;
2093
- const currentManagedSources =
2094
- data.config.managedSources ??
2095
- (typeof rawTeamSettings.admin_from === 'string' ? rawTeamSettings.admin_from : '*');
2096
- const currentDisabledCommands =
2097
- data.config.disabledCommands ??
2098
- (Array.isArray(rawTeamSettings.disabled_commands)
2099
- ? rawTeamSettings.disabled_commands.filter(
2100
- (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0
2101
- )
2102
- : []);
2103
- const currentPlatformAllowFrom =
2104
- data.config.platformAllowFrom ??
2105
- (typeof rawTeamSettings.platform_allow_from === 'object' &&
2106
- rawTeamSettings.platform_allow_from !== null &&
2107
- !Array.isArray(rawTeamSettings.platform_allow_from)
2108
- ? (rawTeamSettings.platform_allow_from as Record<string, string>)
2109
- : {});
2110
2075
 
2111
2076
  return (
2112
2077
  <>
@@ -2158,52 +2123,55 @@ export const TeamDetailView = ({
2158
2123
  </div>
2159
2124
  </div>
2160
2125
  <div className="flex shrink-0 items-center gap-1.5">
2161
- {data.config.projectPath && (
2162
- <Tooltip>
2163
- <TooltipTrigger asChild>
2164
- <Button
2165
- variant="ghost"
2166
- size="sm"
2167
- className="h-7 gap-1 px-2 text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
2168
- onClick={() => setEnvDialogOpen(true)}
2169
- >
2170
- <Shield size={12} />
2171
- </Button>
2172
- </TooltipTrigger>
2173
- <TooltipContent side="bottom">环境变量</TooltipContent>
2174
- </Tooltip>
2175
- )}
2176
- <Tooltip>
2177
- <TooltipTrigger asChild>
2126
+ <Button
2127
+ variant="outline"
2128
+ size="sm"
2129
+ className="h-7 gap-1.5 px-2.5 text-xs text-[var(--color-text-secondary)]"
2130
+ disabled={isTeamProvisioning}
2131
+ onClick={() => setEditDialogOpen(true)}
2132
+ >
2133
+ <Pencil size={12} />
2134
+ 编辑
2135
+ </Button>
2136
+ <Popover open={headerMenuOpen} onOpenChange={setHeaderMenuOpen}>
2137
+ <PopoverTrigger asChild>
2178
2138
  <Button
2179
2139
  variant="ghost"
2180
2140
  size="sm"
2181
- className="h-7 gap-1 px-2 text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
2182
- disabled={isTeamProvisioning}
2183
- onClick={() => setEditDialogOpen(true)}
2141
+ className="h-7 w-7 px-0 text-[var(--color-text-muted)]"
2184
2142
  >
2185
- <Pencil size={12} />
2143
+ <MoreHorizontal size={14} />
2186
2144
  </Button>
2187
- </TooltipTrigger>
2188
- <TooltipContent side="bottom">
2189
- {isTeamProvisioning ? '团队仍在编排中,暂时无法编辑' : '编辑团队'}
2190
- </TooltipContent>
2191
- </Tooltip>
2192
- {teamName !== 'default' && teamName !== 'my-project' && (
2193
- <Tooltip>
2194
- <TooltipTrigger asChild>
2195
- <Button
2196
- variant="ghost"
2197
- size="sm"
2198
- className="h-7 gap-1 px-2 text-xs text-red-400 hover:bg-red-500/10 hover:text-red-300"
2199
- onClick={handleDeleteTeam}
2145
+ </PopoverTrigger>
2146
+ <PopoverContent align="end" className="w-44 p-1">
2147
+ {data.config.projectPath && (
2148
+ <button
2149
+ type="button"
2150
+ className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)] hover:text-[var(--color-text)]"
2151
+ onClick={() => {
2152
+ setHeaderMenuOpen(false);
2153
+ setEnvDialogOpen(true);
2154
+ }}
2200
2155
  >
2201
- <Trash2 size={12} />
2202
- </Button>
2203
- </TooltipTrigger>
2204
- <TooltipContent side="bottom">删除团队</TooltipContent>
2205
- </Tooltip>
2206
- )}
2156
+ <Shield size={13} />
2157
+ 环境变量
2158
+ </button>
2159
+ )}
2160
+ {teamName !== 'default' && teamName !== 'my-project' && (
2161
+ <button
2162
+ type="button"
2163
+ className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs text-red-400 hover:bg-red-500/10"
2164
+ onClick={() => {
2165
+ setHeaderMenuOpen(false);
2166
+ handleDeleteTeam();
2167
+ }}
2168
+ >
2169
+ <Trash2 size={13} />
2170
+ 删除团队
2171
+ </button>
2172
+ )}
2173
+ </PopoverContent>
2174
+ </Popover>
2207
2175
  </div>
2208
2176
  </div>
2209
2177
  {data.config.description && (
@@ -2275,10 +2243,6 @@ export const TeamDetailView = ({
2275
2243
  })()}
2276
2244
  </div>
2277
2245
 
2278
- {!data.isAlive && !isTeamProvisioning ? (
2279
- <TeamOfflineStatusBanner teamName={teamName} onLaunch={handleStartCcConnectTeam} />
2280
- ) : null}
2281
-
2282
2246
  <div ref={provisioningBannerRef}>
2283
2247
  <TeamProvisioningBanner teamName={teamName} />
2284
2248
  </div>
@@ -2616,62 +2580,6 @@ export const TeamDetailView = ({
2616
2580
  }}
2617
2581
  />
2618
2582
 
2619
- <EditTeamDialog
2620
- open={editDialogOpen}
2621
- teamName={teamName}
2622
- currentName={data.config.name}
2623
- currentDescription={data.config.description ?? ''}
2624
- currentColor={data.config.color ?? ''}
2625
- currentAgentType={data.config.agentType ?? data.harness ?? 'cursor'}
2626
- currentWorkDir={data.workDir ?? data.config.projectPath ?? ''}
2627
- currentPermissionMode={
2628
- data.config.permissionMode ?? data.permissionMode ?? 'default'
2629
- }
2630
- currentLanguage={
2631
- data.config.language ??
2632
- (typeof rawTeamSettings.language === 'string' ? rawTeamSettings.language : 'zh')
2633
- }
2634
- currentShowContextIndicator={
2635
- data.config.showContextIndicator ??
2636
- (typeof rawTeamSettings.show_context_indicator === 'boolean'
2637
- ? rawTeamSettings.show_context_indicator
2638
- : true)
2639
- }
2640
- currentReplyFooter={
2641
- data.config.replyFooter ??
2642
- (typeof rawTeamSettings.reply_footer === 'boolean'
2643
- ? rawTeamSettings.reply_footer
2644
- : true)
2645
- }
2646
- currentInjectSender={
2647
- data.config.injectSender ??
2648
- (typeof rawTeamSettings.inject_sender === 'boolean'
2649
- ? rawTeamSettings.inject_sender
2650
- : false)
2651
- }
2652
- currentManagedSources={currentManagedSources}
2653
- currentDisabledCommands={currentDisabledCommands}
2654
- currentPlatformAllowFrom={currentPlatformAllowFrom}
2655
- currentProviderRefs={data.providerRefs ?? []}
2656
- globalProviders={data.globalProviders ?? []}
2657
- currentMembers={membersWithLiveBranches.filter((m) => !isLeadMember(m))}
2658
- leadMember={membersWithLiveBranches.find((m) => isLeadMember(m)) ?? null}
2659
- resolvedMemberColorMap={resolvedMemberColorMap}
2660
- isTeamAlive={data.isAlive && !isTeamProvisioning}
2661
- isTeamProvisioning={isTeamProvisioning}
2662
- projectPath={data.config.projectPath}
2663
- savedLaunchRequest={savedLaunchRequest}
2664
- onClose={() => setEditDialogOpen(false)}
2665
- onSaved={() => {
2666
- void fetchTeams();
2667
- void selectTeam(teamName);
2668
- }}
2669
- onDeleteTeam={
2670
- teamName !== 'default' && teamName !== 'my-project' ? handleDeleteTeam : undefined
2671
- }
2672
- onRestartTeam={handleRestartTeamFromEdit}
2673
- />
2674
-
2675
2583
  <Dialog open={envDialogOpen} onOpenChange={setEnvDialogOpen}>
2676
2584
  <DialogContent className="max-h-[80vh] max-w-lg overflow-y-auto">
2677
2585
  <DialogHeader>
@@ -2863,6 +2771,14 @@ export const TeamDetailView = ({
2863
2771
  {teamAgentRuntimeWatcher}
2864
2772
  {leadContextWatcher}
2865
2773
  {renderBody()}
2774
+ <EditTeamDialog
2775
+ open={editDialogOpen}
2776
+ teamName={teamName}
2777
+ onClose={() => setEditDialogOpen(false)}
2778
+ onDeleteTeam={
2779
+ teamName !== 'default' && teamName !== 'my-project' ? handleDeleteTeam : undefined
2780
+ }
2781
+ />
2866
2782
  </>
2867
2783
  );
2868
2784
  };
@@ -79,10 +79,6 @@ export const TeamListFilterPopover = ({
79
79
  () => teams.filter((t) => aliveSet.has(t.teamName)).length,
80
80
  [teams, aliveSet]
81
81
  );
82
- const offlineCount = useMemo(
83
- () => teams.filter((t) => !aliveSet.has(t.teamName)).length,
84
- [teams, aliveSet]
85
- );
86
82
 
87
83
  return (
88
84
  <Popover>
@@ -125,18 +121,6 @@ export const TeamListFilterPopover = ({
125
121
  <span className="text-[var(--color-text-muted)]">({runningCount})</span>
126
122
  </span>
127
123
  </label>
128
- {/* eslint-disable-next-line jsx-a11y/label-has-associated-control -- Radix Checkbox renders a button, not a native input */}
129
- <label className="flex cursor-pointer items-center gap-2 rounded-md px-1 py-0.5 text-xs text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]">
130
- <Checkbox
131
- checked={filter.selectedStatuses.has('offline')}
132
- onCheckedChange={() => handleStatusToggle('offline')}
133
- />
134
- <span className="flex items-center gap-1.5">
135
- <span className="size-1.5 rounded-full bg-zinc-500" />
136
- 离线
137
- <span className="text-[var(--color-text-muted)]">({offlineCount})</span>
138
- </span>
139
- </label>
140
124
  </div>
141
125
  </div>
142
126
 
@@ -85,7 +85,7 @@ function generateUniqueName(sourceName: string, existingNames: string[]): string
85
85
  }
86
86
  }
87
87
 
88
- type TeamStatus = 'active' | 'idle' | 'provisioning' | 'offline';
88
+ type TeamStatus = 'active' | 'idle' | 'provisioning';
89
89
 
90
90
  function getRecentProjects(team: TeamSummary): string[] {
91
91
  const history = team.projectPathHistory;
@@ -162,7 +162,7 @@ function renderMemberChips(members: TeamSummaryMember[], isLight: boolean): Reac
162
162
 
163
163
  function renderTeamRecentPaths(
164
164
  team: TeamSummary,
165
- status: TeamStatus,
165
+ status: TeamStatus | null,
166
166
  matchesCurrentProject: boolean,
167
167
  isLight: boolean
168
168
  ): React.JSX.Element | null {
@@ -211,7 +211,7 @@ function resolveTeamStatus(
211
211
  aliveTeams: string[],
212
212
  currentProgress: ReturnType<typeof getCurrentProvisioningProgressForTeam>,
213
213
  leadActivityByTeam: Record<string, string>
214
- ): TeamStatus {
214
+ ): TeamStatus | null {
215
215
  if (aliveTeams.includes(teamName)) {
216
216
  return leadActivityByTeam[teamName] === 'active' ? 'active' : 'idle';
217
217
  }
@@ -223,10 +223,11 @@ function resolveTeamStatus(
223
223
  ) {
224
224
  return 'provisioning';
225
225
  }
226
- return 'offline';
226
+ return null;
227
227
  }
228
228
 
229
- const StatusBadge = ({ status }: { status: TeamStatus }): React.JSX.Element => {
229
+ const StatusBadge = ({ status }: { status: TeamStatus | null }): React.JSX.Element | null => {
230
+ if (!status) return null;
230
231
  switch (status) {
231
232
  case 'active':
232
233
  return (
@@ -249,13 +250,6 @@ const StatusBadge = ({ status }: { status: TeamStatus }): React.JSX.Element => {
249
250
  启动中...
250
251
  </span>
251
252
  );
252
- case 'offline':
253
- return (
254
- <span className="inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-full bg-zinc-500/15 px-2 py-0.5 text-[10px] font-medium text-zinc-500">
255
- <span className="size-1.5 rounded-full bg-zinc-500" />
256
- 离线
257
- </span>
258
- );
259
253
  }
260
254
  };
261
255
 
@@ -436,9 +430,8 @@ export const TeamListView = (): React.JSX.Element => {
436
430
  getCurrentProvisioningProgressForTeam(provisioningState, t.teamName),
437
431
  leadActivityByTeam
438
432
  );
439
- const isRunning = status !== 'offline';
433
+ const isRunning = status !== null;
440
434
  if (filter.selectedStatuses.has('running') && isRunning) return true;
441
- if (filter.selectedStatuses.has('offline') && !isRunning) return true;
442
435
  return false;
443
436
  });
444
437
  }
@@ -1154,24 +1147,6 @@ export const TeamListView = (): React.JSX.Element => {
1154
1147
  })()}
1155
1148
  </div>
1156
1149
  <div className="flex shrink-0 gap-1">
1157
- {status === 'offline' && team.projectPath && (
1158
- <Tooltip>
1159
- <TooltipTrigger asChild>
1160
- <button
1161
- type="button"
1162
- className="shrink-0 rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-emerald-500/10 hover:text-emerald-300 disabled:opacity-50 group-hover:opacity-100"
1163
- onClick={(e) => handleLaunchTeam(team.teamName, team.projectPath, e)}
1164
- disabled={launchingTeamName === team.teamName}
1165
- aria-label="启动团队"
1166
- >
1167
- <Play size={14} fill="currentColor" />
1168
- </button>
1169
- </TooltipTrigger>
1170
- <TooltipContent side="bottom">
1171
- {launchingTeamName === team.teamName ? '启动中…' : '启动团队'}
1172
- </TooltipContent>
1173
- </Tooltip>
1174
- )}
1175
1150
  {!team.pendingCreate && (
1176
1151
  <Tooltip>
1177
1152
  <TooltipTrigger asChild>