@yancyyu/openhermit 1.6.35 → 1.6.37
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/dist-renderer/assets/{ProjectEditorOverlay-BBU8h6pp.js → ProjectEditorOverlay-Va_Vz-zz.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-DviQjnwH.js → TeamGraphOverlay-DYT3bwFR.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-B_f7agP8.js → _basePickBy-Dbt_EU-e.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-DGBk3mZr.js → _baseUniq-DWo68sXI.js} +1 -1
- package/dist-renderer/assets/{arc-2UGRVwiv.js → arc-DXH1iZQK.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DqE7Vw1N.js → architectureDiagram-VXUJARFQ-cjffS2Qr.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-DAX6dpgG.js → blockDiagram-VD42YOAC-BKdZF02Y.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-C5qhL3yr.js → c4Diagram-YG6GDRKO-CN27pqaI.js} +1 -1
- package/dist-renderer/assets/channel-5dJIx68e.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-Biixbxdh.js → chunk-4BX2VUAB-CXPCI7g_.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-BDcAlYn7.js → chunk-55IACEB6-BGAXQZRC.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-C_rZ7b8I.js → chunk-B4BG7PRW-TPDaA_KQ.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-YBViLugz.js → chunk-DI55MBZ5-D1ADe_tq.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-FiXmutGL.js → chunk-FMBD7UC4-Beimtg3a.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-CFzCNqlJ.js → chunk-QN33PNHL-OjNBu854.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-DfoV71f0.js → chunk-QZHKN3VN-DinqvbH8.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-YVopyvLx.js → chunk-TZMSLE5B-BfFtlPSZ.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-BMGXWJ2d.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BMGXWJ2d.js +1 -0
- package/dist-renderer/assets/clone-D7FWfGY9.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-7RuFoLzW.js → cose-bilkent-S5V4N54A-D9z9Dgt7.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-B7IUE3pr.js → dagre-6UL2VRFP-n1g-DhEE.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-DyM8ZZgC.js → diagram-PSM6KHXK-BvxFq-BE.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-CLzrWUta.js → diagram-QEK2KX5R-wVnJuwza.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-SSUCBh7f.js → diagram-S2PKOQOG-B707WJQw.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B7PcWGIQ.js → erDiagram-Q2GNP2WA-C-_1dGHs.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-rUNDdcpO.js → flowDiagram-NV44I4VS-CMTSi3H6.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-BzfrSolP.js → ganttDiagram-JELNMOA3-DZ0bNrAA.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DZ9IO5vA.js → gitGraphDiagram-V2S2FVAM-DNVfGooQ.js} +1 -1
- package/dist-renderer/assets/{graph-CvBhhc0C.js → graph-865j_tM_.js} +1 -1
- package/dist-renderer/assets/{index-CtojJjin.js → index-2EW-eu3q.js} +1 -1
- package/dist-renderer/assets/{index-DEx8WhHi.js → index-4dEMStJj.js} +1 -1
- package/dist-renderer/assets/index-B2z_IyRH.css +1 -0
- package/dist-renderer/assets/{index-D5ssA6Al.js → index-BTx1nc4T.js} +1 -1
- package/dist-renderer/assets/{index-SxtrChcF.js → index-C_F9N5x-.js} +1 -1
- package/dist-renderer/assets/{index-Ee0suYSJ.js → index-DuUaf8at.js} +1 -1
- package/dist-renderer/assets/{index-BozmwMVV.js → index-LwDIsXJN.js} +80 -80
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-BdRMXSgV.js → infoDiagram-HS3SLOUP-CyqtElLq.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-CLaOFO66.js → journeyDiagram-XKPGCS4Q-BvjQ0Hm0.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-CKZxR_rW.js → kanban-definition-3W4ZIXB7-CJJ-k0zT.js} +1 -1
- package/dist-renderer/assets/{layout-A0jB_oP8.js → layout-CnV6rQAG.js} +1 -1
- package/dist-renderer/assets/{linear-XKlvcvJO.js → linear-Cw3UQgyX.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CZeao2_i.js → mindmap-definition-VGOIOE7T-C5tDaGSK.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-Cm96woit.js → pieDiagram-ADFJNKIX-CiIpPsau.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-DCn7SS-h.js → quadrantDiagram-AYHSOK5B-C3gtowNj.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-q4usZSN4.js → requirementDiagram-UZGBJVZJ-CXBTrAnU.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-DQ3Tynxu.js → sankeyDiagram-TZEHDZUN-wziX77xG.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-CfHvWdNg.js → sequenceDiagram-WL72ISMW-sYqopcrj.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-CJ-E84Qi.js → stateDiagram-FKZM4ZOC-Bl1-0_Cp.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-DJBeQgsK.js → stateDiagram-v2-4FDKWEC3-DOYYvDbi.js} +1 -1
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-D_KgYBvU.js → timeline-definition-IT6M3QCI-CIRjJUBo.js} +1 -1
- package/dist-renderer/assets/treemap-GDKQZRPO-CVPuNe1n.js +162 -0
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-C3ig-t_y.js → xychartDiagram-PRI3JC2R-3nT9yHwp.js} +1 -1
- package/dist-renderer/index.html +2 -2
- package/package.json +19 -25
- package/src/renderer/components/team/TeamEmptyState.tsx +4 -4
- package/src/renderer/components/team/TeamListView.tsx +35 -19
- package/src/renderer/components/team/WorkerIdCard.tsx +191 -0
- package/src/shared/types/worker.ts +62 -0
- package/dist-renderer/assets/channel-C_RO45Il.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-scYPPpuL.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-scYPPpuL.js +0 -1
- package/dist-renderer/assets/clone-DP92elDG.js +0 -1
- package/dist-renderer/assets/index-CSt8DTcn.css +0 -1
- package/dist-renderer/assets/treemap-GDKQZRPO-8gb7baHk.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-
|
|
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-LwDIsXJN.js";import{i as di}from"./init-Gi6I4Gst.js";import{o as fi}from"./ordinal-Cboi1Yqb.js";import{l as Dt}from"./linear-Cw3UQgyX.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()+`
|
package/dist-renderer/index.html
CHANGED
|
@@ -353,9 +353,9 @@
|
|
|
353
353
|
} catch (e) {}
|
|
354
354
|
})();
|
|
355
355
|
</script>
|
|
356
|
-
<script type="module" crossorigin src="/assets/index-
|
|
356
|
+
<script type="module" crossorigin src="/assets/index-LwDIsXJN.js"></script>
|
|
357
357
|
<link rel="modulepreload" crossorigin href="/assets/splashScene-C8lWNnm4.js">
|
|
358
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
358
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B2z_IyRH.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.
|
|
4
|
+
"version": "1.6.37",
|
|
5
5
|
"description": "openHermit: team-oriented agent management workbench atop cc-connect.",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
7
7
|
"author": {
|
|
@@ -29,24 +29,6 @@
|
|
|
29
29
|
"package.json",
|
|
30
30
|
"README.md"
|
|
31
31
|
],
|
|
32
|
-
"scripts": {
|
|
33
|
-
"dev": "node ./scripts/dev-mvp.mjs",
|
|
34
|
-
"dev:server": "tsx watch src/main/server.ts",
|
|
35
|
-
"dev:web": "vite --config vite.web.config.ts",
|
|
36
|
-
"build:web": "vite build --config vite.web.config.ts --outDir ../../dist-renderer --emptyOutDir",
|
|
37
|
-
"postinstall": "node ./bin/postinstall.mjs",
|
|
38
|
-
"prepack": "pnpm build:web",
|
|
39
|
-
"start": "node bin/hermit.mjs",
|
|
40
|
-
"typecheck": "tsc --noEmit",
|
|
41
|
-
"lint": "eslint src/ --cache --cache-location .eslintcache --cache-strategy content",
|
|
42
|
-
"lint:fix": "eslint src/ --fix --cache --cache-location .eslintcache --cache-strategy content",
|
|
43
|
-
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
|
|
44
|
-
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
|
|
45
|
-
"test": "vitest run",
|
|
46
|
-
"test:watch": "vitest",
|
|
47
|
-
"test:coverage": "vitest run --coverage",
|
|
48
|
-
"prepare": "husky"
|
|
49
|
-
},
|
|
50
32
|
"lint-staged": {
|
|
51
33
|
"src/**/*.{ts,tsx,js,jsx}": [
|
|
52
34
|
"prettier --write"
|
|
@@ -77,7 +59,6 @@
|
|
|
77
59
|
"@codemirror/language": "^6.12.1",
|
|
78
60
|
"@codemirror/language-data": "^6.5.2",
|
|
79
61
|
"@codemirror/lint": "^6.9.5",
|
|
80
|
-
"@codemirror/merge": "^6.12.0",
|
|
81
62
|
"@codemirror/search": "^6.6.0",
|
|
82
63
|
"@codemirror/state": "^6.5.4",
|
|
83
64
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
@@ -90,7 +71,6 @@
|
|
|
90
71
|
"@floating-ui/dom": "^1.7.6",
|
|
91
72
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
92
73
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
93
|
-
"@radix-ui/react-collapsible": "^1.1.12",
|
|
94
74
|
"@radix-ui/react-context-menu": "^2.2.16",
|
|
95
75
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
96
76
|
"@radix-ui/react-hover-card": "^1.1.15",
|
|
@@ -108,7 +88,7 @@
|
|
|
108
88
|
"@tiptap/react": "^3.20.4",
|
|
109
89
|
"@tiptap/starter-kit": "^3.20.4",
|
|
110
90
|
"anser": "^2.3.5",
|
|
111
|
-
"cc-connect": "1.3.3-beta.
|
|
91
|
+
"cc-connect": "1.3.3-beta.4",
|
|
112
92
|
"chokidar": "^5.0.0",
|
|
113
93
|
"class-variance-authority": "^0.7.1",
|
|
114
94
|
"clsx": "^2.1.1",
|
|
@@ -138,7 +118,6 @@
|
|
|
138
118
|
"rehype-sanitize": "^6.0.0",
|
|
139
119
|
"remark-gfm": "^4.0.1",
|
|
140
120
|
"remark-parse": "^11.0.0",
|
|
141
|
-
"strip-markdown": "^6.0.0",
|
|
142
121
|
"tailwind-merge": "^3.5.0",
|
|
143
122
|
"tailwindcss-animate": "^1.0.7",
|
|
144
123
|
"tsx": "^4.21.0",
|
|
@@ -188,5 +167,20 @@
|
|
|
188
167
|
"vite": "^5.4.2",
|
|
189
168
|
"vitest": "^3.1.4"
|
|
190
169
|
},
|
|
191
|
-
"
|
|
192
|
-
|
|
170
|
+
"scripts": {
|
|
171
|
+
"dev": "node ./scripts/dev-mvp.mjs",
|
|
172
|
+
"dev:server": "tsx watch src/main/server.ts",
|
|
173
|
+
"dev:web": "vite --config vite.web.config.ts",
|
|
174
|
+
"build:web": "vite build --config vite.web.config.ts --outDir ../../dist-renderer --emptyOutDir",
|
|
175
|
+
"postinstall": "node ./bin/postinstall.mjs",
|
|
176
|
+
"start": "node bin/hermit.mjs",
|
|
177
|
+
"typecheck": "tsc --noEmit",
|
|
178
|
+
"lint": "eslint src/ --cache --cache-location .eslintcache --cache-strategy content",
|
|
179
|
+
"lint:fix": "eslint src/ --fix --cache --cache-location .eslintcache --cache-strategy content",
|
|
180
|
+
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
|
|
181
|
+
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
|
|
182
|
+
"test": "vitest run",
|
|
183
|
+
"test:watch": "vitest",
|
|
184
|
+
"test:coverage": "vitest run --coverage"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -31,9 +31,9 @@ export const TeamEmptyState = ({
|
|
|
31
31
|
return (
|
|
32
32
|
<div className="flex size-full flex-col items-center justify-center gap-6 px-6">
|
|
33
33
|
<div className="text-center">
|
|
34
|
-
<p className="text-lg font-medium text-[var(--color-text)]"
|
|
34
|
+
<p className="text-lg font-medium text-[var(--color-text)]">还没有数字员工</p>
|
|
35
35
|
<p className="mt-2 text-sm text-[var(--color-text-muted)]">
|
|
36
|
-
选择一种 Agent
|
|
36
|
+
选择一种 Agent 类型开始,或创建自定义数字员工。
|
|
37
37
|
</p>
|
|
38
38
|
</div>
|
|
39
39
|
|
|
@@ -71,11 +71,11 @@ export const TeamEmptyState = ({
|
|
|
71
71
|
</div>
|
|
72
72
|
|
|
73
73
|
<Button size="sm" disabled={!canCreate} onClick={onCreateTeam}>
|
|
74
|
-
|
|
74
|
+
创建自定义数字员工
|
|
75
75
|
</Button>
|
|
76
76
|
|
|
77
77
|
{!canCreate && (
|
|
78
|
-
<p className="text-xs text-[var(--color-text-muted)]"
|
|
78
|
+
<p className="text-xs text-[var(--color-text-muted)]">只有本地桌面模式支持创建数字员工。</p>
|
|
79
79
|
)}
|
|
80
80
|
</div>
|
|
81
81
|
);
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
getProjectSelectionResetState,
|
|
32
32
|
getWorktreeNavigationState,
|
|
33
33
|
} from '@renderer/store/utils/stateResetHelpers';
|
|
34
|
-
import { buildMemberColorMap } from '@renderer/utils/memberHelpers';
|
|
34
|
+
import { agentAvatarUrl, buildMemberColorMap } from '@renderer/utils/memberHelpers';
|
|
35
35
|
import { buildTaskCountsByTeam, normalizePath } from '@renderer/utils/pathNormalize';
|
|
36
36
|
import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
|
|
37
37
|
import { getBaseName } from '@renderer/utils/pathUtils';
|
|
@@ -516,7 +516,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
516
516
|
if (isDraft) {
|
|
517
517
|
const confirmed = await confirm({
|
|
518
518
|
title: '删除草稿',
|
|
519
|
-
message:
|
|
519
|
+
message: `确定删除草稿数字员工“${teamDisplayName}”吗?此操作无法撤销。`,
|
|
520
520
|
confirmLabel: '删除',
|
|
521
521
|
cancelLabel: '取消',
|
|
522
522
|
variant: 'danger',
|
|
@@ -527,8 +527,8 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
527
527
|
return;
|
|
528
528
|
}
|
|
529
529
|
const confirmed = await confirm({
|
|
530
|
-
title: '
|
|
531
|
-
message:
|
|
530
|
+
title: '删除数字员工',
|
|
531
|
+
message: `确定删除数字员工”${teamDisplayName}”吗?此操作会同步删除 cc-connect 项目并移除本地数据。`,
|
|
532
532
|
confirmLabel: '删除并重启',
|
|
533
533
|
cancelLabel: '取消',
|
|
534
534
|
variant: 'danger',
|
|
@@ -847,7 +847,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
847
847
|
<Dialog open={showTemplateDialog} onOpenChange={setShowTemplateDialog}>
|
|
848
848
|
<DialogContent className="max-w-3xl">
|
|
849
849
|
<DialogHeader>
|
|
850
|
-
<DialogTitle className="text-sm"
|
|
850
|
+
<DialogTitle className="text-sm">从模板创建数字员工</DialogTitle>
|
|
851
851
|
<DialogDescription className="text-xs">
|
|
852
852
|
从团队模板仓库读取可复用团队。默认源为 Hermit 官方团队模板
|
|
853
853
|
https://github.com/yancyuu/HermitTeams.git,仓库根目录下含有 hermit-team.json
|
|
@@ -986,7 +986,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
986
986
|
const renderHeader = (): React.JSX.Element => (
|
|
987
987
|
<div className="mb-4">
|
|
988
988
|
<div className="flex items-center justify-between">
|
|
989
|
-
<h2 className="text-base font-semibold text-[var(--color-text)]"
|
|
989
|
+
<h2 className="text-base font-semibold text-[var(--color-text)]">选择数字员工</h2>
|
|
990
990
|
<div className="flex items-center gap-2">
|
|
991
991
|
<Button variant="outline" size="sm" disabled={!canCreate} onClick={openTemplateDialog}>
|
|
992
992
|
从模板创建
|
|
@@ -997,7 +997,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
997
997
|
disabled={!canCreate}
|
|
998
998
|
onClick={() => setShowCreateDialog(true)}
|
|
999
999
|
>
|
|
1000
|
-
|
|
1000
|
+
创建数字员工
|
|
1001
1001
|
</Button>
|
|
1002
1002
|
</div>
|
|
1003
1003
|
</div>
|
|
@@ -1011,7 +1011,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1011
1011
|
/>
|
|
1012
1012
|
<Input
|
|
1013
1013
|
type="text"
|
|
1014
|
-
placeholder="
|
|
1014
|
+
placeholder="搜索数字员工..."
|
|
1015
1015
|
value={searchQuery}
|
|
1016
1016
|
onChange={(e) => setSearchQuery(e.target.value)}
|
|
1017
1017
|
className="h-8 pl-8 text-xs"
|
|
@@ -1043,7 +1043,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1043
1043
|
return (
|
|
1044
1044
|
<div className="flex size-full items-center justify-center p-6">
|
|
1045
1045
|
<div className="text-center">
|
|
1046
|
-
<p className="text-sm font-medium text-red-400"
|
|
1046
|
+
<p className="text-sm font-medium text-red-400">数字员工加载失败</p>
|
|
1047
1047
|
<p className="mt-2 text-xs text-[var(--color-text-muted)]">{teamsError}</p>
|
|
1048
1048
|
<Button
|
|
1049
1049
|
variant="outline"
|
|
@@ -1074,7 +1074,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1074
1074
|
if (filteredTeams.length === 0 && (searchQuery.trim() || hasActiveFilters)) {
|
|
1075
1075
|
return (
|
|
1076
1076
|
<div className="flex items-center justify-center py-12 text-sm text-[var(--color-text-muted)]">
|
|
1077
|
-
|
|
1077
|
+
没有匹配当前筛选条件的数字员工
|
|
1078
1078
|
</div>
|
|
1079
1079
|
);
|
|
1080
1080
|
}
|
|
@@ -1125,12 +1125,28 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1125
1125
|
)}
|
|
1126
1126
|
<div className="flex flex-1 flex-col">
|
|
1127
1127
|
<div className="flex items-start justify-between gap-2">
|
|
1128
|
-
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
1129
|
-
<
|
|
1130
|
-
{team.
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1128
|
+
<div className="flex min-w-0 flex-1 items-center gap-2.5">
|
|
1129
|
+
<img
|
|
1130
|
+
src={agentAvatarUrl(team.teamName)}
|
|
1131
|
+
alt={team.displayName}
|
|
1132
|
+
className="size-9 shrink-0 rounded-lg border bg-[var(--color-surface-raised)] object-cover"
|
|
1133
|
+
style={teamColorSet ? { borderColor: teamColorSet.border } : undefined}
|
|
1134
|
+
draggable={false}
|
|
1135
|
+
/>
|
|
1136
|
+
<div className="flex min-w-0 flex-1 flex-col gap-0.5">
|
|
1137
|
+
<div className="flex min-w-0 items-center gap-1.5">
|
|
1138
|
+
<h3 className="min-w-0 flex-1 truncate text-sm font-semibold text-[var(--color-text)]">
|
|
1139
|
+
{team.displayName}
|
|
1140
|
+
</h3>
|
|
1141
|
+
<StatusBadge status={status} />
|
|
1142
|
+
{team.pendingDelete || team.restartRequired ? (
|
|
1143
|
+
<PendingDeleteBadge />
|
|
1144
|
+
) : null}
|
|
1145
|
+
</div>
|
|
1146
|
+
<span className="truncate font-mono text-[10px] text-[var(--color-text-muted)]">
|
|
1147
|
+
工号 {team.teamName}
|
|
1148
|
+
</span>
|
|
1149
|
+
</div>
|
|
1134
1150
|
{team.projectPath &&
|
|
1135
1151
|
(() => {
|
|
1136
1152
|
const branch = branchByPath[normalizePath(team.projectPath)];
|
|
@@ -1158,7 +1174,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1158
1174
|
<Copy size={14} />
|
|
1159
1175
|
</button>
|
|
1160
1176
|
</TooltipTrigger>
|
|
1161
|
-
<TooltipContent side="bottom"
|
|
1177
|
+
<TooltipContent side="bottom">复制数字员工</TooltipContent>
|
|
1162
1178
|
</Tooltip>
|
|
1163
1179
|
)}
|
|
1164
1180
|
{team.teamName !== 'default' && team.teamName !== 'my-project' && (
|
|
@@ -1174,7 +1190,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1174
1190
|
<Trash2 size={14} />
|
|
1175
1191
|
</button>
|
|
1176
1192
|
</TooltipTrigger>
|
|
1177
|
-
<TooltipContent side="bottom"
|
|
1193
|
+
<TooltipContent side="bottom">删除数字员工</TooltipContent>
|
|
1178
1194
|
</Tooltip>
|
|
1179
1195
|
)}
|
|
1180
1196
|
</div>
|
|
@@ -1189,7 +1205,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1189
1205
|
renderMemberChips(team.members, isLight)
|
|
1190
1206
|
) : team.memberCount === 0 ? (
|
|
1191
1207
|
<Badge variant="secondary" className="text-[10px] font-normal">
|
|
1192
|
-
|
|
1208
|
+
单人
|
|
1193
1209
|
</Badge>
|
|
1194
1210
|
) : (
|
|
1195
1211
|
<Badge variant="secondary" className="text-[10px] font-normal">
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { memo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { cn } from '@renderer/lib/utils';
|
|
4
|
+
import { CheckCircle2, Loader2, Users } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
/** Runtime presence of a digital worker. */
|
|
7
|
+
export type WorkerStatus = 'online' | 'provisioning' | 'offline';
|
|
8
|
+
|
|
9
|
+
export interface WorkerIdCardProps {
|
|
10
|
+
/** Worker identity — the team name doubles as the worker ID. */
|
|
11
|
+
workerId: string;
|
|
12
|
+
/** Display name (usually same as workerId). */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Deterministic avatar URL. */
|
|
15
|
+
avatarUrl: string;
|
|
16
|
+
/** Role / department line, e.g. "数据采集员". */
|
|
17
|
+
role?: string;
|
|
18
|
+
/** Runtime harness, e.g. "Claude" / "Codex". */
|
|
19
|
+
harness?: string;
|
|
20
|
+
status: WorkerStatus;
|
|
21
|
+
/** Accent color (hex) used for the lanyard + ring. */
|
|
22
|
+
accentColor?: string;
|
|
23
|
+
/** Capability chips — distinct member roles or skills. */
|
|
24
|
+
capabilities?: string[];
|
|
25
|
+
/** Track record. */
|
|
26
|
+
completedTasks?: number;
|
|
27
|
+
inProgressTasks?: number;
|
|
28
|
+
memberCount?: number;
|
|
29
|
+
isLight?: boolean;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const STATUS_META: Record<
|
|
34
|
+
WorkerStatus,
|
|
35
|
+
{ label: string; dot: string; text: string; pulse?: boolean }
|
|
36
|
+
> = {
|
|
37
|
+
online: { label: '在岗', dot: 'bg-emerald-400', text: 'text-emerald-400' },
|
|
38
|
+
provisioning: { label: '启动中', dot: 'bg-yellow-400', text: 'text-yellow-400', pulse: true },
|
|
39
|
+
offline: { label: '离线', dot: 'bg-zinc-400', text: 'text-[var(--color-text-muted)]' },
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 数字劳动力身份证 — employee-badge styled identity card for a worker (team).
|
|
44
|
+
* The teamName IS the workerId; no extra fields are introduced.
|
|
45
|
+
*/
|
|
46
|
+
function WorkerIdCardImpl({
|
|
47
|
+
workerId,
|
|
48
|
+
name,
|
|
49
|
+
avatarUrl,
|
|
50
|
+
role,
|
|
51
|
+
harness,
|
|
52
|
+
status,
|
|
53
|
+
accentColor = '#6366f1',
|
|
54
|
+
capabilities = [],
|
|
55
|
+
completedTasks = 0,
|
|
56
|
+
inProgressTasks = 0,
|
|
57
|
+
memberCount = 1,
|
|
58
|
+
isLight = false,
|
|
59
|
+
className,
|
|
60
|
+
}: WorkerIdCardProps) {
|
|
61
|
+
const statusMeta = STATUS_META[status];
|
|
62
|
+
const tint = (alpha: number) => withAlpha(accentColor, alpha);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<div className={cn('relative w-[280px] shrink-0 select-none', className)}>
|
|
66
|
+
{/* Lanyard clip notch */}
|
|
67
|
+
<div className="absolute -top-2 left-1/2 z-10 -translate-x-1/2">
|
|
68
|
+
<div
|
|
69
|
+
className="h-2 w-10 rounded-full border"
|
|
70
|
+
style={{ backgroundColor: tint(0.5), borderColor: accentColor }}
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div
|
|
75
|
+
className="overflow-hidden rounded-xl border shadow-sm"
|
|
76
|
+
style={{
|
|
77
|
+
borderColor: tint(0.45),
|
|
78
|
+
backgroundColor: isLight ? tint(0.06) : tint(0.1),
|
|
79
|
+
}}
|
|
80
|
+
>
|
|
81
|
+
{/* Top strip: worker class + status + harness */}
|
|
82
|
+
<div
|
|
83
|
+
className="flex items-center justify-between px-3 py-1.5"
|
|
84
|
+
style={{ backgroundColor: tint(isLight ? 0.14 : 0.2) }}
|
|
85
|
+
>
|
|
86
|
+
<span
|
|
87
|
+
className="text-[9px] font-bold uppercase tracking-[0.18em]"
|
|
88
|
+
style={{ color: accentColor }}
|
|
89
|
+
>
|
|
90
|
+
数字员工
|
|
91
|
+
</span>
|
|
92
|
+
<span
|
|
93
|
+
className={cn(
|
|
94
|
+
'inline-flex items-center gap-1 text-[10px] font-medium',
|
|
95
|
+
statusMeta.text
|
|
96
|
+
)}
|
|
97
|
+
>
|
|
98
|
+
<span
|
|
99
|
+
className={cn(
|
|
100
|
+
'size-1.5 rounded-full',
|
|
101
|
+
statusMeta.dot,
|
|
102
|
+
statusMeta.pulse && 'animate-pulse'
|
|
103
|
+
)}
|
|
104
|
+
/>
|
|
105
|
+
{statusMeta.label}
|
|
106
|
+
</span>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
{/* Body: photo + identity */}
|
|
110
|
+
<div className="flex items-center gap-3 px-3 py-2.5">
|
|
111
|
+
<img
|
|
112
|
+
src={avatarUrl}
|
|
113
|
+
alt={name}
|
|
114
|
+
className="size-12 shrink-0 rounded-lg border bg-[var(--color-surface-raised)] object-cover"
|
|
115
|
+
style={{ borderColor: tint(0.5) }}
|
|
116
|
+
draggable={false}
|
|
117
|
+
/>
|
|
118
|
+
<div className="min-w-0 flex-1">
|
|
119
|
+
<h2 className="truncate text-sm font-semibold text-[var(--color-text)]">{name}</h2>
|
|
120
|
+
<div className="mt-0.5 truncate text-[11px] text-[var(--color-text-secondary)]">
|
|
121
|
+
{role || '数字员工'}
|
|
122
|
+
</div>
|
|
123
|
+
<div className="mt-1 flex items-center gap-1.5 text-[10px] text-[var(--color-text-muted)]">
|
|
124
|
+
<span className="font-mono">工号 {workerId}</span>
|
|
125
|
+
{harness && (
|
|
126
|
+
<>
|
|
127
|
+
<span>·</span>
|
|
128
|
+
<span>{harness}</span>
|
|
129
|
+
</>
|
|
130
|
+
)}
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
{/* Capabilities */}
|
|
136
|
+
{capabilities.length > 0 && (
|
|
137
|
+
<div className="flex flex-wrap gap-1 px-3 pb-2">
|
|
138
|
+
{capabilities.slice(0, 4).map((cap) => (
|
|
139
|
+
<span
|
|
140
|
+
key={cap}
|
|
141
|
+
className="rounded px-1.5 py-0.5 text-[9px] font-medium"
|
|
142
|
+
style={{ backgroundColor: tint(0.16), color: accentColor }}
|
|
143
|
+
>
|
|
144
|
+
{cap}
|
|
145
|
+
</span>
|
|
146
|
+
))}
|
|
147
|
+
{capabilities.length > 4 && (
|
|
148
|
+
<span className="rounded bg-[var(--color-surface-raised)] px-1.5 py-0.5 text-[9px] text-[var(--color-text-muted)]">
|
|
149
|
+
+{capabilities.length - 4}
|
|
150
|
+
</span>
|
|
151
|
+
)}
|
|
152
|
+
</div>
|
|
153
|
+
)}
|
|
154
|
+
|
|
155
|
+
{/* Track record */}
|
|
156
|
+
<div
|
|
157
|
+
className="flex items-center gap-3 border-t px-3 py-1.5 text-[10px] text-[var(--color-text-secondary)]"
|
|
158
|
+
style={{ borderColor: tint(0.25) }}
|
|
159
|
+
>
|
|
160
|
+
<span className="inline-flex items-center gap-1">
|
|
161
|
+
<CheckCircle2 size={11} className="text-emerald-400" />
|
|
162
|
+
{completedTasks} 完成
|
|
163
|
+
</span>
|
|
164
|
+
{inProgressTasks > 0 && (
|
|
165
|
+
<span className="inline-flex items-center gap-1">
|
|
166
|
+
<Loader2 size={11} className="text-amber-400" />
|
|
167
|
+
{inProgressTasks} 进行
|
|
168
|
+
</span>
|
|
169
|
+
)}
|
|
170
|
+
<span className="inline-flex items-center gap-1">
|
|
171
|
+
<Users size={11} className="text-[var(--color-text-muted)]" />
|
|
172
|
+
{memberCount} 成员
|
|
173
|
+
</span>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Apply alpha to a hex color → rgba string. Falls back to the input on parse failure. */
|
|
181
|
+
function withAlpha(hex: string, alpha: number): string {
|
|
182
|
+
const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());
|
|
183
|
+
if (!m) return hex;
|
|
184
|
+
const int = parseInt(m[1], 16);
|
|
185
|
+
const r = (int >> 16) & 255;
|
|
186
|
+
const g = (int >> 8) & 255;
|
|
187
|
+
const b = int & 255;
|
|
188
|
+
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const WorkerIdCard = memo(WorkerIdCardImpl);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker(数字劳动力)抽象 — Spec 9 / FR-2
|
|
3
|
+
*
|
|
4
|
+
* 统一「Hermit 团队(composite worker)」与「外部单能力服务(atomic worker)」。
|
|
5
|
+
* 关键约束:teamName 即 workerId,不引入新的身份字段。
|
|
6
|
+
* 本文件为向后兼容的类型扩展,不改动任何现有持久化格式。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { AgentCapability, DiscoverableTeam } from './team';
|
|
10
|
+
|
|
11
|
+
export type WorkerKind = 'composite' | 'atomic';
|
|
12
|
+
|
|
13
|
+
/** Worker 身份。composite → workerId = teamName;atomic → 服务自报 id。 */
|
|
14
|
+
export interface WorkerIdentity {
|
|
15
|
+
workerId: string;
|
|
16
|
+
name: string;
|
|
17
|
+
kind: WorkerKind;
|
|
18
|
+
/** 运行时载体:'claude' | 'codex' | 'micro-sniper' | ... */
|
|
19
|
+
harness?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 能力项 — 复用现有 AgentCapability 形状({ skill, description })。 */
|
|
23
|
+
export type WorkerCapability = AgentCapability;
|
|
24
|
+
|
|
25
|
+
/** 花名册中可被发现的 Worker。DiscoverableTeam 是其 composite 特例。 */
|
|
26
|
+
export interface DiscoverableWorker extends WorkerIdentity {
|
|
27
|
+
location: 'local' | 'remote';
|
|
28
|
+
status: 'online' | 'offline';
|
|
29
|
+
capabilities?: WorkerCapability[];
|
|
30
|
+
description?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** atomic worker 的 dispatch 立即响应(fire-and-forget,不阻塞长任务)。 */
|
|
34
|
+
export interface WorkerDispatchAck {
|
|
35
|
+
taskId: string;
|
|
36
|
+
status: 'received';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** atomic worker 任务状态查询结果。status 复用 team.ts 的 DispatchStatus。 */
|
|
40
|
+
export interface WorkerTaskState {
|
|
41
|
+
taskId: string;
|
|
42
|
+
status: import('./team').DispatchStatus;
|
|
43
|
+
result?: unknown;
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 把现有 DiscoverableTeam 适配为 DiscoverableWorker(composite)。
|
|
49
|
+
* teamName(slug) 即 workerId,零字段新增。
|
|
50
|
+
*/
|
|
51
|
+
export function discoverableTeamToWorker(team: DiscoverableTeam): DiscoverableWorker {
|
|
52
|
+
return {
|
|
53
|
+
workerId: team.slug,
|
|
54
|
+
name: team.displayName,
|
|
55
|
+
kind: 'composite',
|
|
56
|
+
harness: team.harness,
|
|
57
|
+
location: team.location,
|
|
58
|
+
status: team.status,
|
|
59
|
+
capabilities: team.capabilities,
|
|
60
|
+
description: team.description,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a6 as o,a7 as n}from"./index-BozmwMVV.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-C_rZ7b8I.js";import{_ as i}from"./index-BozmwMVV.js";import"./chunk-FMBD7UC4-FiXmutGL.js";import"./chunk-55IACEB6-BDcAlYn7.js";import"./chunk-QN33PNHL-CFzCNqlJ.js";import"./splashScene-C8lWNnm4.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-C_rZ7b8I.js";import{_ as i}from"./index-BozmwMVV.js";import"./chunk-FMBD7UC4-FiXmutGL.js";import"./chunk-55IACEB6-BDcAlYn7.js";import"./chunk-QN33PNHL-CFzCNqlJ.js";import"./splashScene-C8lWNnm4.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r}from"./_baseUniq-DGBk3mZr.js";var e=4;function a(o){return r(o,e)}export{a as c};
|